diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bd10823..be19b6b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,18 +11,19 @@ cache: - _ccache/ variables: - FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/glib/fedora:v20" + FEDORA_IMAGE: "registry.gitlab.gnome.org/gnome/glib/fedora:v26" COVERITY_IMAGE: "registry.gitlab.gnome.org/gnome/glib/coverity:v7" - DEBIAN_IMAGE: "registry.gitlab.gnome.org/gnome/glib/debian-stable:v14" - MINGW_IMAGE: "registry.gitlab.gnome.org/gnome/glib/mingw:v10" + DEBIAN_IMAGE: "registry.gitlab.gnome.org/gnome/glib/debian-stable:v19" + ALPINE_IMAGE: "registry.gitlab.gnome.org/gnome/glib/alpine:v3" + MINGW_IMAGE: "registry.gitlab.gnome.org/gnome/glib/mingw:v15" MESON_TEST_TIMEOUT_MULTIPLIER: 4 G_MESSAGES_DEBUG: all MESON_COMMON_OPTIONS: "--buildtype debug --wrap-mode=nodownload --fatal-meson-warnings" # Default CI job setup; contrast with `.only-origin`. # -# Don’t execute the pipeline when a merge request is merged into `main`, as it -# will have already been tested +# Don’t execute the pipeline when a merge request is merged into `origin/main`, +# as it will have already been tested .only-default: only: - branches @@ -30,7 +31,16 @@ variables: refs: - tags variables: - - $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PROJECT_NAMESPACE == "GNOME" + +# As above, but does get executed on merge into `origin/main`. For use with +# updating code coverage results and docs builds. +.only-default-and-merges: + only: + - branches + except: + refs: + - tags # Some jobs run on CI runners which don’t have good isolation between CI jobs, # and don’t have much available resource. Limit those jobs to only ones on the @@ -51,61 +61,123 @@ variables: except: - tags +# Some jobs take a long time and are unlikely to find failures (or will find +# failures which are not merge-blockers to fix), so they’re executed on a weekly +# schedule in order to save CI resources and speed up branch pipelines. +# But for specific merge requests, one may still want to run them, so make +# possible to run them manually. +.only-schedules-or-manual: + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + # As per rule before, the following rules will only apply to non MR events + - if: $CI_PIPELINE_SOURCE == "schedule" + when: always + - if: $CI_PIPELINE_SOURCE != "schedule" + when: manual + allow_failure: true + +# Some jobs should be runnable only on schedules and when triggered by a branch +# in the origin repository, but without +.only-schedules-or-manual-in-default-branch: + rules: + - if: $CI_PROJECT_PATH != "GNOME/glib" || $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH + when: never + # As per rule before, the following rules will apply only to GNOME/glib:main + - if: $CI_PIPELINE_SOURCE == "schedule" + when: always + - if: $CI_PIPELINE_SOURCE != "schedule" + when: manual + allow_failure: true + +# Some jobs run on CI runners don’t have much available resource. +# Limit those jobs to only ones on the origin repository (GNOME/glib), +# rather than people’s forks or if ran manually. +.only-origin-or-manual: + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + when: never + - if: $CI_PIPELINE_SOURCE == "schedule" + when: never + - if: $CI_PROJECT_NAMESPACE == "GNOME" + when: always + - if: $CI_PROJECT_NAMESPACE != "GNOME" + when: manual + allow_failure: true + .build-linux: before_script: - bash .gitlab-ci/show-execution-environment.sh - cp -r $HOME/subprojects/* subprojects/ # FIXME: Work around https://gitlab.com/gitlab-org/gitlab/-/issues/391756 -.only-default-with-git: - extends: .only-default +.with-git: before_script: - rm -rf subprojects/gvdb + - git config --global --add safe.directory "${PWD}" - git submodule update --init --depth 1 variables: GIT_SUBMODULE_STRATEGY: "none" GIT_SUBMODULE_DEPTH: 1 style-check-advisory: - extends: .only-default-with-git + extends: + - .only-default + - .with-git image: $DEBIAN_IMAGE stage: style-check allow_failure: true script: - - .gitlab-ci/run-style-check-diff.sh - - .gitlab-ci/run-check-todos.sh + - failed= + - .gitlab-ci/run-style-check-diff.sh || failed=1 + - .gitlab-ci/run-check-todos.sh || failed=1 + - test -z "$failed" sh-and-py-check: - extends: .only-default + extends: + - .only-default + - .with-git image: $DEBIAN_IMAGE stage: style-check allow_failure: false script: - - .gitlab-ci/run-shellcheck.sh - - .gitlab-ci/run-black.sh - - .gitlab-ci/run-flake8.sh + - failed= + - tests/shellcheck.sh || failed=1 + - tests/black.sh || failed=1 + - tests/flake8.sh || failed=1 + - test -z "$failed" + variables: + LINT_WARNINGS_ARE_ERRORS: '1' only: changes: - "**/*.py" - "**/*.sh" style-check-mandatory: - extends: .only-default-with-git + extends: + - .only-default + - .with-git image: $DEBIAN_IMAGE stage: style-check allow_failure: false script: - - .gitlab-ci/run-reuse.sh + - tests/reuse.sh + variables: + LINT_WARNINGS_ARE_ERRORS: '1' fedora-x86_64: extends: - .build-linux - - .only-default + - .only-default-and-merges + - .with-git image: $FEDORA_IMAGE stage: build needs: [] variables: CFLAGS: "-coverage -ftest-coverage -fprofile-arcs" + before_script: + - !reference [".build-linux", "before_script"] + - !reference [".with-git", "before_script"] script: - meson setup ${MESON_COMMON_OPTIONS} --werror @@ -116,13 +188,25 @@ fedora-x86_64: -Dsystemtap=true -Ddtrace=true -Dinstalled_tests=true - -Dgtk_doc=true + -Ddocumentation=true + -Dintrospection=enabled + -Dman-pages=enabled _build - meson compile -C _build - mkdir -p _coverage - lcov --config-file .lcovrc --directory _build --capture --initial --output-file "_coverage/${CI_JOB_NAME}-baseline.lcov" - .gitlab-ci/run-tests.sh - lcov --config-file .lcovrc --directory _build --capture --output-file "_coverage/${CI_JOB_NAME}.lcov" + # Copy the built documentation to an artifact directory. The build for docs.gtk.org + # can then pull it from there — see https://gitlab.gnome.org/GNOME/gtk/-/blob/docs-gtk-org/README.md + - mkdir -p _reference/ + - mv _build/docs/reference/glib/glib/ _reference/glib/ + - mv _build/docs/reference/glib/glib-unix/ _reference/glib-unix/ + - mv _build/docs/reference/gmodule/gmodule/ _reference/gmodule/ + - mv _build/docs/reference/gobject/gobject/ _reference/gobject/ + - mv _build/docs/reference/gio/gio/ _reference/gio/ + - mv _build/docs/reference/gio/gio-unix/ _reference/gio-unix/ + - mv _build/docs/reference/girepository/girepository/ _reference/girepository/ artifacts: reports: junit: @@ -135,24 +219,20 @@ fedora-x86_64: - "_build/config.h" - "_build/glib/glibconfig.h" - "_build/meson-logs" - - "_build/docs/reference/glib/glib-undeclared.txt" - - "_build/docs/reference/glib/glib-undocumented.txt" - - "_build/docs/reference/glib/glib-unused.txt" - - "_build/docs/reference/gobject/gobject-undeclared.txt" - - "_build/docs/reference/gobject/gobject-undocumented.txt" - - "_build/docs/reference/gobject/gobject-unused.txt" - - "_build/docs/reference/gio/gio-undeclared.txt" - - "_build/docs/reference/gio/gio-undocumented.txt" - - "_build/docs/reference/gio/gio-unused.txt" - "_coverage" + - "_reference" debian-stable-x86_64: extends: - .build-linux - .only-default + - .with-git image: $DEBIAN_IMAGE stage: build needs: [] + before_script: + - !reference [".build-linux", "before_script"] + - !reference [".with-git", "before_script"] script: - meson setup ${MESON_COMMON_OPTIONS} --werror @@ -178,10 +258,81 @@ debian-stable-x86_64: - "_build/glib/glibconfig.h" - "_build/meson-logs" +hurd-i386: + extends: + - .only-schedules-or-manual + - .with-git + stage: build + tags: + - hurd + needs: [] + script: + # FIXME: We can’t use ${MESON_COMMON_OPTIONS} here because the Hurd runner + # has Meson 1.3 installed. See the comment below about the same problem on + # FreeBSD. + - meson setup + --buildtype debug + --wrap-mode=nodownload + --werror + --default-library=both + --prefix=$HOME/glib-installed + --localstatedir=/var + --libdir=lib + _build + - meson compile -C _build + - .gitlab-ci/run-tests.sh + artifacts: + reports: + junit: + - _build/meson-logs/testlog.junit.xml + - _build/meson-logs/testlog-*.junit.xml + name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + when: always + expire_in: 1 week + paths: + - "_build/config.h" + - "_build/glib/glibconfig.h" + - "_build/meson-logs" + +muslc-alpine-x86_64: + extends: + - .build-linux + - .only-schedules-or-manual + - .with-git + image: $ALPINE_IMAGE + stage: build + needs: [] + before_script: + - !reference [".build-linux", "before_script"] + - !reference [".with-git", "before_script"] + script: + - meson setup ${MESON_COMMON_OPTIONS} + --werror + --default-library=both + --prefix=$HOME/glib-installed + --localstatedir=/var + --libdir=lib + -Dsystemtap=true + _build + - meson compile -C _build + - .gitlab-ci/run-tests.sh + artifacts: + reports: + junit: + - _build/meson-logs/testlog.junit.xml + - _build/meson-logs/testlog-*.junit.xml + name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" + when: always + expire_in: 1 week + paths: + - "_build/config.h" + - "_build/glib/glibconfig.h" + - "_build/meson-logs" + installed-tests: extends: - .build-linux - - .only-schedules + - .only-schedules-or-manual image: $FEDORA_IMAGE stage: build needs: [] @@ -219,10 +370,16 @@ installed-tests: G_DISABLE_ASSERT: extends: - .build-linux - - .only-schedules + - .only-schedules-or-manual + - .with-git image: $FEDORA_IMAGE stage: build needs: [] + variables: + MESON_TEST_TIMEOUT_MULTIPLIER: 15 + before_script: + - !reference [".build-linux", "before_script"] + - !reference [".with-git", "before_script"] script: - meson setup ${MESON_COMMON_OPTIONS} --werror @@ -230,9 +387,11 @@ G_DISABLE_ASSERT: -Ddtrace=true -Dinstalled_tests=true -Dglib_assert=false + -Dintrospection=enabled _build - meson compile -C _build - - bash -x ./.gitlab-ci/run-tests.sh + # Also take the opportunity to run the thorough tests (which are slow) + - bash -x ./.gitlab-ci/run-tests.sh --setup thorough artifacts: reports: junit: @@ -249,18 +408,23 @@ G_DISABLE_ASSERT: valgrind: extends: - .build-linux - - .only-schedules + - .only-schedules-or-manual + - .with-git image: $FEDORA_IMAGE stage: analysis needs: [] variables: MESON_TEST_TIMEOUT_MULTIPLIER: 15 + before_script: + - !reference [".build-linux", "before_script"] + - !reference [".with-git", "before_script"] script: - meson setup ${MESON_COMMON_OPTIONS} --werror -Dsystemtap=true -Ddtrace=true -Dinstalled_tests=true + -Dintrospection=enabled _build - meson compile -C _build # Valgrind doesn’t work when the soft FD limit is set too high @@ -329,7 +493,7 @@ cross-mingw64: - _build/gobject/libgobject-2.0-0.dll msys2-mingw32: - extends: .only-default + extends: .only-default-and-merges stage: build tags: - win32-ps @@ -339,10 +503,6 @@ msys2-mingw32: CHERE_INVOKING: "yes" CFLAGS: -coverage -ftest-coverage -fprofile-arcs PYTHONUTF8: "1" - # FIXME: For some reason enabling jit debugging "fixes" random python crashes - # see https://github.com/msys2/MINGW-packages/issues/11864 and - # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3280#note_1678973 - MSYS: "winjitdebug" script: - C:\msys64\usr\bin\pacman --noconfirm -Syyuu --ask 20 - C:\msys64\usr\bin\bash .gitlab-ci/show-execution-environment.sh @@ -358,9 +518,10 @@ msys2-mingw32: paths: - _build/meson-logs - _coverage/ + - _reference/ msys2-clang64: - extends: .only-schedules + extends: .only-schedules-or-manual stage: build tags: - win32-ps @@ -369,10 +530,6 @@ msys2-clang64: MSYSTEM: "CLANG64" CHERE_INVOKING: "yes" PYTHONUTF8: "1" - # FIXME: For some reason enabling jit debugging "fixes" random python crashes - # see https://github.com/msys2/MINGW-packages/issues/11864 and - # https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3280#note_1678973 - MSYS: "winjitdebug" script: - C:\msys64\usr\bin\pacman --noconfirm -Syyuu --ask 20 - C:\msys64\usr\bin\bash .gitlab-ci/show-execution-environment.sh @@ -444,54 +601,8 @@ vs2017-x64-static: paths: - _build/meson-logs -freebsd-12-x86_64: - # The FreeBSD 13 build is run on each commit, so the FreeBSD 12 build can be - # run less regularly to save CI resources. The chance of a regression on - # FreeBSD 12 and not FreeBSD 13 is tiny. - extends: .only-schedules - stage: build - tags: - # To run a FreeBSD builder, install gitlab-runner package and start both - # gitlab-runner and dbus service because we need /var/lib/dbus/machine-id. - # To compile GLib, you still have to install the following packages: - # desktop-file-utils gettext libiconv meson pkgconf python3 shared-mime-info - - freebsd-12 - needs: [] - variables: - # CPPFLAGS is required because libintl doesn't use pkg-config. - CPPFLAGS: -I/usr/local/include - # FIXME: Workaround meson inability to set LD_LIBRARY_PATH. - # https://github.com/mesonbuild/meson/issues/1383 - # https://github.com/mesonbuild/meson/issues/1635 - # https://github.com/mesonbuild/meson/issues/2881 - LDFLAGS: -L/usr/local/lib -Wl,--disable-new-dtags - # FreeBSD supports C.UTF-8 locale since 12.1. - LANG: C.UTF-8 - before_script: - - bash .gitlab-ci/show-execution-environment.sh - script: - # We cannot use -Wl,--no-undefined because GLib uses 'environ' variable. - # FreeBSD supports xattr, but its API is different from Linux xattr. - # FIXME: extattr(2) support: https://gitlab.gnome.org/GNOME/glib/issues/1404 - # localstatedir is needed for access to /var/lib/dbus/machine-id - - meson setup ${MESON_COMMON_OPTIONS} --localstatedir=/var -Db_lundef=false -Dxattr=false _build - - meson compile -C _build - - bash -x ./.gitlab-ci/run-tests.sh - artifacts: - reports: - junit: - - _build/meson-logs/testlog.junit.xml - - _build/meson-logs/testlog-*.junit.xml - name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" - when: always - expire_in: 1 week - paths: - - "_build/config.h" - - "_build/glib/glibconfig.h" - - "_build/meson-logs" - freebsd-13-x86_64: - extends: .only-origin + extends: .only-origin-or-manual stage: build tags: - freebsd-13 @@ -503,7 +614,14 @@ freebsd-13-x86_64: before_script: - bash .gitlab-ci/show-execution-environment.sh script: - - meson setup ${MESON_COMMON_OPTIONS} --localstatedir=/var -Db_lundef=false -Dxattr=false _build + # FIXME: We can’t use ${MESON_COMMON_OPTIONS} here because the FreeBSD 13 + # runner has Meson 1.3 installed. This has an API hole where previous + # methods of getting paths from files() objects are rejected as deprecated, + # but no replacements are available. Hence, we can’t build with + # --fatal-meson-warnings. This should be fixed in Meson 1.4. It’s also fine + # with Meson 1.2.3 (which is what we use on all the other CI runners). + # See https://github.com/GNOME/glib/commit/71061fdcb33b8c26f5f8467cb3ac10704d65c87d + - meson setup --buildtype debug --wrap-mode=nodownload --localstatedir=/var -Db_lundef=false -Dxattr=false _build - meson compile -C _build - bash -x ./.gitlab-ci/run-tests.sh artifacts: @@ -520,6 +638,7 @@ freebsd-13-x86_64: - "_build/meson-logs" macos-x86_64: + # The macOS runner is not allowed in forks. This is about trust, not capacity. extends: .only-origin stage: build tags: @@ -549,8 +668,9 @@ macos-x86_64: - ln -s /opt/cmake/CMake.app/Contents/bin/cmake .venv/bin - ln -s /opt/ccache/ccache .venv/bin - source .venv/bin/activate - - pip3 install meson==1.2.0 + - pip3 install meson==1.2.3 - pip3 install ninja==1.11.1 + - pip3 install packaging==23.2 script: # FIXME: Use --wrap-mode=default so we download dependencies each time, # until the macOS runner is a VM where we can use a pre-made image which @@ -601,7 +721,7 @@ coverage: scan-build: extends: - .build-linux - - .only-schedules + - .only-schedules-or-manual image: $FEDORA_IMAGE stage: analysis needs: [] @@ -615,6 +735,7 @@ scan-build: -Dsystemtap=true -Ddtrace=true -Dinstalled_tests=true + -Dintrospection=enabled _scan_build - ninja -C _scan_build scan-build artifacts: @@ -627,7 +748,7 @@ scan-build: .coverity: extends: - .build-linux - - .only-schedules + - .only-schedules-or-manual-in-default-branch image: $COVERITY_IMAGE stage: analysis needs: [] @@ -644,6 +765,7 @@ scan-build: -Dsystemtap=true -Ddtrace=true -Dinstalled_tests=true + -Dintrospection=enabled _coverity_build - $HOME/cov-analysis-linux64-*/bin/cov-build --dir cov-int meson compile -C _coverity_build - tar cfz cov-int.tar.gz cov-int @@ -679,17 +801,22 @@ dist-job: - git submodule update --init - for m in $(git submodule foreach -q 'echo $path'); do git config --global --add safe.directory "${PWD}/${m}"; done - meson subprojects download - - meson setup ${MESON_COMMON_OPTIONS} --buildtype release -Dgtk_doc=true -Dman=true _build + - meson setup ${MESON_COMMON_OPTIONS} --buildtype release -Ddocumentation=true -Dman-pages=enabled _build - meson dist -C _build - - ninja -C _build glib-doc gobject-doc gio-doc - - tar -c -J -f "glib-docs-$CI_COMMIT_TAG.tar.xz" -C docs/reference/glib html - - tar -c -J -f "gobject-docs-$CI_COMMIT_TAG.tar.xz" -C docs/reference/gobject html - - tar -c -J -f "gio-docs-$CI_COMMIT_TAG.tar.xz" -C docs/reference/gio html + # Compile again to build the docs + - meson compile -C _build + - tar -c -J -f "glib-docs-$CI_COMMIT_TAG.tar.xz" -C _build/docs/reference/glib glib + - tar -c -J -f "gmodule-docs-$CI_COMMIT_TAG.tar.xz" -C _build/docs/reference/gmodule gmodule + - tar -c -J -f "gobject-docs-$CI_COMMIT_TAG.tar.xz" -C _build/docs/reference/gobject gobject + - tar -c -J -f "gio-docs-$CI_COMMIT_TAG.tar.xz" -C _build/docs/reference/gio gio + - tar -c -J -f "girepository-docs-$CI_COMMIT_TAG.tar.xz" -C _build/docs/reference/girepository girepository artifacts: paths: - "${CI_PROJECT_DIR}/_build/glib-docs-$CI_COMMIT_TAG.tar.xz" + - "${CI_PROJECT_DIR}/_build/gmodule-docs-$CI_COMMIT_TAG.tar.xz" - "${CI_PROJECT_DIR}/_build/gobject-docs-$CI_COMMIT_TAG.tar.xz" - "${CI_PROJECT_DIR}/_build/gio-docs-$CI_COMMIT_TAG.tar.xz" + - "${CI_PROJECT_DIR}/_build/girepository-docs-$CI_COMMIT_TAG.tar.xz" - "${CI_PROJECT_DIR}/_build/meson-dist/glib-*.tar.xz" issue-bot: diff --git a/.gitlab-ci/alpine.Dockerfile b/.gitlab-ci/alpine.Dockerfile new file mode 100644 index 0000000..8043a10 --- /dev/null +++ b/.gitlab-ci/alpine.Dockerfile @@ -0,0 +1,38 @@ +FROM alpine:3.19 + +RUN apk add --no-cache \ + bash \ + build-base \ + bzip2-dev \ + dbus \ + desktop-file-utils \ + docbook-xml \ + docbook-xsl \ + gettext-dev \ + git \ + libffi-dev \ + libxml2-utils \ + libxslt \ + meson \ + musl-locales \ + py3-pip \ + python3 \ + pcre2-dev \ + shared-mime-info \ + tzdata \ + util-linux-dev \ + zlib-dev + +ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8 MUSL_LOCPATH=/usr/share/i18n/locales/musl + +RUN pip3 install --break-system-packages meson==1.2.3 + +ARG HOST_USER_ID=5555 +ENV HOST_USER_ID ${HOST_USER_ID} +RUN adduser -D -u $HOST_USER_ID -s /bin/bash user + +USER user +WORKDIR /home/user + +COPY cache-subprojects.sh . +RUN ./cache-subprojects.sh diff --git a/.gitlab-ci/check-missing-install-tag.py b/.gitlab-ci/check-missing-install-tag.py deleted file mode 100755 index d9e53e1..0000000 --- a/.gitlab-ci/check-missing-install-tag.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 - -""" -This script checks Meson configuration logs to verify no installed file is -missing installation tag. -""" - -import argparse -import json -from pathlib import Path - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("builddir", type=Path) - args = parser.parse_args() - - success = True - path = args.builddir / "meson-info" / "intro-install_plan.json" - with path.open(encoding="utf-8") as f: - install_plan = json.load(f) - for target in install_plan.values(): - for info in target.values(): - if not info["tag"]: - print("Missing install_tag for", info["destination"]) - success = False - return 0 if success else 1 - - -if __name__ == "__main__": - exit(main()) diff --git a/.gitlab-ci/debian-stable.Dockerfile b/.gitlab-ci/debian-stable.Dockerfile index b2559ca..4bcee4e 100644 --- a/.gitlab-ci/debian-stable.Dockerfile +++ b/.gitlab-ci/debian-stable.Dockerfile @@ -1,4 +1,4 @@ -FROM debian:bullseye +FROM debian:bookworm RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ bindfs \ @@ -16,8 +16,10 @@ RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ gdb \ g++ \ gettext \ + gi-docgen \ git \ libc6-dev \ + gobject-introspection \ gtk-doc-tools \ itstool \ lcov \ @@ -25,6 +27,7 @@ RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ libdbus-1-dev \ libelf-dev \ libffi-dev \ + libgirepository1.0-dev \ libmount-dev \ libpcre2-dev \ libselinux1-dev \ @@ -34,9 +37,11 @@ RUN apt-get update -qq && apt-get install --no-install-recommends -qq -y \ locales \ ninja-build \ python3 \ + python3-packaging \ python3-pip \ python3-setuptools \ python3-wheel \ + reuse \ shared-mime-info \ shellcheck \ systemtap-sdt-dev \ @@ -62,14 +67,12 @@ RUN locale-gen de_DE.UTF-8 \ && locale-gen lt_LT.UTF-8 \ && locale-gen pl_PL.UTF-8 \ && locale-gen ru_RU.UTF-8 \ + && locale-gen th_TH.UTF-8 \ && locale-gen tr_TR.UTF-8 ENV LANG=C.UTF-8 LANGUAGE=C.UTF-8 LC_ALL=C.UTF-8 -RUN pip3 install meson==0.60.3 - -# FIXME: Once we use Debian Bookworm, we can just install the `reuse` package -RUN pip3 install reuse==1.0.0 +RUN pip3 install --break-system-packages meson==1.2.3 ARG HOST_USER_ID=5555 ENV HOST_USER_ID ${HOST_USER_ID} diff --git a/.gitlab-ci/fedora.Dockerfile b/.gitlab-ci/fedora.Dockerfile index 85f910c..3713cc3 100644 --- a/.gitlab-ci/fedora.Dockerfile +++ b/.gitlab-ci/fedora.Dockerfile @@ -1,4 +1,4 @@ -FROM fedora:34 +FROM fedora:37 RUN dnf -y update \ && dnf -y install \ @@ -15,24 +15,28 @@ RUN dnf -y update \ gcc-c++ \ gdb \ gettext \ + gi-docgen \ git \ glibc-devel \ + glibc-gconv-extra \ glibc-headers \ glibc-langpack-de \ glibc-langpack-el \ - glibc-langpack-el \ glibc-langpack-en \ glibc-langpack-es \ - glibc-langpack-es \ glibc-langpack-fa \ glibc-langpack-fr \ + glibc-langpack-gu \ glibc-langpack-hr \ glibc-langpack-ja \ glibc-langpack-lt \ glibc-langpack-pl \ glibc-langpack-ru \ + glibc-langpack-th \ glibc-langpack-tr \ "gnome-desktop-testing >= 2018.1" \ + gobject-introspection \ + gobject-introspection-devel \ gtk-doc \ itstool \ lcov \ @@ -45,6 +49,8 @@ RUN dnf -y update \ ninja-build \ pcre2-devel \ "python3-dbusmock >= 0.18.3-2" \ + python3-docutils \ + python3-packaging \ python3-pip \ python3-pygments \ python3-wheel \ @@ -74,7 +80,7 @@ RUN dnf -y update \ make \ && dnf clean all -RUN pip3 install meson==0.60.3 +RUN pip3 install meson==1.2.3 COPY install-gitlab-cobertura-tools.sh . RUN ./install-gitlab-cobertura-tools.sh diff --git a/.gitlab-ci/mingw.Dockerfile b/.gitlab-ci/mingw.Dockerfile index b109122..d688a35 100644 --- a/.gitlab-ci/mingw.Dockerfile +++ b/.gitlab-ci/mingw.Dockerfile @@ -1,72 +1,17 @@ -FROM fedora:34 +FROM registry.gitlab.gnome.org/gnome/glib/fedora:v25 + +USER root RUN dnf -y install \ - bindfs \ - clang \ - clang-analyzer \ - desktop-file-utils \ - elfutils-libelf-devel \ - findutils \ - fuse \ - gcc \ - gcc-c++ \ - gettext \ - git \ - glibc-devel \ - glibc-headers \ - glibc-langpack-de \ - glibc-langpack-el \ - glibc-langpack-el \ - glibc-langpack-en \ - glibc-langpack-es \ - glibc-langpack-es \ - glibc-langpack-fa \ - glibc-langpack-fr \ - glibc-langpack-hr \ - glibc-langpack-ja \ - glibc-langpack-lt \ - glibc-langpack-pl \ - glibc-langpack-ru \ - glibc-langpack-tr \ - gtk-doc \ - itstool \ - lcov \ - libattr-devel \ - libffi-devel \ - libmount-devel \ - libselinux-devel \ - libxslt \ mingw64-gcc \ mingw64-gcc-c++ \ mingw64-gettext \ mingw64-libffi \ mingw64-zlib \ - ncurses-compat-libs \ - ninja-build \ - pcre2-devel \ - python3 \ - python3-pip \ - python3-wheel \ - systemtap-sdt-devel \ - unzip \ - wget \ - xz \ - zlib-devel \ && dnf clean all WORKDIR /opt COPY cross_file_mingw64.txt /opt -RUN pip3 install meson==0.60.3 - -ARG HOST_USER_ID=5555 -ENV HOST_USER_ID ${HOST_USER_ID} -RUN useradd -u $HOST_USER_ID -ms /bin/bash user - USER user -WORKDIR /home/user - -COPY cache-subprojects.sh . -RUN ./cache-subprojects.sh - -ENV LANG C.UTF-8 +WORKDIR /home/user \ No newline at end of file diff --git a/.gitlab-ci/run-black.sh b/.gitlab-ci/run-black.sh deleted file mode 100755 index fdeaf16..0000000 --- a/.gitlab-ci/run-black.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -set -e - -# shellcheck disable=SC2046 -black --diff --check $(git ls-files '*.py') diff --git a/.gitlab-ci/run-flake8.sh b/.gitlab-ci/run-flake8.sh deleted file mode 100755 index 5675a01..0000000 --- a/.gitlab-ci/run-flake8.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -e - -# Disable formatting warnings in flake8, as we use `black` to handle that. -formatting_warnings=E101,E111,E114,E115,E116,E117,E12,E13,E2,E3,E401,E5,E70,W1,W2,W3,W5 - -# shellcheck disable=SC2046 -flake8 --max-line-length=88 --ignore="$formatting_warnings" $(git ls-files '*.py') diff --git a/.gitlab-ci/run-shellcheck.sh b/.gitlab-ci/run-shellcheck.sh deleted file mode 100755 index abf2e5e..0000000 --- a/.gitlab-ci/run-shellcheck.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -set -e - -# Ignoring third-party directories that we don't want to parse -# shellcheck disable=SC2046 -shellcheck $(git ls-files '*.sh' | grep -Ev "glib/libcharset|glib/dirent") diff --git a/.gitlab-ci/run-style-check-diff.sh b/.gitlab-ci/run-style-check-diff.sh index 651f384..2dcf096 100755 --- a/.gitlab-ci/run-style-check-diff.sh +++ b/.gitlab-ci/run-style-check-diff.sh @@ -2,17 +2,15 @@ set -e -ancestor_horizon=28 # days (4 weeks) - # Wrap everything in a subshell so we can propagate the exit status. +exit_status=0 ( source .gitlab-ci/search-common-ancestor.sh -git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format-11" -p1 +git diff -U0 --no-color "${newest_common_ancestor_sha}" | .gitlab-ci/clang-format-diff.py -binary "clang-format-14" -p1 -) -exit_status=$? +) || exit_status=$? # The style check is not infallible. The clang-format configuration cannot # perfectly describe GLib’s coding style: in particular, it cannot align diff --git a/.gitlab-ci/run-tests.sh b/.gitlab-ci/run-tests.sh index 1189493..6293850 100755 --- a/.gitlab-ci/run-tests.sh +++ b/.gitlab-ci/run-tests.sh @@ -2,8 +2,6 @@ set -ex -./.gitlab-ci/check-missing-install-tag.py _build - meson test -v \ -C _build \ --timeout-multiplier "${MESON_TEST_TIMEOUT_MULTIPLIER}" \ diff --git a/.gitlab-ci/test-msvc.bat b/.gitlab-ci/test-msvc.bat index aee77d3..02f8b07 100644 --- a/.gitlab-ci/test-msvc.bat +++ b/.gitlab-ci/test-msvc.bat @@ -12,25 +12,15 @@ for %%x in (%*) do ( set args=%args:~1% :: FIXME: make warnings fatal -pip3 install --upgrade --user meson==1.0.0 || goto :error +pip3 install --upgrade --user meson==1.2.3 packaging==23.2 || goto :error meson setup %args% _build || goto :error -python .gitlab-ci/check-missing-install-tag.py _build || goto :error meson compile -C _build || goto :error meson test -v -C _build --timeout-multiplier %MESON_TEST_TIMEOUT_MULTIPLIER% || goto :error meson test -v -C _build --timeout-multiplier %MESON_TEST_TIMEOUT_MULTIPLIER% --setup=unstable_tests --suite=failing --suite=flaky -:: Workaround meson issue https://github.com/mesonbuild/meson/issues/9894 -python -c "n = '_build/meson-logs/testlog.junit.xml'; c = open(n, 'rb').read().replace(b'\x1b', b''); open(n, 'wb').write(c)" || goto :error -python -c "n = '_build/meson-logs/testlog-unstable_tests.junit.xml'; c = open(n, 'rb').read().replace(b'\x1b', b''); open(n, 'wb').write(c)" - :: FIXME: can we get code coverage support? goto :EOF :error - -:: Workaround meson issue https://github.com/mesonbuild/meson/issues/9894 -python -c "n = '_build/meson-logs/testlog.junit.xml'; c = open(n, 'rb').read().replace(b'\x1b', b''); open(n, 'wb').write(c)" -python -c "n = '_build/meson-logs/testlog-unstable_tests.junit.xml'; c = open(n, 'rb').read().replace(b'\x1b', b''); open(n, 'wb').write(c)" - exit /b 1 diff --git a/.gitlab-ci/test-msys2.sh b/.gitlab-ci/test-msys2.sh index aaeff16..304f94c 100755 --- a/.gitlab-ci/test-msys2.sh +++ b/.gitlab-ci/test-msys2.sh @@ -11,10 +11,13 @@ pacman --noconfirm -S --needed \ lcov \ "${MINGW_PACKAGE_PREFIX}"-ccache \ "${MINGW_PACKAGE_PREFIX}"-gettext \ + "${MINGW_PACKAGE_PREFIX}"-gi-docgen \ + "${MINGW_PACKAGE_PREFIX}"-gobject-introspection \ "${MINGW_PACKAGE_PREFIX}"-libffi \ "${MINGW_PACKAGE_PREFIX}"-meson \ "${MINGW_PACKAGE_PREFIX}"-pcre2 \ "${MINGW_PACKAGE_PREFIX}"-python3 \ + "${MINGW_PACKAGE_PREFIX}"-python-docutils \ "${MINGW_PACKAGE_PREFIX}"-python-pip \ "${MINGW_PACKAGE_PREFIX}"-toolchain \ "${MINGW_PACKAGE_PREFIX}"-zlib \ @@ -26,20 +29,24 @@ CCACHE_BASEDIR="$(pwd)" CCACHE_DIR="${CCACHE_BASEDIR}/_ccache" export CCACHE_BASEDIR CCACHE_DIR -pip3 install --upgrade --user meson==1.0.0 +pip3 install --upgrade --user packaging==23.2 PATH="$(cygpath "$USERPROFILE")/.local/bin:$HOME/.local/bin:$PATH" DIR="$(pwd)" export PATH CFLAGS -if [[ "$MSYSTEM" == "CLANG64" ]]; then - # FIXME: fix the clang build warnings - # shellcheck disable=SC2086 - meson setup ${MESON_COMMON_OPTIONS} _build -else - # shellcheck disable=SC2086 - meson setup ${MESON_COMMON_OPTIONS} --werror _build -fi +# FIXME: We can’t use ${MESON_COMMON_OPTIONS} here because this script installs +# Meson 1.3. See the comment in .gitlab-ci.yml about the same problem on +# FreeBSD. +# shellcheck disable=SC2086 +meson setup \ + --buildtype=debug \ + --wrap-mode=nodownload \ + --werror \ + -Ddocumentation=true \ + -Dintrospection=enabled \ + -Dman-pages=enabled \ + _build meson compile -C _build @@ -65,3 +72,9 @@ if [[ "$CFLAGS" == *"-coverage"* ]]; then --capture \ --output-file "${DIR}/_coverage/${CI_JOB_NAME}.lcov" fi + +# Copy the built documentation to an artifact directory. The build for docs.gtk.org +# can then pull it from there — see https://gitlab.gnome.org/GNOME/gtk/-/blob/docs-gtk-org/README.md +mkdir -p _reference/ +mv _build/docs/reference/glib/glib-win32/ _reference/glib-win32/ +mv _build/docs/reference/gio/gio-win32/ _reference/gio-win32/ \ No newline at end of file diff --git a/.gitlab-ci/thorough-test-wrapper.sh b/.gitlab-ci/thorough-test-wrapper.sh new file mode 100644 index 0000000..2bb149e --- /dev/null +++ b/.gitlab-ci/thorough-test-wrapper.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# +# Copyright 2024 GNOME Foundation, Inc. +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Original author: Philip Withnall + +set -e + +# If the test is run under Python (e.g. the first argument to this script is +# /usr/bin/python3) or if it’s the special xmllint test in GLib, then don’t +# pass the GTest `-m thorough` argument to it. +if [[ "$1" == *"python"* || + "$1" == *"xmllint" ]]; then + args=() +else + # See the documentation for g_test_init() + args=("-m" "thorough") +fi + +exec "$@" "${args[@]}" \ No newline at end of file diff --git a/.lcovrc b/.lcovrc index 3901f81..9107da2 100644 --- a/.lcovrc +++ b/.lcovrc @@ -1,13 +1,16 @@ # lcov and genhtml configuration -# See http://ltp.sourceforge.net/coverage/lcov/lcovrc.5.php +# See lcovrc(5) # Always enable branch coverage lcov_branch_coverage = 1 # Exclude precondition assertions, as we can never reasonably get full branch # coverage of them, as they should never normally fail. +# Similarly exclude g_clear_*() functions (such as g_clear_object(), +# g_clear_pointer(), etc.) as it’s not useful to test both sides of the branch +# in them. # See https://github.com/linux-test-project/lcov/issues/44 -lcov_excl_br_line = LCOV_EXCL_BR_LINE|g_return_if_fail|g_return_val_if_fail|g_assert|g_assert_ +lcov_excl_br_line = LCOV_EXCL_BR_LINE|g_return_if_fail|g_return_val_if_fail|g_assert|g_assert_|g_clear_ # Similarly for unreachable assertions. lcov_excl_line = LCOV_EXCL_LINE|g_return_if_reached|g_return_val_if_reached|g_assert_not_reached \ No newline at end of file diff --git a/.reuse/dep5 b/.reuse/dep5 index 979f2ea..72a4790 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -41,3 +41,22 @@ License: CC0-1.0 Files: docs/reference/glib/gvariant-*.svg Copyright: 2022 Philip Withnall License: CC-BY-SA-3.0 + +# libgirepository uses cmph as a copylib. Adding copyright/license data to the +# files there would cause divergence from upstream. See +# girepository/cmph/README-CMPH-IMPORT.txt. +Files: girepository/cmph/* +Copyright: CMPH contributors +License: LGPL-2.1-only or MPL-1.1 + +# gnulib is a copylib. Adding copyright/license data to the files there would +# cause divergence from upstream. See glib/gnulib/README. +Files: glib/gnulib/* +Copyright: gnulib contributors +License: LGPL-2.1-or-later + +# libcharset is a copylib. Adding copyright/license data to the files there +# would cause divergence from upstream. See glib/libcharset/README. +Files: glib/libcharset/* +Copyright: libcharset contributors +License: LGPL-2.1-or-later \ No newline at end of file diff --git a/LICENSES/LGPL-2.1-only.txt b/LICENSES/LGPL-2.1-only.txt new file mode 100644 index 0000000..c9aa530 --- /dev/null +++ b/LICENSES/LGPL-2.1-only.txt @@ -0,0 +1,175 @@ +GNU LESSER GENERAL PUBLIC LICENSE + +Version 2.1, February 1999 + +Copyright (C) 1991, 1999 Free Software Foundation, Inc. +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. + +This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. + +When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. + +To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. + +For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. + +We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. + +To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. + +Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. + +Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. + +When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. + +We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. + +For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. + +In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. + +Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. + +The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". + +A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. + +The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) + +"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. + +1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. + +(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. + +Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. + +This option is useful when you wish to copy part of the code of the Library into a program that is not a library. + +4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. + +If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. + +5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. + +However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. + +When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. + +If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) + +Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. + +6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. + +You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: + + a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. + + e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. + +For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. + +7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. + + b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. + +8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. + +10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. + +11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. + +14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Libraries + +If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). + +To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + + one line to give the library's name and an idea of what it does. + Copyright (C) year name of author + + 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.1 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 Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in +the library `Frob' (a library for tweaking knobs) written +by James Random Hacker. + +signature of Ty Coon, 1 April 1990 +Ty Coon, President of Vice +That's all there is to it! diff --git a/LICENSES/MPL-1.1.txt b/LICENSES/MPL-1.1.txt new file mode 100644 index 0000000..e1c8428 --- /dev/null +++ b/LICENSES/MPL-1.1.txt @@ -0,0 +1,143 @@ +Mozilla Public License Version 1.1 + +1. Definitions. + + 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. + + 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. + + 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. + + 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. + + 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. + + 1.5. "Executable" means Covered Code in any form other than Source Code. + + 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. + + 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. + + 1.8. "License" means this document. + + 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. + + 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: +Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. +Any new file that contains any part of the Original Code or previous Modifications. + + 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. + + 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. + + 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. + + 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. + +2. Source Code License. + + 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: + + a. under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and + b. under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). + c. the licenses granted in this Section 2.1 (a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. + d. Notwithstanding Section 2.1 (b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. + + 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license + + a. under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and + b. under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). + c. the licenses granted in Sections 2.2 (a) and 2.2 (b) are effective on the date Contributor first makes Commercial Use of the Covered Code. + d. Notwithstanding Section 2.2 (b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. + +3. Distribution Obligations. + + 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. + + 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. + + 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. + + 3.4. Intellectual Property Matters + + (a) Third Party Claims + If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. + + (b) Contributor APIs + If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. + + (c) Representations. + Contributor represents that, except as disclosed pursuant to Section 3.4 (a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. + + 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. + + 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Sections 3.1, 3.2, 3.3, 3.4 and 3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. + + 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. + +4. Inability to Comply Due to Statute or Regulation. + +If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. + +5. Application of this License. +This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. + +6. Versions of the License. + + 6.1. New Versions + Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. + + 6.2. Effect of New Versions + Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. + + 6.3. Derivative Works + If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) + +7. DISCLAIMER OF WARRANTY +COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. + +8. Termination + + 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. + + 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: + + a. such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. + b. any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. + + 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. + + 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. + +9. LIMITATION OF LIABILITY +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. + +10. U.S. government end users +The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. + +11. Miscellaneous +This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. + +12. Responsibility for claims +As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. + +13. Multiple-licensed code +Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. + +Exhibit A - Mozilla Public License. + +"The contents of this file are subject to the Mozilla Public License Version 1.1 (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.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. + +The Original Code is ______________________________________. + +The Initial Developer of the Original Code is ________________________. +Portions created by ______________________ are Copyright (C) ______ +_______________________. All Rights Reserved. + +Contributor(s): ______________________________________. + +Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." + +NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications. diff --git a/NEWS b/NEWS index 7dc7924..ccc616e 100644 --- a/NEWS +++ b/NEWS @@ -1,85 +1,518 @@ -Overview of changes in GLib 2.78.3, 2023-12-06 -============================================== - -* Fix a crash-causing regression in xdgmime (#3191, work by Philip Withnall) - -* Bugs fixed: - - #3191 Crash in __gio_xdg_cache_mime_type_subclass (Philip Withnall) - - !3747 Backport !3742 “xdgmime: Update to upstream commit c2c814d4051f232” to - glib-2-78 - - -Overview of changes in GLib 2.78.2, 2023-12-05 +Overview of changes in GLib 2.80.0, 2024-03-07 ============================================== * Bugs fixed: + - #3271 GLib: string malformed for gettext (Philip Withnall) + - !3940 tests: Don’t run check-missing-install-tag.py test under valgrind + (Philip Withnall) + - !3946 Add missing argument placeholders to several command-line tools (Simon + McVittie) + - !3947 docs: Fix a typo in the macros docs page (Philip Withnall) + - !3951 g_warn_if_fail: Document as always evaluating expr (Simon McVittie) + - !3953 docs: Specify gi-docgen as a native dependency (Bobby Rong) + - !3955 docs: Fix building with docs enabled and introspection disabled (Bobby + Rong) + - !3956 docs: Minor improvements to GSignal documentation (Philip Withnall) + +* Translation updates: + - Basque (Asier Sarasua Garmendia) + - British English (Andi Chandler, Bruce Cowan) + - Chinese (China) (Luming Zh) + - Czech (Daniel Rusek) + - Georgian (Ekaterine Papava) + - Hebrew (Yaron Shahrabani) + - Hungarian (Balázs Úr) + - Kazakh (Baurzhan Muftakhidinov) + - Lithuanian (Aurimas Černius) + - Norwegian Bokmål (Brage Fuglseth) + - Persian (Danial Behzadi) + - Russian (Artur S0) + - Slovenian (Matej Urbančič) + - Spanish (Daniel Mustieles) + - Swedish (Anders Jonsson) + - Turkish (Sabri Ünal) + - Ukrainian (Yuri Chornoivan) + + +Overview of changes in GLib 2.79.3, 2024-02-27 +============================================== + +* Various consistency improvements to the command line libgirepository tools + (!3926, !3927, !3928, !3930, work by Simon McVittie) + +* Bugs fixed: + - #3080 Gimp GTK file chooser hang when a remote file is open (Luca Bacci) + - #3210 Critical using Open location: GWinHttpFile doesn’t set + G_FILE_ATTRIBUTE_STANDARD_TYPE (Luca Bacci) + - #3252 [2.79.1] gdatetime installed tests fails on s390x (Simon McVittie) + - #3255 g_base_info_clear on zero-initialized stack-allocated introspection + info (Philip Withnall) + - #3258 Possible memory leak in GUnixVolumeMonitor (Ondrej Holy) + - #3260 Add man pages for girepository tools + - #3262 msys2-mingw32 build failing with error code 3221225785 (0xc0000139) + (Philip Withnall) + - #3263 Ensure girepository tools are translatable (Philip Withnall) + - #3266 Use-after-free in gsocketclient.c:connection_attempt_remove() (Philip + Withnall) + - #3271 GLib: string malformed for gettext (Philip Withnall) + - !3918 tests: Don’t run lint tests under valgrind + - !3919 tests: Speed up threaded toggle notify test unless -m slow is passed + - !3921 ci: Fix printing the execution environment + - !3922 gdatetime test: Produce more helpful output on mismatches + - !3923 girepository test: Don't assume doubles are naturally-aligned + - !3925 girwriter: Take the GIRepository as a parameter + - !3926 gi- tools: Remove unused options, improve --debug/--verbose + - !3927 g-ir-compiler: Only accept one input file + - !3928 gi-decompile-typelib: Interpret --includedir as most-important-first + - !3930 migrating-gi: Document command-line option removals + - !3935 Restrict macOS CI to origin + - !3937 girepository: Fix static build under Windows + - !3945 tests: Remove variable-length lookbehind tests for GRegex + +* Translation updates: + - Basque (Asier Sarasua Garmendia) + - Catalan (Jordi Mas i Hernandez) + - Chinese (China) (Boyuan Yang) + - Czech (Daniel Rusek) + - Galician (Fran Dieguez) + - Georgian (Ekaterine Papava) + - Hebrew (Yaron Shahrabani) + - Indonesian (Andika Triwidada) + - Kazakh (Baurzhan Muftakhidinov) + - Latvian (Rūdolfs Mazurs) + - Lithuanian (Aurimas Černius) + - Persian (Danial Behzadi) + - Russian (Artur S0) + - Slovenian (Matej Urbančič) + - Spanish (Daniel Mustieles) + - Turkish (Sabri Ünal, Emin Tufan Çetin) + - Ukrainian (Yuri Chornoivan) + + +Overview of changes in GLib 2.79.2, 2024-02-12 +============================================== + +* More work to reduce lock contention and improve performance in GObject (#743, + !3869, !3873, work by Thomas Haller) + +* More API changes to libgirepository, which is now stable as of this release + (#3155, #3217, #3218, #3231, #3234, #3243, #3244, #3245, #3246, work by + Philip Chimento, Evan Welsh, Philip Withnall) + +* Import `g-ir-compiler`, `g-ir-generate` and `g-ir-inspect` from + gobject-introspection.git and update them to work with girepository-2.0, + renaming them to `gi-compile-repository`, `gi-decompile-typelib` and + `gi-inspect-typelib` (see docs/reference/girepository/migrating-gi.md) (!3853, + !3909, work by Evan Welsh, Philip Withnall) + +* Add new `GLibUnix-2.0.gir`, `GLibWin32-2.0.gir`, `GioUnix-2.0.gir` and + `GioWin32-2.0.gir` GIRs which contain platform specific APIs, and are the + preferred way for third parties to access those APIs in future; although + platform specific APIs which were already exposed in `GLib-2.0.gir` and + `Gio-2.0.gir` continue to be listed there; the underlying `.so` files have not + changed (!3892, work by Philip Withnall) + +* Bugs fixed: + - #743 GLib weak refs depend on cascade of locks, including global ones, which + makes them non-scalable + - #2887 memory-monitor-dbus.test fails in installed-tests suite (Philip + Withnall) + - #3198 Support --version in standard GApplication command line arguments + (Maxim Moskalets) + - #3217 Feedback on gobject-introspection: APIs for stack-allocated + introspection info (Philip Withnall) + - #3218 Segfault in gi_function_info_prep_invoker (Philip Withnall) + - #3231 New functions in the glib introspection data (Philip Withnall) + - #3234 Reference cycle between GIRepository and GIBaseInfos cached by it + (Philip Withnall) + - #3236 threaded_resolver_worker_cb leaks memory when lookup fails and + connection is already canceled (Philip Withnall) + - #3238 Python packaging module is missing on Hurd CI runner (Philip Withnall) + - #3240 Missing preconditions checks in GArray (Tobias Stoeckmann) + - #3242 Memory leak in gresources over libelf (Maxim Moskalets) + - #3243 Feedback on girepository 2.0: Naming of get_type_info vs load_type + (Philip Withnall) + - #3244 Feedback on girepository 2.0: Where to find uninstalled typelibs + (Philip Withnall) + - #3245 Feedback on girepository 2.0: GIBoxedInfo's place in the type + hierarchy (Philip Withnall) + - #3246 Wrong out parameter type in + gi_object_info_find_method_using_interfaces (Philip Withnall) + - #3247 safe_closefrom(), safe_fdwalk_set_cloexec() as public API (Simon + McVittie) + - !3797 Refactor GIRepository GIR generation to avoid cyclical dependency + - !3807 gprintf/gstrfuncs: Improve and port doc comments to gi-docgen + - !3824 gconvert: match GNU iconv behaviour on FreeBSD + - !3838 build: Add thorough test setup + - !3843 Add more test coverage for girepository + - !3845 gunixmounts: Use libmnt_monitor API for monitoring + - !3847 ci: Add ability to run manually some specific jobs + - !3848 Fix build with introspection on Windows + - !3849 girepository: Remove GI_FUNCTION_THROWS and GI_VFUNC_THROWS flags + - !3850 [th/strdup-in-ascii-strdown] glib: use g_strdup() in + g_ascii_strdown(),g_ascii_strup() + - !3851 ci: Fix post-merge CI pipelines + - !3853 girepository: Update gir-compiler and use it to compile GIRs + - !3854 girnode: Document ownership and element types of internal structs + - !3855 gitypelib: Replace multiple constructors with + gi_typelib_new_from_bytes() + - !3856 girepository: Drop gi_repository_get_default() + - !3859 [th/glib-private-const] glib: return const pointer from + glib__private__() + - !3860 tests: Fix typo in memory-monitor-portal.py.in + - !3861 girepository: Fix a memory leak of a mapped file + - !3865 [th/test-weak-notify] gobject/tests: add test checking that GWeakRef + is cleared in GWeakNotify + - !3866 [th/gobject-carray-comment] gobject: remove obsolete code comment + about CArray + - !3868 Link to the main context tutorial from the main loop docs + - !3869 [th/optimize-weak-ref-list] rework GObject's `WeakRefData` to track + references in an array instead of GSList + - !3870 Revert "Don't skip dbus-codegen tests on Win32" + - !3871 docs: Fix include path for the build + - !3872 gio: tests: Use slightly more explicit assert functions + - !3873 [th/datalist-shrink] shrink the interal buffer of `GData` + - !3874 Don't skip dbus-codegen tests on Win32 + - !3876 build: Only override g-ir-compiler when GIR generation is enabled + - !3877 Various girepository fixes + - !3879 [th/gdataset-comment] gdataset: add code comment to + g_datalist_get_data() + - !3881 docs: Add migration guide for libgirepository + - !3886 codegen: Use `-` instead of `stdout` for output to stdout + - !3887 gtestutils: Ensure test_data is freed even if a test is skipped + - !3888 gitypes: Fix integer values of GIInfoType and add unit tests for + GIUnionInfo + - !3892 introspection: Generate separate GIR files and documentation for + platform specific APIs + - !3893 glocalfile: Support statvfs.f_type + - !3894 Minor fixes/docs changes to GFileDescriptorBased and GTask + - !3895 [th/meson-werror-fixes] some fixes for meson detection failure with + -Werror + - !3896 reuse: Add dep5 lines for gnulib and libcharset + - !3897 reuse: Fix screen-scraping expression for version 2.x + - !3898 Incorporate some lint checks into `meson test` + - !3900 gitypelib: Switch to refcounting + - !3901 girepository: Add length ‘out’ arguments to several getter methods + - !3902 gicallableinfo: Clarify docs for callables with no return type + - !3903 gibaseinfo: Rename gi_info_new() to gi_base_info_new() + - !3904 [th/meson-werror-fixes-2] more workarounds for compiler warnings in + meson compiler checks + - !3909 Rename g-ir-generate and g-ir-inspect and update to girepository-2.0 + - !3911 glib/tests/unix: Mostly pass O_CLOEXEC to g_unix_pipe_open() + - !3912 glib-unix: Fix reference to FD_CLOEXEC in docs for g_unix_pipe_open() + - !3913 cmph: Fix a typo + - !3914 Revert "ci: Remove not-printable chars from generated junit file" + - !3916 tests: Skip lint tests if bash is not available + - !3917 ci: Build and tar libgirepository documentation + +* Translation updates: + - Georgian (Ekaterine Papava) + - Russian (Artur S0) + + +Overview of changes in GLib 2.79.1, 2024-01-22 +============================================== + +* Fix a race condition in `g_object_unref()` (#3064, work by Thomas Haller) + +* Various API and build changes to libgirepository as it is not yet API-stable + (#3216, !3780, !3805, !3823, !3833, !3840) + +* Build fixes on big-endian 64-bit systems and mips64el (#3225, #3226, work by + Simon McVittie) + +* Reduce contention on global locks within GObject (!3774, work by Thomas + Haller) + +* Allow building man pages without the reference documentation (!3817, work by + Simon McVittie) + +* Bugs fixed: + - #1010 g_get_num_processor does not respect cpuset/affinity + - #3064 Crash under g_object_unref() + - #3093 GDBusMessage: should validate the type of all known headers (Philip + Withnall) + - #3207 Add support for syslog to Structured Logging + - #3216 Feedback on gobject-introspection: Casting to and from GIBaseInfo* + (Philip Withnall) + - #3222 pthread_t usages lack type name (Emmanuele Bassi) + - #3223 CLang, GMutexLocker: error: unused variable 'locker' + [-Werror,-Wunused-variable] + - #3225 2.79 regression: gdatetime test failing on 64-bit big-endian since + #3119 + - #3226 resource test fails on Debian mips64el: test5.gresource is not linked + but the test assumes it should be (Simon McVittie) + - !3774 [th/g-object-priv] add private data to GObject and use per-object + locking + - !3780 girepository: Use standard types instead of glib specific + - !3789 gdatetime: Fix title of documentation comment + - !3792 build: Tell gi-docgen where to find the GIR files + - !3793 Shorten the title for D-Bus interface docs + - !3794 Add boxed GType for GRand + - !3795 girepository: Skip GIRepository versions not matching GIRepository-3.0 + - !3798 docs: Drop outdated .gitignore files + - !3799 tests: Fix a minor leak in the new GParamSpecPool test + - !3800 ci: Re-enable and fix FreeBSD CI + - !3801 gmessages: Port all doc comments to gi-docgen + - !3802 [th/g-pointer-bit-lock-ext] glib: add g_pointer_bit_unlock_and_set() + and g_pointer_bit_lock_mask_ptr() + - !3803 ci: Fix tarballing the docs on dist + - !3805 girepository: Various small API cleanups + - !3806 gsignal.c: drop an optimization that is undefined behaviour + - !3808 glib/deprecated: Skip all the deprecated gthread api + - !3809 docs: Fix links to symbols outside the allowed namsepace + - !3810 gstrfuncs: Improve and port g_set_str() docs to gi-docgen + - !3811 gvariant-parser: Mention annotated types + - !3812 brz.c: Use uintptr_t instead of a hardcoded list of 64-bit arches + - !3813 gobject: define HAVE_OPTIONAL_FLAGS for sizeof(void*) > 8 + - !3814 Fix typo in GPOINTER_TO_SIZE documentation + - !3817 docs: Allow building man pages without the reference documentation + - !3818 docs: Clarify >=2.76 changes to g_module_open() + - !3821 tests: Fix a minor leak in the socket test + - !3823 girepository: Misc cleanups + - !3826 genums: use g_once_init_enter_pointer for GType initializers + - !3827 array-test: Don't assume sizeof(void*)==sizeof(gsize) + - !3831 gvariant-core: Don’t call posix_memalign() with size==0 + - !3833 girepository: Change various alignments to use size_t + - !3835 build: Ignore branches in g_clear_*() functions under lcov + - !3837 tests: A couple of test isolation improvements + - !3839 gvarianttype: Fix typos + - !3840 girepository: Exclude private symbols from the ABI + - !3841 docs: Fix member names of GLib.LogLevelFlags + - !3842 gio, gmodule, gthread: compile windows resources only in shared build + +* Translation updates: + - Georgian (Ekaterine Papava) + - Russian (Artur S0) + + +Overview of changes in GLib 2.79.0, 2023-12-22 +============================================== + + * Port to gi-docgen and drop gtk-doc support — dependencies have changed, and + Meson needs `-Ddocumentation` now rather than `-Dgtk_doc` (#3037, work by + multiple people) + + * Move libgirepository into glib.git from gobject-introspection.git — but tools + like `g-ir-scanner` are currently still in gobject-introspection.git. For the + moment, glib.git needs to be built twice, once with `-Dintrospection=false`, + then build gobject-introspection.git, then re-build glib.git with + `-Dintrospection=true`. This process will evolve throughout the GLib 2.80 + cycle. The API and ABI of libgirepository has changed, and accordingly its + version number has been bumped from 1.0 to 2.0 (note: the version number of + `GIRepository-*.gir` has been bumped from 2.0 to 3.0; see !3786). The GIR and + typelib file formats have not been changed, and are still at version 1.0. + (#3155, work by multiple people) + + * Match behaviour for `GAppInfo` searches has changed (#3082, work by Nelson + Benítez León) + + * Rename `GTK_USE_PORTAL` environment variable to `GIO_USE_PORTALS` (#3107, + work by Philip Withnall) + + * Bump Meson dependency to 1.2.0 and depend on Python `packaging` module + (!3666, !3752) + +Bugs fixed: + - #596 GApplication in Garbage Collected environments would benefit from a + g_application_command_line_exit() to enable remote instances to exit. + (Aleksandr Mezin) + - #791 Wish: Add a "nodelay" property to GSocket or GTcpConnection (Philip + Withnall) + - #2810 thread-pool-slow intermittent assertion failure in + test_thread_sort_entry_func() (Philip Withnall) + - #2824 G_REGEX_OPTIMIZE causes incorrect regex behaviour + - #2991 Drop translatable pspec nick/blurbs from properties in GIO (Sophie + Herold) + - #3082 Investigate prioritising prefix matches on GAppInfo keywords over + substring matches on names (Nelson Benítez León) + - #3087 glib doesn't cleanly unload on Windows (Luca Bacci) + - #3098 Make invalid escape sequences in GKeyFile fatal (Philip Withnall) + - #3103 mkenums: Can't parse an enum value with value ',' (Lukáš Tyrychtr) + - #3105 NetworkManager 1.44.0 crashes repeatedly with glib 2.78.0 (Philip + Withnall) + - #3107 Rename GTK_USE_PORTAL to avoid portal services being run with portals + force-enabled (Philip Withnall) + - #3111 gsubprocess-testprog.c: build error with cygwin (sys/ptrace.h: No such + file or directory) (Philip Withnall) + - #3112 Update to Unicode 15.1 (Philip Withnall) + - #3115 Support for additional strftime formatting capabilities + - #3116 gio clears modification time in microseconds when setting with + `set_modification_date_time` (Lukáš Tyrychtr) + - #3119 Add support for `%Ey` to g_date_time_format() (Philip Withnall) + - #3120 Build of glib 2.78.0 ignores -Dlibelf=disabled (Philip Withnall) + - #3128 glib-2.78.0 fails at gio/tests/gsubprocess.p/gsubprocess.c.o + - #3130 Segfault when creating GIO GPropertyAction without properties + - #3134 glib incompatible with Python 3.12 due to distutils usage + - #3135 Add GNU/Hurd CI + - #3140 Add a flag to not copy modification time when copying files (Khalid + Abu Shawarib) + - #3144 `g_file_set_contents_full()` doesn't truncate the file (without + `G_FILE_SET_CONTENTS_CONSISTENT`) (Philip Withnall) - #3156 check for #ifdef PTRACE_O_EXITKILL will always fail since it isn't a macro (Alessandro Bono) - #3157 gsubprocess build-time test intermittently timing out since 2.78.1 (Simon McVittie) - - !3673 Backport !3669 “meson: Improve PTRACE_O_EXITKILL presence check” to - glib-2-78 - - !3680 Backport !3677 “Make GQuark register intentional leaks” to glib-2-78 - - !3681 Backport 3678 “gsignalgroup: Avoid function call with side effect in - g_return_* macro” to glib-2-78 - - !3686 Backport !3685 “tests: Don't assume that sh optimizes simple commands - into exec” to glib-2-78 - - !3718 Backport !3714 “xdgmime: Handle buggy type definitions with circular - inheritance” to glib-2-78 - - !3727 Backport !3725 “collate: Don't segfault on bad input” to glib-2-78 - -* Translation updates: - - Ukrainian (Yuri Chornoivan) - - -Overview of changes in GLib 2.78.1, 2023-10-25 -============================================== - -* Fix truncating files when `g_file_set_contents_full()` is called without - `G_FILE_SET_CONTENTS_CONSISTENT` (#3144, work by Philip Withnall) - -* Fix `-Dlibelf=disabled` on Linux (#3120, work by Philip Withnall) - -* Bugs fixed: - - #3105 NetworkManager 1.44.0 crashes repeatedly with glib 2.78.0 (Philip + - #3158 "CRITICAL" log when using --attributes option for "gio info" (Philip Withnall) - - #3111 gsubprocess-testprog.c: build error with cygwin (sys/ptrace.h: No such - file or directory) (Philip Withnall) - - #3116 gio clears modification time in microseconds when setting with - `set_modification_date_time` (Lukáš Tyrychtr) - - #3120 Build of glib 2.78.0 ignores -Dlibelf=disabled (Philip Withnall) - - #3128 glib-2.78.0 fails at gio/tests/gsubprocess.p/gsubprocess.c.o - - #3130 Segfault when creating GIO GPropertyAction without properties - - #3144 `g_file_set_contents_full()` doesn't truncate the file (without - `G_FILE_SET_CONTENTS_CONSISTENT`) (Philip Withnall) + - #3159 glib regex test fails JIT compiler tests under musl libc (Pablo Correa + Gómez) + - #3161 codegen installation is broken + - #3168 gvfs-udisks2-volume-monitor SIGSEGV in g_content_type_guess_for_tree() + due to filename with bad encoding (Ondrej Holy) + - #3183 g_dbus_connection_signal_subscribe with flag + G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH doesn't work with an arg0 that is an + object path (Philip Withnall) + - #3185 g_utf8_collate_key() segfaults when passed an invalid length + - #3186 [RFE] Increase gio sniff buffer for mime type magic detection to 16K + or so (Philip Withnall) + - #3187 g_vasprintf crashes when passed invalid UTF-8 (Philip Withnall) + - #3191 Crash in __gio_xdg_cache_mime_type_subclass (Philip Withnall) + - #3203 Fdo notification fails without AppID (Michael Catanzaro) + - !3143 gatomic: Use g(u)intptr where appropriate + - !3316 gobject: Separate GWeakRef from GWeakNotify + - !3394 gsocketclient: Document delays/timeouts better + - !3457 glib-unix: Add convenience API for pipes + - !3524 add muslc ci + - !3552 gutils: Use international symbol for bits + - !3566 Update annotations for GAsyncQueue and GDir + - !3567 Update annotations for GHmac + - !3568 Update GOptionContext annotations + - !3569 Small fixes and cleanups for Vectored Exception Handlers + - !3571 Update GStringChunk annotations + - !3572 Update GRand annotations + - !3573 Update GTimer annotations - !3576 guniprop.c: Avoid creating (temporarily) out-of-bounds pointers + - !3577 gthread: introduce g_once_init_{enter,leave}_pointer + - !3578 GType: Use guintptr as the underlying storage if larger than gsize - !3579 Fixes for integer cast warnings when targeting CHERI - !3580 Fix test_find_program on FreeBSD - - !3589 gconstructor.h: Ensure [c|d]tor prototypes are present for MSVC (Chun- - wei Fan) + - !3581 gthread: Fix optional/nullable annotations for g_once_init_*() + - !3582 Buffer needs to be aligned correctly to receive linux_dirent64. + - !3589 gconstructor.h: Ensure [c|d]tor prototypes are present for MSVC + (Chun-wei Fan) + - !3590 gtestutils.h: Fix warning with -Wsign-conversion caused by + g_assert_cmpint + - !3591 Switch to using gi-docgen for docs (batch 1) - !3594 Fix gutils-user-database test on macOS + - !3595 gobject: cache flags needed for g_type_create_instance() - !3596 Add value annotation to G_TYPE_FUNDAMENTAL_MAX + - !3597 Expand security policy to cover previous stable branch + - !3598 Document NULL pointer pitfall in toolchain requirements - !3601 meson: Fix Windows build with PCRE2 as sibling subproject - - !3604 Backport !3589 “gconstructor.h: Ensure [c|d]tor prototypes are present - for MSVC” to glib-2-78 - - !3608 Backport !3587 “glocalfileinfo: Preserve microseconds for - access/modify times” to glib-2-78 - - !3609 Backport !3607 “Make sure the `GTask` is freed on a graceful - disconnect” to glib-2-78 (Pavel Sobolev) - - !3614 Backport !3582 “Buffer needs to be aligned correctly to receive - linux_dirent64.” to glib-2-78 - - !3616 Backport !3590 “gtestutils.h: Fix warning with -Wsign-conversion - caused by g_assert_cmpint” to glib-2-78 - - !3619 Backport !3617 “tests: Drop unnecessary include from gsubprocess- - testprog.c” to glib-2-78 - - !3622 Backport !3621 “wakeup: do single read when using eventfd()” to - glib-2-78 - - !3625 Backport !3624 “wakeup: Fix g_wakeup_acknowledge if signal comes in” - to glib-2-78 - - !3644 Backport !3633 “Use g_task_return in task threads” to glib-2-78 - - !3649 Backport !3648 “build: Fix -Dlibelf=disabled on Linux” to glib-2-78 - - !3659 Backport !3650 “gfileutils: Add a missing ftruncate() call when - writing files” to glib-2-78 + - !3603 Add GBytes variants for GSocket receive methods + - !3605 build: Post-release version bump + - !3607 Make sure the `GTask` is freed on a graceful disconnect + - !3610 gdesktopappinfo: Do not search Comment field + - !3611 tests/constructor: Fix "unknown pragma ignored" warning on clang + - !3612 Update GStrv annotations + - !3613 tests: Fix gdatetime test on non-UTC systems + - !3620 gmain: avoid a GList traversal when removing source + - !3621 wakeup: do single read when using eventfd() + - !3623 Windows: Compile with the UNICODE / _UNICODE macros + - !3624 wakeup: Fix g_wakeup_acknowledge if signal comes in + - !3627 Add Hurd code owners + - !3628 glib-unix: Use full path to gstdio.h include + - !3629 glib/tests/meson.build: remove identical build targets + - !3630 glib-compile-resources: ensure alignment is at least sizeof(void *) + - !3632 Stop using enums in bitfields + - !3633 Use g_task_return in task threads + - !3634 Switch to using gi-docgen for docs (batch 2) + - !3635 Fix warnings with Clang on Windows and enable --Werror in CI + - !3636 Generate introspection data + - !3637 gstrvbuilder: Add g_strv_builder_take + - !3638 Cleanup and add content to glib debugging using gdb scripts + - !3640 GIO/tests: skip test_resources_binary on MIPS platforms + - !3641 build: Simplify MIPS test check + - !3645 Switch to using gi-docgen for docs (batch 3) + - !3646 ci: Update from clang-format-11 to clang-format-14 + - !3647 Switch to using gi-docgen for docs (batch 4) + - !3652 GApplicationCommandLine: add print[err]_literal() + - !3654 gdatetime: Fix minor leaks from strup/strdown calls + - !3655 gdatetime: Fix incorrect alt-digits being used after changing locale + - !3656 gmodule-dl: Use RTLD_DEFAULT on FreeBSD too + - !3660 Switch to using gi-docgen for docs (batch 5) + - !3661 Switch to using gi-docgen for docs (batch 6) + - !3662 Switch to using gi-docgen for docs (batch 7) + - !3663 gdbusconnection: don't cache G_IO_ERROR_CANCELLED errors + - !3664 gmain: optimize "context->sources" hash table to use as set + - !3665 ci: Remove .build-linux from Hurd CI scheduled job + - !3666 build: Bump Meson dependency to 1.2.0 + - !3667 Switch to using gi-docgen for docs (batch 8) + - !3668 Socket & readiness fixes + - !3671 gio/tests: Add test generated txt as the resources test dependency + - !3672 glib-private: Check for LSAN support at runtime when controlling it + - !3674 gtask: Add g_task_return_prefixed_error() + - !3677 Make GQuark register intentional leaks + - !3678 gsignalgroup: Avoid function call with side effect in g_return_* macro + - !3679 gmessages: fix dropping irrelevant log domains + - !3682 tests: Fix dependency of test.gresource on test-generated.txt + - !3683 glib: Disable dynamic asan loading on macOS + - !3687 fix: about libproc.h and PROC_PIDLISTFD_SIZE + - !3688 build: Fix the inclusion paths for GIR files in gi-docgen + - !3689 meson: Add missing dependencies for utility files for gdbus-codegen + - !3690 Switch to using gi-docgen for docs (batch 9) + - !3695 gvalue: add "steal_string" + - !3699 [th/prgname] use atomic pointers for g_prgname/g_application_name and + add g_set_prgname_once() + - !3701 tests: Fix gio-tool.py test on macOS + - !3702 glib.supp: Suppress the global_mime_dirs allocations + - !3703 Port GIRepository to GTypeInstance and add introspection + - !3704 girepository: Rename symbols to the GI namespace + - !3707 girepository: Ignore set-but-not-used warnings with G_DISABLE_ASSERT + - !3708 Fix various leaks in cmph-bdz-test and gutils + - !3709 Switch to using gi-docgen for docs (batch 10) + - !3710 gmessages: introduce g_log_writer_default_set_debug_domains() + - !3711 ghmac: Add a boxed type for GHmac and fix introspection build + accordingly + - !3712 Switch to using gi-docgen for docs (batch 11) + - !3713 gfileutils: Fix g_file_get_contents() silent under-read of large files + when off_t is wider than size_t + - !3714 xdgmime: Handle buggy type definitions with circular inheritance + - !3715 goption: Fix a typo + - !3716 tests: Improve build of cmph tests in girepository + - !3717 tests: provide reason for disabling convert test under musl + - !3721 gtestutils: Add g_test_trap_subprocess_with_envp() for testing envs + - !3722 gdir, gstrvbuilder: Add refcounting support and a boxed type + - !3723 gwin32: Un-hide symbols when building GIR + - !3726 tests: Fix fileutils build on FreeBSD and macOS + - !3731 tests: Fix string test failure on BSDs + - !3732 gspawn: Stop spewing debug messages + - !3733 ci: Make the Alpine CI name more consistent + - !3734 gdatetime: Disable ERA support on platforms which don’t support this + - !3735 ci: Fix printing info message at end of run-style-check-diff.sh + - !3736 build: Rename -Dgtk_doc option to -Ddocumentation and fix some + g-ir-scanner warnings + - !3739 Documentation only: Added clarification about GWeakNotify and removed + ambiguous text + - !3741 hash: Explicitly annotate key in iter_next as nullable + - !3743 ci: Install correct version of Meson on Alpine CI image + - !3745 tests: Assert there no errors first in gdbus-test-codegen + - !3751 Fix generated RST anchors for methods, signals and properties + - !3752 build: Make packaging module required + - !3753 gobject_gdb.py: Do not break bt on optimized build + - !3755 tests: Use textwrap.dedent to indent expected strings pleasingly + - !3757 ci: Re-add explicit Meson version to Alpine CI image + - !3758 docs: Add a section on version checking macros + - !3760 girepository: Various API cleanups + - !3761 gerror: Fix an old allow-none annotation + - !3762 [th/notify-queue] some optimization around + g_object_freeze_notify()/g_object_thaw_notify() + - !3763 girepository: Drop libgio dependency from gdump.c + - !3764 gsignal: fix reference to signals documentation page + - !3765 gapplication: Fix minor typo in docs + - !3767 girepository: Port documentation to gi-docgen and update + - !3768 ci: Build docs artifacts for deployment to docs.gtk.org + - !3770 GDateTime: Add usec precision API for unix time + - !3771 gtask: Add g_task_return_new_error_literal() + - !3772 gobject: Make GLib-2.0 gir build depend on GObject dependency + - !3773 girepository: Return enumerated versions and search paths as a GStrv + - !3776 glocalvfs: Remove unnecessary and buggy code + - !3777 Fix detecting size_t size when `-Wmissing-prototypes` is in CFLAGS + - !3779 gtypemodule: Add assertions in finalize() + - !3782 docs: fix a typo + - !3786 girepository: Re-number GIR file from 2.0 to 3.0 + - !3787 docs: Install the gi-docgen docs * Translation updates: - Catalan (Jordi Mas i Hernandez) @@ -87,15 +520,15 @@ Overview of changes in GLib 2.78.1, 2023-10-25 - Czech (Daniel Rusek) - Esperanto (Kristjan SCHMIDT) - French (Alexandre Franke) - - Georgian (Ekaterine Papava) - Italian (Milo Casagrande) - Latvian (Rūdolfs Mazurs) - Portuguese (Brazil) (Rafael Fontenelle) - - Romanian (Daniel Șerbănescu) + - Romanian (Florentina Mușat) - Russian (Artur S0) - Slovenian (Matej Urbančič) - Spanish (Daniel Mustieles) - Turkish (Sabri Ünal) + - Ukrainian (Yuri Chornoivan) Overview of changes in GLib 2.78.0, 2023-09-08 diff --git a/README.md b/README.md index 13f8aa2..6e19a38 100644 --- a/README.md +++ b/README.md @@ -19,9 +19,10 @@ GLib on Windows. ## Supported versions -Only the most recent unstable and stable release series are supported. All -older versions are not supported upstream and may contain bugs, some of -which may be exploitable security vulnerabilities. +Upstream GLib only supports the most recent stable release series, the previous +stable release series, and the current development release series. All +older versions are not supported upstream and may contain bugs, some of which +may be exploitable security vulnerabilities. See [SECURITY.md](SECURITY.md) for more details. diff --git a/SECURITY.md b/SECURITY.md index c7fb816..c7797d5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,11 +7,16 @@ ## Supported Versions -Upstream GLib only supports the most recent stable release series, and the -current development release series. Any older stable release series are no -longer supported, although they may still receive backported security updates -in long-term support distributions. Such support is up to the distributions, -though. +Upstream GLib only supports the most recent stable release series, the previous +stable release series, and the current development release series. Any older +stable release series are no longer supported, although they may still receive +backported security updates in long-term support distributions. Such support is +up to the distributions, though. + +The previous stable release series will generally receive fixes only for high +impact security issues, at maintainer discretion. Since such issues are rare, +it's expected that there may be no backports or releases on the previous stable +branch. Under GLib’s versioning scheme, stable release series have an *even* minor component (for example, 2.66.0, 2.66.1, 2.68.3), and development release series diff --git a/docs/CODEOWNERS b/docs/CODEOWNERS index cd4ef73..69e9e85 100644 --- a/docs/CODEOWNERS +++ b/docs/CODEOWNERS @@ -53,6 +53,9 @@ subprojects/ @xclaesse @nirbheek @pwithnall *bsd* @jmatthew @ajacoutot @lantw @pwithnall *kqueue* @jmatthew @ajacoutot @lantw @pwithnall +# GNU Hurd support +*hurd* @bugaevc @sthibaul + # flatpak portals gio/*portal* @matthiasc @alexl @pwithnall diff --git a/docs/reference/.gitignore b/docs/reference/.gitignore deleted file mode 100644 index f9e370e..0000000 --- a/docs/reference/.gitignore +++ /dev/null @@ -1,16 +0,0 @@ -*-decl-list.txt -*-decl.txt -*-unused.txt -*-undocumented.txt -*-undeclared.txt -*.args -*.hierarchy -*.interfaces -*.prerequisites -*.signals -*.stamp -html -xml -*.bak -version.xml -*.1 diff --git a/docs/reference/gio/.gitignore b/docs/reference/gio/.gitignore deleted file mode 100644 index e9e522e..0000000 --- a/docs/reference/gio/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.1 -gio-overrides.txt -tmpl diff --git a/docs/reference/gio/concat-files-helper.py b/docs/reference/gio/concat-files-helper.py deleted file mode 100644 index d434f9e..0000000 --- a/docs/reference/gio/concat-files-helper.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright (C) 2018 Collabora Inc. -# -# 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.1 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, see . -# -# Author: Xavier Claessens - -import os -import sys - -if len(sys.argv) < 3: - print( - "Usage: {} ...".format( - os.path.basename(sys.argv[0]) - ) - ) - sys.exit(1) - -with open(sys.argv[1], "w") as outfile: - for fname in sys.argv[2:]: - with open(fname) as infile: - for line in infile: - outfile.write(line) diff --git a/docs/reference/gio/dbus-error.md b/docs/reference/gio/dbus-error.md new file mode 100644 index 0000000..fc1a1a6 --- /dev/null +++ b/docs/reference/gio/dbus-error.md @@ -0,0 +1,79 @@ +Title: D-Bus Error Handling +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 David Zeuthen +SPDX-FileCopyrightText: 2012 Aleksander Morgado + +# D-Bus Error Handling + +All facilities that return errors from remote methods (such as +[method@Gio.DBusConnection.call_sync]) use [type@GLib.Error] to represent both +D-Bus errors (e.g. errors returned from the other peer) and locally in-process +generated errors. + +To check if a returned [type@GLib.Error] is an error from a remote peer, use +[func@Gio.DBusError.is_remote_error]. To get the actual D-Bus error name, +use [func@Gio.DBusError.get_remote_error]. Before presenting an error, always +use [func@Gio.DBusError.strip_remote_error]. + +In addition, facilities used to return errors to a remote peer also use +[type@GLib.Error]. See [method@Gio.DBusMethodInvocation.return_error] for +discussion about how the D-Bus error name is set. + +Applications can associate a [type@GLib.Error] error domain with a set of D-Bus +errors in order to automatically map from D-Bus errors to [type@GLib.Error] and +back. This is typically done in the function returning the [type@GLib.Quark] for +the error domain: + +```c +// foo-bar-error.h: + +#define FOO_BAR_ERROR (foo_bar_error_quark ()) +GQuark foo_bar_error_quark (void); + +typedef enum +{ + FOO_BAR_ERROR_FAILED, + FOO_BAR_ERROR_ANOTHER_ERROR, + FOO_BAR_ERROR_SOME_THIRD_ERROR, + FOO_BAR_N_ERRORS / *< skip >* / +} FooBarError; + +// foo-bar-error.c: + +static const GDBusErrorEntry foo_bar_error_entries[] = +{ + {FOO_BAR_ERROR_FAILED, "org.project.Foo.Bar.Error.Failed"}, + {FOO_BAR_ERROR_ANOTHER_ERROR, "org.project.Foo.Bar.Error.AnotherError"}, + {FOO_BAR_ERROR_SOME_THIRD_ERROR, "org.project.Foo.Bar.Error.SomeThirdError"}, +}; + +// Ensure that every error code has an associated D-Bus error name +G_STATIC_ASSERT (G_N_ELEMENTS (foo_bar_error_entries) == FOO_BAR_N_ERRORS); + +GQuark +foo_bar_error_quark (void) +{ + static gsize quark = 0; + g_dbus_error_register_error_domain ("foo-bar-error-quark", + &quark, + foo_bar_error_entries, + G_N_ELEMENTS (foo_bar_error_entries)); + return (GQuark) quark; +} +``` + +With this setup, a D-Bus peer can transparently pass e.g. +`FOO_BAR_ERROR_ANOTHER_ERROR` and other peers will see the D-Bus error name +`org.project.Foo.Bar.Error.AnotherError`. + +If the other peer is using GDBus, and has registered the association with +[func@Gio.DBusError.register_error_domain] in advance (e.g. by invoking the +`FOO_BAR_ERROR` quark generation itself in the previous example) the peer will +see also `FOO_BAR_ERROR_ANOTHER_ERROR` instead of `G_IO_ERROR_DBUS_ERROR`. Note +that GDBus clients can still recover `org.project.Foo.Bar.Error.AnotherError` +using [func@Gio.DBusError.get_remote_error]. + +Note that the `G_DBUS_ERROR` error domain is intended only for returning errors +from a remote message bus process. Errors generated locally in-process by e.g. +[class@Gio.DBusConnection] should use the `G_IO_ERROR` domain. + diff --git a/docs/reference/gio/dbus-introspection.md b/docs/reference/gio/dbus-introspection.md new file mode 100644 index 0000000..2eacc26 --- /dev/null +++ b/docs/reference/gio/dbus-introspection.md @@ -0,0 +1,23 @@ +Title: D-Bus Introspection Data +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 David Zeuthen +SPDX-FileCopyrightText: 2010 Matthias Clasen + +# D-Bus Introspection Data + +Various data structures and convenience routines to parse and +generate D-Bus introspection XML. Introspection information is +used when registering objects with [method@Gio.DBusConnection.register_object]. + +The format of D-Bus introspection XML is specified in the +[D-Bus specification](http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format). + +The main introspection data structures are: + * [type@Gio.DBusNodeInfo] + * [type@Gio.DBusInterfaceInfo] + * [type@Gio.DBusPropertyInfo] + * [type@Gio.DBusMethodInfo] + * [type@Gio.DBusSignalInfo] + * [type@Gio.DBusArgInfo] + * [type@Gio.DBusAnnotationInfo] + diff --git a/docs/reference/gio/dbus-name-owning.md b/docs/reference/gio/dbus-name-owning.md new file mode 100644 index 0000000..a8daaaf --- /dev/null +++ b/docs/reference/gio/dbus-name-owning.md @@ -0,0 +1,14 @@ +Title: D-Bus Name Owning +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 David Zeuthen + +# D-Bus Name Owning + +Convenience API for owning bus names. + +A simple example for owning a name can be found in +[`gdbus-example-own-name.c`](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-own-name.c). + +The main API for owning names is: + * [func@Gio.bus_own_name] + * [func@Gio.bus_unown_name] diff --git a/docs/reference/gio/dbus-name-watching.md b/docs/reference/gio/dbus-name-watching.md new file mode 100644 index 0000000..07ff334 --- /dev/null +++ b/docs/reference/gio/dbus-name-watching.md @@ -0,0 +1,14 @@ +Title: D-Bus Name Watching +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 David Zeuthen + +# D-Bus Name Watching + +Convenience API for watching bus names. + +A simple example for watching a name can be found in +[`gdbus-example-watch-name.c`](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-name.c). + +The main API for watching names is: + * [func@Gio.bus_watch_name] + * [func@Gio.bus_unwatch_name] diff --git a/docs/reference/gio/dbus-utils.md b/docs/reference/gio/dbus-utils.md new file mode 100644 index 0000000..70ff84c --- /dev/null +++ b/docs/reference/gio/dbus-utils.md @@ -0,0 +1,28 @@ +Title: D-Bus Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 David Zeuthen + +# D-Bus Utilities + +Various utility routines related to D-Bus. + +GUID support: + * [func@Gio.dbus_is_guid] + * [func@Gio.dbus_generate_guid] + +Name validation: + * [func@Gio.dbus_is_name] + * [func@Gio.dbus_is_unique_name] + * [func@Gio.dbus_is_member_name] + * [func@Gio.dbus_is_interface_name] + * [func@Gio.dbus_is_error_name] + +Conversion between [type@GLib.Variant] and [type@GObject.Value]: + * [func@Gio.dbus_gvariant_to_gvalue] + * [func@Gio.dbus_gvalue_to_gvariant] + +Path escaping: + * [func@Gio.dbus_escape_object_path_bytestring] + * [func@Gio.dbus_escape_object_path] + * [func@Gio.dbus_unescape_object_path] + diff --git a/docs/reference/gio/error.md b/docs/reference/gio/error.md new file mode 100644 index 0000000..bc61b94 --- /dev/null +++ b/docs/reference/gio/error.md @@ -0,0 +1,12 @@ +Title: GIOError +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007 A. Walton + +# GIOError + +Contains helper functions for reporting errors to the user. + +Functions for converting between different error reporting mechanisms: + * [func@Gio.io_error_from_errno] + * [func@Gio.io_error_from_file_error] + diff --git a/docs/reference/gio/file-attributes.md b/docs/reference/gio/file-attributes.md new file mode 100644 index 0000000..c9f1fe7 --- /dev/null +++ b/docs/reference/gio/file-attributes.md @@ -0,0 +1,111 @@ +Title: File Attributes +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007 Andrew Walton +SPDX-FileCopyrightText: 2007 Alexander Larsson +SPDX-FileCopyrightText: 2008, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2011 Murray Cumming +SPDX-FileCopyrightText: 2012 David King + +# File Attributes + +File attributes in GIO consist of a list of key-value pairs. + +Keys are strings that contain a key namespace and a key name, separated +by a colon, e.g. `namespace::keyname`. Namespaces are included to sort +key-value pairs by namespaces for relevance. Keys can be retrieved +using wildcards, e.g. `standard::*` will return all of the keys in the +`standard` namespace. + +The list of possible attributes for a filesystem (pointed to by a +[iface@Gio.File]) is available as a [struct@Gio.FileAttributeInfoList]. This +list is queryable by key names as indicated earlier. + +Information is stored within the list in [struct@Gio.FileAttributeInfo] +structures. The info structure can store different types, listed in the enum +[type@Gio.FileAttributeType]. Upon creation of a [struct@Gio.FileAttributeInfo], +the type will be set to `G_FILE_ATTRIBUTE_TYPE_INVALID`. + +Classes that implement [iface@Gio.File] will create a +[struct@Gio.FileAttributeInfoList] and install default keys and values for their +given file system, architecture, and other possible implementation details +(e.g., on a UNIX system, a file attribute key will be registered for the user ID +for a given file). + +## Default Namespaces + +- `"standard"`: The ‘Standard’ namespace. General file information that + any application may need should be put in this namespace. Examples + include the file’s name, type, and size. +- `"etag`: The [Entity Tag](gfile.html#entity-tags) namespace. Currently, the + only key in this namespace is `value`, which contains the value of the current + entity tag. +- `"id"`: The ‘Identification’ namespace. This namespace is used by file + managers and applications that list directories to check for loops and + to uniquely identify files. +- `"access"`: The ‘Access’ namespace. Used to check if a user has the + proper privileges to access files and perform file operations. Keys in + this namespace are made to be generic and easily understood, e.g. the + `can_read` key is true if the current user has permission to read the + file. UNIX permissions and NTFS ACLs in Windows should be mapped to + these values. +- `"mountable"`: The ‘Mountable’ namespace. Includes simple boolean keys + for checking if a file or path supports mount operations, e.g. mount, + unmount, eject. These are used for files of type `G_FILE_TYPE_MOUNTABLE`. +- `"time"`: The ‘Time’ namespace. Includes file access, changed, created + times. +- `"unix"`: The ‘Unix’ namespace. Includes UNIX-specific information and + may not be available for all files. Examples include the UNIX UID, + GID, etc. +- `"dos"`: The ‘DOS’ namespace. Includes DOS-specific information and may + not be available for all files. Examples include `is_system` for checking + if a file is marked as a system file, and `is_archive` for checking if a + file is marked as an archive file. +- `"owner"`: The ‘Owner’ namespace. Includes information about who owns a + file. May not be available for all file systems. Examples include `user` + for getting the user name of the file owner. This information is often + mapped from some backend specific data such as a UNIX UID. +- `"thumbnail"`: The ‘Thumbnail’ namespace. Includes information about file + thumbnails and their location within the file system. Examples of keys in + this namespace include `path` to get the location of a thumbnail, `failed` + to check if thumbnailing of the file failed, and `is-valid` to check if + the thumbnail is outdated. +- `"filesystem"`: The ‘Filesystem’ namespace. Gets information about the + file system where a file is located, such as its type, how much space is + left available, and the overall size of the file system. +- `"gvfs"`: The ‘GVFS’ namespace. Keys in this namespace contain information + about the current GVFS backend in use. +- `"xattr"`: The ‘xattr’ namespace. Gets information about extended user + attributes. See [`attr(5)`](man:attr(5)). The `user.` prefix of the extended + user attribute name is stripped away when constructing keys in this namespace, + e.g. `xattr::mime_type` for the extended attribute with the name + `user.mime_type`. Note that this information is only available if + GLib has been built with extended attribute support. +- `"xattr-sys"`: The ‘xattr-sys’ namespace. Gets information about + extended attributes which are not user-specific. See [`attr(5)`](man:attr(5)). + Note that this information is only available if GLib has been built with + extended attribute support. +- `"selinux"`: The ‘SELinux’ namespace. Includes information about the + SELinux context of files. Note that this information is only available + if GLib has been built with SELinux support. + +Please note that these are not all of the possible namespaces. +More namespaces can be added from GIO modules or by individual applications. +For more information about writing GIO modules, see [class@Gio.IOModule]. + + + +## Default Keys + +For a list of the built-in keys and their types, see the [class@Gio.FileInfo] +documentation. + +Note that there are no predefined keys in the `xattr` and `xattr-sys` +namespaces. Keys for the `xattr` namespace are constructed by stripping +away the `user.` prefix from the extended user attribute, and prepending +`xattr::`. Keys for the `xattr-sys` namespace are constructed by +concatenating `xattr-sys::` with the extended attribute name. All extended +attribute values are returned as hex-encoded strings in which bytes outside +the ASCII range are encoded as escape sequences of the form `\xnn` +where `nn` is a 2-digit hexadecimal number. + diff --git a/docs/reference/gio/gapplication.rst b/docs/reference/gio/gapplication.rst new file mode 100644 index 0000000..338b3a7 --- /dev/null +++ b/docs/reference/gio/gapplication.rst @@ -0,0 +1,195 @@ +.. _gapplication(1): +.. meta:: + :copyright: Copyright 2013 Allison Karlitskaya + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2013 Allison Karlitskaya + SPDX-License-Identifier: LGPL-2.1-or-later + +============ +gapplication +============ + +-------------------------- +D-Bus application launcher +-------------------------- + +SYNOPSIS +-------- + +| **gapplication** help [COMMAND] +| **gapplication** version +| **gapplication** list-apps +| **gapplication** launch +| **gapplication** launch [FILE…] +| **gapplication** list-actions +| **gapplication** action [PARAMETER] + +DESCRIPTION +----------- + +``gapplication`` is a commandline implementation of the client-side of the +``org.freedesktop.Application`` interface as specified by the freedesktop.org +Desktop Entry Specification. + +``gapplication`` can be used to start applications that have ``DBusActivatable`` +set to ``true`` in their ``.desktop`` files and can be used to send messages to +already-running instances of other applications. + +It is possible for applications to refer to ``gapplication`` in the ``Exec`` +line of their ``.desktop`` file to maintain backwards compatibility with +implementations that do not directly support ``DBusActivatable``. + +``gapplication`` ships as part of GLib. + +COMMANDS +-------- + +``help [COMMAND]`` + + Displays a short synopsis of the available commands or provides detailed help + on a specific command. + +``version`` + + Prints the GLib version whence ``gapplication`` came. + +``list-apps`` + + Prints a list of all application IDs that are known to support D-Bus + activation. This list is generated by scanning ``.desktop`` files as per the + current ``XDG_DATA_DIRS``. + +``launch [FILE…]`` + + Launches an application. + + The first parameter is the application ID in the familiar ‘reverse DNS’ style + (e.g. ``org.gnome.app``) without the ``.desktop`` suffix. + + Optionally, if additional parameters are given, they are treated as the names + of files to open and may be filenames or URIs. If no files are given then the + application is simply activated. + +``list-actions `` + + List the actions declared in the application’s ``.desktop`` file. The + parameter is the application ID, as above. + +``action [PARAMETER]`` + + Invokes the named action (in the same way as would occur when activating an + action specified in the ``.desktop`` file). + + The application ID (as above) is the first parameter. The action name + follows. + + Optionally, following the action name can be one parameter, in GVariant + format, given as a single argument. Make sure to use sufficient quoting. + +EXAMPLES +-------- + +From the commandline +^^^^^^^^^^^^^^^^^^^^ + +Launching an application:: + + gapplication launch org.example.fooview + +Opening a file with an application:: + + gapplication launch org.example.fooview ~/file.foo + +Opening many files with an application:: + + gapplication launch org.example.fooview ~/foos/*.foo + +Invoking an action on an application:: + + gapplication action org.example.fooview create + +Invoking an action on an application, with an action:: + + gapplication action org.example.fooview show-item '"item_id_828739"' + +From the ``Exec`` lines of a ``.desktop`` file +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The commandline interface of ``gapplication`` was designed so that it could be +used directly from the ``Exec`` line of a ``.desktop`` file. + +You might want to do this to allow for backwards compatibility with +implementations of the specification that do not understand how to do D-Bus +activation, without having to install a separate utility program. + +Consider the following example:: + + [Desktop Entry] + Version=1.1 + Type=Application + Name=Foo Viewer + DBusActivatable=true + MimeType=image/x-foo; + Exec=gapplication launch org.example.fooview %F + Actions=gallery;create; + + [Desktop Action gallery] + Name=Browse Gallery + Exec=gapplication action org.example.fooview gallery + + [Desktop Action create] + Name=Create a new Foo! + Exec=gapplication action org.example.fooview create + +From a script +^^^^^^^^^^^^^ + +If installing an application that supports D-Bus activation you may still want +to put a file in ``/usr/bin`` so that your program can be started from a +terminal. + +It is possible for this file to be a shell script. The script can handle +arguments such as ``--help`` and ``--version`` directly. It can also parse +other command line arguments and convert them to uses of ``gapplication`` to +activate the application, open files, or invoke actions. + +Here is a simplified example, as may be installed in ``/usr/bin/fooview``:: + + #!/bin/sh + + case "$1" in + --help) + echo "see ‘man fooview’ for more information" + ;; + + --version) + echo "fooview 1.2" + ;; + + --gallery) + gapplication action org.example.fooview gallery + ;; + + --create) + gapplication action org.example.fooview create + ;; + + -*) + echo "unrecognised commandline argument" + exit 1 + ;; + + *) + gapplication launch org.example.fooview "$@" + ;; + esac + +SEE ALSO +-------- + +`Desktop Entry Specification `_, +`gdbus(1) `_, +`xdg-open(1) `_, +`desktop-file-validate(1) `_ \ No newline at end of file diff --git a/docs/reference/gio/gapplication.xml b/docs/reference/gio/gapplication.xml deleted file mode 100644 index 13e3f23..0000000 --- a/docs/reference/gio/gapplication.xml +++ /dev/null @@ -1,352 +0,0 @@ - - - gapplication - GIO - - - Developer - Ryan - Lortie - - - - - - gapplication - 1 - User Commands - - - - gapplication - D-Bus application launcher - - - - - gapplication - help - COMMAND - - - gapplication - version - - - gapplication - list-apps - - - gapplication - launch - APPID - - - gapplication - launch - APPID - FILE - - - gapplication - list-actions - APPID - - - gapplication - action - APPID - ACTION - PARAMETER - - - - - Description - - - gapplication is a commandline implementation of the client-side of the - org.freedesktop.Application interface as specified by the freedesktop.org - Desktop Entry Specification. - - - - gapplication can be used to start applications that have - DBusActivatable set to true in their .desktop - files and can be used to send messages to already-running instances of other applications. - - - - It is possible for applications to refer to gapplication in the Exec - line of their .desktop file to maintain backwards compatibility - with implementations that do not directly support DBusActivatable. - - - - gapplication ships as part of GLib. - - - - - Commands - - - Global commands - - - - - help - COMMAND - - - - Displays a short synopsis of the available commands or provides detailed help on a specific - command. - - - - - - - version - - - - Prints the GLib version whence gapplication came. - - - - - - - list-apps - - - - Prints a list of all application IDs that are known to support D-Bus activation. This list is - generated by scanning .desktop files as per the current - XDG_DATA_DIRS. - - - - - - - launch - APPID - FILE - - - - Launches an application. - - - The first parameter is the application ID in the familiar "reverse DNS" style (eg: - 'org.gnome.app') without the .desktop - suffix. - - - Optionally, if additional parameters are given, they are treated as the names of files to open and - may be filenames or URIs. If no files are given then the application is simply activated. - - - - - - - list-actions - APPID - - - - List the actions declared in the application's .desktop - file. The parameter is the application ID, as above. - - - - - - - action - APPID - ACTION - PARAMETER - - - - Invokes the named action (in the same way as would occur when activating an action specified in - the .desktop file). - - - The application ID (as above) is the first parameter. The action name follows. - - - Optionally, following the action name can be one parameter, in GVariant format, given as a single - argument. Make sure to use sufficient quoting. - - - - - - - - - - Examples - - - From the commandline - - - Launching an application: - - - - gapplication launch org.example.fooview - - - - Opening a file with an application: - - - - gapplication launch org.example.fooview ~/file.foo - - - - Opening many files with an application: - - - - gapplication launch org.example.fooview ~/foos/*.foo - - - - Invoking an action on an application: - - - - gapplication action org.example.fooview create - - - - Invoking an action on an application, with an action: - - - - gapplication action org.example.fooview show-item '"item_id_828739"' - - - - - - From the <varname>Exec</varname> lines of a <filename class='extension'>.desktop</filename> file - - - - The commandline interface of gapplication was designed so that it could be used - directly from the Exec line of a .desktop - file. - - - - You might want to do this to allow for backwards compatibility with implementations of the specification - that do not understand how to do D-Bus activation, without having to install a separate utility program. - - - - Consider the following example: - - - - [Desktop Entry] - Version=1.1 - Type=Application - Name=Foo Viewer - DBusActivatable=true - MimeType=image/x-foo; - Exec=gapplication launch org.example.fooview %F - Actions=gallery;create; - - [Desktop Action gallery] - Name=Browse Gallery - Exec=gapplication action org.example.fooview gallery - - [Desktop Action create] - Name=Create a new Foo! - Exec=gapplication action org.example.fooview create - - - - - From a script - - - If installing an application that supports D-Bus activation you may still want to put a file in - /usr/bin so that your program can be started from a terminal. - - - - It is possible for this file to be a shell script. The script can handle arguments such as --help and - --version directly. It can also parse other command line arguments and convert them to uses of - gapplication to activate the application, open files, or invoke actions. - - - - Here is a simplified example, as may be installed in /usr/bin/fooview: - - - - #!/bin/sh - - case "$1" in - --help) - echo "see 'man fooview' for more information" - ;; - - --version) - echo "fooview 1.2" - ;; - - --gallery) - gapplication action org.example.fooview gallery - ;; - - --create) - gapplication action org.example.fooview create - ;; - - -*) - echo "unrecognised commandline argument" - exit 1 - ;; - - *) - gapplication launch org.example.fooview "$@" - ;; - esac - - - - - - See also - - Desktop Entry Specification, - - gdbus - 1 - , - - xdg-open - 1 - , - - desktop-file-validate - 1 - - - - - diff --git a/docs/reference/gio/gdbus-codegen.rst b/docs/reference/gio/gdbus-codegen.rst new file mode 100644 index 0000000..2f97365 --- /dev/null +++ b/docs/reference/gio/gdbus-codegen.rst @@ -0,0 +1,821 @@ +.. _gdbus-codegen(1): +.. meta:: + :copyright: Copyright 2011, 2013, 2016 Red Hat, Inc. + :copyright: Copyright 2013, 2022 Emmanuele Bassi + :copyright: Copyright 2017 Patrick Griffis + :copyright: Copyright 2018 Iñigo Martínez + :copyright: Copyright 2018, 2019 Endless Mobile, Inc. + :copyright: Copyright 2020 Endless OS Foundation, LLC + :copyright: Copyright 2020 Chun-wei Fan + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2011, 2013, 2016 Red Hat, Inc. + SPDX-FileCopyrightText: 2013, 2022 Emmanuele Bassi + SPDX-FileCopyrightText: 2017 Patrick Griffis + SPDX-FileCopyrightText: 2018 Iñigo Martínez + SPDX-FileCopyrightText: 2018, 2019 Endless Mobile, Inc. + SPDX-FileCopyrightText: 2020 Endless OS Foundation, LLC + SPDX-FileCopyrightText: 2020 Chun-wei Fan + SPDX-License-Identifier: LGPL-2.1-or-later + +============= +gdbus-codegen +============= + +-------------------------------------- +D-Bus code and documentation generator +-------------------------------------- + +SYNOPSIS +-------- + +| **gdbus-codegen** +| [--help] +| [--interface-prefix *org.project.Prefix*] +| [--header | --body | --interface-info-header | --interface-info-body | --generate-c-code *OUTFILES*] +| [--c-namespace *YourProject*] +| [--c-generate-object-manager] +| [--c-generate-autocleanup none|objects|all] +| [--output-directory *OUTDIR* | --output *OUTFILE*] +| [--generate-docbook *OUTFILES*] +| [--generate-rst *OUTFILES*] +| [--pragma-once] +| [--xml-files *FILE*] +| [--symbol-decorator *DECORATOR* [--symbol-decorator-header *HEADER*] [--symbol-decorator-define *DEFINE*]] +| [--annotate *ELEMENT* *KEY* *VALUE*]… +| [--glib-min-required *VERSION*] +| [--glib-max-allowed *VERSION*] +| *FILE*… + +DESCRIPTION +----------- + +``gdbus-codegen`` is used to generate code and/or documentation for one or more +D-Bus interfaces. + +``gdbus-codegen`` reads +`D-Bus Introspection XML `_ +from files passed as additional arguments on the command line and generates +output files. It currently supports generating C source code (via ``--body``) or +header (via ``--header``) and DocBook XML (via ``--generate-docbook``). +Alternatively, more restricted C source code and headers can be generated, which +just contain the interface information (as ``GDBusInterfaceInfo`` structures) +using ``--interface-info-body`` and ``--interface-info-header``. + +GENERATING C CODE +----------------- + +When generating C code, a ``GInterface`` derived type is generated for each +D-Bus interface. Additionally, for every generated type, ``FooBar``, two +concrete instantiatable types, ``FooBarProxy`` and ``FooBarSkeleton``, +implementing said interface are also generated. The former is derived from +``GDBusProxy`` and intended for use on the client side while the latter is +derived from the ``GDBusInterfaceSkeleton`` type making it easy to export on a +``GDBusConnection`` either directly or via a ``GDBusObjectManagerServer`` +instance. + +For C code generation either ``--body`` that generates source code, ``--header`` +that generates headers, ``--interface-info-body`` that generates interface +information source code, or ``--interface-info-header`` that generates interface +information headers, can be used. These options must be used along with +``--output``, which is used to specify the file to output to. + +Both files can be generated at the same time by using ``--generate-c-code``, but +this option is deprecated. In this case ``--output`` cannot be used due to the +generation of multiple files. Instead pass ``--output-directory`` to specify the +directory to put the output files in. By default the current directory will be +used. + +The name of each generated C type is derived from the D-Bus interface name +stripped with the prefix given with ``--interface-prefix`` and with the dots +removed and initial characters capitalized. For example, for the D-Bus +interface ``com.acme.Coyote`` the name used is ``ComAcmeCoyote``. For the D-Bus +interface ``org.project.Bar.Frobnicator`` with ``--interface-prefix`` set to +``org.project.``, the name used is ``BarFrobnicator``. + +For methods, signals and properties, if not specified, the name defaults to the +name of the method, signal or property. + +Two forms of the name are used — the CamelCase form and the lower-case form. The +CamelCase form is used for the ``GType`` and struct name, while lower-case form +is used in function names. The lower-case form is calculated by converting from +CamelCase to lower-case and inserting underscores at word boundaries (using +certain heuristics). + +If the value given by the ``org.gtk.GDBus.C.Name`` annotation or the +``--c-namespace`` option contains an underscore (sometimes called *Ugly_Case*), +then the camel-case name is derived by removing all underscores, and the +lower-case name is derived by lower-casing the string. This is useful in some +situations where abbreviations are used. For example, if the annotation is used +on the interface ``net.MyCorp.MyApp.iSCSITarget`` with the value +``iSCSI_Target`` the CamelCase form is ``iSCSITarget`` while the lower-case form +is ``iscsi_target``. If the annotation is used on the method ``EjectTheiPod`` +with the value ``Eject_The_iPod``, the lower-case form is ``eject_the_ipod``. + +GENERATING DOCBOOK DOCUMENTATION +-------------------------------- + +Each generated DocBook XML file (see the ``--generate-docbook`` option for +details) is a ``RefEntry`` article describing the D-Bus interface. (See the +`DocBook documentation `_.) + +GENERATING RESTRUCTUREDTEXT DOCUMENTATION +----------------------------------------- + +Each generated reStructuredText file (see the ``--generate-rst`` option for +details) is a plain text +`reStructuredText `_ document +describing the D-Bus interface. + +OPTIONS +------- + +The following options are supported: + +``-h``, ``--help`` + + Show help and exit. + +``--xml-files`` *FILE* + + This option is deprecated; use positional arguments instead. The D-Bus + introspection XML file. + +``--interface-prefix`` *org.project.Prefix.* + + A prefix to strip from all D-Bus interface names when + calculating the type name for the C binding and the DocBook ``sortas`` + `attribute `_. + +``--generate-docbook`` *OUTFILES* + + Generate DocBook Documentation for each D-Bus interface and put it in + ``OUTFILES-NAME.xml`` where ``NAME`` is a placeholder for the interface + name, e.g. ``net.Corp.FooBar`` and so on. + + Pass ``--output-directory`` to specify the directory to put the output files + in. By default the current directory will be used. + +``--generate-rst`` *OUTFILES* + + Generate reStructuredText Documentation for each D-Bus interface and put it in + ``OUTFILES-NAME.rst`` where ``NAME`` is a placeholder for the interface + name, e.g. ``net.Corp.FooBar`` and so on. + + Pass ``--output-directory`` to specify the directory to put the output files + in. By default the current directory will be used. + +``--generate-c-code`` *OUTFILES* + + Generate C code for all D-Bus interfaces and put it in ``OUTFILES.c`` and + ``OUTFILES.h`` including any sub-directories. If you want the files to be + output in a different location use ``--output-directory`` as ``OUTFILES.h`` + including sub-directories will be referenced from ``OUTFILES.c``. + + The full paths would then be + ``$(OUTDIR)/$(dirname $OUTFILES)/$(basename $OUTFILES).{c,h}``. + +``--c-namespace`` *YourProject* + + The namespace to use for generated C code. This is expected to be in + `CamelCase `_ or *Ugly_Case* (see + above). + +``--pragma-once`` + + If this option is passed, the + `#pragma once `_ preprocessor + directive is used instead of include guards. + +``--c-generate-object-manager`` + + If this option is passed, suitable ``GDBusObject``, ``GDBusObjectProxy``, + ``GDBusObjectSkeleton`` and ``GDBusObjectManagerClient`` subclasses are + generated. + +``--c-generate-autocleanup`` none|objects|all + + This option influences what types autocleanup functions are + generated for. ``none`` means to not generate any autocleanup functions. + ``objects`` means to generate them for object types, and ``all`` means to + generate them for object types and interfaces. The default is ``objects`` + due to a corner case in backwards compatibility with a few projects, + but you should likely switch your project to use ``all``. + This option was added in GLib 2.50. + +``--output-directory`` *OUTDIR* + + Directory to output generated source to. Equivalent to changing directory + before generation. + + This option cannot be used with ``--body``, ``--header``, + ``--interface-info-body`` or ``--interface-info-header``; and ``--output`` + must be used. + +``--header`` + + If this option is passed, it will generate the header code and write it to the + disk by using the path and file name provided by ``--output``. + + Using ``--generate-c-code``, ``--generate-docbook`` or ``--output-directory`` + are not allowed to be used along with ``--header`` and ``--body`` options, + because these options are used to generate only one file. + +``--body`` + + If this option is passed, it will generate the source code and write it to the + disk by using the path and file name provided by ``--output``. + + Using ``--generate-c-code``, ``--generate-docbook`` or ``--output-directory`` + are not allowed to be used along with ``--header`` and ``--body`` options, + because these options are used to generate only one file. + +``--interface-info-header`` + + If this option is passed, it will generate the header code for the + ``GDBusInterfaceInfo`` structures only and will write it to the disk by using + the path and file name provided by ``--output``. + + Using ``--generate-c-code``, ``--generate-docbook`` or ``--output-directory`` + are not allowed to be used along with the ``--interface-info-header`` and + ``--interface-info-body`` options, because these options are used to generate + only one file. + +``--interface-info-body`` + + If this option is passed, it will generate the source code for the + ``GDBusInterfaceInfo`` structures only and will write it to the disk by using + the path and file name provided by ``--output``. + + Using ``--generate-c-code``, ``--generate-docbook`` or ``--output-directory`` + are not allowed to be used along with the ``--interface-info-header`` and + ``--interface-info-body`` options, because these options are used to generate + only one file. + +``--symbol-decorator`` *DECORATOR* + + If a ``DECORATOR`` is passed in with this option, all the generated function + prototypes in the generated header will be marked with ``DECORATOR``. This can + be used, for instance, to export symbols from code generated with + ``gdbus-codegen``. + + This option was added in GLib 2.66. + +``--symbol-decorator-header`` *HEADER* + + If a ``HEADER`` is passed in with this option, the generated header will put a + ``#include HEADER`` before the rest of the items, except for the inclusion + guards or ``#pragma once`` (if ``--pragma-once`` is used). This is used if + using another header file is needed for the decorator passed in via + ``--symbol-decorator`` to be defined. + + This option was added in GLib 2.66. + + This option can only be used if ``--symbol-decorator`` is used. + +``--symbol-decorator-define`` *DEFINE* + + If a ``DEFINE`` is passed in with this option, the generated source will add a + ``#define DEFINE`` before the rest of the items. This is used if a particular + macro is needed to ensure the decorator passed in via ``--symbol-decorator`` + uses the correct definition when the generated source is being compiled. + + This option was added in GLib 2.66. + + This option can only be used if ``--symbol-decorator`` is used. + +``--output`` *OUTFILE* + + The full path where the header (``--header``, ``--interface-info-header``) or + the source code (``--body``, ``--interface-info-body``) will be written, using + the path and filename provided by ``--output``. The full path could be + something like ``$($OUTFILE).{c,h}``. + + Using ``--generate-c-code``, ``--generate-docbook`` or ``--output-directory`` + is not allowed along with ``--output``, because the latter is used to generate + only one file. + + Since GLib 2.80, if *OUTFILE* is the literal string ``-``, the header + or source code will be written to standard output. + + For ``--body`` and ``--interface-info-body``, the generated code will not + automatically ``#include`` a corresponding header file when writing to + standard output, because there is no obvious name for that header file. + This might make it necessary to use ``cc -include foo.h``, or generate a + filename like ``foo-impl.h`` and ``#include`` it into a wrapper ``.c`` file. + + For ``--header`` and ``--interface-info-header``, there is no obvious + name for a traditional multiple-inclusion guard when writing to standard + output, so using the ``--pragma-once`` option is recommended. + + In the rare situation that the intended output filename starts with ``-``, + it should be prefixed with ``./``. + +``--annotate`` *ELEMENT* *KEY* *VALUE* + + Used to inject D-Bus annotations into the given XML files. It can be used with + interfaces, methods, signals, properties and arguments in the following way:: + + gdbus-codegen --c-namespace MyApp \ + --generate-c-code myapp-generated \ + --annotate "org.project.InterfaceName" \ + org.gtk.GDBus.C.Name MyFrobnicator \ + --annotate "org.project.InterfaceName:Property" \ + bar bat \ + --annotate "org.project.InterfaceName.Method()" \ + org.freedesktop.DBus.Deprecated true \ + --annotate "org.project.InterfaceName.Method()[arg_name]" \ + snake hiss \ + --annotate "org.project.InterfaceName::Signal" \ + cat meow \ + --annotate "org.project.InterfaceName::Signal[arg_name]" \ + dog wuff \ + myapp-dbus-interfaces.xml + + Any UTF-8 string can be used for *KEY* and *VALUE*. + +``--glib-min-required`` *VERSION* + + Specifies the minimum version of GLib which the code generated by + ``gdbus-codegen`` can depend on. This may be used to make + backwards-incompatible changes in the output or behaviour of ``gdbus-codegen`` + in future, which users may opt in to by increasing the value they pass for + ``--glib-min-required``. If this option is not passed, the output from + ``gdbus-codegen`` is guaranteed to be compatible with all versions of GLib + from 2.30 upwards, as that is when ``gdbus-codegen`` was first released. + + Note that some version parameters introduce incompatible changes: all callers + of the generated code might need to be updated, and if the generated code is + part of a library’s API or ABI, then increasing the version parameter can + result in an API or ABI break. + + The version number must be of the form ``MAJOR.MINOR.MICRO``, where all parts + are integers. ``MINOR`` and ``MICRO`` are optional. The version number may not + be smaller than ``2.30``. + + If the version number is ``2.64`` or greater, the generated code will + have the following features: + + 1. If a method has ``h`` (file descriptor) parameter(s), a ``GUnixFDList`` + parameter will exist in the generated code for it (whereas previously the + annotation ``org.gtk.GDBus.C.UnixFD`` was required), and + 2. Method call functions will have two additional arguments to allow the user + to specify ``GDBusCallFlags`` and a timeout value, as is possible when + using ``g_dbus_proxy_call()``. + +``--glib-max-allowed`` *VERSION* + + Specifies the maximum version of GLib which the code generated by + ``gdbus-codegen`` can depend on. This may be used to ensure that code + generated by ``gdbus-codegen`` is compilable with specific older versions of + GLib that your software has to support. + + The version number must be of the form ``MAJOR.MINOR.MICRO``, where all parts + are integers. ``MINOR`` and ``MICRO`` are optional. The version number must be + greater than or equal to that passed to ``--glib-min-required``. + It defaults to the version of GLib which provides this ``gdbus-codegen``. + +SUPPORTED D-BUS ANNOTATIONS +--------------------------- + +The following D-Bus annotations are supported by ``gdbus-codegen``: + +``org.freedesktop.DBus.Deprecated`` + + Can be used on any ````, ````, ```` and + ```` element to specify that the element is deprecated if its value + is ``true``. Note that this annotation is defined in the + `D-Bus specification `_ + and can only assume the values ``true`` and ``false``. In particular, you + cannot specify the version that the element was deprecated in nor any helpful + deprecation message. Such information should be added to the element + documentation instead. + + When generating C code, this annotation is used to add ``G_GNUC_DEPRECATED`` + to generated functions for the element. + + When generating DocBook XML, a deprecation warning will appear along the + documentation for the element. + +``org.gtk.GDBus.Since`` + + Can be used on any ````, ````, ```` and + ```` element to specify the version (any free-form string but + compared using a version-aware sort function) the element appeared in. + + When generating C code, this field is used to ensure + function pointer order for preserving ABI/API, see ‘STABILITY GUARANTEES’. + + When generating DocBook XML, the value of this tag appears in the + documentation. + +``org.gtk.GDBus.DocString`` + + A string with DocBook content for documentation. This annotation can + be used on ````, ````, ````, ```` and + ```` elements. + +``org.gtk.GDBus.DocString.Short`` + + A string with DocBook content for short/brief documentation. This annotation + can only be used on ```` elements. + +``org.gtk.GDBus.C.Name`` + + Can be used on any ````, ````, ```` and + ```` element to specify the name to use when generating C code. The + value is expected to be in + `CamelCase `_ or *Ugly_Case* (see + above). + +``org.gtk.GDBus.C.ForceGVariant`` + + If set to a non-empty string, a ``GVariant`` instance will be used instead of + the natural C type. This annotation can be used on any ```` and + ```` element. + +``org.gtk.GDBus.C.UnixFD`` + + If set to a non-empty string, the generated code will include parameters to + exchange file descriptors using the ``GUnixFDList`` type. This annotation can + be used on ```` elements. + +As an easier alternative to using the ``org.gtk.GDBus.DocString`` annotation, +note that parser used by ``gdbus-codegen`` parses XML comments in a way similar +to `gtk-doc `_:: + + + + + + + + + + + + + + + + + + + +Note that ``@since`` can be used in any inline documentation bit (e.g. for +interfaces, methods, signals and properties) to set the ``org.gtk.GDBus.Since`` +annotation. For the ``org.gtk.GDBus.DocString`` annotation (and inline +comments), note that substrings of the form ``#net.Corp.Bar``, +``net.Corp.Bar.FooMethod()``, ``#net.Corp.Bar::BarSignal`` and +``#net.Corp.InlineDocs:BazProperty`` are all expanded to links to the respective +interface, method, signal and property. Additionally, substrings starting with +``@`` and ``%`` characters are rendered as +`parameter `_ and +`constant `_ respectively. + +If both XML comments and ``org.gtk.GDBus.DocString`` or +``org.gtk.GDBus.DocString.Short`` annotations are present, the latter wins. + +EXAMPLE +------- + +Consider the following D-Bus Introspection XML:: + + + + + + + + + + + + + + + + + + +If ``gdbus-codegen`` is used on this file like this:: + + gdbus-codegen --generate-c-code myapp-generated \ + --c-namespace MyApp \ + --interface-prefix net.corp.MyApp. \ + net.Corp.MyApp.Frobber.xml + +two files called ``myapp-generated.[ch]`` are generated. The files provide an +abstract ``GTypeInterface`` derived type called ``MyAppFrobber`` as well as two +instantiatable types with the same name but suffixed with ``Proxy`` and +``Skeleton``. The generated file, roughly, contains the following facilities:: + + /* GType macros for the three generated types */ + #define MY_APP_TYPE_FROBBER (my_app_frobber_get_type ()) + #define MY_APP_TYPE_FROBBER_SKELETON (my_app_frobber_skeleton_get_type ()) + #define MY_APP_TYPE_FROBBER_PROXY (my_app_frobber_proxy_get_type ()) + + typedef struct _MyAppFrobber MyAppFrobber; /* Dummy typedef */ + + typedef struct + { + GTypeInterface parent_iface; + + /* Signal handler for the ::notification signal */ + void (*notification) (MyAppFrobber *proxy, + GVariant *icon_blob, + gint height, + const gchar* const *messages); + + /* Signal handler for the ::handle-hello-world signal */ + gboolean (*handle_hello_world) (MyAppFrobber *proxy, + GDBusMethodInvocation *invocation, + const gchar *greeting); + } MyAppFrobberIface; + + /* Asynchronously calls HelloWorld() */ + void + my_app_frobber_call_hello_world (MyAppFrobber *proxy, + const gchar *greeting, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gp ointer user_data); + gboolean + my_app_frobber_call_hello_world_finish (MyAppFrobber *proxy, + gchar **out_response, + GAsyncResult *res, + GError **error); + + /* Synchronously calls HelloWorld(). Blocks calling thread. */ + gboolean + my_app_frobber_call_hello_world_sync (MyAppFrobber *proxy, + const gchar *greeting, + gchar **out_response, + GCancellable *cancellable, + GError **error); + + /* Completes handling the HelloWorld() method call */ + void + my_app_frobber_complete_hello_world (MyAppFrobber *object, + GDBusMethodInvocation *invocation, + const gchar *response); + + /* Emits the ::notification signal / Notification() D-Bus signal */ + void + my_app_frobber_emit_notification (MyAppFrobber *object, + GVariant *icon_blob, + gint height, + const gchar* const *messages); + + /* Gets the :verbose GObject property / Verbose D-Bus property. + * Does no blocking I/O. + */ + gboolean my_app_frobber_get_verbose (MyAppFrobber *object); + + /* Sets the :verbose GObject property / Verbose D-Bus property. + * Does no blocking I/O. + */ + void my_app_frobber_set_verbose (MyAppFrobber *object, + gboolean value); + + /* Gets the interface info */ + GDBusInterfaceInfo *my_app_frobber_interface_info (void); + + /* Creates a new skeleton object, ready to be exported */ + MyAppFrobber *my_app_frobber_skeleton_new (void); + + /* Client-side proxy constructors. + * + * Additionally, _new_for_bus(), _new_for_bus_finish() and + * _new_for_bus_sync() proxy constructors are also generated. + */ + void + my_app_frobber_proxy_new (GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + MyAppFrobber * + my_app_frobber_proxy_new_finish (GAsyncResult *res, + GError **error); + MyAppFrobber * + my_app_frobber_proxy_new_sync (GDBusConnection *connection, + GDBusProxyFlags flags, + const gchar *name, + const gchar *object_path, + GCancellable *cancellable, + GError **error); + +Thus, for every D-Bus method, there will be three C functions for calling the +method, one ``GObject`` signal for handling an incoming call and one C function +for completing an incoming call. For every D-Bus signal, there’s one ``GObject`` +signal and one C function for emitting it. For every D-Bus property, two C +functions are generated (one setter, one getter) and one ``GObject`` property. +The following table summarizes the generated facilities and where they are +applicable: + +.. table:: + :widths: auto + + ==================== ========================================================= ================================================================================================================= + Symbol type Client Server + ==================== ========================================================= ================================================================================================================= + Types Use ``MyAppFrobberProxy``. Any type implementing the ``MyAppFrobber`` interface. + Methods Use ``m_a_f_hello_world()`` to call. Receive via the ``handle_hello_world()`` signal handler. Complete the call with ``m_a_f_complete_hello_world()``. + Signals Connect to the ``::notification`` signal. Use ``m_a_f_emit_notification()`` to emit signal. + Properties (Reading) Use ``m_a_f_get_verbose()`` or the ``:verbose`` property. Implement the ``get_property()`` vfunc of ``GObject``. + Properties (writing) Use ``m_a_f_set_verbose()`` or the ``:verbose`` property. Implement the ``set_property()`` vfunc of ``GObject``. + ==================== ========================================================= ================================================================================================================= + +Client-side usage +^^^^^^^^^^^^^^^^^ + +You can use the generated proxy type with the generated constructors:: + + MyAppFrobber *proxy; + GError *error; + + error = NULL; + proxy = my_app_frobber_proxy_new_for_bus_sync ( + G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + "net.Corp.MyApp", /* bus name */ + "/net/Corp/MyApp/SomeFrobber", /* object */ + NULL, /* GCancellable* */ + &error); + /* do stuff with proxy */ + g_object_unref (proxy); + +Instead of using the generic ``GDBusProxy`` facilities, one can use the +generated methods such as ``my_app_frobber_call_hello_world()`` to invoke +the ``net.Corp.MyApp.Frobber.HelloWorld()`` D-Bus method, connect to the +``::notification`` ``GObject`` signal to receive the +``net.Corp.MyApp.Frobber::Notification`` D-Bus signal and get/set the +``net.Corp.MyApp.Frobber:Verbose`` D-Bus Property using either the ``GObject`` +property ``:verbose`` or the ``my_app_get_verbose()`` and +``my_app_set_verbose()`` methods. Use the standard ``GObject::notify`` signal to +listen to property changes. + +Note that all property access is via the ``GDBusProxy`` property cache so no I/O +is ever done when reading properties. Also note that setting a property will +cause the ``org.freedesktop.DBus.Properties.Set`` method +(`documentation `_) +to be called on the remote object. This call, however, is asynchronous so +setting a property won’t block. Further, the change is delayed and no error +checking is possible. + +Server-side usage +^^^^^^^^^^^^^^^^^ + +The generated ``MyAppFrobber`` interface is designed so it is easy to implement +it in a ``GObject`` subclass. For example, to handle ``HelloWorld()`` method +invocations, set the vfunc for ``handle_hello_hello_world()`` in the +``MyAppFrobberIface`` structure. Similarly, to handle the +``net.Corp.MyApp.Frobber:Verbose`` property override the ``:verbose`` +``GObject`` property from the subclass. To emit a signal, use e.g. +``my_app_emit_signal()`` or ``g_signal_emit_by_name()``. + +Instead of subclassing, it is often easier to use the generated +``MyAppFrobberSkeleton`` subclass. To handle incoming method calls, use +``g_signal_connect()`` with the ``::handle-*`` signals and instead of +overriding the ``get_property()`` and ``set_property()`` vfuncs from +``GObject``, use ``g_object_get()`` and ``g_object_set()`` or the generated +property getters and setters (the generated class has an internal property bag +implementation). + +For example:: + + static gboolean + on_handle_hello_world (MyAppFrobber *interface, + GDBusMethodInvocation *invocation, + const gchar *greeting, + gpointer user_data) + { + if (g_strcmp0 (greeting, "Boo") != 0) + { + gchar *response; + response = g_strdup_printf ("Word! You said ‘%s’.", greeting); + my_app_complete_hello_world (interface, invocation, response); + g_free (response); + } + else + { + g_dbus_method_invocation_return_error (invocation, + MY_APP_ERROR, + MY_APP_ERROR_NO_WHINING, + "Hey, %s, there will be no whining!", + g_dbus_method_invocation_get_sender (invocation)); + } + return TRUE; + } + + […] + + interface = my_app_frobber_skeleton_new (); + my_app_frobber_set_verbose (interface, TRUE); + + g_signal_connect (interface, + "handle-hello-world", + G_CALLBACK (on_handle_hello_world), + some_user_data); + + […] + + error = NULL; + if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (interface), + connection, + "/path/of/dbus_object", + &error)) + { + /* handle error */ + } + +To facilitate atomic changesets (multiple properties changing at the same time), +``GObject::notify`` signals are queued up when received. The queue is drained in +an idle handler (which is called from the thread-default main loop of the thread +where the skeleton object was constructed) and will cause emissions of the +``org.freedesktop.DBus.Properties::PropertiesChanged`` +(`documentation `_) +signal with all the properties that have changed. Use +``g_dbus_interface_skeleton_flush()`` or ``g_dbus_object_skeleton_flush()`` to +empty the queue immediately. Use ``g_object_freeze_notify()`` and +``g_object_thaw_notify()`` for atomic changesets if on a different thread. + +C TYPE MAPPING +-------------- + +Scalar types (type strings ``b``, ``y``, ``n``, ``q``, ``i``, ``u``, ``x``, +``t`` and ``d``), strings (type strings ``s``, ``ay``, ``o`` and ``g``) and +arrays of strings (type strings ``as``, ``ao`` and ``aay``) are mapped to the +natural types, e.g. ``gboolean``, ``gdouble``, ``gint``, ``gchar*``, ``gchar**`` +and so on. Everything else is mapped to the ``GVariant`` type. + +This automatic mapping can be turned off by using the annotation +``org.gtk.GDBus.C.ForceGVariant`` — if used then a ``GVariant`` is always +exchanged instead of the corresponding native C type. This annotation may be +convenient to use when using bytestrings (type string ``ay``) for data that +could have embedded nul bytes. + +STABILITY GUARANTEES +-------------------- + +The generated C functions are guaranteed to not change their ABI. That is, if a +method, signal or property does not change its signature in the introspection +XML, the generated C functions will not change their C ABI either. The ABI of +the generated instance and class structures will be preserved as well. + +The ABI of the generated ``GType`` instances will be preserved only if the +``org.gtk.GDBus.Since`` annotation is used judiciously — this is because the +VTable for the ``GInterface`` relies on function pointers for signal handlers. +Specifically, if a D-Bus method, property or signal or is added to a D-Bus +interface, then ABI of the generated ``GInterface`` type is preserved if, and +only if, each added method, property signal is annotated with the +``org.gtk.GDBus.Since`` annotation using a greater version number than previous +versions. + +The generated C code currently happens to be annotated with +`gtk-doc `_ and +`GObject Introspection `_ comments and +annotations. The layout and contents might change in the future so no guarantees +about e.g. ``SECTION`` usage etc. are given. + +While the generated DocBook for D-Bus interfaces isn’t expected to change, no +guarantees are given at this point. + +It is important to note that the generated code should not be checked into +version control systems, nor it should be included in distributed source +archives. + +BUGS +---- + +Please send bug reports to either the distribution bug tracker or the +`upstream bug tracker `_. + +SEE ALSO +-------- + +`gdbus(1) `_ diff --git a/docs/reference/gio/gdbus-codegen.xml b/docs/reference/gio/gdbus-codegen.xml deleted file mode 100644 index 91d1f07..0000000 --- a/docs/reference/gio/gdbus-codegen.xml +++ /dev/null @@ -1,1193 +0,0 @@ - - - - gdbus - GIO - - - Developer - David - Zeuthen - zeuthen@gmail.com - - - - - - gdbus-codegen - 1 - User Commands - - - - gdbus-codegen - D-Bus code and documentation generator - - - - - gdbus-codegen - , - org.project.Prefix - OUTFILES - YourProject - - none|objects|all - OUTDIR - OUTFILES - OUTFILES - - FILE - - - - - DECORATOR - HEADER - DEFINE - OUTFILE - - - - ELEMENT - KEY - VALUE - - - VERSION - VERSION - FILE - - FILE - - - - - - Description - - gdbus-codegen is used to generate code and/or - documentation for one or more D-Bus interfaces. - - - gdbus-codegen reads - D-Bus - Introspection XML from files passed as additional - arguments on the command line and generates output files. - It currently supports generating C source code (via - ) or header (via ) - and Docbook XML (via ). Alternatively, - more restricted C source code and headers can be generated, which just - contain the interface information (as GDBusInterfaceInfo - structures) using and - . - - - - - Generating C code - - When generating C code, a - #GInterface-derived type is generated for each D-Bus - interface. Additionally, for every generated type, - FooBar, two concrete instantiatable types, - FooBarProxy and FooBarSkeleton, implementing - said interface are also generated. The former is derived from - #GDBusProxy and intended for use on the client side - while the latter is derived from the - #GDBusInterfaceSkeleton type making it easy to export on a - #GDBusConnection either directly or via a - #GDBusObjectManagerServer instance. - - - For C code generation either that - generates source code, that - generates headers, that generates - interface information source code, or - that generates interface information - headers, can be used. These options must be used along with - , which is used to specify the file to output to. - - - Both files can be generated at the same time by using - , but this option is deprecated. - In this case cannot be used due to the - generation of multiple files. Instead pass - to specify the directory to put - the output files in. By default the current directory will be used. - - - The name of each generated C type is derived from the D-Bus - interface name stripped with the prefix given with - and with the dots removed and - initial characters capitalized. For example, for the D-Bus - interface com.acme.Coyote the name used is - ComAcmeCoyote. For the D-Bus interface - org.project.Bar.Frobnicator with - - org.project., the name used is - BarFrobnicator. - - - For methods, signals and properties, if not specified, the name - defaults to the name of the method, signal or property. - - - Two forms of the name are used - the CamelCase form and the - lower-case form. The CamelCase form is used for the #GType and - struct name, while lower-case form is used in function names. The - lower-case form is calculated by converting from CamelCase to - lower-case and inserting underscores at word boundaries (using - certain heuristics). - - - If the value given by the org.gtk.GDBus.C.Name - annotation or the option contains - an underscore (sometimes called Ugly_Case), - then the camel-case name is derived by removing all underscores, - and the lower-case name is derived by lower-casing the - string. This is useful in some situations where abbreviations are - used. For example, if the annotation is used on the interface - net.MyCorp.MyApp.iSCSITarget with the value - iSCSI_Target the CamelCase form is - iSCSITarget while the lower-case form is - iscsi_target. If the annotation is used on the - method EjectTheiPod with the value - Eject_The_iPod, the lower-case form is - eject_the_ipod. - - - - - Generating Docbook documentation - - Each generated Docbook XML file (see the - option for details) is a RefEntry - article describing the D-Bus interface. - - - - - Generating reStructuredText documentation - - Each generated reStructuredText file (see the - option for details) is a plain text - reStructuredText - document describing the D-Bus interface. - - - - - Options - - The following options are supported: - - - - - , - - - Show help and exit. - - - - - - FILE - - - This option is deprecated; use positional arguments instead. - The D-Bus introspection XML file. - - - - - - org.project.Prefix. - - - A prefix to strip from all D-Bus interface names when - calculating the typename for the C binding and the Docbook - sortas - attribute. - - - - - - OUTFILES - - - Generate Docbook Documentation for each D-Bus interface and - put it in OUTFILES-NAME.xml - where NAME is a place-holder for the interface - name, e.g. net.Corp.FooBar and so on. - - - Pass to specify the directory - to put the output files in. By default the current directory - will be used. - - - - - - OUTFILES - - - Generate reStructuredText Documentation for each D-Bus interface and - put it in OUTFILES-NAME.rst - where NAME is a place-holder for the interface - name, e.g. net.Corp.FooBar and so on. - - - Pass to specify the directory - to put the output files in. By default the current directory - will be used. - - - - - - OUTFILES - - - Generate C code for all D-Bus interfaces and put it in - OUTFILES.c and - OUTFILES.h including any sub-directories. If you want the files to - be output in a different location use as OUTFILES.h - including sub-directories will be referenced from OUTFILES.c. - - - The full paths would then be $(OUTDIR)/$(dirname $OUTFILES)/$(basename $OUTFILES).{c,h}. - - - - - - YourProject - - - The namespace to use for generated C code. This is expected - to be in CamelCase - or Ugly_Case (see above). - - - - - - - - - If this option is passed, the - #pragma once - preprocessor directive is used instead of include guards. - - - - - - - - - If this option is passed, suitable #GDBusObject, - #GDBusObjectProxy, #GDBusObjectSkeleton and - #GDBusObjectManagerClient subclasses are generated. - - - - - - none|objects|all - - - This option influences what types autocleanup functions are - generated for. 'none' means to not generate any autocleanup functions. - 'objects' means to generate them for object types, and 'all' means to - generate them for object types and interfaces. The default is 'objects' - due to a corner case in backwards compatibility with a few projects, - but you should likely switch your project to use 'all'. - This option was added in GLib 2.50. - - - - - - OUTDIR - - - Directory to output generated source to. Equivalent to changing directory before generation. - - - This option cannot be used with , - , or - ; and - must be used. - - - - - - - - - - If this option is passed, it will generate the header code and write it to the disk by - using the path and file name provided by . - - - Using , or - are not allowed to be used along with - and options, because these options - are used to generate only one file. - - - - - - - - - If this option is passed, it will generate the source code and write it to the disk by - using the path and file name provided by . - - - Using , or - are not allowed to be used along with - and options, because these options - are used to generate only one file. - - - - - - - - - If this option is passed, it will generate the header code for the - GDBusInterfaceInfo structures only and will write it to - the disk by using the path and file name provided by - . - - - Using , or - are not allowed to be used along with - the and - options, because these options - are used to generate only one file. - - - - - - - - - If this option is passed, it will generate the source code for the - GDBusInterfaceInfo structures only and will write it to - the disk by using the path and file name provided by - . - - - Using , or - are not allowed to be used along with - the and - options, because these options - are used to generate only one file. - - - - - - DECORATOR - - - If a DECORATOR is passed in with this option, all the - generated function prototypes in the generated header will be marked with - DECORATOR. This can be used, for instance, to export - symbols from code generated with gdbus-codegen. - This option is added in GLib-2.66 - - - - - - HEADER - - - If a HEADER is passed in with this option, the - generated header will put a #include HEADER before the rest of the - items, except for the inclusion guards or #pragma once - (if is used). This is used if using another header file is - needed for the decorator passed in via to be defined. - This option is added in GLib-2.66. - - - This option can only be used if is used. - - - - - - DEFINE - - - If a DEFINE is passed in with this option, the - generated source will add a #define DEFINE before the rest of the - items. This is used if a particular macro is needed to ensure the decorator - passed in via uses the correct definition when the - generated source is being compiled. This option is added in GLib-2.66. - - - This option can only be used if is used. - - - - - - OUTFILE - - - The full path where the header (, - ) or the source code - (, ) will - be written, using the path and filename provided by - . The full path could be something like - $($OUTFILE).{c,h}. - - - Using , or - is not allowed along with - , because the latter is used to generate only one file. - - - - - - ELEMENT KEY VALUE - - - Used to inject D-Bus annotations into the given XML - files. It can be used with interfaces, methods, signals, - properties and arguments in the following way: - - - - Any UTF-8 string can be used for KEY and VALUE. - - - - - - VERSION - - - Specifies the minimum version of GLib which the code generated by - gdbus-codegen can depend on. This may be used to - make backwards-incompatible changes in the output or behaviour of - gdbus-codegen in future, which users may opt in to - by increasing the value they pass for . - If this option is not passed, the output from gdbus-codegen - is guaranteed to be compatible with all versions of GLib from 2.30 - upwards, as that is when gdbus-codegen was first - released. - - - Note that some version parameters introduce incompatible changes: all callers - of the generated code might need to be updated, and if the generated code is part of - a library's API or ABI, then increasing the version parameter can result in an API - or ABI break. - - - The version number must be of the form - MAJOR.MINOR.MICRO, - where all parts are integers. MINOR and - MICRO are optional. The version number may not be smaller - than 2.30. - - - If the version number is 2.64 or greater, the generated code will - have the following features: (1) If a method has h (file - descriptor) parameter(s), a GUnixFDList parameter will exist in the - generated code for it (whereas previously the annotation - org.gtk.GDBus.C.UnixFD was required), and (2) Method call functions will - have two additional arguments to allow the user to specify GDBusCallFlags - and a timeout value, as is possible when using g_dbus_proxy_call(). - - - - - - VERSION - - - Specifies the maximum version of GLib which the code generated by - gdbus-codegen can depend on. This may be used to - ensure that code generated by gdbus-codegen is - compilable with specific older versions of GLib that your software has - to support. - - - The version number must be of the form - MAJOR.MINOR.MICRO, - where all parts are integers. MINOR and - MICRO are optional. The version number must - be greater than or equal to that passed to . - It defaults to the version of GLib which provides this gdbus-codegen. - - - - - - - - - Supported D-Bus Annotations - - The following D-Bus annotations are supported by - gdbus-codegen: - - - - - - org.freedesktop.DBus.Deprecated - - - Can be used on any <interface>, - <method>, - <signal> and - <property> element to specify that - the element is deprecated if its value is - true. Note that this annotation is - defined in the D-Bus - specification and can only assume the values - true and false. In - particular, you cannot specify the version that the element - was deprecated in nor any helpful deprecation message. Such - information should be added to the element documentation - instead. - - - When generating C code, this annotation is used to add - #G_GNUC_DEPRECATED to generated functions for the element. - - - When generating Docbook XML, a deprecation warning will - appear along the documentation for the element. - - - - - - org.gtk.GDBus.Since - - - Can be used on any <interface>, - <method>, - <signal> and - <property> element to specify the - version (any free-form string but compared using a - version-aware sort function) the element appeared in. - - - When generating C code, this field is used to ensure - function pointer order for preserving ABI/API, see . - - - When generating Docbook XML, the value of this tag appears - in the documentation. - - - - - - org.gtk.GDBus.DocString - - - A string with Docbook content for documentation. This annotation can - be used on <interface>, - <method>, - <signal>, - <property> and - <arg> elements. - - - - - - org.gtk.GDBus.DocString.Short - - - A string with Docbook content for short/brief - documentation. This annotation can only be used on - <interface> elements. - - - - - - org.gtk.GDBus.C.Name - - - Can be used on any <interface>, - <method>, - <signal> and - <property> element to specify the - name to use when generating C code. The value is expected to - be in CamelCase - or Ugly_Case (see above). - - - - - - org.gtk.GDBus.C.ForceGVariant - - - If set to a non-empty string, a #GVariant instance will - be used instead of the natural C type. This annotation can - be used on any <arg> and - <property> element. - - - - - - org.gtk.GDBus.C.UnixFD - - - If set to a non-empty string, the generated code will - include parameters to exchange file descriptors using the - #GUnixFDList type. This annotation can be used on - <method> elements. - - - - - - - - As an easier alternative to using the - org.gtk.GDBus.DocString annotation, note that - parser used by gdbus-codegen parses XML - comments in a way similar to gtk-doc: -longer description. - - This is a new paragraph. ---> - - - - - - - - - - - - - - - - -]]> - - - Note that can be used in any inline - documentation bit (e.g. for interfaces, methods, signals and - properties) to set the org.gtk.GDBus.Since - annotation. For the org.gtk.GDBus.DocString - annotation (and inline comments), note that substrings of the form - , - , - and - are all - expanded to links to the respective interface, method, signal and - property. - Additionally, substrings starting with @ and % characters are rendered as - parameter and - constant respectively. - - - If both XML comments and - org.gtk.GDBus.DocString or - org.gtk.GDBus.DocString.Short annotations are - present, the latter wins. - - - - - Example - - Consider the following D-Bus Introspection XML. - - - - - - - - - - - - - - - - - -]]> - - - If gdbus-codegen is used on this file like this: - - - - two files called - myapp-generated.[ch] are - generated. The files provide an abstract - #GTypeInterface-derived type called - MyAppFrobber as well as two instantiatable types with - the same name but suffixed with Proxy and - Skeleton. The generated file, roughly, contains the - following facilities: - - - - Thus, for every D-Bus method, there will be three C functions for - calling the method, one #GObject signal for handling an incoming - call and one C function for completing an incoming call. For every - D-Bus signal, there's one #GObject signal and one C function for - emitting it. For every D-Bus property, two C functions are - generated (one setter, one getter) and one #GObject property. The - following table summarizes the generated facilities and where they - are applicable: - - - - - - - Client - Server - - - - - Types - Use MyAppFrobberProxy - Any type implementing the MyAppFrobber interface - - - Methods - Use m_a_f_hello_world() to call. - Receive via the handle_hello_world() signal handler. Complete the call with m_a_f_complete_hello_world() - - - Signals - Connect to the ::notification GObject signal. - Use m_a_f_emit_notification() to emit signal. - - - Properties (Reading) - Use m_a_f_get_verbose() or :verbose. - Implement #GObject's get_property() vfunc. - - - Properties (writing) - Use m_a_f_set_verbose() or :verbose. - Implement #GObject's set_property() vfunc. - - - - - - - Client-side usage - - You can use the generated proxy type with the generated - constructors: - - - - Instead of using the generic #GDBusProxy facilities, one can use - the generated methods such as - my_app_frobber_call_hello_world() to invoke - the net.Corp.MyApp.Frobber.HelloWorld() - D-Bus method, connect to the - ::notification GObject signal to receive - the net.Corp.MyApp.Frobber::Notification - D-Bus signal and get/set the - net.Corp.MyApp.Frobber:Verbose D-Bus - Property using either the GObject property - :verbose or the - my_app_get_verbose() and - my_app_set_verbose() methods. Use the - standard #GObject::notify signal to listen to property changes. - - - Note that all property access is via #GDBusProxy's - property cache so no I/O is ever done when reading properties. - Also note that setting a property will cause the - org.freedesktop.DBus.Properties.Set method to be - called on the remote object. This call, however, is asynchronous - so setting a property won't block. Further, the change is - delayed and no error checking is possible. - - - - - Server-side usage - - The generated MyAppFrobber interface is designed so - it is easy to implement it in a #GObject - subclass. For example, to handle - HelloWorld() method invocations, set the - vfunc for handle_hello_hello_world() in the - MyAppFrobberIface structure. Similarly, to handle - the net.Corp.MyApp.Frobber:Verbose - property override the :verbose #GObject - property from the subclass. To emit a signal, use - e.g. my_app_emit_signal() or - g_signal_emit_by_name(). - - - Instead of subclassing, it is often easier to use the generated - MyAppFrobberSkeleton subclass. To handle incoming - method calls, use g_signal_connect() with - the ::handle-* signals and instead of - overriding #GObject's - get_property() and - set_property() vfuncs, use - g_object_get() and - g_object_set() or the generated property - getters and setters (the generated class has an internal - property bag implementation). - - - - To facilitate atomic changesets (multiple properties changing at - the same time), #GObject::notify signals are queued up when - received. The queue is drained in an idle handler (which is called from the - thread-default main loop - of the thread where the skeleton object was - constructed) and will cause emissions of the org.freedesktop.DBus.Properties::PropertiesChanged - signal with all the properties that have changed. Use - g_dbus_interface_skeleton_flush() or - g_dbus_object_skeleton_flush() to empty the queue - immediately. Use g_object_freeze_notify() and - g_object_thaw_notify() for atomic changesets if on a different - thread. - - - - - - C Type Mapping - - Scalar types - (type-strings - 'b', - 'y', - 'n', - 'q', - 'i', - 'u', - 'x', - 't' and - 'd') - ), - strings (type-strings - 's', - 'ay', - 'o' and - 'g') and - arrays of string (type-strings - 'as', - 'ao' and - 'aay') - are mapped to the natural types, - e.g. #gboolean, #gdouble, #gint, gchar*, - gchar** and - so on. Everything else is mapped to the #GVariant - type. - - - This automatic mapping can be turned off by using the annotation - org.gtk.GDBus.C.ForceGVariant - if used then a - #GVariant is always exchanged instead of the - corresponding native C type. This annotation may be convenient to - use when using - bytestrings (type-string 'ay') - for data that could have embedded NUL bytes. - - - - - Stability Guarantees - - The generated C functions are guaranteed to not change their ABI. - That is, if a method, signal or property does not change its - signature in the introspection XML, the generated C functions will - not change their C ABI either. The ABI of the generated instance and - class structures will be preserved as well. - - - The ABI of the generated #GTypes will be preserved only if - the org.gtk.GDBus.Since annotation is used - judiciously — this is because the VTable for the #GInterface - relies on functions pointers for signal handlers. Specifically, if - a D-Bus method, property or signal or is added to a D-Bus - interface, then ABI of the generated #GInterface type is preserved - if, and only if, each added method, property signal is annotated - with the org.gtk.GDBus.Since annotation using - a greater version number than previous versions. - - - The generated C code currently happens to be annotated with gtk-doc / GObject - Introspection comments / annotations. The layout and - contents might change in the future so no guarantees about - e.g. SECTION usage etc. is given. - - - While the generated Docbook for D-Bus interfaces isn't expected to - change, no guarantees are given at this point. - - - It is important to note that the generated code should not be - checked into revision control systems, nor it should be included - in distributed source archives. - - - - - Bugs - - Please send bug reports to either the distribution bug tracker - or the upstream bug tracker at - https://gitlab.gnome.org/GNOME/glib/issues/new. - - - - - See also - - - gdbus1 - - - - - diff --git a/docs/reference/gio/gdbus-object-manager-example/.gitignore b/docs/reference/gio/gdbus-object-manager-example/.gitignore deleted file mode 100644 index cc8a11d..0000000 --- a/docs/reference/gio/gdbus-object-manager-example/.gitignore +++ /dev/null @@ -1 +0,0 @@ -gdbus-object-manager-example-overrides.txt diff --git a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml deleted file mode 100644 index fd4c307..0000000 --- a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-docs.xml +++ /dev/null @@ -1,19 +0,0 @@ - - -]> - - - GDBus ObjctManager Example - - Interfaces - - - - - - - - - diff --git a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt b/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt deleted file mode 100644 index 1e3b8b8..0000000 --- a/docs/reference/gio/gdbus-object-manager-example/gdbus-object-manager-example-sections.txt +++ /dev/null @@ -1,161 +0,0 @@ -
-ExampleAnimal -ExampleAnimal -ExampleAnimal -ExampleAnimalIface -example_animal_interface_info -example_animal_override_properties -example_animal_call_poke -example_animal_call_poke_finish -example_animal_call_poke_sync -example_animal_complete_poke -example_animal_emit_jumped -example_animal_get_mood -example_animal_get_foo -example_animal_get_bar -example_animal_dup_mood -example_animal_dup_foo -example_animal_dup_bar -example_animal_set_mood -example_animal_set_foo -example_animal_set_bar -ExampleAnimalProxy -ExampleAnimalProxyClass -example_animal_proxy_new -example_animal_proxy_new_finish -example_animal_proxy_new_sync -example_animal_proxy_new_for_bus -example_animal_proxy_new_for_bus_finish -example_animal_proxy_new_for_bus_sync -ExampleAnimalSkeleton -ExampleAnimalSkeletonClass -example_animal_skeleton_new - -example_animal_get_type -example_animal_proxy_get_type -example_animal_skeleton_get_type -ExampleAnimalSkeletonPrivate -ExampleAnimalProxyPrivate -EXAMPLE_TYPE_ANIMAL -EXAMPLE_TYPE_ANIMAL_PROXY -EXAMPLE_TYPE_ANIMAL_SKELETON -EXAMPLE_ANIMAL -EXAMPLE_ANIMAL_GET_IFACE -EXAMPLE_ANIMAL_PROXY -EXAMPLE_ANIMAL_PROXY_CLASS -EXAMPLE_ANIMAL_PROXY_GET_CLASS -EXAMPLE_ANIMAL_SKELETON -EXAMPLE_ANIMAL_SKELETON_CLASS -EXAMPLE_ANIMAL_SKELETON_GET_CLASS -EXAMPLE_IS_ANIMAL -EXAMPLE_IS_ANIMAL_PROXY -EXAMPLE_IS_ANIMAL_PROXY_CLASS -EXAMPLE_IS_ANIMAL_SKELETON -EXAMPLE_IS_ANIMAL_SKELETON_CLASS -
- -
-ExampleCat -ExampleCat -ExampleCat -ExampleCatIface -example_cat_interface_info -example_cat_override_properties -ExampleCatProxy -ExampleCatProxyClass -example_cat_proxy_new -example_cat_proxy_new_finish -example_cat_proxy_new_sync -example_cat_proxy_new_for_bus -example_cat_proxy_new_for_bus_finish -example_cat_proxy_new_for_bus_sync -ExampleCatSkeleton -ExampleCatSkeletonClass -example_cat_skeleton_new - -example_cat_get_type -example_cat_proxy_get_type -example_cat_skeleton_get_type -ExampleCatProxyPrivate -ExampleCatSkeletonPrivate -EXAMPLE_TYPE_CAT -EXAMPLE_TYPE_CAT_PROXY -EXAMPLE_TYPE_CAT_SKELETON -EXAMPLE_CAT -EXAMPLE_CAT_GET_IFACE -EXAMPLE_CAT_PROXY -EXAMPLE_CAT_PROXY_CLASS -EXAMPLE_CAT_PROXY_GET_CLASS -EXAMPLE_CAT_SKELETON -EXAMPLE_CAT_SKELETON_CLASS -EXAMPLE_CAT_SKELETON_GET_CLASS -EXAMPLE_IS_CAT -EXAMPLE_IS_CAT_PROXY -EXAMPLE_IS_CAT_PROXY_CLASS -EXAMPLE_IS_CAT_SKELETON -EXAMPLE_IS_CAT_SKELETON_CLASS -
- -
-ExampleObject -ExampleObject -ExampleObject -ExampleObjectIface -example_object_get_animal -example_object_get_cat -example_object_peek_animal -example_object_peek_cat -ExampleObjectProxy -ExampleObjectProxyClass -example_object_proxy_new -ExampleObjectSkeleton -ExampleObjectSkeletonClass -example_object_skeleton_new -example_object_skeleton_set_animal -example_object_skeleton_set_cat - -example_object_get_type -example_object_proxy_get_type -example_object_skeleton_get_type -ExampleObjectProxyPrivate -ExampleObjectSkeletonPrivate -EXAMPLE_IS_OBJECT -EXAMPLE_IS_OBJECT_PROXY -EXAMPLE_IS_OBJECT_PROXY_CLASS -EXAMPLE_IS_OBJECT_SKELETON -EXAMPLE_IS_OBJECT_SKELETON_CLASS -EXAMPLE_OBJECT -EXAMPLE_OBJECT_GET_IFACE -EXAMPLE_OBJECT_PROXY -EXAMPLE_OBJECT_PROXY_CLASS -EXAMPLE_OBJECT_PROXY_GET_CLASS -EXAMPLE_OBJECT_SKELETON -EXAMPLE_OBJECT_SKELETON_CLASS -EXAMPLE_OBJECT_SKELETON_GET_CLASS -EXAMPLE_TYPE_OBJECT -EXAMPLE_TYPE_OBJECT_PROXY -EXAMPLE_TYPE_OBJECT_SKELETON -
- -
-ExampleObjectManagerClient -ExampleObjectManagerClient -ExampleObjectManagerClient -ExampleObjectManagerClientClass -example_object_manager_client_get_proxy_type -example_object_manager_client_new -example_object_manager_client_new_finish -example_object_manager_client_new_sync -example_object_manager_client_new_for_bus -example_object_manager_client_new_for_bus_finish -example_object_manager_client_new_for_bus_sync - -example_object_manager_client_get_type -EXAMPLE_IS_OBJECT_MANAGER_CLIENT -EXAMPLE_IS_OBJECT_MANAGER_CLIENT_CLASS -EXAMPLE_OBJECT_MANAGER_CLIENT -EXAMPLE_OBJECT_MANAGER_CLIENT_CLASS -EXAMPLE_OBJECT_MANAGER_CLIENT_GET_CLASS -EXAMPLE_TYPE_OBJECT_MANAGER_CLIENT -ExampleObjectManagerClientPrivate -
diff --git a/docs/reference/gio/gdbus-object-manager-example/meson.build b/docs/reference/gio/gdbus-object-manager-example/meson.build deleted file mode 100644 index 8a80501..0000000 --- a/docs/reference/gio/gdbus-object-manager-example/meson.build +++ /dev/null @@ -1,11 +0,0 @@ -gdbus_object_manager_example_doc = gnome.gtkdoc('gdbus-object-manager-example', - main_xml : 'gdbus-object-manager-example-docs.xml', - namespace : 'example', - dependencies : [libgdbus_example_objectmanager_dep], - src_dir : 'gio/tests/gdbus-object-manager-example', - scan_args : [ - '--rebuild-types', - ], - install : false, -) - diff --git a/docs/reference/gio/gdbus.rst b/docs/reference/gio/gdbus.rst new file mode 100644 index 0000000..b0ea98d --- /dev/null +++ b/docs/reference/gio/gdbus.rst @@ -0,0 +1,278 @@ +.. _gdbus(1): +.. meta:: + :copyright: Copyright 2010, 2011, 2012, 2020 Red Hat, Inc. + :copyright: Copyright 2015 Collabora, Ltd. + :copyright: Copyright 2021 Endless OS Foundation, LLC + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2010, 2011, 2012, 2020 Red Hat, Inc. + SPDX-FileCopyrightText: 2015 Collabora, Ltd. + SPDX-FileCopyrightText: 2021 Endless OS Foundation, LLC + SPDX-License-Identifier: LGPL-2.1-or-later + +===== +gdbus +===== + +----------------------------------- +Tool for working with D-Bus objects +----------------------------------- + +SYNOPSIS +-------- + +| **gdbus** introspect [--system | --session | --address *address*] --dest *bus_name* --object-path */path/to/object* [--xml] [--recurse] [--only-properties] +| **gdbus** monitor [--system | --session | --address *address*] --dest *bus_name* [--object-path */path/to/object*] +| **gdbus** call [--system | --session | --address *address*] --dest *bus_name* --object-path */path/to/object* --method *org.project.InterfaceName.MethodName* [--timeout *seconds* | --interactive] [*ARG*…] +| **gdbus** emit [--system | --session | --address *address*] --object-path */path/to/object* --signal *org.project.InterfaceName.SignalName* [--dest *unique_bus_name*] [*ARG*…] +| **gdbus** wait [--system | --session | --address *address*] --activate *bus_name* [--timeout *seconds*] *bus_name* +| **gdbus** help + +DESCRIPTION +----------- + +``gdbus`` is a simple tool for working with D-Bus objects. + +COMMANDS +-------- + +``introspect`` + + Prints out interfaces and property values for a remote object. For this to + work, the owner of the object needs to implement the + ``org.freedesktop.DBus.Introspectable`` interface. If the ``--xml`` option is + used, the returned introspection XML is printed, otherwise a parsed pretty + representation is printed. The ``--recurse`` option can be used to introspect + children (and their children and so on) and the ``--only-properties`` option + can be used to only print the interfaces with properties. + +``monitor`` + + Monitors one or all objects owned by the owner of ``bus_name``. + +``call`` + + Invokes a method on a remote object. Each argument to pass to the method must + be specified as a serialized ``GVariant`` except that strings do not need + explicit quotes. The return values are printed out as serialized ``GVariant`` + values. + +``emit`` + + Emits a signal. Each argument to include in the signal must be specified as a + serialized ``GVariant`` except that strings do not need explicit quotes. + +``wait`` + + Waits until ``bus_name`` is owned by some process on the bus. If the + ``--activate`` is specified, that bus name will be auto-started first. It may + be the same as the bus name being waited for, or different. + +``help`` + + Prints help and exits. + +BASH COMPLETION +--------------- + +``gdbus`` ships with a bash completion script to complete commands, +destinations, bus names, object paths and interface/method names. + +EXAMPLES +-------- + +This shows how to introspect an object — note that the value of each property is +displayed:: + + $ gdbus introspect --system \ + --dest org.freedesktop.NetworkManager \ + --object-path /org/freedesktop/NetworkManager/Devices/0 + node /org/freedesktop/NetworkManager/Devices/0 { + interface org.freedesktop.DBus.Introspectable { + methods: + Introspect(out s data); + }; + interface org.freedesktop.DBus.Properties { + methods: + Get(in s interface, + in s propname, + out v value); + Set(in s interface, + in s propname, + in v value); + GetAll(in s interface, + out a{sv} props); + }; + interface org.freedesktop.NetworkManager.Device.Wired { + signals: + PropertiesChanged(a{sv} arg_0); + properties: + readonly b Carrier = false; + readonly u Speed = 0; + readonly s HwAddress = '00:1D:72:88:BE:97'; + }; + interface org.freedesktop.NetworkManager.Device { + methods: + Disconnect(); + signals: + StateChanged(u arg_0, + u arg_1, + u arg_2); + properties: + readonly u DeviceType = 1; + readonly b Managed = true; + readwrite o Ip6Config = '/'; + readwrite o Dhcp4Config = '/'; + readwrite o Ip4Config = '/'; + readonly u State = 2; + readwrite u Ip4Address = 0; + readonly u Capabilities = 3; + readonly s Driver = 'e1000e'; + readwrite s Interface = 'eth0'; + readonly s Udi = '/sys/devices/pci0000:00/0000:00:19.0/net/eth0'; + }; + }; + +The ``--recurse`` and ``--only-properties`` options can be useful when wanting +to inspect all objects owned by a particular process:: + + $ gdbus introspect --system --dest org.freedesktop.UPower --object-path / --recurse --only-properties + node / { + node /org { + node /org/freedesktop { + node /org/freedesktop/UPower { + interface org.freedesktop.UPower { + properties: + readonly b IsDocked = true; + readonly b LidForceSleep = false; + readonly b LidIsPresent = false; + readonly b LidIsClosed = false; + readonly b OnLowBattery = false; + readonly b OnBattery = false; + readonly b CanHibernate = true; + readonly b CanSuspend = true; + readonly s DaemonVersion = '0.9.10'; + }; + node /org/freedesktop/UPower/Policy { + }; + node /org/freedesktop/UPower/Wakeups { + interface org.freedesktop.UPower.Wakeups { + properties: + readonly b HasCapability = true; + }; + }; + }; + }; + }; + }; + +In a similar fashion, the ``introspect`` command can be used to learn details +about the ``Notify`` method:: + + […] + interface org.freedesktop.Notifications { + methods: + GetServerInformation(out s return_name, + out s return_vendor, + out s return_version, + out s return_spec_version); + GetCapabilities(out as return_caps); + CloseNotification(in u id); + Notify(in s app_name, + in u id, + in s icon, + in s summary, + in s body, + in as actions, + in a{sv} hints, + in i timeout, + out u return_id); + }; + […] + +With this information, it’s easy to use the ``call`` command to display a +notification:: + + $ gdbus call --session \ + --dest org.freedesktop.Notifications \ + --object-path /org/freedesktop/Notifications \ + --method org.freedesktop.Notifications.Notify \ + my_app_name \ + 42 \ + gtk-dialog-info \ + "The Summary" \ + "Here’s the body of the notification" \ + [] \ + {} \ + 5000 + (uint32 12,) + +Call a method with file handle argument:: + + $ gdbus call --session \ + --dest org.example.foo \ + --object-path /org/example/foo \ + --method SendFDs \ + 1 \ + 10 \ + 10},) + /org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': },) + /org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': },) + /org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': },) + +Emitting a signal:: + + $ gdbus emit --session --object-path /foo --signal org.bar.Foo "['foo', 'bar', 'baz']" + +Emitting a signal to a specific process:: + + $ gdbus emit --session --object-path /bar --signal org.bar.Bar someString --dest :1.42 + +Waiting for a well-known name to be owned on the bus; this will *not* auto-start +the service:: + + $ gdbus wait --session org.bar.SomeName + +Auto-starting then waiting for a well-known name to be owned on the bus:: + + $ gdbus wait --session --activate org.bar.SomeName + +Auto-starting a different service, then waiting for a well-known name to be +owned on the bus. This is useful in situations where ``SomeName`` is not +directly activatable:: + + $ gdbus wait --session --activate org.bar.PrerequisiteName org.bar.SomeName + +Waiting for a well-known name and giving up after 30 seconds. By default, the +timeout is disabled; or set ``--timeout`` to ``0`` to disable it:: + + $ gdbus wait --session --timeout 30 org.bar.SomeName + +BUGS +---- + +Please send bug reports to either the distribution bug tracker or the +`upstream bug tracker `_. + +SEE ALSO +-------- + +`dbus-send(1) `_ \ No newline at end of file diff --git a/docs/reference/gio/gdbus.xml b/docs/reference/gio/gdbus.xml deleted file mode 100644 index 60c172e..0000000 --- a/docs/reference/gio/gdbus.xml +++ /dev/null @@ -1,429 +0,0 @@ - - - - gdbus - GIO - - - Developer - David - Zeuthen - zeuthen@gmail.com - - - - - - gdbus - 1 - User Commands - - - - gdbus - Tool for working with D-Bus objects - - - - - gdbus - introspect - - --system - --session - --address address - - --dest bus_name - --object-path /path/to/object - - --xml - - - --recurse - - - --only-properties - - - - gdbus - monitor - - --system - --session - --address address - - --dest bus_name - - --object-path /path/to/object - - - - gdbus - call - - --system - --session - --address address - - --dest bus_name - --object-path /path/to/object - --method org.project.InterfaceName.MethodName - - --timeout seconds - --interactive - - ARG1 - ARG2 - - - gdbus - emit - - --system - --session - --address address - - --object-path /path/to/object - --signal org.project.InterfaceName.SignalName - - --dest unique_bus_name - - ARG1 - ARG2 - - - gdbus - wait - - --system - --session - --address address - - --activate bus_name - - --timeout seconds - - bus_name - - - gdbus - help - - - - - Description - - gdbus is a simple tool for working with D-Bus objects. - - - - Commands - - - - - Prints out interfaces and property values for a remote object. - For this to work, the owner of the object needs to implement the - org.freedesktop.DBus.Introspectable interface. - If the option is used, the returned - introspection XML is printed, otherwise a parsed pretty - representation is printed. - The option can be used to - introspect children (and their children and so on) and the - option can be used to - only print the interfaces with properties. - - - - - - Monitors one or all objects owned by the owner of - bus_name. - - - - - - Invokes a method on a remote object. Each argument to pass to the - method must be specified as a serialized - GVariant except that strings do - not need explicit quotes. The return values are printed out as - serialized GVariant - values. - - - - - - Emits a signal. Each argument to include in the signal must be specified as a serialized - GVariant except that strings do - not need explicit quotes. - - - - - - Waits until bus_name is owned by some - process on the bus. If the is specified, - that bus name will be auto-started first. It may be the same as the - bus name being waited for, or different. - - - - - - Prints help and exit. - - - - - - - Bash Completion - - gdbus ships with a bash completion script to - complete commands, destinations, bus names, object paths and - interface/method names. - - - - - Examples - This shows how to introspect an object - note that the value of each - property is displayed: - -$ gdbus introspect --system \ - --dest org.freedesktop.NetworkManager \ - --object-path /org/freedesktop/NetworkManager/Devices/0 -node /org/freedesktop/NetworkManager/Devices/0 { - interface org.freedesktop.DBus.Introspectable { - methods: - Introspect(out s data); - }; - interface org.freedesktop.DBus.Properties { - methods: - Get(in s interface, - in s propname, - out v value); - Set(in s interface, - in s propname, - in v value); - GetAll(in s interface, - out a{sv} props); - }; - interface org.freedesktop.NetworkManager.Device.Wired { - signals: - PropertiesChanged(a{sv} arg_0); - properties: - readonly b Carrier = false; - readonly u Speed = 0; - readonly s HwAddress = '00:1D:72:88:BE:97'; - }; - interface org.freedesktop.NetworkManager.Device { - methods: - Disconnect(); - signals: - StateChanged(u arg_0, - u arg_1, - u arg_2); - properties: - readonly u DeviceType = 1; - readonly b Managed = true; - readwrite o Ip6Config = '/'; - readwrite o Dhcp4Config = '/'; - readwrite o Ip4Config = '/'; - readonly u State = 2; - readwrite u Ip4Address = 0; - readonly u Capabilities = 3; - readonly s Driver = 'e1000e'; - readwrite s Interface = 'eth0'; - readonly s Udi = '/sys/devices/pci0000:00/0000:00:19.0/net/eth0'; - }; -}; - - - The and options can be useful when wanting to inspect all objects owned by a particular process: - - -$ gdbus introspect --system --dest org.freedesktop.UPower --object-path / --recurse --only-properties -node / { - node /org { - node /org/freedesktop { - node /org/freedesktop/UPower { - interface org.freedesktop.UPower { - properties: - readonly b IsDocked = true; - readonly b LidForceSleep = false; - readonly b LidIsPresent = false; - readonly b LidIsClosed = false; - readonly b OnLowBattery = false; - readonly b OnBattery = false; - readonly b CanHibernate = true; - readonly b CanSuspend = true; - readonly s DaemonVersion = '0.9.10'; - }; - node /org/freedesktop/UPower/Policy { - }; - node /org/freedesktop/UPower/Wakeups { - interface org.freedesktop.UPower.Wakeups { - properties: - readonly b HasCapability = true; - }; - }; - }; - }; - }; -}; - - - In a similar fashion, the command can be - used to learn details about the Notify method: - - -[...] - interface org.freedesktop.Notifications { - methods: - GetServerInformation(out s return_name, - out s return_vendor, - out s return_version, - out s return_spec_version); - GetCapabilities(out as return_caps); - CloseNotification(in u id); - Notify(in s app_name, - in u id, - in s icon, - in s summary, - in s body, - in as actions, - in a{sv} hints, - in i timeout, - out u return_id); - }; -[...] - - - With this information, it's easy to use the - command to display a notification - - -$ gdbus call --session \ - --dest org.freedesktop.Notifications \ - --object-path /org/freedesktop/Notifications \ - --method org.freedesktop.Notifications.Notify \ - my_app_name \ - 42 \ - gtk-dialog-info \ - "The Summary" \ - "Here's the body of the notification" \ - [] \ - {} \ - 5000 -(uint32 12,) - - - Call a method with file handle argument: - - -$ gdbus call --session \ - --dest org.example.foo \ - --object-path /org/example/foo \ - --method SendFDs \ - 1 \ - 10 \ - 10<file.foo - - - Monitoring all objects on a service: - - -$ gdbus monitor --system --dest org.freedesktop.ConsoleKit -Monitoring signals from all objects owned by org.freedesktop.ConsoleKit -The name org.freedesktop.ConsoleKit is owned by :1.15 -/org/freedesktop/ConsoleKit/Session2: org.freedesktop.ConsoleKit.Session.ActiveChanged (false,) -/org/freedesktop/ConsoleKit/Seat1: org.freedesktop.ConsoleKit.Seat.ActiveSessionChanged ('',) -/org/freedesktop/ConsoleKit/Session2: org.freedesktop.ConsoleKit.Session.ActiveChanged (true,) -/org/freedesktop/ConsoleKit/Seat1: org.freedesktop.ConsoleKit.Seat.ActiveSessionChanged ('/org/freedesktop/ConsoleKit/Session2',) - - - Monitoring a single object on a service: - - -$ gdbus monitor --system --dest org.freedesktop.NetworkManager --object-path /org/freedesktop/NetworkManager/AccessPoint/4141 -Monitoring signals on object /org/freedesktop/NetworkManager/AccessPoint/4141 owned by org.freedesktop.NetworkManager -The name org.freedesktop.NetworkManager is owned by :1.5 -/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x5c>},) -/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x64>},) -/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x5e>},) -/org/freedesktop/NetworkManager/AccessPoint/4141: org.freedesktop.NetworkManager.AccessPoint.PropertiesChanged ({'Strength': <byte 0x64>},) - - - - Emitting a signal: - - -$ gdbus emit --session --object-path /foo --signal org.bar.Foo "['foo', 'bar', 'baz']" - - - - Emitting a signal to a specific process: - - -$ gdbus emit --session --object-path /bar --signal org.bar.Bar someString --dest :1.42 - - - - Waiting for a well-known name to be owned on the bus; this will - not auto-start the service: - - -$ gdbus wait --session org.bar.SomeName - - - - Auto-starting then waiting for a well-known name to be owned on the bus: - - -$ gdbus wait --session --activate org.bar.SomeName - - - - Auto-starting a different service, then waiting for a well-known name to be - owned on the bus. This is useful in situations where - SomeName is not directly activatable: - - -$ gdbus wait --session --activate org.bar.PrerequisiteName org.bar.SomeName - - - - Waiting for a well-known name and giving up after 30 seconds. By default, - the timeout is disabled; or set to 0 to disable it: - - -$ gdbus wait --session --timeout 30 org.bar.SomeName - - - - - - Bugs - - Please send bug reports to either the distribution bug tracker - or the upstream bug tracker at - . - - - - - See Also - - - dbus-send1 - - - - - - diff --git a/docs/reference/gio/gio-docs-unix.xml b/docs/reference/gio/gio-docs-unix.xml deleted file mode 100644 index b78edda..0000000 --- a/docs/reference/gio/gio-docs-unix.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/docs/reference/gio/gio-docs-win32.xml b/docs/reference/gio/gio-docs-win32.xml deleted file mode 100644 index f34a6e6..0000000 --- a/docs/reference/gio/gio-docs-win32.xml +++ /dev/null @@ -1,6 +0,0 @@ - - Win32 support - - - - diff --git a/docs/reference/gio/gio-docs.xml b/docs/reference/gio/gio-docs.xml deleted file mode 100644 index c68bf8a..0000000 --- a/docs/reference/gio/gio-docs.xml +++ /dev/null @@ -1,418 +0,0 @@ - - - -]> - -GIO Reference Manual - - GIO Reference Manual - - for GIO &version; - The latest version of this documentation can be found on-line at - https://developer.gnome.org/gio/unstable/. - - - - - - - API Reference - - File Operations - - - - - - - - - File System Monitoring - - - - File-related Utilities - - - - Asynchronous I/O - - - - - - - - Data conversion - - - - - - - Streaming I/O - - - - - - - - - - - - - - - - - - - - - - - - - - - File types and applications - - - - - - - Volumes and Drives - - - - - - - - Icons - - - - - - - - - - Failable Initialization - - - - - Subprocesses - - - - - Low-level network support - - - - - - - - - - - - - - - - - - - High-level network functionality - - - - - - - - - - - - TLS (SSL) support - - - - - - - - - - - - - - - - DNS resolution - - - - - - - - - - - - Low-level D-Bus Support - - - - - - - - - - - - High-level D-Bus Support - - - - - - - - - - - - - - Settings - - - - - - Resources - - - - Permissions - - - - - Data Models - - - - - - Application support - - - - - - - - - - - - - - - - - - - - - - - Extending GIO - - - - - - GIO Tools - - - - - - - - - - - - GIO Testing - - - - - - - Migrating to GIO - - - - - - - - Object Hierarchy - - - - - Index - - - - Index of deprecated symbols - - - - Index of new symbols in 2.18 - - - - Index of new symbols in 2.20 - - - - Index of new symbols in 2.22 - - - - Index of new symbols in 2.24 - - - - Index of new symbols in 2.26 - - - - Index of new symbols in 2.28 - - - - Index of new symbols in 2.30 - - - - Index of new symbols in 2.32 - - - - Index of new symbols in 2.34 - - - - Index of new symbols in 2.36 - - - - Index of new symbols in 2.38 - - - - Index of new symbols in 2.40 - - - - Index of new symbols in 2.42 - - - - Index of new symbols in 2.44 - - - - Index of new symbols in 2.46 - - - - Index of new symbols in 2.48 - - - - Index of new symbols in 2.50 - - - - Index of new symbols in 2.52 - - - - Index of new symbols in 2.54 - - - - Index of new symbols in 2.56 - - - - Index of new symbols in 2.58 - - - - Index of new symbols in 2.60 - - - - Index of new symbols in 2.62 - - - - Index of new symbols in 2.64 - - - - Index of new symbols in 2.66 - - - - Index of new symbols in 2.68 - - - - Index of new symbols in 2.70 - - - - Index of new symbols in 2.72 - - - - Index of new symbols in 2.74 - - - - Index of new symbols in 2.76 - - - - Index of new symbols in 2.78 - - - - - - diff --git a/docs/reference/gio/gio-querymodules.rst b/docs/reference/gio/gio-querymodules.rst new file mode 100644 index 0000000..79141b5 --- /dev/null +++ b/docs/reference/gio/gio-querymodules.rst @@ -0,0 +1,31 @@ +.. _gio-querymodules(1): +.. meta:: + :copyright: Copyright 2010, 2012 Red Hat, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2010, 2012 Red Hat, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +================ +gio-querymodules +================ + +------------------------- +GIO module cache creation +------------------------- + +SYNOPSIS +-------- + +| **gio-querymodules** *DIRECTORY*… + +DESCRIPTION +----------- + +``gio-querymodules`` creates a ``giomodule.cache`` file in the listed +directories. This file lists the implemented extension points for each module +that has been found. It is used by GIO at runtime to avoid opening all modules +just to find out which extension points they are implementing. + +GIO modules are usually installed in the ``gio/modules`` subdirectory of libdir. \ No newline at end of file diff --git a/docs/reference/gio/gio-querymodules.xml b/docs/reference/gio/gio-querymodules.xml deleted file mode 100644 index c9c5eec..0000000 --- a/docs/reference/gio/gio-querymodules.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - glib-compile-schemas - GIO - - - Developer - Alexander - Larsson - - - - - - gio-querymodules - 1 - User Commands - - - - gio-querymodules - GIO module cache creation - - - - - gio-querymodules - DIRECTORY - - - -Description -gio-querymodules creates a -giomodule.cache file in the listed directories. -This file lists the implemented extension points for each module -that has been found. It is used by GIO at runtime to avoid opening -all modules just to find out which extension points they are implementing. - - -GIO modules are usually installed in the gio/modules -subdirectory of libdir. - - - diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt deleted file mode 100644 index 43da80c..0000000 --- a/docs/reference/gio/gio-sections-common.txt +++ /dev/null @@ -1,4808 +0,0 @@ -
-ginitable -GInitable -GInitable -GInitableIface -g_initable_init -g_initable_new -g_initable_new_valist -g_initable_newv - -G_INITABLE -G_INITABLE_GET_IFACE -G_IS_INITABLE -G_TYPE_INITABLE -G_TYPE_IS_INITABLE - -g_initable_get_type -
- -
-gasyncinitable -GAsyncInitable -GAsyncInitable -GAsyncInitableIface -g_async_initable_init_async -g_async_initable_init_finish -g_async_initable_new_async -g_async_initable_new_finish -g_async_initable_new_valist_async -g_async_initable_newv_async - -G_ASYNC_INITABLE -G_ASYNC_INITABLE_GET_IFACE -G_IS_ASYNC_INITABLE -G_TYPE_ASYNC_INITABLE -G_TYPE_IS_ASYNC_INITABLE - -g_async_initable_get_type -
- -
-gvfs -GVfs -GVfs -GVfsFileLookupFunc -G_VFS_EXTENSION_POINT_NAME -g_vfs_get_file_for_path -g_vfs_get_file_for_uri -g_vfs_parse_name -g_vfs_get_default -g_vfs_get_local -g_vfs_is_active -g_vfs_get_supported_uri_schemes -g_vfs_register_uri_scheme -g_vfs_unregister_uri_scheme - -GVfsClass -G_VFS -G_IS_VFS -G_TYPE_VFS -G_VFS_CLASS -G_IS_VFS_CLASS -G_VFS_GET_CLASS - -g_vfs_get_type -
- -
-gfile -GFile -GFile -GFileIface -GFileQueryInfoFlags -GFileCreateFlags -GFileCopyFlags -GFileMonitorFlags -GFileMeasureFlags -GFilesystemPreviewType -GFileProgressCallback -GFileReadMoreCallback -GFileMeasureProgressCallback -g_file_new_for_path -g_file_new_for_uri -g_file_new_for_commandline_arg -g_file_new_for_commandline_arg_and_cwd -g_file_new_tmp -g_file_new_tmp_async -g_file_new_tmp_finish -g_file_new_tmp_dir_async -g_file_new_tmp_dir_finish -g_file_parse_name -g_file_new_build_filename -g_file_new_build_filenamev -g_file_dup -g_file_hash -g_file_equal -g_file_get_basename -g_file_get_path -g_file_peek_path -g_file_get_uri -g_file_get_parse_name -g_file_get_parent -g_file_has_parent -g_file_get_child -g_file_get_child_for_display_name -g_file_has_prefix -g_file_get_relative_path -g_file_resolve_relative_path -g_file_is_native -g_file_has_uri_scheme -g_file_get_uri_scheme -g_file_read -g_file_read_async -g_file_read_finish -g_file_append_to -g_file_create -g_file_replace -g_file_append_to_async -g_file_append_to_finish -g_file_create_async -g_file_create_finish -g_file_replace_async -g_file_replace_finish -g_file_query_info -g_file_query_info_async -g_file_query_info_finish -g_file_query_exists -g_file_query_file_type -g_file_query_filesystem_info -g_file_query_filesystem_info_async -g_file_query_filesystem_info_finish -g_file_query_default_handler -g_file_query_default_handler_async -g_file_query_default_handler_finish -g_file_measure_disk_usage -g_file_measure_disk_usage_async -g_file_measure_disk_usage_finish -g_file_find_enclosing_mount -g_file_find_enclosing_mount_async -g_file_find_enclosing_mount_finish -g_file_enumerate_children -g_file_enumerate_children_async -g_file_enumerate_children_finish -g_file_set_display_name -g_file_set_display_name_async -g_file_set_display_name_finish -g_file_delete -g_file_delete_async -g_file_delete_finish -g_file_trash -g_file_trash_async -g_file_trash_finish -g_file_copy -g_file_copy_async -g_file_copy_finish -g_file_move -g_file_move_async -g_file_move_finish -g_file_make_directory -g_file_make_directory_async -g_file_make_directory_finish -g_file_make_directory_with_parents -g_file_make_symbolic_link -g_file_make_symbolic_link_async -g_file_make_symbolic_link_finish -g_file_query_settable_attributes -g_file_query_writable_namespaces -g_file_set_attribute -g_file_set_attributes_from_info -g_file_set_attributes_async -g_file_set_attributes_finish -g_file_set_attribute_string -g_file_set_attribute_byte_string -g_file_set_attribute_uint32 -g_file_set_attribute_int32 -g_file_set_attribute_uint64 -g_file_set_attribute_int64 -g_file_mount_mountable -g_file_mount_mountable_finish -g_file_unmount_mountable -g_file_unmount_mountable_finish -g_file_unmount_mountable_with_operation -g_file_unmount_mountable_with_operation_finish -g_file_eject_mountable -g_file_eject_mountable_finish -g_file_eject_mountable_with_operation -g_file_eject_mountable_with_operation_finish -g_file_start_mountable -g_file_start_mountable_finish -g_file_stop_mountable -g_file_stop_mountable_finish -g_file_poll_mountable -g_file_poll_mountable_finish -g_file_mount_enclosing_volume -g_file_mount_enclosing_volume_finish -g_file_monitor_directory -g_file_monitor_file -g_file_monitor -g_file_load_bytes -g_file_load_bytes_async -g_file_load_bytes_finish -g_file_load_contents -g_file_load_contents_async -g_file_load_contents_finish -g_file_load_partial_contents_async -g_file_load_partial_contents_finish -g_file_replace_contents -g_file_replace_contents_async -g_file_replace_contents_bytes_async -g_file_replace_contents_finish -g_file_build_attribute_list_for_copy -g_file_copy_attributes -g_file_create_readwrite -g_file_create_readwrite_async -g_file_create_readwrite_finish -g_file_open_readwrite -g_file_open_readwrite_async -g_file_open_readwrite_finish -g_file_replace_readwrite -g_file_replace_readwrite_async -g_file_replace_readwrite_finish -g_file_supports_thread_contexts - -G_FILE -G_IS_FILE -G_TYPE_FILE -G_FILE_GET_IFACE -G_TYPE_FILESYSTEM_PREVIEW_TYPE -G_TYPE_FILE_COPY_FLAGS -G_TYPE_FILE_CREATE_FLAGS -G_TYPE_FILE_MEASURE_FLAGS -G_TYPE_FILE_MONITOR_EVENT -G_TYPE_FILE_MONITOR_FLAGS -G_TYPE_FILE_QUERY_INFO_FLAGS - -g_file_get_type -g_file_copy_flags_get_type -g_file_create_flags_get_type -g_file_measure_flags_get_type -g_file_monitor_event_get_type -g_file_monitor_flags_get_type -g_file_query_info_flags_get_type -g_filesystem_preview_type_get_type -
- -
-gfileenumerator -GFileEnumerator -GFileEnumerator -g_file_enumerator_iterate -g_file_enumerator_next_file -g_file_enumerator_close -g_file_enumerator_next_files_async -g_file_enumerator_next_files_finish -g_file_enumerator_close_async -g_file_enumerator_close_finish -g_file_enumerator_is_closed -g_file_enumerator_has_pending -g_file_enumerator_set_pending -g_file_enumerator_get_container -g_file_enumerator_get_child - -GFileEnumeratorClass -G_FILE_ENUMERATOR -G_IS_FILE_ENUMERATOR -G_TYPE_FILE_ENUMERATOR -G_FILE_ENUMERATOR_CLASS -G_IS_FILE_ENUMERATOR_CLASS -G_FILE_ENUMERATOR_GET_CLASS - -g_file_enumerator_get_type -GFileEnumeratorPrivate -
- -
-gfileinfo -GFileInfo -GFileAttributeMatcher -GFileType -GFileInfo -G_FILE_ATTRIBUTE_STANDARD_TYPE -G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN -G_FILE_ATTRIBUTE_STANDARD_IS_BACKUP -G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK -G_FILE_ATTRIBUTE_STANDARD_IS_VIRTUAL -G_FILE_ATTRIBUTE_STANDARD_IS_VOLATILE -G_FILE_ATTRIBUTE_STANDARD_NAME -G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME -G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME -G_FILE_ATTRIBUTE_STANDARD_COPY_NAME -G_FILE_ATTRIBUTE_STANDARD_DESCRIPTION -G_FILE_ATTRIBUTE_STANDARD_ICON -G_FILE_ATTRIBUTE_STANDARD_SYMBOLIC_ICON -G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE -G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE -G_FILE_ATTRIBUTE_STANDARD_SIZE -G_FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZE -G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET -G_FILE_ATTRIBUTE_STANDARD_TARGET_URI -G_FILE_ATTRIBUTE_STANDARD_SORT_ORDER -G_FILE_ATTRIBUTE_ETAG_VALUE -G_FILE_ATTRIBUTE_ID_FILE -G_FILE_ATTRIBUTE_ID_FILESYSTEM -G_FILE_ATTRIBUTE_ACCESS_CAN_READ -G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE -G_FILE_ATTRIBUTE_ACCESS_CAN_EXECUTE -G_FILE_ATTRIBUTE_ACCESS_CAN_DELETE -G_FILE_ATTRIBUTE_ACCESS_CAN_TRASH -G_FILE_ATTRIBUTE_ACCESS_CAN_RENAME -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_MOUNT -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_UNMOUNT -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_EJECT -G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE -G_FILE_ATTRIBUTE_MOUNTABLE_UNIX_DEVICE_FILE -G_FILE_ATTRIBUTE_MOUNTABLE_HAL_UDI -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_START_DEGRADED -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_STOP -G_FILE_ATTRIBUTE_MOUNTABLE_START_STOP_TYPE -G_FILE_ATTRIBUTE_MOUNTABLE_CAN_POLL -G_FILE_ATTRIBUTE_MOUNTABLE_IS_MEDIA_CHECK_AUTOMATIC -G_FILE_ATTRIBUTE_TIME_MODIFIED -G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC -G_FILE_ATTRIBUTE_TIME_MODIFIED_NSEC -G_FILE_ATTRIBUTE_TIME_ACCESS -G_FILE_ATTRIBUTE_TIME_ACCESS_USEC -G_FILE_ATTRIBUTE_TIME_ACCESS_NSEC -G_FILE_ATTRIBUTE_TIME_CHANGED -G_FILE_ATTRIBUTE_TIME_CHANGED_USEC -G_FILE_ATTRIBUTE_TIME_CHANGED_NSEC -G_FILE_ATTRIBUTE_TIME_CREATED -G_FILE_ATTRIBUTE_TIME_CREATED_USEC -G_FILE_ATTRIBUTE_TIME_CREATED_NSEC -G_FILE_ATTRIBUTE_UNIX_DEVICE -G_FILE_ATTRIBUTE_UNIX_INODE -G_FILE_ATTRIBUTE_UNIX_MODE -G_FILE_ATTRIBUTE_UNIX_NLINK -G_FILE_ATTRIBUTE_UNIX_UID -G_FILE_ATTRIBUTE_UNIX_GID -G_FILE_ATTRIBUTE_UNIX_RDEV -G_FILE_ATTRIBUTE_UNIX_BLOCK_SIZE -G_FILE_ATTRIBUTE_UNIX_BLOCKS -G_FILE_ATTRIBUTE_UNIX_IS_MOUNTPOINT -G_FILE_ATTRIBUTE_DOS_IS_ARCHIVE -G_FILE_ATTRIBUTE_DOS_IS_MOUNTPOINT -G_FILE_ATTRIBUTE_DOS_IS_SYSTEM -G_FILE_ATTRIBUTE_DOS_REPARSE_POINT_TAG -G_FILE_ATTRIBUTE_OWNER_USER -G_FILE_ATTRIBUTE_OWNER_USER_REAL -G_FILE_ATTRIBUTE_OWNER_GROUP -G_FILE_ATTRIBUTE_THUMBNAIL_PATH -G_FILE_ATTRIBUTE_THUMBNAILING_FAILED -G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID -G_FILE_ATTRIBUTE_THUMBNAIL_PATH_NORMAL -G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_NORMAL -G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_NORMAL -G_FILE_ATTRIBUTE_THUMBNAIL_PATH_LARGE -G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_LARGE -G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_LARGE -G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XLARGE -G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XLARGE -G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XLARGE -G_FILE_ATTRIBUTE_THUMBNAIL_PATH_XXLARGE -G_FILE_ATTRIBUTE_THUMBNAILING_FAILED_XXLARGE -G_FILE_ATTRIBUTE_THUMBNAIL_IS_VALID_XXLARGE -G_FILE_ATTRIBUTE_PREVIEW_ICON -G_FILE_ATTRIBUTE_FILESYSTEM_SIZE -G_FILE_ATTRIBUTE_FILESYSTEM_FREE -G_FILE_ATTRIBUTE_FILESYSTEM_USED -G_FILE_ATTRIBUTE_FILESYSTEM_TYPE -G_FILE_ATTRIBUTE_FILESYSTEM_READONLY -G_FILE_ATTRIBUTE_FILESYSTEM_USE_PREVIEW -G_FILE_ATTRIBUTE_FILESYSTEM_REMOTE -G_FILE_ATTRIBUTE_GVFS_BACKEND -G_FILE_ATTRIBUTE_SELINUX_CONTEXT -G_FILE_ATTRIBUTE_TRASH_ITEM_COUNT -G_FILE_ATTRIBUTE_TRASH_ORIG_PATH -G_FILE_ATTRIBUTE_TRASH_DELETION_DATE -G_FILE_ATTRIBUTE_RECENT_MODIFIED -g_file_info_new -g_file_info_dup -g_file_info_copy_into -g_file_info_has_attribute -g_file_info_has_namespace -g_file_info_list_attributes -g_file_info_get_attribute_type -g_file_info_remove_attribute -g_file_info_get_attribute_as_string -g_file_info_get_attribute_data -g_file_info_get_attribute_status -g_file_info_get_attribute_string -g_file_info_get_attribute_stringv -g_file_info_get_attribute_byte_string -g_file_info_get_attribute_file_path -g_file_info_get_attribute_boolean -g_file_info_get_attribute_uint32 -g_file_info_get_attribute_int32 -g_file_info_get_attribute_uint64 -g_file_info_get_attribute_int64 -g_file_info_get_attribute_object -g_file_info_set_attribute -g_file_info_set_attribute_status -g_file_info_set_attribute_string -g_file_info_set_attribute_stringv -g_file_info_set_attribute_byte_string -g_file_info_set_attribute_file_path -g_file_info_set_attribute_boolean -g_file_info_set_attribute_uint32 -g_file_info_set_attribute_int32 -g_file_info_set_attribute_uint64 -g_file_info_set_attribute_int64 -g_file_info_set_attribute_object -g_file_info_clear_status -g_file_info_get_file_type -g_file_info_get_is_hidden -g_file_info_get_is_backup -g_file_info_get_is_symlink -g_file_info_get_name -g_file_info_get_display_name -g_file_info_get_edit_name -g_file_info_get_icon -g_file_info_get_symbolic_icon -g_file_info_get_content_type -g_file_info_get_size -g_file_info_get_modification_time -g_file_info_get_modification_date_time -g_file_info_get_access_date_time -g_file_info_get_creation_date_time -g_file_info_get_symlink_target -g_file_info_get_etag -g_file_info_get_sort_order -g_file_info_get_deletion_date -g_file_info_set_attribute_mask -g_file_info_unset_attribute_mask -g_file_info_set_file_type -g_file_info_set_is_hidden -g_file_info_set_is_symlink -g_file_info_set_name -g_file_info_set_display_name -g_file_info_set_edit_name -g_file_info_set_icon -g_file_info_set_symbolic_icon -g_file_info_set_content_type -g_file_info_set_size -g_file_info_set_modification_time -g_file_info_set_modification_date_time -g_file_info_set_access_date_time -g_file_info_set_creation_date_time -g_file_info_set_symlink_target -g_file_info_set_sort_order -g_file_attribute_matcher_new -g_file_attribute_matcher_ref -g_file_attribute_matcher_subtract -g_file_attribute_matcher_unref -g_file_attribute_matcher_matches -g_file_attribute_matcher_matches_only -g_file_attribute_matcher_enumerate_namespace -g_file_attribute_matcher_enumerate_next -g_file_attribute_matcher_to_string - -GFileInfoClass -G_FILE_INFO -G_IS_FILE_INFO -G_TYPE_FILE_INFO -G_FILE_INFO_CLASS -G_IS_FILE_INFO_CLASS -G_FILE_INFO_GET_CLASS -g_file_attribute_matcher_get_type -G_TYPE_FILE_TYPE - -g_file_info_get_type -g_file_type_get_type -
- -
-gfileattribute -GFileAttribute -GFileAttributeType -GFileAttributeInfoFlags -GFileAttributeStatus -GFileAttributeInfo -GFileAttributeInfoList -g_file_attribute_info_list_new -g_file_attribute_info_list_ref -g_file_attribute_info_list_unref -g_file_attribute_info_list_dup -g_file_attribute_info_list_lookup -g_file_attribute_info_list_add - -G_TYPE_FILE_ATTRIBUTE_INFO_FLAGS -G_TYPE_FILE_ATTRIBUTE_INFO_LIST -G_TYPE_FILE_ATTRIBUTE_MATCHER -G_TYPE_FILE_ATTRIBUTE_STATUS -G_TYPE_FILE_ATTRIBUTE_TYPE - -g_file_attribute_info_list_get_type -g_file_attribute_info_flags_get_type -g_file_attribute_status_get_type -g_file_attribute_type_get_type -
- -
-gfilemonitor -GFileMonitor -GFileMonitorEvent -GFileMonitor -g_file_monitor_cancel -g_file_monitor_is_cancelled -g_file_monitor_set_rate_limit -g_file_monitor_emit_event - -GFileMonitorClass -G_FILE_MONITOR -G_IS_FILE_MONITOR -G_TYPE_FILE_MONITOR -G_FILE_MONITOR_CLASS -G_IS_FILE_MONITOR_CLASS -G_FILE_MONITOR_GET_CLASS - -g_file_monitor_get_type -GFileMonitorPrivate -
- -
-gicon -GIcon -GIcon -GIconIface -g_icon_hash -g_icon_equal -g_icon_to_string -g_icon_new_for_string -g_icon_serialize -g_icon_deserialize - -G_ICON -G_IS_ICON -G_TYPE_ICON -G_ICON_GET_IFACE - -g_icon_get_type -
- -
-gthemedicon -GThemedIcon -GThemedIcon -g_themed_icon_new -g_themed_icon_new_from_names -g_themed_icon_new_with_default_fallbacks -g_themed_icon_prepend_name -g_themed_icon_append_name -g_themed_icon_get_names - -GThemedIconClass -G_THEMED_ICON -G_IS_THEMED_ICON -G_TYPE_THEMED_ICON -G_THEMED_ICON_CLASS -G_IS_THEMED_ICON_CLASS -G_THEMED_ICON_GET_CLASS - -g_themed_icon_get_type -
- -
-gloadableicon -GLoadableIcon -GLoadableIcon -GLoadableIconIface -g_loadable_icon_load -g_loadable_icon_load_async -g_loadable_icon_load_finish - -G_LOADABLE_ICON -G_IS_LOADABLE_ICON -G_TYPE_LOADABLE_ICON -G_LOADABLE_ICON_GET_IFACE - -g_loadable_icon_get_type -
- -
-gfileicon -GFileIcon -GFileIcon -g_file_icon_new -g_file_icon_get_file - -GFileIconClass -G_FILE_ICON -G_IS_FILE_ICON -G_TYPE_FILE_ICON -G_FILE_ICON_CLASS -G_IS_FILE_ICON_CLASS -G_FILE_ICON_GET_CLASS - -g_file_icon_get_type -
- -
-gbytesicon -GBytesIcon -GBytesIcon -g_bytes_icon_new -g_bytes_icon_get_bytes - -G_BYTES_ICON -G_IS_BYTES_ICON -G_TYPE_BYTES_ICON - -g_bytes_icon_get_type -
- -
-gemblemedicon -GEmblemedIcon -GEmblemedIcon -g_emblemed_icon_new -g_emblemed_icon_get_icon -g_emblemed_icon_get_emblems -g_emblemed_icon_add_emblem -g_emblemed_icon_clear_emblems - -GEmblemedIconClass -G_EMBLEMED_ICON -G_EMBLEMED_ICON_CLASS -G_EMBLEMED_ICON_GET_CLASS -G_IS_EMBLEMED_ICON -G_IS_EMBLEMED_ICON_CLASS -G_TYPE_EMBLEMED_ICON - - -GEmblemedIconPrivate -g_emblemed_icon_get_type -
- -
-gemblem -GEmblem -GEmblem -GEmblemOrigin -g_emblem_new -g_emblem_new_with_origin -g_emblem_get_icon -g_emblem_get_origin - -GEmblemClass -g_emblem_get_type -G_EMBLEM -G_EMBLEM_CLASS -G_EMBLEM_GET_CLASS -G_IS_EMBLEM -G_IS_EMBLEM_CLASS -G_TYPE_EMBLEM -G_TYPE_EMBLEM_ORIGIN -g_emblem_origin_get_type -
- -
-ginputstream -GInputStream -GInputStream -g_input_stream_read -g_input_stream_read_all -g_input_stream_read_all_async -g_input_stream_read_all_finish -g_input_stream_skip -g_input_stream_close -g_input_stream_read_async -g_input_stream_read_finish -g_input_stream_skip_async -g_input_stream_skip_finish -g_input_stream_close_async -g_input_stream_close_finish -g_input_stream_is_closed -g_input_stream_has_pending -g_input_stream_set_pending -g_input_stream_clear_pending -g_input_stream_read_bytes -g_input_stream_read_bytes_async -g_input_stream_read_bytes_finish - -GInputStreamClass -G_INPUT_STREAM -G_IS_INPUT_STREAM -G_TYPE_INPUT_STREAM -G_INPUT_STREAM_CLASS -G_IS_INPUT_STREAM_CLASS -G_INPUT_STREAM_GET_CLASS - -g_input_stream_get_type -GInputStreamPrivate -
- -
-gfileinputstream -GFileInputStream -GFileInputStream -g_file_input_stream_query_info -g_file_input_stream_query_info_async -g_file_input_stream_query_info_finish - -GFileInputStreamClass -G_FILE_INPUT_STREAM -G_IS_FILE_INPUT_STREAM -G_TYPE_FILE_INPUT_STREAM -G_FILE_INPUT_STREAM_CLASS -G_IS_FILE_INPUT_STREAM_CLASS -G_FILE_INPUT_STREAM_GET_CLASS - -g_file_input_stream_get_type -GFileInputStreamPrivate -
- -
-gfilterinputstream -GFilterInputStream -GFilterInputStream -g_filter_input_stream_get_base_stream -g_filter_input_stream_get_close_base_stream -g_filter_input_stream_set_close_base_stream - -GFilterInputStreamClass -G_FILTER_INPUT_STREAM -G_IS_FILTER_INPUT_STREAM -G_TYPE_FILTER_INPUT_STREAM -G_FILTER_INPUT_STREAM_CLASS -G_IS_FILTER_INPUT_STREAM_CLASS -G_FILTER_INPUT_STREAM_GET_CLASS - -g_filter_input_stream_get_type -
- -
-gunixinputstream -GUnixInputStream -GUnixInputStream -g_unix_input_stream_new -g_unix_input_stream_set_close_fd -g_unix_input_stream_get_close_fd -g_unix_input_stream_get_fd - -GUnixInputStreamClass -G_UNIX_INPUT_STREAM -G_IS_UNIX_INPUT_STREAM -G_TYPE_UNIX_INPUT_STREAM -G_UNIX_INPUT_STREAM_CLASS -G_IS_UNIX_INPUT_STREAM_CLASS -G_UNIX_INPUT_STREAM_GET_CLASS - -g_unix_input_stream_get_type -GUnixInputStreamPrivate -
- -
-gmemoryinputstream -GMemoryInputStream -GMemoryInputStream -g_memory_input_stream_new -g_memory_input_stream_new_from_data -g_memory_input_stream_new_from_bytes -g_memory_input_stream_add_data -g_memory_input_stream_add_bytes - -GMemoryInputStreamClass -G_MEMORY_INPUT_STREAM -G_IS_MEMORY_INPUT_STREAM -G_TYPE_MEMORY_INPUT_STREAM -G_MEMORY_INPUT_STREAM_CLASS -G_IS_MEMORY_INPUT_STREAM_CLASS -G_MEMORY_INPUT_STREAM_GET_CLASS - -GMemoryInputStreamPrivate -g_memory_input_stream_get_type -
- -
-gdatainputstream -GDataInputStream -GDataInputStream -GDataStreamByteOrder -GDataStreamNewlineType -g_data_input_stream_new -g_data_input_stream_set_byte_order -g_data_input_stream_get_byte_order -g_data_input_stream_set_newline_type -g_data_input_stream_get_newline_type -g_data_input_stream_read_byte -g_data_input_stream_read_int16 -g_data_input_stream_read_uint16 -g_data_input_stream_read_int32 -g_data_input_stream_read_uint32 -g_data_input_stream_read_int64 -g_data_input_stream_read_uint64 -g_data_input_stream_read_line -g_data_input_stream_read_line_utf8 -g_data_input_stream_read_line_async -g_data_input_stream_read_line_finish -g_data_input_stream_read_line_finish_utf8 -g_data_input_stream_read_upto -g_data_input_stream_read_upto_async -g_data_input_stream_read_upto_finish -g_data_input_stream_read_until -g_data_input_stream_read_until_async -g_data_input_stream_read_until_finish - -GDataInputStreamClass -G_DATA_INPUT_STREAM -G_IS_DATA_INPUT_STREAM -G_TYPE_DATA_INPUT_STREAM -G_DATA_INPUT_STREAM_CLASS -G_IS_DATA_INPUT_STREAM_CLASS -G_DATA_INPUT_STREAM_GET_CLASS -G_TYPE_DATA_STREAM_BYTE_ORDER -G_TYPE_DATA_STREAM_NEWLINE_TYPE - -g_data_input_stream_get_type -GDataInputStreamPrivate -g_data_stream_byte_order_get_type -g_data_stream_newline_type_get_type -
- -
-gbufferedinputstream -GBufferedInputStream -GBufferedInputStream -g_buffered_input_stream_new -g_buffered_input_stream_new_sized -g_buffered_input_stream_get_buffer_size -g_buffered_input_stream_set_buffer_size -g_buffered_input_stream_get_available -g_buffered_input_stream_peek_buffer -g_buffered_input_stream_peek -g_buffered_input_stream_fill -g_buffered_input_stream_fill_async -g_buffered_input_stream_fill_finish -g_buffered_input_stream_read_byte - -GBufferedInputStreamClass -G_BUFFERED_INPUT_STREAM -G_IS_BUFFERED_INPUT_STREAM -G_TYPE_BUFFERED_INPUT_STREAM -G_BUFFERED_INPUT_STREAM_CLASS -G_IS_BUFFERED_INPUT_STREAM_CLASS -G_BUFFERED_INPUT_STREAM_GET_CLASS - -g_buffered_input_stream_get_type -GBufferedInputStreamPrivate -
- -
-goutputstream -GOutputStream -GOutputStreamSpliceFlags -GOutputStream -g_output_stream_write -g_output_stream_write_all -g_output_stream_write_all_async -g_output_stream_write_all_finish -g_output_stream_writev -g_output_stream_writev_all -g_output_stream_writev_async -g_output_stream_writev_finish -g_output_stream_writev_all_async -g_output_stream_writev_all_finish -g_output_stream_splice -g_output_stream_flush -g_output_stream_close -g_output_stream_write_async -g_output_stream_write_finish -g_output_stream_splice_async -g_output_stream_splice_finish -g_output_stream_flush_async -g_output_stream_flush_finish -g_output_stream_close_async -g_output_stream_close_finish -g_output_stream_is_closing -g_output_stream_is_closed -g_output_stream_has_pending -g_output_stream_set_pending -g_output_stream_clear_pending -g_output_stream_write_bytes -g_output_stream_write_bytes_async -g_output_stream_write_bytes_finish -g_output_stream_printf -g_output_stream_vprintf - -GOutputStreamClass -G_OUTPUT_STREAM -G_IS_OUTPUT_STREAM -G_TYPE_OUTPUT_STREAM -G_OUTPUT_STREAM_CLASS -G_IS_OUTPUT_STREAM_CLASS -G_OUTPUT_STREAM_GET_CLASS -G_TYPE_OUTPUT_STREAM_SPLICE_FLAGS - -g_output_stream_get_type -GOutputStreamPrivate -g_output_stream_splice_flags_get_type -
- -
-gfileoutputstream -GFileOutputStream -GFileOutputStream -g_file_output_stream_query_info -g_file_output_stream_query_info_async -g_file_output_stream_query_info_finish -g_file_output_stream_get_etag - -GFileOutputStreamClass -G_FILE_OUTPUT_STREAM -G_IS_FILE_OUTPUT_STREAM -G_TYPE_FILE_OUTPUT_STREAM -G_FILE_OUTPUT_STREAM_CLASS -G_IS_FILE_OUTPUT_STREAM_CLASS -G_FILE_OUTPUT_STREAM_GET_CLASS - -g_file_output_stream_get_type -GFileOutputStreamPrivate -
- -
-gfilteroutputstream -GFilterOutputStream -GFilterOutputStream -g_filter_output_stream_get_base_stream -g_filter_output_stream_get_close_base_stream -g_filter_output_stream_set_close_base_stream - -GFilterOutputStreamClass -G_FILTER_OUTPUT_STREAM -G_IS_FILTER_OUTPUT_STREAM -G_TYPE_FILTER_OUTPUT_STREAM -G_FILTER_OUTPUT_STREAM_CLASS -G_IS_FILTER_OUTPUT_STREAM_CLASS -G_FILTER_OUTPUT_STREAM_GET_CLASS - -g_filter_output_stream_get_type -
- -
-gbufferedoutputstream -GBufferedOutputStream -GBufferedOutputStream -g_buffered_output_stream_new -g_buffered_output_stream_new_sized -g_buffered_output_stream_get_buffer_size -g_buffered_output_stream_set_buffer_size -g_buffered_output_stream_get_auto_grow -g_buffered_output_stream_set_auto_grow - -GBufferedOutputStreamClass -G_BUFFERED_OUTPUT_STREAM -G_IS_BUFFERED_OUTPUT_STREAM -G_TYPE_BUFFERED_OUTPUT_STREAM -G_BUFFERED_OUTPUT_STREAM_CLASS -G_IS_BUFFERED_OUTPUT_STREAM_CLASS -G_BUFFERED_OUTPUT_STREAM_GET_CLASS - -g_buffered_output_stream_get_type -GBufferedOutputStreamPrivate -
- -
-gmemoryoutputstream -GMemoryOutputStream -GReallocFunc -GMemoryOutputStream -g_memory_output_stream_new -g_memory_output_stream_new_resizable -g_memory_output_stream_get_data -g_memory_output_stream_get_size -g_memory_output_stream_get_data_size -g_memory_output_stream_steal_data -g_memory_output_stream_steal_as_bytes - -GMemoryOutputStreamClass -G_MEMORY_OUTPUT_STREAM -G_IS_MEMORY_OUTPUT_STREAM -G_TYPE_MEMORY_OUTPUT_STREAM -G_MEMORY_OUTPUT_STREAM_CLASS -G_IS_MEMORY_OUTPUT_STREAM_CLASS -G_MEMORY_OUTPUT_STREAM_GET_CLASS - -g_memory_output_stream_get_type -GMemoryOutputStreamPrivate -
- -
-gdataoutputstream -GDataOutputStream -GDataOutputStream -g_data_output_stream_new -g_data_output_stream_set_byte_order -g_data_output_stream_get_byte_order -g_data_output_stream_put_byte -g_data_output_stream_put_int16 -g_data_output_stream_put_uint16 -g_data_output_stream_put_int32 -g_data_output_stream_put_uint32 -g_data_output_stream_put_int64 -g_data_output_stream_put_uint64 -g_data_output_stream_put_string - -GDataOutputStreamClass -G_DATA_OUTPUT_STREAM -G_IS_DATA_OUTPUT_STREAM -G_TYPE_DATA_OUTPUT_STREAM -G_DATA_OUTPUT_STREAM_CLASS -G_IS_DATA_OUTPUT_STREAM_CLASS -G_DATA_OUTPUT_STREAM_GET_CLASS - -g_data_output_stream_get_type -GDataOutputStreamPrivate -
- -
-gunixoutputstream -GUnixOutputStream -GUnixOutputStream -g_unix_output_stream_new -g_unix_output_stream_set_close_fd -g_unix_output_stream_get_close_fd -g_unix_output_stream_get_fd - -GUnixOutputStreamClass -G_UNIX_OUTPUT_STREAM -G_IS_UNIX_OUTPUT_STREAM -G_TYPE_UNIX_OUTPUT_STREAM -G_UNIX_OUTPUT_STREAM_CLASS -G_IS_UNIX_OUTPUT_STREAM_CLASS -G_UNIX_OUTPUT_STREAM_GET_CLASS - -g_unix_output_stream_get_type -GUnixOutputStreamPrivate -
- -
-giostream -GIOStream -GIOStreamSpliceFlags -GIOStream -g_io_stream_get_input_stream -g_io_stream_get_output_stream -g_io_stream_splice_async -g_io_stream_splice_finish -g_io_stream_close -g_io_stream_close_async -g_io_stream_close_finish -g_io_stream_is_closed -g_io_stream_has_pending -g_io_stream_set_pending -g_io_stream_clear_pending - -GIOStreamClass -G_IO_STREAM -G_IO_STREAM_CLASS -G_IO_STREAM_GET_CLASS -G_IS_IO_STREAM -G_IS_IO_STREAM_CLASS -G_TYPE_IO_STREAM -G_TYPE_IO_STREAM_SPLICE_FLAGS - -GIOStreamPrivate -GIOStreamAdapter -g_io_stream_get_type -g_io_stream_splice_flags_get_type -
- -
-gsimpleiostream -GSimpleIOStream -GSimpleIOStream -g_simple_io_stream_new - -GIOStreamClass -G_TYPE_SIMPLE_IO_STREAM -G_IS_SIMPLE_IO_STREAM -G_SIMPLE_IO_STREAM - -g_simple_io_stream_get_type -
- -
-gfileiostream -GFileIOStream -GFileIOStream -g_file_io_stream_get_etag -g_file_io_stream_query_info -g_file_io_stream_query_info_async -g_file_io_stream_query_info_finish - -GFileIOStreamClass -G_FILE_IO_STREAM -G_FILE_IO_STREAM_CLASS -G_FILE_IO_STREAM_GET_CLASS -G_IS_FILE_IO_STREAM -G_IS_FILE_IO_STREAM_CLASS -G_TYPE_FILE_IO_STREAM - -GFileIOStreamPrivate -g_file_io_stream_get_type -
- -
-gseekable -GSeekable -GSeekable -GSeekableIface -g_seekable_tell -g_seekable_can_seek -g_seekable_seek -g_seekable_can_truncate -g_seekable_truncate - -G_SEEKABLE -G_IS_SEEKABLE -G_TYPE_SEEKABLE -G_SEEKABLE_GET_IFACE - -g_seekable_get_type -
- -
-gvolumemonitor -GVolumeMonitor -GVolumeMonitor -G_VOLUME_MONITOR_EXTENSION_POINT_NAME -g_volume_monitor_get -g_volume_monitor_get_connected_drives -g_volume_monitor_get_volumes -g_volume_monitor_get_mounts -g_volume_monitor_adopt_orphan_mount -g_volume_monitor_get_mount_for_uuid -g_volume_monitor_get_volume_for_uuid - -GVolumeMonitorClass -G_VOLUME_MONITOR -G_IS_VOLUME_MONITOR -G_TYPE_VOLUME_MONITOR -G_VOLUME_MONITOR_CLASS -G_IS_VOLUME_MONITOR_CLASS -G_VOLUME_MONITOR_GET_CLASS - -g_volume_monitor_get_type -
- -
-gmount -GMount -GMount -GMountIface -g_mount_get_name -g_mount_get_uuid -g_mount_get_icon -g_mount_get_symbolic_icon -g_mount_get_drive -g_mount_get_root -g_mount_get_volume -g_mount_get_default_location -g_mount_can_unmount -GMountMountFlags -GMountUnmountFlags -g_mount_unmount -g_mount_unmount_finish -g_mount_unmount_with_operation -g_mount_unmount_with_operation_finish -g_mount_remount -g_mount_remount_finish -g_mount_can_eject -g_mount_eject -g_mount_eject_finish -g_mount_eject_with_operation -g_mount_eject_with_operation_finish -g_mount_guess_content_type -g_mount_guess_content_type_finish -g_mount_guess_content_type_sync -g_mount_is_shadowed -g_mount_shadow -g_mount_unshadow -g_mount_get_sort_key - -G_IS_MOUNT -G_MOUNT -G_MOUNT_GET_IFACE -G_TYPE_MOUNT -G_TYPE_MOUNT_MOUNT_FLAGS -G_TYPE_MOUNT_UNMOUNT_FLAGS - -g_mount_get_type -g_mount_mount_flags_get_type -g_mount_unmount_flags_get_type -
- -
-gvolume -GVolume -GVolume -GVolumeIface -g_volume_get_name -g_volume_get_uuid -g_volume_get_icon -g_volume_get_symbolic_icon -g_volume_get_drive -g_volume_get_mount -g_volume_can_mount -g_volume_should_automount -g_volume_get_activation_root -g_volume_mount -g_volume_mount_finish -g_volume_can_eject -g_volume_eject -g_volume_eject_finish -g_volume_eject_with_operation -g_volume_eject_with_operation_finish -G_VOLUME_IDENTIFIER_KIND_HAL_UDI -G_VOLUME_IDENTIFIER_KIND_LABEL -G_VOLUME_IDENTIFIER_KIND_NFS_MOUNT -G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE -G_VOLUME_IDENTIFIER_KIND_UUID -G_VOLUME_IDENTIFIER_KIND_CLASS -g_volume_enumerate_identifiers -g_volume_get_identifier -g_volume_get_sort_key - -G_VOLUME -G_IS_VOLUME -G_TYPE_VOLUME -G_VOLUME_GET_IFACE - -g_volume_get_type -
- -
-gdrive -GDrive -GDrive -GDriveIface -GDriveStartFlags -GDriveStartStopType -g_drive_get_name -g_drive_get_icon -g_drive_get_symbolic_icon -g_drive_has_volumes -g_drive_get_volumes -g_drive_can_eject -g_drive_get_start_stop_type -g_drive_can_start -g_drive_can_start_degraded -g_drive_can_stop -g_drive_can_poll_for_media -g_drive_poll_for_media -g_drive_poll_for_media_finish -g_drive_has_media -g_drive_is_media_check_automatic -g_drive_is_removable -g_drive_is_media_removable -g_drive_eject -g_drive_eject_finish -g_drive_eject_with_operation -g_drive_eject_with_operation_finish -g_drive_start -g_drive_start_finish -g_drive_stop -g_drive_stop_finish -g_drive_enumerate_identifiers -g_drive_get_identifier -g_drive_get_sort_key -G_DRIVE_IDENTIFIER_KIND_UNIX_DEVICE - -G_DRIVE -G_IS_DRIVE -G_TYPE_DRIVE -G_DRIVE_GET_IFACE -G_TYPE_DRIVE_START_FLAGS -G_TYPE_DRIVE_START_STOP_TYPE - -g_drive_get_type -g_drive_start_flags_get_type -g_drive_start_stop_type_get_type -
- -
-gcancellable -GCancellable -GCancellable -g_cancellable_new -g_cancellable_is_cancelled -g_cancellable_set_error_if_cancelled -g_cancellable_get_fd -g_cancellable_make_pollfd -g_cancellable_release_fd -g_cancellable_source_new -GCancellableSourceFunc -g_cancellable_get_current -g_cancellable_pop_current -g_cancellable_push_current -g_cancellable_reset -g_cancellable_connect -g_cancellable_disconnect -g_cancellable_cancel - -GCancellableClass -G_CANCELLABLE -G_IS_CANCELLABLE -G_TYPE_CANCELLABLE -G_CANCELLABLE_CLASS -G_IS_CANCELLABLE_CLASS -G_CANCELLABLE_GET_CLASS - -GCancellablePrivate -g_cancellable_get_type -
- -
-gasyncresult -GAsyncResult -GAsyncResult -GAsyncResultIface -GAsyncReadyCallback -g_async_result_get_user_data -g_async_result_get_source_object -g_async_result_is_tagged -g_async_result_legacy_propagate_error - -G_ASYNC_RESULT -G_IS_ASYNC_RESULT -G_TYPE_ASYNC_RESULT -G_ASYNC_RESULT_GET_IFACE - -g_async_result_get_type -
- -
-gsimpleasyncresult -GSimpleAsyncResult -GSimpleAsyncResult -GSimpleAsyncThreadFunc -g_simple_async_result_new -g_simple_async_result_new_error -g_simple_async_result_new_from_error -g_simple_async_result_new_take_error -g_simple_async_result_set_check_cancellable -g_simple_async_result_set_op_res_gpointer -g_simple_async_result_get_op_res_gpointer -g_simple_async_result_set_op_res_gssize -g_simple_async_result_get_op_res_gssize -g_simple_async_result_set_op_res_gboolean -g_simple_async_result_get_op_res_gboolean -g_simple_async_result_get_source_tag -g_simple_async_result_is_valid -g_simple_async_result_set_handle_cancellation -g_simple_async_result_complete -g_simple_async_result_complete_in_idle -g_simple_async_result_run_in_thread -g_simple_async_result_set_from_error -g_simple_async_result_take_error -g_simple_async_result_propagate_error -g_simple_async_result_set_error -g_simple_async_result_set_error_va -g_simple_async_report_error_in_idle -g_simple_async_report_gerror_in_idle -g_simple_async_report_take_gerror_in_idle - -GSimpleAsyncResultClass -G_SIMPLE_ASYNC_RESULT -G_IS_SIMPLE_ASYNC_RESULT -G_TYPE_SIMPLE_ASYNC_RESULT -G_SIMPLE_ASYNC_RESULT_CLASS -G_IS_SIMPLE_ASYNC_RESULT_CLASS -G_SIMPLE_ASYNC_RESULT_GET_CLASS - -g_simple_async_result_get_type -
- -
-gioscheduler -GIOScheduler -GIOSchedulerJob -GIOSchedulerJobFunc -g_io_scheduler_push_job -g_io_scheduler_cancel_all_jobs -g_io_scheduler_job_send_to_mainloop -g_io_scheduler_job_send_to_mainloop_async -
- -
-gioerror -GIOError -G_IO_ERROR -GIOErrorEnum -g_io_error_from_errno -g_io_error_from_file_error -g_io_error_from_win32_error - -G_TYPE_IO_ERROR_ENUM - -g_io_error_quark -g_io_error_enum_get_type -
- -
-gcontenttype -GContentType -g_content_type_equals -g_content_type_is_a -g_content_type_is_mime_type -g_content_type_is_unknown -g_content_type_get_description -g_content_type_get_mime_type -g_content_type_get_icon -g_content_type_get_symbolic_icon -g_content_type_get_generic_icon_name -g_content_type_can_be_executable -g_content_type_from_mime_type -g_content_type_guess -g_content_type_guess_for_tree -g_content_types_get_registered -
- -
-gappinfo -GAppInfo -GAppInfoCreateFlags -GAppInfo -GAppInfoIface -GAppLaunchContext -g_app_info_create_from_commandline -g_app_info_dup -g_app_info_equal -g_app_info_get_id -g_app_info_get_name -g_app_info_get_display_name -g_app_info_get_description -g_app_info_get_executable -g_app_info_get_commandline -g_app_info_get_icon -g_app_info_launch -g_app_info_supports_files -g_app_info_supports_uris -g_app_info_launch_uris -g_app_info_launch_uris_async -g_app_info_launch_uris_finish -g_app_info_should_show -g_app_info_can_delete -g_app_info_delete -g_app_info_reset_type_associations -g_app_info_set_as_default_for_type -g_app_info_set_as_default_for_extension -g_app_info_set_as_last_used_for_type -g_app_info_add_supports_type -g_app_info_can_remove_supports_type -g_app_info_remove_supports_type -g_app_info_get_supported_types -g_app_info_get_all -g_app_info_get_all_for_type -g_app_info_get_default_for_type -g_app_info_get_default_for_type_async -g_app_info_get_default_for_type_finish -g_app_info_get_default_for_uri_scheme -g_app_info_get_default_for_uri_scheme_async -g_app_info_get_default_for_uri_scheme_finish -g_app_info_get_fallback_for_type -g_app_info_get_recommended_for_type -g_app_info_launch_default_for_uri -g_app_info_launch_default_for_uri_async -g_app_info_launch_default_for_uri_finish -g_app_launch_context_setenv -g_app_launch_context_unsetenv -g_app_launch_context_get_environment -g_app_launch_context_get_display -g_app_launch_context_get_startup_notify_id -g_app_launch_context_launch_failed -g_app_launch_context_new - -GAppLaunchContextClass -G_APP_INFO -G_IS_APP_INFO -G_TYPE_APP_INFO -G_APP_INFO_GET_IFACE -G_APP_LAUNCH_CONTEXT -G_APP_LAUNCH_CONTEXT_CLASS -G_APP_LAUNCH_CONTEXT_GET_CLASS -G_IS_APP_LAUNCH_CONTEXT -G_IS_APP_LAUNCH_CONTEXT_CLASS -G_TYPE_APP_LAUNCH_CONTEXT -G_TYPE_APP_INFO_CREATE_FLAGS - -g_app_info_get_type -g_app_info_create_flags_get_type -g_app_launch_context_get_type -GAppLaunchContextPrivate -
- -
-gappinfomonitor -GAppInfoMonitor -g_app_info_monitor_get - -GAppInfoMonitor -G_APP_INFO_MONITOR -G_IS_APP_INFO_MONITOR -G_TYPE_APP_INFO_MONITOR - -g_app_info_monitor_get_type -
- -
-gmountoperation -GMountOperation -GAskPasswordFlags -GPasswordSave -GMountOperation -GMountOperationResult -g_mount_operation_new -g_mount_operation_get_username -g_mount_operation_set_username -g_mount_operation_get_password -g_mount_operation_set_password -g_mount_operation_get_anonymous -g_mount_operation_set_anonymous -g_mount_operation_get_domain -g_mount_operation_set_domain -g_mount_operation_get_password_save -g_mount_operation_set_password_save -g_mount_operation_get_choice -g_mount_operation_set_choice -g_mount_operation_get_is_tcrypt_hidden_volume -g_mount_operation_set_is_tcrypt_hidden_volume -g_mount_operation_get_is_tcrypt_system_volume -g_mount_operation_set_is_tcrypt_system_volume -g_mount_operation_get_pim -g_mount_operation_set_pim -g_mount_operation_reply - -GMountOperationClass -G_MOUNT_OPERATION -G_IS_MOUNT_OPERATION -G_TYPE_MOUNT_OPERATION -G_MOUNT_OPERATION_CLASS -G_IS_MOUNT_OPERATION_CLASS -G_MOUNT_OPERATION_GET_CLASS -G_TYPE_ASK_PASSWORD_FLAGS -G_TYPE_MOUNT_OPERATION_RESULT -G_TYPE_PASSWORD_SAVE - -g_mount_operation_get_type -g_ask_password_flags_get_type -GMountOperationPrivate -g_mount_operation_result_get_type -g_password_save_get_type -
- -
-gfilenamecompleter -GFilenameCompleter -GFilenameCompleter -g_filename_completer_new -g_filename_completer_get_completion_suffix -g_filename_completer_get_completions -g_filename_completer_set_dirs_only - -GFilenameCompleterClass -G_FILENAME_COMPLETER -G_IS_FILENAME_COMPLETER -G_TYPE_FILENAME_COMPLETER -G_FILENAME_COMPLETER_CLASS -G_IS_FILENAME_COMPLETER_CLASS -G_FILENAME_COMPLETER_GET_CLASS - -g_filename_completer_get_type -
- -
-gunixmounts -Unix Mounts -GUnixMountPoint -GUnixMountEntry -GUnixMountMonitor -g_unix_mount_free -g_unix_mount_compare -g_unix_mount_copy -g_unix_mount_get_mount_path -g_unix_mount_get_device_path -g_unix_mount_get_root_path -g_unix_mount_get_fs_type -g_unix_mount_get_options -g_unix_mount_is_readonly -g_unix_mount_is_system_internal -g_unix_mount_guess_icon -g_unix_mount_guess_symbolic_icon -g_unix_mount_guess_name -g_unix_mount_guess_can_eject -g_unix_mount_guess_should_display -g_unix_mount_point_free -g_unix_mount_point_compare -g_unix_mount_point_copy -g_unix_mount_point_get_mount_path -g_unix_mount_point_get_device_path -g_unix_mount_point_get_fs_type -g_unix_mount_point_get_options -g_unix_mount_point_is_readonly -g_unix_mount_point_is_user_mountable -g_unix_mount_point_is_loopback -g_unix_mount_point_guess_icon -g_unix_mount_point_guess_symbolic_icon -g_unix_mount_point_guess_name -g_unix_mount_point_guess_can_eject -g_unix_mount_points_get -g_unix_mount_point_at -g_unix_mounts_get -g_unix_mount_at -g_unix_mount_for -g_unix_mounts_changed_since -g_unix_mount_points_changed_since -g_unix_mount_monitor_get -g_unix_mount_monitor_new -g_unix_mount_monitor_set_rate_limit -g_unix_is_mount_path_system_internal -g_unix_is_system_fs_type -g_unix_is_system_device_path - -GUnixMountMonitorClass -G_UNIX_MOUNT_MONITOR -G_IS_UNIX_MOUNT_MONITOR -G_TYPE_UNIX_MOUNT_MONITOR -G_UNIX_MOUNT_MONITOR_CLASS -G_IS_UNIX_MOUNT_MONITOR_CLASS -G_TYPE_UNIX_MOUNT_ENTRY -G_TYPE_UNIX_MOUNT_POINT - -g_unix_mount_monitor_get_type -g_unix_mount_entry_get_type -g_unix_mount_point_get_type -
- -
-gdesktopappinfo -Desktop file based GAppInfo -GDesktopAppInfo -g_desktop_app_info_new_from_filename -g_desktop_app_info_new_from_keyfile -g_desktop_app_info_new -g_desktop_app_info_get_filename -g_desktop_app_info_get_is_hidden -g_desktop_app_info_get_nodisplay -g_desktop_app_info_get_show_in -g_desktop_app_info_get_generic_name -g_desktop_app_info_get_categories -g_desktop_app_info_get_keywords -g_desktop_app_info_get_startup_wm_class -g_desktop_app_info_set_desktop_env -g_desktop_app_info_get_string -g_desktop_app_info_get_locale_string -g_desktop_app_info_get_boolean -g_desktop_app_info_get_string_list -g_desktop_app_info_has_key -GDesktopAppLaunchCallback -g_desktop_app_info_launch_uris_as_manager -g_desktop_app_info_launch_uris_as_manager_with_fds - -g_desktop_app_info_list_actions -g_desktop_app_info_get_action_name -g_desktop_app_info_launch_action - -g_desktop_app_info_search -g_desktop_app_info_get_implementations - -GDesktopAppInfoLookup -GDesktopAppInfoLookupIface -G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME - -GDesktopAppInfoClass -G_TYPE_DESKTOP_APP_INFO -G_DESKTOP_APP_INFO -G_DESKTOP_APP_INFO_CLASS -G_IS_DESKTOP_APP_INFO -G_IS_DESKTOP_APP_INFO_CLASS -G_DESKTOP_APP_INFO_GET_CLASS -G_DESKTOP_APP_INFO_LOOKUP -G_DESKTOP_APP_INFO_LOOKUP_GET_IFACE -G_IS_DESKTOP_APP_INFO_LOOKUP -G_TYPE_DESKTOP_APP_INFO_LOOKUP - -g_desktop_app_info_get_type -g_desktop_app_info_lookup_get_default_for_uri_scheme -g_desktop_app_info_lookup_get_type -
- -
-giomodule -GIOModule -GIOModule -GIOModuleScope -GIOModuleScopeFlags -g_io_module_new -g_io_module_scope_block -g_io_module_scope_free -g_io_module_scope_new -g_io_modules_load_all_in_directory -g_io_modules_load_all_in_directory_with_scope -g_io_modules_scan_all_in_directory -g_io_modules_scan_all_in_directory_with_scope -g_io_module_load -g_io_module_unload -g_io_module_query - -GIOModuleClass -G_IO_MODULE -G_IO_IS_MODULE -G_IO_TYPE_MODULE -G_IO_MODULE_CLASS -G_IO_IS_MODULE_CLASS -G_IO_MODULE_GET_CLASS -G_TYPE_IO_MODULE_SCOPE_FLAGS - -g_io_module_get_type -g_io_module_scope_flags_get_type -
- -
-extensionpoints -Extension Points -GIOExtension -GIOExtensionPoint -g_io_extension_get_name -g_io_extension_get_priority -g_io_extension_get_type -g_io_extension_point_get_extension_by_name -g_io_extension_point_get_extensions -g_io_extension_point_get_required_type -g_io_extension_point_implement -g_io_extension_point_lookup -g_io_extension_point_register -g_io_extension_point_set_required_type -g_io_extension_ref_class -
- -
-gunixfdlist -GUnixFDList -GUnixFDList -g_unix_fd_list_new_from_array -g_unix_fd_list_new -g_unix_fd_list_get_length -g_unix_fd_list_get -g_unix_fd_list_peek_fds -g_unix_fd_list_steal_fds -g_unix_fd_list_append - -GUnixFDListClass -G_UNIX_FD_LIST -G_UNIX_FD_LIST_CLASS -G_IS_UNIX_FD_LIST -G_IS_UNIX_FD_LIST_CLASS -G_UNIX_FD_LIST_GET_CLASS -G_TYPE_UNIX_FD_LIST - -GUnixFDListPrivate -g_unix_fd_list_get_type -
- -
-ginetaddress -GInetAddress -GInetAddress -g_inet_address_new_from_string -g_inet_address_new_from_bytes -g_inet_address_new_any -g_inet_address_new_loopback -g_inet_address_equal -g_inet_address_to_bytes -g_inet_address_get_native_size -g_inet_address_to_string -g_inet_address_get_family -g_inet_address_get_is_any -g_inet_address_get_is_loopback -g_inet_address_get_is_link_local -g_inet_address_get_is_site_local -g_inet_address_get_is_multicast -g_inet_address_get_is_mc_link_local -g_inet_address_get_is_mc_node_local -g_inet_address_get_is_mc_site_local -g_inet_address_get_is_mc_org_local -g_inet_address_get_is_mc_global - -GInetAddressClass -GInetAddressPrivate -G_INET_ADDRESS -G_INET_ADDRESS_CLASS -G_INET_ADDRESS_GET_CLASS -G_IS_INET_ADDRESS -G_IS_INET_ADDRESS_CLASS -G_TYPE_INET_ADDRESS - -g_inet_address_get_type -
- -
-ginetaddressmask -GInetAddressMask -GInetAddressMask -g_inet_address_mask_new -g_inet_address_mask_new_from_string -g_inet_address_mask_to_string -g_inet_address_mask_get_family -g_inet_address_mask_get_address -g_inet_address_mask_get_length -g_inet_address_mask_matches -g_inet_address_mask_equal - -GInetAddressMaskClass -GInetAddressMaskPrivate -G_INET_ADDRESS_MASK -G_INET_ADDRESS_MASK_CLASS -G_INET_ADDRESS_MASK_GET_CLASS -G_IS_INET_ADDRESS_MASK -G_IS_INET_ADDRESS_MASK_CLASS -G_TYPE_INET_ADDRESS_MASK - -g_inet_address_mask_get_type -
- -
-gsocketaddress -GSocketAddress -GSocketAddress -GSocketFamily -g_socket_address_new_from_native -g_socket_address_get_family -g_socket_address_to_native -g_socket_address_get_native_size - -GSocketAddressClass -G_IS_SOCKET_ADDRESS -G_IS_SOCKET_ADDRESS_CLASS -G_SOCKET_ADDRESS -G_SOCKET_ADDRESS_CLASS -G_SOCKET_ADDRESS_GET_CLASS -G_TYPE_SOCKET_ADDRESS -G_TYPE_SOCKET_FAMILY - -g_socket_address_get_type -g_socket_family_get_type -
- -
-ginetsocketaddress -GInetSocketAddress -GInetSocketAddress -g_inet_socket_address_new -g_inet_socket_address_new_from_string -g_inet_socket_address_get_address -g_inet_socket_address_get_port -g_inet_socket_address_get_flowinfo -g_inet_socket_address_get_scope_id - -GInetSocketAddressClass -GInetSocketAddressPrivate -G_INET_SOCKET_ADDRESS -G_INET_SOCKET_ADDRESS_CLASS -G_INET_SOCKET_ADDRESS_GET_CLASS -G_IS_INET_SOCKET_ADDRESS -G_IS_INET_SOCKET_ADDRESS_CLASS -G_TYPE_INET_SOCKET_ADDRESS - -g_inet_socket_address_get_type -
- -
-gunixsocketaddress -GUnixSocketAddress -GUnixSocketAddress -GUnixSocketAddressType -g_unix_socket_address_new -g_unix_socket_address_new_abstract -g_unix_socket_address_new_with_type -g_unix_socket_address_get_is_abstract -g_unix_socket_address_get_address_type -g_unix_socket_address_get_path -g_unix_socket_address_get_path_len -g_unix_socket_address_abstract_names_supported - -GUnixSocketAddressClass -GUnixSocketAddressPrivate -G_IS_UNIX_SOCKET_ADDRESS -G_IS_UNIX_SOCKET_ADDRESS_CLASS -G_TYPE_UNIX_SOCKET_ADDRESS -G_UNIX_SOCKET_ADDRESS -G_UNIX_SOCKET_ADDRESS_CLASS -G_UNIX_SOCKET_ADDRESS_GET_CLASS -G_TYPE_UNIX_SOCKET_ADDRESS_TYPE - -g_unix_socket_address_get_type -g_unix_socket_address_type_get_type -
- -
-gnativesocketaddress -GNativeSocketAddress -GNativeSocketAddress -g_native_socket_address_new - -GNativeSocketAddressClass -GNativeSocketAddressPrivate -G_IS_NATIVE_SOCKET_ADDRESS -G_IS_NATIVE_SOCKET_ADDRESS_CLASS -G_TYPE_NATIVE_SOCKET_ADDRESS -G_NATIVE_SOCKET_ADDRESS -G_NATIVE_SOCKET_ADDRESS_CLASS -G_NATIVE_SOCKET_ADDRESS_GET_CLASS -G_TYPE_NATIVE_SOCKET_ADDRESS_TYPE - -g_native_socket_address_get_type -
- -
-gresolver -GResolver -GResolver -g_resolver_get_default -g_resolver_set_default -g_resolver_lookup_by_name -g_resolver_lookup_by_name_async -g_resolver_lookup_by_name_finish -GResolverNameLookupFlags -g_resolver_lookup_by_name_with_flags -g_resolver_lookup_by_name_with_flags_async -g_resolver_lookup_by_name_with_flags_finish -g_resolver_free_addresses -g_resolver_lookup_by_address -g_resolver_lookup_by_address_async -g_resolver_lookup_by_address_finish -g_resolver_lookup_service -g_resolver_lookup_service_async -g_resolver_lookup_service_finish -g_resolver_free_targets -g_resolver_get_timeout -g_resolver_set_timeout - -GResolverRecordType -g_resolver_lookup_records -g_resolver_lookup_records_async -g_resolver_lookup_records_finish - - -G_RESOLVER_ERROR -GResolverError - - -GResolverClass -G_IS_RESOLVER -G_IS_RESOLVER_CLASS -G_RESOLVER -G_RESOLVER_CLASS -G_RESOLVER_GET_CLASS -G_TYPE_RESOLVER -G_TYPE_RESOLVER_ERROR -G_TYPE_RESOLVER_RECORD_TYPE -G_TYPE_RESOLVER_NAME_LOOKUP_FLAGS - - -GResolverPrivate -g_resolver_get_type -g_resolver_error_quark -g_resolver_record_type_get_type -g_resolver_error_get_type -g_resolver_name_lookup_flags_get_type -
- -
-gsrvtarget -GSrvTarget -GSrvTarget -g_srv_target_new -g_srv_target_copy -g_srv_target_free -g_srv_target_get_hostname -g_srv_target_get_port -g_srv_target_get_priority -g_srv_target_get_weight -g_srv_target_list_sort - -G_TYPE_SRV_TARGET - -g_srv_target_get_type -
- -
-gsocketconnectable -GSocketConnectable -GSocketConnectable -GSocketConnectableIface -g_socket_connectable_enumerate -g_socket_connectable_proxy_enumerate -g_socket_connectable_to_string - -G_IS_SOCKET_CONNECTABLE -G_SOCKET_CONNECTABLE -G_SOCKET_CONNECTABLE_GET_IFACE -G_TYPE_SOCKET_CONNECTABLE - -g_socket_connectable_get_type -
- -
-gsocketaddressenumerator -GSocketAddressEnumerator -GSocketAddressEnumerator -GSocketAddressEnumeratorClass -g_socket_address_enumerator_next -g_socket_address_enumerator_next_async -g_socket_address_enumerator_next_finish - -G_IS_SOCKET_ADDRESS_ENUMERATOR -G_IS_SOCKET_ADDRESS_ENUMERATOR_CLASS -G_SOCKET_ADDRESS_ENUMERATOR -G_SOCKET_ADDRESS_ENUMERATOR_CLASS -G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS -G_TYPE_SOCKET_ADDRESS_ENUMERATOR - -g_socket_address_enumerator_get_type -
- -
-gproxyaddressenumerator -GProxyAddressEnumerator -GProxyAddressEnumerator -GProxyAddressEnumeratorClass - -G_IS_PROXY_ADDRESS_ENUMERATOR -G_IS_PROXY_ADDRESS_ENUMERATOR_CLASS -G_PROXY_ADDRESS_ENUMERATOR -G_PROXY_ADDRESS_ENUMERATOR_CLASS -G_PROXY_ADDRESS_ENUMERATOR_GET_CLASS -G_TYPE_PROXY_ADDRESS_ENUMERATOR - -GProxyAddressEnumeratorPrivate -g_proxy_address_enumerator_get_type -
- -
-gnetworkaddress -GNetworkAddress -GNetworkAddress -g_network_address_new -g_network_address_new_loopback -g_network_address_parse -g_network_address_parse_uri -g_network_address_get_hostname -g_network_address_get_port -g_network_address_get_scheme - -GNetworkAddressClass -GNetworkAddressPrivate -G_IS_NETWORK_ADDRESS -G_IS_NETWORK_ADDRESS_CLASS -G_NETWORK_ADDRESS -G_NETWORK_ADDRESS_CLASS -G_NETWORK_ADDRESS_GET_CLASS -G_TYPE_NETWORK_ADDRESS - -g_network_address_get_type -
- -
-gnetworkservice -GNetworkService -GNetworkService -g_network_service_new -g_network_service_get_service -g_network_service_get_protocol -g_network_service_get_domain -g_network_service_get_scheme -g_network_service_set_scheme - -GNetworkServiceClass -GNetworkServicePrivate -G_IS_NETWORK_SERVICE -G_IS_NETWORK_SERVICE_CLASS -G_NETWORK_SERVICE -G_NETWORK_SERVICE_CLASS -G_NETWORK_SERVICE_GET_CLASS -G_TYPE_NETWORK_SERVICE - -g_network_service_get_type -
- -
-gdatagrambased -GDatagramBased -GDatagramBased -GDatagramBasedInterface -GDatagramBasedSourceFunc -g_datagram_based_receive_messages -g_datagram_based_send_messages -g_datagram_based_create_source -g_datagram_based_condition_check -g_datagram_based_condition_wait - -G_DATAGRAM_BASED -G_DATAGRAM_BASED_GET_IFACE -G_IS_DATAGRAM_BASED -G_TYPE_DATAGRAM_BASED -G_TYPE_IS_DATAGRAM_BASED - -g_datagram_based_get_type -
- -
-gsocket -GSocket -GSocket -GSocketSourceFunc -GSocketType -GSocketProtocol -GSocketMsgFlags -GInputVector -GInputMessage -GOutputVector -GOutputMessage -g_socket_new -g_socket_new_from_fd -g_socket_bind -g_socket_listen -g_socket_accept -g_socket_connect -g_socket_check_connect_result -g_socket_receive -g_socket_receive_from -g_socket_receive_message -g_socket_receive_messages -g_socket_receive_with_blocking -g_socket_send -g_socket_send_to -g_socket_send_message -g_socket_send_message_with_timeout -g_socket_send_messages -g_socket_send_with_blocking -g_socket_close -g_socket_is_closed -g_socket_shutdown -g_socket_is_connected -g_socket_create_source -g_socket_condition_check -g_socket_condition_wait -g_socket_condition_timed_wait -g_socket_get_available_bytes -g_socket_set_listen_backlog -g_socket_get_listen_backlog -g_socket_get_blocking -g_socket_set_blocking -g_socket_get_keepalive -g_socket_set_keepalive -g_socket_get_timeout -g_socket_set_timeout -g_socket_set_ttl -g_socket_get_ttl -g_socket_get_broadcast -g_socket_set_broadcast -g_socket_get_option -g_socket_set_option -g_socket_get_family -g_socket_get_fd -g_socket_get_local_address -g_socket_get_protocol -g_socket_get_remote_address -g_socket_get_socket_type -g_socket_speaks_ipv4 -g_socket_get_credentials - -g_socket_join_multicast_group -g_socket_leave_multicast_group -g_socket_join_multicast_group_ssm -g_socket_leave_multicast_group_ssm -g_socket_get_multicast_loopback -g_socket_set_multicast_loopback -g_socket_get_multicast_ttl -g_socket_set_multicast_ttl - -GSocketClass -G_IS_SOCKET -G_IS_SOCKET_CLASS -G_SOCKET -G_SOCKET_CLASS -G_TYPE_SOCKET -G_SOCKET_GET_CLASS -G_TYPE_SOCKET_MSG_FLAGS -G_TYPE_SOCKET_PROTOCOL -G_TYPE_SOCKET_TYPE - -g_socket_get_type -GSocketPrivate -g_socket_msg_flags_get_type -g_socket_protocol_get_type -g_socket_type_get_type -
- -
-gsocketclient -GSocketClient -GSocketClient -GSocketClientEvent -g_socket_client_new -g_socket_client_connect -g_socket_client_connect_async -g_socket_client_connect_finish -g_socket_client_connect_to_host -g_socket_client_connect_to_host_async -g_socket_client_connect_to_host_finish -g_socket_client_connect_to_service -g_socket_client_connect_to_service_async -g_socket_client_connect_to_service_finish -g_socket_client_connect_to_uri -g_socket_client_connect_to_uri_async -g_socket_client_connect_to_uri_finish -g_socket_client_set_family -g_socket_client_set_local_address -g_socket_client_set_protocol -g_socket_client_set_socket_type -g_socket_client_set_timeout -g_socket_client_set_enable_proxy -g_socket_client_set_proxy_resolver -g_socket_client_set_tls -g_socket_client_set_tls_validation_flags -g_socket_client_get_family -g_socket_client_get_local_address -g_socket_client_get_protocol -g_socket_client_get_socket_type -g_socket_client_get_timeout -g_socket_client_get_enable_proxy -g_socket_client_get_proxy_resolver -g_socket_client_get_tls -g_socket_client_get_tls_validation_flags -g_socket_client_add_application_proxy - -GSocketClientClass -G_IS_SOCKET_CLIENT -G_IS_SOCKET_CLIENT_CLASS -G_SOCKET_CLIENT -G_SOCKET_CLIENT_CLASS -G_SOCKET_CLIENT_GET_CLASS -G_TYPE_SOCKET_CLIENT -G_TYPE_SOCKET_CLIENT_EVENT - -GSocketClientPrivate -g_socket_client_get_type -g_socket_client_event_get_type -
- -
-gsocketconnection -GSocketConnection -GSocketConnection -g_socket_connection_connect -g_socket_connection_connect_async -g_socket_connection_connect_finish - -g_socket_connection_is_connected -g_socket_connection_get_local_address -g_socket_connection_get_remote_address -g_socket_connection_get_socket - -g_socket_connection_factory_create_connection -g_socket_connection_factory_lookup_type -g_socket_connection_factory_register_type - -GSocketConnectionClass -G_IS_SOCKET_CONNECTION -G_IS_SOCKET_CONNECTION_CLASS -G_SOCKET_CONNECTION -G_SOCKET_CONNECTION_CLASS -G_SOCKET_CONNECTION_GET_CLASS -G_TYPE_SOCKET_CONNECTION - -GSocketConnectionPrivate -g_socket_connection_get_type -
- -
-gunixconnection -GUnixConnection -GUnixConnection -g_unix_connection_receive_fd -g_unix_connection_send_fd -g_unix_connection_receive_credentials -g_unix_connection_receive_credentials_async -g_unix_connection_receive_credentials_finish -g_unix_connection_send_credentials -g_unix_connection_send_credentials_async -g_unix_connection_send_credentials_finish - -GUnixConnectionClass -G_IS_UNIX_CONNECTION -G_IS_UNIX_CONNECTION_CLASS -G_TYPE_UNIX_CONNECTION -G_UNIX_CONNECTION -G_UNIX_CONNECTION_CLASS -G_UNIX_CONNECTION_GET_CLASS - -GUnixConnectionPrivate -g_unix_connection_get_type -
- -
-gtcpconnection -GTcpConnection -GTcpConnection -g_tcp_connection_set_graceful_disconnect -g_tcp_connection_get_graceful_disconnect - -GTcpConnectionClass -G_IS_TCP_CONNECTION -G_IS_TCP_CONNECTION_CLASS -G_TYPE_TCP_CONNECTION -G_TCP_CONNECTION -G_TCP_CONNECTION_CLASS -G_TCP_CONNECTION_GET_CLASS - -GTcpConnectionPrivate -g_tcp_connection_get_type -
- -
-gtcpwrapperconnection -GTcpWrapperConnection -GTcpWrapperConnection -g_tcp_wrapper_connection_new -g_tcp_wrapper_connection_get_base_io_stream - -GTcpWrapperConnectionClass -G_IS_TCP_WRAPPER_CONNECTION -G_IS_TCP_WRAPPER_CONNECTION_CLASS -G_TYPE_TCP_WRAPPER_CONNECTION -G_TCP_WRAPPER_CONNECTION -G_TCP_WRAPPER_CONNECTION_CLASS -G_TCP_WRAPPER_CONNECTION_GET_CLASS - -GTcpWrapperConnectionPrivate -g_tcp_wrapper_connection_get_type -
- -
-gsocketcontrolmessage -GSocketControlMessage -GSocketControlMessage -g_socket_control_message_deserialize -g_socket_control_message_get_level -g_socket_control_message_get_msg_type -g_socket_control_message_get_size -g_socket_control_message_serialize - -GSocketControlMessageClass -G_IS_SOCKET_CONTROL_MESSAGE -G_IS_SOCKET_CONTROL_MESSAGE_CLASS -G_SOCKET_CONTROL_MESSAGE -G_SOCKET_CONTROL_MESSAGE_CLASS -G_SOCKET_CONTROL_MESSAGE_GET_CLASS -G_TYPE_SOCKET_CONTROL_MESSAGE - -GSocketControlMessagePrivate -g_socket_control_message_get_type -
- -
-gsocketlistener -GSocketListener -GSocketListener -GSocketListenerEvent -g_socket_listener_new -g_socket_listener_add_socket -g_socket_listener_add_address -g_socket_listener_add_inet_port -g_socket_listener_add_any_inet_port -g_socket_listener_accept -g_socket_listener_accept_async -g_socket_listener_accept_finish -g_socket_listener_accept_socket -g_socket_listener_accept_socket_async -g_socket_listener_accept_socket_finish -g_socket_listener_close -g_socket_listener_set_backlog - -GSocketListenerClass -G_IS_SOCKET_LISTENER -G_IS_SOCKET_LISTENER_CLASS -G_SOCKET_LISTENER -G_SOCKET_LISTENER_CLASS -G_SOCKET_LISTENER_GET_CLASS -G_TYPE_SOCKET_LISTENER -G_TYPE_SOCKET_LISTENER_EVENT - -GSocketListenerPrivate -g_socket_listener_get_type -g_socket_listener_event_get_type -
- -
-gsocketservice -GSocketService -GSocketService -g_socket_service_new -g_socket_service_start -g_socket_service_stop -g_socket_service_is_active - -GSocketServiceClass -G_IS_SOCKET_SERVICE -G_IS_SOCKET_SERVICE_CLASS -G_SOCKET_SERVICE -G_SOCKET_SERVICE_CLASS -G_SOCKET_SERVICE_GET_CLASS -G_TYPE_SOCKET_SERVICE - -GSocketServicePrivate -g_socket_service_get_type -
- -
-gthreadedsocketservice -GThreadedSocketService -GThreadedSocketService -g_threaded_socket_service_new - -GThreadedSocketServiceClass -G_IS_THREADED_SOCKET_SERVICE -G_IS_THREADED_SOCKET_SERVICE_CLASS -G_THREADED_SOCKET_SERVICE -G_THREADED_SOCKET_SERVICE_CLASS -G_THREADED_SOCKET_SERVICE_GET_CLASS -G_TYPE_THREADED_SOCKET_SERVICE - -GThreadedSocketServicePrivate -g_threaded_socket_service_get_type -
- -
-gunixfdmessage -GUnixFDMessage -GUnixFDMessage -g_unix_fd_message_new_with_fd_list -g_unix_fd_message_new -g_unix_fd_message_get_fd_list -g_unix_fd_message_append_fd -g_unix_fd_message_steal_fds - -GUnixFDMessageClass -G_IS_UNIX_FD_MESSAGE -G_IS_UNIX_FD_MESSAGE_CLASS -G_TYPE_UNIX_FD_MESSAGE -G_UNIX_FD_MESSAGE -G_UNIX_FD_MESSAGE_CLASS -G_UNIX_FD_MESSAGE_GET_CLASS - -GUnixFDMessagePrivate -g_unix_fd_message_get_type -
- -
-gconverter -GConverter -GConverter -GConverterIface -GConverterResult -GConverterFlags -g_converter_convert -g_converter_reset - -G_TYPE_CONVERTER -G_CONVERTER -G_IS_CONVERTER -G_CONVERTER_GET_IFACE -G_TYPE_CONVERTER_FLAGS -G_TYPE_CONVERTER_RESULT - -g_converter_get_type -g_converter_flags_get_type -g_converter_result_get_type -
- -
-gcharsetconverter -GCharsetConverter -GCharsetConverter -g_charset_converter_new -g_charset_converter_set_use_fallback -g_charset_converter_get_use_fallback -g_charset_converter_get_num_fallbacks - -GCharsetConverterClass -G_TYPE_CHARSET_CONVERTER -G_CHARSET_CONVERTER -G_IS_CHARSET_CONVERTER -G_CHARSET_CONVERTER_CLASS -G_IS_CHARSET_CONVERTER_CLASS -G_CHARSET_CONVERTER_GET_CLASS - -g_charset_converter_get_type -
- -
-gconverterinputstream -GConverterInputStream -GConverterInputStream -g_converter_input_stream_new -g_converter_input_stream_get_converter - -GConverterInputStreamClass -G_TYPE_CONVERTER_INPUT_STREAM -G_CONVERTER_INPUT_STREAM -G_IS_CONVERTER_INPUT_STREAM -G_CONVERTER_INPUT_STREAM_CLASS -G_IS_CONVERTER_INPUT_STREAM_CLASS -G_CONVERTER_INPUT_STREAM_GET_CLASS - -GConverterInputStreamPrivate -g_converter_input_stream_get_type -
- -
-gconverteroutputstream -GConverterOutputStream -GConverterOutputStream -g_converter_output_stream_new -g_converter_output_stream_get_converter - -GConverterOutputStreamClass -G_TYPE_CONVERTER_OUTPUT_STREAM -G_CONVERTER_OUTPUT_STREAM -G_IS_CONVERTER_OUTPUT_STREAM -G_CONVERTER_OUTPUT_STREAM_CLASS -G_IS_CONVERTER_OUTPUT_STREAM_CLASS -G_CONVERTER_OUTPUT_STREAM_GET_CLASS - -GConverterOutputStreamPrivate -g_converter_output_stream_get_type -
- -
-gzlibcompressor -GZlibCompressor -GZlibCompressor -GZlibCompressorFormat -g_zlib_compressor_new -g_zlib_compressor_get_file_info -g_zlib_compressor_set_file_info - -GZlibCompressorClass -G_TYPE_ZLIB_COMPRESSOR -G_ZLIB_COMPRESSOR -G_IS_ZLIB_COMPRESSOR -G_ZLIB_COMPRESSOR_CLASS -G_IS_ZLIB_COMPRESSOR_CLASS -G_ZLIB_COMPRESSOR_GET_CLASS -G_TYPE_ZLIB_COMPRESSOR_FORMAT - -g_zlib_compressor_get_type -g_zlib_compressor_format_get_type -
- -
-gzlibdecompressor -GZlibDecompressor -GZlibDecompressor -g_zlib_decompressor_new -g_zlib_decompressor_get_file_info - -GZlibDecompressorClass -G_TYPE_ZLIB_DECOMPRESSOR -G_ZLIB_DECOMPRESSOR -G_IS_ZLIB_DECOMPRESSOR -G_ZLIB_DECOMPRESSOR_CLASS -G_IS_ZLIB_DECOMPRESSOR_CLASS -G_ZLIB_DECOMPRESSOR_GET_CLASS - -g_zlib_decompressor_get_type -
- -
-gfiledescriptorbased -GFileDescriptorBased -GFileDescriptorBased -GFileDescriptorBasedIface -g_file_descriptor_based_get_fd - -g_file_descriptor_based_get_type -G_FILE_DESCRIPTOR_BASED -G_FILE_DESCRIPTOR_BASED_GET_IFACE -G_IS_FILE_DESCRIPTOR_BASED -G_TYPE_FILE_DESCRIPTOR_BASED -
- -
-gsettingsbackend -GSettingsBackend -GSettingsBackend -GSettingsBackendClass -G_SETTINGS_BACKEND_EXTENSION_POINT_NAME -g_settings_backend_get_default -g_settings_backend_changed -g_settings_backend_path_changed -g_settings_backend_keys_changed -g_settings_backend_path_writable_changed -g_settings_backend_writable_changed -g_settings_backend_changed_tree -g_settings_backend_flatten_tree -g_keyfile_settings_backend_new -g_memory_settings_backend_new -g_null_settings_backend_new - - -G_IS_SETTINGS_BACKEND -G_IS_SETTINGS_BACKEND_CLASS -G_SETTINGS_BACKEND -G_SETTINGS_BACKEND_CLASS -G_SETTINGS_BACKEND_GET_CLASS -G_TYPE_SETTINGS_BACKEND - - -g_settings_backend_get_type -GSettingsBackendPrivate -
- -
-gsettingsschema -GSettingsSchema, GSettingsSchemaSource -GSettingsSchemaSource -g_settings_schema_source_get_default -g_settings_schema_source_ref -g_settings_schema_source_unref - - -g_settings_schema_source_new_from_directory - - -g_settings_schema_source_list_schemas -g_settings_schema_source_lookup - - -GSettingsSchema -g_settings_schema_ref -g_settings_schema_unref - - -g_settings_schema_get_id -g_settings_schema_get_path - - -GSettingsSchemaKey -g_settings_schema_has_key -g_settings_schema_get_key -g_settings_schema_key_ref -g_settings_schema_key_unref -g_settings_schema_list_children -g_settings_schema_list_keys - - -g_settings_schema_key_get_value_type -g_settings_schema_key_get_default_value -g_settings_schema_key_get_range -g_settings_schema_key_range_check - - -g_settings_schema_key_get_name -g_settings_schema_key_get_summary -g_settings_schema_key_get_description - - -G_TYPE_SETTINGS_SCHEMA_KEY -G_TYPE_SETTINGS_SCHEMA -G_TYPE_SETTINGS_SCHEMA_SOURCE - - -g_settings_schema_get_type -g_settings_schema_key_get_type -g_settings_schema_source_get_type -
- -
-gsettings -GSettings -GSettings -g_settings_new -g_settings_new_with_path -g_settings_new_with_backend -g_settings_new_with_backend_and_path -g_settings_new_full -g_settings_sync -g_settings_get_value -g_settings_set_value -g_settings_is_writable -g_settings_delay -g_settings_apply -g_settings_revert -g_settings_get_has_unapplied -g_settings_get_child -g_settings_reset -g_settings_get_user_value -g_settings_get_default_value - - -g_settings_list_schemas -g_settings_list_relocatable_schemas -g_settings_list_keys -g_settings_list_children -g_settings_get_range -g_settings_range_check - - -g_settings_get -g_settings_set -g_settings_get_boolean -g_settings_set_boolean -g_settings_get_int -g_settings_set_int -g_settings_get_int64 -g_settings_set_int64 -g_settings_get_uint -g_settings_set_uint -g_settings_get_uint64 -g_settings_set_uint64 -g_settings_get_double -g_settings_set_double -g_settings_get_string -g_settings_set_string -g_settings_get_strv -g_settings_set_strv -g_settings_get_enum -g_settings_set_enum -g_settings_get_flags -g_settings_set_flags - - -GSettingsGetMapping -g_settings_get_mapped - - -GSettingsBindFlags -g_settings_bind -g_settings_bind_with_mapping -g_settings_bind_writable -g_settings_unbind -GSettingsBindSetMapping -GSettingsBindGetMapping - - -g_settings_create_action - - -GSettingsClass -G_IS_SETTINGS -G_IS_SETTINGS_CLASS -G_SETTINGS -G_SETTINGS_CLASS -G_SETTINGS_GET_CLASS -G_TYPE_SETTINGS -G_TYPE_SETTINGS_BIND_FLAGS - - -GSettingsPrivate -g_settings_get_type -g_settings_bind_flags_get_type -
- -
-gunixcredentialsmessage -GUnixCredentialsMessage -GUnixCredentialsMessage -GUnixCredentialsMessageClass -g_unix_credentials_message_new -g_unix_credentials_message_new_with_credentials -g_unix_credentials_message_get_credentials -g_unix_credentials_message_is_supported - -G_IS_UNIX_CREDENTIALS_MESSAGE -G_IS_UNIX_CREDENTIALS_MESSAGE_CLASS -G_TYPE_UNIX_CREDENTIALS_MESSAGE -G_UNIX_CREDENTIALS_MESSAGE -G_UNIX_CREDENTIALS_MESSAGE_CLASS -G_UNIX_CREDENTIALS_MESSAGE_GET_CLASS - -GUnixCredentialsMessagePrivate -g_unix_credentials_message_get_type -
- -
-gcredentials -GCredentials -GCredentials -GCredentialsType -g_credentials_new -g_credentials_to_string -g_credentials_get_native -g_credentials_set_native -g_credentials_is_same_user -g_credentials_get_unix_user -g_credentials_set_unix_user -g_credentials_get_unix_pid - -G_CREDENTIALS -G_IS_CREDENTIALS -G_TYPE_CREDENTIALS -G_CREDENTIALS_CLASS -G_IS_CREDENTIALS_CLASS -G_CREDENTIALS_GET_CLASS -G_TYPE_CREDENTIALS_TYPE - -g_credentials_get_type -g_credentials_type_get_type -G_CREDENTIALS_NATIVE_SIZE -G_CREDENTIALS_NATIVE_TYPE -G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED -G_CREDENTIALS_SPOOFING_SUPPORTED -G_CREDENTIALS_SUPPORTED -G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED -G_CREDENTIALS_USE_FREEBSD_CMSGCRED -G_CREDENTIALS_USE_LINUX_UCRED -G_CREDENTIALS_USE_OPENBSD_SOCKPEERCRED -G_CREDENTIALS_USE_SOLARIS_UCRED -
- -
-gdbusaddress -g_dbus_is_address -g_dbus_is_supported_address -g_dbus_address_get_stream -g_dbus_address_get_stream_finish -g_dbus_address_get_stream_sync -g_dbus_address_get_for_bus_sync -g_dbus_address_escape_value -
- -
-gdbusutils -g_dbus_generate_guid -g_dbus_is_guid -g_dbus_is_name -g_dbus_is_unique_name -g_dbus_is_member_name -g_dbus_is_interface_name -g_dbus_is_error_name -g_dbus_gvalue_to_gvariant -g_dbus_gvariant_to_gvalue -g_dbus_escape_object_path_bytestring -g_dbus_escape_object_path -g_dbus_unescape_object_path -
- -
-gdbusauthobserver -GDBusAuthObserver -GDBusAuthObserver -g_dbus_auth_observer_new -g_dbus_auth_observer_authorize_authenticated_peer -g_dbus_auth_observer_allow_mechanism - -G_DBUS_AUTH_OBSERVER -G_IS_DBUS_AUTH_OBSERVER -G_TYPE_DBUS_AUTH_OBSERVER - -g_dbus_auth_observer_get_type -
- -
-gdbusserver -GDBusServer -GDBusServer -GDBusServerFlags -g_dbus_server_new_sync -g_dbus_server_start -g_dbus_server_stop -g_dbus_server_is_active -g_dbus_server_get_guid -g_dbus_server_get_flags -g_dbus_server_get_client_address - -G_DBUS_SERVER -G_IS_DBUS_SERVER -G_TYPE_DBUS_SERVER -G_TYPE_DBUS_SERVER_FLAGS - -g_dbus_server_get_type -g_dbus_server_flags_get_type -
- -
-gdbusmessage -GDBusMessage -GDBusMessage -GDBusMessageType -GDBusMessageFlags -GDBusMessageHeaderField -GDBusMessageByteOrder -g_dbus_message_new -g_dbus_message_new_signal -g_dbus_message_new_method_call -g_dbus_message_new_method_reply -g_dbus_message_new_method_error -g_dbus_message_new_method_error_valist -g_dbus_message_new_method_error_literal -g_dbus_message_print -g_dbus_message_get_locked -g_dbus_message_lock -g_dbus_message_copy -g_dbus_message_get_byte_order -g_dbus_message_set_byte_order -g_dbus_message_get_message_type -g_dbus_message_set_message_type -g_dbus_message_get_serial -g_dbus_message_set_serial -g_dbus_message_get_flags -g_dbus_message_set_flags -g_dbus_message_get_body -g_dbus_message_set_body -g_dbus_message_get_unix_fd_list -g_dbus_message_set_unix_fd_list -g_dbus_message_get_num_unix_fds -g_dbus_message_set_num_unix_fds -g_dbus_message_get_header_fields -g_dbus_message_get_header -g_dbus_message_set_header -g_dbus_message_get_destination -g_dbus_message_set_destination -g_dbus_message_get_error_name -g_dbus_message_set_error_name -g_dbus_message_get_interface -g_dbus_message_set_interface -g_dbus_message_get_member -g_dbus_message_set_member -g_dbus_message_get_path -g_dbus_message_set_path -g_dbus_message_get_reply_serial -g_dbus_message_set_reply_serial -g_dbus_message_get_sender -g_dbus_message_set_sender -g_dbus_message_get_signature -g_dbus_message_set_signature -g_dbus_message_get_arg0 -g_dbus_message_to_blob -g_dbus_message_bytes_needed -g_dbus_message_new_from_blob -g_dbus_message_to_gerror - -G_DBUS_MESSAGE -G_IS_DBUS_MESSAGE -G_TYPE_DBUS_MESSAGE -G_TYPE_DBUS_MESSAGE_BYTE_ORDER -G_TYPE_DBUS_MESSAGE_FLAGS -G_TYPE_DBUS_MESSAGE_HEADER_FIELD -G_TYPE_DBUS_MESSAGE_TYPE - -g_dbus_message_get_type -g_dbus_message_byte_order_get_type -g_dbus_message_flags_get_type -g_dbus_message_header_field_get_type -g_dbus_message_type_get_type -
- -
-gdbusconnection -GDBusConnection -GBusType -g_bus_get -g_bus_get_finish -g_bus_get_sync -GDBusConnection -GDBusConnectionFlags -g_dbus_connection_new -g_dbus_connection_new_finish -g_dbus_connection_new_sync -g_dbus_connection_new_for_address -g_dbus_connection_new_for_address_finish -g_dbus_connection_new_for_address_sync -g_dbus_connection_start_message_processing -g_dbus_connection_close -g_dbus_connection_close_finish -g_dbus_connection_close_sync -g_dbus_connection_is_closed -g_dbus_connection_flush -g_dbus_connection_flush_finish -g_dbus_connection_flush_sync -g_dbus_connection_get_exit_on_close -g_dbus_connection_set_exit_on_close -g_dbus_connection_get_stream -g_dbus_connection_get_flags -g_dbus_connection_get_guid -g_dbus_connection_get_unique_name -GDBusCapabilityFlags -g_dbus_connection_get_capabilities -g_dbus_connection_get_peer_credentials -g_dbus_connection_get_last_serial -GDBusCallFlags -g_dbus_connection_call -g_dbus_connection_call_finish -g_dbus_connection_call_sync -g_dbus_connection_call_with_unix_fd_list -g_dbus_connection_call_with_unix_fd_list_finish -g_dbus_connection_call_with_unix_fd_list_sync -g_dbus_connection_emit_signal -GDBusSignalFlags -GDBusSignalCallback -g_dbus_connection_signal_subscribe -g_dbus_connection_signal_unsubscribe -GDBusSendMessageFlags -g_dbus_connection_send_message -g_dbus_connection_send_message_with_reply -g_dbus_connection_send_message_with_reply_finish -g_dbus_connection_send_message_with_reply_sync -GDBusMessageFilterFunction -g_dbus_connection_add_filter -g_dbus_connection_remove_filter -GDBusInterfaceVTable -GDBusInterfaceMethodCallFunc -GDBusInterfaceGetPropertyFunc -GDBusInterfaceSetPropertyFunc -g_dbus_connection_register_object -g_dbus_connection_unregister_object -g_dbus_connection_register_object_with_closures -GDBusSubtreeVTable -GDBusSubtreeEnumerateFunc -GDBusSubtreeIntrospectFunc -GDBusSubtreeDispatchFunc -GDBusSubtreeFlags -g_dbus_connection_register_subtree -g_dbus_connection_unregister_subtree - -G_DBUS_CONNECTION -G_IS_DBUS_CONNECTION -G_TYPE_DBUS_CONNECTION -G_TYPE_BUS_TYPE -G_TYPE_DBUS_CALL_FLAGS -G_TYPE_DBUS_CAPABILITY_FLAGS -G_TYPE_DBUS_CONNECTION_FLAGS -G_TYPE_DBUS_SEND_MESSAGE_FLAGS -G_TYPE_DBUS_SIGNAL_FLAGS -G_TYPE_DBUS_SUBTREE_FLAGS - -g_dbus_connection_get_type -g_bus_type_get_type -g_dbus_call_flags_get_type -g_dbus_capability_flags_get_type -g_dbus_connection_flags_get_type -g_dbus_send_message_flags_get_type -g_dbus_signal_flags_get_type -g_dbus_subtree_flags_get_type -
- -
-gdbusmethodinvocation -GDBusMethodInvocation -GDBusMethodInvocation -g_dbus_method_invocation_get_sender -g_dbus_method_invocation_get_object_path -g_dbus_method_invocation_get_interface_name -g_dbus_method_invocation_get_method_name -g_dbus_method_invocation_get_method_info -g_dbus_method_invocation_get_property_info -g_dbus_method_invocation_get_connection -g_dbus_method_invocation_get_message -g_dbus_method_invocation_get_parameters -g_dbus_method_invocation_get_user_data -g_dbus_method_invocation_return_value -g_dbus_method_invocation_return_error -g_dbus_method_invocation_return_error_valist -g_dbus_method_invocation_return_error_literal -g_dbus_method_invocation_return_gerror -g_dbus_method_invocation_return_dbus_error -g_dbus_method_invocation_take_error -g_dbus_method_invocation_return_value_with_unix_fd_list -G_DBUS_METHOD_INVOCATION_HANDLED -G_DBUS_METHOD_INVOCATION_UNHANDLED - -G_DBUS_METHOD_INVOCATION -G_IS_DBUS_METHOD_INVOCATION -G_TYPE_DBUS_METHOD_INVOCATION - -g_dbus_method_invocation_get_type -
- -
-gdbusnameowning -GBusAcquiredCallback -GBusNameAcquiredCallback -GBusNameLostCallback -GBusNameOwnerFlags -g_bus_own_name -g_bus_own_name_on_connection -g_bus_unown_name -g_bus_own_name_with_closures -g_bus_own_name_on_connection_with_closures - - -G_TYPE_BUS_NAME_OWNER_FLAGS - -g_bus_name_owner_flags_get_type -
- -
-gdbusnamewatching -GBusNameAppearedCallback -GBusNameVanishedCallback -GBusNameWatcherFlags -g_bus_watch_name -g_bus_watch_name_on_connection -g_bus_unwatch_name -g_bus_watch_name_with_closures -g_bus_watch_name_on_connection_with_closures - - -G_TYPE_BUS_NAME_WATCHER_FLAGS - -g_bus_name_watcher_flags_get_type -
- -
-gdbuserror -GDBusError -G_DBUS_ERROR -g_dbus_error_is_remote_error -g_dbus_error_get_remote_error -g_dbus_error_strip_remote_error -GDBusErrorEntry -g_dbus_error_register_error_domain -g_dbus_error_register_error -g_dbus_error_unregister_error -g_dbus_error_new_for_dbus_error -g_dbus_error_set_dbus_error -g_dbus_error_set_dbus_error_valist -g_dbus_error_encode_gerror - -G_TYPE_DBUS_ERROR -g_dbus_error_quark -g_dbus_error_get_type -
- -
-gdbusproxy -GDBusProxy -GDBusProxyFlags -GDBusProxy -GDBusProxyClass -g_dbus_proxy_new -g_dbus_proxy_new_finish -g_dbus_proxy_new_sync -g_dbus_proxy_new_for_bus -g_dbus_proxy_new_for_bus_finish -g_dbus_proxy_new_for_bus_sync -g_dbus_proxy_get_flags -g_dbus_proxy_get_connection -g_dbus_proxy_get_name -g_dbus_proxy_get_name_owner -g_dbus_proxy_get_object_path -g_dbus_proxy_get_interface_name -g_dbus_proxy_get_default_timeout -g_dbus_proxy_set_default_timeout -g_dbus_proxy_get_cached_property -g_dbus_proxy_set_cached_property -g_dbus_proxy_get_cached_property_names -g_dbus_proxy_set_interface_info -g_dbus_proxy_get_interface_info -g_dbus_proxy_call -g_dbus_proxy_call_finish -g_dbus_proxy_call_sync -g_dbus_proxy_call_with_unix_fd_list -g_dbus_proxy_call_with_unix_fd_list_finish -g_dbus_proxy_call_with_unix_fd_list_sync - -G_DBUS_PROXY -G_IS_DBUS_PROXY -G_TYPE_DBUS_PROXY -G_DBUS_PROXY_CLASS -G_IS_DBUS_PROXY_CLASS -G_DBUS_PROXY_GET_CLASS -G_TYPE_DBUS_PROXY_FLAGS - -GDBusProxyPrivate -g_dbus_proxy_get_type -g_dbus_proxy_flags_get_type -
- -
-gdbusintrospection -GDBusAnnotationInfo -GDBusArgInfo -GDBusMethodInfo -GDBusSignalInfo -GDBusPropertyInfoFlags -GDBusPropertyInfo -GDBusInterfaceInfo -GDBusNodeInfo -g_dbus_annotation_info_lookup -g_dbus_interface_info_lookup_method -g_dbus_interface_info_lookup_signal -g_dbus_interface_info_lookup_property -g_dbus_interface_info_cache_build -g_dbus_interface_info_cache_release -g_dbus_interface_info_generate_xml -g_dbus_node_info_new_for_xml -g_dbus_node_info_lookup_interface -g_dbus_node_info_generate_xml -G_TYPE_DBUS_NODE_INFO -G_TYPE_DBUS_INTERFACE_INFO -G_TYPE_DBUS_METHOD_INFO -G_TYPE_DBUS_SIGNAL_INFO -G_TYPE_DBUS_PROPERTY_INFO -G_TYPE_DBUS_ARG_INFO -G_TYPE_DBUS_ANNOTATION_INFO -g_dbus_node_info_ref -g_dbus_interface_info_ref -g_dbus_method_info_ref -g_dbus_signal_info_ref -g_dbus_property_info_ref -g_dbus_arg_info_ref -g_dbus_annotation_info_ref -g_dbus_node_info_unref -g_dbus_interface_info_unref -g_dbus_method_info_unref -g_dbus_signal_info_unref -g_dbus_property_info_unref -g_dbus_arg_info_unref -g_dbus_annotation_info_unref - -G_TYPE_DBUS_PROPERTY_INFO_FLAGS - -g_dbus_annotation_info_get_type -g_dbus_arg_info_get_type -g_dbus_interface_info_get_type -g_dbus_method_info_get_type -g_dbus_node_info_get_type -g_dbus_property_info_get_type -g_dbus_signal_info_get_type -g_dbus_property_info_flags_get_type -
- -
-gpermission -GPermission -g_permission_get_allowed -g_permission_get_can_acquire -g_permission_get_can_release - -g_permission_acquire -g_permission_acquire_async -g_permission_acquire_finish -g_permission_release -g_permission_release_async -g_permission_release_finish - -g_permission_impl_update - -G_PERMISSION -G_PERMISSION_CLASS -G_PERMISSION_GET_CLASS -G_IS_PERMISSION -G_IS_PERMISSION_CLASS -GPermissionClass -G_TYPE_PERMISSION - -g_permission_get_type -GPermissionPrivate -
- -
-gsimplepermission -GSimplePermission -g_simple_permission_new - - -G_SIMPLE_PERMISSION -G_IS_SIMPLE_PERMISSION -G_TYPE_SIMPLE_PERMISSION - - -g_simple_permission_get_type -
- -
-gapplication -GApplication -GApplicationClass - -GApplicationFlags -g_application_id_is_valid -g_application_new - -g_application_get_application_id -g_application_set_application_id - -g_application_get_inactivity_timeout -g_application_set_inactivity_timeout - -g_application_get_flags -g_application_set_flags - -g_application_get_resource_base_path -g_application_set_resource_base_path - -g_application_get_dbus_connection -g_application_get_dbus_object_path - -g_application_set_action_group - -g_application_get_is_registered -g_application_get_is_remote -g_application_register - -g_application_hold -g_application_release -g_application_quit - -g_application_activate -g_application_open - -g_application_send_notification -g_application_withdraw_notification - -g_application_run -g_application_add_main_option_entries -g_application_add_main_option -g_application_add_option_group -g_application_set_option_context_parameter_string -g_application_set_option_context_summary -g_application_set_option_context_description - -g_application_set_default -g_application_get_default - -g_application_mark_busy -g_application_unmark_busy -g_application_get_is_busy -g_application_bind_busy_property -g_application_unbind_busy_property - -G_TYPE_APPLICATION -G_APPLICATION -G_APPLICATION_CLASS -G_IS_APPLICATION -G_IS_APPLICATION_CLASS -G_APPLICATION_GET_CLASS -G_TYPE_APPLICATION_FLAGS - -GApplicationPrivate -g_application_get_type -g_application_flags_get_type -
- -
-gapplicationcommandline -GApplicationCommandLine -GApplicationCommandLineClass - -g_application_command_line_get_arguments -g_application_command_line_get_cwd -g_application_command_line_get_environ -g_application_command_line_get_options_dict -g_application_command_line_get_stdin -g_application_command_line_create_file_for_arg -g_application_command_line_getenv -g_application_command_line_get_is_remote -g_application_command_line_get_platform_data - -g_application_command_line_set_exit_status -g_application_command_line_get_exit_status - -g_application_command_line_print -g_application_command_line_printerr - -G_TYPE_APPLICATION_COMMAND_LINE -G_APPLICATION_COMMAND_LINE -G_APPLICATION_COMMAND_LINE_CLASS -G_IS_APPLICATION_COMMAND_LINE -G_IS_APPLICATION_COMMAND_LINE_CLASS -G_APPLICATION_COMMAND_LINE_GET_CLASS - -GApplicationCommandLinePrivate -g_application_command_line_get_type -
- - -
-gactiongroup -GActionGroup -GActionGroup -GActionGroupInterface - - -g_action_group_list_actions -g_action_group_query_action - - -g_action_group_has_action -g_action_group_get_action_enabled -g_action_group_get_action_parameter_type -g_action_group_get_action_state_type -g_action_group_get_action_state_hint -g_action_group_get_action_state - - -g_action_group_change_action_state -g_action_group_activate_action - - -g_action_group_action_added -g_action_group_action_removed -g_action_group_action_enabled_changed -g_action_group_action_state_changed - - -g_action_group_get_type -G_TYPE_ACTION_GROUP -G_IS_ACTION_GROUP -G_ACTION_GROUP_GET_IFACE -G_ACTION_GROUP -
- -
-gactiongroupexporter -g_dbus_connection_export_action_group -g_dbus_connection_unexport_action_group -
- -
-gdbusactiongroup -GDBusActionGroup -g_dbus_action_group_get - - -G_TYPE_DBUS_ACTION_GROUP -G_DBUS_ACTION_GROUP -G_DBUS_ACTION_GROUP_CLASS -G_IS_DBUS_ACTION_GROUP -G_IS_DBUS_ACTION_GROUP_CLASS -G_DBUS_ACTION_GROUP_GET_CLASS - - -g_dbus_action_group_get_type -
- -
-gremoteactiongroup -GRemoteActionGroup -GRemoteActionGroupInterface - - -g_remote_action_group_activate_action_full -g_remote_action_group_change_action_state_full - - -G_TYPE_REMOTE_ACTION_GROUP -G_REMOTE_ACTION_GROUP -G_IS_REMOTE_ACTION_GROUP -G_REMOTE_ACTION_GROUP_GET_IFACE -g_remote_action_group_get_type -
- -
-gaction -GAction -GAction -GActionInterface - - -g_action_name_is_valid -g_action_get_name -g_action_get_parameter_type -g_action_get_state_type -g_action_get_state_hint - - -g_action_get_enabled -g_action_get_state - - -g_action_change_state -g_action_activate - - -g_action_parse_detailed_name -g_action_print_detailed_name - - -g_action_get_type -G_TYPE_ACTION -G_IS_ACTION -G_ACTION_GET_IFACE -G_ACTION -
- -
-gsimpleaction -GSimpleAction -GSimpleAction - - -g_simple_action_new -g_simple_action_new_stateful - - -g_simple_action_set_enabled -g_simple_action_set_state -g_simple_action_set_state_hint - - -g_simple_action_get_type -G_TYPE_SIMPLE_ACTION -G_IS_SIMPLE_ACTION -G_SIMPLE_ACTION -
- -
-gpropertyaction -GPropertyAction -GPropertyAction - - -g_property_action_new - - -g_property_action_get_type -G_TYPE_PROPERTY_ACTION -G_IS_PROPERTY_ACTION -G_PROPERTY_ACTION -
- -
-gsimpleactiongroup -GSimpleActionGroup -GSimpleActionGroup - - -g_simple_action_group_new - - -g_simple_action_group_lookup -g_simple_action_group_insert -g_simple_action_group_remove - - -g_simple_action_group_add_entries - - -GSimpleActionGroupClass -GSimpleActionGroupPrivate -g_simple_action_group_get_type -G_TYPE_SIMPLE_ACTION_GROUP -G_IS_SIMPLE_ACTION_GROUP -G_SIMPLE_ACTION_GROUP_CLASS -G_SIMPLE_ACTION_GROUP_GET_CLASS -G_IS_SIMPLE_ACTION_GROUP_CLASS -G_SIMPLE_ACTION_GROUP -
- -
-gactionmap -GActionMap -GActionMap -GActionMapInterface -g_action_map_lookup_action -GActionEntry -g_action_map_add_action_entries -g_action_map_add_action -g_action_map_remove_action_entries -g_action_map_remove_action - - -G_TYPE_ACTION_MAP -G_ACTION_MAP -G_IS_ACTION_MAP -G_ACTION_MAP_GET_IFACE - - -g_action_map_get_type -
- -
-gproxyresolver -GProxyResolver -GProxyResolver -GProxyResolverInterface -G_PROXY_RESOLVER_EXTENSION_POINT_NAME -g_proxy_resolver_get_default -g_proxy_resolver_is_supported -g_proxy_resolver_lookup -g_proxy_resolver_lookup_async -g_proxy_resolver_lookup_finish - -G_PROXY_RESOLVER -G_IS_PROXY_RESOLVER -G_TYPE_PROXY_RESOLVER -G_PROXY_RESOLVER_GET_IFACE - -g_proxy_resolver_get_type -
- -
-gproxyaddress -GProxyAddress -GProxyAddress -GProxyAddressClass -g_proxy_address_get_destination_protocol -g_proxy_address_get_destination_hostname -g_proxy_address_get_destination_port -g_proxy_address_get_password -g_proxy_address_get_protocol -g_proxy_address_get_username -g_proxy_address_get_uri -g_proxy_address_new - -G_PROXY_ADDRESS -G_PROXY_ADDRESS_CLASS -G_PROXY_ADDRESS_GET_CLASS -G_IS_PROXY_ADDRESS -G_IS_PROXY_ADDRESS_CLASS -G_TYPE_PROXY_ADDRESS - -GProxyAddressPrivate -g_proxy_address_get_type -
- -
-gproxy -GProxy -GProxy -GProxyInterface -G_PROXY_EXTENSION_POINT_NAME -g_proxy_connect -g_proxy_connect_async -g_proxy_connect_finish -g_proxy_get_default_for_protocol -g_proxy_supports_hostname - -G_PROXY -G_PROXY_GET_IFACE -G_IS_PROXY -G_TYPE_PROXY - -g_proxy_get_type -
- -
-gpollableinputstream -GPollableInputStream -GPollableInputStream -GPollableInputStreamInterface - -g_pollable_input_stream_can_poll -g_pollable_input_stream_is_readable -g_pollable_input_stream_create_source -g_pollable_input_stream_read_nonblocking - -G_POLLABLE_INPUT_STREAM -G_POLLABLE_INPUT_STREAM_GET_INTERFACE -G_IS_POLLABLE_INPUT_STREAM -G_TYPE_POLLABLE_INPUT_STREAM - -g_pollable_input_stream_get_type -
- -
-gpollableoutputstream -GPollableOutputStream -GPollableOutputStream -GPollableOutputStreamInterface - -g_pollable_output_stream_can_poll -g_pollable_output_stream_is_writable -g_pollable_output_stream_create_source -g_pollable_output_stream_write_nonblocking -g_pollable_output_stream_writev_nonblocking - -G_POLLABLE_OUTPUT_STREAM -G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE -G_IS_POLLABLE_OUTPUT_STREAM -G_TYPE_POLLABLE_OUTPUT_STREAM - -g_pollable_output_stream_get_type -
- -
-gpollableutils -GPollableReturn -GPollableSourceFunc -g_pollable_source_new -g_pollable_source_new_full - -g_pollable_stream_read -g_pollable_stream_write -g_pollable_stream_write_all - -G_TYPE_POLLABLE_RETURN - -g_pollable_return_get_type -
- -
-gtls -G_TLS_ERROR -GTlsError -G_TLS_CHANNEL_BINDING_ERROR -GTlsChannelBindingError - -GTlsAuthenticationMode -GTlsCertificateFlags -GTlsProtocolVersion - -G_TYPE_TLS_AUTHENTICATION_MODE -G_TYPE_TLS_CERTIFICATE_FLAGS -G_TYPE_TLS_CHANNEL_BINDING_ERROR -G_TYPE_TLS_ERROR -G_TYPE_TLS_PROTOCOL_VERSION -g_tls_authentication_mode_get_type -g_tls_certificate_flags_get_type -g_tls_channel_binding_error_get_type -g_tls_channel_binding_error_quark -g_tls_error_get_type -g_tls_protocol_version_get_type -
- -
-gtlsbackend -GTlsBackend -G_TLS_BACKEND_EXTENSION_POINT_NAME -GTlsBackend -GTlsBackendInterface -g_tls_backend_get_default -g_tls_backend_supports_tls -g_tls_backend_supports_dtls -g_tls_backend_get_default_database -g_tls_backend_set_default_database -g_tls_backend_get_certificate_type -g_tls_backend_get_client_connection_type -g_tls_backend_get_server_connection_type -g_tls_backend_get_dtls_client_connection_type -g_tls_backend_get_dtls_server_connection_type -g_tls_backend_get_file_database_type - -G_IS_TLS_BACKEND -G_TLS_BACKEND -G_TLS_BACKEND_GET_INTERFACE -G_TYPE_TLS_BACKEND -g_tls_error_quark - -g_tls_backend_get_type -
- -
-gtlscertificate -GTlsCertificate -GTlsCertificate -g_tls_certificate_new_from_pem -g_tls_certificate_new_from_pkcs12 -g_tls_certificate_new_from_file -g_tls_certificate_new_from_file_with_password -g_tls_certificate_new_from_files -g_tls_certificate_new_from_pkcs11_uris -g_tls_certificate_list_new_from_file -g_tls_certificate_get_dns_names -g_tls_certificate_get_ip_addresses -g_tls_certificate_get_issuer -g_tls_certificate_get_issuer_name -g_tls_certificate_get_not_valid_before -g_tls_certificate_get_not_valid_after -g_tls_certificate_get_subject_name -g_tls_certificate_verify -g_tls_certificate_is_same - -GTlsCertificateClass -GTlsCertificatePrivate -G_IS_TLS_CERTIFICATE -G_IS_TLS_CERTIFICATE_CLASS -G_TLS_CERTIFICATE -G_TLS_CERTIFICATE_CLASS -G_TLS_CERTIFICATE_GET_CLASS -G_TYPE_TLS_CERTIFICATE - -g_tls_certificate_get_type -
- -
-gtlsconnection -GTlsConnection -GTlsConnection -GTlsChannelBindingType -g_tls_connection_set_certificate -g_tls_connection_get_certificate -g_tls_connection_get_peer_certificate -g_tls_connection_get_peer_certificate_errors -g_tls_connection_get_channel_binding_data -g_tls_connection_set_require_close_notify -g_tls_connection_get_require_close_notify -GTlsRehandshakeMode -g_tls_connection_set_rehandshake_mode -g_tls_connection_get_rehandshake_mode -g_tls_connection_set_advertised_protocols -g_tls_connection_get_negotiated_protocol -g_tls_connection_set_use_system_certdb -g_tls_connection_get_use_system_certdb -g_tls_connection_get_database -g_tls_connection_set_database -g_tls_connection_get_interaction -g_tls_connection_set_interaction -g_tls_connection_get_protocol_version -g_tls_connection_get_ciphersuite_name - -g_tls_connection_handshake -g_tls_connection_handshake_async -g_tls_connection_handshake_finish - -g_tls_connection_emit_accept_certificate - -GTlsConnectionClass -GTlsConnectionPrivate -G_IS_TLS_CONNECTION -G_IS_TLS_CONNECTION_CLASS -G_TLS_CONNECTION -G_TLS_CONNECTION_CLASS -G_TLS_CONNECTION_GET_CLASS -G_TYPE_TLS_CHANNEL_BINDING_TYPE -G_TYPE_TLS_CONNECTION -G_TYPE_TLS_REHANDSHAKE_MODE - -g_tls_channel_binding_type_get_type -g_tls_connection_get_type -g_tls_rehandshake_mode_get_type -
- -
-gtlsclientconnection -GTlsClientConnection -GTlsClientConnection -GTlsClientConnectionInterface -g_tls_client_connection_new -g_tls_client_connection_set_server_identity -g_tls_client_connection_get_server_identity -g_tls_client_connection_set_validation_flags -g_tls_client_connection_get_validation_flags -g_tls_client_connection_set_use_ssl3 -g_tls_client_connection_get_use_ssl3 -g_tls_client_connection_get_accepted_cas -g_tls_client_connection_copy_session_state - -G_IS_TLS_CLIENT_CONNECTION -G_TLS_CLIENT_CONNECTION -G_TLS_CLIENT_CONNECTION_GET_INTERFACE -G_TYPE_TLS_CLIENT_CONNECTION - -g_tls_client_connection_get_type -
- -
-gtlsdatabase -GTlsDatabase -GTlsDatabase -GTlsDatabaseClass -GTlsDatabaseVerifyFlags -G_TLS_DATABASE_PURPOSE_AUTHENTICATE_SERVER -G_TLS_DATABASE_PURPOSE_AUTHENTICATE_CLIENT -g_tls_database_verify_chain -g_tls_database_verify_chain_async -g_tls_database_verify_chain_finish -GTlsDatabaseLookupFlags -g_tls_database_lookup_certificate_issuer -g_tls_database_lookup_certificate_issuer_async -g_tls_database_lookup_certificate_issuer_finish -g_tls_database_lookup_certificates_issued_by -g_tls_database_lookup_certificates_issued_by_async -g_tls_database_lookup_certificates_issued_by_finish -g_tls_database_create_certificate_handle -g_tls_database_lookup_certificate_for_handle -g_tls_database_lookup_certificate_for_handle_async -g_tls_database_lookup_certificate_for_handle_finish - -G_IS_TLS_DATABASE -G_IS_TLS_DATABASE_CLASS -G_TLS_DATABASE -G_TLS_DATABASE_CLASS -G_TLS_DATABASE_GET_CLASS -G_TYPE_TLS_DATABASE -G_TYPE_TLS_DATABASE_LOOKUP_FLAGS -G_TYPE_TLS_DATABASE_VERIFY_FLAGS - -g_tls_database_lookup_flags_get_type -g_tls_database_verify_flags_get_type -g_tls_database_get_type -GTlsDatabasePrivate -
- -
-gtlsfiledatabase -GTlsFileDatabase -GTlsFileDatabase -GTlsFileDatabaseInterface -g_tls_file_database_new - -G_TLS_FILE_DATABASE -G_TLS_FILE_DATABASE_GET_INTERFACE -G_TYPE_TLS_FILE_DATABASE -G_IS_TLS_FILE_DATABASE - -g_tls_file_database_get_type -
- -
-gtlsserverconnection -GTlsServerConnection -GTlsServerConnection -GTlsServerConnectionInterface -g_tls_server_connection_new - -G_IS_TLS_SERVER_CONNECTION -G_TLS_SERVER_CONNECTION -G_TLS_SERVER_CONNECTION_GET_INTERFACE -G_TYPE_TLS_SERVER_CONNECTION - -g_tls_server_connection_get_type -
- -
-gtlspassword -GTlsPassword -GTlsPassword -GTlsPasswordClass -GTlsPasswordFlags -g_tls_password_new -g_tls_password_get_value -g_tls_password_set_value -g_tls_password_set_value_full -g_tls_password_get_description -g_tls_password_set_description -g_tls_password_get_flags -g_tls_password_set_flags -g_tls_password_get_warning -g_tls_password_set_warning - -g_tls_password_flags_get_type -g_tls_password_get_type -G_IS_TLS_PASSWORD -G_TLS_PASSWORD -G_TYPE_TLS_PASSWORD -G_TYPE_TLS_PASSWORD_FLAGS -G_TLS_PASSWORD_CLASS -G_TLS_PASSWORD_GET_CLASS -G_IS_TLS_PASSWORD_CLASS - -GTlsPasswordPrivate -
- -
-gtlsinteraction -GTlsInteraction -GTlsInteraction -GTlsInteractionResult -GTlsCertificateRequestFlags -GTlsInteractionClass -g_tls_interaction_invoke_ask_password -g_tls_interaction_invoke_request_certificate -g_tls_interaction_ask_password -g_tls_interaction_ask_password_async -g_tls_interaction_ask_password_finish -g_tls_interaction_request_certificate -g_tls_interaction_request_certificate_async -g_tls_interaction_request_certificate_finish - -G_IS_TLS_INTERACTION -G_IS_TLS_INTERACTION_CLASS -G_TYPE_TLS_INTERACTION -G_TLS_INTERACTION -G_TLS_INTERACTION_CLASS -G_TLS_INTERACTION_GET_CLASS -G_TYPE_TLS_INTERACTION_RESULT -G_TYPE_TLS_CERTIFICATE_REQUEST_FLAGS - -GTlsInteractionPrivate -g_tls_interaction_get_type -g_tls_interaction_result_get_type -g_tls_certificate_request_flags_get_type -
- -
-gdtlsconnection -GDtlsConnection -GDtlsConnection -g_dtls_connection_set_certificate -g_dtls_connection_get_certificate -g_dtls_connection_get_peer_certificate -g_dtls_connection_get_peer_certificate_errors -g_dtls_connection_get_channel_binding_data -g_dtls_connection_set_require_close_notify -g_dtls_connection_get_require_close_notify -g_dtls_connection_set_rehandshake_mode -g_dtls_connection_get_rehandshake_mode -g_dtls_connection_set_advertised_protocols -g_dtls_connection_get_negotiated_protocol -g_dtls_connection_get_database -g_dtls_connection_set_database -g_dtls_connection_get_interaction -g_dtls_connection_set_interaction -g_dtls_connection_get_protocol_version -g_dtls_connection_get_ciphersuite_name - -g_dtls_connection_handshake -g_dtls_connection_handshake_async -g_dtls_connection_handshake_finish - -g_dtls_connection_shutdown -g_dtls_connection_shutdown_async -g_dtls_connection_shutdown_finish -g_dtls_connection_close -g_dtls_connection_close_async -g_dtls_connection_close_finish - -g_dtls_connection_emit_accept_certificate - -GDtlsConnectionClass -GDtlsConnectionPrivate -G_IS_DTLS_CONNECTION -G_IS_DTLS_CONNECTION_CLASS -G_DTLS_CONNECTION -G_DTLS_CONNECTION_CLASS -G_DTLS_CONNECTION_GET_CLASS -G_TYPE_DTLS_CONNECTION -G_DTLS_CONNECTION_GET_INTERFACE - -g_dtls_connection_get_type -
- -
-gdtlsclientconnection -GDtlsClientConnection -GDtlsClientConnection -GDtlsClientConnectionInterface -g_dtls_client_connection_new -g_dtls_client_connection_set_server_identity -g_dtls_client_connection_get_server_identity -g_dtls_client_connection_set_validation_flags -g_dtls_client_connection_get_validation_flags -g_dtls_client_connection_get_accepted_cas - -G_IS_DTLS_CLIENT_CONNECTION -G_DTLS_CLIENT_CONNECTION -G_DTLS_CLIENT_CONNECTION_GET_INTERFACE -G_TYPE_DTLS_CLIENT_CONNECTION - -g_dtls_client_connection_get_type -
- -
-gdtlsserverconnection -GDtlsServerConnection -GDtlsServerConnection -GDtlsServerConnectionInterface -g_dtls_server_connection_new - -G_IS_DTLS_SERVER_CONNECTION -G_DTLS_SERVER_CONNECTION -G_DTLS_SERVER_CONNECTION_GET_INTERFACE -G_TYPE_DTLS_SERVER_CONNECTION - -g_dtls_server_connection_get_type -
- -
-gdbusinterface -GDBusInterface -GDBusInterface -GDBusInterfaceIface -g_dbus_interface_get_info -g_dbus_interface_get_object -g_dbus_interface_dup_object -g_dbus_interface_set_object - -G_DBUS_INTERFACE -G_IS_DBUS_INTERFACE -G_TYPE_DBUS_INTERFACE -g_dbus_interface_get_type -G_DBUS_INTERFACE_GET_IFACE -
- - -
-gdbusinterfaceskeleton -GDBusInterfaceSkeleton -GDBusInterfaceSkeleton -GDBusInterfaceSkeletonClass -g_dbus_interface_skeleton_flush -g_dbus_interface_skeleton_get_info -g_dbus_interface_skeleton_get_vtable -g_dbus_interface_skeleton_get_properties -g_dbus_interface_skeleton_export -g_dbus_interface_skeleton_unexport -g_dbus_interface_skeleton_unexport_from_connection -g_dbus_interface_skeleton_get_connection -g_dbus_interface_skeleton_get_connections -g_dbus_interface_skeleton_has_connection -g_dbus_interface_skeleton_get_object_path -GDBusInterfaceSkeletonFlags -g_dbus_interface_skeleton_get_flags -g_dbus_interface_skeleton_set_flags - -G_DBUS_INTERFACE_SKELETON -G_IS_DBUS_INTERFACE_SKELETON -G_TYPE_DBUS_INTERFACE_SKELETON -g_dbus_interface_skeleton_get_type -G_DBUS_INTERFACE_SKELETON_CLASS -G_IS_DBUS_INTERFACE_SKELETON_CLASS -G_DBUS_INTERFACE_SKELETON_GET_CLASS - -GDBusInterfaceSkeletonPrivate -G_TYPE_DBUS_INTERFACE_SKELETON_FLAGS -g_dbus_interface_skeleton_flags_get_type -
- -
-gdbusobject -GDBusObject -GDBusObject -GDBusObjectIface -g_dbus_object_get_object_path -g_dbus_object_get_interfaces -g_dbus_object_get_interface - -G_DBUS_OBJECT -G_IS_DBUS_OBJECT -G_TYPE_DBUS_OBJECT -g_dbus_object_get_type -G_DBUS_OBJECT_GET_IFACE -
- -
-gdbusobjectproxy -GDBusObjectProxy -GDBusObjectProxy -GDBusObjectProxyClass -g_dbus_object_proxy_new -g_dbus_object_proxy_get_connection - -G_DBUS_OBJECT_PROXY -G_IS_DBUS_OBJECT_PROXY -G_TYPE_DBUS_OBJECT_PROXY -g_dbus_object_proxy_get_type -G_DBUS_OBJECT_PROXY_CLASS -G_IS_DBUS_OBJECT_PROXY_CLASS -G_DBUS_OBJECT_PROXY_GET_CLASS - -GDBusObjectProxyPrivate -
- -
-gdbusobjectskeleton -GDBusObjectSkeleton -GDBusObjectSkeleton -GDBusObjectSkeletonClass -g_dbus_object_skeleton_new -g_dbus_object_skeleton_flush -g_dbus_object_skeleton_add_interface -g_dbus_object_skeleton_remove_interface -g_dbus_object_skeleton_remove_interface_by_name -g_dbus_object_skeleton_set_object_path - -G_DBUS_OBJECT_SKELETON -G_IS_DBUS_OBJECT_SKELETON -G_TYPE_DBUS_OBJECT_SKELETON -g_dbus_object_skeleton_get_type -G_DBUS_OBJECT_SKELETON_CLASS -G_IS_DBUS_OBJECT_SKELETON_CLASS -G_DBUS_OBJECT_SKELETON_GET_CLASS - -GDBusObjectSkeletonPrivate -
- -
-gdbusobjectmanager -GDBusObjectManager -GDBusObjectManager -GDBusObjectManagerIface -g_dbus_object_manager_get_object_path -g_dbus_object_manager_get_objects -g_dbus_object_manager_get_object -g_dbus_object_manager_get_interface - -G_DBUS_OBJECT_MANAGER -G_IS_DBUS_OBJECT_MANAGER -G_TYPE_DBUS_OBJECT_MANAGER -g_dbus_object_manager_get_type -G_DBUS_OBJECT_MANAGER_GET_IFACE -
- -
-gdbusobjectmanagerclient -GDBusObjectManagerClient -GDBusObjectManagerClient -GDBusObjectManagerClientClass -GDBusObjectManagerClientFlags -GDBusProxyTypeFunc -g_dbus_object_manager_client_new -g_dbus_object_manager_client_new_finish -g_dbus_object_manager_client_new_sync -g_dbus_object_manager_client_new_for_bus -g_dbus_object_manager_client_new_for_bus_finish -g_dbus_object_manager_client_new_for_bus_sync -g_dbus_object_manager_client_get_connection -g_dbus_object_manager_client_get_flags -g_dbus_object_manager_client_get_name -g_dbus_object_manager_client_get_name_owner - -G_DBUS_OBJECT_MANAGER_CLIENT -G_IS_DBUS_OBJECT_MANAGER_CLIENT -G_TYPE_DBUS_OBJECT_MANAGER_CLIENT -g_dbus_object_manager_client_get_type -G_DBUS_OBJECT_MANAGER_CLIENT_CLASS -G_IS_DBUS_OBJECT_MANAGER_CLIENT_CLASS -G_DBUS_OBJECT_MANAGER_CLIENT_GET_CLASS - -GDBusObjectManagerClientPrivate -G_TYPE_DBUS_OBJECT_MANAGER_CLIENT_FLAGS -g_dbus_object_manager_client_flags_get_type -
- -
-gdbusobjectmanagerserver -GDBusObjectManagerServer -GDBusObjectManagerServer -GDBusObjectManagerServerClass -g_dbus_object_manager_server_new -g_dbus_object_manager_server_get_connection -g_dbus_object_manager_server_set_connection -g_dbus_object_manager_server_export -g_dbus_object_manager_server_export_uniquely -g_dbus_object_manager_server_is_exported -g_dbus_object_manager_server_unexport - -G_DBUS_OBJECT_MANAGER_SERVER -G_IS_DBUS_OBJECT_MANAGER_SERVER -G_TYPE_DBUS_OBJECT_MANAGER_SERVER -g_dbus_object_manager_server_get_type -G_DBUS_OBJECT_MANAGER_SERVER_CLASS -G_IS_DBUS_OBJECT_MANAGER_SERVER_CLASS -G_DBUS_OBJECT_MANAGER_SERVER_GET_CLASS - -GDBusObjectManagerServerPrivate -
- -
-gdebugcontroller -GDebugController -GDebugController -GDebugControllerInterface -G_DEBUG_CONTROLLER_EXTENSION_POINT_NAME -g_debug_controller_get_debug_enabled -g_debug_controller_set_debug_enabled - -g_debug_controller_get_type -G_TYPE_DEBUG_CONTROLLER -G_DEBUG_CONTROLLER -G_IS_DEBUG_CONTROLLER -G_DEBUG_CONTROLLER_GET_INTERFACE -
- -
-gdebugcontrollerdbus -GDebugControllerDBus -GDebugControllerDBus -g_debug_controller_dbus_new -g_debug_controller_dbus_stop - -g_debug_controller_dbus_get_type -G_TYPE_DEBUG_CONTROLLER_DBUS -G_DEBUG_CONTROLLER_DBUS -G_IS_DEBUG_CONTROLLER_DBUS -G_DEBUG_CONTROLLER_DBUS_GET_CLASS -
- -
-gmemorymonitor -GMemoryMonitor -GMemoryMonitor -GMemoryMonitorInterface -GMemoryMonitorWarningLevel -G_MEMORY_MONITOR_EXTENSION_POINT_NAME -g_memory_monitor_dup_default - -g_memory_monitor_get_type -G_TYPE_MEMORY_MONITOR -G_MEMORY_MONITOR -G_IS_MEMORY_MONITOR -G_MEMORY_MONITOR_GET_INTERFACE -G_TYPE_MEMORY_MONITOR_WARNING_LEVEL -g_memory_monitor_warning_level_get_type -
- -
-gnetworkmonitor -GNetworkMonitor -GNetworkMonitor -GNetworkMonitorInterface -G_NETWORK_MONITOR_EXTENSION_POINT_NAME -g_network_monitor_get_default -g_network_monitor_get_network_available -g_network_monitor_get_network_metered -g_network_monitor_can_reach -g_network_monitor_can_reach_async -g_network_monitor_can_reach_finish -GNetworkConnectivity -g_network_monitor_get_connectivity - -g_network_monitor_get_type -G_TYPE_NETWORK_CONNECTIVITY -G_TYPE_NETWORK_MONITOR -G_NETWORK_MONITOR -G_IS_NETWORK_MONITOR -G_NETWORK_MONITOR_GET_INTERFACE -g_network_connectivity_get_type -
- -
-gpowerprofilemonitor -GPowerProfileMonitor -GPowerProfileMonitor -GPowerProfileMonitorInterface -G_POWER_PROFILE_MONITOR_EXTENSION_POINT_NAME -g_power_profile_monitor_dup_default -g_power_profile_monitor_get_power_saver_enabled - -g_power_profile_monitor_get_type -G_TYPE_POWER_PROFILE_MONITOR -G_POWER_PROFILE_MONITOR -G_IS_POWER_PROFILE_MONITOR -G_POWER_PROFILE_MONITOR_GET_INTERFACE -G_TYPE_POWER_PROFILE_LEVEL -g_power_profile_level_get_type -
- -
-gmenuexporter -G_MENU_EXPORTER_MAX_SECTION_SIZE -g_dbus_connection_export_menu_model -g_dbus_connection_unexport_menu_model -
- -
-gdbusmenumodel -GDBusMenuModel -g_dbus_menu_model_get - - -G_TYPE_DBUS_MENU_MODEL -G_DBUS_MENU_MODEL -G_IS_DBUS_MENU_MODEL - - -g_dbus_menu_model_get_type -
- -
-gmenu -GMenu -g_menu_new -g_menu_freeze - - -g_menu_insert -g_menu_prepend -g_menu_append - - -g_menu_insert_item -g_menu_append_item -g_menu_prepend_item - - -g_menu_insert_section -g_menu_prepend_section -g_menu_append_section - - -g_menu_append_submenu -g_menu_insert_submenu -g_menu_prepend_submenu - - -g_menu_remove -g_menu_remove_all - - -GMenuItem -g_menu_item_new -g_menu_item_new_section -g_menu_item_new_submenu -g_menu_item_new_from_model - - -g_menu_item_set_label -g_menu_item_set_icon -g_menu_item_set_action_and_target_value -g_menu_item_set_action_and_target -g_menu_item_set_detailed_action -g_menu_item_set_section -g_menu_item_set_submenu - - -g_menu_item_get_attribute_value -g_menu_item_get_attribute -g_menu_item_get_link -g_menu_item_set_attribute_value -g_menu_item_set_attribute -g_menu_item_set_link - - -g_menu_item_get_type -g_menu_get_type - - -G_TYPE_MENU -G_MENU -G_IS_MENU - -G_TYPE_MENU_ITEM -G_MENU_ITEM -G_IS_MENU_ITEM -
- -
-gmenumodel -GMenuModel -g_menu_model_is_mutable -g_menu_model_get_n_items - - -G_MENU_ATTRIBUTE_ACTION -G_MENU_ATTRIBUTE_ACTION_NAMESPACE -G_MENU_ATTRIBUTE_TARGET -G_MENU_ATTRIBUTE_LABEL -G_MENU_ATTRIBUTE_ICON -G_MENU_LINK_SECTION -G_MENU_LINK_SUBMENU - - -g_menu_model_get_item_attribute_value -g_menu_model_get_item_attribute -g_menu_model_get_item_link -g_menu_model_iterate_item_attributes -g_menu_model_iterate_item_links - - -g_menu_model_items_changed - - -GMenuAttributeIter -g_menu_attribute_iter_get_next -g_menu_attribute_iter_get_name -g_menu_attribute_iter_get_value -g_menu_attribute_iter_next - - -GMenuLinkIter -g_menu_link_iter_get_name -g_menu_link_iter_get_next -g_menu_link_iter_get_value -g_menu_link_iter_next - - -g_menu_attribute_iter_get_type -g_menu_link_iter_get_type -g_menu_model_get_type -g_menu_model_get_label_quark -g_menu_model_get_action_quark -g_menu_model_get_section_quark -g_menu_model_get_submenu_quark -g_menu_model_get_target_quark - - -GMenuModelClass -GMenuModelPrivate -G_TYPE_MENU_MODEL -G_MENU_MODEL -G_IS_MENU_MODEL -G_MENU_MODEL_CLASS -G_IS_MENU_MODEL_CLASS -G_MENU_MODEL_GET_CLASS - -GMenuAttributeIterClass -GMenuAttributeIterPrivate -G_TYPE_MENU_LINK_ITER -G_MENU_LINK_ITER -G_IS_MENU_LINK_ITER -G_MENU_LINK_ITER_CLASS -G_IS_MENU_LINK_ITER_CLASS -G_MENU_LINK_ITER_GET_CLASS - -GMenuLinkIterClass -GMenuLinkIterPrivate -G_TYPE_MENU_ATTRIBUTE_ITER -G_MENU_ATTRIBUTE_ITER -G_IS_MENU_ATTRIBUTE_ITER -G_MENU_ATTRIBUTE_ITER_CLASS -G_IS_MENU_ATTRIBUTE_ITER_CLASS -G_MENU_ATTRIBUTE_ITER_GET_CLASS -
- -
-gresource -GResource -GResource -GResourceFlags -GResourceLookupFlags -g_resource_load -g_resource_new_from_data -g_resource_ref -g_resource_unref -g_resource_lookup_data -g_resource_open_stream -g_resource_enumerate_children -g_resource_get_info - - -GStaticResource -g_static_resource_init -g_static_resource_fini -g_static_resource_get_resource - - -g_resources_register -g_resources_unregister -g_resources_lookup_data -g_resources_open_stream -g_resources_enumerate_children -g_resources_get_info - - -G_RESOURCE_ERROR -GResourceError - - -G_TYPE_RESOURCE -G_TYPE_RESOURCE_ERROR -G_TYPE_RESOURCE_FILE -G_TYPE_RESOURCE_FLAGS -G_TYPE_RESOURCE_LOOKUP_FLAGS - - -g_resource_get_type -g_resource_error_get_type -g_resource_flags_get_type -g_resource_lookup_flags_get_type -g_resource_error_quark -
- -
-gtestdbus -GTestDBus -GTestDBus -GTestDBusFlags -g_test_dbus_new -g_test_dbus_get_flags -g_test_dbus_get_bus_address -g_test_dbus_add_service_dir -g_test_dbus_up -g_test_dbus_stop -g_test_dbus_down -g_test_dbus_unset - -g_test_dbus_get_type -g_test_dbus_flags_get_type - -G_TEST_DBUS -G_IS_TEST_DBUS -G_TYPE_TEST_DBUS -G_TYPE_TEST_DBUS_FLAGS -
- -
-gtask -GTask -GTask -g_task_new -g_task_set_task_data -g_task_set_priority -g_task_set_check_cancellable -g_task_set_return_on_cancel -g_task_set_source_tag -g_task_set_name -g_task_set_static_name - -g_task_report_error -g_task_report_new_error - -g_task_get_task_data -g_task_get_priority -g_task_get_cancellable -g_task_get_check_cancellable -g_task_get_return_on_cancel -g_task_get_context -g_task_get_source_object -g_task_get_source_tag -g_task_get_name - -g_task_return_boolean -g_task_return_int -g_task_return_pointer -g_task_return_value -g_task_return_error -g_task_return_new_error -g_task_return_error_if_cancelled - -g_task_propagate_boolean -g_task_propagate_int -g_task_propagate_pointer -g_task_propagate_value -g_task_had_error -g_task_get_completed - -g_task_run_in_thread -g_task_run_in_thread_sync -GTaskThreadFunc -g_task_attach_source - -g_task_is_valid - -GTaskClass -GTaskPrivate -G_TYPE_TASK -G_TASK -G_IS_TASK -G_TASK_CLASS -G_IS_TASK_CLASS -G_TASK_GET_CLASS -g_task_get_type -
- -
-gnetworking -gnetworking.h -g_networking_init - -CMSG_LEN -CMSG_SPACE -GLIB_ALIGN_TO_SIZEOF -T_SRV -
- -
-gsimpleproxyresolver -GSimpleProxyResolver -GSimpleProxyResolver -g_simple_proxy_resolver_new -g_simple_proxy_resolver_set_default_proxy -g_simple_proxy_resolver_set_ignore_hosts -g_simple_proxy_resolver_set_uri_proxy - -GSimpleProxyResolverClass -GSimpleProxyResolverPrivate -G_TYPE_SIMPLE_PROXY_RESOLVER -G_SIMPLE_PROXY_RESOLVER -G_IS_SIMPLE_PROXY_RESOLVER -G_SIMPLE_PROXY_RESOLVER_CLASS -G_IS_SIMPLE_PROXY_RESOLVER_CLASS -G_SIMPLE_PROXY_RESOLVER_GET_CLASS -g_simple_proxy_resolver_get_type -
- -
-gsubprocess -GSubprocess -GSubprocess -GSubprocessFlags -g_subprocess_new -g_subprocess_newv -g_subprocess_get_identifier - -g_subprocess_get_stdin_pipe -g_subprocess_get_stdout_pipe -g_subprocess_get_stderr_pipe - -g_subprocess_wait -g_subprocess_wait_async -g_subprocess_wait_finish -g_subprocess_wait_check -g_subprocess_wait_check_async -g_subprocess_wait_check_finish - -g_subprocess_get_successful -g_subprocess_get_if_exited -g_subprocess_get_exit_status -g_subprocess_get_if_signaled -g_subprocess_get_term_sig -g_subprocess_get_status - -g_subprocess_send_signal -g_subprocess_force_exit - -g_subprocess_communicate -g_subprocess_communicate_async -g_subprocess_communicate_finish -g_subprocess_communicate_utf8 -g_subprocess_communicate_utf8_async -g_subprocess_communicate_utf8_finish - -G_IS_SUBPROCESS -G_TYPE_SUBPROCESS -G_SUBPROCESS -G_TYPE_SUBPROCESS_FLAGS -g_subprocess_get_type -g_subprocess_flags_get_type -
- -
-gsubprocesslauncher -GSubprocessLauncher -GSubprocessLauncher -g_subprocess_launcher_new -g_subprocess_launcher_spawn -g_subprocess_launcher_spawnv -g_subprocess_launcher_set_environ -g_subprocess_launcher_setenv -g_subprocess_launcher_unsetenv -g_subprocess_launcher_getenv -g_subprocess_launcher_set_cwd -g_subprocess_launcher_set_flags -g_subprocess_launcher_set_stdin_file_path -g_subprocess_launcher_take_stdin_fd -g_subprocess_launcher_set_stdout_file_path -g_subprocess_launcher_take_stdout_fd -g_subprocess_launcher_set_stderr_file_path -g_subprocess_launcher_take_stderr_fd -g_subprocess_launcher_take_fd -g_subprocess_launcher_close -g_subprocess_launcher_set_child_setup - -G_IS_SUBPROCESS_LAUNCHER -G_SUBPROCESS_LAUNCHER -G_TYPE_SUBPROCESS_LAUNCHER -g_subprocess_launcher_get_type -
- -
-gnotification -GNotification -GNotification -g_notification_new - -g_notification_set_title -g_notification_set_body -g_notification_set_icon -GNotificationPriority -g_notification_set_priority -g_notification_set_urgent -g_notification_set_category - -g_notification_set_default_action -g_notification_set_default_action_and_target -g_notification_set_default_action_and_target_value - -g_notification_add_button -g_notification_add_button_with_target -g_notification_add_button_with_target_value - -G_IS_NOTIFICATION -G_NOTIFICATION -G_TYPE_NOTIFICATION -G_TYPE_NOTIFICATION_BACKEND -g_notification_get_type -G_TYPE_NOTIFICATION_PRIORITY -g_notification_priority_get_type -
- -
-glistmodel -GListModel -GListModel -GListModelInterface - -g_list_model_get_item_type -g_list_model_get_n_items -g_list_model_get_item -g_list_model_get_object -g_list_model_items_changed - -G_TYPE_LIST_MODEL -G_LIST_MODEL -G_IS_LIST_MODEL -G_LIST_MODEL_GET_IFACE - -g_list_model_get_type -
- -
-gliststore -GListStore -GListStore - -g_list_store_new -g_list_store_insert -g_list_store_insert_sorted -g_list_store_append -g_list_store_remove -g_list_store_remove_all -g_list_store_splice -g_list_store_sort -g_list_store_find -g_list_store_find_with_equal_func -g_list_store_find_with_equal_func_full - -G_TYPE_LIST_STORE - -g_list_store_get_type -
diff --git a/docs/reference/gio/gio-sections-win32.txt b/docs/reference/gio/gio-sections-win32.txt deleted file mode 100644 index de60cdd..0000000 --- a/docs/reference/gio/gio-sections-win32.txt +++ /dev/null @@ -1,122 +0,0 @@ -
-gwin32inputstream -GWin32InputStream -GWin32InputStream -g_win32_input_stream_new -g_win32_input_stream_set_close_handle -g_win32_input_stream_get_close_handle -g_win32_input_stream_get_handle - -GWin32InputStreamClass -G_WIN32_INPUT_STREAM -G_IS_WIN32_INPUT_STREAM -G_TYPE_WIN32_INPUT_STREAM -G_WIN32_INPUT_STREAM_CLASS -G_IS_WIN32_INPUT_STREAM_CLASS -G_WIN32_INPUT_STREAM_GET_CLASS - -g_win32_input_stream_get_type -GWin32InputStreamPrivate -
- -
-gwin32outputstream -GWin32OutputStream -GWin32OutputStream -g_win32_output_stream_new -g_win32_output_stream_set_close_handle -g_win32_output_stream_get_close_handle -g_win32_output_stream_get_handle - -GWin32OutputStreamClass -G_WIN32_OUTPUT_STREAM -G_IS_WIN32_OUTPUT_STREAM -G_TYPE_WIN32_OUTPUT_STREAM -G_WIN32_OUTPUT_STREAM_CLASS -G_IS_WIN32_OUTPUT_STREAM_CLASS -G_WIN32_OUTPUT_STREAM_GET_CLASS - -g_win32_output_stream_get_type -GWin32OutputStreamPrivate -
- -
-gwin32registrykey - - -GWin32RegistrySubkeyIter -g_win32_registry_subkey_iter_copy -g_win32_registry_subkey_iter_free -g_win32_registry_subkey_iter_assign - - -GWin32RegistryValueIter -g_win32_registry_value_iter_copy -g_win32_registry_value_iter_free -g_win32_registry_value_iter_assign - - -GWin32RegistryKey -g_win32_registry_key_new -g_win32_registry_key_new_w -g_win32_registry_key_get_child -g_win32_registry_key_get_child_w - - -g_win32_registry_subkey_iter_init -g_win32_registry_subkey_iter_clear -g_win32_registry_subkey_iter_n_subkeys -g_win32_registry_subkey_iter_next -g_win32_registry_subkey_iter_get_name -g_win32_registry_subkey_iter_get_name_w - - -g_win32_registry_value_iter_init -g_win32_registry_value_iter_clear -g_win32_registry_value_iter_n_values -g_win32_registry_value_iter_next -GWin32RegistryValueType -g_win32_registry_value_iter_get_value_type -g_win32_registry_value_iter_get_name -g_win32_registry_value_iter_get_name_w -g_win32_registry_value_iter_get_data -g_win32_registry_value_iter_get_data_w - - -g_win32_registry_key_get_value -g_win32_registry_key_get_value_w -g_win32_registry_key_get_path -g_win32_registry_key_get_path_w -GWin32RegistryKeyWatchCallbackFunc -GWin32RegistryKeyWatcherFlags -g_win32_registry_key_watch -g_win32_registry_key_has_changed -g_win32_registry_key_erase_change_indicator - - -GWin32RegistryKeyClass - - -GWin32RegistryKeyPrivate -g_win32_registry_key_get_type -g_win32_registry_subkey_iter_get_type -g_win32_registry_value_iter_get_type -G_TYPE_WIN32_REGISTRY_KEY -G_WIN32_REGISTRY_KEY -G_WIN32_REGISTRY_KEY_CLASS -G_IS_WIN32_REGISTRY_KEY -G_IS_WIN32_REGISTRY_KEY_CLASS -G_WIN32_REGISTRY_KEY_GET_CLASS -G_TYPE_WIN32_REGISTRY_SUBKEY_ITER -G_TYPE_WIN32_REGISTRY_VALUE_ITER -
- -
-gregistrysettingsbackend -GRegistrySettingsBackend -GRegistrySettingsBackend -g_registry_settings_backend_new - - -g_registry_settings_backend_get_type -
diff --git a/docs/reference/gio/gio-unix.toml.in b/docs/reference/gio/gio-unix.toml.in new file mode 100644 index 0000000..3a9deb3 --- /dev/null +++ b/docs/reference/gio/gio-unix.toml.in @@ -0,0 +1,50 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GioUnix" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_urls = "https://docs.gtk.org/gio-unix/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Unix-specific APIs in Gio" +dependencies = [ "GLib-2.0", "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [dependencies."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [dependencies."Gio-2.0"] + name = "Gio" + description = "A library of useful classes for I/O, networking and IPC" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "unix-mounts.md", +] +content_images = [] diff --git a/docs/reference/gio/gio-win32.toml.in b/docs/reference/gio/gio-win32.toml.in new file mode 100644 index 0000000..84e75ce --- /dev/null +++ b/docs/reference/gio/gio-win32.toml.in @@ -0,0 +1,48 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GioWin32" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_urls = "https://docs.gtk.org/gio-win32/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Windows-specific APIs in Gio" +dependencies = [ "GLib-2.0", "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [dependencies."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [dependencies."Gio-2.0"] + name = "Gio" + description = "A library of useful classes for I/O, networking and IPC" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [] +content_images = [] diff --git a/docs/reference/gio/gio.rst b/docs/reference/gio/gio.rst new file mode 100644 index 0000000..d3ffa3e --- /dev/null +++ b/docs/reference/gio/gio.rst @@ -0,0 +1,528 @@ +.. _gio(1): +.. meta:: + :copyright: Copyright 2015, 2019, 2020 Red Hat, Inc. + :copyright: Copyright 2018, 2019 Endless Mobile, Inc. + :copyright: Copyright 2018 segfault + :copyright: Copyright 2020 Frederic Martinsons + :copyright: Copyright 2022 Marco Trevisan + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2015, 2019, 2020 Red Hat, Inc. + SPDX-FileCopyrightText: 2018, 2019 Endless Mobile, Inc. + SPDX-FileCopyrightText: 2018 segfault + SPDX-FileCopyrightText: 2020 Frederic Martinsons + SPDX-FileCopyrightText: 2022 Marco Trevisan + SPDX-License-Identifier: LGPL-2.1-or-later + +=== +gio +=== + +-------------------- +GIO commandline tool +-------------------- + +SYNOPSIS +-------- + +| **gio** help [*COMMAND*] +| **gio** version +| **gio** cat *LOCATION*… +| **gio** copy [*OPTION*…] *SOURCE*… *DESTINATION* +| **gio** info [*OPTION*…] *LOCATION*… +| **gio** launch *DESKTOP-FILE* [*FILE-ARG*…] +| **gio** list [*OPTION*…] [*LOCATION*…] +| **gio** mime *MIME-TYPE* [*HANDLER*] +| **gio** mkdir [*OPTION*…] *LOCATION*… +| **gio** monitor [*OPTION*…] [*LOCATION*…] +| **gio** mount [*OPTION*…] [*LOCATION*…] +| **gio** move [*OPTION*…] *SOURCE*… *DESTINATION* +| **gio** open *LOCATION*… +| **gio** rename *LOCATION* *NAME* +| **gio** remove [*OPTION*…] *LOCATION*… +| **gio** save [*OPTION*…] *DESTINATION* +| **gio** set [*OPTION*…] *LOCATION* *ATTRIBUTE* *VALUE*… +| **gio** trash [*OPTION*…] [*LOCATION*…] +| **gio** tree [*OPTION*…] [*LOCATION*…] + +DESCRIPTION +----------- + +``gio`` is a utility that makes many of the GIO features available from the +commandline. In doing so, it provides commands that are similar to traditional +utilities, but let you use GIO locations instead of local files: for example you +can use something like ``smb://server/resource/file.txt`` as a location. + +Plain filenames which contain a colon will be interpreted as URIs with an +unknown protocol. To avoid this, prefix them with a path such as ``./``, or with +the ``file:`` protocol. + +COMMANDS +-------- + +``help`` *COMMAND* + + Displays a short synopsis of the available commands or provides detailed help + on a specific command. + +``version`` + + Prints the GLib version to which ``gio`` belongs. + +``cat`` *LOCATION*… + + Concatenates the given files and prints them to the standard output. + + The ``cat`` command works just like the traditional ``cat`` utility. + + Mote: just pipe through ``cat`` if you need its formatting options like + ``-n``, ``-T`` or other. + +``copy`` [*OPTION*…] *SOURCE*… *DESTINATION* + + Copies one or more files from ``SOURCE`` to ``DESTINATION``. If more than one + source is specified, the destination must be a directory. + + The ``copy`` command is similar to the traditional ``cp`` utility. + + **Options** + + ``-T``, ``--no-target-directory`` + + Don’t copy into ``DESTINATION`` even if it is a directory. + + ``-p``, ``--progress`` + + Show progress. + + ``-i``, ``--interactive`` + + Prompt for confirmation before overwriting files. + + ``--preserve`` + + Preserve all attributes of copied files. + + ``-b``, ``--backup`` + + Create backups of existing destination files. + + ``-P``, ``--no-dereference`` + + Never follow symbolic links. + + ``--default-permissions`` + + Use the default permissions of the current process for the destination file, + rather than copying the permissions of the source file. + +``info`` [*OPTION*…] *LOCATION*… + + Shows information about the given locations. + + The ``info`` command is similar to the traditional ``ls`` utility. + + **Options** + + ``-w``, ``--query-writable`` + + List writable attributes. + + ``-f``, ``--filesystem`` + + Show information about the filesystem that the given locations reside on. + + ``-a``, ``--attributes=`` + + The attributes to get. + + Attributes can be specified with their GIO name, e.g. ``standard::icon``, + or just by namespace, e.g. ``unix``, or by ``*``, which matches all + attributes. Several attributes or groups of attributes can be specified, + separated by commas. + + By default, all attributes are listed. + + ``-n``, ``--nofollow-symlinks`` + + Don’t follow symbolic links. + +``launch`` *DESKTOP-FILE* [*FILE-ARG*…] + + Launch a desktop file from any location given. + + The ``launch`` command extends the behavior of the ``open`` command by + allowing any desktop file to be launched, not only those registered as file + handlers. + +``list`` [*OPTION*…] [*LOCATION*…] + + Lists the contents of the given locations. If no location is given, the + contents of the current directory are shown. + + The ``list`` command is similar to the traditional ``ls`` utility. + + **Options** + + ``-a``, ``--attributes=`` + + The attributes to get. + + Attributes can be specified with their GIO name, e.g. ``standard::icon``, or + just by namespace, e.g. ``unix``, or by ``*``, which matches all attributes. + Several attributes or groups of attributes can be specified, separated by + commas. + + By default, all attributes are listed. + + ``-h``, ``--hidden`` + + Show hidden files. + + ``-l``, ``--long`` + + Use a long listing format. + + ``-n``, ``--nofollow-symlinks`` + + Don’t follow symbolic links. + + ``-d``, ``--print-display-names`` + + Print display names. + + ``-u``, ``--print-uris`` + + Print full URIs. + +``mime`` *MIME-TYPE* [*HANDLER*] + + If no handler is given, the ``mime`` command lists the registered and + recommended applications for the MIME type. If a handler is given, it is set + as the default handler for the MIME type. + + Handlers must be specified by their desktop file name, including the + extension. Example: ``org.gnome.gedit.desktop``. + +``mkdir`` [*OPTION*…] *LOCATION*… + + Creates directories. + + The ``mkdir`` command is similar to the traditional ``mkdir`` utility. + + **Options** + + ``-p``, ``--parent`` + + Create parent directories when necessary. + +``monitor`` [*OPTION*…] [*LOCATION*…] + + Monitors files or directories for changes, such as creation deletion, content + and attribute changes, and mount and unmount operations affecting the + monitored locations. + + The ``monitor`` command uses the GIO file monitoring APIs to do its job. GIO + has different implementations for different platforms. The most common + implementation on Linux uses inotify. + + **Options** + + ``-d``, ``--dir=`` + + Monitor the given location as a directory. Normally, the file type is used + to determine whether to monitor as a file or as a directory. + + ``-f``, ``--file=`` + + Monitor the given location as a file. Normally, the file type is used to + determine whether to monitor as a file or as a directory. + + ``-D``, ``--direct=`` + + Monitor the file directly. This allows changes made via hardlinks to be + captured. + + ``-s``, ``--silent=`` + + Monitor the file directly, but don’t report changes. + + ``-n``, ``--no-moves`` + + Report moves and renames as simple deleted/created events. + + ``-m``, ``--mounts`` + + Watch for mount events. + +``mount`` [*OPTION*…] [*LOCATION*…] + + Provides commandline access to various aspects of GIO’s mounting + functionality. + + Mounting refers to the traditional concept of arranging multiple file systems + and devices in a single tree, rooted at ``/``. Classical mounting happens in + the kernel and is controlled by the mount utility. GIO expands this concept by + introducing mount daemons that can make file systems available to GIO + applications without kernel involvement. + + GIO mounts can require authentication, and the ``mount`` command may ask for + user IDs, passwords, and so on, when required. + + **Options** + + ``-m``, ``--mountable`` + + Mount as mountable. + + ``-d``, ``--device=`` + + Mount volume with device file, or other identifier. + + ``-u``, ``--unmount`` + + Unmount the location. + + ``-e``, ``--eject`` + + Eject the location. + + ``-t``, ``--stop=`` + + Stop drive with device file. + + ``-s``, ``--unmount-scheme=`` + + Unmount all mounts with the given scheme. + + ``-f``, ``--force`` + + Ignore outstanding file operations when unmounting or ejecting. + + ``-a``, ``--anonymous`` + + Use an anonymous user when authenticating. + + ``-l``, ``--list`` + + List all GIO mounts. + + ``-o``, ``--monitor`` + + Monitor mount-related events. + + ``-i``, ``--detail`` + + Show extra information. + + ``--tcrypt-pim`` + + The numeric PIM when unlocking a VeraCrypt volume. + + ``--tcrypt-hidden`` + + Mount a TCRYPT hidden volume. + + ``--tcrypt-system`` + + Mount a TCRYPT system volume. + +``move`` [*OPTION*…] *SOURCE*… *DESTINATION* + + Moves one or more files from ``SOURCE`` to ``DESTINATION``. If more than one + source is specified, the destination must be a directory. + + The ``move`` command is similar to the traditional ``mv`` utility. + + **Options** + + ``-T``, ``--no-target-directory`` + + Don’t copy into ``DESTINATION`` even if it is a directory. + + ``-p``, ``--progress`` + + Show progress. + + ``-i``, ``--interactive`` + + Prompt for confirmation before overwriting files. + + ``-b``, ``--backup`` + + Create backups of existing destination files. + + ``-C``, ``--no-copy-fallback`` + + Don’t use copy and delete fallback. + +``open`` *LOCATION*… + + Opens files with the default application that is registered to handle files of + this type. + + GIO obtains this information from the shared-mime-info database, with per-user + overrides stored in ``$XDG_DATA_HOME/applications/mimeapps.list``. + + The ``mime`` command can be used to change the default handler for a MIME + type. + + Environment variables will not be set on the application, as it may be an + existing process which is activated to handle the new file. + +``rename`` *LOCATION* *NAME* + + Renames a file. + + The ``rename`` command is similar to the traditional ``rename`` utility. + +``remove`` [*OPTION*…] *LOCATION*… + + Deletes each given file. + + This command removes files irreversibly. If you want a reversible way to + remove files, see the ``trash`` command. + + Note that not all URI schemes that are supported by GIO may allow deletion of + files. + + The ``remove`` command is similar to the traditional ``rm`` utility. + + **Options** + + ``-f``, ``--force`` + + Ignore non-existent and non-deletable files. + +``save`` [*OPTION*…] *DESTINATION* + + Reads from standard input and saves the data to the given location. + + This is similar to just redirecting output to a file using traditional shell + syntax, but the ``save`` command allows saving to location that GIO can write + to. + + **Options** + + ``-b``, ``--backup`` + + Back up existing destination files. + + ``-c``, ``--create`` + + Only create the destination if it doesn’t exist yet. + + ``-a``, ``--append`` + + Append to the end of the file. + + ``-p``, ``--private`` + + When creating, restrict access to the current user. + + ``-u``, ``--unlink`` + + When replacing, replace as if the destination did not exist. + + ``-v``, ``--print-etag`` + + Print the new ETag in the end. + + ``-e``, ``--etag=`` + + The ETag of the file that is overwritten. + +``set`` [*OPTION*…] *LOCATION* *ATTRIBUTE* *VALUE*… + + Sets a file attribute on a file. + + File attributes can be specified with their GIO name, e.g ``standard::icon``. + Note that not all GIO file attributes are writable. Use the + ``--query-writable`` option of the ``info`` command to list writable file + attributes. + + If the ``TYPE`` is unset, ``VALUE`` does not have to be specified. If the + ``TYPE`` is ``stringv``, multiple values can be given. + + **Options** + + ``-t``, ``--type=`` + + Specifies the type of the attribute. Supported types are ``string``, + ``stringv``, ``bytestring``, ``boolean``, ``uint32``, ``int32``, ``uint64``, + ``int64`` and ``unset``. + + If the type is not specified, ``string`` is assumed. + + ``-d``, ``--delete`` + + Unsets an attribute (same as setting its type to ``unset``). + + ``-n``, ``--nofollow-symlinks`` + + Don’t follow symbolic links. + +``trash`` [*OPTION*…] [*LOCATION*…] + + Sends files or directories to the ‘Trashcan’ or restore them from ‘Trashcan’. + This can be a different folder depending on where the file is located, and not + all file systems support this concept. In the common case that the file lives + inside a user’s home directory, the trash folder is ``$XDG_DATA_HOME/Trash``. + + Note that moving files to the trash does not free up space on the file system + until the ‘Trashcan’ is emptied. If you are interested in deleting a file + irreversibly, see the ``remove`` command. + + Inspecting and emptying the ‘Trashcan’ is normally supported by graphical file + managers such as Nautilus, but you can also see the trash with the command: + ``gio trash --list`` or ``gio list trash://``. + + **Options** + + ``-f``, ``--force`` + + Ignore non-existent and non-deletable files. + + ``--empty`` + + Empty the trash. + + ``--list`` + + List files in the trash with their original locations. + + ``--restore`` + + Restore a file from trash to its original location. A URI beginning with + ``trash://`` is expected here. If the original directory doesn’t exist, it + will be recreated. + +``tree`` [*OPTION*…] [*LOCATION*…] + + Lists the contents of the given locations recursively, in a tree-like format. + If no location is given, it defaults to the current directory. + + The ``tree`` command is similar to the traditional ``tree`` utility. + + **Options** + + ``-h``, ``--hidden`` + + Show hidden files. + + ``-l``, ``--follow-symlinks`` + + Follow symbolic links. + +EXIT STATUS +----------- + +On success, ``0`` is returned, a non-zero failure code otherwise. + +SEE ALSO +-------- + +`cat(1) `_, `cp(1) `_, `ls(1) `_, +`mkdir(1) `_, `mv(1) `_, `rm(1) `_, +`tree(1) `_ \ No newline at end of file diff --git a/docs/reference/gio/gio.toml.in b/docs/reference/gio/gio.toml.in new file mode 100644 index 0000000..d9c8a83 --- /dev/null +++ b/docs/reference/gio/gio.toml.in @@ -0,0 +1,71 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "Gio" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_urls = "https://docs.gtk.org/gio/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Gio is a library providing useful classes for general purpose I/O, networking, IPC, settings, and other high level application functionality" +dependencies = [ "GLib-2.0", "GModule-2.0", "GObject-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [dependencies."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "overview.md", + "file-attributes.md", + "tls-overview.md", + + "error.md", + + "pollable-utils.md", + + "dbus-error.md", + "dbus-introspection.md", + "dbus-name-owning.md", + "dbus-name-watching.md", + "dbus-utils.md", + "menu-exporter.md", + + "networking.md", + + "migrating-gdbus.md", + "migrating-gconf.md", + "migrating-gnome-vfs.md", + "migrating-posix.md", + + "io-scheduler.md", +] +content_images = [ + "gvfs-overview.png", + "menu-example.png", + "menu-model.png", +] diff --git a/docs/reference/gio/gio.xml b/docs/reference/gio/gio.xml deleted file mode 100644 index 1805b27..0000000 --- a/docs/reference/gio/gio.xml +++ /dev/null @@ -1,809 +0,0 @@ - - - - - gio - GIO - - - Developer - Matthias - Clasen - mclasen@redhat.com - - - - - - gio - 1 - User Commands - - - - gio - GIO commandline tool - - - - - gio - help - COMMAND - - - gio - version - - - gio - cat - LOCATION - - - gio - copy - OPTION - SOURCE - DESTINATION - - - gio - info - OPTION - LOCATION - - - gio - launch - DESKTOP-FILE - FILE-ARG - - - gio - list - OPTION - LOCATION - - - gio - mime - MIMETYPE - HANDLER - - - gio - mkdir - OPTION - LOCATION - - - gio - monitor - OPTION - LOCATION - - - gio - mount - OPTION - LOCATION - - - gio - move - OPTION - SOURCE - DESTINATION - - - gio - open - LOCATION - - - gio - rename - LOCATION - NAME - - - gio - remove - OPTION - LOCATION - - - gio - save - OPTION - DESTINATION - - - gio - set - OPTION - LOCATION - ATTRIBUTE - VALUE - - - gio - trash - OPTION - LOCATION - - - gio - tree - OPTION - LOCATION - - - - - Description - gio is a utility that makes many of the GIO - features available from the commandline. In doing so, it provides - commands that are similar to traditional utilities, but let you - use GIO locations instead of local files: for example you can use - something like smb://server/resource/file.txt - as a location. - Plain filenames which contain a colon will be interpreted as URIs - with an unknown protocol. To avoid this, prefix them with a path such as - ./, or with the file: protocol. - - - - Commands - - - - - help - COMMAND - - - Displays a short synopsis of the available commands or provides - detailed help on a specific command. - - - - - - version - - - Prints the GLib version to which gio - belongs. - - - - - - cat - LOCATION - - - Concatenates the given files and prints them to the standard - output. - The cat command works just like the traditional cat utility. - Note: just pipe through cat if you need its formatting options - like , or other. - - - - - - copy - OPTION - SOURCE - DESTINATION - - - Copies one or more files from SOURCE - to DESTINATION. If more than one source - is specified, the destination must be a directory. - The copy command is similar to the traditional cp utility. - - Options - - - , - Don’t copy into DESTINATION even if it is a directory. - - - , - Show progress. - - - , - Prompt for confirmation before overwriting files. - - - - Preserve all attributes of copied files. - - - , - Create backups of existing destination files. - - - , - Never follow symbolic links. - - - - Use the default permissions of the current process for the destination file, rather than copying the permissions of the source file. - - - - - - - - info - OPTION - LOCATION - - - Shows information about the given locations. - The info command is similar to the traditional ls utility. - - Options - - - , - List writable attributes. - - - , - Show information about the filesystem that the given - locations reside on. - - - - The attributes to get. - Attributes can be specified with their GIO name, e.g. - standard::icon, or just by namespace, e.g. unix, or by *, - which matches all attributes. Several attributes or groups - of attributes can be specified, separated by comma. - By default, all attributes are listed. - - - , - Don’t follow symbolic links. - - - - - - - - - launch - DESKTOP-FILE - FILE-ARG - - - Launch a desktop file from any location given. - The launch command extends the behavior of the open command by allowing - any desktop file to be launched, not only those registered as file handlers. - - - - - - list - OPTION - LOCATION - - - Lists the contents of the given locations. If no location is - given, the contents of the current directory are shown. - The list command is similar to the traditional ls utility. - - Options - - - - The attributes to get. - Attributes can be specified with their GIO name, e.g. - standard::icon, or just by namespace, e.g. unix, or by *, - which matches all attributes. Several attributes or groups - of attributes can be specified, separated by comma. - By default, all attributes are listed. - - - , - Show hidden files. - - - , - Use a long listing format. - - - , - Don’t follow symbolic links. - - - , - Print display names. - - - , - Print full URIs. - - - - - - - - - mime - MIMETYPE - HANDLER - - - If no handler is given, the mime command lists the - registered and recommended applications for the mimetype. - If a handler is given, it is set as the default handler for - the mimetype. - Handlers must be specified by their desktop file name, - including the extension. Example: org.gnome.gedit.desktop. - - - - - - mkdir - OPTION - LOCATION - - - Creates directories. - The mkdir command is similar to the traditional mkdir utility. - - Options - - - , - Create parent directories when necessary. - - - - - - - - - monitor - OPTION - LOCATION - - - Monitors files or directories for changes, such as creation - deletion, content and attribute changes, and mount and unmount - operations affecting the monitored locations. - The monitor command uses the GIO file monitoring APIs to do - its job. GIO has different implementations for different platforms. - The most common implementation on Linux uses inotify. - - Options - - - , - Monitor the given location as a directory. Normally, - the file type is used to determine whether to monitor a file or directory. - - - , - Monitor the given location as a file. Normally, - the file type is used to determine whether to monitor a file or directory. - - - , - Monitor the file directly. This allows changes made via hardlinks to be captured. - - - , - Monitor the file directly, but don’t report changes. - - - , - Report moves and renames as simple deleted/created events. - - - , - Watch for mount events. - - - - - - - - - mount - OPTION - LOCATION - - - Provides commandline access to various aspects of GIO’s mounting - functionality. - Mounting refers to the traditional concept of arranging multiple - file systems and devices in a single tree, rooted at /. Classical - mounting happens in the kernel and is controlled by the mount utility. - GIO expands this concept by introducing mount daemons that can make - file systems available to GIO applications without kernel - involvement. - GIO mounts can require authentication, and the mount command - may ask for user IDs, passwords, and so on, when required. - - Options - - - , - Mount as mountable. - - - , - Mount volume with device file, or other identifier. - - - , - Unmount the location. - - - , - Eject the location. - - - , - Stop drive with device file. - - - , - Unmount all mounts with the given scheme. - - - , - Ignore outstanding file operations when unmounting or ejecting. - - - , - Use an anonymous user when authenticating. - - - , - List all GIO mounts. - - - , - Monitor mount-related events. - - - - , - Show extra information. - - - - - The numeric PIM when unlocking a VeraCrypt volume. - - - - - Mount a TCRYPT hidden volume. - - - - - Mount a TCRYPT system volume. - - - - - - - - - - move - OPTION - SOURCE - DESTINATION - - - Moves one or more files from SOURCE - to DESTINATION. If more than one source - is specified, the destination must be a directory. - The move command is similar to the traditional mv utility. - - Options - - - , - Don’t copy into DESTINATION even if it is a directory. - - - , - Show progress. - - - , - Prompt for confirmation before overwriting files. - - - , - Create backups of existing destination files. - - - , - Don’t use copy and delete fallback. - - - - - - - - - open - LOCATION - - - Opens files with the default application that is registered - to handle files of this type. - GIO obtains this information from the shared-mime-info - database, with per-user overrides stored in - $XDG_DATA_HOME/applications/mimeapps.list. - The mime command can be used to change the default handler for - a mimetype. - Environment variables will not be set on the application, as it - may be an existing process which is activated to handle the new file. - - - - - - rename - LOCATION - NAME - - - Renames a file. - The rename command is similar to the traditional rename utility. - - - - - - remove - OPTION - LOCATION - - - Deletes each given file. - This command removes files irreversibly. If you want a reversible - way to remove files, see the trash command. - Note that not all URI schemes that are supported by GIO may - allow deletion of files. - The remove command is similar to the traditional rm utility. - - Options - - - , - Ignore non-existent and non-deletable files. - - - - - - - - - save - OPTION - DESTINATION - - - Reads from standard input and saves the data to the given - location. - This is similar to just redirecting output to a file using - traditional shell syntax, but the save command allows saving to - location that GIO can write to. - - Options - - - , - Back up existing destination files. - - - , - Only create the destination if it doesn’t exist yet. - - - , - Append to the end of the file. - - - , - When creating, restrict access to the current user. - - - , - When replacing, replace as if the destination did not exist. - - - , - Print the new ETag in the end. - - - , - The ETag of the file that is overwritten. - - - - - - - - - set - LOCATION - ATTRIBUTE - VALUE - - - Sets a file attribute on a file. - File attributes can be specified with their GIO name, e.g - standard::icon. Note that not all GIO file attributes are writable. - Use the option of the info command to list - writable file attributes. - If the TYPE is unset, - VALUE does not have to be specified. - If the TYPE is stringv, multiple values can be given. - - Options - - - , - Specifies the type of the attribute. Supported - types are string, stringv, - bytestring, boolean, - uint32, int32, - uint64, int64 and unset. - If the type is not specified, string is assumed. - - - - , - Unsets an attribute (same as setting it's type to unset). - - - , - Don’t follow symbolic links. - - - - - - - - - trash - OPTION - LOCATION - - - Sends files or directories to the ‘Trashcan’ or restore them from - ‘Trashcan’. This can be a different folder depending on where the file - is located, and not all file systems support this concept. In the common - case that the file lives inside a user’s home directory, the trash folder is - $XDG_DATA_HOME/Trash. - Note that moving files to the trash does not free up space on - the file system until the ‘Trashcan’ is emptied. If you are interested - in deleting a file irreversibly, see the remove command. - Inspecting and emptying the ‘Trashcan’ is normally supported by - graphical file managers such as Nautilus, but you can also see the - trash with the command: gio trash --list or - gio list trash://. - - Options - - - , - Ignore non-existent and non-deletable files. - - - - Empty the trash. - - - - List files in the trash with their original locations - - - - Restore a file from trash to its original location. A URI beginning - with trash:// is expected here. If the original - directory doesn't exist, it will be recreated. - - - - - - - - - tree - OPTION - LOCATION - - - Lists the contents of the given locations recursively, in a - tree-like format. If no location is given, it defaults to the current - directory. - The tree command is similar to the traditional tree utility. - - Options - - - , - Show hidden files. - - - , - Follow symbolic links. - - - - - - - - - - Exit status - On success 0 is returned, a non-zero failure code otherwise. - - - - See Also - - - cat - 1 - , - - cp - 1 - , - - ls - 1 - , - - mkdir - 1 - , - - mv - 1 - , - - rm - 1 - , - - tree - 1 - . - - - diff --git a/docs/reference/gio/glib-compile-resources.rst b/docs/reference/gio/glib-compile-resources.rst new file mode 100644 index 0000000..096dc1d --- /dev/null +++ b/docs/reference/gio/glib-compile-resources.rst @@ -0,0 +1,181 @@ +.. _glib-compile-resources(1): +.. meta:: + :copyright: Copyright 2012, 2016 Red Hat, Inc. + :copyright: Copyright 2012 Christian Persch + :copyright: Copyright 2016 Sam Thursfield + :copyright: Copyright 2016 Patrick Griffis + :copyright: Copyright 2018 Ninja-Koala + :copyright: Copyright 2018, 2021 Emmanuele Bassi + :copyright: Copyright 2020 Endless OS Foundation, LLC + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2012, 2016 Red Hat, Inc. + SPDX-FileCopyrightText: 2012 Christian Persch + SPDX-FileCopyrightText: 2016 Sam Thursfield + SPDX-FileCopyrightText: 2016 Patrick Griffis + SPDX-FileCopyrightText: 2018 Ninja-Koala + SPDX-FileCopyrightText: 2018, 2021 Emmanuele Bassi + SPDX-FileCopyrightText: 2020 Endless OS Foundation, LLC + SPDX-License-Identifier: LGPL-2.1-or-later + +====================== +glib-compile-resources +====================== + +---------------------- +GLib resource compiler +---------------------- + +SYNOPSIS +-------- + +| **glib-compile-resources** [*OPTION*…] *FILE* + +DESCRIPTION +----------- + +``glib-compile-resources`` reads the resource description from ``FILE`` and the +files that it references and creates a binary resource bundle that is suitable +for use with the ``GResource`` API. The resulting bundle is then written out +as-is, or as C source for linking into an application. + +The XML resource files normally have the filename extension ``.gresource.xml``. +For a detailed description of the XML file format, see the +``GResource`` `documentation `_. + +OPTIONS +------- + +``-h``, ``--help`` + + Print help and exit. + +``--version`` + + Print program version and exit. + +``--target `` + + Store the compiled resources in the file ``TARGET``. If not specified a + filename based on the ``FILE`` basename is used. + +``--sourcedir `` + + The files referenced in ``FILE`` are loaded from this directory. If not + specified, the current directory is used. + +``--generate`` + + Write the output file in the format selected for by its filename extension: + + ``.c`` + + C source + + ``.h`` + + C header + + ``.gresource`` + + resource bundle + +``--generate-source`` + + Instead of a writing the resource bundle in binary form, create a C source + file that contains the resource bundle. This can then be compiled into an + application for easy access. + +``--generate-header`` + + Generate a header file for use with C code generated by ``--generate-source``. + +``--generate-dependencies`` + + Prints the list of files that the resource bundle references to standard + output. This can be used to track dependencies in the build system. For + example, the following make rule would mark ``test.gresource`` as depending on + all the files that ``test.gresource.xml`` includes, so that it is + automatically rebuilt if any of them change:: + + test.gresource: test.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies test.gresource.xml) + + Note that this may or may not be portable to non-GNU ``make``. + + Also see ``--dependency-file``. + +``--c-name`` + + Specify the prefix used for the C identifiers in the code generated by + ``--generate-source`` and ``--generate-header``. + +``--manual-register`` + + By default, code generated by ``--generate-source`` uses automatic + initialization of the resource. This works on most systems by using the + compiler support for constructors. However, some (uncommon) compilers may not + support this, you can then specify ``--manual-register``, + which will generate custom register and unregister functions that your code + can manually call at initialization and uninitialization time. + +``--internal`` + + By default, code generated by ``--generate-source`` declares all + initialization functions as ``extern``. So they are exported unless this is + prevented by a link script or other means. Since libraries usually want to + use the functions only internally it can be more useful to declare them as + ``G_GNUC_INTERNAL`` which is what ``--internal`` does. + +``--external-data`` + + By default, code generated by ``--generate-source`` embeds the resource data + as a string literal. When ``--external-data`` is given, the data is only + declared in the generated C file, and the data has to be linked externally. + +``--dependency-file `` + + Write dependencies in the same style as ``gcc -M -MF`` to the given file. If + ``FILE`` is ``-``, the dependencies are written to the standard output. Unlike + ``--generate-dependencies``, this option can be combined with other + ``--generate`` options to generate dependencies as a side-effect of generating + sources. + +``--generate-phony-targets`` + + When creating a dependency file with ``--dependency-file`` include phony + targets in the same style as ``gcc -MP``. This would typically be used with + ``make``. + +``--compiler `` + + Generate code that is going to target the given compiler ``NAME``. The current + two compiler modes are ``gcc``, for all GCC-compatible toolchains; and + ``msvc``, for the Microsoft Visual C Compiler. If this option isn’t set, then + the default will be taken from the ``CC`` environment variable. + +ENVIRONMENT +----------- + +``XMLLINT`` + + The full path to the ``xmllint`` executable. This is used to preprocess + resources with the ``xml-stripblanks`` preprocessing option. If this + environment variable is not set, ``xmllint`` is searched for in the ``PATH``. + +``GDK_PIXBUF_PIXDATA`` + + Deprecated since gdk-pixbuf 2.32, as ``GResource`` supports embedding + modern image formats without conversion. + + The full path to the ``gdk-pixbuf-pixdata`` executable. This is used to + preprocess resources with the ``to-pixdata`` preprocessing option. If this + environment variable is not set, ``gdk-pixbuf-pixdata`` is searched for in the + ``PATH``. + +``JSON_GLIB_FORMAT`` + + The full path to the ``json-glib-format`` executable. This is used to + preprocess resources with the ``json-stripblanks`` preprocessing option. If + this environment variable is not set, ``json-glib-format`` is searched for in + the ``PATH``. \ No newline at end of file diff --git a/docs/reference/gio/glib-compile-resources.xml b/docs/reference/gio/glib-compile-resources.xml deleted file mode 100644 index 7ab36f5..0000000 --- a/docs/reference/gio/glib-compile-resources.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - - glib-compile-schemas - GIO - - - Developer - Alexander - Larsson - - - - - - glib-compile-resources - 1 - User Commands - - - - glib-compile-resources - GLib resource compiler - - - - - glib-compile-resources - OPTION - FILE - - - -Description -glib-compile-resources reads the resource description from -FILE and the files that it references -and creates a binary resource bundle that is suitable for use with the -GResource API. -The resulting bundle is then written out as-is, or as C source for linking into -an application. - - -The XML resource files normally have the filename extension .gresource.xml. -For a detailed description of the XML file format, see the -GResource documentation. - - - -Options - - - -, - -Print help and exit - - - - - - -Print program version and exit - - - - - - -Store the compiled resources in the file TARGET. -If not specified a filename based on the FILE -basename is used. - - - - - - -The files referenced in FILE are loaded from -this directory. If not specified, the current directory is used. - - - - - - -Write the output file in the format selected for by its filename extension: - - -.c -C source - - -.h -C header - - -.gresource -resource bundle - - - - - - - - -Instead of a writing the resource bundle in binary form create a C source file -that contains the resource bundle. This can then be compiled into an -application for easy access. - - - - - - -Generate a header file for use with C code generated by -. - - - - - - -Prints the list of files that the resource bundle references to standard output. -This can be used to track dependencies in the build system. For example, the -following make rule would mark test.gresource as -depending on all the files that test.gresource.xml -includes, so that is is automatically rebuilt if any of them change: - -test.gresource: test.gresource.xml $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies test.gresource.xml) - -Note that this may or may not be portable to non-GNU make. - - -Also see . - - - - - - - -Specify the prefix used for the C identifiers in the code generated by - and . - - - - - - -By default code generated by uses automatic -initialization of the resource. This works on most systems by using the -compiler support for constructors. However, some (uncommon) compilers may not -support this, you can then specify , -which will generate custom register and unregister functions that your code -can manually call at initialization and uninitialization time. - - - - - - -By default code generated by declares all -initialization functions as extern. So they are exported -unless this is prevented by a link script or other means. Since libraries -usually want to use the functions only internally it can be more useful to -declare them as -G_GNUC_INTERNAL -which is what does. - - - - - - -By default code generated by embeds the -resource data as a string literal. When -is given, the data is only declared in the generated C file, and the data -has to be linked externally. - - - - - - -Write dependencies in the same style as gcc -M -MF to the given file. -If is -, the dependencies are written to the standard -output. Unlike , this option can be -combined with other options to generate dependencies -as a side-effect of generating sources. - - - - - - -When creating a dependency file with -include phony targets in the same style as gcc -MP. This would typically -be used with make. - - - - - - -Generate code that is going to target the given compiler NAME. -The current two compiler modes are "gcc", for all GCC-compatible toolchains; and "msvc", -for the Microsoft Visual C Compiler. If this option isn't set, then the default will be -taken from the CC environment variable. - - - - - - -Environment - - - -XMLLINT - -The full path to the xmllint executable. This is used to -preprocess resources with the xml-stripblanks preprocessing -option. If this environment variable is not set, xmllint is -searched for in the PATH. - - - - -GDK_PIXBUF_PIXDATA - -Deprecated since gdk-pixbuf 2.32, as GResource supports embedding -modern image formats without conversion. - -The full path to the gdk-pixbuf-pixdata executable. This is -used to preprocess resources with the to-pixdata preprocessing -option. If this environment variable is not set, gdk-pixbuf-pixdata -is searched for in the PATH. - - - - -JSON_GLIB_FORMAT - -The full path to the json-glib-format executable. This is used -to preprocess resources with the json-stripblanks preprocessing -option. If this environment variable is not set, json-glib-format -is searched for in the PATH. - - - - - - diff --git a/docs/reference/gio/glib-compile-schemas.rst b/docs/reference/gio/glib-compile-schemas.rst new file mode 100644 index 0000000..4f42092 --- /dev/null +++ b/docs/reference/gio/glib-compile-schemas.rst @@ -0,0 +1,83 @@ +.. _glib-compile-schemas(1): +.. meta:: + :copyright: Copyright 2010, 2011, 2012, 2015 Red Hat, Inc. + :copyright: Copyright 2012 Allison Karlitskaya + :copyright: Copyright 2016 Sam Thursfield + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2010, 2011, 2012, 2015 Red Hat, Inc. + SPDX-FileCopyrightText: 2012 Allison Karlitskaya + SPDX-FileCopyrightText: 2016 Sam Thursfield + SPDX-License-Identifier: LGPL-2.1-or-later + +==================== +glib-compile-schemas +==================== + +------------------------- +GSettings schema compiler +------------------------- + +SYNOPSIS +-------- + +| **glib-compile-schemas** [*OPTION*…] *DIRECTORY* + +DESCRIPTION +----------- + +``glib-compile-schemas`` compiles all the GSettings XML schema files in +``DIRECTORY`` into a binary file with the name ``gschemas.compiled`` that can be +used by ``GSettings``. The XML schema files must have the filename extension +``.gschema.xml``. For a detailed description of the XML file format, see the +``GSettings`` documentation. + +At runtime, GSettings looks for schemas in the ``glib-2.0/schemas`` +subdirectories of all directories specified in the ``XDG_DATA_DIRS`` environment +variable. The usual location to install schema files is +``/usr/share/glib-2.0/schemas``. + +In addition to schema files, ``glib-compile-schemas`` reads ‘vendor override’ +files, which are key files that can override default values for keys in +the schemas. The group names in the key files are the schema ID, and the +values are written in serialized GVariant form. +Vendor override files must have the filename extension +``.gschema.override``. + +By convention, vendor override files begin with ``nn_`` where ``nn`` is a number +from 00 to 99. Higher numbered files have higher priority (e.g. if the same +override is made in a file numbered 10 and then again in a file numbered 20, the +override from 20 will take precedence). + +OPTIONS +------- + +``-h``, ``--help`` + + Print help and exit. + +``--version`` + + Print program version and exit. + +``--targetdir `` + + Store ``gschemas.compiled`` in the ``TARGET`` directory instead of + ``DIRECTORY``. + +``--strict`` + + Abort on any errors in schemas. Without this option, faulty schema files are + simply omitted from the resulting compiled schema. + +``--dry-run`` + + Don’t write ``gschemas.compiled``. This option can be used to check + ``.gschema.xml`` sources for errors. + +``--allow-any-name`` + + Do not enforce restrictions on key names. Note that this option is purely + to facility the transition from GConf, and will be removed at some time + in the future. \ No newline at end of file diff --git a/docs/reference/gio/glib-compile-schemas.xml b/docs/reference/gio/glib-compile-schemas.xml deleted file mode 100644 index 0796bd7..0000000 --- a/docs/reference/gio/glib-compile-schemas.xml +++ /dev/null @@ -1,118 +0,0 @@ - - - - glib-compile-schemas - GIO - - - Developer - Ryan - Lortie - - - - - - glib-compile-schemas - 1 - User Commands - - - - glib-compile-schemas - GSettings schema compiler - - - - - glib-compile-schemas - OPTION - DIRECTORY - - - -Description -glib-compile-schemas compiles all the GSettings XML -schema files in DIRECTORY into a binary file -with the name gschemas.compiled that can be used -by GSettings. The XML schema -files must have the filename extension .gschema.xml. -For a detailed description of the XML file format, see the -GSettings documentation. - - -At runtime, GSettings looks for schemas in the -glib-2.0/schemas subdirectories of all directories -specified in the XDG_DATA_DIRS environment variable. The -usual location to install schema files is -/usr/share/glib-2.0/schemas. - - -In addition to schema files, glib-compile-schemas reads 'vendor override' -files, which are key files that can override default values for keys in -the schemas. The group names in the key files are the schema id, and the -values are written in serialized GVariant form. -Vendor override files must have the filename extension -.gschema.override. - - -By convention, vendor override files begin with nn_ -where nn is a number from 00 to 99. Higher -numbered files have higher priority (eg: if the same override is made in -a file numbered 10 and then again in a file numbered 20, the override -from 20 will take precedence). - - - -Options - - - -, - -Print help and exit - - - - - - -Print program version and exit - - - - - - -Store gschemas.compiled in the TARGET directory instead of DIRECTORY. - - - - - - -Abort on any errors in schemas. Without this option, faulty schema files are -simply omitted from the resulting compiled schema. - - - - - - -Don't write gschemas.compiled. This option can be used -to check .gschema.xml sources for errors. - - - - - - -Do not enforce restrictions on key names. Note that this option is purely -to facility the transition from GConf, and will be removed at some time -in the future. - - - - - - diff --git a/docs/reference/gio/gresource.rst b/docs/reference/gio/gresource.rst new file mode 100644 index 0000000..cb65c69 --- /dev/null +++ b/docs/reference/gio/gresource.rst @@ -0,0 +1,66 @@ +.. _gresource(1): +.. meta:: + :copyright: Copyright 2012 Red Hat, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2012 Red Hat, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +========= +gresource +========= + +-------------- +GResource tool +-------------- + +SYNOPSIS +-------- + +| **gresource** [--section *SECTION*] list *FILE* [*PATH*] +| **gresource** [--section *SECTION*] details *FILE* [*PATH*] +| **gresource** [--section *SECTION*] extract *FILE* *PATH* +| **gresource** sections *FILE* +| **gresource** help [*COMMAND*] + +DESCRIPTION +----------- + +``gresource`` offers a simple commandline interface to ``GResource``. It lets +you list and extract resources that have been compiled into a resource file or +included in an ELF file (a binary or a shared library). + +The file to operate on is specified by the ``FILE`` argument. + +If an ELF file includes multiple sections with resources, it is possible to +select which one to operate on with the ``--section`` option. Use the +``sections`` command to find available sections. + +COMMANDS +-------- + +``list`` + + Lists resources. If ``SECTION`` is given, only list resources in this section. + If ``PATH`` is given, only list matching resources. + +``details`` + + Lists resources with details. If ``SECTION`` is given, only list resources in + this section. If ``PATH`` is given, only list matching resources. Details + include the section, size and compression of each resource. + +``extract`` + + Extracts the resource named by ``PATH`` to stdout. Note that resources may + contain binary data. + +``sections`` + + Lists sections containing resources. This is only interesting if ``FILE`` is + an ELF file. + +``help`` + + Prints help and exits. \ No newline at end of file diff --git a/docs/reference/gio/gresource.xml b/docs/reference/gio/gresource.xml deleted file mode 100644 index 4ada0eb..0000000 --- a/docs/reference/gio/gresource.xml +++ /dev/null @@ -1,127 +0,0 @@ - - - - gresource - GIO - - - Developer - Matthias - Clasen - - - - - - gresource - 1 - User Commands - - - - gresource - GResource tool - - - - - gresource - --section SECTION - list - FILE - PATH - - - gresource - --section SECTION - details - FILE - PATH - - - gresource - --section SECTION - extract - FILE - PATH - - - gresource - sections - FILE - - - gresource - help - COMMAND - - - -Description -gresource offers a simple commandline -interface to GResource. -It lets you list and extract resources that have been compiled -into a resource file or included in an elf file (a binary or a -shared library). - - -The file to operate on is specified by the FILE -argument. - - -If an elf file includes multiple sections with resources, it is -possible to select which one to operate on with the ---section option. Use the -sections command to find available sections. - - - -Commands - - - - - -Lists resources. If SECTION is given, only -list resources in this section. If PATH is -given, only list matching resources. - - - - - - -Lists resources with details. If SECTION -is given, only list resources in this section. If -PATH is given, only list matching resources. -Details include the section, size and compression of each resource. - - - - - - -Extracts the resource named by PATH to stdout. -Note that resources may contain binary data. - - - - - - -Lists sections containing resources. This is only interesting if -FILE is an elf file. - - - - - - -Prints help and exits. - - - - - - - diff --git a/docs/reference/gio/gsettings.rst b/docs/reference/gio/gsettings.rst new file mode 100644 index 0000000..c89aa35 --- /dev/null +++ b/docs/reference/gio/gsettings.rst @@ -0,0 +1,125 @@ +.. _gsettings(1): +.. meta:: + :copyright: Copyright 2010, 2011, 2013 Red Hat, Inc. + :copyright: Copyright 2011 Colin Walters + :copyright: Copyright 2016 Jeremy Whiting + :copyright: Copyright 2018 Arnaud Bonatti + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2010, 2011, 2013 Red Hat, Inc. + SPDX-FileCopyrightText: 2011 Colin Walters + SPDX-FileCopyrightText: 2016 Jeremy Whiting + SPDX-FileCopyrightText: 2018 Arnaud Bonatti + SPDX-License-Identifier: LGPL-2.1-or-later + +========= +gsettings +========= + +---------------------------- +GSettings configuration tool +---------------------------- + +SYNOPSIS +-------- + +| **gsettings** get *SCHEMA*[:*PATH*] *KEY* +| **gsettings** monitor *SCHEMA*[:*PATH*] *KEY* +| **gsettings** writable *SCHEMA*[:*PATH*] *KEY* +| **gsettings** range *SCHEMA*[:*PATH*] *KEY* +| **gsettings** describe *SCHEMA*[:*PATH*] *KEY* +| **gsettings** set *SCHEMA*[:*PATH*] *KEY* *VALUE* +| **gsettings** reset *SCHEMA*[:*PATH*] *KEY* +| **gsettings** reset-recursively *SCHEMA*[:*PATH*] +| **gsettings** list-schemas [--print-paths] +| **gsettings** list-relocatable-schemas +| **gsettings** list-keys *SCHEMA*[:*PATH*] +| **gsettings** list-children *SCHEMA*[:*PATH*] +| **gsettings** list-recursively [*SCHEMA*[:*PATH*]] +| **gsettings** help [*COMMAND*] + +DESCRIPTION +----------- + +``gsettings`` offers a simple commandline interface to ``GSettings``. It lets +you get, set or monitor an individual key for changes. + +The ``SCHEMA`` and ``KEY`` arguments are required for most commands to specify +the schema ID and the name of the key to operate on. The schema ID may +optionally have a ``:PATH`` suffix. Specifying the path is only needed if the +schema does not have a fixed path. + +When setting a key, you also need specify a ``VALUE``. The format for the value +is that of a serialized ``GVariant``, so e.g. a string must include explicit +quotes: ``'foo'``. This format is also used when printing out values. + +Note that ``gsettings`` needs a D-Bus session bus connection to write changes to +the dconf database. + +COMMANDS +-------- + +``get`` + + Gets the value of ``KEY``. The value is printed out as a serialized + ``GVariant``. + +``monitor`` + + Monitors ``KEY`` for changes and prints the changed values. If no ``KEY`` is + specified, all keys in the schema are monitored. Monitoring will continue + until the process is terminated. + +``writable`` + + Finds out whether ``KEY`` is writable. + +``range`` + + Queries the range of valid values for ``KEY``. + +``describe`` + + Queries the description of valid values for ``KEY``. + +``set`` + + Sets the value of ``KEY`` to ``VALUE``. The value is specified as a serialized + ``GVariant``. + +``reset`` + + Resets ``KEY`` to its default value. + +``reset-recursively`` + + Reset all keys under the given ``SCHEMA``. + +``list-schemas`` + + Lists the installed, non-relocatable schemas. See ``list-relocatable-schemas`` + if you are interested in relocatable schemas. If ``--print-paths`` is given, + the path where each schema is mapped is also printed. + +``list-relocatable-schemas`` + + Lists the installed, relocatable schemas. See ``list-schemas`` if you are + interested in non-relocatable schemas. + +``list-keys`` + + Lists the keys in ``SCHEMA``. + +``list-children`` + + Lists the children of ``SCHEMA``. + +``list-recursively`` + + Lists keys and values, recursively. If no ``SCHEMA`` is given, list keys in + all schemas. + +``help`` + + Prints help and exits. \ No newline at end of file diff --git a/docs/reference/gio/gsettings.xml b/docs/reference/gio/gsettings.xml deleted file mode 100644 index 5f720d6..0000000 --- a/docs/reference/gio/gsettings.xml +++ /dev/null @@ -1,248 +0,0 @@ - - - - gsettings - GIO - - - Developer - Ryan - Lortie - - - - - - gsettings - 1 - User Commands - - - - gsettings - GSettings configuration tool - - - - - gsettings - get - SCHEMA:PATH - KEY - - - gsettings - monitor - SCHEMA:PATH - KEY - - - gsettings - writable - SCHEMA:PATH - KEY - - - gsettings - range - SCHEMA:PATH - KEY - - - gsettings - describe - SCHEMA:PATH - KEY - - - gsettings - set - SCHEMA:PATH - KEY - VALUE - - - gsettings - reset - SCHEMA:PATH - KEY - - - gsettings - reset-recursively - SCHEMA:PATH - - - gsettings - list-schemas - --print-paths - - - gsettings - list-relocatable-schemas - - - gsettings - list-keys - SCHEMA:PATH - - - gsettings - list-children - SCHEMA:PATH - - - gsettings - list-recursively - SCHEMA:PATH - - - gsettings - help - COMMAND - - - -Description -gsettings offers a simple commandline -interface to GSettings. -It lets you get, set or monitor an individual key for changes. - - -The SCHEMA and KEY -arguments are required for most commands to specify the schema id and the -name of the key to operate on. The schema id may optionally have a -:PATH suffix. Specifying the path is only needed -if the schema does not have a fixed path. - - -When setting a key, you also need specify a VALUE -The format for the value is that of a serialized -GVariant, -so e.g. a string -must include explicit quotes: "'foo'". This format is also used when printing -out values. - - -Note that gsettings needs a D-Bus session bus connection to write changes to -the dconf database. - - - -Commands - - - - - -Gets the value of KEY. -The value is printed out as a serialized -GVariant. - - - - - - -Monitors KEY for changes and prints the changed -values. If no KEY is specified, all keys in the -schema are monitored. Monitoring will continue until the process is terminated. - - - - - - -Finds out whether KEY is writable. - - - - - - -Queries the range of valid values for KEY. - - - - - - -Queries the description of valid values for KEY. - - - - - - -Sets the value of KEY to -VALUE. The value is specified as a serialized -GVariant. - - - - - - -Resets KEY to its default value. - - - - - - -Reset all keys under the given SCHEMA. - - - - - - -Lists the installed, non-relocatable schemas. -See if you are interested in -relocatable schemas. If -is given, the path where each schema is mapped is also printed. - - - - - - -Lists the installed, relocatable schemas. -See if you are interested in -non-relocatable schemas. - - - - - - -Lists the keys in SCHEMA. - - - - - - -Lists the children of SCHEMA. - - - - - - -Lists keys and values, recursively. If no SCHEMA -is given, list keys in all schemas. - - - - - - -Prints help and exits. - - - - - - - diff --git a/docs/reference/gio/io-scheduler.md b/docs/reference/gio/io-scheduler.md new file mode 100644 index 0000000..490e07d --- /dev/null +++ b/docs/reference/gio/io-scheduler.md @@ -0,0 +1,20 @@ +Title: GIOScheduler +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007 Andrew Walton + +# GIOScheduler + +Schedules asynchronous I/O operations. `GIOScheduler` integrates +into the main event loop ([struct@GLib.MainLoop]) and uses threads. + +Deprecated: 2.36: As of GLib 2.36, `GIOScheduler` is deprecated in favor of +[struct@GLib.ThreadPool] and [class@Gio.Task]. + +The `GIOScheduler` API is: + * [type@Gio.IOSchedulerJobFunc] + * [func@Gio.io_scheduler_push_job] + * [func@Gio.io_scheduler_cancel_all_jobs] + * [type@Gio.IOSchedulerJob] + * [method@Gio.IOSchedulerJob.send_to_mainloop] + * [method@Gio.IOSchedulerJob.send_to_mainloop_async] + diff --git a/docs/reference/gio/menu-exporter.md b/docs/reference/gio/menu-exporter.md new file mode 100644 index 0000000..a440379 --- /dev/null +++ b/docs/reference/gio/menu-exporter.md @@ -0,0 +1,15 @@ +Title: GMenuModel Exporter +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2011 Matthias Clasen + +# GMenuModel Exporter + +These functions support exporting a [class@Gio.MenuModel] on D-Bus. The D-Bus +interface that is used is a private implementation detail. + + * [method@Gio.DBusConnection.export_menu_model] + * [method@Gio.DBusConnection.unexport_menu_model] + +To access an exported [class@Gio.MenuModel] remotely, use +[func@Gio.DBusMenuModel.get] to obtain a [class@Gio.DBusMenuModel]. + diff --git a/docs/reference/gio/meson.build b/docs/reference/gio/meson.build index 38696a1..3bb321e 100644 --- a/docs/reference/gio/meson.build +++ b/docs/reference/gio/meson.build @@ -1,236 +1,111 @@ -if get_option('gtk_doc') - subdir('gdbus-object-manager-example') - subdir('xml') - - ignore_headers = [ - 'gdbus-2.0', - 'inotify', - 'kqueue', - 'libasyncns', - 'tests', - 'win32', - 'xdgmime', - 'gappinfoprivate.h', - 'gapplicationimpl.h', - 'gasynchelper.h', - 'gcontenttypeprivate.h', - 'gcontextspecificgroup.h', - 'gcredentialsprivate.h', - 'gdbus-daemon-generated.h', - 'gdbusactiongroup-private.h', - 'gdbusauth.h', - 'gdbusauthmechanismanon.h', - 'gdbusauthmechanismexternal.h', - 'gdbusauthmechanism.h', - 'gdbusauthmechanismsha1.h', - 'gdbusdaemon.h', - 'gdbusprivate.h', - 'gdelayedsettingsbackend.h', - 'gdocumentportal.h', - 'gdummyfile.h', - 'gdummyproxyresolver.h', - 'gdummytlsbackend.h', - 'gfileattribute-priv.h', - 'gfileinfo-priv.h', - 'ghttpproxy.h', - 'giomodule-priv.h', - 'gioprivate.h', - 'giowin32-afunix.h', - 'giowin32-priv.h', - 'gio_probes.h', - 'gio_trace.h', - 'gio-tool.h', - 'glocaldirectorymonitor.h', - 'glocalfileenumerator.h', - 'glocalfile.h', - 'glocalfileinfo.h', - 'glocalfileinputstream.h', - 'glocalfileiostream.h', - 'glocalfilemonitor.h', - 'glocalfileoutputstream.h', - 'glocalvfs.h', - 'gmemorymonitordbus.h', - 'gmemorymonitorportal.h', - 'gmountprivate.h', - 'gnativevolumemonitor.h', - 'gnetworkingprivate.h', - 'gnetworkmonitorbase.h', - 'gnetworkmonitornetlink.h', - 'gnetworkmonitornm.h', - 'gnetworkmonitorportal.h', - 'gnotificationbackend.h', - 'gnotification-private.h', - 'gopenuriportal.h', - 'gpollfilemonitor.h', - 'gportalsupport.h', - 'gpowerprofilemonitordbus.h', - 'gpowerprofilemonitorportal.h', - 'gproxyresolverportal.h', - 'gregistrysettingsbackend.h', - 'gresourcefile.h', - 'gsandbox.h', - 'gsettingsbackendinternal.h', - 'gsettings-mapping.h', - 'gsettingsschema-internal.h', - 'gsocketinputstream.h', - 'gsocketoutputstream.h', - 'gsocks4aproxy.h', - 'gsocks4proxy.h', - 'gsocks5proxy.h', - 'gsubprocesslauncher-private.h', - 'gthreadedresolver.h', - 'gtrashportal.h', - 'gunionvolumemonitor.h', - 'gunixmount.h', - 'gunixresolver.h', - 'gunixvolume.h', - 'gunixvolumemonitor.h', - 'gwin32networkmonitor.h', - 'gwin32api-application-activation-manager.h', - 'gwin32api-iterator.h', - 'gwin32api-misc.h', - 'gwin32api-package.h', - 'gwin32api-storage.h', - 'gwin32appinfo.h', - 'gwin32file-sync-stream.h', - 'gwin32mount.h', - 'gwin32packageparser.h', - 'gwin32resolver.h', - 'gwin32volumemonitor.h', - 'thumbnail-verify.h', - 'xdp-dbus.h', - 'gio-visibility.h', - ] - - sections_files = files('gio-sections-common.txt') - - if host_system == 'windows' - ignore_headers += [ - 'gfiledescriptorbased.h', - 'gunixmounts.h', - 'gunixfdmessage.h', - 'gunixinputstream.h', - 'gunixoutputstream.h', - 'gdesktopappinfo.h', - 'gosxappinfo.h', - ] - sections_files += files('gio-sections-win32.txt') - platform_file = files('gio-docs-win32.xml') - else - if glib_have_cocoa - ignore_headers += ['gdesktopappinfo.h'] - else - ignore_headers += ['gosxappinfo.h'] - endif - - ignore_headers += [ - 'gwin32inputstream.h', - 'gwin32outputstream.h', - 'gwin32registrykey.h', - ] - platform_file = files('gio-docs-unix.xml') - endif - - ignore_sources = [ - 'kqueue', - 'tests', - 'gdbus-daemon-generated.c', - 'xdp-dbus.c', - ] - - docpath = join_paths(glib_datadir, 'gtk-doc', 'html') - version_conf = configuration_data() - version_conf.set('VERSION', meson.project_version()) - configure_file( - input: 'version.xml.in', - output: 'version.xml', - configuration: version_conf - ) - - concat_files_helper = find_program('concat-files-helper.py') - configure_file( - output : 'gio-sections.txt', - input : sections_files, - command : [concat_files_helper, '@OUTPUT@', '@INPUT@'], - ) - - configure_file( - output : 'gio-docs-platform.xml', - input : platform_file, - copy : true, - ) - - content_files = [ - 'overview.xml', - 'migrating-posix.xml', - 'migrating-gnome-vfs.xml', - 'migrating-gconf.xml', - 'migrating-gdbus.xml', - 'gio-querymodules.xml', - 'glib-compile-schemas.xml', - 'glib-compile-resources.xml', - 'gapplication.xml', - 'gsettings.xml', - 'gresource.xml', - 'gdbus.xml', - 'gdbus-codegen.xml', - ] - - content_files += [ - gdbus_example_objectmanager_xml, - gdbus_example_objectmanager_sources, - gdbus_object_manager_example_doc - ] - - gnome.gtkdoc('gio', - main_xml : 'gio-docs.xml', - namespace : 'g', - mode : 'none', - dependencies : [libgio_dep, libgobject_dep, libglib_dep], - src_dir : 'gio', - scan_args : [ - '--ignore-decorators=' + ignore_decorators.replace('GLIB', 'GIO'), - '--rebuild-types', - '--ignore-headers=' + ' '.join(ignore_headers), - ], - mkdb_args : [ - '--ignore-files=' + ' '.join(ignore_sources), - ], - content_files : content_files, - expand_content_files : [ - 'overview.xml', - 'migrating-posix.xml', - 'migrating-gnome-vfs.xml', - 'migrating-gconf.xml', - 'migrating-gdbus.xml', - 'gdbus-codegen.xml', - ], - html_assets : [ - 'gvfs-overview.png', - 'menu-example.png', - 'menu-model.png', - ], - fixxref_args: [ - '--html-dir=' + docpath, - '--extra-dir=' + join_paths('gio', '..', 'glib', 'html'), - '--extra-dir=' + join_paths('gio', '..', 'gobject', 'html'), - ], - install: true, - check: true, - ) -endif - - -if get_option('man') +if get_option('man-pages').enabled() manpages = ['gapplication', 'gio-querymodules', 'glib-compile-schemas', 'glib-compile-resources', 'gsettings', 'gresource', 'gdbus', 'gio', 'gdbus-codegen'] foreach page : manpages custom_target(page + '-man', - input: page + '.xml', + input: page + '.rst', output: page + '.1', - command: xsltproc_command, + command: [ + rst2man, + rst2man_flags, + '@INPUT@', + ], + capture: true, install: true, - install_dir: man1_dir) + install_dir: man1_dir, + install_tag: 'doc', + ) endforeach endif + +if get_option('documentation') and enable_gir + expand_content_files = [ + 'dbus-error.md', + 'dbus-introspection.md', + 'dbus-name-owning.md', + 'dbus-name-watching.md', + 'dbus-utils.md', + 'error.md', + 'file-attributes.md', + 'io-scheduler.md', + 'menu-exporter.md', + 'migrating-gconf.md', + 'migrating-gdbus.md', + 'migrating-gnome-vfs.md', + 'migrating-posix.md', + 'networking.md', + 'overview.md', + 'pollable-utils.md', + 'tls-overview.md', + ] + expand_content_unix_files = [ + 'unix-mounts.md', + ] + expand_content_win32_files = [] + + gio_toml = configure_file(input: 'gio.toml.in', output: 'gio.toml', configuration: toml_conf) + + custom_target('gio-docs', + input: [ gio_toml, gio_gir[0] ], + output: 'gio', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + + if host_system == 'windows' + gio_win32_toml = configure_file(input: 'gio-win32.toml.in', output: 'gio-win32.toml', configuration: toml_conf) + + custom_target('gio-win32-docs', + input: [ gio_win32_toml, gio_win32_gir[0] ], + output: 'gio-win32', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_win32_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + else + gio_unix_toml = configure_file(input: 'gio-unix.toml.in', output: 'gio-unix.toml', configuration: toml_conf) + + custom_target('gio-unix-docs', + input: [ gio_unix_toml, gio_unix_gir[0] ], + output: 'gio-unix', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_unix_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + endif +endif diff --git a/docs/reference/gio/migrating-gconf.md b/docs/reference/gio/migrating-gconf.md new file mode 100644 index 0000000..6cbe725 --- /dev/null +++ b/docs/reference/gio/migrating-gconf.md @@ -0,0 +1,466 @@ +Title: Migrating from GConf to GSettings +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010, 2012 Matthias Clasen +SPDX-FileCopyrightText: 2010 Allison Lortie +SPDX-FileCopyrightText: 2011 Ray Strode + +# Migrating from GConf to GSettings + +## Before you start + +Converting individual applications and their settings from GConf to +GSettings can be done at will. But desktop-wide settings like font or theme +settings often have consumers in multiple modules. Therefore, some +consideration has to go into making sure that all users of a setting are +converted to GSettings at the same time or that the program responsible for +configuring that setting continues to update the value in both places. + +It is always a good idea to have a look at how others have handled similar +problems before. + +## Conceptual differences + +Conceptually, GConf and GSettings are fairly similar. Both have a concept of +pluggable backends. Both keep information about keys and their types in +schemas. Both have a concept of mandatory values, which lets you implement +lock-down. + +There are some differences in the approach to schemas. GConf installs the +schemas into the database and has API to handle schema information +(`gconf_client_get_default_from_schema()`, `gconf_value_get_schema()`, etc). +GSettings on the other hand assumes that an application knows its own +schemas, and does not provide API to handle schema information at runtime. +GSettings is also more strict about requiring a schema whenever you want to +read or write a key. To deal with more free-form information that would +appear in schema-less entries in GConf, GSettings allows for schemas to be +'relocatable'. + +One difference in the way applications interact with their settings is that +with GConf you interact with a tree of settings (ie the keys you pass to +functions when reading or writing values are actually paths with the actual +name of the key as the last element. With GSettings, you create a GSettings +object which has an implicit prefix that determines where the settings get +stored in the global tree of settings, but the keys you pass when reading or +writing values are just the key names, not the full path. + +## GConfClient (and GConfBridge) API conversion + +Most people use GConf via the high-level `GConfClient` API. The +corresponding API is the [class@Gio.Settings] object. While not every +`GConfClient` function has a direct GSettings equivalent, many do: + +| GConfClient | GSettings | +|-------------|-----------| +| `gconf_client_get_default()` | no direct equivalent, instead you call [`ctor@Gio.Settings.new`] for the schemas you use | +| `gconf_client_set()` | [`method@Gio.Settings.set`] | +| `gconf_client_get()` | `g_settings_get()` | +| `gconf_client_get_bool()` | `g_settings_get_boolean()` | +| `gconf_client_set_bool()` | `g_settings_set_boolean()` | +| `gconf_client_get_int()` | `g_settings_get_int()` | +| `gconf_client_set_int()` | `g_settings_set_int()` | +| `gconf_client_get_float()` | `g_settings_get_double()` | +| `gconf_client_set_float()` | `g_settings_set_double()` | +| `gconf_client_get_string()` | `g_settings_get_string()` | +| `gconf_client_set_string()` | `g_settings_set_string()` | +| `gconf_client_get_list()` | for string lists, see `g_settings_get_strv()`, else see `g_settings_get_value()` and GVariant API | +| `gconf_client_set_list()` | for string lists, see `g_settings_set_strv()`, else see `g_settings_set_value()` and GVariant API | +| `gconf_entry_get_is_writable()` | `g_settings_is_writable()` | +| `gconf_client_notify_add()` | not required, the “changed” signal is emitted automatically | +| `gconf_client_add_dir()` | not required, each GSettings instance automatically watches all keys in its path | +| `GConfChangeSet` | `g_settings_delay()`, `g_settings_apply()` | +| `gconf_client_get_default_from_schema()` | no equivalent, applications are expected to know their schema | +| `gconf_client_all_entries()` | no equivalent, applications are expected to know their schema, and GSettings does not allow schema-less entries | +| `gconf_client_get_without_default()` | no equivalent | +| `gconf_bridge_bind_property()` | `g_settings_bind()` | +| `gconf_bridge_bind_property_full()` | `g_settings_bind_with_mapping()` | + +GConfBridge was a third-party library that used GConf to bind an object +property to a particular configuration key. GSettings offers this service +itself. + +There is a pattern that is sometimes used for GConf, where a setting can +have explicit 'value A', explicit 'value B' or 'use the system default'. +With GConf, 'use the system default' is sometimes implemented by unsetting +the user value. This is not possible in GSettings, since it does not have +API to determine if a value is the default and does not let you unset +values. The recommended way (and much clearer) way in which this can be +implemented in GSettings is to have a separate 'use-system-default' boolean +setting. + +## Change notification + +GConf requires you to call `gconf_client_add_dir()` and +`gconf_client_notify_add()` to get change notification. With GSettings, this +is not necessary; signals get emitted automatically for every change. + +The [signal@Gio.Settings::changed] signal is emitted for each changed key. +There is also a [`signal@Gio.Settings::change-event`] signal that you can +handle if you need to see groups of keys that get changed at the same time. + +GSettings also notifies you about changes in writability of keys, with the +[signal@Gio.Settings::writable-changed] signal (and the +[signal@Gio.Settings::writable-change-event] signal). + +## Change sets + +GConf has a concept of a set of changes which can be applied or reverted at +once: `GConfChangeSet` (GConf doesn't actually apply changes atomically, +which is one of its shortcomings). + +Instead of a separate object to represent a change set, GSettings has a +'delayed-apply' mode, which can be turned on for a [class@Gio.Settings] +object by calling [method@Gio.Settings.delay]. In this mode, changes done to +the GSettings object are not applied - they are still visible when calling +[method@Gio.Settings.get] on the same object, but not to other GSettings +instances or even other processes. + +To apply the pending changes all at once (GSettings does atomicity here), +call [method@Gio.Settings.apply]. To revert the pending changes, call +[method@Gio.Settings.revert] or just drop the reference to the GSettings +object. + +## Schema conversion + +If you are porting your application from GConf, most likely you already have +a GConf schema. GConf comes with a commandline tool +`gsettings-schema-convert` that can help with the task of converting a GConf +schema into an equivalent GSettings schema. The tool is not perfect and may +need assistance in some cases. + +### An example for using gsettings-schema-convert + +Running `gsettings-schema-convert --gconf --xml --schema-id +"org.gnome.font-rendering" --output org.gnome.font-rendering.gschema.xml +destop_gnome_font_rendering.schemas` on the following +`desktop_gnome_font_rendering.schemas` file: + +```xml + + + + + /schemas/desktop/gnome/font_rendering/dpi + /desktop/gnome/font_rendering/dpi + gnome + int + 96 + + DPI + The resolution used for converting font sizes to pixel sizes, in dots per inch. + + + + +``` + +produces an `org.gnome.font-rendering.gschema.xml` file with the following content: + +```xml + + + + 96 + DPI + The resolution used for converting font sizes to pixel sizes, in dots per inch. + + + +``` + +GSettings schemas are identified at runtime by their id (as specified in the +XML source file). It is recommended to use a dotted name as schema id, +similar in style to a D-Bus bus name, e.g. "org.gnome.SessionManager". In +cases where the settings are general and not specific to one application, +the id should not use StudlyCaps, e.g. "org.gnome.font-rendering". The +filename used for the XML schema source is immaterial, but schema compiler +expects the files to have the extension `.gschema.xml`. It is recommended to +simply use the schema id as the filename, followed by this extension, e.g. +`org.gnome.SessionManager.gschema.xml`. + +The XML source file for your GSettings schema needs to get installed into +`$datadir/glib-2.0/schemas`, and needs to be compiled into a binary form. At +runtime, GSettings looks for compiled schemas in the `glib-2.0/schemas` +subdirectories of all `XDG_DATA_DIRS` directories, so if you install your +schema in a different location, you need to set the `XDG_DATA_DIRS` +environment variable appropriately. + +Schemas are compiled into binary form by the `glib-compile-schemas` utility. +GIO provides a `glib_compile_schemas` variable in its pkg-config file +pointing to the schema compiler binary. + +### Using schemas with Meson + +You should use `install_data()` to install the `.gschema.xml` file in the +correct directory, e.g. + +``` +install_data('my.app.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0/schemas') +``` + +Schema compilation is done at installation time; if you are using Meson 0.57 or newer, you can use the `gnome.post_install()` function from the GNOME module: + +``` +gnome.post_install(glib_compile_schemas: true) +``` + +Alternatively, you can use `meson.add_install_script()` and the following +Python script: + +```py +#!/usr/bin/env python3 +# build-aux/compile-schemas.py + +import os +import subprocess + +install_prefix = os.environ['MESON_INSTALL_PREFIX'] +schemadir = os.path.join(install_prefix, 'share', 'glib-2.0', 'schemas') + +if not os.environ.get('DESTDIR'): + print('Compiling gsettings schemas...') + subprocess.call(['glib-compile-schemas', schemadir]) +``` + +``` +meson.add_install_script('build-aux/compile-schemas.py') +``` + +### Using schemas with Autotools + +GLib provides m4 macros for hiding the various complexities and reduce the +chances of getting things wrong. + +To handle schemas in your Autotools build, start by adding this to your +`configure.ac`: + +``` +GLIB_GSETTINGS +``` + +Then add this fragment to your `Makefile.am`: + +``` +# gsettings_SCHEMAS is a list of all the schemas you want to install +gsettings_SCHEMAS = my.app.gschema.xml + +# include the appropriate makefile rules for schema handling +@GSETTINGS_RULES@ +``` + +This is not sufficient on its own. You need to mention what the source of +the `my.app.gschema.xml` file is. If the schema file is distributed directly +with your project's tarball then a mention in `EXTRA_DIST` is appropriate. If +the schema file is generated from another source then you will need the +appropriate rule for that, plus probably an item in `EXTRA_DIST` for the +source files used by that rule. + +One possible pitfall in doing schema conversion is that the default values +in GSettings schemas are parsed by the GVariant parser. This means that +strings need to include quotes in the XML. Also note that the types are now +specified as GVariant type strings. + +```xml +string +rgb +``` + +becomes + +```xml + + 'rgb' + +``` + +Another possible complication is that GConf specifies full paths for each +key, while a GSettings schema has a 'path' attribute that contains the +prefix for all the keys in the schema, and individual keys just have a +simple name. So + +```xml +/schemas/desktop/gnome/font_rendering/antialiasing +``` + +becomes + +```xml + + +``` + + +Default values can be localized in both GConf and GSettings schemas, but +GSettings uses gettext for the localization. You can specify the gettext +domain to use in the gettext-domain attribute. Therefore, when converting +localized defaults in GConf, + +```xml +/schemas/apps/my_app/font_size + + 18 + + + 24 + + +``` + +becomes + +```xml + + ... + + 18 + +``` + +GSettings uses gettext for translation of default values. The string that is +translated is exactly the string that appears inside of the `` +element. This includes the quotation marks that appear around strings. +Default values must be marked with the l10n attribute in the `` tag, +which should be set as equal to 'messages' or 'time' depending on the +desired category. An optional translation context can also be specified with +the context attribute, as in the example. This is usually recommended, since +the string "18" is not particularly easy to translate without context. The +translated version of the default value should be stored in the specified +gettext-domain. Care must be taken during translation to ensure that all +translated values remain syntactically valid; mistakes here will cause +runtime errors. + +GSettings schemas have optional `` and `` elements for +each key which correspond to the `` and `` elements in the +GConf schema and can be used in the same way by a GUI editor, so you should +use the same conventions for them: The summary is just a short label with no +punctuation, the description can be one or more complete sentences. If +multiple paragraphs are desired for the description, the paragraphs should +be separated by a completely empty line. + +Translations for these strings will also be handled via gettext, so you +should arrange for these strings to be extracted into your gettext catalog. +Gettext supports GSettings schemas natively since version 0.19, so all you +have to do is add the XML schema file to the list of translatable files +inside your `POTFILES.in`. + +GSettings is a bit more restrictive about key names than GConf. Key names in +GSettings can be at most 32 characters long, and must only consist of +lowercase characters, numbers and dashes, with no consecutive dashes. The +first character must not be a number or dash, and the last character cannot +be '-'. + +If you are using the GConf backend for GSettings during the transition, you +may want to keep your key names the same they were in GConf, so that +existing settings in the users GConf database are preserved. You can achieve +this by using the `--allow-any-name` with the `glib-compile-schemas` schema +compiler. Note that this option is only meant to ease the process of porting +your application, allowing parts of your application to continue to access +GConf and parts to use GSettings. By the time you have finished porting your +application you must ensure that all key names are valid. + +## Data conversion + +GConf comes with a GSettings backend that can be used to facility the +transition to the GSettings API until you are ready to make the jump to a +different backend (most likely dconf). To use it, you need to set the +`GSETTINGS_BACKEND` to 'gconf', e.g. by using + +```c +g_setenv ("GSETTINGS_BACKEND", "gconf", TRUE); +``` + +early on in your program. Note that this backend is meant purely as a +transition tool, and should not be used in production. + +GConf also comes with a utility called `gsettings-data-convert`, which is +designed to help with the task of migrating user settings from GConf into +another GSettings backend. It can be run manually, but it is designed to be +executed automatically, every time a user logs in. It keeps track of the +data migrations that it has already done, and it is harmless to run it more +than once. + +To make use of this utility, you must install a keyfile in the directory +`/usr/share/GConf/gsettings` which lists the GSettings keys and GConf paths +to map to each other, for each schema that you want to migrate user data +for. + +Here is an example: + +``` +[org.gnome.fonts] +antialiasing = /desktop/gnome/font_rendering/antialiasing +dpi = /desktop/gnome/font_rendering/dpi +hinting = /desktop/gnome/font_rendering/hinting +rgba-order = /desktop/gnome/font_rendering/rgba_order + +[apps.myapp:/path/to/myapps/] +some-odd-key1 = /apps/myapp/some_ODD-key1 +``` + +The last key demonstrates that it may be necessary to modify the key name to +comply with stricter GSettings key name rules. Of course, that means your +application must use the new key names when looking up settings in +GSettings. + +The last group in the example also shows how to handle the case of +'relocatable' schemas, which don't have a fixed path. You can specify the +path to use in the group name, separated by a colon. + +There are some limitations: `gsettings-data-convert` does not do any +transformation of the values. And it does not handle complex GConf types +other than lists of strings or integers. + +**Don't forget to require GConf 2.31.1 or newer in your configure script if +you are making use of the GConf backend or the conversion utility.** + +If, as an application developer, you are interested in manually ensuring +that `gsettings-data-convert` has been invoked (for example, to deal with the +case where the user is logged in during a distribution upgrade or for +non-XDG desktop environments which do not run the command as an autostart) +you may invoke it manually during your program initialisation. This is not +recommended for all application authors -- it is your choice if this use +case concerns you enough. + +Internally, `gsettings-data-convert` uses a keyfile to track which settings +have been migrated. The following code fragment will check that keyfile to +see if your data conversion script has been run yet and, if not, will +attempt to invoke the tool to run it. You should adapt it to your +application as you see fit. + +```c +static void +ensure_migrated (const gchar *name) +{ + gboolean needed = TRUE; + GKeyFile *kf; + gchar **list; + gsize i, n; + + kf = g_key_file_new (); + + g_key_file_load_from_data_dirs (kf, "gsettings-data-convert", + NULL, G_KEY_FILE_NONE, NULL); + list = g_key_file_get_string_list (kf, "State", "converted", &n, NULL); + + if (list) + { + for (i = 0; i < n; i++) + if (strcmp (list[i], name) == 0) + { + needed = FALSE; + break; + } + + g_strfreev (list); + } + + g_key_file_free (kf); + + if (needed) + g_spawn_command_line_sync ("gsettings-data-convert", + NULL, NULL, NULL, NULL); +} +``` + +Although there is the possibility that the `gsettings-data-convert` script +will end up running multiple times concurrently with this approach, it is +believed that this is safe. diff --git a/docs/reference/gio/migrating-gconf.xml b/docs/reference/gio/migrating-gconf.xml deleted file mode 100644 index d9fd064..0000000 --- a/docs/reference/gio/migrating-gconf.xml +++ /dev/null @@ -1,515 +0,0 @@ - - Migrating from GConf to GSettings - -
- Before you start - - - Converting individual applications and their settings from GConf to - GSettings can be done at will. But desktop-wide settings like font or - theme settings often have consumers in multiple modules. Therefore, - some consideration has to go into making sure that all users of a setting - are converted to GSettings at the same time or that the program - responsible for configuring that setting continues to update the value in - both places. - - - It is always a good idea to have a look at how others have handled - similar problems before. - -
- -
- Conceptual differences - - - Conceptually, GConf and GSettings are fairly similar. Both - have a concept of pluggable backends. Both keep information - about keys and their types in schemas. Both have a concept of - mandatory values, which lets you implement lock-down. - - - There are some differences in the approach to schemas. GConf - installs the schemas into the database and has API to handle - schema information (gconf_client_get_default_from_schema(), - gconf_value_get_schema(), etc). GSettings on the other hand - assumes that an application knows its own schemas, and does - not provide API to handle schema information at runtime. - GSettings is also more strict about requiring a schema whenever - you want to read or write a key. To deal with more free-form - information that would appear in schema-less entries in GConf, - GSettings allows for schemas to be 'relocatable'. - - - One difference in the way applications interact with their - settings is that with GConf you interact with a tree of - settings (ie the keys you pass to functions when reading - or writing values are actually paths with the actual name - of the key as the last element. With GSettings, you create - a GSettings object which has an implicit prefix that determines - where the settings get stored in the global tree of settings, - but the keys you pass when reading or writing values are just - the key names, not the full path. - -
- -
- GConfClient (and GConfBridge) API conversion - - - Most people use GConf via the high-level #GConfClient API. - The corresponding API is the #GSettings object. While not - every GConfClient function has a direct GSettings equivalent, - many do: - - - - GConfClientGSettings - - - gconf_client_get_default()no direct equivalent, - instead you call g_settings_new() for the schemas you use - gconf_client_set()g_settings_set() - gconf_client_get()g_settings_get() - gconf_client_get_bool()g_settings_get_boolean() - gconf_client_set_bool()g_settings_set_boolean() - gconf_client_get_int()g_settings_get_int() - gconf_client_set_int()g_settings_set_int() - gconf_client_get_float()g_settings_get_double() - gconf_client_set_float()g_settings_set_double() - gconf_client_get_string()g_settings_get_string() - gconf_client_set_string()g_settings_set_string() - gconf_client_get_list()for string lists, see g_settings_get_strv(), else see g_settings_get_value() and #GVariant API - gconf_client_set_list()for string lists, see g_settings_set_strv(), else see g_settings_set_value() and #GVariant API - gconf_entry_get_is_writable()g_settings_is_writable() - gconf_client_notify_add()not required, the #GSettings::changed signal is emitted automatically - gconf_client_add_dir()not required, each GSettings instance automatically watches all keys in its path - #GConfChangeSetg_settings_delay(), g_settings_apply() - gconf_client_get_default_from_schema()no equivalent, applications are expected to know their schema - gconf_client_all_entries()no equivalent, applications are expected to know their schema, and GSettings does not allow schema-less entries - gconf_client_get_without_default()no equivalent - gconf_bridge_bind_property()g_settings_bind() - gconf_bridge_bind_property_full()g_settings_bind_with_mapping() - - -
-
- - GConfBridge was a third-party library that used GConf to bind an object property - to a particular configuration key. GSettings offers this service itself. - - - There is a pattern that is sometimes used for GConf, where a setting can have - explicit 'value A', explicit 'value B' or 'use the system default'. With GConf, - 'use the system default' is sometimes implemented by unsetting the user value. - - - This is not possible in GSettings, since it does not have API to determine if a value - is the default and does not let you unset values. The recommended way (and much - clearer) way in which this can be implemented in GSettings is to have a separate - 'use-system-default' boolean setting. - -
- -
- Change notification - - - GConf requires you to call gconf_client_add_dir() and - gconf_client_notify_add() to get change notification. With - GSettings, this is not necessary; signals get emitted automatically - for every change. - - - The #GSettings::changed signal is emitted for each changed key. - There is also a #GSettings::change-event signal that you can handle - if you need to see groups of keys that get changed at the same time. - - - GSettings also notifies you about changes in writability of keys, - with the #GSettings::writable-changed signal (and the - #GSettings::writable-change-event signal). - -
- -
Change sets - - GConf has a concept of a set of changes which can be applied or reverted - at once: #GConfChangeSet (GConf doesn't actually apply changes atomically, - which is one of its shortcomings). - - - Instead of a separate object to represent a change set, GSettings has a - 'delayed-apply' mode, which can be turned on for a GSettings object by - calling g_settings_delay(). In this mode, changes done to the GSettings - object are not applied - they are still visible when calling g_settings_get() - on the same object, but not to other GSettings instances - or even other processes. - - - To apply the pending changes all at once (GSettings does - atomicity here), call g_settings_apply(). To revert the pending changes, - call g_settings_revert() or just drop the reference to the #GSettings object. - -
- -
- Schema conversion - - - If you are porting your application from GConf, most likely you already - have a GConf schema. GConf comes with a commandline tool - gsettings-schema-convert that can help with the task of converting - a GConf schema into an equivalent GSettings schema. The tool is not - perfect and may need assistance in some cases. - - An example for using gsettings-schema-convert - Running gsettings-schema-convert --gconf --xml --schema-id "org.gnome.font-rendering" --output org.gnome.font-rendering.gschema.xml destop_gnome_font_rendering.schemas on the following desktop_gnome_font_rendering.schemas file: - - - - - - /schemas/desktop/gnome/font_rendering/dpi - /desktop/gnome/font_rendering/dpi - gnome - int - 96 - - DPI - The resolution used for converting font sizes to pixel sizes, in dots per inch. - - - - -]]> - -produces a org.gnome.font-rendering.gschema.xml file with the following content: - - - - - 96 - DPI - The resolution used for converting font sizes to pixel sizes, in dots per inch. - - - -]]> - - - - - - GSettings schemas are identified at runtime by their id (as specified - in the XML source file). It is recommended to use a dotted name as schema - id, similar in style to a D-Bus bus name, e.g. "org.gnome.SessionManager". - In cases where the settings are general and not specific to one application, - the id should not use StudlyCaps, e.g. "org.gnome.font-rendering". - The filename used for the XML schema source is immaterial, but - schema compiler expects the files to have the extension - .gschema.xml. It is recommended to simply - use the schema id as the filename, followed by this extension, - e.g. org.gnome.SessionManager.gschema.xml. - - - - The XML source file for your GSettings schema needs to get installed - into $datadir/glib-2.0/schemas, and needs to be - compiled into a binary form. At runtime, GSettings looks for compiled - schemas in the glib-2.0/schemas subdirectories - of all XDG_DATA_DIRS directories, so if you install - your schema in a different location, you need to set the - XDG_DATA_DIRS environment variable appropriately. - - - Schemas are compiled into binary form by the - glib-compile-schemas utility. - GIO provides a glib_compile_schemas - variable for the schema compiler. - - - You can ignore all of this by using the provided m4 macros. To - do this, add to your configure.ac: - -GLIB_GSETTINGS - - The corresponding Makefile.am fragment looks like - this: - -# gsettings_SCHEMAS is a list of all the schemas you want to install -gsettings_SCHEMAS = my.app.gschema.xml - -# include the appropriate makefile rules for schema handling -@GSETTINGS_RULES@ - - - - - This is not sufficient on its own. You need to mention what the source - of the my.app.gschema.xml file is. If the schema - file is distributed directly with your project's tarball then a mention - in EXTRA_DIST is appropriate. If the schema file is - generated from another source then you will need the appropriate rule - for that, plus probably an item in EXTRA_DIST for the - source files used by that rule. - - - - One possible pitfall in doing schema conversion is that the default - values in GSettings schemas are parsed by the #GVariant parser. - This means that strings need to include quotes in the XML. Also note - that the types are now specified as #GVariant type strings. - -string -rgb -]]> - - becomes - - - 'rgb' - -]]> - - - - Another possible complication is that GConf specifies full paths - for each key, while a GSettings schema has a 'path' attribute that - contains the prefix for all the keys in the schema, and individual - keys just have a simple name. So - -/schemas/desktop/gnome/font_rendering/antialiasing -]]> - - becomes - - - -]]> - - - - Default values can be localized in both GConf and GSettings schemas, - but GSettings uses gettext for the localization. You can specify - the gettext domain to use in the gettext-domain - attribute. Therefore, when converting localized defaults in GConf, - -/schemas/apps/my_app/font_size - - 18 - - - 24 - - -]]> - - becomes - - - ... - - 18 - -]]> - - - - GSettings uses gettext for translation of default values. - The string that is translated is exactly the string that appears - inside of the default element. This - includes the quotation marks that appear around strings. - Default values must be marked with the l10n - attribute in the default tag, which - should be set as equal to 'messages' or - 'time' depending on the desired category. An - optional translation context can also be specified with the - context attribute, as in the example. This - is usually recommended, since the string "18" - is not particularly easy to translate without context. The - translated version of the default value should be stored in the - specified gettext-domain. Care must be taken - during translation to ensure that all translated values remain - syntactically valid; mistakes here will cause runtime errors. - - - GSettings schemas have optional summary and - description elements for each key which - correspond to the short and - long elements in the GConf schema and - will be used in similar ways by a future gsettings-editor, so you - should use the same conventions for them: The summary is just a short - label with no punctuation, the description can be one or more complete - sentences. If multiple paragraphs are desired for the description, the - paragraphs should be separated by a completely empty line. - - - Translations for these strings will also be handled - via gettext, so you should arrange for these strings to be - extracted into your gettext catalog. One way to do that is to use - intltool. Since intltool 0.50.1, schema files are - supported, so all you have to do is to add your .gschema.xml - files to POTFILES.in with a line like - - [type: gettext/gsettings]data/org.foo.MyApp.gschema.xml - - - - GSettings is a bit more restrictive about key names than GConf. Key - names in GSettings can be at most 32 characters long, and must only - consist of lowercase characters, numbers and dashes, with no - consecutive dashes. The first character must not be a number or dash, - and the last character cannot be '-'. - - - If you are using the GConf backend for GSettings during the - transition, you may want to keep your key names the same they - were in GConf, so that existing settings in the users GConf - database are preserved. You can achieve this by using the - with the - glib-compile-schemas schema - compiler. Note that this option is only meant - to ease the process of porting your application, allowing parts - of your application to continue to access GConf and parts to use - GSettings. By the time you have finished porting your application - you must ensure that all key names are valid. - -
- -
Data conversion - - GConf comes with a GSettings backend that can be used to - facility the transition to the GSettings API until you are - ready to make the jump to a different backend (most likely - dconf). To use it, you need to set the GSETTINGS_BACKEND - to 'gconf', e.g. by using - - g_setenv ("GSETTINGS_BACKEND", "gconf", TRUE); - - early on in your program. Note that this backend is meant purely - as a transition tool, and should not be used in production. - - - GConf also comes with a utility called - gsettings-data-convert, which is designed to help - with the task of migrating user settings from GConf into another - GSettings backend. It can be run manually, but it is designed to be - executed automatically, every time a user logs in. It keeps track of - the data migrations that it has already done, and it is harmless to - run it more than once. - - - To make use of this utility, you must install a keyfile in the - directory /usr/share/GConf/gsettings which - lists the GSettings keys and GConf paths to map to each other, for - each schema that you want to migrate user data for. - - - Here is an example: - - - - The last key demonstrates that it may be necessary to modify the key - name to comply with stricter GSettings key name rules. Of course, - that means your application must use the new key names when looking - up settings in GSettings. - - - The last group in the example also shows how to handle the case - of 'relocatable' schemas, which don't have a fixed path. You can - specify the path to use in the group name, separated by a colon. - - - There are some limitations: gsettings-data-convert - does not do any transformation of the values. And it does not handle - complex GConf types other than lists of strings or integers. - - - Don't forget to require GConf 2.31.1 or newer in your configure - script if you are making use of the GConf backend or the conversion - utility. - - - - If, as an application developer, you are interested in manually - ensuring that gsettings-data-convert has been - invoked (for example, to deal with the case where the user is - logged in during a distribution upgrade or for non-XDG desktop - environments which do not run the command as an autostart) you - may invoke it manually during your program initialisation. This - is not recommended for all application authors -- it is your - choice if this use case concerns you enough. - - - Internally, gsettings-data-convert uses a - keyfile to track which settings have been migrated. The - following code fragment will check that keyfile to see if your - data conversion script has been run yet and, if not, will - attempt to invoke the tool to run it. You should adapt it to - your application as you see fit. - - - - - - - - Although there is the possibility that the - gsettings-data-convert script will end up - running multiple times concurrently with this approach, it is - believed that this is safe. - -
-
diff --git a/docs/reference/gio/migrating-gdbus.md b/docs/reference/gio/migrating-gdbus.md new file mode 100644 index 0000000..c2c3355 --- /dev/null +++ b/docs/reference/gio/migrating-gdbus.md @@ -0,0 +1,633 @@ +Title: Migrating to GDBus +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Matthias Clasen +SPDX-FileCopyrightText: 2010, 2011 David Zeuthen + +# Migrating to GDBus + +## Conceptual differences + +The central concepts of D-Bus are modelled in a very similar way in +dbus-glib and GDBus. Both have objects representing connections, proxies and +method invocations. But there are some important differences: + +- dbus-glib uses the libdbus reference implementation, GDBus doesn't. + Instead, it relies on GIO streams as transport layer, and has its own + implementation for the D-Bus connection setup and authentication. Apart + from using streams as transport, avoiding libdbus also lets GDBus avoid + some thorny multithreading issues. +- dbus-glib uses the GObject type system for method arguments and return + values, including a homegrown container specialization mechanism. GDBus + relies on the GVariant type system which is explicitly designed to match + D-Bus types. +- dbus-glib models only D-Bus interfaces and does not provide any types for + objects. GDBus models both D-Bus interfaces (via the GDBusInterface, + GDBusProxy and GDBusInterfaceSkeleton types) and objects (via the + GDBusObject, GDBusObjectSkeleton and GDBusObjectProxy types). +- GDBus includes native support for the org.freedesktop.DBus.Properties (via + the GDBusProxy type) and org.freedesktop.DBus.ObjectManager D-Bus + interfaces, dbus-glib doesn't. +- The typical way to export an object in dbus-glib involves generating glue + code from XML introspection data using dbus-binding-tool. GDBus provides a + similar tool called gdbus-codegen that can also generate Docbook D-Bus + interface documentation. +- dbus-glib doesn't provide any convenience API for owning and watching bus + names, GDBus provides the `g_bus_own_name()` and `g_bus_watch_name()` + family of convenience functions. +- GDBus provides API to parse, generate and work with Introspection XML, + dbus-glib doesn't. +- GTestDBus provides API to create isolated unit tests + +## API comparison + +| dbus-glib | GDBus | +|-----------|-------| +| `DBusGConnection` | `GDBusConnection` | +| `DBusGProxy` | `GDBusProxy`, `GDBusInterface` - also see `GDBusObjectProxy` | +| `DBusGObject` | `GDBusInterfaceSkeleton`, `GDBusInterface` - also see `GDBusObjectSkeleton` | +| `DBusGMethodInvocation` | `GDBusMethodInvocation` | +| `dbus_g_bus_get()` | `g_bus_get_sync()`, also see `g_bus_get()` | +| `dbus_g_proxy_new_for_name()` | `g_dbus_proxy_new_sync()` and `g_dbus_proxy_new_for_bus_sync()`, also see `g_dbus_proxy_new()` | +| `dbus_g_proxy_add_signal()` | not needed, use the generic “g-signal” | +| `dbus_g_proxy_connect_signal()` | use `g_signal_connect()` with “g-signal” | +| `dbus_g_connection_register_g_object()` | `g_dbus_connection_register_object()` - also see `g_dbus_object_manager_server_export()` | +| `dbus_g_connection_unregister_g_object()` | `g_dbus_connection_unregister_object()` - also see `g_dbus_object_manager_server_unexport()` | +| `dbus_g_object_type_install_info()` | introspection data is installed while registering an object, see `g_dbus_connection_register_object()` | +| `dbus_g_proxy_begin_call()` | `g_dbus_proxy_call()` | +| `dbus_g_proxy_end_call()` | `g_dbus_proxy_call_finish()` | +| `dbus_g_proxy_call()` | `g_dbus_proxy_call_sync()` | +| `dbus_g_error_domain_register()` | `g_dbus_error_register_error_domain()` | +| `dbus_g_error_has_name()` | no direct equivalent, see `g_dbus_error_get_remote_error()` | +| `dbus_g_method_return()` | `g_dbus_method_invocation_return_value()` | +| `dbus_g_method_return_error()` | `g_dbus_method_invocation_return_error()` and variants | +| `dbus_g_method_get_sender()` | `g_dbus_method_invocation_get_sender()` | + +## Owning bus names + +Using dbus-glib, you typically call RequestName manually to own a name, like in the following excerpt: + +```c +error = NULL; +res = dbus_g_proxy_call (system_bus_proxy, + "RequestName", + &error, + G_TYPE_STRING, NAME_TO_CLAIM, + G_TYPE_UINT, DBUS_NAME_FLAG_ALLOW_REPLACEMENT, + G_TYPE_INVALID, + G_TYPE_UINT, &result, + G_TYPE_INVALID); +if (!res) + { + if (error != NULL) + { + g_warning ("Failed to acquire %s: %s", + NAME_TO_CLAIM, error->message); + g_error_free (error); + } + else + { + g_warning ("Failed to acquire %s", NAME_TO_CLAIM); + } + goto out; + } + +if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + if (error != NULL) + { + g_warning ("Failed to acquire %s: %s", + NAME_TO_CLAIM, error->message); + g_error_free (error); + } + else + { + g_warning ("Failed to acquire %s", NAME_TO_CLAIM); + } + exit (1); + } + +dbus_g_proxy_add_signal (system_bus_proxy, "NameLost", + G_TYPE_STRING, G_TYPE_INVALID); +dbus_g_proxy_connect_signal (system_bus_proxy, "NameLost", + G_CALLBACK (on_name_lost), NULL, NULL); + +/* further setup ... */ +``` + +While you can do things this way with GDBus too, using +`g_dbus_proxy_call_sync()`, it is much nicer to use the high-level API for +this: + +```c +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + /* further setup ... */ +} + +/* ... */ + + owner_id = g_bus_own_name (G_BUS_TYPE_SYSTEM, + NAME_TO_CLAIM, + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT, + on_bus_acquired, + on_name_acquired, + on_name_lost, + NULL, + NULL); + + g_main_loop_run (loop); + + g_bus_unown_name (owner_id); +``` + +Note that `g_bus_own_name()` works asynchronously and requires you to enter +your mainloop to await the `on_name_aquired()` callback. Also note that in +order to avoid race conditions (e.g. when your service is activated by a +method call), you have to export your manager object before acquiring the +name. The `on_bus_acquired()` callback is the right place to do such +preparations. + +## Creating proxies for well-known names + +dbus-glib lets you create proxy objects for well-known names, like the following example: + +```c +proxy = dbus_g_proxy_new_for_name (system_bus_connection, + "org.freedesktop.Accounts", + "/org/freedesktop/Accounts", + "org.freedesktop.Accounts"); +``` + +For a DBusGProxy constructed like this, method calls will be sent to the current owner of the name, and that owner can change over time. + +The same can be achieved with GDBusProxy: + +```c +error = NULL; +proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_NONE, + NULL, /* GDBusInterfaceInfo */ + "org.freedesktop.Accounts", + "/org/freedesktop/Accounts", + "org.freedesktop.Accounts", + NULL, /* GCancellable */ + &error); +``` + +For an added layer of safety, you can specify what D-Bus interface the proxy +is expected to conform to by using the GDBusInterfaceInfo type. +Additionally, GDBusProxy loads, caches and tracks changes to the D-Bus +properties on the remote object. It also sets up match rules so D-Bus +signals from the remote object are delivered locally. + +The GDBusProxy type normally isn't used directly - instead proxies +subclassing GDBusProxy generated by `gdbus-codegen` is used, see the section +called “Using gdbus-codegen”. + +## Generating code and docs + +### Using gdbus-codegen + +dbus-glib comes with dbus-binding-tool, which can produce somewhat nice +client- and server-side wrappers for a D-Bus interface. With GDBus, +gdbus-codegen is used and like its counterpart, it also takes D-Bus +Introspection XML as input: + +#### Example D-Bus Introspection XML + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +If this XML is processed like this + +``` +gdbus-codegen --interface-prefix org.gtk.GDBus.Example.ObjectManager. \ + --generate-c-code generated-code \ + --c-namespace Example \ + --c-generate-object-manager \ + --generate-docbook generated-docs \ + gdbus-example-objectmanager.xml +``` + +then two files generated-code.h and generated-code.c are generated. +Additionally, two XML files +generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal and +generated-docs-org.gtk.GDBus.Example.ObjectManager.Cat with Docbook XML are +generated. + +While the contents of `generated-code.h` and `generated-code.c` are best described by the `gdbus-codegen` manual page, here's a brief example of how this generated code can be used: + +```c +#include "gdbus-object-manager-example/objectmanager-gen.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static GDBusObjectManagerServer *manager = NULL; + +static gboolean +on_animal_poke (ExampleAnimal *animal, + GDBusMethodInvocation *invocation, + gboolean make_sad, + gboolean make_happy, + gpointer user_data) +{ + if ((make_sad && make_happy) || (!make_sad && !make_happy)) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.Failed", + "Exactly one of make_sad or make_happy must be TRUE"); + goto out; + } + + if (make_sad) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Sad") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.SadAnimalIsSad", + "Sad animal is already sad"); + goto out; + } + + example_animal_set_mood (animal, "Sad"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + if (make_happy) + { + if (g_strcmp0 (example_animal_get_mood (animal), "Happy") == 0) + { + g_dbus_method_invocation_return_dbus_error (invocation, + "org.gtk.GDBus.Examples.ObjectManager.Error.HappyAnimalIsHappy", + "Happy animal is already happy"); + goto out; + } + + example_animal_set_mood (animal, "Happy"); + example_animal_complete_poke (animal, invocation); + goto out; + } + + g_assert_not_reached (); + + out: + return G_DBUS_METHOD_INVOCATION_HANDLED; +} + + +static void +on_bus_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + ExampleObjectSkeleton *object; + guint n; + + g_print ("Acquired a message bus connection\n"); + + /* Create a new org.freedesktop.DBus.ObjectManager rooted at /example/Animals */ + manager = g_dbus_object_manager_server_new ("/example/Animals"); + + for (n = 0; n < 10; n++) + { + gchar *s; + ExampleAnimal *animal; + + /* Create a new D-Bus object at the path /example/Animals/N where N is 000..009 */ + s = g_strdup_printf ("/example/Animals/%03d", n); + object = example_object_skeleton_new (s); + g_free (s); + + /* Make the newly created object export the interface + * org.gtk.GDBus.Example.ObjectManager.Animal (note + * that @object takes its own reference to @animal). + */ + animal = example_animal_skeleton_new (); + example_animal_set_mood (animal, "Happy"); + example_object_skeleton_set_animal (object, animal); + g_object_unref (animal); + + /* Cats are odd animals - so some of our objects implement the + * org.gtk.GDBus.Example.ObjectManager.Cat interface in addition + * to the .Animal interface + */ + if (n % 2 == 1) + { + ExampleCat *cat; + cat = example_cat_skeleton_new (); + example_object_skeleton_set_cat (object, cat); + g_object_unref (cat); + } + + /* Handle Poke() D-Bus method invocations on the .Animal interface */ + g_signal_connect (animal, + "handle-poke", + G_CALLBACK (on_animal_poke), + NULL); /* user_data */ + + /* Export the object (@manager takes its own reference to @object) */ + g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); + g_object_unref (object); + } + + /* Export all objects */ + g_dbus_object_manager_server_set_connection (manager, connection); +} + +static void +on_name_acquired (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Acquired the name %s\n", name); +} + +static void +on_name_lost (GDBusConnection *connection, + const gchar *name, + gpointer user_data) +{ + g_print ("Lost the name %s\n", name); +} + + +gint +main (gint argc, gchar *argv[]) +{ + GMainLoop *loop; + guint id; + + loop = g_main_loop_new (NULL, FALSE); + + id = g_bus_own_name (G_BUS_TYPE_SESSION, + "org.gtk.GDBus.Examples.ObjectManager", + G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | + G_BUS_NAME_OWNER_FLAGS_REPLACE, + on_bus_acquired, + on_name_acquired, + on_name_lost, + loop, + NULL); + + g_main_loop_run (loop); + + g_bus_unown_name (id); + g_main_loop_unref (loop); + + return 0; +} +``` + +This, on the other hand, is a client-side application using generated code: + +```c +#include "gdbus-object-manager-example/objectmanager-gen.h" + +/* ---------------------------------------------------------------------------------------------------- */ + +static void +print_objects (GDBusObjectManager *manager) +{ + GList *objects; + GList *l; + + g_print ("Object manager at %s\n", g_dbus_object_manager_get_object_path (manager)); + objects = g_dbus_object_manager_get_objects (manager); + for (l = objects; l != NULL; l = l->next) + { + ExampleObject *object = EXAMPLE_OBJECT (l->data); + GList *interfaces; + GList *ll; + g_print (" - Object at %s\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); + + interfaces = g_dbus_object_get_interfaces (G_DBUS_OBJECT (object)); + for (ll = interfaces; ll != NULL; ll = ll->next) + { + GDBusInterface *interface = G_DBUS_INTERFACE (ll->data); + g_print (" - Interface %s\n", g_dbus_interface_get_info (interface)->name); + + /* Note that @interface is really a GDBusProxy instance - and additionally also + * an ExampleAnimal or ExampleCat instance - either of these can be used to + * invoke methods on the remote object. For example, the generated function + * + * void example_animal_call_poke_sync (ExampleAnimal *proxy, + * gboolean make_sad, + * gboolean make_happy, + * GCancellable *cancellable, + * GError **error); + * + * can be used to call the Poke() D-Bus method on the .Animal interface. + * Additionally, the generated function + * + * const gchar *example_animal_get_mood (ExampleAnimal *object); + * + * can be used to get the value of the :Mood property. + */ + } + g_list_free_full (interfaces, g_object_unref); + } + g_list_free_full (objects, g_object_unref); +} + +static void +on_object_added (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + gchar *owner; + owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("Added object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); + g_free (owner); +} + +static void +on_object_removed (GDBusObjectManager *manager, + GDBusObject *object, + gpointer user_data) +{ + gchar *owner; + owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("Removed object at %s (owner %s)\n", g_dbus_object_get_object_path (object), owner); + g_free (owner); +} + +static void +on_notify_name_owner (GObject *object, + GParamSpec *pspec, + gpointer user_data) +{ + GDBusObjectManagerClient *manager = G_DBUS_OBJECT_MANAGER_CLIENT (object); + gchar *name_owner; + + name_owner = g_dbus_object_manager_client_get_name_owner (manager); + g_print ("name-owner: %s\n", name_owner); + g_free (name_owner); +} + +static void +on_interface_proxy_properties_changed (GDBusObjectManagerClient *manager, + GDBusObjectProxy *object_proxy, + GDBusProxy *interface_proxy, + GVariant *changed_properties, + const gchar *const *invalidated_properties, + gpointer user_data) +{ + GVariantIter iter; + const gchar *key; + GVariant *value; + gchar *s; + + g_print ("Properties Changed on %s:\n", g_dbus_object_get_object_path (G_DBUS_OBJECT (object_proxy))); + g_variant_iter_init (&iter, changed_properties); + while (g_variant_iter_next (&iter, "{&sv}", &key, &value)) + { + s = g_variant_print (value, TRUE); + g_print (" %s -> %s\n", key, s); + g_variant_unref (value); + g_free (s); + } +} + +gint +main (gint argc, gchar *argv[]) +{ + GDBusObjectManager *manager; + GMainLoop *loop; + GError *error; + gchar *name_owner; + + manager = NULL; + loop = NULL; + + loop = g_main_loop_new (NULL, FALSE); + + error = NULL; + manager = example_object_manager_client_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, + "org.gtk.GDBus.Examples.ObjectManager", + "/example/Animals", + NULL, /* GCancellable */ + &error); + if (manager == NULL) + { + g_printerr ("Error getting object manager client: %s", error->message); + g_error_free (error); + goto out; + } + + name_owner = g_dbus_object_manager_client_get_name_owner (G_DBUS_OBJECT_MANAGER_CLIENT (manager)); + g_print ("name-owner: %s\n", name_owner); + g_free (name_owner); + + print_objects (manager); + + g_signal_connect (manager, + "notify::name-owner", + G_CALLBACK (on_notify_name_owner), + NULL); + g_signal_connect (manager, + "object-added", + G_CALLBACK (on_object_added), + NULL); + g_signal_connect (manager, + "object-removed", + G_CALLBACK (on_object_removed), + NULL); + g_signal_connect (manager, + "interface-proxy-properties-changed", + G_CALLBACK (on_interface_proxy_properties_changed), + NULL); + + g_main_loop_run (loop); + + out: + if (manager != NULL) + g_object_unref (manager); + if (loop != NULL) + g_main_loop_unref (loop); + + return 0; +} +``` diff --git a/docs/reference/gio/migrating-gdbus.xml b/docs/reference/gio/migrating-gdbus.xml deleted file mode 100644 index dc4ee75..0000000 --- a/docs/reference/gio/migrating-gdbus.xml +++ /dev/null @@ -1,310 +0,0 @@ - - - -]> - - Migrating to GDBus - -
- Conceptual differences - - - The central concepts of D-Bus are modelled in a very similar way - in dbus-glib and GDBus. Both have objects representing connections, - proxies and method invocations. But there are some important - differences: - - - dbus-glib uses the libdbus - reference implementation, GDBus doesn't. Instead, it - relies on GIO streams as transport layer, and has its own - implementation for the D-Bus connection setup and - authentication. Apart from using streams as transport, - avoiding libdbus also lets GDBus avoid some thorny - multithreading issues. - - - dbus-glib uses the GObject type system for method arguments and - return values, including a homegrown container specialization - mechanism. GDBus relies on the #GVariant type system which is - explicitly designed to match D-Bus types. - - - dbus-glib models only D-Bus interfaces and does not provide - any types for objects. GDBus models both D-Bus interfaces - (via the #GDBusInterface, #GDBusProxy and - #GDBusInterfaceSkeleton types) and objects (via the - #GDBusObject, #GDBusObjectSkeleton and #GDBusObjectProxy types). - - - GDBus includes native support for the org.freedesktop.DBus.Properties (via the #GDBusProxy type) and org.freedesktop.DBus.ObjectManager D-Bus interfaces, dbus-glib doesn't. - - - The typical way to export an object in dbus-glib involves - generating glue code from XML introspection data using - dbus-binding-tool. GDBus provides a - similar tool called gdbus-codegen that - can also generate Docbook D-Bus interface documentation. - - - dbus-glib doesn't provide any convenience API for owning and - watching bus names, GDBus provides the g_bus_own_name() and - g_bus_watch_name() family of convenience functions. - - - GDBus provides API to parse, generate and work with Introspection - XML, dbus-glib doesn't. - - - GTestDBus provides API to create isolated unit tests GDBus Test Scaffolding. - - - -
- -
- API comparison - - - dbus-glib APIs and their GDBus counterparts - - - dbus-glibGDBus - - - #DBusGConnection#GDBusConnection - #DBusGProxy#GDBusProxy, #GDBusInterface - also see #GDBusObjectProxy - #DBusGObject#GDBusInterfaceSkeleton, #GDBusInterface - also see #GDBusObjectSkeleton - #DBusGMethodInvocation#GDBusMethodInvocation - dbus_g_bus_get()g_bus_get_sync(), also see - g_bus_get() - dbus_g_proxy_new_for_name()g_dbus_proxy_new_sync() and - g_dbus_proxy_new_for_bus_sync(), also see g_dbus_proxy_new() - dbus_g_proxy_add_signal()not needed, use the generic #GDBusProxy::g-signal - dbus_g_proxy_connect_signal()use g_signal_connect() with #GDBusProxy::g-signal - dbus_g_connection_register_g_object()g_dbus_connection_register_object() - also see g_dbus_object_manager_server_export() - dbus_g_connection_unregister_g_object()g_dbus_connection_unregister_object() - also see g_dbus_object_manager_server_unexport() - dbus_g_object_type_install_info()introspection data is installed while registering - an object, see g_dbus_connection_register_object() - dbus_g_proxy_begin_call()g_dbus_proxy_call() - dbus_g_proxy_end_call()g_dbus_proxy_call_finish() - dbus_g_proxy_call()g_dbus_proxy_call_sync() - dbus_g_error_domain_register()g_dbus_error_register_error_domain() - dbus_g_error_has_name()no direct equivalent, see g_dbus_error_get_remote_error() - dbus_g_method_return()g_dbus_method_invocation_return_value() - dbus_g_method_return_error()g_dbus_method_invocation_return_error() and variants - dbus_g_method_get_sender()g_dbus_method_invocation_get_sender() - - -
-
- -
- Owning bus names - - Using dbus-glib, you typically call RequestName manually - to own a name, like in the following excerpt: - message); - g_error_free (error); - } - else - { - g_warning ("Failed to acquire %s", NAME_TO_CLAIM); - } - goto out; - } - - if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) - { - if (error != NULL) - { - g_warning ("Failed to acquire %s: %s", - NAME_TO_CLAIM, error->message); - g_error_free (error); - } - else - { - g_warning ("Failed to acquire %s", NAME_TO_CLAIM); - } - exit (1); - } - - dbus_g_proxy_add_signal (system_bus_proxy, "NameLost", - G_TYPE_STRING, G_TYPE_INVALID); - dbus_g_proxy_connect_signal (system_bus_proxy, "NameLost", - G_CALLBACK (on_name_lost), NULL, NULL); - - /* further setup ... */ -]]> - - - - While you can do things this way with GDBus too, using - g_dbus_proxy_call_sync(), it is much nicer to use the high-level API - for this: - - - Note that g_bus_own_name() works asynchronously and requires - you to enter your mainloop to await the on_name_aquired() - callback. Also note that in order to avoid race conditions (e.g. - when your service is activated by a method call), you have to export - your manager object before acquiring the - name. The on_bus_acquired() callback is the right place to do - such preparations. - -
- -
- Creating proxies for well-known names - - dbus-glib lets you create proxy objects for well-known names, like the - following example: - - - For a #DBusGProxy constructed like this, method calls will be sent to - the current owner of the name, and that owner can change over time. - - - The same can be achieved with #GDBusProxy: - - - For an added layer of safety, you can specify what D-Bus - interface the proxy is expected to conform to by using the - #GDBusInterfaceInfo type. Additionally, #GDBusProxy loads, - caches and tracks changes to the D-Bus properties on the remote - object. It also sets up match rules so D-Bus signals from the - remote object are delivered locally. - - - The #GDBusProxy type normally isn't used directly - instead - proxies subclassing #GDBusProxy generated by gdbus-codegen is used, see - -
- -
- Generating code and docs - -
- Using gdbus-codegen - - - dbus-glib comes with dbus-binding-tool, which - can produce somewhat nice client- and server-side wrappers for a D-Bus interface. - With GDBus, gdbus-codegen is used and like - its counterpart, it also takes D-Bus Introspection XML as input: - - Example D-Bus Introspection XMLFIXME: MISSING XINCLUDE CONTENT: gdbus-example-objectmanager.xml - - If this XML is processed like this - - then two files generated-code.h and - generated-code.c are - generated. Additionally, two XML files - generated-docs-org.gtk.GDBus.Example.ObjectManager.Animal and - generated-docs-org.gtk.GDBus.Example.ObjectManager.Cat - with Docbook XML are generated. For an example of what the docs look - like see the Animal D-Bus interface documentation. - and - the Cat D-Bus interface documentation. - - - While the contents of generated-code.h and - generated-code.c are best described by the - gdbus-codegen manual - page, brief examples of how this generated code can be used can be found in - - and . Additionally, since - the generated code has 100% gtk-doc coverage, see - #ExampleAnimal, #ExampleCat, #ExampleObject and - #ExampleObjectManagerClient pages for documentation. - - - Server-side application using generated codeFIXME: MISSING XINCLUDE CONTENT: gdbus-example-objectmanager-server.c - - Client-side application using generated codeFIXME: MISSING XINCLUDE CONTENT: gdbus-example-objectmanager-client.c - -
- - - FIXME: MISSING XINCLUDE CONTENT: objectmanager-gen-org.gtk.GDBus.Example.ObjectManager.Animal.xml - FIXME: MISSING XINCLUDE CONTENT: objectmanager-gen-org.gtk.GDBus.Example.ObjectManager.Cat.xml - FIXME: MISSING XINCLUDE CONTENT: ExampleAnimal.xml - FIXME: MISSING XINCLUDE CONTENT: ExampleCat.xml - FIXME: MISSING XINCLUDE CONTENT: ExampleObject.xml - FIXME: MISSING XINCLUDE CONTENT: ExampleObjectManagerClient.xml - -
- -
diff --git a/docs/reference/gio/migrating-gnome-vfs.md b/docs/reference/gio/migrating-gnome-vfs.md new file mode 100644 index 0000000..6c3a8cd --- /dev/null +++ b/docs/reference/gio/migrating-gnome-vfs.md @@ -0,0 +1,109 @@ +Title: Migrating from GnomeVFS to GIO +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Matthias Clasen + +# Migrating from GnomeVFS to GIO + +## Comparison of GnomeVFS and GIO concepts + +| GnomeVFS | GIO | +|----------|-----| +| `GnomeVFSURI` | [iface@Gio.File] | +| `GnomeVFSFileInfo` | [class@Gio.FileInfo] | +| `GnomeVFSResult` | [struct@GLib.Error], with `G_IO_ERROR` values | +| `GnomeVFSHandle` & `GnomeVFSAsyncHandle` | [class@Gio.InputStream] or [class@Gio.OutputStream] | +| `GnomeVFSDirectoryHandle` | [class@Gio.FileEnumerator] | +| MIME type | content type | +| `GnomeVFSMonitor` | [class@Gio.FileMonitor] | +| `GnomeVFSVolumeMonitor` | [class@Gio.VolumeMonitor] | +| `GnomeVFSVolume` | [iface@Gio.Mount] | +| `GnomeVFSDrive` | [iface@Gio.Volume] | +| - | [iface@Gio.Drive] | +| `GnomeVFSContext` | [class@Gio.Cancellable] | +| `gnome_vfs_async_cancel()` | [method@Gio.Cancellable.cancel] | + +## Trash handling + +The handling of trashed files has been changed in GIO, compared to +gnome-vfs. gnome-vfs has a home-grown trash implementation that predates the +freedesktop.org [Desktop Trash +Can](http://www.freedesktop.org/wiki/Specifications/trash-spec) +specification that is implemented in GIO. The location for storing trashed +files has changed from `$HOME/.Trash` to `$HOME/.local/share/Trash` (or more +correctly `$XDG_DATA_HOME/Trash`), which means that there is a need for +migrating files that have been trashed by gnome-vfs to the new location. + +In gnome-vfs, the `trash://` scheme offering a merged view of all trash +directories was implemented in Nautilus, and trash-handling applications had +to find and monitor all trash directories themselves. With GIO, the +`trash://` implementation has been moved to gvfs and applications can simply +monitor that location: + +```c +static void +file_changed (GFileMonitor *file_monitor, + GFile *child, + GFile *other_file, + GFileMonitorEvent event_type, + gpointer user_data) +{ + switch (event_type) + { + case G_FILE_MONITOR_EVENT_DELETED: + g_print ("'%s' removed from trash\n", g_file_get_basename (child)); + break; + case G_FILE_MONITOR_EVENT_CREATED: + g_print ("'%s' added to trash\n", g_file_get_basename (child)); + break; + default: ; + } +} + +static void +start_monitoring_trash (void) +{ + GFile *file; + GFileMonitor *monitor; + + file = g_file_new_for_uri ("trash://"); + monitor = g_file_monitor_directory (file, 0, NULL, NULL); + g_object_unref (file); + + g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL); + + /* ... */ + +} +``` + +GIO exposes some useful metadata about trashed files. There are +`trash::orig-path` and `trash::deletion-date` attributes. The +`standard::icon` attribute of the `trash://` itself provides a suitable icon +for displaying the trash can on the desktop. If you are using this icon, +make sure to monitor this attribute for changes, since the icon may be +updated to reflect that state of the trash can. + +Moving a file to the trash is much simpler with GIO. Instead of using +`gnome_vfs_find_directory()` with `GNOME_VFS_DIRECTORY_KIND_TRASH` to find +out where to move the trashed file, just use the [`method@Gio.File.trash`] +method. + +## Operations on multiple files + +gnome-vfs has the dreaded `gnome_vfs_xfer_uri_list()` function which has +tons of options and offers the equivalent of `cp`, `mv`, `ln`, `mkdir` and +`rm` at the same time. + +GIO offers a much simpler asynchronous task functionality instead, that lets +you schedule a function to be called in a separate thread, making sure that +updates are scheduled within the main context that created the task, so you +can update your user interface. See: [`class@Gio.Task`]. + +## Mime monitoring + +gnome-vfs offered a way to monitor the association between mime types and +default handlers for changes, with the `GnomeVFSMIMEMonitor` object. GIO +does not offer a replacement for this functionality at this time, since we +have not found a compelling use case where `GnomeVFSMIMEMonitor` was used. +If you think you have such a use case, please [open an issue on the GLib +issue tracker](https://gitlab.gnome.org/GNOME/glib/issues/new). diff --git a/docs/reference/gio/migrating-gnome-vfs.xml b/docs/reference/gio/migrating-gnome-vfs.xml deleted file mode 100644 index 27194aa..0000000 --- a/docs/reference/gio/migrating-gnome-vfs.xml +++ /dev/null @@ -1,133 +0,0 @@ - - Migrating from GnomeVFS to GIO - - - Comparison of GnomeVFS and GIO concepts - - - GnomeVFSGIO - - - GnomeVFSURIGFile - GnomeVFSFileInfoGFileInfo - GnomeVFSResultGError, with G_IO_ERROR values - GnomeVFSHandle & GnomeVFSAsyncHandleGInputStream or GOutputStream - GnomeVFSDirectoryHandleGFileEnumerator - mime typecontent type - GnomeVFSMonitorGFileMonitor - GnomeVFSVolumeMonitorGVolumeMonitor - GnomeVFSVolumeGMount - GnomeVFSDriveGVolume - -GDrive - GnomeVFSContextGCancellable - gnome_vfs_async_cancelg_cancellable_cancel - - -
- -
- Trash handling - - - The handling of trashed files has been changed in GIO, compared - to gnome-vfs. gnome-vfs has a home-grown trash implementation that - predates the freedesktop.org Desktop Trash Can specification - that is implemented in GIO. The location for storing trashed files - has changed from $HOME/.Trash to - $HOME/.local/share/Trash (or more correctly - $XDG_DATA_HOME/Trash), which means that - there is a need for migrating files that have been trashed by - gnome-vfs to the new location. - - - In gnome-vfs, the trash:// scheme offering a - merged view of all trash directories was implemented in nautilus, - and trash-handling applications had to find and monitor all trash - directories themselves. With GIO, the trash:// - implementation has been moved to gvfs and applications can simply - monitor that location: - - -static void -file_changed (GFileMonitor *file_monitor, - GFile *child, - GFile *other_file, - GFileMonitorEvent event_type, - gpointer user_data) -{ - switch (event_type) - { - case G_FILE_MONITOR_EVENT_DELETED: - g_print ("'%s' removed from trash\n", g_file_get_basename (child)); - break; - case G_FILE_MONITOR_EVENT_CREATED: - g_print ("'%s' added to trash\n", g_file_get_basename (child)); - break; - default: ; - } -} - -static void -start_monitoring_trash (void) -{ - GFile *file; - GFileMonitor *monitor; - - file = g_file_new_for_uri ("trash://"); - monitor = g_file_monitor_directory (file, 0, NULL, NULL); - g_object_unref (file); - - g_signal_connect (monitor, "changed", G_CALLBACK (file_changed), NULL); - - /* ... */ - -} - - - GIO exposes some useful metadata about trashed files. There are - trash::orig-path and trash::deletion-date attributes. The - standard::icon attribute of the trash:// - itself provides a suitable icon for displaying the trash can on - the desktop. If you are using this icon, make sure to monitor - this attribute for changes, since the icon may be updated to - reflect that state of the trash can. - - - Moving a file to the trash is much simpler with GIO. Instead of - using gnome_vfs_find_directory() with %GNOME_VFS_DIRECTORY_KIND_TRASH - to find out where to move the trashed file, just use the g_file_trash() - function. - -
- -
- Operations on multiple files - - - gnome-vfs has the dreaded gnome_vfs_xfer_uri_list() function which - has tons of options and offers the equivalent of cp, mv, ln, mkdir - and rm at the same time. - - - GIO offers a much simpler I/O scheduler functionality instead, that - lets you schedule a function to be called in a separate thread, or - if threads are not available, as an idle in the mainloop. - See g_io_scheduler_push_job(). - - -
- -
- Mime monitoring - - - gnome-vfs offered a way to monitor the association between mime types - and default handlers for changes, with the #GnomeVFSMIMEMonitor object. - GIO does not offer a replacement for this functionality at this time, - since we have not found a compelling use case where - #GnomeVFSMIMEMonitor was used. If you think you have such a use - case, please report it at - https://gitlab.gnome.org/GNOME/glib/issues/new. - -
-
diff --git a/docs/reference/gio/migrating-posix.md b/docs/reference/gio/migrating-posix.md new file mode 100644 index 0000000..ded78f1 --- /dev/null +++ b/docs/reference/gio/migrating-posix.md @@ -0,0 +1,21 @@ +Title: Migrating from POSIX to GIO +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007 Matthias Clasen + +# Migrating from POSIX to GIO + +## Comparison of POSIX and GIO concepts + +The final two entries in this table require including `gio-unix-2.0.pc` as well +as `gio-2.0.pc` in your build (or, in GIR namespace terms, `GioUnix-2.0` as well +as `Gio-2.0`). + +| POSIX | GIO | +|-----------------------|-------------------------------------------------------------| +| `char *path` | [iface@Gio.File] | +| `struct stat *buf` | [class@Gio.FileInfo] | +| `struct statvfs *buf` | [class@Gio.FileInfo] | +| `int fd` | [class@Gio.InputStream] or [class@Gio.OutputStream] | +| `DIR *` | [class@Gio.FileEnumerator] | +| `fstab entry` | [`GUnixMountPoint`](../gio-unix/struct.UnixMountPoint.html) | +| `mtab entry` | [`GUnixMountEntry`](../gio-unix/struct.UnixMountEntry.html) | diff --git a/docs/reference/gio/migrating-posix.xml b/docs/reference/gio/migrating-posix.xml deleted file mode 100644 index e7dc9f4..0000000 --- a/docs/reference/gio/migrating-posix.xml +++ /dev/null @@ -1,27 +0,0 @@ - - Migrating to GIO - - - Migrating from POSIX to GIO - - - Comparison of POSIX and GIO concepts - - - POSIXGIO - - - char *pathGFile *file - struct stat *bufGFileInfo *info - struct statvfs *bufGFileInfo *info - int fdGInputStream *in - GOutputStream *out - DIR *GFileEnumerator *enum - fstab entryGUnixMountPoint *mount_point - mtab entryGUnixMountEntry *mount_entry - - -
- -
-
diff --git a/docs/reference/gio/networking.md b/docs/reference/gio/networking.md new file mode 100644 index 0000000..d3da5f5 --- /dev/null +++ b/docs/reference/gio/networking.md @@ -0,0 +1,29 @@ +Title: gnetworking.h +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Dan Winship + +# gnetworking.h + +The `` header can be included to get +various low-level networking-related system headers, automatically +taking care of certain portability issues for you. + +This can be used, for example, if you want to call +[`setsockopt()`](man:setsockopt(2)) on a [class@Gio.Socket]. + +Note that while WinSock has many of the same APIs as the +traditional UNIX socket API, most of them behave at least slightly +differently (particularly with respect to error handling). If you +want your code to work under both UNIX and Windows, you will need +to take these differences into account. + +Also, under GNU libc, certain non-portable functions are only visible +in the headers if you define `_GNU_SOURCE` before including them. Note +that this symbol must be defined before including any headers, or it +may not take effect. + +There is one function provided specifically for initialising the networking +APIs, which needs to be called only if they are being used before GLib +initialises itself: + + * [func@Gio.networking_init] diff --git a/docs/reference/gio/overview.md b/docs/reference/gio/overview.md new file mode 100644 index 0000000..824a2a2 --- /dev/null +++ b/docs/reference/gio/overview.md @@ -0,0 +1,406 @@ +Title: Overview +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007, 2008, 2010, 2011, 2012, 2013 Matthias Clasen +SPDX-FileCopyrightText: 2007, 2009 Alexander Larsson +SPDX-FileCopyrightText: 2008 A. Walton +SPDX-FileCopyrightText: 2010 David Zeuthen +SPDX-FileCopyrightText: 2013 Stef Walter +SPDX-FileCopyrightText: 2015 Collabora, Ltd. +SPDX-FileCopyrightText: 2016 Colin Walters +SPDX-FileCopyrightText: 2020 Wouter Bolsterlee +SPDX-FileCopyrightText: 2022 Endless OS Foundation, LLC + +# Overview + +GIO is striving to provide a modern, easy-to-use VFS API that sits at the +right level in the library stack, as well as other generally useful APIs +for desktop applications (such as networking and D-Bus support). The goal +is to overcome the shortcomings of GnomeVFS and provide an API that is so +good that developers prefer it over raw POSIX calls. Among other things +that means using GObject. It also means not cloning the POSIX API, but +providing higher-level, document-centric interfaces. + +The abstract file system model of GIO consists of a number of interfaces and +base classes for I/O and files: + +[iface@Gio.File] +: reference to a file + +[class@Gio.FileInfo] +: information about a file or filesystem + +[class@Gio.FileEnumerator] +: list files in directories + +[iface@Gio.Drive] +: represents a drive + +[iface@Gio.Volume] +: represents a file system in an abstract way + +[iface@Gio.Mount] +: represents a mounted file system + +Then there is a number of stream classes, similar to the input and output +stream hierarchies that can be found in frameworks like Java: + +[class@Gio.InputStream] +: read data + +[class@Gio.OutputStream] +: write data + +[class@Gio.IOStream] +: read and write data + +[iface@Gio.Seekable] +: interface optionally implemented by streams to support seeking + +There are interfaces related to applications and the types of files they +handle: + +[iface@Gio.AppInfo] +: information about an installed application + +[iface@Gio.Icon] +: abstract type for file and application icons + +There is a framework for storing and retrieving application settings: + +[class@Gio.Settings] +: stores and retrieves application settings + +There is support for network programming, including connectivity monitoring, +name resolution, lowlevel socket APIs and highlevel client and server helper +classes: + +[class@Gio.Socket] +: lowlevel platform independent socket object + +[class@Gio.Resolver] +: asynchronous and cancellable DNS resolver + +[class@Gio.SocketClient] +: high-level network client helper + +[class@Gio.SocketService] +: high-level network server helper + +[class@Gio.SocketConnection] +: network connection stream + +[iface@Gio.NetworkMonitor] +: network connectivity monitoring + +There is support for connecting to +[D-Bus](https://www.freedesktop.org/wiki/Software/dbus/), sending and receiving +messages, owning and watching bus names, and making objects available on the bus: + +[class@Gio.DBusConnection] +: a D-Bus connection + +[class@Gio.DBusMethodInvocation] +: for handling remote calls + +[class@Gio.DBusServer] +: helper for accepting connections + +[class@Gio.DBusProxy] +: proxy to access D-Bus interfaces on a remote object + +Beyond these, GIO provides facilities for file monitoring, asynchronous I/O +and filename completion. In addition to the interfaces, GIO provides +implementations for the local case. Implementations for various network file +systems are provided by the GVFS package as loadable modules. + +Other design choices which consciously break with the GnomeVFS design are to +move backends out-of-process, which minimizes the dependency bloat and makes +the whole system more robust. The backends are not included in GIO, but in +the separate GVFS package. The GVFS package also contains the GVFS daemon, +which spawn further mount daemons for each individual connection. + +![GIO in the GTK library stack](./gvfs-overview.png) + +The GIO model of I/O is stateful: if an application establishes e.g. a SFTP +connection to a server, it becomes available to all applications in the +session; the user does not have to enter his password over and over again. + +One of the big advantages of putting the VFS in the GLib layer is that GTK +can directly use it, e.g. in the filechooser. + +## Writing GIO applications + +The information in the GLib documentation about writing GLib applications is +generally applicable when writing GIO applications. + +### Threads + +GDBus has its own private worker thread, so applications using GDBus have at +least 3 threads. GIO makes heavy use of the concept of a thread-default main +context to execute callbacks of asynchronous methods in the same context in +which the operation was started. + +### Asynchronous Programming + +Many GIO functions come in two versions: synchronous and asynchronous, +denoted by an `_async` suffix. It is important to use these appropriately: +synchronous calls should not be used from within a main loop which is shared +with other code, such as one in the application’s main thread. Synchronous +calls block until they complete, and I/O operations can take noticeable +amounts of time (even on ‘fast’ SSDs). Blocking a main loop iteration while +waiting for I/O means that other sources in the main loop will not be +dispatched, such as input and redraw handlers for the application’s UI. This +can cause the application to ‘freeze’ until I/O completes. + +A few self-contained groups of functions, such as code generated by +gdbus-codegen, use a different convention: functions are asynchronous +default, and it is the synchronous version which has a `_sync` suffix. Aside +from naming differences, they should be treated the same way as functions +following the normal convention above. + +The asynchronous (`_async`) versions of functions return control to the +caller immediately, after scheduling the I/O in the kernel and adding a +callback for it to the main loop. This callback will be invoked when the +operation has completed. From the callback, the paired `_finish` function +should be called to retrieve the return value of the I/O operation, and any +errors which occurred. For more information on using and implementing +asynchronous functions, see [iface@Gio.AsyncResult] and [class@Gio.Task]. + +By starting multiple asynchronous operations in succession, they will be +executed in parallel (up to an arbitrary limit imposed by GIO’s internal +worker thread pool). + +The synchronous versions of functions can be used early in application +startup when there is no main loop to block, for example to load initial +configuration files. They can also be used for I/O on files which are +guaranteed to be small and on the local disk. Note that the user’s home +directory is not guaranteed to be on the local disk. Security + +When your program needs to carry out some privileged operation (say, create +a new user account), there are various ways in which you can go about this: + +- Implement a daemon that offers the privileged operation. A convenient way + to do this is as a D-Bus system-bus service. The daemon will probably need + ways to check the identity and authorization of the caller before + executing the operation. + [polkit](https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html) + is a framework that allows this. +- Use a small helper that is executed with elevated privileges via pkexec. + [`pkexec`](https://www.freedesktop.org/software/polkit/docs/latest/pkexec.1.html) + is a small program launcher that is part of polkit. +- Use a small helper that is executed with elevated privileges by being suid + root. + +None of these approaches is the clear winner, they all have their advantages +and disadvantages. + +When writing code that runs with elevated privileges, it is important to +follow some basic rules of secure programming. David Wheeler has an +excellent book on this topic, +[Secure Programming for Linux and Unix HOWTO](https://dwheeler.com/secure-programs/Secure-Programs-HOWTO/index.html). + +When using GIO in code that runs with elevated privileges, you have to be +careful. GIO has extension points whose implementations get loaded from +modules (executable code in shared objects), which could allow an attacker +to sneak his own code into your application by tricking it into loading the +code as a module. However, GIO will never load modules from your home +directory except when explicitly asked to do so via an environment variable. + +In most cases, your helper program should be so small that you don't need +GIO, whose APIs are largely designed to support full-blown desktop +applications. If you can't resist the convenience of these APIs, here are +some steps you should take: + +- Clear the environment, e.g. using the `clearenv()` function. David Wheeler + has a good + [explanation](https://dwheeler.com/secure-programs/Secure-Programs-HOWTO/environment-variables.html) + for why it is important to sanitize the environment. See the section on + running GIO applications for a list of all environment variables affecting + GIO. In particular, `PATH` (used to locate binaries), `GIO_EXTRA_MODULES` + (used to locate loadable modules) and `DBUS_{SYSTEM,SESSION}_BUS_ADDRESS` + (used to locate the D-Bus system and session bus) are important. +- Don't use GVfs, by setting `GIO_USE_VFS=local` in the environment. The + reason to avoid GVfs in security-sensitive programs is that it uses many + libraries which have not necessarily been audited for security problems. + Gvfs is also heavily distributed and relies on a session bus to be + present. + +## Compiling GIO applications + +GIO comes with a `gio-2.0.pc` file that you should use together with +pkg-config to obtain the necessary information about header files and +libraries. See the pkg-config man page or the GLib documentation for more +information on how to use pkg-config to compile your application. + +If you are using GIO on UNIX-like systems, you may want to use UNIX-specific +GIO interfaces such as `GUnixInputStream`, `GUnixOutputStream`, `GUnixMount` +or `GDesktopAppInfo`. To do so, use the `gio-unix-2.0.pc` file as well as +`gio-2.0.pc` (or, in GIR namespace terms, `GioUnix-2.0` as well as `Gio-2.0`). + +## Running GIO applications + +GIO inspects a few environment variables in addition to the ones used by GLib. + +- `XDG_DATA_HOME`, `XDG_DATA_DIRS`. GIO uses these environment variables to + locate MIME information. For more information, see the + [Shared MIME-info Database](https://specifications.freedesktop.org/shared-mime-info-spec/latest/) + and the [Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/latest/). +- `GVFS_DISABLE_FUSE`. This variable can be set to keep Gvfs from starting + the fuse backend, which may be unwanted or unnecessary in certain + situations. +- `GIO_USE_VFS`. This environment variable can be set to the name of a GVfs + implementation to override the default for debugging purposes. The GVfs + implementation for local files that is included in GIO has the name + "local", the implementation in the gvfs module has the name "gvfs". Most + commonly, system software will set this to "local" to avoid having `GFile` + APIs perform unnecessary D-Bus calls. The special value help can be used + to print a list of available implementations to standard output. + +The following environment variables are only useful for debugging GIO itself +or modules that it loads. They should not be set in a production +environment. + +- `GIO_USE_FILE_MONITOR`. This variable can be set to the name of a + GFileMonitor implementation to override the default for debugging + purposes. The GFileMonitor implementation for local files that is included + in GIO on Linux has the name "inotify", others that are built are built as + modules (depending on the platform) are called "fam" and "fen". The + special value help can be used to print a list of available + implementations to standard output. +- `GIO_USE_VOLUME_MONITOR`. This variable can be set to the name of a + GVolumeMonitor implementation to override the default for debugging + purposes. The GVolumeMonitor implementation for local files that is + included in GIO has the name "unix", the udisks2-based implementation in + the gvfs module has the name "udisks2". The special value help can be used + to print a list of available implementations to standard output. +- `GIO_USE_TLS`. This variable can be set to the name of a GTlsBackend + implementation to override the default for debugging purposes. GIO does + not include a GTlsBackend implementation, the gnutls-based implementation + in the glib-networking module has the name "gnutls". The special value + help can be used to print a list of available implementations to standard + output. +- `GIO_USE_PORTALS`. This variable can be set to override detection of portals + and force them to be used to provide various bits of GIO functionality, for + testing and debugging. This variable is not intended to be used in production. +- `GIO_MODULE_DIR`. When this environment variable is set to a path, GIO + will load modules from this alternate directory instead of the directory + built into GIO. This is useful when running tests, for example. This + environment variable is ignored when running in a setuid program. +- `GIO_EXTRA_MODULES`. When this environment variable is set to a path, or + a set of paths separated by a colon, GIO will attempt to load additional + modules from within the path. This environment variable is ignored when + running in a setuid program. +- `GSETTINGS_BACKEND`. This variable can be set to the name of a + GSettingsBackend implementation to override the default for debugging + purposes. The memory-based implementation that is included in GIO has the + name "memory", the one in dconf has the name "dconf". The special value + help can be used to print a list of available implementations to standard + output. +- `GSETTINGS_SCHEMA_DIR`. This variable can be set to the names of + directories to consider when looking for compiled schemas for GSettings, + in addition to the `glib-2.0/schemas` subdirectories of the XDG system + data dirs. To specify multiple directories, use `G_SEARCHPATH_SEPARATOR_S` + as a separator. +- `DBUS_SYSTEM_BUS_ADDRESS`. This variable is consulted to find the address + of the D-Bus system bus. For the format of D-Bus addresses, see the + [D-Bus specification](https://dbus.freedesktop.org/doc/dbus-specification.html#addresses). + Setting this variable overrides platform-specific ways of determining the + system bus address. +- `DBUS_SESSION_BUS_ADDRESS`. This variable is consulted to find the + address of the D-Bus session bus. Setting this variable overrides + platform-specific ways of determining the session bus address. +- `DBUS_STARTER_BUS_TYPE`. This variable is consulted to find out the + 'starter' bus for an application that has been started via D-Bus + activation. The possible values are 'system' or 'session'. +- `G_DBUS_DEBUG`. This variable can be set to a list of debug options, + which cause GLib to print out different types of debugging information + when using the D-Bus routines. + - `transport`: Show IO activity (e.g. reads and writes) + - `message`: Show all sent and received D-Bus messages + - `payload`: Show payload for all sent and received D-Bus messages (implies + message) + - `call`: Trace `g_dbus_connection_call()` and + `g_dbus_connection_call_sync()` API usage + - `signal`: Show when a D-Bus signal is received + - `incoming`: Show when an incoming D-Bus method call is received + - `return`: Show when a reply is returned via the GDBusMethodInvocation API + - `emission`: Trace `g_dbus_connection_emit_signal()` API usage + - `authentication`: Show information about connection authentication + - `address`: Show information about D-Bus address lookups and autolaunching + - `all`: Turn on all debug options + - `help`: Print a list of supported options to the standard output +- `G_DBUS_COOKIE_SHA1_KEYRING_DIR`. Can be used to override the directory + used to store the keyring used in the `DBUS_COOKIE_SHA1` authentication + mechanism. Normally the directory used is `.dbus-keyrings` in the user's + home directory. +- `G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION`. If set, the + permissions of the directory used to store the keyring used in the + `DBUS_COOKIE_SHA1` authentication mechanism won't be checked. Normally the + directory must be readable only by the user. + +## Extending GIO + +A lot of the functionality that is accessible through GIO is implemented in +loadable modules, and modules provide a convenient way to extend GIO. In +addition to the [`class@Gio.IOModule`] API which supports writing such modules, GIO has a +mechanism to define extension points, and register implementations thereof, +see [`struct@Gio.IOExtensionPoint`]. + +The following extension points are currently defined by GIO: + +- `G_VFS_EXTENSION_POINT_NAME`. Allows to override the functionality of the + GVfs class. Implementations of this extension point must be derived from + GVfs. GIO uses the implementation with the highest priority that is + active, see `g_vfs_is_active()`. GIO implements this extension point for + local files, gvfs contains an implementation that supports all the + backends in gvfs. +- `G_VOLUME_MONITOR_EXTENSION_POINT_NAME`. Allows to add more volume + monitors. Implementations of this extension point must be derived from + GVolumeMonitor. GIO uses all registered extensions. gvfs contains an + implementation that works together with the GVfs implementation in gvfs. +- `G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME`. Allows to override the + 'native' volume monitor. Implementations of this extension point must be + derived from GNativeVolumeMonitor. GIO uses the implementation with the + highest priority that is supported, as determined by the `is_supported()` + vfunc in GVolumeMonitorClass. GIO implements this extension point for + local mounts, gvfs contains a udisks2-based implementation. +- `G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME`. Allows to override the file + monitor implementation for local files. Implementations of this extension + point must be derived from GLocalFileMonitor. GIO uses the implementation + with the highest priority that is supported, as determined by the + `is_supported()` vfunc in GLocalFileMonitorClass. GIO uses this extension + point internally, to switch between its fam-based and inotify-based file + monitoring implementations. +- `G_LOCAL_DIRECTORY_MONITOR_EXTENSION_POINT_NAME`. Allows to override the + directory monitor implementation for local files. Implementations of this + extension point must be derived from GLocalDirectoryMonitor. GIO uses the + implementation with the highest priority that is supported, as determined + by the `is_supported()` vfunc in GLocalDirectoryMonitorClass. GIO uses + this extension point internally, to switch between its fam-based and + inotify-based directory monitoring implementations. +- `G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME`. Unix-only. Allows to + provide a way to associate default handlers with URI schemes. + Implementations of this extension point must implement the + GDesktopAppInfoLookup interface. GIO uses the implementation with the + highest priority. This extension point has been discontinued in GLib 2.28. + It is still available to keep API and ABI stability, but GIO is no longer + using it for default handlers. Instead, the mime handler mechanism is + used, together with x-scheme-handler pseudo-mimetypes. +- `G_SETTINGS_BACKEND_EXTENSION_POINT_NAME`. Allows to provide an + alternative storage for GSettings. Implementations of this extension point + must derive from the GSettingsBackend type. GIO contains a keyfile-based + implementation of this extension point, another one is provided by dconf. +- `G_PROXY_EXTENSION_POINT_NAME`. Allows to provide implementations for + network proxying. Implementations of this extension point must provide the + GProxy interface, and must be named after the network protocol they are + proxying. glib-networking contains an implementation of this extension + point based on libproxy. +- `G_TLS_BACKEND_EXTENSION_POINT_NAME`. Allows to provide implementations + for TLS support. Implementations of this extension point must implement + the GTlsBackend interface. glib-networking contains an implementation of + this extension point. +- `G_NETWORK_MONITOR_EXTENSION_POINT_NAME`. Allows to provide + implementations for network connectivity monitoring. Implementations of + this extension point must implement the GNetworkMonitorInterface + interface. GIO contains an implementation of this extension point that is + using the netlink interface of the Linux kernel. diff --git a/docs/reference/gio/overview.xml b/docs/reference/gio/overview.xml deleted file mode 100644 index b93a17a..0000000 --- a/docs/reference/gio/overview.xml +++ /dev/null @@ -1,745 +0,0 @@ - - GIO Overview - - - Introduction - - - GIO is striving to provide a modern, easy-to-use VFS API that sits - at the right level in the library stack, as well as other generally - useful APIs for desktop applications (such as networking and - D-Bus support). The goal is to overcome the shortcomings of GnomeVFS - and provide an API that is so good that developers prefer it over raw - POSIX calls. Among other things that means using GObject. It also means - not cloning the POSIX API, but providing higher-level, document-centric - interfaces. - - - - The abstract file system model of GIO consists of a number of - interfaces and base classes for I/O and files: - - - GFile - reference to a file - - - GFileInfo - information about a file or filesystem - - - GFileEnumerator - list files in directories - - - GDrive - represents a drive - - - GVolume - represents a file system in an abstract way - - - GMount - represents a mounted file system - - - Then there is a number of stream classes, similar to the input and - output stream hierarchies that can be found in frameworks like Java: - - - GInputStream - read data - - - GOutputStream - write data - - - GIOStream - read and write data - - - GSeekable - interface optionally implemented by streams to support seeking - - - There are interfaces related to applications and the types - of files they handle: - - - GAppInfo - information about an installed application - - - GIcon - abstract type for file and application icons - - - There is a framework for storing and retrieving application settings: - - - GSettings - stores and retrieves application settings - - - There is support for network programming, including connectivity monitoring, - name resolution, lowlevel socket APIs and highlevel client and server - helper classes: - - - GSocket - lowlevel platform independent socket object - - - GResolver - asynchronous and cancellable DNS resolver - - - GSocketClient - high-level network client helper - - - GSocketService - high-level network server helper - - - GSocketConnection - network connection stream - - - GNetworkMonitor - network connectivity monitoring - - - There is support for connecting to D-Bus, - sending and receiving messages, owning and watching bus names, - and making objects available on the bus: - - - GDBusConnection - a D-Bus connection - - - - GDBusMethodInvocation - for handling remote calls - - - - GDBusServer - helper for accepting connections - - - - GDBusProxy - proxy to access D-Bus interfaces on a remote object - - - - Beyond these, GIO provides facilities for file monitoring, - asynchronous I/O and filename completion. In addition to the - interfaces, GIO provides implementations for the local case. - Implementations for various network file systems are provided - by the GVFS package as loadable modules. - - - - Other design choices which consciously break with the GnomeVFS - design are to move backends out-of-process, which minimizes the - dependency bloat and makes the whole system more robust. The backends - are not included in GIO, but in the separate GVFS package. The GVFS - package also contains the GVFS daemon, which spawn further mount - daemons for each individual connection. - - -
- GIO in the GTK library stack - -
- - - The GIO model of I/O is stateful: if an application establishes e.g. - a SFTP connection to a server, it becomes available to all applications - in the session; the user does not have to enter their password over - and over again. - - - One of the big advantages of putting the VFS in the GLib layer - is that GTK can directly use it, e.g. in the filechooser. - -
- - - Writing GIO applications - - - The information in the GLib documentation about writing GLib - applications is generally applicable when writing GIO applications. - - - Threads - - - GDBus has its own private worker thread, so applications using - GDBus have at least 3 threads. GIO makes heavy use of the concept - of a thread-default - main context to execute callbacks of asynchronous - methods in the same context in which the operation was started. - - - - - Asynchronous Programming - - - Many GIO functions come in two versions: synchronous and asynchronous, - denoted by an _async suffix. It is important to use these - appropriately: synchronous calls should not be used from - within a main loop which is shared with other code, such as one in the - application’s main thread. Synchronous calls block until they complete, - and I/O operations can take noticeable amounts of time (even on ‘fast’ - SSDs). Blocking a main loop iteration while waiting for I/O means that - other sources in the main loop will not be dispatched, such as input and - redraw handlers for the application’s UI. This can cause the application - to ‘freeze’ until I/O completes. - - - - A few self-contained groups of functions, such as code generated by - gdbus-codegen, - use a different convention: functions are asynchronous default, and it is - the synchronous version which has a - _sync - suffix. Aside from naming differences, they should be treated the same - way as functions following the normal convention above. - - - - The asynchronous (_async) versions of functions return - control to the caller immediately, after scheduling the I/O in the kernel - and adding a callback for it to the main loop. This callback will be - invoked when the operation has completed. From the callback, the paired - _finish function should be called to retrieve the return - value of the I/O operation, and any errors which occurred. For more - information on using and implementing asynchronous functions, see - GAsyncResult - and GTask. - - - - By starting multiple asynchronous operations in succession, they will be - executed in parallel (up to an arbitrary limit imposed by GIO’s internal - worker thread pool). - - - - The synchronous versions of functions can be used early in application - startup when there is no main loop to block, for example to load initial - configuration files. They can also be used for I/O on files which are - guaranteed to be small and on the local disk. Note that the user’s home - directory is not guaranteed to be on the local disk. - - - - Security - - -When your program needs to carry out some privileged operation (say, -create a new user account), there are various ways in which you can go -about this: - - -Implement a daemon that offers the privileged operation. A convenient -way to do this is as a D-Bus system-bus service. The daemon will probably -need ways to check the identity and authorization of the caller before -executing the operation. polkit is a framework that allows this. - - -Use a small helper that is executed with elevated privileges via -pkexec. pkexec is a small program launcher that is part of polkit. - - -Use a small helper that is executed with elevated privileges by -being suid root. - - -None of these approaches is the clear winner, they all have their -advantages and disadvantages. - - - -When writing code that runs with elevated privileges, it is important -to follow some basic rules of secure programming. David Wheeler has an -excellent book on this topic, -Secure Programming for Linux and Unix HOWTO. - - - -When using GIO in code that runs with elevated privileges, you have to -be careful. GIO has extension points whose implementations get loaded -from modules (executable code in shared objects), which could allow -an attacker to sneak their own code into your application by tricking it -into loading the code as a module. However, GIO will never load modules -from your home directory except when explicitly asked to do so via an -environment variable. - - - -In most cases, your helper program should be so small that you don't -need GIO, whose APIs are largely designed to support full-blown desktop -applications. If you can't resist the convenience of these APIs, here -are some steps you should take: - - -Clear the environment, e.g. using the clearenv() -function. -David Wheeler has a good explanation for why it is -important to sanitize the environment. -See -for a list of all environment variables affecting GIO. In particular, -PATH (used to locate binaries), GIO_EXTRA_MODULES (used to locate loadable modules) and DBUS_{SYSTEM,SESSION}_BUS_ADDRESS (used to locate the D-Bus system and session bus) are important. - - -Don't use GVfs, by setting GIO_USE_VFS=local in the environment. -The reason to avoid GVfs in security-sensitive programs is that it uses -many libraries which have not necessarily been audited for security problems. -Gvfs is also heavily distributed and relies on a session bus to be present. - - - - - - - - - - Compiling GIO applications - - - GIO comes with a gio-2.0.pc file that you - should use together with pkg-config to obtain - the necessary information about header files and libraries. See - the pkg-config man page or the GLib documentation - for more information on how to use pkg-config - to compile your application. - - - - If you are using GIO on UNIX-like systems, you may want to use - UNIX-specific GIO interfaces such as #GUnixInputStream, - #GUnixOutputStream, #GUnixMount or #GDesktopAppInfo. - To do so, use the gio-unix-2.0.pc file - instead of gio-2.0.pc - - - - - Running GIO applications - - - GIO inspects a few environment variables in addition to the - ones used by GLib. - - - - <envar>XDG_DATA_HOME</envar>, <envar>XDG_DATA_DIRS</envar> - - - GIO uses these environment variables to locate MIME information. - For more information, see the Shared MIME-info Database - and the Base Directory Specification. - - - - - <envar>GVFS_DISABLE_FUSE</envar> - - - This variable can be set to keep #Gvfs from starting the fuse backend, - which may be unwanted or unnecessary in certain situations. - - - - - <envar>GIO_USE_VFS</envar> - - - This environment variable can be set to the name of a #GVfs - implementation to override the default for debugging purposes. - The #GVfs implementation for local files that is included in GIO - has the name "local", the implementation in the gvfs module has - the name "gvfs". Most commonly, system software will set this to "local" - to avoid having `GFile` APIs perform unnecessary D-Bus calls. - - The special value help can be used to print a list of - available implementations to standard output. - - - - - The following environment variables are only useful for debugging - GIO itself or modules that it loads. They should not be set in a - production environment. - - - - <envar>GIO_USE_FILE_MONITOR</envar> - - - This variable can be set to the name of a #GFileMonitor - implementation to override the default for debugging purposes. - The #GFileMonitor implementation for local files that is included - in GIO on Linux has the name inotify, others that are built - are built as modules (depending on the platform) are called - kqueue and win32filemonitor. - - The special value help can be used to print a list of - available implementations to standard output. - - - - - <envar>GIO_USE_VOLUME_MONITOR</envar> - - - This variable can be set to the name of a #GVolumeMonitor - implementation to override the default for debugging purposes. - The #GVolumeMonitor implementation for local files that is included - in GIO has the name "unix", the udisks2-based implementation in the - gvfs module has the name "udisks2". - - The special value help can be used to print a list of - available implementations to standard output. - - - - - <envar>GIO_USE_TLS</envar> - - - This variable can be set to the name of a #GTlsBackend - implementation to override the default for debugging purposes. - GIO does not include a #GTlsBackend implementation, the gnutls-based - implementation in the glib-networking module has the name "gnutls". - - The special value help can be used to print a list of - available implementations to standard output. - - - - - <envar>GIO_MODULE_DIR</envar> - - - When this environment variable is set to a path, GIO will load - modules from this alternate directory instead of the directory - built into GIO. This is useful when running tests, for example. - - - This environment variable is ignored when running in a setuid program. - - - - - <envar>GIO_EXTRA_MODULES</envar> - - - When this environment variable is set to a path, or a set of - paths separated by a colon, GIO will attempt to load - additional modules from within the path. - - - This environment variable is ignored when running in a setuid program. - - - - - <envar>GSETTINGS_BACKEND</envar> - - - This variable can be set to the name of a #GSettingsBackend - implementation to override the default for debugging purposes. - The memory-based implementation that is included in GIO has - the name "memory", the one in dconf has the name "dconf". - - The special value help can be used to print a list of - available implementations to standard output. - - - - - <envar>GSETTINGS_SCHEMA_DIR</envar> - - - This variable can be set to the names of directories to consider when looking for compiled schemas for #GSettings, - in addition to the glib-2.0/schemas - subdirectories of the XDG system data dirs. To specify multiple directories, use G_SEARCHPATH_SEPARATOR_S as a separator. - - - - - <envar>DBUS_SYSTEM_BUS_ADDRESS</envar> - - - This variable is consulted to find the address of the D-Bus system - bus. For the format of D-Bus addresses, see the D-Bus - specification. - - - Setting this variable overrides platform-specific ways of determining - the system bus address. - - - - - <envar>DBUS_SESSION_BUS_ADDRESS</envar> - - - This variable is consulted to find the address of the D-Bus session bus. - - - Setting this variable overrides platform-specific ways of determining - the session bus address. - - - - - <envar>DBUS_STARTER_BUS_TYPE</envar> - - - This variable is consulted to find out the 'starter' bus for an - application that has been started via D-Bus activation. The possible - values are 'system' or 'session'. - - - - - <envar>G_DBUS_DEBUG</envar> - - - This variable can be set to a list of debug options, which - cause GLib to print out different types of debugging - information when using the D-Bus routines. - - - transport - Show IO activity (e.g. reads and writes) - - - message - Show all sent and received D-Bus messages - - - payload - Show payload for all sent and received D-Bus messages (implies message) - - - call - Trace g_dbus_connection_call() and g_dbus_connection_call_sync() API usage - - - signal - Show when a D-Bus signal is received - - - incoming - Show when an incoming D-Bus method call is received - - - return - Show when a reply is returned via the #GDBusMethodInvocation API - - - emission - Trace g_dbus_connection_emit_signal() API usage - - - authentication - Show information about connection authentication - - - address - Show information about D-Bus address lookups and autolaunching - - - The special value all can be used to turn - on all debug options. The special value - help can be used to print a list of - supported options to standard output. - - - - - <envar>G_DBUS_COOKIE_SHA1_KEYRING_DIR</envar> - - - Can be used to override the directory used to store the - keyring used in the DBUS_COOKIE_SHA1 - authentication mechanism. Normally the directory used is - .dbus-keyrings in the user's home - directory. - - - - - <envar>G_DBUS_COOKIE_SHA1_KEYRING_DIR_IGNORE_PERMISSION</envar> - - - If set, the permissions of the directory used to store the - keyring used in the DBUS_COOKIE_SHA1 - authentication mechanism won't be checked. Normally the - directory must be readable only by the user. - - - - - - Extending GIO - - - A lot of the functionality that is accessible through GIO - is implemented in loadable modules, and modules provide a convenient - way to extend GIO. In addition to the #GIOModule API which supports - writing such modules, GIO has a mechanism to define extension points, - and register implementations thereof, see #GIOExtensionPoint. - - - The following extension points are currently defined by GIO: - - - - G_VFS_EXTENSION_POINT_NAME - - - Allows to override the functionality of the #GVfs class. - Implementations of this extension point must be derived from #GVfs. - GIO uses the implementation with the highest priority that is active, - see g_vfs_is_active(). - - - GIO implements this extension point for local files, gvfs contains - an implementation that supports all the backends in gvfs. - - - - - G_VOLUME_MONITOR_EXTENSION_POINT_NAME - - - Allows to add more volume monitors. - Implementations of this extension point must be derived from - #GVolumeMonitor. GIO uses all registered extensions. - - - gvfs contains an implementation that works together with the #GVfs - implementation in gvfs. - - - - - G_NATIVE_VOLUME_MONITOR_EXTENSION_POINT_NAME - - - Allows to override the 'native' volume monitor. - Implementations of this extension point must be derived from - #GNativeVolumeMonitor. GIO uses the implementation with - the highest priority that is supported, as determined by the - is_supported() vfunc in #GVolumeMonitorClass. - - - GIO implements this extension point for local mounts, - gvfs contains a udisks2-based implementation. - - - - - G_LOCAL_FILE_MONITOR_EXTENSION_POINT_NAME - - - Allows to override the file monitor implementation for - local files. Implementations of this extension point must - be derived from #GLocalFileMonitor. GIO uses the implementation - with the highest priority that is supported, as determined by the - is_supported() vfunc in #GLocalFileMonitorClass. - - - GIO uses this extension point internally, to switch between - its kqueue-based and inotify-based file monitoring implementations. - - - - - G_DESKTOP_APP_INFO_LOOKUP_EXTENSION_POINT_NAME - - - Unix-only. Allows to provide a way to associate default handlers - with URI schemes. Implementations of this extension point must - implement the #GDesktopAppInfoLookup interface. GIO uses the - implementation with the highest priority. - - - This extension point has been discontinued in GLib 2.28. It is - still available to keep API and ABI stability, but GIO is no - longer using it for default handlers. Instead, the mime handler - mechanism is used, together with x-scheme-handler pseudo-mimetypes. - - - - - G_SETTINGS_BACKEND_EXTENSION_POINT_NAME - - - Allows to provide an alternative storage for #GSettings. - Implementations of this extension point must derive from the - #GSettingsBackend type. GIO contains a keyfile-based - implementation of this extension point, another one is provided - by dconf. - - - - - G_PROXY_EXTENSION_POINT_NAME - - - Allows to provide implementations for network proxying. - Implementations of this extension point must provide the - #GProxy interface, and must be named after the network - protocol they are proxying. - - - glib-networking contains an implementation of this extension - point based on libproxy. - - - - G_TLS_BACKEND_EXTENSION_POINT_NAME - - - Allows to provide implementations for TLS support. - Implementations of this extension point must implement - the #GTlsBackend interface. - - - glib-networking contains an implementation of this extension - point. - - - - - G_NETWORK_MONITOR_EXTENSION_POINT_NAME - - - Allows to provide implementations for network connectivity - monitoring. - Implementations of this extension point must implement - the #GNetworkMonitorInterface interface. - - - GIO contains an implementation of this extension point - that is using the netlink interface of the Linux kernel. - - - -
- diff --git a/docs/reference/gio/pollable-utils.md b/docs/reference/gio/pollable-utils.md new file mode 100644 index 0000000..c026dd9 --- /dev/null +++ b/docs/reference/gio/pollable-utils.md @@ -0,0 +1,15 @@ +Title: Pollable Utility Functions +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2012 Dan Winship + +# Pollable Utility Functions + +Utility functions for [iface@Gio.PollableInputStream] and +[iface@Gio.PollableOutputStream] implementations. + + * [func@Gio.pollable_source_new] + * [func@Gio.pollable_source_new_full] + * [func@Gio.pollable_stream_read] + * [func@Gio.pollable_stream_write] + * [func@Gio.pollable_stream_write_all] + diff --git a/docs/reference/gio/tls-overview.md b/docs/reference/gio/tls-overview.md new file mode 100644 index 0000000..453c57e --- /dev/null +++ b/docs/reference/gio/tls-overview.md @@ -0,0 +1,37 @@ +Title: TLS Overview +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Dan Winship +SPDX-FileCopyrightText: 2015 Collabora, Ltd. + +# TLS Overview + +[class@Gio.TlsConnection] and related classes provide TLS (Transport Layer +Security, previously known as SSL, Secure Sockets Layer) support for GIO-based +network streams. + +[iface@Gio.DtlsConnection] and related classes provide DTLS (Datagram TLS) +support for GIO-based network sockets, using the [iface@Gio.DatagramBased] +interface. The TLS and DTLS APIs are almost identical, except TLS is +stream-based and DTLS is datagram-based. They share certificate and backend +infrastructure. + +In the simplest case, for a client TLS connection, you can just set the +[property@Gio.SocketClient:tls] flag on a [class@Gio.SocketClient], and then any +connections created by that client will have TLS negotiated automatically, using +appropriate default settings, and rejecting any invalid or self-signed +certificates (unless you change that default by setting the +[property@Gio.SocketClient:tls-validation-flags] property). The returned object +will be a [class@Gio.TcpWrapperConnection], which wraps the underlying +[iface@Gio.TlsClientConnection]. + +For greater control, you can create your own [iface@Gio.TlsClientConnection], +wrapping a [class@Gio.SocketConnection] (or an arbitrary [class@Gio.IOStream] +with pollable input and output streams) and then connect to its signals, +such as [signal@Gio.TlsConnection::accept-certificate], before starting the +handshake. + +Server-side TLS is similar, using [iface@Gio.TlsServerConnection]. At the +moment, there is no support for automatically wrapping server-side +connections in the way [class@Gio.SocketClient] does for client-side +connections. + diff --git a/docs/reference/gio/unix-mounts.md b/docs/reference/gio/unix-mounts.md new file mode 100644 index 0000000..404df3e --- /dev/null +++ b/docs/reference/gio/unix-mounts.md @@ -0,0 +1,35 @@ +Title: UNIX Mounts +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2007 Andrew Walton +SPDX-FileCopyrightText: 2008 Matthias Clasen + +# UNIX Mounts + +Routines for managing mounted UNIX mount points and paths. + +Note that `` belongs to the UNIX-specific GIO +interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config +file or the `GioUnix-2.0` GIR namespace when using it. + +There are three main classes: + + * [struct@GioUnix.MountEntry] + * [struct@GioUnix.MountPoint] + * [class@GioUnix.MountMonitor] + +Various helper functions for querying mounts: + + * [func@GioUnix.mount_points_get] + * [func@GioUnix.MountPoint.at] + * [func@GioUnix.mounts_get] + * [func@GioUnix.mount_at] + * [func@GioUnix.mount_for] + * [func@GioUnix.mounts_changed_since] + * [func@GioUnix.mount_points_changed_since] + +And several helper functions for checking the type of a mount or path: + + * [func@GioUnix.is_mount_path_system_internal] + * [func@GioUnix.is_system_fs_type] + * [func@GioUnix.is_system_device_path] + diff --git a/docs/reference/gio/version.xml.in b/docs/reference/gio/version.xml.in deleted file mode 100644 index d78bda9..0000000 --- a/docs/reference/gio/version.xml.in +++ /dev/null @@ -1 +0,0 @@ -@VERSION@ diff --git a/docs/reference/gio/xml/gtkdocentities.ent.in b/docs/reference/gio/xml/gtkdocentities.ent.in deleted file mode 100644 index f12c9ff..0000000 --- a/docs/reference/gio/xml/gtkdocentities.ent.in +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/reference/gio/xml/meson.build b/docs/reference/gio/xml/meson.build deleted file mode 100644 index 6aeb745..0000000 --- a/docs/reference/gio/xml/meson.build +++ /dev/null @@ -1,14 +0,0 @@ -ent_conf = configuration_data() -ent_conf.set('PACKAGE', 'glib') -ent_conf.set('PACKAGE_BUGREPORT', 'https://gitlab.gnome.org/GNOME/glib/issues/new') -ent_conf.set('PACKAGE_NAME', 'glib') -ent_conf.set('PACKAGE_STRING', 'glib') -ent_conf.set('PACKAGE_TARNAME', 'glib') -ent_conf.set('PACKAGE_URL', 'FIXME') -ent_conf.set('PACKAGE_VERSION', glib_version) -ent_conf.set('PACKAGE_API_VERSION', glib_api_version) -configure_file( - input: 'gtkdocentities.ent.in', - output: 'gtkdocentities.ent', - configuration: ent_conf -) diff --git a/docs/reference/girepository/gi-compile-repository.rst b/docs/reference/girepository/gi-compile-repository.rst new file mode 100644 index 0000000..a1af705 --- /dev/null +++ b/docs/reference/girepository/gi-compile-repository.rst @@ -0,0 +1,103 @@ +.. _gi-compile-repository(1): +.. meta:: + :copyright: Copyright 2010 Johan Dahlin + :copyright: Copyright 2015 Ben Boeckel + :copyright: Copyright 2013, 2015 Dieter Verfaillie + :copyright: Copyright 2018 Emmanuele Bassi + :copyright: Copyright 2018 Tomasz Miąsko + :copyright: Copyright 2018 Christoph Reiter + :copyright: Copyright 2020 Jan Tojnar + :copyright: Copyright 2024 Collabora Ltd. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2010 Johan Dahlin + SPDX-FileCopyrightText: 2015 Ben Boeckel + SPDX-FileCopyrightText: 2013, 2015 Dieter Verfaillie + SPDX-FileCopyrightText: 2018 Emmanuele Bassi + SPDX-FileCopyrightText: 2018 Tomasz Miąsko + SPDX-FileCopyrightText: 2018 Christoph Reiter + SPDX-FileCopyrightText: 2020 Jan Tojnar + SPDX-FileCopyrightText: 2024 Collabora Ltd. + SPDX-License-Identifier: LGPL-2.1-or-later + +===================== +gi-compile-repository +===================== + +---------------- +Typelib compiler +---------------- + +:Manual section: 1 + + +SYNOPSIS +======== + +**gi-compile-repository** [*OPTION*…] *GIRFILE* + + +DESCRIPTION +=========== + +gi-compile-repository converts one or more GIR files into one or more typelibs. +The output will be written to standard output unless the ``--output`` is +specified. + + +OPTIONS +======= + +``--help`` + Show help options. + +``--output`` *FILENAME*, ``-o`` *FILENAME* + Save the resulting output in *FILENAME*. + +``--verbose`` + Show verbose messages. + +``--debug`` + Show debug messages. + +``--includedir`` *DIRECTORY* + Add *DIRECTORY* to the search path for GIR XML. + This option can be used more than once. + The first *DIRECTORY* on the command-line will be searched first + (highest precedence). + +``--shared-library`` *FILENAME*, ``-l`` *FILENAME* + Specifies the shared library where the symbols in the typelib can be + found. The name of the library should not contain the ending shared + library suffix. + This option can be used more than once, for typelibs that describe + more than one shared library. + +``--version`` + Show program’s version number and exit. + + +EXAMPLE +======= + +:: + $ gi-compile-repository -o Gio-2.0.typelib /usr/share/gir-1.0/Gio-2.0.gir + + +BUGS +==== + +Report bugs at https://gitlab.gnome.org/GNOME/glib/-/issues + + +HOMEPAGE and CONTACT +==================== + +https://gi.readthedocs.io/ + + +AUTHORS +======= + +Matthias Clasen diff --git a/docs/reference/girepository/gi-decompile-typelib.rst b/docs/reference/girepository/gi-decompile-typelib.rst new file mode 100644 index 0000000..fbec91b --- /dev/null +++ b/docs/reference/girepository/gi-decompile-typelib.rst @@ -0,0 +1,107 @@ +.. _gi-decompile-typelib(1): +.. meta:: + :copyright: Copyright 2008, 2010 Johan Dahlin + :copyright: Copyright 2014 Robert Roth + :copyright: Copyright 2015 Dieter Verfaillie + :copyright: Copyright 2018 Tomasz Miąsko + :copyright: Copyright 2018 Christoph Reiter + :copyright: Copyright 2020 Jan Tojnar + :copyright: Copyright 2024 Collabora Ltd. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2008, 2010 Johan Dahlin + SPDX-FileCopyrightText: 2014 Robert Roth + SPDX-FileCopyrightText: 2015 Dieter Verfaillie + SPDX-FileCopyrightText: 2018 Tomasz Miąsko + SPDX-FileCopyrightText: 2018 Christoph Reiter + SPDX-FileCopyrightText: 2020 Jan Tojnar + SPDX-FileCopyrightText: 2024 Collabora Ltd. + SPDX-License-Identifier: LGPL-2.1-or-later + +==================== +gi-decompile-typelib +==================== + +------------------ +Typelib decompiler +------------------ + +:Manual section: 1 + + +SYNOPSIS +======== + +**gi-decompile-typelib** [*OPTION*…] *TYPELIB* [*TYPELIB*\ …] + + +DESCRIPTION +=========== + +gi-decompile-typelib is a GIR decompiler, using the repository API. +It generates GIR XML files from the compiled binary typelib format. +The output will be written to standard output unless the ``--output`` +is specified. + +The binary typelib format stores a subset of the information available +in GIR XML, so not all typelibs can be decompiled in this way, and the +resulting GIR XML might be incomplete. + +Normally, GIR XML should be generated from source code, headers and +shared libraries using `g-ir-scanner(1) `_ +instead of using this tool. + + +OPTIONS +======= + +``--help`` + Show help options. + +``--output`` *FILENAME*, ``-o`` *FILENAME* + Save the resulting output in *FILENAME*. + +``--includedir`` *DIRECTORY* + Add *DIRECTORY* to the search path for typelibs. + This option can be used more than once. + The first *DIRECTORY* on the command-line will be searched first + (highest precedence). + +``--all`` + Show all available information. + +``--version`` + Show program’s version number and exit. + + +EXAMPLE +======= + +:: + $ libdir=/usr/lib/x86_64-linux-gnu # or /usr/lib64 or similar + $ gi-decompile-typelib -o Gio-2.0.gir \ + $libdir/girepository-1.0/Gio-2.0.typelib + + $ diff -u /usr/share/gir-1.0/Gio-2.0.gir Gio-2.0.gir + +You will see that the original GIR XML contains much more information +than the decompiled typelib. + + +BUGS +==== + +Report bugs at https://gitlab.gnome.org/GNOME/glib/-/issues + + +HOMEPAGE and CONTACT +==================== + +https://gi.readthedocs.io/ + + +AUTHORS +======= + +Matthias Clasen diff --git a/docs/reference/girepository/gi-inspect-typelib.rst b/docs/reference/girepository/gi-inspect-typelib.rst new file mode 100644 index 0000000..3c5b338 --- /dev/null +++ b/docs/reference/girepository/gi-inspect-typelib.rst @@ -0,0 +1,58 @@ +.. _gio(1): +.. meta:: + :copyright: Copyright 2024 Collabora Ltd. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2024 Collabora Ltd. + SPDX-License-Identifier: LGPL-2.1-or-later + +================== +gi-inspect-typelib +================== + +----------------------- +Typelib inspection tool +----------------------- + +SYNOPSIS +-------- + +| **gi-inspect-typelib** [*OPTION*\ …] **--print-shlibs** *NAMESPACE* +| **gi-inspect-typelib** [*OPTION*\ …] **--print-typelibs** *NAMESPACE* + +DESCRIPTION +----------- + +**gi-inspect-typelib** displays information about GObject-Introspection +binary typelib files. + +OPTIONS +------- + +``--print-shlibs`` + Show the shared libraries that implement the *NAMESPACE*. + +``--print-typelibs`` + Show the other typelibs that the *NAMESPACE* depends on. + +``--typelib-version`` + The version of each *NAMESPACE* to inspect. + For example, the version of ``Gio-2.0.typelib`` is ``2.0``. + If not specified, use the newest available version if there is more + than one installed. + +EXAMPLE +------- + +On Linux, the ``Gio-2.0`` typelib is implemented by ``libgio-2.0.so.0``:: + + $ gi-inspect-typelib --typelib-version 2.0 --print-shlibs Gio + shlib: libgio-2.0.so.0 + +and it depends on GObject-2.0, GLib-2.0 and GModule-2.0:: + + $ gi-inspect-typelib --typelib-version 2.0 --print-typelibs Gio + typelib: GObject-2.0 + typelib: GLib-2.0 + typelib: GModule-2.0 diff --git a/docs/reference/girepository/girepository.toml.in b/docs/reference/girepository/girepository.toml.in new file mode 100644 index 0000000..4c16c11 --- /dev/null +++ b/docs/reference/girepository/girepository.toml.in @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "Girepository" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_urls = "https://docs.gtk.org/girepository/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "GIRepository is a library providing access to typelibs and introspection data which describes C APIs" +dependencies = [ "GLib-2.0", "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [dependencies."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [dependencies."Gio-2.0"] + name = "Gio" + description = "Useful classes for general purpose I/O, networking, IPC, settings, etc." + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "migrating-gi.md", +] +content_images = [ +] diff --git a/docs/reference/girepository/meson.build b/docs/reference/girepository/meson.build new file mode 100644 index 0000000..2d14ffd --- /dev/null +++ b/docs/reference/girepository/meson.build @@ -0,0 +1,56 @@ +if get_option('man-pages').enabled() + manpages = [ + 'gi-compile-repository', + 'gi-decompile-typelib', + 'gi-inspect-typelib', + ] + foreach page : manpages + custom_target(page + '-man', + input: page + '.rst', + output: page + '.1', + command: [ + rst2man, + rst2man_flags, + '@INPUT@', + ], + capture: true, + install: true, + install_dir: man1_dir, + install_tag: 'doc', + ) + endforeach +endif + +if get_option('documentation') and enable_gir + expand_content_files = [ + 'migrating-gi.md', + ] + + girepository_toml = configure_file( + input: 'girepository.toml.in', + output: 'girepository.toml', + configuration: toml_conf, + ) + + custom_target('girepository-docs', + input: [ girepository_toml, girepository_gir[0] ], + output: 'girepository', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gobject'), + '--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gmodule'), + '--add-include-path=@0@'.format(meson.current_build_dir() / '../../../gio'), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) +endif diff --git a/docs/reference/girepository/migrating-gi.md b/docs/reference/girepository/migrating-gi.md new file mode 100644 index 0000000..e6df3e4 --- /dev/null +++ b/docs/reference/girepository/migrating-gi.md @@ -0,0 +1,112 @@ +Title: Migrating from girepository-1.0 to girepository-2.0 +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2014 GNOME Foundation + +# Migrating from girepository-1.0 to girepository-2.0 + +libgirepository was originally part of +[gobject-introspection](https://gitlab.gnome.org/GNOME/gobject-introspection/), +where it was prototyped for a number of years. + +Now that it’s considered stable (for a long time), it’s been moved to +[glib](https://gitlab.gnome.org/GNOME/glib/) in order to simplify the build +process of the two modules. + +As part of this move, the API version has been bumped from 1.0 to 2.0, and some +fairly straightforward API changes have been made. Note that the GIR version +was previously 2.0, and is now 3.0 — so the new version of libgirepository uses +`girepository-2.0.pc` and `GIRepository-3.0.typelib`. + +The main change between the two versions of libgirepository is that it now uses +[type@GObject.TypeInstance] as the basis of its type system, rather than simple +C struct aliasing. This means that [type@GIRepository.BaseInfo] instances are +now reference counted using [method@GIRepository.BaseInfo.ref] and +[method@GIRepository.BaseInfo.unref]. + +It also means that runtime cast macros such as [func@GIRepository.CALLABLE_INFO] +are now available. Using these instead of simple C casts can improve the runtime +type safety of your code. + +Stack allocation of some [type@GIRepository.BaseInfo] subtypes is still +possible, but they must now be cleared using +[method@GIRepository.BaseInfo.clear] once finished with. Previously this wasn’t +necessary. + +As part of moving the code over, the symbol prefix has changed from `g_` to +`gi_` — this has affected every API in the library, but trivially. + +The types of various function arguments have changed — for example from +`guint32` to `size_t` for most offsets. This will require minor adjustments in +your code if integer type warnings are enabled. + +## API replacements from version 1.0 to 2.0 + +| girepository-1.0 | girepository-2.0 | +|------------------|------------------| +| `GI_CHECK_VERSION` | [func@GLib.CHECK_VERSION] | +| `g_arg_info_get_closure` | [method@GIRepository.ArgInfo.get_closure_index] | +| `g_arg_info_get_destroy` | [method@GIRepository.ArgInfo.get_destroy_index] | +| `g_arg_info_get_type` | [method@GIRepository.ArgInfo.get_type_info] | +| `g_arg_info_load_type` | [method@GIRepository.ArgInfo.load_type_info] | +| - | [method@GIRepository.BaseInfo.ref] and [method@GIRepository.BaseInfo.unref] | +| `g_base_info_get_type` | Use type checking macros like [func@GIRepository.IS_OBJECT_INFO], or raw [type@GObject.Type]s with [func@GObject.TYPE_FROM_INSTANCE] | +| `g_info_new` | Removed with no replacement, use [method@GIRepository.find_by_name] and related APIs | +| `g_callable_info_invoke` arguments | `is_method` and `throws` dropped in [method@GIRepository.CallableInfo.invoke] | +| `g_constant_info_get_type` | [method@GIRepository.ConstantInfo.get_type_info] | +| `g_field_info_get_type` | [method@GIRepository.FieldInfo.get_type_info] | +| `g_object_info_find_method_using_interfaces` and `g_object_info_find_vfunc_using_interfaces` | The `implementor` out argument has been renamed to `declarer` and is now of type [type@GIRepository.BaseInfo] | +| `g_object_info_get_type_init` | [method@GIRepository.ObjectInfo.get_type_init_function_name] | +| `g_object_info_get_ref_function` | [method@GIRepository.ObjectInfo.get_ref_function_name] | +| `g_object_info_get_unref_function` | [method@GIRepository.ObjectInfo.get_unref_function_name] | +| `g_object_info_get_set_value_function` | [method@GIRepository.ObjectInfo.get_set_value_function_name] | +| `g_object_info_get_get_value_function` | [method@GIRepository.ObjectInfo.get_get_value_function_name] | +| `g_property_info_get_type` | [method@GIRepository.PropertyInfo.get_type_info] | +| `g_registered_type_info_get_type_init` | [method@GIRepository.RegisteredTypeInfo.get_type_init_function_name] | +| `g_irepository_*` | `gi_repository_*` | +| `g_irepository_get_default` | Singleton object removed; create separate [class@GIRepository.Repository] instances instead | +| `g_irepository_get_search_path` and `g_irepository_get_library_path` | Now return arrays rather than linked lists | +| `g_irepository_enumerate_versions` | Now returns an array rather than a linked list | +| `g_irepository_get_immediate_dependencies`, `g_irepository_get_dependencies` and `g_irepository_get_loaded_namespaces` | Now additionally return a length argument | +| `g_irepository_get_shared_library` | [method@GIRepository.get_shared_libraries] | +| `g_irepository_dump` | Takes structured `input_filename` and `output_filename` arguments rather than a single formatted string | +| `g_function_invoker_destroy` | `gi_function_invoker_clear()` | +| `g_struct_info_get_copy_function` | [method@GIRepository.StructInfo.get_copy_function_name] | +| `g_struct_info_get_free_function` | [method@GIRepository.StructInfo.get_free_function_name] | +| `g_type_info_get_array_length` and `g_type_info_get_array_fixed_size` | Split success and failure return values out into a new out-argument and return value | +| `g_type_info_get_array_length` | [method@GIRepository.TypeInfo.get_array_length_index] | +| `g_typelib_new_from_*` | All replaced with `gi_typelib_new_from_bytes()` | +| `g_typelib_free` | [type@GIRepository.Typelib] is now a refcounted and boxed type, so use [method@GIRepository.Typelib.unref] | +| `GI_FUNCTION_THROWS` and `GI_VFUNC_THROWS` | [method@GIRepository.CallableInfo.can_throw_gerror] | +| `g_union_info_get_discriminator_offset` | Split success and failure return values out into a new out-argument and return value | +| `g_union_info_get_copy_function` | [method@GIRepository.UnionInfo.get_copy_function_name] | +| `g_union_info_get_free_function` | [method@GIRepository.UnionInfo.get_free_function_name] | +| `GIInfoType` | Use [type@GObject.Type] directly | +| `GI_INFO_TYPE_BOXED` | Dropped in favour of [method@GIRepository.RegisteredTypeInfo.is_boxed] | + +## Utility program renames from version 1.0 to 2.0 + +| girepository-1.0 | girepository-2.0 | +|------------------|-------------------------| +| `g-ir-compiler` | `gi-compile-repository` | +| `g-ir-generate` | `gi-decompile-typelib` | +| `g-ir-inspect` | `gi-inspect-typelib` | + +In addition, some command-line options have been changed. + +The `--version` option for `g-ir-inspect` has been renamed to +`--typelib-version` in `gi-inspect-typelib`. + +The `--includedir` option to `gi-decompile-typelib` treats the +given directories as most-important-first, consistent with +`gi-compile-repository --includedir` and `gcc -I`. +`g-ir-generate` treated `--includedir` options as least-important-first. + +The unimplemented `g-ir-compiler --module` option has been removed in +`gi-compile-repository`. + +The unimplemented `g-ir-generate --shlib` option has been removed in +`gi-decompile-typelib`. + +`gi-inspect-typelib` only accepts one namespace parameter. `g-ir-inspect` +accepted multiple namespaces, but would only inspect the first one, +with the others being ignored. diff --git a/docs/reference/glib/atomic.md b/docs/reference/glib/atomic.md new file mode 100644 index 0000000..65337fe --- /dev/null +++ b/docs/reference/glib/atomic.md @@ -0,0 +1,75 @@ +Title: Atomic Operations +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2012 Dan Winship + +# Atomic Operations + +The following is a collection of compiler macros to provide atomic +access to integer and pointer-sized values. + +The macros that have ‘int’ in the name will operate on pointers to `gint` and +`guint`. The macros with ‘pointer’ in the name will operate on pointers to any +pointer-sized value, including `guintptr`. + +There is no support for 64-bit operations on platforms with 32-bit pointers +because it is not generally possible to perform these operations atomically. + +The get, set and exchange operations for integers and pointers +nominally operate on `gint` and `gpointer`, respectively. Of the +arithmetic operations, the ‘add’ operation operates on (and returns) +signed integer values (`gint` and `gssize`) and the ‘and’, ‘or’, and +‘xor’ operations operate on (and return) unsigned integer values +(`guint` and `gsize`). + +All of the operations act as a full compiler and (where appropriate) +hardware memory barrier. Acquire and release or producer and +consumer barrier semantics are not available through this API. + +It is very important that all accesses to a particular integer or +pointer be performed using only this API and that different sizes of +operation are not mixed or used on overlapping memory regions. Never +read or assign directly from or to a value — always use this API. + +For simple reference counting purposes you should use `gatomicrefcount` +(see [func@GLib.atomic_ref_count_init]) rather than [func@GLib.atomic_int_inc] +and [func@GLib.atomic_int_dec_and_test]. + +Uses of [func@GLib.atomic_int_inc] and [func@GLib.atomic_int_dec_and_test] +that fall outside of simple counting patterns are prone to +subtle bugs and occasionally undefined behaviour. It is also worth +noting that since all of these operations require global +synchronisation of the entire machine, they can be quite slow. In +the case of performing multiple atomic operations it can often be +faster to simply acquire a mutex lock around the critical area, +perform the operations normally and then release the lock. + +## Atomic Integer Operations + + * [func@GLib.atomic_int_get] + * [func@GLib.atomic_int_set] + * [func@GLib.atomic_int_inc] + * [func@GLib.atomic_int_dec_and_test] + * [func@GLib.atomic_int_compare_and_exchange] + * [func@GLib.atomic_int_compare_and_exchange_full] + * [func@GLib.atomic_int_exchange] + * [func@GLib.atomic_int_add] + * [func@GLib.atomic_int_and] + * [func@GLib.atomic_int_or] + * [func@GLib.atomic_int_xor] + +## Atomic Pointer Operations + + * [func@GLib.atomic_pointer_get] + * [func@GLib.atomic_pointer_set] + * [func@GLib.atomic_pointer_compare_and_exchange] + * [func@GLib.atomic_pointer_compare_and_exchange_full] + * [func@GLib.atomic_pointer_exchange] + * [func@GLib.atomic_pointer_add] + * [func@GLib.atomic_pointer_and] + * [func@GLib.atomic_pointer_or] + * [func@GLib.atomic_pointer_xor] + +## Deprecated API + + * [func@GLib.atomic_int_exchange_and_add] + diff --git a/docs/reference/glib/auto-cleanup.md b/docs/reference/glib/auto-cleanup.md new file mode 100644 index 0000000..f286bfe --- /dev/null +++ b/docs/reference/glib/auto-cleanup.md @@ -0,0 +1,291 @@ +Title: Automatic Cleanup +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2023 Matthias Clasen + +# Automatic Cleanup + +GLib provides a set of macros that wrap the GCC extension for automatic +cleanup of variables when they go out of scope. + +These macros can only be used with GCC and GCC-compatible C compilers. + +## Variable declaration + +`g_auto(TypeName)` + +: Helper to declare a variable with automatic cleanup. + + The variable is cleaned up in a way appropriate to its type when the + variable goes out of scope. The `TypeName` of the variable must support + this. + + The way to clean up the type must have been defined using one of the macros + `G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC()` or `G_DEFINE_AUTO_CLEANUP_FREE_FUNC()`. + + This feature is only supported on GCC and clang. This macro is not + defined on other compilers and should not be used in programs that + are intended to be portable to those compilers. + + This macro meant to be used with stack-allocated structures and + non-pointer types. For the (more commonly used) pointer version, see + `g_autoptr()`. + + This macro can be used to avoid having to do explicit cleanups of + local variables when exiting functions. It often vastly simplifies + handling of error conditions, removing the need for various tricks + such as `goto out` or repeating of cleanup code. It is also helpful + for non-error cases. + + Consider the following example: + + GVariant * + my_func(void) + { + g_auto(GQueue) queue = G_QUEUE_INIT; + g_auto(GVariantBuilder) builder; + g_auto(GStrv) strv; + + g_variant_builder_init (&builder, G_VARIANT_TYPE_VARDICT); + strv = g_strsplit("a:b:c", ":", -1); + + // ... + + if (error_condition) + return NULL; + + // ... + + return g_variant_builder_end (&builder); + } + + You must initialize the variable in some way — either by use of an + initialiser or by ensuring that an `_init` function will be called on + it unconditionally before it goes out of scope. + + Since: 2.44 + + +`g_autoptr(TypeName)` +: Helper to declare a pointer variable with automatic cleanup. + + The variable is cleaned up in a way appropriate to its type when the + variable goes out of scope. The `TypeName` of the variable must support this. + The way to clean up the type must have been defined using the macro + `G_DEFINE_AUTOPTR_CLEANUP_FUNC()`. + + This feature is only supported on GCC and clang. This macro is not + defined on other compilers and should not be used in programs that + are intended to be portable to those compilers. + + This is meant to be used to declare pointers to types with cleanup + functions. The type of the variable is a pointer to `TypeName`. You + must not add your own `*`. + + This macro can be used to avoid having to do explicit cleanups of + local variables when exiting functions. It often vastly simplifies + handling of error conditions, removing the need for various tricks + such as `goto out` or repeating of cleanup code. It is also helpful + for non-error cases. + + Consider the following example: + + gboolean + check_exists(GVariant *dict) + { + g_autoptr(GVariant) dirname, basename = NULL; + g_autofree gchar *path = NULL; + + dirname = g_variant_lookup_value (dict, "dirname", G_VARIANT_TYPE_STRING); + if (dirname == NULL) + return FALSE; + + basename = g_variant_lookup_value (dict, "basename", G_VARIANT_TYPE_STRING); + if (basename == NULL) + return FALSE; + + path = g_build_filename (g_variant_get_string (dirname, NULL), + g_variant_get_string (basename, NULL), + NULL); + + return g_access (path, R_OK) == 0; + } + + You must initialise the variable in some way — either by use of an + initialiser or by ensuring that it is assigned to unconditionally + before it goes out of scope. + + See also: `g_auto()`, `g_autofree()` and `g_steal_pointer()`. + + Since: 2.44 + + +`g_autofree` + +: Macro to add an attribute to pointer variable to ensure automatic + cleanup using `g_free()`. + + This macro differs from `g_autoptr()` in that it is an attribute supplied + before the type name, rather than wrapping the type definition. Instead + of using a type-specific lookup, this macro always calls `g_free()` directly. + + This means it's useful for any type that is returned from `g_malloc()`. + + Otherwise, this macro has similar constraints as `g_autoptr()`: only + supported on GCC and clang, the variable must be initialized, etc. + + gboolean + operate_on_malloc_buf (void) + { + g_autofree guint8* membuf = NULL; + + membuf = g_malloc (8192); + + // Some computation on membuf + + // membuf will be automatically freed here + return TRUE; + } + + Since: 2.44 + + +`g_autolist(TypeName)` + +: Helper to declare a list variable with automatic deep cleanup. + + The list is deeply freed, in a way appropriate to the specified type, when the + variable goes out of scope. The type must support this. + + This feature is only supported on GCC and clang. This macro is not + defined on other compilers and should not be used in programs that + are intended to be portable to those compilers. + + This is meant to be used to declare lists of a type with a cleanup + function. The type of the variable is a `GList *`. You + must not add your own `*`. + + This macro can be used to avoid having to do explicit cleanups of + local variables when exiting functions. It often vastly simplifies + handling of error conditions, removing the need for various tricks + such as `goto out` or repeating of cleanup code. It is also helpful + for non-error cases. + + See also: `g_autoslist()`, `g_autoptr()` and `g_steal_pointer()`. + + Since: 2.56 + + +`g_autoslist(TypeName)` + +: Helper to declare a singly linked list variable with automatic deep cleanup. + + The list is deeply freed, in a way appropriate to the specified type, when the + variable goes out of scope. The type must support this. + + This feature is only supported on GCC and clang. This macro is not + defined on other compilers and should not be used in programs that + are intended to be portable to those compilers. + + This is meant to be used to declare lists of a type with a cleanup + function. The type of the variable is a `GSList *`. You + must not add your own `*`. + + This macro can be used to avoid having to do explicit cleanups of + local variables when exiting functions. It often vastly simplifies + handling of error conditions, removing the need for various tricks + such as `goto out` or repeating of cleanup code. It is also helpful + for non-error cases. + + See also: `g_autolist()`, `g_autoptr()` and `g_steal_pointer()`. + + Since: 2.56 + + +`g_autoqueue(TypeName)` + +: Helper to declare a double-ended queue variable with automatic deep cleanup. + + The queue is deeply freed, in a way appropriate to the specified type, when the + variable goes out of scope. The type must support this. + + This feature is only supported on GCC and clang. This macro is not + defined on other compilers and should not be used in programs that + are intended to be portable to those compilers. + + This is meant to be used to declare queues of a type with a cleanup + function. The type of the variable is a `GQueue *`. You + must not add your own `*`. + + This macro can be used to avoid having to do explicit cleanups of + local variables when exiting functions. It often vastly simplifies + handling of error conditions, removing the need for various tricks + such as `goto out` or repeating of cleanup code. It is also helpful + for non-error cases. + + See also: `g_autolist()`, `g_autoptr()` and `g_steal_pointer()`. + + Since: 2.62 + + +## Type definition + +`G_DEFINE_AUTOPTR_CLEANUP_FUNC(TypeName, func)` + +: Defines the appropriate cleanup function for a pointer type. + + The function will not be called if the variable to be cleaned up + contains `NULL`. + + This will typically be the `_free()` or `_unref()` function for the given + type. + + With this definition, it will be possible to use `g_autoptr()` with + the given `TypeName`. + + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GObject, g_object_unref) + + This macro should be used unconditionally; it is a no-op on compilers + where cleanup is not supported. + + Since: 2.44 + + +`G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(TypeName, func)` + +: Defines the appropriate cleanup function for a type. + + This will typically be the `_clear()` function for the given type. + + With this definition, it will be possible to use `g_auto()` with + the given `TypeName`. + + G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GQueue, g_queue_clear) + + This macro should be used unconditionally; it is a no-op on compilers + where cleanup is not supported. + + Since: 2.44 + + +`G_DEFINE_AUTO_CLEANUP_FREE_FUNC(TypeName, func, none_value)` + +: Defines the appropriate cleanup function for a type. + + With this definition, it will be possible to use `g_auto()` with the + given `TypeName`. + + This function will be rarely used. It is used with pointer-based + typedefs and non-pointer types where the value of the variable + represents a resource that must be freed. Two examples are `GStrv` + and file descriptors. + + `none_value` specifies the "none" value for the type in question. It + is probably something like `NULL` or `-1`.If the variable is found to + contain this value then the free function will not be called. + + G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStrv, g_strfreev, NULL) + + This macro should be used unconditionally; it is a no-op on compilers + where cleanup is not supported. + + Since: 2.44 diff --git a/docs/reference/glib/base64.md b/docs/reference/glib/base64.md new file mode 100644 index 0000000..d4d57bd --- /dev/null +++ b/docs/reference/glib/base64.md @@ -0,0 +1,20 @@ +Title: Base64 Encoding +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2006, 2009 Matthias Clasen + +# Base64 Encoding + +Base64 is an encoding that allows a sequence of arbitrary bytes to be +encoded as a sequence of printable ASCII characters. For the definition +of Base64, see [RFC 1421](http://www.ietf.org/rfc/rfc1421.txt) or +[RFC 2045](http://www.ietf.org/rfc/rfc2045.txt). +Base64 is most commonly used as a MIME transfer encoding for email. + +GLib supports incremental encoding using [func@GLib.base64_encode_step] and +[func@GLib.base64_encode_close]. Incremental decoding can be done with +[func@GLib.base64_decode_step]. To encode or decode data in one go, use +[func@GLib.base64_encode] or [func@GLib.base64_decode]. To avoid memory +allocation when decoding, you can use [func@GLib.base64_decode_inplace]. + +Support for Base64 encoding was added in GLib 2.12. + diff --git a/docs/reference/glib/building.md b/docs/reference/glib/building.md new file mode 100644 index 0000000..1a59c69 --- /dev/null +++ b/docs/reference/glib/building.md @@ -0,0 +1,180 @@ +Title: Building GLib + +# Building GLib + +GLib uses the [Meson build system](https://mesonbuild.com). The normal +sequence for compiling and installing the GLib library is thus: + + $ meson setup _build + $ meson compile -C _build + $ meson install -C _build + +On FreeBSD, you will need something more complex: + + $ env CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib -Wl,--disable-new-dtags" \ + > meson setup \ + > -Dxattr=false \ + > -Dinstalled_tests=true \ + > -Db_lundef=false \ + > _build + $ meson compile -C _build + +The standard options provided by Meson may be passed to the `meson` command. Please see the Meson documentation or run: + + meson configure --help + +for information about the standard options. + +GLib is compiled with +[strict aliasing](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fstrict-aliasing) +disabled. It is strongly recommended that this is not re-enabled by overriding +the compiler flags, as GLib has not been tested with strict aliasing and cannot +be guaranteed to work. + +## Dependencies + +Before you can compile the GLib library, you need to have various other +tools and libraries installed on your system. If you are building from a +release archive, you will need a [compliant C +toolchain](https://gitlab.gnome.org/GNOME/glib/-/blob/main/docs/toolchain-requirements.md), +Meson, and pkg-config; the requirements are the same when building from a +Git repository clone of GLib. + +- [`pkg-config`](https://www.freedesktop.org/wiki/Software/pkg-config/) is a + tool for tracking the compilation flags needed for libraries that are used + by the GLib library. (For each library, a small `.pc` text file is + installed in a standard location that contains the compilation flags + needed for that library along with version number information). + +A UNIX build of GLib requires that the system implements at least the +original 1990 version of POSIX. Beyond this, it depends on a number of other +libraries. + +- The [GNU libiconv library](http://www.gnu.org/software/libiconv/) is + needed to build GLib if your system doesn't have the `iconv()` function + for doing conversion between character encodings. Most modern systems + should have `iconv()`, however many older systems lack an `iconv()` + implementation. On such systems, you must install the libiconv library. + This can be found at: http://www.gnu.org/software/libiconv. + + If your system has an `iconv()` implementation but you want to use libiconv + instead, make sure it is installed to the default compiler header/library + search path (for instance, in `/usr/local/`). The `iconv.h` that libiconv + installs hides the system iconv. Meson then detects this, recognizes that the + system iconv is unusable and the external one is mandatory, and automatically + forces it to be used. + + If you are using the native iconv implementation on Solaris instead of + libiconv, you'll need to make sure that you have the converters between + locale encodings and UTF-8 installed. At a minimum you'll need the + SUNWuiu8 package. You probably should also install the SUNWciu8, SUNWhiu8, + SUNWjiu8, and SUNWkiu8 packages. + + The native iconv on Compaq Tru64 doesn't contain support for UTF-8, so + you'll need to use GNU libiconv instead. (When using GNU libiconv for + GLib, you'll need to use GNU libiconv for GNU gettext as well.) This + probably applies to related operating systems as well. + +- Python 3.5 or newer is required. Your system Python must conform to + [PEP 394](https://www.python.org/dev/peps/pep-0394/) For FreeBSD, this means + that the `lang/python3` port must be installed. + +- The libintl library from the [GNU + gettext](http://www.gnu.org/software/gettext) package is needed if your + system doesn't have the `gettext()` functionality for handling message + translation databases. + +- A thread implementation is needed. The thread support in GLib can be based + upon POSIX threads or win32 threads. + +- GRegex uses the [PCRE library](http://www.pcre.org/) for regular + expression matching. The system version of PCRE is used, unless not available + (which is the case on Android), in which case a fallback subproject is used. + +- The optional extended attribute support in GIO requires the `getxattr()` + family of functions that may be provided by the C library or by the + standalone libattr library. To build GLib without extended attribute + support, use the `-Dxattr=false` option. + +- The optional SELinux support in GIO requires libselinux. To build GLib + without SELinux support, use the `-Dselinux=disabled` option. + +- The optional support for DTrace requires the `sys/sdt.h` header, which is + provided by SystemTap on Linux. To build GLib without DTrace, use the + `-Ddtrace=false` option. + +- The optional support for SystemTap can be disabled with the + `-Dsystemtap=false` option. Additionally, you can control the location + where GLib installs the SystemTap probes, using the + `-Dtapset_install_dir=DIR` option. + +- [gobject-introspection](https://gitlab.gnome.org/GNOME/gobject-introspection/) + is needed to generate introspection data for consumption by other projects, + and to generate the GLib documentation via + [gi-docgen](https://gitlab.gnome.org/GNOME/gi-docgen). There is a dependency + cycle between GLib and gobject-introspection. This can be broken by building + GLib first with `-Dintrospection=disabled`, then building + gobject-introspection against this copy of GLib, then re-building GLib against + the new gobject-introspection with `-Dintrospection=enabled`. The GLib API + documentation can be built during this second build process if + `-Ddocumentation=true` is also set. + +## Extra Configuration Options + +In addition to the normal options, these additional ones are supported when +configuring the GLib library: + +`--buildtype` +: This is a standard Meson option which specifies how much debugging and + optimization to enable. If the build type is `debug`, `G_ENABLE_DEBUG` will be + defined and GLib will be built with additional debug code enabled. You can + override this behavior using `-Dglib_debug`. + +`-Dforce_posix_threads=true` +: Normally, Meson should be able to work out the correct thread implementation + to use. This option forces POSIX threads to be used even if the platform + provides another threading API (for example, on Windows). + +`-Dbsymbolic_functions=false` and `-Dbsymbolic_functions=true` +: By default, GLib uses the `-Bsymbolic-functions` linker flag to avoid + intra-library PLT jumps. A side-effect of this is that it is no longer + possible to override internal uses of GLib functions with `LD_PRELOAD`. + Therefore, it may make sense to turn this feature off in some + situations. The `-Dbsymbolic_functions=false` option allows to do that. + +`-Ddocumentation=false` and `-Ddocumentation=true` +: By default, GLib will not build documentation for the library and tools. This + option can be used to enable building the documentation. + +`-Dman-pages=disabled` and `-Dman-pages=enabled` +: By default, GLib will detect whether `rst2man` and the necessary DocBook + stylesheets are installed. If they are, then it will use them to build + the included man pages from the reStructuredText sources. These options can be + used to explicitly control whether man pages should be built and used. + +`-Dxattr=false` and `-Dxattr=true` +: By default, GLib will detect whether the `getxattr()` family of functions is + available. If it is, then extended attribute support will be included in + GIO. These options can be used to explicitly control whether extended + attribute support should be included or not. `getxattr()` and friends can be + provided by glibc or by the standalone libattr library. + +`-Dselinux=auto`, `-Dselinux=enabled` or `-Dselinux=disabled` +: By default, GLib will detect if libselinux is available and include SELinux + support in GIO if it is. These options can be used to explicitly control + whether SELinux support should be included. + +`-Ddtrace=false` and `-Ddtrace=true` +: By default, GLib will detect if DTrace support is available, and use it. + These options can be used to explicitly control whether DTrace support is + compiled into GLib. + +`-Dsystemtap=false` and `-Dsystemtap=true` +: This option requires DTrace support. If it is available, then GLib will also + check for the presence of SystemTap. + +`-Db_coverage=true` and `-Db_coverage=false` +: Enable the generation of coverage reports for the GLib tests. This requires + the lcov frontend to gcov from the Linux Test Project. To generate a + coverage report, use `ninja coverage-html`. The report is placed in the + `meson-logs` directory. diff --git a/docs/reference/glib/building.xml b/docs/reference/glib/building.xml deleted file mode 100644 index edfdfbe..0000000 --- a/docs/reference/glib/building.xml +++ /dev/null @@ -1,339 +0,0 @@ - - - - - Compiling the GLib package - 3 - GLib Library - - - - Compiling the GLib Package - How to compile GLib itself - - - - Building the Library on UNIX - - On UNIX, GLib uses the standard Meson build - system. The normal sequence for compiling and installing the GLib library - is thus: - - - meson setup _build - meson compile -C _build - meson install -C _build - - - On FreeBSD: - - env CPPFLAGS="-I/usr/local/include" LDFLAGS="-L/usr/local/lib -Wl,--disable-new-dtags" meson setup -Dxattr=false -Dinstalled_tests=true -Db_lundef=false _build - meson compile -C _build - - - - - The standard options provided by Meson may be - passed to the meson command. Please see the - Meson documentation or run - meson configure --help for information about - the standard options. - - - GLib is compiled with - strict aliasing - disabled. It is strongly recommended that this is not re-enabled by - overriding the compiler flags, as GLib has not been tested with strict - aliasing and cannot be guaranteed to work. - - - The GTK documentation contains - further details - about the build process and ways to influence it. - - - - Dependencies - - Before you can compile the GLib library, you need to have - various other tools and libraries installed on your system. - If you are building from a release archive, you will need - a compliant C toolchain, - Meson, and pkg-config; - the requirements are the same when building from a Git repository clone - of GLib. - - - - - pkg-config - is a tool for tracking the compilation flags needed for - libraries that are used by the GLib library. (For each - library, a small .pc text file is - installed in a standard location that contains the compilation - flags needed for that library along with version number - information). - - - - - A UNIX build of GLib requires that the system implements at - least the original 1990 version of POSIX. Beyond this, it - depends on a number of other libraries. - - - - - The GNU - libiconv library is needed to build GLib if your - system doesn't have the iconv() - function for doing conversion between character - encodings. Most modern systems should have - iconv(), however many older systems lack - an iconv() implementation. On such systems, - you must install the libiconv library. This can be found at: - http://www.gnu.org/software/libiconv. - - - If your system has an iconv() implementation but - you want to use libiconv instead, make sure it is installed to the - default compiler header/library search path (for instance, in - /usr/local/). The iconv.h - that libiconv installs hides the system iconv. Meson then detects - this, recognizes that the system iconv is unusable and the external - one is mandatory, and automatically forces it to be used. - - - If you are using the native iconv implementation on Solaris - instead of libiconv, you'll need to make sure that you have - the converters between locale encodings and UTF-8 installed. - At a minimum you'll need the SUNWuiu8 package. You probably - should also install the SUNWciu8, SUNWhiu8, SUNWjiu8, and - SUNWkiu8 packages. - - - The native iconv on Compaq Tru64 doesn't contain support for - UTF-8, so you'll need to use GNU libiconv instead. (When - using GNU libiconv for GLib, you'll need to use GNU libiconv - for GNU gettext as well.) This probably applies to related - operating systems as well. - - - - - Python 3.5 or newer is required. Your system Python must - conform to PEP 394 - - For FreeBSD, this means that the - lang/python3 port must be installed. - - - - - The libintl library from the GNU gettext - package is needed if your system doesn't have the - gettext() functionality for handling - message translation databases. - - - - - A thread implementation is needed. The thread support in GLib - can be based upon POSIX threads or win32 threads. - - - - - GRegex uses the PCRE library - for regular expression matching. The system version of PCRE is used, - unless not available (which is the case on Android), in which case a - fallback subproject is used. - - - - - The optional extended attribute support in GIO requires the - getxattr() family of functions that may be - provided by the C library or by the standalone libattr library. To - build GLib without extended attribute support, use the - option. - - - - - The optional SELinux support in GIO requires libselinux. - To build GLib without SELinux support, use the - option. - - - - - The optional support for DTrace requires the - sys/sdt.h header, which is provided - by SystemTap on Linux. To build GLib without DTrace, use - the option. - - - - - The optional support for - SystemTap - can be disabled with the - option. Additionally, you can control the location - where GLib installs the SystemTap probes, using the - option. - - - - - - - Extra Configuration Options - - - In addition to the normal options, these additional ones are supported - when configuring the GLib library: - - - - <option>--buildtype</option> - - - This is a standard Meson option which - specifies how much debugging and optimization to enable. If the build - type is debug, - G_ENABLE_DEBUG will be defined and GLib will be built - with additional debug code enabled. You can override this behavior using - . - - - - - <option>-Dforce_posix_threads=true</option> - - - Normally, Meson should be able to work out - the correct thread implementation to use. This option forces POSIX - threads to be used even if the platform provides another threading API - (for example, on Windows). - - - - - <option>-Dbsymbolic_functions=false</option> and - <option>-Dbsymbolic_functions=true</option> - - - By default, GLib uses the - linker flag to avoid intra-library PLT jumps. A side-effect - of this is that it is no longer possible to override - internal uses of GLib functions with - LD_PRELOAD. Therefore, it may make - sense to turn this feature off in some situations. - The option allows - to do that. - - - - - <option>-Dgtk_doc=false</option> and - <option>-Dgtk_doc=true</option> - - - By default, GLib will detect whether the - gtk-doc package is installed. - If it is, then it will use it to extract and build the - documentation for the GLib library. These options - can be used to explicitly control whether - gtk-doc should be - used or not. If it is not used, the distributed, - pre-generated HTML files will be installed instead of - building them on your machine. - - - - - <option>-Dman=false</option> and - <option>-Dman=true</option> - - - By default, GLib will detect whether xsltproc - and the necessary DocBook stylesheets are installed. - If they are, then it will use them to rebuild the included - man pages from the XML sources. These options can be used - to explicitly control whether man pages should be rebuilt - used or not. The distribution includes pre-generated man - pages. - - - - - <option>-Dxattr=false</option> and - <option>-Dxattr=true</option> - - - By default, GLib will detect whether the - getxattr() - family of functions is available. If it is, then extended - attribute support will be included in GIO. These options can - be used to explicitly control whether extended attribute - support should be included or not. getxattr() - and friends can be provided by glibc or by the standalone - libattr library. - - - - - <option>-Dselinux=auto</option>, - <option>-Dselinux=enabled</option> or - <option>-Dselinux=disabled</option> - - - By default, GLib will detect if libselinux is available and - include SELinux support in GIO if it is. These options can be - used to explicitly control whether SELinux support should - be included. - - - - - <option>-Ddtrace=false</option> and - <option>-Ddtrace=true</option> - - - By default, GLib will detect if DTrace support is available, and use it. - These options can be used to explicitly control whether DTrace support - is compiled into GLib. - - - - - <option>-Dsystemtap=false</option> and - <option>-Dsystemtap=true</option> - - - This option requires DTrace support. If it is available, then - GLib will also check for the presence of SystemTap. - - - - - <option>-Db_coverage=true</option> and - <option>-Db_coverage=false</option> - - - Enable the generation of coverage reports for the GLib tests. - This requires the lcov frontend to gcov from the - Linux Test Project. - To generate a coverage report, use - ninja coverage-html. The report is placed in the - meson-logs directory. - - - - - diff --git a/docs/reference/glib/changes.xml b/docs/reference/glib/changes.xml deleted file mode 100644 index 9b4aa74..0000000 --- a/docs/reference/glib/changes.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - - -Changes to GLib -3 -Changes to GLib - - - -Changes to GLib - -Incompatible changes made between successive versions of GLib - - - - - -Incompatible changes from 2.0 to 2.2 - - - - - -GLib changed the seeding algorithm for the pseudo-random number -generator Mersenne Twister, as used by GRand -and GRandom. This was necessary, because some -seeds would yield very bad pseudo-random streams. Also the -pseudo-random integers generated by -g_rand*_int_range() will have a -slightly better equal distribution with the new version of GLib. - - - -Further information can be found at the website of the Mersenne -Twister random number generator at http://www.math.keio.ac.jp/~matumoto/emt.html. - - - -The original seeding and generation algorithms, as found in GLib -2.0.x, can be used instead of the new ones by setting the environment -variable G_RANDOM_VERSION to the value of '2.0'. Use -the GLib-2.0 algorithms only if you have sequences of numbers generated -with Glib-2.0 that you need to reproduce exactly. - - - - - - - - - -Incompatible changes from 1.2 to 2.0 - - - - - -The event loop functionality GMain has extensively -been revised to support multiple separate main loops in separate threads. -All sources (timeouts, idle functions, etc.) are associated with a -GMainContext. - - - -Compatibility functions exist so that most application code dealing with -the main loop will continue to work. However, code that creates new custom -types of sources will require modification. - - - -The main changes here are: - - - - - - Sources are now exposed as GSource *, rather than simply as - numeric ids. - - - - - - New types of sources are created by structure "derivation" from - GSource, so the source_data - parameter to the GSource virtual functions has been - replaced with a GSource *. - - - - - - Sources are first created, then later added to a specific - GMainContext. - - - - - - Dispatching has been modified so both the callback and data are passed - in to the dispatch() virtual function. - - - - - To go along with this change, the vtable for - GIOChannel has changed and - add_watch() has been replaced by - create_watch(). - - - - - -g_list_foreach() and -g_slist_foreach() have been changed so they -are now safe against removal of the current item, not the next item. - - - -It's not recommended to mutate the list in the callback to these -functions in any case. - - - - - -GDate now works in UTF-8, not in the current locale. -If you want to use it with the encoding of the locale, you need to convert -strings using g_locale_to_utf8() first. - - - - - -g_strsplit() has been fixed to: - - - - - include trailing empty tokens, rather than stripping them - - - - - split into a maximum of max_tokens tokens, rather - than max_tokens + 1 - - - - - Code depending on either of these bugs will need to be fixed. - - - - - -Deprecated functions that got removed: -g_set_error_handler(), -g_set_warning_handler(), -g_set_message_handler(), use -g_log_set_handler() instead. - - - - - - - diff --git a/docs/reference/glib/character-set.md b/docs/reference/glib/character-set.md new file mode 100644 index 0000000..f1726bd --- /dev/null +++ b/docs/reference/glib/character-set.md @@ -0,0 +1,91 @@ +Title: Character Set Conversions +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010, 2012, 2014 Matthias Clasen + +# Character Set Conversions + +The [`func@GLib.convert`] family of function wraps the functionality of +iconv(). In addition to pure character set conversions, GLib has functions +to deal with the extra complications of encodings for file names. + +## File Name Encodings + +Historically, UNIX has not had a defined encoding for file names: a file +name is valid as long as it does not have path separators in it ("/"). +However, displaying file names may require conversion: from the character +set in which they were created, to the character set in which the +application operates. Consider the Spanish file name "Presentación.sxi". If +the application which created it uses ISO-8859-1 for its encoding, + +``` +Character: P r e s e n t a c i ó n . s x i +Hex code: 50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69 +``` + +However, if the application use UTF-8, the actual file name on disk would +look like this: + +``` +Character: P r e s e n t a c i ó n . s x i +Hex code: 50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69 +``` + +Glib uses UTF-8 for its strings, and GUI toolkits like GTK that use GLib do +the same thing. If you get a file name from the file system, for example, +from `readdir()` or from [`method@GLib.Dir.read_name`], and you wish to +display the file name to the user, you will need to convert it into UTF-8. +The opposite case is when the user types the name of a file they wish to +save: the toolkit will give you that string in UTF-8 encoding, and you will +need to convert it to the character set used for file names before you can +create the file with `open()` or `fopen()`. + +By default, GLib assumes that file names on disk are in UTF-8 encoding. This +is a valid assumption for file systems which were created relatively +recently: most applications use UTF-8 encoding for their strings, and that +is also what they use for the file names they create. However, older file +systems may still contain file names created in "older" encodings, such as +ISO-8859-1. In this case, for compatibility reasons, you may want to +instruct GLib to use that particular encoding for file names rather than +UTF-8. You can do this by specifying the encoding for file names in the +`G_FILENAME_ENCODING` environment variable. For example, if your installation +uses ISO-8859-1 for file names, you can put this in your `~/.profile`: + + export G_FILENAME_ENCODING=ISO-8859-1 + +GLib provides the functions [`func@GLib.filename_to_utf8`] and +[`func@GLib.filename_from_utf8`] to perform the necessary conversions. These +functions convert file names from the encoding specified in +`G_FILENAME_ENCODING` to UTF-8 and vice-versa. This diagram illustrates how +these functions are used to convert between UTF-8 and the encoding for file +names in the file system. + +## Conversion between file name encodings + +![](file-name-encodings.png) + +## Checklist for Application Writers + +This section is a practical summary of the detailed things to do to make +sure your applications process file name encodings correctly. + +1. If you get a file name from the file system from a function such as + `readdir()` or `gtk_file_chooser_get_filename()`, you do not need to do + any conversion to pass that file name to functions like `open()`, + `rename()`, or `fopen()` -- those are "raw" file names which the file + system understands. +2. If you need to display a file name, convert it to UTF-8 first by using + [`func@GLib.filename_to_utf8`]. If conversion fails, display a string + like "Unknown file name". Do not convert this string back into the + encoding used for file names if you wish to pass it to the file system; + use the original file name instead. +3. For example, the document window of a word processor could display + "Unknown file name" in its title bar but still let the user save the + file, as it would keep the raw file name internally. This can happen if + the user has not set the `G_FILENAME_ENCODING` environment variable even + though he has files whose names are not encoded in UTF-8. +4. If your user interface lets the user type a file name for saving or + renaming, convert it to the encoding used for file names in the file + system by using [`func@GLib.filename_from_utf8`]. Pass the converted file + name to functions like `fopen()`. If conversion fails, ask the user to + enter a different file name. This can happen if the user types Japanese + characters when `G_FILENAME_ENCODING` is set to ISO-8859-1, for example. diff --git a/docs/reference/glib/checked-math.md b/docs/reference/glib/checked-math.md new file mode 100644 index 0000000..b16a4a2 --- /dev/null +++ b/docs/reference/glib/checked-math.md @@ -0,0 +1,30 @@ +Title: Bounds-checking Integer Arithmetic +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2015 Allison Lortie + +# Bounds-checking Integer Arithmetic + +GLib offers a set of macros for doing additions and multiplications +of unsigned integers, with checks for overflows. + +The helpers all have three arguments. A pointer to the destination +is always the first argument and the operands to the operation are +the other two. + +Following standard GLib convention, the helpers return true in case +of success (ie: no overflow). + +The helpers may be macros, normal functions or inlines. They may be +implemented with inline assembly or compiler intrinsics where +available. + +Since: 2.48 + +The APIs are: + + * [func@GLib.uint_checked_add] + * [func@GLib.uint_checked_mul] + * [func@GLib.uint64_checked_add] + * [func@GLib.uint64_checked_mul] + * [func@GLib.size_checked_add] + * [func@GLib.size_checked_mul] diff --git a/docs/reference/glib/compiling.md b/docs/reference/glib/compiling.md new file mode 100644 index 0000000..38f1517 --- /dev/null +++ b/docs/reference/glib/compiling.md @@ -0,0 +1,71 @@ +Title: Compiling GLib Applications + +# Compiling GLib Applications + +To compile a GLib application, you need to tell the compiler where to find +the GLib header files and libraries. This is done with the +[`pkg-config`](https://www.freedesktop.org/wiki/Software/pkg-config/) +utility. + +The following interactive shell session demonstrates how pkg-config is used +(the actual output on your system may be different): + + $ pkg-config --cflags glib-2.0 + -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include + $ pkg-config --libs glib-2.0 + -L/usr/lib -lm -lglib-2.0 + +See the `pkg-config` website for more information about `pkg-config`. + +If your application uses or GObject features, it must be compiled and linked +with the options returned by the following `pkg-config` invocation: + + $ pkg-config --cflags --libs gobject-2.0 + +If your application uses modules, it must be compiled and linked with the +options returned by one of the following pkg-config invocations: + + $ pkg-config --cflags --libs gmodule-no-export-2.0 + $ pkg-config --cflags --libs gmodule-2.0 + +The difference between the two is that `gmodule-2.0` adds `--export-dynamic` +to the linker flags, which is often not needed. + +The simplest way to compile a program is to use the "backticks" feature of +the shell. If you enclose a command in backticks (not single quotes), then +its output will be substituted into the command line before execution. So to +compile a GLib Hello, World, you would type the following: + + $ cc `pkg-config --cflags glib-2.0` hello.c -o hello `pkg-config --libs glib-2.0` + +Deprecated GLib functions are annotated to make the compiler emit warnings +when they are used (e.g. with GCC, you need to use the +`-Wdeprecated-declarations option`). If these warnings are problematic, they +can be turned off by defining the preprocessor symbol +`GLIB_DISABLE_DEPRECATION_WARNINGS` by using the commandline option +`-DGLIB_DISABLE_DEPRECATION_WARNINGS` + +GLib deprecation annotations are versioned; by defining the macros +`GLIB_VERSION_MIN_REQUIRED` and `GLIB_VERSION_MAX_ALLOWED`, you can specify the +range of GLib versions whose API you want to use. APIs that were deprecated +before or introduced after this range will trigger compiler warnings. + +Since GLib 2.62, the older deprecation mechanism of hiding deprecated +interfaces entirely from the compiler by using the preprocessor symbol +`G_DISABLE_DEPRECATED` has been removed. All deprecations are now handled +using the above mechanism. + +The recommended way of using GLib has always been to only include the +toplevel headers `glib.h`, `glib-object.h`, `gio.h`. Starting with 2.32, GLib +enforces this by generating an error when individual headers are directly +included. + +Still, there are some exceptions; these headers have to be included +separately: + +- `gmodule.h` +- `glib-unix.h` +- `glib/gi18n-lib.h` or `glib/gi18n.h` (see the section on + [Internationalization](i18n.html)) +- `glib/gprintf.h` and `glib/gstdio.h` (we don't want to pull in all of + stdio) diff --git a/docs/reference/glib/compiling.xml b/docs/reference/glib/compiling.xml deleted file mode 100644 index c7a058c..0000000 --- a/docs/reference/glib/compiling.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - -Compiling GLib Applications -3 -GLib Library - - - -Compiling GLib Applications - -How to compile your GLib application - - - - -Compiling GLib Applications on UNIX - - -To compile a GLib application, you need to tell the compiler where to -find the GLib header files and libraries. This is done with the -pkg-config utility. - - -The following interactive shell session demonstrates how -pkg-config is used (the actual output on -your system may be different): - -$ pkg-config --cflags glib-2.0 - -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -$ pkg-config --libs glib-2.0 - -L/usr/lib -lm -lglib-2.0 - - - -See the pkg-config website -for more information about pkg-config. - - -If your application uses or GObject -features, it must be compiled and linked with the options returned -by the following pkg-config invocation: - -$ pkg-config --cflags --libs gobject-2.0 - - - -If your application uses modules, it must be compiled and linked -with the options returned by one of the following -pkg-config invocations: - -$ pkg-config --cflags --libs gmodule-no-export-2.0 -$ pkg-config --cflags --libs gmodule-2.0 - -The difference between the two is that gmodule-2.0 adds - to the linker flags, -which is often not needed. - - -The simplest way to compile a program is to use command substitution -feature of a shell. A command written in the format -$(command) gets substituted into the command line -before execution. So to compile a GLib Hello, World, you would type -the following: - -$ cc hello.c $(pkg-config --cflags --libs glib-2.0) -o hello - - - -Note that the name of the file must come before the other options -(such as pkg-config), or else you may get an -error from the linker. - - - -Deprecated GLib functions are annotated to make the compiler -emit warnings when they are used (e.g. with gcc, you need to use -the -Wdeprecated-declarations option). If these warnings are -problematic, they can be turned off by defining the preprocessor -symbol %GLIB_DISABLE_DEPRECATION_WARNINGS by using the commandline -option -DGLIB_DISABLE_DEPRECATION_WARNINGS - - - -GLib deprecation annotations are versioned; by defining the -macros %GLIB_VERSION_MIN_REQUIRED and %GLIB_VERSION_MAX_ALLOWED, -you can specify the range of GLib versions whose API you want -to use. APIs that were deprecated before or introduced after -this range will trigger compiler warnings. - - - -Since GLib 2.62, the older deprecation mechanism of hiding deprecated interfaces -entirely from the compiler by using the preprocessor symbol -G_DISABLE_DEPRECATED has been removed. All deprecations -are now handled using the above mechanism. - - - -The recommended way of using GLib has always been to only include the -toplevel headers glib.h, -glib-object.h, gio.h. -Starting with 2.32, GLib enforces this by generating an error -when individual headers are directly included. - - - -Still, there are some exceptions; these headers have to be included -separately: -gmodule.h, -glib-unix.h, -glib/gi18n-lib.h or -glib/gi18n.h (see -the Internationalization section), -glib/gprintf.h and -glib/gstdio.h -(we don't want to pull in all of stdio). - - - - - diff --git a/docs/reference/glib/conversion-macros.md b/docs/reference/glib/conversion-macros.md new file mode 100644 index 0000000..c27504c --- /dev/null +++ b/docs/reference/glib/conversion-macros.md @@ -0,0 +1,281 @@ +Title: Conversion Macros + +# Conversion Macros + +## Type Conversion + +Many times GLib, GTK, and other libraries allow you to pass "user data" to a +callback, in the form of a void pointer. From time to time you want to pass +an integer instead of a pointer. You could allocate an integer, with +something like: + +```c +int *ip = g_new (int, 1); +*ip = 42; +``` + +But this is inconvenient, and it's annoying to have to free the memory at +some later time. + +Pointers are always at least 32 bits in size (on all platforms GLib intends +to support). Thus you can store at least 32-bit integer values in a pointer +value. Naively, you might try this, but it's incorrect: + +```c +gpointer p; +int i; +p = (void*) 42; +i = (int) p; +``` + +Again, that example was not correct, don't copy it. + +The problem is that on some systems you need to do this: + +```c +gpointer p; +int i; +p = (void*) (long) 42; +i = (int) (long) p; +``` + +The GLib macros `GPOINTER_TO_INT()`, `GINT_TO_POINTER()`, etc. take care to +do the right thing on every platform. + +**Warning**: You may not store pointers in integers. This is not portable in +any way, shape or form. These macros only allow storing integers in +pointers, and only preserve 32 bits of the integer; values outside the range +of a 32-bit integer will be mangled. + + +``GINT_TO_POINTER(value)``, ``GPOINTER_TO_INT(value)`` +: Stuffs an integer into a pointer type, and vice versa. Remember, you may not + store pointers in integers. This is not portable in any way, shape or form. + These macros only allow storing integers in pointers, and only preserve 32 + bits of the integer; values outside the range of a 32-bit integer will be + mangled. + +``GUINT_TO_POINTER(value)``, ``GPOINTER_TO_UINT(value)`` +: Stuffs an unsigned integer into a pointer type, and vice versa. + +``GSIZE_TO_POINTER(value)``, ``GPOINTER_TO_SIZE(value)`` +: Stuffs a `size_t` into a pointer type, and vice versa. + +## Byte Order Conversion + +These macros provide a portable way to determine the host byte order and to +convert values between different byte orders. + +The byte order is the order in which bytes are stored to create larger data +types such as the #gint and #glong values. The host byte order is the byte +order used on the current machine. + +Some processors store the most significant bytes (i.e. the bytes that hold +the largest part of the value) first. These are known as big-endian +processors. Other processors (notably the x86 family) store the most +significant byte last. These are known as little-endian processors. + +Finally, to complicate matters, some other processors store the bytes in a +rather curious order known as PDP-endian. For a 4-byte word, the 3rd most +significant byte is stored first, then the 4th, then the 1st and finally the +2nd. + +Obviously there is a problem when these different processors communicate +with each other, for example over networks or by using binary file formats. +This is where these macros come in. They are typically used to convert +values into a byte order which has been agreed on for use when communicating +between different processors. The Internet uses what is known as 'network +byte order' as the standard byte order (which is in fact the big-endian byte +order). + +Note that the byte order conversion macros may evaluate their arguments +multiple times, thus you should not use them with arguments which have +side-effects. + +`G_BYTE_ORDER` +: The host byte order. This can be either `G_LITTLE_ENDIAN` or `G_BIG_ENDIAN`. + +`G_LITTLE_ENDIAN` +: Specifies the little endian byte order. + +`G_BIG_ENDIAN` +: Specifies the big endian byte order. + +`G_PDP_ENDIAN` +: Specifies the PDP endian byte order. + +### Signed + +`GINT_FROM_BE(value)` +: Converts an `int` value from big-endian to host byte order. + +`GINT_FROM_LE(value)` +: Converts an `int` value from little-endian to host byte order. + +`GINT_TO_BE(value)` +: Converts an `int` value from host byte order to big-endian. + +`GINT_TO_LE(value)` +: Converts an `int` value from host byte order to little-endian. + +`GLONG_FROM_BE(value)` +: Converts a `long` value from big-endian to the host byte order. + +`GLONG_FROM_LE(value)` +: Converts a `long` value from little-endian to host byte order. + +`GLONG_TO_BE(value)` +: Converts a `long` value from host byte order to big-endian. + +`GLONG_TO_LE(value)` +: Converts a `long` value from host byte order to little-endian. + +`GSSIZE_FROM_BE(value)` +: Converts a `ssize_t` value from big-endian to host byte order. + +`GSSIZE_FROM_LE(value)` +: Converts a `ssize_t` value from little-endian to host byte order. + +`GSSIZE_TO_BE(value)` +: Converts a `ssize_t` value from host byte order to big-endian. + +`GSSIZE_TO_LE(value)` +: Converts a `ssize_t` value from host byte order to little-endian. + +`GINT16_FROM_BE(value)` +: Converts an `int16_t` value from big-endian to host byte order. + +`GINT16_FROM_LE(value)` +: Converts an `int16_t` value from little-endian to host byte order. + +`GINT16_TO_BE(value)` +: Converts an `int16_t` value from host byte order to big-endian. + +`GINT16_TO_LE(value)` +: Converts an `int16_t` value from host byte order to little-endian. + +`GINT32_FROM_BE(value)` +: Converts an `int32_t` value from big-endian to host byte order. + +`GINT32_FROM_LE(value)` +: Converts an `int32_t` value from little-endian to host byte order. + +`GINT32_TO_BE(value)` +: Converts an `int32_t` value from host byte order to big-endian. + +`GINT32_TO_LE(value)` +: Converts an `int32_t` value from host byte order to little-endian. + +`GINT64_FROM_BE(value)` +: Converts an `int64_t` value from big-endian to host byte order. + +`GINT64_FROM_LE(value)` +: Converts an `int64_t` value from little-endian to host byte order. + +`GINT64_TO_BE(value)` +: Converts an `int64_t` value from host byte order to big-endian. + +`GINT64_TO_LE(value)` +: Converts an `int64_t` value from host byte order to little-endian. + +### Unsigned + +`GUINT_FROM_BE(value)` +: Converts an `unsigned int` value from big-endian to host byte order. + +`GUINT_FROM_LE(value)` +: Converts an `unsigned int` value from little-endian to host byte order. + +`GUINT_TO_BE(value)` +: Converts an `unsigned int` value from host byte order to big-endian. + +`GUINT_TO_LE(value)` +: Converts an `unsigned int` value from host byte order to little-endian. + +`GULONG_FROM_BE(value)` +: Converts an `unsigned long` value from big-endian to host byte order. + +`GULONG_FROM_LE(value)` +: Converts an `unsigned long` value from little-endian to host byte order. + +`GULONG_TO_BE(value)` +: Converts an `unsigned long` value from host byte order to big-endian. + +`GULONG_TO_LE(value)` +: Converts an `unsigned long` value from host byte order to little-endian. + +`GSIZE_FROM_BE(value)` +: Converts a `size_t` value from big-endian to the host byte order. + +`GSIZE_FROM_LE(value)` +: Converts a `size_t` value from little-endian to host byte order. + +`GSIZE_TO_BE(value)` +: Converts a `size_t` value from host byte order to big-endian. + +`GSIZE_TO_LE(value)` +: Converts a `size_t` value from host byte order to little-endian. + +`GUINT16_FROM_BE(value)` +: Converts an `uint16_t` value from big-endian to host byte order. + +`GUINT16_FROM_LE(value)` +: Converts an `uint16_t` value from little-endian to host byte order. + +`GUINT16_TO_BE(value)` +: Converts an `uint16_t` value from host byte order to big-endian. + +`GUINT16_TO_LE(value)` +: Converts an `uint16_t` value from host byte order to little-endian. + +`GUINT32_FROM_BE(value)` +: Converts an `uint32_t` value from big-endian to host byte order. + +`GUINT32_FROM_LE(value)` +: Converts an `uint32_t` value from little-endian to host byte order. + +`GUINT32_TO_BE(value)` +: Converts an `uint32_t` value from host byte order to big-endian. + +`GUINT32_TO_LE(value)` +: Converts an `uint32_t` value from host byte order to little-endian. + +`GUINT64_FROM_BE(value)` +: Converts an `uint64_t` value from big-endian to host byte order. + +`GUINT64_FROM_LE(value)` +: Converts an `uint64_t` value from little-endian to host byte order. + +`GUINT64_TO_BE(value)` +: Converts an `uint64_t` value from host byte order to big-endian. + +`GUINT64_TO_LE(value)` +: Converts an `uint64_t` value from host byte order to little-endian. + +`GUINT16_SWAP_BE_PDP(value)` +: Converts an `uint16_t` value between big-endian and pdp-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT16_SWAP_LE_BE(value)` +: Converts an `uint16_t` value between little-endian and big-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT16_SWAP_LE_PDP(value)` +: Converts an `uint16_t` value between little-endian and pdp-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT32_SWAP_BE_PDP(value)` +: Converts an `uint32_t` value between big-endian and pdp-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT32_SWAP_LE_BE(value)` +: Converts an `uint32_t` value between little-endian and big-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT32_SWAP_LE_PDP(value)` +: Converts an `uint32_t` value between little-endian and pdp-endian byte order. + The conversion is symmetric so it can be used both ways. + +`GUINT64_SWAP_LE_BE(value)` +: Converts a `uint64_t` value between little-endian and big-endian byte order. + The conversion is symmetric so it can be used both ways. diff --git a/docs/reference/glib/cross-compiling.md b/docs/reference/glib/cross-compiling.md new file mode 100644 index 0000000..4d91caa --- /dev/null +++ b/docs/reference/glib/cross-compiling.md @@ -0,0 +1,88 @@ +Title: Cross-compiling the GLib package + +# Cross-compiling the GLib Package + +## Building the Library for a different architecture + +Cross-compilation is the process of compiling a program or library on a +different architecture or operating system then it will be run upon. GLib is +slightly more difficult to cross-compile than many packages because much of +GLib is about hiding differences between different systems. + +These notes cover things specific to cross-compiling GLib; for general +information about cross-compilation, see the [Meson +documentation](http://mesonbuild.com/Cross-compilation.html). + +GLib tries to detect as much information as possible about the target system +by compiling and linking programs without actually running anything; +however, some information GLib needs is not available this way. This +information needs to be provided to meson via a ‘cross file’. + +As an example of using a cross file, to cross compile for the ‘MingW32’ +Win64 runtime environment on a Linux system, create a file `cross_file.txt` +with the following contents: + +``` +[host_machine] +system = 'windows' +cpu_family = 'x86_64' +cpu = 'x86_64' +endian = 'little' + +[properties] +c_args = [] +c_link_args = [] + +[binaries] +c = 'x86_64-w64-mingw32-gcc' +cpp = 'x86_64-w64-mingw32-g++' +ar = 'x86_64-w64-mingw32-ar' +ld = 'x86_64-w64-mingw32-ld' +objcopy = 'x86_64-w64-mingw32-objcopy' +strip = 'x86_64-w64-mingw32-strip' +pkgconfig = 'x86_64-w64-mingw32-pkg-config' +windres = 'x86_64-w64-mingw32-windres' +``` + +Then execute the following commands: + + meson setup --cross-file cross_file.txt builddir + +The complete list of cross properties follows. Most of these won't need to +be set in most cases. + +## Cross properties + +`have_[function]` +: When meson checks if a function is supported, the test can be overridden by + setting the `have_function` property to `true` or `false`. For example: + + Checking for function "fsync" : YES + + can be overridden by setting + + have_fsync = false + +`growing_stack=[true/false]` +: Whether the stack grows up or down. Most places will want `false`. A few + architectures, such as PA-RISC need `true`. + +`have_strlcpy=[true/false]` +: Whether you have `strlcpy()` that matches OpenBSD. Defaults to `false`, + which is safe, since GLib uses a built-in version in that case. + +`va_val_copy=[true/false]` +: Whether `va_list` can be copied as a pointer. If set to `false`, then + `memcopy()` will be used. Only matters if you don't have `va_copy()` or + `__va_copy()`. (So, doesn't matter for GCC.) Defaults to `true` which is + slightly more common than `false`. + +`have_c99_vsnprintf=[true/false]` +: Whether you have a `vsnprintf()` with C99 semantics. (C99 semantics means + returning the number of bytes that would have been written had the output + buffer had enough space.) Defaults to `false`. + +`have_c99_snprintf=[true/false]` +: Whether you have a `snprintf()` with C99 semantics. (C99 semantics means + returning the number of bytes that would have been written had the output + buffer had enough space.) Defaults to `false`. diff --git a/docs/reference/glib/cross.xml b/docs/reference/glib/cross.xml deleted file mode 100644 index c90b30b..0000000 --- a/docs/reference/glib/cross.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - -Cross-compiling the GLib package -3 -GLib Library - - - -Cross-compiling the GLib Package - -How to cross-compile GLib - - - - - Building the Library for a different architecture - - Cross-compilation is the process of compiling a program or - library on a different architecture or operating system then - it will be run upon. GLib is slightly more difficult to - cross-compile than many packages because much of GLib is - about hiding differences between different systems. - - - These notes cover things specific to cross-compiling GLib; - for general information about cross-compilation, see the - meson - info pages. - - - GLib tries to detect as much information as possible about - the target system by compiling and linking programs without - actually running anything; however, some information GLib - needs is not available this way. This information needs - to be provided to meson via a ‘cross file’. - - - As an example of using a cross file, to cross compile for - the ‘MingW32’ Win64 runtime environment on a Linux system, - create a file cross_file.txt with the following - contents: - - -[host_machine] -system = 'windows' -cpu_family = 'x86_64' -cpu = 'x86_64' -endian = 'little' - -[properties] -c_args = [] -c_link_args = [] - -[binaries] -c = 'x86_64-w64-mingw32-gcc' -cpp = 'x86_64-w64-mingw32-g++' -ar = 'x86_64-w64-mingw32-ar' -ld = 'x86_64-w64-mingw32-ld' -objcopy = 'x86_64-w64-mingw32-objcopy' -strip = 'x86_64-w64-mingw32-strip' -pkgconfig = 'x86_64-w64-mingw32-pkg-config' -windres = 'x86_64-w64-mingw32-windres' - - - Then execute the following commands: - - -meson --cross-file cross_file.txt builddir - - - The complete list of cross properties follows. Most - of these won't need to be set in most cases. - - - - Cross properties - - have_[function] - - - When meson checks if a function is supported, the test can be - overridden by setting the - have_function property - to true or false. - For example Checking for function "fsync" : YES - can be overridden by setting have_fsync = false - - - - growing_stack=[true/false] - - - Whether the stack grows up or down. Most places will want - false. - A few architectures, such as PA-RISC need true. - - - - have_strlcpy=[true/false] - - - Whether you have strlcpy() that matches - OpenBSD. Defaults to false, which is safe, - since GLib uses a built-in version in that case. - - - - va_val_copy=[true/false] - - - Whether va_list can be copied as a pointer. If set - to false, then memcopy() - will be used. Only matters if you don't have - va_copy() or __va_copy(). - (So, doesn't matter for GCC.) - Defaults to true which is slightly more common - than false. - - - - have_c99_vsnprintf=[true/false] - - - Whether you have a vsnprintf() with C99 - semantics. (C99 semantics means returning the number of bytes - that would have been written had the output buffer had enough - space.) Defaults to false. - - - - have_c99_snprintf=[true/false] - - - Whether you have a snprintf() with C99 - semantics. (C99 semantics means returning the number of bytes - that would have been written had the output buffer had enough - space.) Defaults to false. - - - - - - diff --git a/docs/reference/glib/data-structures.md b/docs/reference/glib/data-structures.md new file mode 100644 index 0000000..c31002a --- /dev/null +++ b/docs/reference/glib/data-structures.md @@ -0,0 +1,517 @@ +Title: Data Structures +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Allison Lortie +SPDX-FileCopyrightText: 2011 Collabora, Ltd. +SPDX-FileCopyrightText: 2012 Olivier Sessink +SPDX-FileCopyrightText: 2010, 2011, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2018 Sébastien Wilmet +SPDX-FileCopyrightText: 2018 Emmanuele Bassi +SPDX-FileCopyrightText: 2019 Emmanuel Fleury +SPDX-FileCopyrightText: 2017, 2018, 2019 Endless Mobile, Inc. +SPDX-FileCopyrightText: 2020 Endless OS Foundation, LLC + +# Data Structures + +GLib includes a number of basic data sructures, such as arrays, linked lists, hash tables, +queues, trees, etc. + +## Arrays + +GLib arrays ([struct@GLib.Array]) are similar to standard C arrays, except that they grow +automatically as elements are added. + +Array elements can be of any size (though all elements of one array are the same size), +and the array can be automatically cleared to '0's and zero-terminated. + +To create a new array use [func@GLib.Array.new]. + +To add elements to an array with a cost of O(n) at worst, use +[func@GLib.array_append_val], +[func@GLib.Array.append_vals], +[func@GLib.array_prepend_val], +[func@GLib.Array.prepend_vals], +[func@GLib.array_insert_val] and +[func@GLib.Array.insert_vals]. + +To access an element of an array in O(1) (to read it or to write it), +use [func@GLib.array_index]. + +To set the size of an array, use [func@GLib.Array.set_size]. + +To free an array, use [func@GLib.Array.unref] or [func@GLib.Array.free]. + +All the sort functions are internally calling a quick-sort (or similar) +function with an average cost of O(n log(n)) and a worst case cost of O(n^2). + +Here is an example that stores integers in a [struct@GLib.Array]: + +```c +GArray *array; +int i; + +// We create a new array to store int values. +// We don't want it zero-terminated or cleared to 0's. +array = g_array_new (FALSE, FALSE, sizeof (int)); + +for (i = 0; i < 10000; i++) + { + g_array_append_val (array, i); + } + +for (i = 0; i < 10000; i++) + { + if (g_array_index (array, int, i) != i) + g_print ("ERROR: got %d instead of %d\n", + g_array_index (array, int, i), i); + } + +g_array_free (array, TRUE); +``` + +## Pointer Arrays + +Pointer Arrays ([struct@GLib.PtrArray]) are similar to Arrays but are used +only for storing pointers. + +If you remove elements from the array, elements at the end of the +array are moved into the space previously occupied by the removed +element. This means that you should not rely on the index of particular +elements remaining the same. You should also be careful when deleting +elements while iterating over the array. + +To create a pointer array, use [func@GLib.PtrArray.new]. + +To add elements to a pointer array, use [func@GLib.PtrArray.add]. + +To remove elements from a pointer array, use +[func@GLib.PtrArray.remove], +[func@GLib.PtrArray.remove_index] or +[func@GLib.PtrArray.remove_index_fast]. + +To access an element of a pointer array, use [func@GLib.ptr_array_index]. + +To set the size of a pointer array, use [func@GLib.PtrArray.set_size]. + +To free a pointer array, use [func@GLib.PtrArray.unref] or [func@GLib.PtrArray.free]. + +An example using a [struct@GLib.PtrArray]: + +```c +GPtrArray *array; +char *string1 = "one"; +char *string2 = "two"; +char *string3 = "three"; + +array = g_ptr_array_new (); +g_ptr_array_add (array, (gpointer) string1); +g_ptr_array_add (array, (gpointer) string2); +g_ptr_array_add (array, (gpointer) string3); + +if (g_ptr_array_index (array, 0) != (gpointer) string1) + g_print ("ERROR: got %p instead of %p\n", + g_ptr_array_index (array, 0), string1); + +g_ptr_array_free (array, TRUE); +``` + +## Byte Arrays + +[struct@GLib.ByteArray] is a mutable array of bytes based on [struct@GLib.Array], +to provide arrays of bytes which grow automatically as elements are added. + +To create a new `GByteArray` use [func@GLib.ByteArray.new]. + +To add elements to a `GByteArray`, use +[func@GLib.ByteArray.append] and [func@GLib.ByteArray.prepend]. + +To set the size of a `GByteArray`, use [func@GLib.ByteArray.set_size]. + +To free a `GByteArray`, use [func@GLib.ByteArray.unref] or [func@GLib.ByteArray.free]. + +An example for using a `GByteArray`: + +```c +GByteArray *array; +int i; + +array = g_byte_array_new (); +for (i = 0; i < 10000; i++) + { + g_byte_array_append (array, (guint8*) "abcd", 4); + } + +for (i = 0; i < 10000; i++) + { + g_assert (array->data[4*i] == 'a'); + g_assert (array->data[4*i+1] == 'b'); + g_assert (array->data[4*i+2] == 'c'); + g_assert (array->data[4*i+3] == 'd'); + } + +g_byte_array_free (array, TRUE); +``` + +See [struct@GLib.Bytes] if you are interested in an immutable object representing a +sequence of bytes. + +## Singly-linked Lists + +The [struct@GLib.SList] structure and its associated functions provide a standard +singly-linked list data structure. The benefit of this data structure is to provide +insertion/deletion operations in O(1) complexity where access/search operations are +in O(n). The benefit of `GSList` over [struct@GLib.List] (doubly-linked list) is that +they are lighter in space as they only need to retain one pointer but it double the +cost of the worst case access/search operations. + +Each element in the list contains a piece of data, together with a pointer which links +to the next element in the list. Using this pointer it is possible to move through the +list in one direction only (unlike the [doubly-linked lists](#doubly-linked-lists), +which allow movement in both directions). + +The data contained in each element can be either integer values, by +using one of the [Type Conversion Macros](conversion-macros.html), +or simply pointers to any type of data. + +Note that most of the #GSList functions expect to be passed a pointer to the first element +in the list. The functions which insert elements return the new start of the list, which +may have changed. + +There is no function to create a `GSList`. `NULL` is considered to be the empty list so you +simply set a `GSList*` to `NULL`. + +To add elements, use [func@GLib.SList.append], [func@GLib.SList.prepend], +[func@GLib.SList.insert] and [func@GLib.SList.insert_sorted]. + +To remove elements, use [func@GLib.SList.remove]. + +To find elements in the list use [func@GLib.SList.last], [func@GLib.slist_next], +[func@GLib.SList.nth], [func@GLib.SList.nth_data], [func@GLib.SList.find] and +[func@GLib.SList.find_custom]. + +To find the index of an element use [func@GLib.SList.position] and [func@GLib.SList.index]. + +To call a function for each element in the list use [func@GLib.SList.foreach]. + +To free the entire list, use [func@GLib.SList.free]. + +## Doubly-linked Lists + +The [struct@GLib.List] structure and its associated functions provide a standard +doubly-linked list data structure. The benefit of this data-structure is to provide +insertion/deletion operations in O(1) complexity where access/search operations are in O(n). +The benefit of `GList` over [struct@GLib.SList] (singly-linked list) is that the worst case +on access/search operations is divided by two which comes at a cost in space as we need +to retain two pointers in place of one. + +Each element in the list contains a piece of data, together with pointers which link to the +previous and next elements in the list. Using these pointers it is possible to move through +the list in both directions (unlike the singly-linked [struct@GLib.SList], +which only allows movement through the list in the forward direction). + +The doubly-linked list does not keep track of the number of items and does not keep track of +both the start and end of the list. If you want fast access to both the start and the end of +the list, and/or the number of items in the list, use a [struct@GLib.Queue] instead. + +The data contained in each element can be either integer values, by using one of the +[Type Conversion Macros](conversion-macros.html), or simply pointers to any type of data. + +Note that most of the `GList` functions expect to be passed a pointer to the first element in the list. +The functions which insert elements return the new start of the list, which may have changed. + +There is no function to create a `GList`. `NULL` is considered to be a valid, empty list so you simply +set a `GList*` to `NULL` to initialize it. + +To add elements, use [func@GLib.List.append], [func@GLib.List.prepend], +[func@GLib.List.insert] and [func@GLib.List.insert_sorted]. + +To visit all elements in the list, use a loop over the list: + +```c +GList *l; +for (l = list; l != NULL; l = l->next) + { + // do something with l->data + } +``` + +To call a function for each element in the list, use [func@GLib.List.foreach]. + +To loop over the list and modify it (e.g. remove a certain element) a while loop is more appropriate, +for example: + +```c +GList *l = list; +while (l != NULL) + { + GList *next = l->next; + if (should_be_removed (l)) + { + // possibly free l->data + list = g_list_delete_link (list, l); + } + l = next; + } +``` + +To remove elements, use [func@GLib.List.remove]. + +To navigate in a list, use [func@GLib.List.first], [func@GLib.List.last], +[func@GLib.list_next], [func@GLib.list_previous]. + +To find elements in the list use [func@GLib.List.nth], [func@GLib.List.nth_data], +[func@GLib.List.find] and [func@GLib.List.find_custom]. + +To find the index of an element use [func@GLib.List.position] and [func@GLib.List.index]. + +To free the entire list, use [func@GLib.List.free] or [func@GLib.List.free_full]. + + +## Hash Tables + +A [struct@GLib.HashTable] provides associations between keys and values which is +optimized so that given a key, the associated value can be found, inserted or removed +in amortized O(1). All operations going through each element take O(n) time (list all +keys/values, table resize, etc.). + +Note that neither keys nor values are copied when inserted into the `GHashTable`, +so they must exist for the lifetime of the `GHashTable`. This means that the use +of static strings is OK, but temporary strings (i.e. those created in buffers and those +returned by GTK widgets) should be copied with [func@GLib.strdup] before being inserted. + +If keys or values are dynamically allocated, you must be careful to ensure that they are freed +when they are removed from the `GHashTable`, and also when they are overwritten by +new insertions into the `GHashTable`. It is also not advisable to mix static strings +and dynamically-allocated strings in a [struct@GLib.HashTable], because it then becomes difficult +to determine whether the string should be freed. + +To create a `GHashTable`, use [func@GLib.HashTable.new]. + +To insert a key and value into a `GHashTable`, use [func@GLib.HashTable.insert]. + +To look up a value corresponding to a given key, use [func@GLib.HashTable.lookup] or +[func@GLib.HashTable.lookup_extended]. + +[func@GLib.HashTable.lookup_extended] can also be used to simply check if a key is present +in the hash table. + +To remove a key and value, use [func@GLib.HashTable.remove]. + +To call a function for each key and value pair use [func@GLib.HashTable.foreach] or use +an iterator to iterate over the key/value pairs in the hash table, see [struct@GLib.HashTableIter]. +The iteration order of a hash table is not defined, and you must not rely on iterating over +keys/values in the same order as they were inserted. + +To destroy a `GHashTable` use [func@GLib.HashTable.unref] or [func@GLib.HashTable.destroy]. + +A common use-case for hash tables is to store information about a set of keys, without associating any +particular value with each key. `GHashTable` optimizes one way of doing so: If you store only +key-value pairs where key == value, then `GHashTable` does not allocate memory to store the values, +which can be a considerable space saving, if your set is large. The functions [func@GLib.HashTable.add] +and [func@GLib.HashTable.contains] are designed to be used when using `GHashTable` this way. + +`GHashTable` is not designed to be statically initialised with keys and values known at compile time. +To build a static hash table, use a tool such as [gperf](https://www.gnu.org/software/gperf/). + +## Double-ended Queues + +The [struct@GLib.Queue] structure and its associated functions provide a standard queue data structure. +Internally, `GQueue` uses the same data structure as [struct@GLib.List] to store elements with the same +complexity over insertion/deletion (O(1)) and access/search (O(n)) operations. + +The data contained in each element can be either integer values, by using one of the +[Type Conversion Macros](conversion-macros.html), or simply pointers to any type of data. + +As with all other GLib data structures, `GQueue` is not thread-safe. For a thread-safe queue, use +[struct@GLib.AsyncQueue]. + +To create a new GQueue, use [func@GLib.Queue.new]. + +To initialize a statically-allocated GQueue, use `G_QUEUE_INIT` or [method@GLib.Queue.init]. + +To add elements, use [method@GLib.Queue.push_head], [method@GLib.Queue.push_head_link], +[method@GLib.Queue.push_tail] and [method@GLib.Queue.push_tail_link]. + +To remove elements, use [method@GLib.Queue.pop_head] and [method@GLib.Queue.pop_tail]. + +To free the entire queue, use [method@GLib.Queue.free]. + +## Asynchronous Queues + +Often you need to communicate between different threads. In general it's safer not to do this +by shared memory, but by explicit message passing. These messages only make sense asynchronously +for multi-threaded applications though, as a synchronous operation could as well be done in the +same thread. + +Asynchronous queues are an exception from most other GLib data structures, as they can be used +simultaneously from multiple threads without explicit locking and they bring their own builtin +reference counting. This is because the nature of an asynchronous queue is that it will always +be used by at least 2 concurrent threads. + +For using an asynchronous queue you first have to create one with [func@GLib.AsyncQueue.new]. +[struct@GLib.AsyncQueue] structs are reference counted, use [method@GLib.AsyncQueue.ref] and +[method@GLib.AsyncQueue.unref] to manage your references. + +A thread which wants to send a message to that queue simply calls [method@GLib.AsyncQueue.push] +to push the message to the queue. + +A thread which is expecting messages from an asynchronous queue simply calls [method@GLib.AsyncQueue.pop] +for that queue. If no message is available in the queue at that point, the thread is now put to sleep +until a message arrives. The message will be removed from the queue and returned. The functions +[method@GLib.AsyncQueue.try_pop] and [method@GLib.AsyncQueue.timeout_pop] can be used to only check +for the presence of messages or to only wait a certain time for messages respectively. + +For almost every function there exist two variants, one that locks the queue and one that doesn't. +That way you can hold the queue lock (acquire it with [method@GLib.AsyncQueue.lock] and release it +with [method@GLib.AsyncQueue.unlock] over multiple queue accessing instructions. This can be necessary +to ensure the integrity of the queue, but should only be used when really necessary, as it can make your +life harder if used unwisely. Normally you should only use the locking function variants (those without +the `_unlocked` suffix). + +In many cases, it may be more convenient to use [struct@GLib.ThreadPool] when you need to distribute work +to a set of worker threads instead of using `GAsyncQueue` manually. `GThreadPool` uses a `GAsyncQueue` +internally. + +## Binary Trees + +The [struct@GLib.Tree] structure and its associated functions provide a sorted collection of key/value +pairs optimized for searching and traversing in order. This means that most of the operations (access, +search, insertion, deletion, …) on `GTree` are O(log(n)) in average and O(n) in worst case for time +complexity. But, note that maintaining a balanced sorted `GTree` of n elements is done in time O(n log(n)). + +To create a new `GTree` use [ctor@GLib.Tree.new]. + +To insert a key/value pair into a `GTree` use [method@GLib.Tree.insert] (O(n log(n))). + +To remove a key/value pair use [method@GLib.Tree.remove] (O(n log(n))). + +To look up the value corresponding to a given key, use [method@GLib.Tree.lookup] and +[method@GLib.Tree.lookup_extended]. + +To find out the number of nodes in a `GTree`, use [method@GLib.Tree.nnodes]. +To get the height of a `GTree`, use [method@GLib.Tree.height]. + +To traverse a `GTree`, calling a function for each node visited in +the traversal, use [method@GLib.Tree.foreach]. + +To destroy a `GTree`, use [method@GLib.Tree.destroy]. + +## N-ary Trees + +The [struct@GLib.Node] struct and its associated functions provide a N-ary tree +data structure, where nodes in the tree can contain arbitrary data. + +To create a new tree use [func@GLib.Node.new]. + +To insert a node into a tree use [method@GLib.Node.insert], [method@GLib.Node.insert_before], +[func@GLib.node_append] and [method@GLib.Node.prepend], + +To create a new node and insert it into a tree use [func@GLib.node_insert_data], +[func@GLib.node_insert_data_after], [func@GLib.node_insert_data_before], +[func@GLib.node_append_data] and [func@GLib.node_prepend_data]. + +To reverse the children of a node use [method@GLib.Node.reverse_children]. + +To find a node use [method@GLib.Node.get_root], [method@GLib.Node.find], [method@GLib.Node.find_child], +[method@GLib.Node.child_index], [method@GLib.Node.child_position], [func@GLib.node_first_child], +[method@GLib.Node.last_child], [method@GLib.Node.nth_child], [method@GLib.Node.first_sibling], +[func@GLib.node_prev_sibling], [func@GLib.node_next_sibling] or [method@GLib.Node.last_sibling]. + +To get information about a node or tree use `G_NODE_IS_LEAF()`, +`G_NODE_IS_ROOT()`, [method@GLib.Node.depth], [method@GLib.Node.n_nodes], +[method@GLib.Node.n_children], [method@GLib.Node.is_ancestor] or [method@GLib.Node.max_height]. + +To traverse a tree, calling a function for each node visited in the traversal, use +[method@GLib.Node.traverse] or [method@GLib.Node.children_foreach]. + +To remove a node or subtree from a tree use [method@GLib.Node.unlink] or [method@GLib.Node.destroy]. + +## Scalable Lists + +The [struct@GLib.Sequence] data structure has the API of a list, but is implemented internally with +a balanced binary tree. This means that most of the operations (access, search, insertion, deletion, +...) on `GSequence` are O(log(n)) in average and O(n) in worst case for time complexity. But, note that +maintaining a balanced sorted list of n elements is done in time O(n log(n)). The data contained +in each element can be either integer values, by using of the +[Type Conversion Macros](conversion-macros.md), or simply pointers to any type of data. + +A `GSequence` is accessed through "iterators", represented by a [struct@GLib.SequenceIter]. An iterator +represents a position between two elements of the sequence. For example, the "begin" iterator represents +the gap immediately before the first element of the sequence, and the "end" iterator represents the gap +immediately after the last element. In an empty sequence, the begin and end iterators are the same. + +Some methods on `GSequence` operate on ranges of items. For example [func@GLib.Sequence.foreach_range] +will call a user-specified function on each element with the given range. The range is delimited by the +gaps represented by the passed-in iterators, so if you pass in the begin and end iterators, the range in +question is the entire sequence. + +The function [func@GLib.Sequence.get] is used with an iterator to access the element immediately following +the gap that the iterator represents. The iterator is said to "point" to that element. + +Iterators are stable across most operations on a `GSequence`. For example an iterator pointing to some element +of a sequence will continue to point to that element even after the sequence is sorted. Even moving an element +to another sequence using for example [func@GLib.Sequence.move_range] will not invalidate the iterators pointing +to it. The only operation that will invalidate an iterator is when the element it points to is removed from +any sequence. + +To sort the data, either use [method@GLib.Sequence.insert_sorted] or [method@GLib.Sequence.insert_sorted_iter] +to add data to the `GSequence` or, if you want to add a large amount of data, it is more efficient to call +[method@GLib.Sequence.sort] or [method@GLib.Sequence.sort_iter] after doing unsorted insertions. + +## Reference-counted strings + +Reference-counted strings are normal C strings that have been augmented with a reference count to manage +their resources. You allocate a new reference counted string and acquire and release references as needed, +instead of copying the string among callers; when the last reference on the string is released, the resources +allocated for it are freed. + +Typically, reference-counted strings can be used when parsing data from files and storing them into data +structures that are passed to various callers: + +```c +PersonDetails * +person_details_from_data (const char *data) +{ + // Use g_autoptr() to simplify error cases + g_autoptr(GRefString) full_name = NULL; + g_autoptr(GRefString) address = NULL; + g_autoptr(GRefString) city = NULL; + g_autoptr(GRefString) state = NULL; + g_autoptr(GRefString) zip_code = NULL; + + // parse_person_details() is defined elsewhere; returns refcounted strings + if (!parse_person_details (data, &full_name, &address, &city, &state, &zip_code)) + return NULL; + + if (!validate_zip_code (zip_code)) + return NULL; + + // add_address_to_cache() and add_full_name_to_cache() are defined + // elsewhere; they add strings to various caches, using refcounted + // strings to avoid copying data over and over again + add_address_to_cache (address, city, state, zip_code); + add_full_name_to_cache (full_name); + + // person_details_new() is defined elsewhere; it takes a reference + // on each string + PersonDetails *res = person_details_new (full_name, + address, + city, + state, + zip_code); + + return res; +} +``` + +In the example above, we have multiple functions taking the same strings for different uses; with typical +C strings, we'd have to copy the strings every time the life time rules of the data differ from the +life-time of the string parsed from the original buffer. With reference counted strings, each caller can +ake a reference on the data, and keep it as long as it needs to own the string. + +Reference-counted strings can also be "interned" inside a global table owned by GLib; while an interned +string has at least a reference, creating a new interned reference-counted string with the same contents +will return a reference to the existing string instead of creating a new reference-counted string instance. +Once the string loses its last reference, it will be automatically removed from the global interned strings +table. + +Reference-counted strings were added to GLib in 2.58. diff --git a/docs/reference/glib/datalist-and-dataset.md b/docs/reference/glib/datalist-and-dataset.md new file mode 100644 index 0000000..ccaf9da --- /dev/null +++ b/docs/reference/glib/datalist-and-dataset.md @@ -0,0 +1,78 @@ +Title: Keyed Data Lists and Datasets +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 1999 Owen Taylor +SPDX-FileCopyrightText: 2000 Red Hat, Inc. +SPDX-FileCopyrightText: 2005 Tim Janik + +## Keyed Data Lists + +Keyed data lists provide lists of arbitrary data elements which can +be accessed either with a string or with a [type@GLib.Quark] corresponding to +the string. + +The [type@GLib.Quark] methods are quicker, since the strings have to be +converted to [type@GLib.Quark]s anyway. + +Data lists are used for associating arbitrary data with +[`GObject`](../gobject/class.Object.html)s, using [`g_object_set_data()`](../gobject/method.Object.set_data.html) and related +functions. The data is stored inside opaque [type@GLib.Data] elements. + +To create a datalist, use [func@GLib.datalist_init]. + +To add data elements to a datalist use [func@GLib.datalist_id_set_data], +[func@GLib.datalist_id_set_data_full], [func@GLib.datalist_set_data], +[func@GLib.datalist_set_data_full] and [func@GLib.datalist_id_replace_data]. + +To get data elements from a datalist use [func@GLib.datalist_id_get_data], +[func@GLib.datalist_get_data] and [func@GLib.datalist_id_dup_data]. + +To iterate over all data elements in a datalist use +[func@GLib.datalist_foreach] (not thread-safe). + +To remove data elements from a datalist use +[func@GLib.datalist_id_remove_data], [func@GLib.datalist_remove_data] and +[func@GLib.datalist_id_remove_multiple]. To remove elements without destroying +them, use [func@GLib.datalist_id_remove_no_notify] and +[func@GLib.datalist_remove_no_notify]. + +To remove all data elements from a datalist, use [func@GLib.datalist_clear]. + +A small number of boolean flags can be stored alongside a datalist, using +[func@GLib.datalist_set_flags], [func@GLib.datalist_unset_flags] and +[func@GLib.datalist_get_flags]. + +## Datasets + +Datasets associate groups of data elements with particular memory +locations. These are useful if you need to associate data with a +structure returned from an external library. Since you cannot modify +the structure, you use its location in memory as the key into a +dataset, where you can associate any number of data elements with it. + +There are two forms of most of the dataset functions. The first form +uses strings to identify the data elements associated with a +location. The second form uses [type@GLib.Quark] identifiers, which are +created with a call to [func@GLib.quark_from_string] or +[func@GLib.quark_from_static_string]. The second form is quicker, since it +does not require looking up the string in the hash table of [type@GLib.Quark] +identifiers. + +There is no function to create a dataset. It is automatically +created as soon as you add elements to it. + +To add data elements to a dataset use [func@GLib.dataset_id_set_data], +[func@GLib.dataset_id_set_data_full], [func@GLib.dataset_set_data] and +[func@GLib.dataset_set_data_full]. + +To get data elements from a dataset use [func@GLib.dataset_id_get_data] and +[func@GLib.dataset_get_data]. + +To iterate over all data elements in a dataset use +[func@GLib.dataset_foreach] (not thread-safe). + +To remove data elements from a dataset use +[func@GLib.dataset_id_remove_data] and [func@GLib.dataset_remove_data]. To +remove data without destroying it, use [func@GLib.dataset_id_remove_no_notify] +and [func@GLib.dataset_remove_no_notify]. + +To destroy a dataset, use [func@GLib.dataset_destroy]. diff --git a/docs/reference/glib/error-reporting.md b/docs/reference/glib/error-reporting.md new file mode 100644 index 0000000..5cc9fa2 --- /dev/null +++ b/docs/reference/glib/error-reporting.md @@ -0,0 +1,487 @@ +Title: Error Reporting + +# Error Reporting + +GLib provides a standard method of reporting errors from a called function +to the calling code. (This is the same problem solved by exceptions in other +languages.) It's important to understand that this method is both a data +type (the [`type@GLib.Error`] struct) and a set of rules. If you use +`GError` incorrectly, then your code will not properly interoperate with +other code that uses `GError`, and users of your API will probably get +confused. In most cases, using `GError` is preferred over numeric error +codes, but there are situations where numeric error codes are useful for +performance. + +First and foremost: `GError` should only be used to report recoverable +runtime errors, never to report programming errors. If the programmer has +screwed up, then you should use `g_warning()`, `g_return_if_fail()`, +`g_assert()`, `g_error()`, or some similar facility. (Incidentally, remember +that the `g_error()` function should only be used for programming errors, it +should not be used to print any error reportable via `GError`.) + +Examples of recoverable runtime errors are "file not found" or "failed to +parse input." Examples of programming errors are "NULL passed to `strcmp()`" +or "attempted to free the same pointer twice." These two kinds of errors are +fundamentally different: runtime errors should be handled or reported to the +user, programming errors should be eliminated by fixing the bug in the +program. This is why most functions in GLib and GTK do not use the `GError` +facility. + +Functions that can fail take a return location for a `GError` as their last +argument. On error, a new `GError` instance will be allocated and returned +to the caller via this argument. For example: + +```c +gboolean g_file_get_contents (const char *filename, + char **contents, + gsize *length, + GError **error); +``` + +If you pass a non-`NULL` value for the `error` argument, it should +point to a location where an error can be placed. For example: + +```c +char *contents; +GError *err = NULL; + +g_file_get_contents ("foo.txt", &contents, NULL, &err); +g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL)); +if (err != NULL) + { + // Report error to user, and free error + g_assert (contents == NULL); + fprintf (stderr, "Unable to read file: %s\n", err->message); + g_error_free (err); + } +else + { + // Use file contents + g_assert (contents != NULL); + } +``` + +Note that `err != NULL` in this example is a reliable indicator of whether +`g_file_get_contents()` failed. Additionally, `g_file_get_contents()` +returns a boolean which indicates whether it was successful. + +Because `g_file_get_contents()` returns `FALSE` on failure, if you +are only interested in whether it failed and don't need to display +an error message, you can pass `NULL` for the `error` argument: + +```c +if (g_file_get_contents ("foo.txt", &contents, NULL, NULL)) // ignore errors + // no error occurred + ; +else + // error + ; +``` + +The `GError` object contains three fields: `domain` indicates the module the +error-reporting function is located in, `code` indicates the specific error +that occurred, and `message` is a user-readable error message with as many +details as possible. Several functions are provided to deal with an error +received from a called function: `g_error_matches()` returns `TRUE` if the +error matches a given domain and code, `g_propagate_error()` copies an error +into an error location (so the calling function will receive it), and +`g_clear_error()` clears an error location by freeing the error and +resetting the location to `NULL`. To display an error to the user, simply +display the `message`, perhaps along with additional context known only to +the calling function (the file being opened, or whatever - though in the +`g_file_get_contents()` case, the `message` already contains a filename). + +Since error messages may be displayed to the user, they need to be valid +UTF-8 (all GTK widgets expect text to be UTF-8). Keep this in mind in +particular when formatting error messages with filenames, which are in the +'filename encoding', and need to be turned into UTF-8 using +`g_filename_to_utf8()`, `g_filename_display_name()` or +`g_utf8_make_valid()`. + +Note, however, that many error messages are too technical to display to the +user in an application, so prefer to use `g_error_matches()` to categorize +errors from called functions, and build an appropriate error message for the +context within your application. Error messages from a `GError` are more +appropriate to be printed in system logs or on the command line. They are +typically translated. + +## Reporting errors + +When implementing a function that can report errors, the basic tool is +`g_set_error()`. Typically, if a fatal error occurs you want to +`g_set_error()`, then return immediately. `g_set_error()` does nothing if +the error location passed to it is `NULL`. Here's an example: + +```c +int +foo_open_file (GError **error) +{ + int fd; + int saved_errno; + + g_return_val_if_fail (error == NULL || *error == NULL, -1); + + fd = open ("file.txt", O_RDONLY); + saved_errno = errno; + + if (fd < 0) + { + g_set_error (error, + FOO_ERROR, // error domain + FOO_ERROR_BLAH, // error code + "Failed to open file: %s", // error message format string + g_strerror (saved_errno)); + return -1; + } + else + return fd; +} +``` + +Things are somewhat more complicated if you yourself call another function +that can report a `GError`. If the sub-function indicates fatal errors in +some way other than reporting a `GError`, such as by returning `TRUE` on +success, you can simply do the following: + +```c +gboolean +my_function_that_can_fail (GError **err) +{ + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + if (!sub_function_that_can_fail (err)) + { + // assert that error was set by the sub-function + g_assert (err == NULL || *err != NULL); + return FALSE; + } + + // otherwise continue, no error occurred + g_assert (err == NULL || *err == NULL); +} +``` + +If the sub-function does not indicate errors other than by reporting a +`GError` (or if its return value does not reliably indicate errors) you need +to create a temporary `GError` since the passed-in one may be `NULL`. +`g_propagate_error()` is intended for use in this case. + +```c +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + tmp_error = NULL; + sub_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + // store tmp_error in err, if err != NULL, + // otherwise call g_error_free() on tmp_error + g_propagate_error (err, tmp_error); + return FALSE; + } + + // otherwise continue, no error occurred +} +``` + +Error pileups are always a bug. For example, this code is incorrect: + +```c +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + tmp_error = NULL; + sub_function_that_can_fail (&tmp_error); + other_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + g_propagate_error (err, tmp_error); + return FALSE; + } +} +``` + +`tmp_error` should be checked immediately after +`sub_function_that_can_fail()`, and either cleared or propagated upward. The +rule is: after each error, you must either handle the error, or return it to +the calling function. + +Note that passing `NULL` for the error location is the equivalent of +handling an error by always doing nothing about it. So the following code is +fine, assuming errors in `sub_function_that_can_fail()` are not fatal to +`my_function_that_can_fail()`: + +```c +gboolean +my_function_that_can_fail (GError **err) +{ + GError *tmp_error; + + g_return_val_if_fail (err == NULL || *err == NULL, FALSE); + + sub_function_that_can_fail (NULL); // ignore errors + + tmp_error = NULL; + other_function_that_can_fail (&tmp_error); + + if (tmp_error != NULL) + { + g_propagate_error (err, tmp_error); + return FALSE; + } +} +``` + +Note that passing `NULL` for the error location ignores errors; it's +equivalent to: + +```cpp +try { sub_function_that_can_fail (); } catch (...) {} +``` + +in C++. It does not mean to leave errors unhandled; it means to handle them +by doing nothing. + +## Error domains + +Error domains and codes are conventionally named as follows: + +- The error domain is called `__ERROR`, for example + `G_SPAWN_ERROR` or `G_THREAD_ERROR`: + ```c + #define G_SPAWN_ERROR g_spawn_error_quark () + + G_DEFINE_QUARK (g-spawn-error-quark, g_spawn_error) + ``` + +- The quark function for the error domain is called + `__error_quark`, for example `g_spawn_error_quark()` or + `g_thread_error_quark()`. + +- The error codes are in an enumeration called `Error`; + for example, `GThreadError` or `GSpawnError`. + +- Members of the error code enumeration are called + `__ERROR_`, for example `G_SPAWN_ERROR_FORK` or + `G_THREAD_ERROR_AGAIN`. + +- If there's a "generic" or "unknown" error code for unrecoverable errors it + doesn't make sense to distinguish with specific codes, it should be called + `__ERROR_FAILED`, for example `G_SPAWN_ERROR_FAILED`. + In the case of error code enumerations that may be extended in future + releases, you should generally not handle this error code explicitly, but + should instead treat any unrecognized error code as equivalent to + `FAILED`. + +## Comparison of `GError` and traditional error handling + +`GError` has several advantages over traditional numeric error codes: +importantly, tools like [gobject-introspection](https://gi.readthedocs.org) +understand `GError`s and convert them to exceptions in bindings; the message +includes more information than just a code; and use of a domain helps +prevent misinterpretation of error codes. + +`GError` has disadvantages though: it requires a memory allocation, and +formatting the error message string has a performance overhead. This makes +it unsuitable for use in retry loops where errors are a common case, rather +than being unusual. For example, using `G_IO_ERROR_WOULD_BLOCK` means +hitting these overheads in the normal control flow. String formatting +overhead can be eliminated by using `g_set_error_literal()` in some cases. + +These performance issues can be compounded if a function wraps the `GError`s +returned by the functions it calls: this multiplies the number of +allocations and string formatting operations. This can be partially +mitigated by using `g_prefix_error()`. + +## Rules for use of `GError` + +Summary of rules for use of `GError`: + +- Do not report programming errors via `GError`. + +- The last argument of a function that returns an error should be a location + where a `GError` can be placed (i.e. `GError **error`). If `GError` is + used with varargs, the `GError**` should be the last argument before the + `...`. + +- The caller may pass `NULL` for the `GError**` if they are not interested + in details of the exact error that occurred. + +- If `NULL` is passed for the `GError**` argument, then errors should not be + returned to the caller, but your function should still abort and return if + an error occurs. That is, control flow should not be affected by whether + the caller wants to get a `GError`. + +- If a `GError` is reported, then your function by definition had a fatal + failure and did not complete whatever it was supposed to do. If the + failure was not fatal, then you handled it and you should not report it. + If it was fatal, then you must report it and discontinue whatever you were + doing immediately. + +- If a `GError` is reported, out parameters are not guaranteed to be set to + any defined value. + +- A `GError*` must be initialized to `NULL` before passing its address to a + function that can report errors. + +- `GError` structs must not be stack-allocated. + +- "Piling up" errors is always a bug. That is, if you assign a new `GError` + to a `GError*` that is non-`NULL`, thus overwriting the previous error, it + indicates that you should have aborted the operation instead of + continuing. If you were able to continue, you should have cleared the + previous error with `g_clear_error()`. `g_set_error()` will complain if + you pile up errors. + +- By convention, if you return a boolean value indicating success then + `TRUE` means success and `FALSE` means failure. Avoid creating functions + which have a boolean return value and a `GError` parameter, but where the + boolean does something other than signal whether the `GError` is set. + Among other problems, it requires C callers to allocate a temporary error. + Instead, provide a `gboolean *` out parameter. There are functions in + GLib itself such as `g_key_file_has_key()` that are hard to use because of + this. If `FALSE` is returned, the error must be set to a non-`NULL` value. + One exception to this is that in situations that are already considered to + be undefined behaviour (such as when a `g_return_val_if_fail()` check + fails), the error need not be set. Instead of checking separately whether + the error is set, callers should ensure that they do not provoke undefined + behaviour, then assume that the error will be set on failure. + +- A `NULL` return value is also frequently used to mean that an error + occurred. You should make clear in your documentation whether `NULL` is a + valid return value in non-error cases; if `NULL` is a valid value, then + users must check whether an error was returned to see if the function + succeeded. + +- When implementing a function that can report errors, you may want + to add a check at the top of your function that the error return + location is either `NULL` or contains a `NULL` error (e.g. + `g_return_if_fail (error == NULL || *error == NULL);`). + +## Extended `GError` Domains + +Since GLib 2.68 it is possible to extend the `GError` type. This is +done with the `G_DEFINE_EXTENDED_ERROR()` macro. To create an +extended `GError` type do something like this in the header file: + +```c +typedef enum +{ + MY_ERROR_BAD_REQUEST, +} MyError; +#define MY_ERROR (my_error_quark ()) +GQuark my_error_quark (void); +int +my_error_get_parse_error_id (GError *error); +const char * +my_error_get_bad_request_details (GError *error); +``` + +and in the implementation: + +```c +typedef struct +{ + int parse_error_id; + char *bad_request_details; +} MyErrorPrivate; + +static void +my_error_private_init (MyErrorPrivate *priv) +{ + priv->parse_error_id = -1; + // No need to set priv->bad_request_details to NULL, + // the struct is initialized with zeros. +} + +static void +my_error_private_copy (const MyErrorPrivate *src_priv, MyErrorPrivate *dest_priv) +{ + dest_priv->parse_error_id = src_priv->parse_error_id; + dest_priv->bad_request_details = g_strdup (src_priv->bad_request_details); +} + +static void +my_error_private_clear (MyErrorPrivate *priv) +{ + g_free (priv->bad_request_details); +} + +// This defines the my_error_get_private and my_error_quark functions. +G_DEFINE_EXTENDED_ERROR (MyError, my_error) + +int +my_error_get_parse_error_id (GError *error) +{ + MyErrorPrivate *priv = my_error_get_private (error); + g_return_val_if_fail (priv != NULL, -1); + return priv->parse_error_id; +} + +const char * +my_error_get_bad_request_details (GError *error) +{ + MyErrorPrivate *priv = my_error_get_private (error); + g_return_val_if_fail (priv != NULL, NULL); + g_return_val_if_fail (error->code != MY_ERROR_BAD_REQUEST, NULL); + return priv->bad_request_details; +} + +static void +my_error_set_bad_request (GError **error, + const char *reason, + int error_id, + const char *details) +{ + MyErrorPrivate *priv; + g_set_error (error, MY_ERROR, MY_ERROR_BAD_REQUEST, "Invalid request: %s", reason); + if (error != NULL && *error != NULL) + { + priv = my_error_get_private (error); + g_return_val_if_fail (priv != NULL, NULL); + priv->parse_error_id = error_id; + priv->bad_request_details = g_strdup (details); + } +} +``` + +An example of use of the error could be: + +```c +gboolean +send_request (GBytes *request, GError **error) +{ + ParseFailedStatus *failure = validate_request (request); + if (failure != NULL) + { + my_error_set_bad_request (error, failure->reason, failure->error_id, failure->details); + parse_failed_status_free (failure); + return FALSE; + } + + return send_one (request, error); +} +``` + +Please note that if you are a library author and your library exposes an +existing error domain, then you can't make this error domain an extended one +without breaking ABI. This is because earlier it was possible to create an +error with this error domain on the stack and then copy it with +`g_error_copy()`. If the new version of your library makes the error domain +an extended one, then `g_error_copy()` called by code that allocated the +error on the stack will try to copy more data than it used to, which will +lead to undefined behavior. You must not stack-allocate errors with an +extended error domain, and it is bad practice to stack-allocate any other +`GError`s. + +Extended error domains in unloadable plugins/modules are not supported. diff --git a/docs/reference/glib/file-utils.md b/docs/reference/glib/file-utils.md new file mode 100644 index 0000000..685bb47 --- /dev/null +++ b/docs/reference/glib/file-utils.md @@ -0,0 +1,110 @@ +Title: File Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2012 Dan Winship + +# File Utilities + +Do not use these APIs unless you are porting a POSIX application to Windows. +A more high-level file access API is provided as GIO; see the documentation +for [`GFile`](../gio/iface.File.html). + +## POSIX File Wrappers + +There is a group of functions which wrap the common POSIX functions +dealing with filenames: + + * [func@GLib.access] + * [func@GLib.chdir] + * [func@GLib.chmod] + * [func@GLib.close] + * [func@GLib.creat] + * [func@GLib.fopen], + * [func@GLib.freopen] + * [func@GLib.fsync] + * [func@GLib.lstat] + * [func@GLib.mkdir] + * [func@GLib.open] + * [func@GLib.remove] + * [func@GLib.rename] + * [func@GLib.rmdir] + * [func@GLib.stat] + * [func@GLib.unlink] + * [func@GLib.utime] + +The point of these wrappers is to make it possible to handle file names with any +Unicode characters in them on Windows without having to use `#ifdef`s and the +wide character API in the application code. + +On some Unix systems, these APIs may be defined as identical to their POSIX +counterparts. For this reason, you must check for and include the necessary +header files (such as `fcntl.h`) before using functions like [func@GLib.creat]. +You must also define the relevant feature test macros. + +The pathname argument should be in the GLib file name encoding. +On POSIX this is the actual on-disk encoding which might correspond +to the locale settings of the process (or the `G_FILENAME_ENCODING` +environment variable), or not. + +On Windows the GLib file name encoding is UTF-8. Note that the +Microsoft C library does not use UTF-8, but has separate APIs for +current system code page and wide characters (UTF-16). The GLib +wrappers call the wide character API if present (on modern Windows +systems), otherwise convert to/from the system code page. + +## POSIX Directory Wrappers + +Another group of functions allows to open and read directories +in the GLib file name encoding: + + * [ctor@GLib.Dir.open] + * [method@GLib.Dir.read_name] + * [method@GLib.Dir.rewind] + * [method@GLib.Dir.close] + +## Error Handling + + * [func@GLib.file_error_from_errno] + +## Setting/Getting File Contents + + * [func@GLib.file_get_contents] + * [func@GLib.file_set_contents] + * [func@GLib.file_set_contents_full] + +## File Tests + + * [func@GLib.file_test] + * [func@GLib.file_read_link] + +## Temporary File Handling + + * [func@GLib.mkdtemp] + * [func@GLib.mkdtemp_full] + * [func@GLib.mkstemp] + * [func@GLib.mkstemp_full] + * [func@GLib.file_open_tmp] + * [id@g_dir_make_tmp] + +## Building and Manipulating Paths + + * [func@GLib.build_path] + * [func@GLib.build_pathv] + * [func@GLib.build_filename] + * [func@GLib.build_filenamev] + * [func@GLib.build_filename_valist] + * [func@GLib.IS_DIR_SEPARATOR] + * [func@GLib.path_is_absolute] + * [func@GLib.path_skip_root] + * [func@GLib.get_current_dir] + * [func@GLib.path_get_basename] + * [func@GLib.path_get_dirname] + * [func@GLib.canonicalize_filename] + +## Creating Directories + + * [func@GLib.mkdir_with_parents] + +## Deprecated API + + * [func@GLib.basename] + diff --git a/docs/reference/glib/glib-docs.xml b/docs/reference/glib/glib-docs.xml deleted file mode 100644 index 5bf2e5c..0000000 --- a/docs/reference/glib/glib-docs.xml +++ /dev/null @@ -1,315 +0,0 @@ - - - -]> - - - GLib Reference Manual - - for GLib &version; - The latest version of this documentation can be found on-line at - https://developer.gnome.org/glib/unstable/. - - - - - GLib Overview - - GLib is a general-purpose utility library, which provides many useful - data types, macros, type conversions, string utilities, file utilities, - a mainloop abstraction, and so on. It works on many UNIX-like platforms, - as well as Windows and OS X. GLib is released under the GNU Lesser - General Public License (GNU LGPL). - - - - - - - - - - - - - - GLib Fundamentals - - - - - - - - - - - - - GLib Core Application Support - - - - - - - - - - - - - - - GLib Utilities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - GLib Data Types - - - - - - - - - - - - - - - - - - - - - - - - - - - - Deprecated APIs - - - - - - - - GLib Tools - - - - - Deprecated Tools - - - - - - Index - - - - Index of deprecated symbols - - - - Index of new symbols in 2.2 - - - - Index of new symbols in 2.4 - - - - Index of new symbols in 2.6 - - - - Index of new symbols in 2.8 - - - - Index of new symbols in 2.10 - - - - Index of new symbols in 2.12 - - - - Index of new symbols in 2.14 - - - - Index of new symbols in 2.16 - - - - Index of new symbols in 2.18 - - - - Index of new symbols in 2.20 - - - - Index of new symbols in 2.22 - - - - Index of new symbols in 2.24 - - - - Index of new symbols in 2.26 - - - - Index of new symbols in 2.28 - - - - Index of new symbols in 2.30 - - - - Index of new symbols in 2.32 - - - - Index of new symbols in 2.34 - - - - Index of new symbols in 2.36 - - - - Index of new symbols in 2.38 - - - - Index of new symbols in 2.40 - - - - Index of new symbols in 2.42 - - - - Index of new symbols in 2.44 - - - - Index of new symbols in 2.46 - - - - Index of new symbols in 2.48 - - - - Index of new symbols in 2.50 - - - - Index of new symbols in 2.52 - - - - Index of new symbols in 2.54 - - - - Index of new symbols in 2.56 - - - - Index of new symbols in 2.58 - - - - Index of new symbols in 2.60 - - - - Index of new symbols in 2.62 - - - - Index of new symbols in 2.64 - - - - Index of new symbols in 2.66 - - - - Index of new symbols in 2.68 - - - - Index of new symbols in 2.70 - - - - Index of new symbols in 2.72 - - - - Index of new symbols in 2.74 - - - - Index of new symbols in 2.76 - - - - Index of new symbols in 2.78 - - - - - - diff --git a/docs/reference/glib/glib-gettextize.rst b/docs/reference/glib/glib-gettextize.rst new file mode 100644 index 0000000..78b3a06 --- /dev/null +++ b/docs/reference/glib/glib-gettextize.rst @@ -0,0 +1,59 @@ +.. _glib-gettextize(1): +.. meta:: + :copyright: Copyright 2003 Matthias Clasen + :copyright: Copyright 2012 Red Hat, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2003 Matthias Clasen + SPDX-FileCopyrightText: 2012 Red Hat, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +=============== +glib-gettextize +=============== + +------------------------------------ +gettext internationalization utility +------------------------------------ + +SYNOPSIS +-------- + +| **glib-gettextize** [*OPTION*…] [*DIRECTORY*] + +DESCRIPTION +----------- + +``glib-gettextize`` helps to prepare a source package for being +internationalized through `gettext `_. +It is a variant of the ``gettextize`` that ships with gettext. + +``glib-gettextize`` differs from ``gettextize`` in that it doesn’t create an +``intl/`` subdirectory and doesn’t modify ``po/ChangeLog`` (note that newer +versions of ``gettextize`` behave like this when called with the +``--no-changelog`` option). + +OPTIONS +------- + +``--help`` + + Print help and exit. + +``--version`` + + Print version information and exit. + +``-c``, ``--copy`` + + Copy files instead of making symlinks. + +``-f``, ``--force`` + + Force writing of new files even if old ones exist. + +SEE ALSO +-------- + +`gettextize(1) `_ \ No newline at end of file diff --git a/docs/reference/glib/glib-gettextize.xml b/docs/reference/glib/glib-gettextize.xml deleted file mode 100644 index f016b28..0000000 --- a/docs/reference/glib/glib-gettextize.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - -glib-gettextize -GLib - - -Developer -Owen -Taylor - - - - - -glib-gettextize -1 -User Commands - - - -glib-gettextize -gettext internationalization utility - - - - -glib-gettextize -OPTION -DIRECTORY - - - -Description -glib-gettextize helps to prepare a source package for being -internationalized through gettext. -It is a variant of the gettextize that ships with -gettext. - - -glib-gettextize differs -from gettextize in that it doesn't create an -intl/ subdirectory and doesn't modify -po/ChangeLog (note that newer versions of -gettextize behave like this when called with the - option). - - - -Options - - - - - -print help and exit - - - - - - -print version information and exit - - - - -, - -copy files instead of making symlinks - - - - -, - -force writing of new files even if old ones exist - - - - - -See also - -gettextize1 - - - diff --git a/docs/reference/glib/glib-overrides.txt b/docs/reference/glib/glib-overrides.txt deleted file mode 100644 index 991fcf2..0000000 --- a/docs/reference/glib/glib-overrides.txt +++ /dev/null @@ -1,294 +0,0 @@ -# This file makes most of the thread related macros look like -# functions, which they really were, if possible easy. - - -GLIB_DISABLE_DEPRECATION_WARNINGS -#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS - - - -G_ATOMIC_LOCK_FREE -#define G_ATOMIC_LOCK_FREE - - -# default thread implementation - - -G_THREADS_IMPL_POSIX -#define G_THREADS_IMPL_POSIX - - - -G_THREADS_IMPL_WIN32 -#define G_THREADS_IMPL_NONE - - -# threads supported? - - -g_thread_supported -gboolean - - -# GMutex - - -g_mutex_new -GMutex * - - - -g_mutex_lock -void -GMutex *mutex - - - -g_mutex_trylock -gboolean -GMutex *mutex - - - -g_mutex_unlock -void -GMutex *mutex - - - -g_mutex_free -void -GMutex *mutex - - -# GStaticMutex - - -GStaticMutex - - - -G_STATIC_MUTEX_INIT -#define G_STATIC_MUTEX_INIT - - - -g_static_mutex_lock -void -GStaticMutex* mutex - - - -g_static_mutex_trylock -gboolean -GStaticMutex* mutex - - - -g_static_mutex_unlock -void -GStaticMutex* mutex - - - -g_static_mutex_get_mutex -GMutex * -GStaticMutex* mutex - - -# GThread - - -g_thread_yield -void - - - -g_thread_create -GThread * -GThreadFunc func -gpointer data, -gboolean joinable, -GError **error - - -# G_LOCK_* macros - - -G_LOCK_DEFINE -#define G_LOCK_DEFINE(name) - - - -G_LOCK_DEFINE_STATIC -#define G_LOCK_DEFINE_STATIC(name) - - - -G_LOCK_EXTERN -#define G_LOCK_EXTERN(name) - - - -G_LOCK -#define G_LOCK(name) - - - -G_UNLOCK -#define G_UNLOCK(name) - - - -G_TRYLOCK -#define G_TRYLOCK(name) - - -# GCond - - -g_cond_new -GCond* - - - -g_cond_signal -void -GCond *cond - - - -g_cond_broadcast -void -GCond *cond - - - -g_cond_wait -void -GCond *cond, GMutex *mutex - - - -g_cond_timed_wait -gboolean -GCond *cond, GMutex *mutex, GTimeVal *abs_time - - - -g_cond_free -void -GCond *cond - - -# GPrivate - -G_PRIVATE_INIT -#define G_PRIVATE_INIT(notify) - - -# GStaticPrivate - - -G_STATIC_PRIVATE_INIT -#define G_STATIC_PRIVATE_INIT - - -# Definitions for different operating systems - - -G_OS_UNIX -#define G_OS_UNIX - - - -G_OS_WIN32 -#define G_OS_WIN32 - - -# g_ascii_isxxx - - -g_ascii_isalnum -gboolean -gchar c - - - -g_ascii_isalpha -gboolean -gchar c - - - -g_ascii_iscntrl -gboolean -gchar c - - - -g_ascii_isdigit -gboolean -gchar c - - - -g_ascii_isgraph -gboolean -gchar c - - - -g_ascii_islower -gboolean -gchar c - - - -g_ascii_isprint -gboolean -gchar c - - - -g_ascii_ispunct -gboolean -gchar c - - - -g_ascii_isspace -gboolean -gchar c - - - -g_ascii_isupper -gboolean -gchar c - - - -g_ascii_isxdigit -gboolean -gchar c - - -# g_atomic - - -g_atomic_int_inc -void -gint *atomic - - - -g_atomic_int_dec_and_test -gboolean -gint *atomic - - - -G_VA_COPY -#define G_VA_COPY(ap1,ap2) - diff --git a/docs/reference/glib/glib-sections.txt.in b/docs/reference/glib/glib-sections.txt.in deleted file mode 100644 index 5258544..0000000 --- a/docs/reference/glib/glib-sections.txt.in +++ /dev/null @@ -1,3763 +0,0 @@ -glib.h - -
-Basic Types -types -gboolean -gpointer -gconstpointer -gchar -guchar - - -gint -G_MININT -G_MAXINT -guint -G_MAXUINT -gshort -G_MINSHORT -G_MAXSHORT -gushort -G_MAXUSHORT -glong -G_MINLONG -G_MAXLONG -gulong -G_MAXULONG - - -gint8 -G_MININT8 -G_MAXINT8 -guint8 -G_MAXUINT8 -gint16 -G_MININT16 -G_MAXINT16 -G_GINT16_MODIFIER -G_GINT16_FORMAT -guint16 -G_MAXUINT16 -G_GUINT16_FORMAT -gint32 -G_MININT32 -G_MAXINT32 -G_GINT32_MODIFIER -G_GINT32_FORMAT -guint32 -G_MAXUINT32 -G_GUINT32_FORMAT -gint64 -G_MININT64 -G_MAXINT64 -G_GINT64_MODIFIER -G_GINT64_FORMAT -G_GINT64_CONSTANT -guint64 -G_MAXUINT64 -G_GUINT64_FORMAT -G_GUINT64_CONSTANT - - -gfloat -G_MINFLOAT -G_MAXFLOAT -gdouble -G_MINDOUBLE -G_MAXDOUBLE - - -gsize -G_MAXSIZE -G_GSIZE_MODIFIER -G_GSIZE_FORMAT -gssize -G_MINSSIZE -G_MAXSSIZE -G_GSSIZE_MODIFIER -G_GSSIZE_FORMAT -goffset -G_MINOFFSET -G_MAXOFFSET -G_GOFFSET_MODIFIER -G_GOFFSET_FORMAT -G_GOFFSET_CONSTANT - - -gintptr -G_GINTPTR_MODIFIER -G_GINTPTR_FORMAT -guintptr -G_GUINTPTR_FORMAT - - -GLIB_SIZEOF_SSIZE_T -GLIB_SIZEOF_VOID_P -GLIB_SIZEOF_LONG -GLIB_SIZEOF_SIZE_T -G_HAVE_GINT64 -
- -
-Version Information -version -glib_major_version -glib_minor_version -glib_micro_version -glib_binary_age -glib_interface_age -glib_check_version - - -GLIB_MAJOR_VERSION -GLIB_MINOR_VERSION -GLIB_MICRO_VERSION -GLIB_CHECK_VERSION - - -GLIB_VERSION_CUR_STABLE -GLIB_VERSION_PREV_STABLE -GLIB_VERSION_MIN_REQUIRED -GLIB_VERSION_MAX_ALLOWED -GLIB_DISABLE_DEPRECATION_WARNINGS -@GLIB_VERSIONS@ - - -G_ENCODE_VERSION -GLIB_AVAILABLE_IN_ALL -GLIB_DEPRECATED_ENUMERATOR -GLIB_DEPRECATED_ENUMERATOR_FOR -GLIB_DEPRECATED_MACRO -GLIB_DEPRECATED_MACRO_FOR -GLIB_DEPRECATED_TYPE -GLIB_DEPRECATED_TYPE_FOR -GLIB_VERSION_CUR_STABLE -GLIB_VERSION_PREV_STABLE -
- -
-Standard Macros -macros - -G_OS_WIN32 -G_OS_UNIX - - -G_DIR_SEPARATOR -G_DIR_SEPARATOR_S -G_IS_DIR_SEPARATOR -G_SEARCHPATH_SEPARATOR -G_SEARCHPATH_SEPARATOR_S - - -TRUE -FALSE - - -NULL - - -MIN -MAX - - -ABS -CLAMP -G_APPROX_VALUE - - -G_SIZEOF_MEMBER -G_STRUCT_MEMBER -G_STRUCT_MEMBER_P -G_STRUCT_OFFSET - - -G_MEM_ALIGN - - -G_ALIGNOF - - -G_CONST_RETURN -G_NORETURN -G_NORETURN_FUNCPTR - - -G_ALWAYS_INLINE -G_NO_INLINE - - -G_N_ELEMENTS -
- -
-Type Conversion Macros -type_conversion -GINT_TO_POINTER -GPOINTER_TO_INT - - -GUINT_TO_POINTER -GPOINTER_TO_UINT -GSIZE_TO_POINTER -GPOINTER_TO_SIZE -
- -
-Byte Order Macros -byte_order -G_BYTE_ORDER -G_LITTLE_ENDIAN -G_BIG_ENDIAN -G_PDP_ENDIAN - - -g_htonl -g_htons -g_ntohl -g_ntohs - - -GINT_FROM_BE -GINT_FROM_LE -GINT_TO_BE -GINT_TO_LE - - -GUINT_FROM_BE -GUINT_FROM_LE -GUINT_TO_BE -GUINT_TO_LE - - -GLONG_FROM_BE -GLONG_FROM_LE -GLONG_TO_BE -GLONG_TO_LE - - -GULONG_FROM_BE -GULONG_FROM_LE -GULONG_TO_BE -GULONG_TO_LE - - -GSIZE_FROM_BE -GSIZE_FROM_LE -GSIZE_TO_BE -GSIZE_TO_LE - - -GSSIZE_FROM_BE -GSSIZE_FROM_LE -GSSIZE_TO_BE -GSSIZE_TO_LE - - -GINT16_FROM_BE -GINT16_FROM_LE -GINT16_TO_BE -GINT16_TO_LE - - -GUINT16_FROM_BE -GUINT16_FROM_LE -GUINT16_TO_BE -GUINT16_TO_LE - - -GINT32_FROM_BE -GINT32_FROM_LE -GINT32_TO_BE -GINT32_TO_LE - - -GUINT32_FROM_BE -GUINT32_FROM_LE -GUINT32_TO_BE -GUINT32_TO_LE - - -GINT64_FROM_BE -GINT64_FROM_LE -GINT64_TO_BE -GINT64_TO_LE - - -GUINT64_FROM_BE -GUINT64_FROM_LE -GUINT64_TO_BE -GUINT64_TO_LE - - -GUINT16_SWAP_BE_PDP -GUINT16_SWAP_LE_BE -GUINT16_SWAP_LE_PDP - - -GUINT32_SWAP_BE_PDP -GUINT32_SWAP_LE_BE -GUINT32_SWAP_LE_PDP - - -GUINT64_SWAP_LE_BE - - -GUINT16_SWAP_LE_BE_CONSTANT -GUINT32_SWAP_LE_BE_CONSTANT -GUINT64_SWAP_LE_BE_CONSTANT -GUINT16_SWAP_LE_BE_IA32 -GUINT32_SWAP_LE_BE_IA32 -GUINT64_SWAP_LE_BE_IA32 -GUINT16_SWAP_LE_BE_IA64 -GUINT32_SWAP_LE_BE_IA64 -GUINT64_SWAP_LE_BE_IA64 -GUINT32_SWAP_LE_BE_X86_64 -GUINT64_SWAP_LE_BE_X86_64 - -
- -
-Bounds-checked integer arithmetic -checkedmath -g_uint_checked_add -g_uint_checked_mul -g_uint64_checked_add -g_uint64_checked_mul -g_size_checked_add -g_size_checked_mul -
- -
-Numerical Definitions -numerical -G_IEEE754_FLOAT_BIAS -G_IEEE754_DOUBLE_BIAS -GFloatIEEE754 -GDoubleIEEE754 - - -G_E -G_LN2 -G_LN10 -G_PI -G_PI_2 -G_PI_4 -G_SQRT2 -G_LOG_2_BASE_10 -
- -
-Miscellaneous Macros -macros_misc -G_INLINE_FUNC - - -g_auto -g_autoptr -g_autofree -g_autolist -g_autoslist -g_autoqueue -G_DEFINE_AUTOPTR_CLEANUP_FUNC -G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC -G_DEFINE_AUTO_CLEANUP_FREE_FUNC - - -G_STMT_START -G_STMT_END - - -G_BEGIN_DECLS -G_END_DECLS - - -G_VA_COPY - - -G_STRINGIFY -G_PASTE -G_STATIC_ASSERT -G_STATIC_ASSERT_EXPR - - -G_GNUC_CHECK_VERSION -G_GNUC_EXTENSION -G_GNUC_CONST -G_GNUC_PURE -G_GNUC_MALLOC -G_GNUC_ALLOC_SIZE -G_GNUC_ALLOC_SIZE2 -G_GNUC_DEPRECATED -G_GNUC_DEPRECATED_FOR -G_GNUC_BEGIN_IGNORE_DEPRECATIONS -G_GNUC_END_IGNORE_DEPRECATIONS -G_GNUC_NORETURN -G_GNUC_FALLTHROUGH -G_GNUC_UNUSED -G_GNUC_PRINTF -G_GNUC_SCANF -G_GNUC_STRFTIME -G_GNUC_FORMAT -G_GNUC_NULL_TERMINATED -G_GNUC_WARN_UNUSED_RESULT -G_GNUC_FUNCTION -G_GNUC_PRETTY_FUNCTION -G_GNUC_NO_INLINE -G_GNUC_NO_INSTRUMENT -G_HAVE_GNUC_VISIBILITY -G_GNUC_INTERNAL -G_GNUC_MAY_ALIAS - - -G_C_STD_VERSION -G_C_STD_CHECK_VERSION -G_CXX_STD_VERSION -G_CXX_STD_CHECK_VERSION - - -G_DEPRECATED -G_DEPRECATED_FOR -G_UNAVAILABLE - - -G_LIKELY -G_UNLIKELY - - -G_STRLOC -G_STRFUNC - - -GLIB_VAR -G_STRINGIFY_ARG -G_PASTE_ARGS -G_HAVE_INLINE -G_CAN_INLINE -inline -G_HAVE___INLINE -G_HAVE___INLINE__ -G_INLINE_DEFINE_NEEDED -G_HAVE_GNUC_VARARGS -G_HAVE_ISO_VARARGS -G_HAVE_GROWING_STACK -G_VA_COPY_AS_ARRAY -GLIB_CANNOT_IGNORE_DEPRECATIONS -GLIB_DEPRECATED -GLIB_DEPRECATED_FOR -GLIB_UNAVAILABLE -GLIB_UNAVAILABLE_ENUMERATOR -GLIB_UNAVAILABLE_MACRO -GLIB_UNAVAILABLE_STATIC_INLINE -GLIB_UNAVAILABLE_TYPE -G_ANALYZER_ANALYZING -G_ANALYZER_NORETURN -g_autoptr_cleanup_generic_gfree -glib_typeof -g_macro__has_attribute -g_macro__has_builtin -g_macro__has_feature -g_macro__has_extension -g_macro__has_attribute___always_inline__ -g_macro__has_attribute___alloc_size__ -g_macro__has_attribute___const__ -g_macro__has_attribute___deprecated__ -g_macro__has_attribute___format__ -g_macro__has_attribute___format_arg__ -g_macro__has_attribute___malloc__ -g_macro__has_attribute___no_instrument_function__ -g_macro__has_attribute___noreturn__ -g_macro__has_attribute___pure__ -g_macro__has_attribute___sentinel__ -g_macro__has_attribute___unused__ -g_macro__has_attribute_fallthrough -g_macro__has_attribute_may_alias -g_macro__has_attribute___noinline__ -g_macro__has_attribute_warn_unused_result -g_macro__has_attribute_cleanup -
- -
-Error Reporting -error_reporting -GError -g_error_new -g_error_new_literal -g_error_new_valist -g_error_free -g_error_copy -g_error_matches -g_set_error -g_set_error_literal -g_propagate_error -g_clear_error -g_prefix_error -g_prefix_error_literal -g_propagate_prefixed_error - -GErrorInitFunc -GErrorCopyFunc -GErrorClearFunc -G_DEFINE_EXTENDED_ERROR -g_error_domain_register_static -g_error_domain_register -
- -
-The Main Event Loop -main -GMainLoop -g_main_loop_new -g_main_loop_ref -g_main_loop_unref -g_main_loop_run -g_main_loop_quit -g_main_loop_is_running -g_main_loop_get_context -g_main_new -g_main_destroy -g_main_run -g_main_quit -g_main_is_running - - -G_PRIORITY_HIGH -G_PRIORITY_DEFAULT -G_PRIORITY_HIGH_IDLE -G_PRIORITY_DEFAULT_IDLE -G_PRIORITY_LOW - - -G_SOURCE_CONTINUE -G_SOURCE_REMOVE - - -GMainContext -GMainContextFlags -g_main_context_new -g_main_context_new_with_flags -g_main_context_ref -g_main_context_unref -g_main_context_default -g_main_context_iteration -g_main_iteration -g_main_context_pending -g_main_pending -g_main_context_find_source_by_id -g_main_context_find_source_by_user_data -g_main_context_find_source_by_funcs_user_data -g_main_context_wakeup -g_main_context_acquire -g_main_context_release -g_main_context_is_owner -g_main_context_wait -g_main_context_prepare -g_main_context_query -g_main_context_check -g_main_context_dispatch -g_main_context_set_poll_func -g_main_context_get_poll_func -GPollFunc -g_main_context_add_poll -g_main_context_remove_poll -g_main_depth -g_main_current_source -g_main_set_poll_func -g_main_context_invoke -g_main_context_invoke_full - - -GMainContextPusher -g_main_context_pusher_new -g_main_context_pusher_free - - -g_main_context_get_thread_default -g_main_context_ref_thread_default -g_main_context_push_thread_default -g_main_context_pop_thread_default - - -g_timeout_source_new -g_timeout_source_new_seconds -g_timeout_add -g_timeout_add_once -g_timeout_add_full -g_timeout_add_seconds -g_timeout_add_seconds_full -g_timeout_add_seconds_once - - -g_idle_source_new -g_idle_add -g_idle_add_once -g_idle_add_full -g_idle_remove_by_data - - -GPid -G_PID_FORMAT -GChildWatchFunc -g_child_watch_source_new -g_child_watch_add -g_child_watch_add_full - - -GPollFD -g_poll -G_POLLFD_FORMAT - - -GSource -GSourceDummyMarshal -GSourceFuncs -GSourceDisposeFunc -GSourceCallbackFuncs -g_source_new -g_source_ref -g_source_unref -g_source_set_funcs -g_source_set_dispose_function -g_source_attach -g_source_destroy -g_source_is_destroyed -g_source_set_priority -g_source_get_priority -g_source_set_can_recurse -g_source_get_can_recurse -g_source_get_id -g_source_get_name -g_source_set_name -g_source_set_static_name -g_source_set_name_by_id -g_source_get_context -g_source_set_callback -GSourceFunc -G_SOURCE_FUNC -GSourceOnceFunc -g_source_set_callback_indirect -g_source_set_ready_time -g_source_get_ready_time -g_source_add_unix_fd -g_source_remove_unix_fd -g_source_modify_unix_fd -g_source_query_unix_fd -g_source_add_poll -g_source_remove_poll -g_source_add_child_source -g_source_remove_child_source -g_source_get_time -g_source_get_current_time -g_source_remove -g_source_remove_by_funcs_user_data -g_source_remove_by_user_data -GClearHandleFunc -g_clear_handle_id - - -g_steal_fd - - -GLIB_HAVE_ALLOCA_H -alloca -GLIB_USING_SYSTEM_PRINTF -GLIB_SYSDEF_POLLERR -GLIB_SYSDEF_POLLHUP -GLIB_SYSDEF_POLLIN -GLIB_SYSDEF_POLLNVAL -GLIB_SYSDEF_POLLOUT -GLIB_SYSDEF_POLLPRI -GLIB_SYSDEF_AF_INET -GLIB_SYSDEF_AF_INET6 -GLIB_SYSDEF_AF_UNIX -GLIB_SYSDEF_MSG_DONTROUTE -GLIB_SYSDEF_MSG_OOB -GLIB_SYSDEF_MSG_PEEK -G_WIN32_MSG_HANDLE -g_idle_funcs -g_timeout_funcs -g_child_watch_funcs -g_unix_signal_funcs -g_unix_fd_source_funcs -GSourcePrivate -
- - -
-Threads -threads - -G_THREAD_ERROR -GThreadError - - -GThread -GThreadFunc -g_thread_new -g_thread_try_new -g_thread_ref -g_thread_unref -g_thread_join -g_thread_yield -g_thread_exit -g_thread_self - - -GMutex -g_mutex_init -g_mutex_clear -g_mutex_lock -g_mutex_trylock -g_mutex_unlock - - -GMutexLocker -g_mutex_locker_new -g_mutex_locker_free - - -G_LOCK_DEFINE -G_LOCK_DEFINE_STATIC -G_LOCK_EXTERN -G_LOCK -G_TRYLOCK -G_UNLOCK - - -GRecMutex -g_rec_mutex_init -g_rec_mutex_clear -g_rec_mutex_lock -g_rec_mutex_trylock -g_rec_mutex_unlock - - -GRecMutexLocker -g_rec_mutex_locker_new -g_rec_mutex_locker_free - - -GRWLockWriterLocker -g_rw_lock_writer_locker_new -g_rw_lock_writer_locker_free - - -GRWLockReaderLocker -g_rw_lock_reader_locker_new -g_rw_lock_reader_locker_free - - -GRWLock -g_rw_lock_init -g_rw_lock_clear -g_rw_lock_writer_lock -g_rw_lock_writer_trylock -g_rw_lock_writer_unlock -g_rw_lock_reader_lock -g_rw_lock_reader_trylock -g_rw_lock_reader_unlock - - -GCond -g_cond_init -g_cond_clear -g_cond_wait -g_cond_timed_wait -g_cond_wait_until -g_cond_signal -g_cond_broadcast - - -GPrivate -G_PRIVATE_INIT -g_private_get -g_private_set -g_private_replace - - -GOnce -GOnceStatus -G_ONCE_INIT -g_once -g_once_init_enter -g_once_init_leave - - -g_bit_lock -g_bit_trylock -g_bit_unlock -g_pointer_bit_lock -g_pointer_bit_trylock -g_pointer_bit_unlock - - -g_get_num_processors - - -G_LOCK_NAME -atexit -g_thread_error_quark -g_once_impl -
- -
-Deprecated Thread APIs -threads-deprecated - - -G_THREADS_IMPL_POSIX -G_THREADS_IMPL_WIN32 - - -g_thread_init -g_thread_supported -g_thread_get_initialized - - -g_thread_create -g_thread_create_full -GThreadPriority -g_thread_set_priority -g_thread_foreach - - -g_mutex_new -g_mutex_free -g_cond_new -g_cond_free -g_private_new - - -GStaticMutex -G_STATIC_MUTEX_INIT -g_static_mutex_init -g_static_mutex_lock -g_static_mutex_trylock -g_static_mutex_unlock -g_static_mutex_get_mutex -g_static_mutex_free - - -GStaticRecMutex -G_STATIC_REC_MUTEX_INIT -g_static_rec_mutex_init -g_static_rec_mutex_lock -g_static_rec_mutex_trylock -g_static_rec_mutex_unlock -g_static_rec_mutex_lock_full -g_static_rec_mutex_unlock_full -g_static_rec_mutex_free - - -GStaticRWLock -G_STATIC_RW_LOCK_INIT -g_static_rw_lock_init -g_static_rw_lock_reader_lock -g_static_rw_lock_reader_trylock -g_static_rw_lock_reader_unlock -g_static_rw_lock_writer_lock -g_static_rw_lock_writer_trylock -g_static_rw_lock_writer_unlock -g_static_rw_lock_free - - -GStaticPrivate -G_STATIC_PRIVATE_INIT -g_static_private_init -g_static_private_get -g_static_private_set -g_static_private_free - - -GThreadFunctions -g_thread_init_with_errorcheck_mutexes -G_THREADS_ENABLED -g_static_mutex_get_mutex_impl -g_thread_use_default_impl -g_threads_got_initialized -g_thread_functions_for_glib_use -g_thread_gettime -g_once_init_enter_impl -
- -
-Thread Pools -thread_pools -GThreadPool -g_thread_pool_new -g_thread_pool_new_full -g_thread_pool_push -g_thread_pool_set_max_threads -g_thread_pool_get_max_threads -g_thread_pool_get_num_threads -g_thread_pool_unprocessed -g_thread_pool_free -g_thread_pool_set_max_unused_threads -g_thread_pool_get_max_unused_threads -g_thread_pool_get_num_unused_threads -g_thread_pool_stop_unused_threads -g_thread_pool_set_sort_function -g_thread_pool_set_max_idle_time -g_thread_pool_get_max_idle_time -g_thread_pool_move_to_front -
- -
-Asynchronous Queues -async_queues -GAsyncQueue -g_async_queue_new -g_async_queue_new_full -g_async_queue_ref -g_async_queue_unref -g_async_queue_push -g_async_queue_push_sorted -g_async_queue_push_front -g_async_queue_remove -g_async_queue_pop -g_async_queue_try_pop -g_async_queue_timeout_pop -g_async_queue_length -g_async_queue_sort - - -g_async_queue_lock -g_async_queue_unlock -g_async_queue_ref_unlocked -g_async_queue_unref_and_unlock -g_async_queue_push_unlocked -g_async_queue_push_sorted_unlocked -g_async_queue_push_front_unlocked -g_async_queue_remove_unlocked -g_async_queue_pop_unlocked -g_async_queue_try_pop_unlocked -g_async_queue_timeout_pop_unlocked -g_async_queue_length_unlocked -g_async_queue_sort_unlocked - - -g_async_queue_timed_pop -g_async_queue_timed_pop_unlocked -
- -
-Atomic Operations -atomic_operations -G_ATOMIC_LOCK_FREE - - -g_atomic_int_get -g_atomic_int_set -g_atomic_int_inc -g_atomic_int_dec_and_test -g_atomic_int_compare_and_exchange -g_atomic_int_compare_and_exchange_full -g_atomic_int_exchange -g_atomic_int_add -g_atomic_int_and -g_atomic_int_or -g_atomic_int_xor - - -g_atomic_pointer_get -g_atomic_pointer_set -g_atomic_pointer_compare_and_exchange -g_atomic_pointer_compare_and_exchange_full -g_atomic_pointer_exchange -g_atomic_pointer_add -g_atomic_pointer_and -g_atomic_pointer_or -g_atomic_pointer_xor - - -g_atomic_int_exchange_and_add -
- -
-IO Channels -iochannels -GIOChannel - - -g_io_channel_unix_new -g_io_channel_unix_get_fd -g_io_channel_win32_new_fd -g_io_channel_win32_new_socket -g_io_channel_win32_new_messages - - -g_io_channel_init - - -g_io_channel_new_file -g_io_channel_read_chars -g_io_channel_read_unichar -g_io_channel_read_line -g_io_channel_read_line_string -g_io_channel_read_to_end -g_io_channel_write_chars -g_io_channel_write_unichar -g_io_channel_flush -g_io_channel_seek_position -GSeekType -g_io_channel_shutdown - - -GIOStatus -GIOChannelError -G_IO_CHANNEL_ERROR -g_io_channel_error_from_errno - - -g_io_channel_ref -g_io_channel_unref - - -g_io_create_watch -g_io_add_watch -g_io_add_watch_full -GIOCondition -GIOFunc - - -GIOFuncs - - -g_io_channel_get_buffer_size -g_io_channel_set_buffer_size -g_io_channel_get_buffer_condition -g_io_channel_get_flags -g_io_channel_set_flags -GIOFlags -g_io_channel_get_line_term -g_io_channel_set_line_term -g_io_channel_get_buffered -g_io_channel_set_buffered -g_io_channel_get_encoding -g_io_channel_set_encoding -g_io_channel_get_close_on_unref -g_io_channel_set_close_on_unref - - -g_io_channel_read -GIOError -g_io_channel_write -g_io_channel_seek -g_io_channel_close - - -g_io_channel_win32_poll -g_io_channel_win32_make_pollfd -g_io_channel_win32_get_fd -g_io_channel_win32_new_stream_socket -g_io_channel_win32_set_debug -g_io_channel_error_quark -g_io_watch_funcs -G_IO_FLAG_IS_WRITEABLE -
- -
-Memory Allocation -memory -g_new -g_new0 -g_renew -g_try_new -g_try_new0 -g_try_renew - - -g_malloc -g_malloc0 -g_realloc -g_try_malloc -g_try_malloc0 -g_try_realloc -g_malloc_n -g_malloc0_n -g_realloc_n -g_try_malloc_n -g_try_malloc0_n -g_try_realloc_n - - -g_free -g_free_sized -g_clear_pointer -g_steal_pointer -g_mem_gc_friendly - - -g_alloca -g_alloca0 -g_newa -g_newa0 - - -g_aligned_alloc -g_aligned_alloc0 -g_aligned_free -g_aligned_free_sized - - -g_memmove -g_memdup -g_memdup2 - - -GMemVTable -g_mem_set_vtable -g_mem_is_system_malloc - - -glib_mem_profiler_table -g_mem_profile -
- -
-Warnings and Assertions -warnings -g_print -g_set_print_handler -GPrintFunc - - -g_printerr -g_set_printerr_handler - - -g_return_if_fail -g_return_val_if_fail -g_return_if_reached -g_return_val_if_reached -g_warn_if_fail -g_warn_if_reached - - -g_on_error_query -g_on_error_stack_trace - - -G_BREAKPOINT - - -g_return_if_fail_warning -g_assert_warning -g_warn_message -
- -
-Glob-style pattern matching -patterns -GPatternSpec -g_pattern_spec_new -g_pattern_spec_free -g_pattern_spec_equal -g_pattern_spec_copy -g_pattern_spec_match -g_pattern_spec_match_string -g_pattern_match -g_pattern_match_string -g_pattern_match_simple -
- -
-Perl-compatible regular expressions -gregex -GRegexError -G_REGEX_ERROR -GRegexCompileFlags -GRegexMatchFlags -GRegex -GRegexEvalCallback -g_regex_new -g_regex_ref -g_regex_unref -g_regex_get_pattern -g_regex_get_max_backref -g_regex_get_capture_count -g_regex_get_has_cr_or_lf -g_regex_get_max_lookbehind -g_regex_get_string_number -g_regex_get_compile_flags -g_regex_get_match_flags -g_regex_escape_string -g_regex_escape_nul -g_regex_match_simple -g_regex_match -g_regex_match_full -g_regex_match_all -g_regex_match_all_full -g_regex_split_simple -g_regex_split -g_regex_split_full -g_regex_replace -g_regex_replace_literal -g_regex_replace_eval -g_regex_check_replacement -GMatchInfo -g_match_info_get_regex -g_match_info_get_string -g_match_info_ref -g_match_info_unref -g_match_info_free -g_match_info_matches -g_match_info_next -g_match_info_get_match_count -g_match_info_is_partial_match -g_match_info_expand_references -g_match_info_fetch -g_match_info_fetch_pos -g_match_info_fetch_named -g_match_info_fetch_named_pos -g_match_info_fetch_all - -g_regex_error_quark -
- -
-Message Logging -messages -G_LOG_DOMAIN -G_LOG_FATAL_MASK -G_LOG_LEVEL_USER_SHIFT -GLogFunc -GLogLevelFlags - - -g_log -g_logv -g_message -g_warning -g_warning_once -g_critical -g_error -g_info -g_debug - - -g_log_set_handler -g_log_set_handler_full -g_log_remove_handler -g_log_set_always_fatal -g_log_set_fatal_mask -g_log_default_handler -g_log_set_default_handler -g_log_get_debug_enabled -g_log_set_debug_enabled - - -g_log_structured -g_log_variant -GLogField -g_log_structured_array -G_DEBUG_HERE - - -GLogWriterOutput -GLogWriterFunc -g_log_set_writer_func -g_log_writer_supports_color -g_log_writer_is_journald -g_log_writer_format_fields -g_log_writer_journald -g_log_writer_standard_streams -g_log_writer_default -g_log_writer_default_set_use_stderr -g_log_writer_default_would_drop - - -g_log_structured_standard -
- -
-Timers -timers -GTimer -g_timer_new -g_timer_start -g_timer_stop -g_timer_continue -g_timer_elapsed -g_timer_reset -g_timer_destroy -g_timer_is_active -
- -
-Spawning Processes -spawn -GSpawnError -G_SPAWN_ERROR -GSpawnFlags -GSpawnChildSetupFunc -g_spawn_async_with_fds -g_spawn_async_with_pipes -g_spawn_async_with_pipes_and_fds -g_spawn_async -g_spawn_sync -G_SPAWN_EXIT_ERROR -g_spawn_check_wait_status -g_spawn_check_exit_status -g_spawn_command_line_async -g_spawn_command_line_sync -g_spawn_close_pid - -g_spawn_error_quark -g_spawn_exit_error_quark -
- -
-Simple XML Subset Parser -markup -GMarkupError -G_MARKUP_ERROR -GMarkupParseFlags -GMarkupParseContext -GMarkupParser -g_markup_escape_text -g_markup_printf_escaped -g_markup_vprintf_escaped -g_markup_parse_context_new -g_markup_parse_context_parse -g_markup_parse_context_end_parse -g_markup_parse_context_free -g_markup_parse_context_get_position -g_markup_parse_context_get_element -g_markup_parse_context_get_element_stack -g_markup_parse_context_get_user_data -g_markup_parse_context_push -g_markup_parse_context_pop -g_markup_parse_context_ref -g_markup_parse_context_unref - -GMarkupCollectType -g_markup_collect_attributes - -g_markup_error_quark -
- - -
-Shell-related Utilities -shell -GShellError -G_SHELL_ERROR -g_shell_parse_argv -g_shell_quote -g_shell_unquote - -g_shell_error_quark -
- - -
-Commandline option parser -goptioncontext -GOptionError -G_OPTION_ERROR -GOptionArgFunc -GOptionContext -g_option_context_new -g_option_context_set_summary -g_option_context_get_summary -g_option_context_set_description -g_option_context_get_description -GTranslateFunc -g_option_context_set_translate_func -g_option_context_set_translation_domain -g_option_context_free -g_option_context_parse -g_option_context_parse_strv -g_option_context_set_help_enabled -g_option_context_get_help_enabled -g_option_context_set_ignore_unknown_options -g_option_context_get_ignore_unknown_options -g_option_context_get_help -g_option_context_get_strict_posix -g_option_context_set_strict_posix -GOptionArg -GOptionFlags -G_OPTION_REMAINING -GOptionEntry -G_OPTION_ENTRY_NULL -g_option_context_add_main_entries -GOptionGroup -g_option_context_add_group -g_option_context_set_main_group -g_option_context_get_main_group -g_option_group_new -g_option_group_ref -g_option_group_unref -g_option_group_free -g_option_group_add_entries -GOptionParseFunc -g_option_group_set_parse_hooks -GOptionErrorFunc -g_option_group_set_error_hook -g_option_group_set_translate_func -g_option_group_set_translation_domain - -g_option_error_quark -
- - -
-File Utilities -fileutils -glib.h,glib/gstdio.h,fcntl.h,sys/types.h,sys/stat.h -GFileError -G_FILE_ERROR -GFileTest -g_file_error_from_errno -g_file_get_contents -GFileSetContentsFlags -g_file_set_contents -g_file_set_contents_full -g_file_test -g_mkstemp -g_mkstemp_full -g_file_open_tmp -g_file_read_link -g_mkdir_with_parents -g_mkdtemp -g_mkdtemp_full -g_dir_make_tmp - - -GDir -g_dir_open -g_dir_read_name -g_dir_rewind -g_dir_close - - -GMappedFile -g_mapped_file_new -g_mapped_file_new_from_fd -g_mapped_file_ref -g_mapped_file_unref -g_mapped_file_free -g_mapped_file_get_length -g_mapped_file_get_contents -g_mapped_file_get_bytes - - -g_open -g_rename -g_mkdir -GStatBuf -g_stat -g_lstat -g_unlink -g_remove -g_rmdir -g_fopen -g_freopen -g_fsync -g_chmod -g_access -g_creat -g_chdir -g_utime -g_close -g_clear_fd -g_autofd - - -g_file_error_quark -utimbuf -
- - -
-String Utility Functions -string_utils -glib.h,glib/gprintf.h -g_set_str -g_strdup -g_strndup -g_strdupv -g_strnfill -g_stpcpy -g_strstr_len -g_strrstr -g_strrstr_len -g_str_has_prefix -g_str_has_suffix -g_strcmp0 -g_str_to_ascii -g_str_tokenize_and_fold -g_str_match_string - - -g_strlcpy -g_strlcat - - -g_strdup_printf -g_strdup_vprintf -g_printf -g_vprintf -g_fprintf -g_vfprintf -g_sprintf -g_vsprintf -g_snprintf -g_vsnprintf -g_vasprintf -g_printf_string_upper_bound - - -g_str_is_ascii -g_ascii_isalnum -g_ascii_isalpha -g_ascii_iscntrl -g_ascii_isdigit -g_ascii_isgraph -g_ascii_islower -g_ascii_isprint -g_ascii_ispunct -g_ascii_isspace -g_ascii_isupper -g_ascii_isxdigit - - -g_ascii_digit_value -g_ascii_xdigit_value - - -g_ascii_strcasecmp -g_ascii_strncasecmp - - -g_ascii_strup -g_ascii_strdown - - -g_ascii_tolower -g_ascii_toupper - - -g_string_ascii_up -g_string_ascii_down - - -g_strup -g_strdown - - -g_strcasecmp -g_strncasecmp - - -g_strreverse - - -g_ascii_strtoll -g_ascii_strtoull -G_ASCII_DTOSTR_BUF_SIZE -g_ascii_strtod -g_ascii_dtostr -g_ascii_formatd -g_strtod - - -GNumberParserError -G_NUMBER_PARSER_ERROR -g_ascii_string_to_signed -g_ascii_string_to_unsigned - - -g_number_parser_error_quark - - -g_strchug -g_strchomp -g_strstrip - - -g_strdelimit -G_STR_DELIMITERS -g_strescape -g_strcompress -g_strcanon -g_strsplit -g_strsplit_set -g_strfreev -g_strconcat -g_strjoin -g_strjoinv - - -GStrv -GStrvBuilder -g_strv_length -g_strv_contains -g_strv_equal -g_strv_builder_new -g_strv_builder_ref -g_strv_builder_unref -g_strv_builder_add -g_strv_builder_addv -g_strv_builder_add_many -g_strv_builder_end - - -g_strerror -g_strsignal - - -GAsciiType -g_ascii_table -
- -
-Date and Time Functions -date -G_USEC_PER_SEC -GTimeVal -g_get_current_time -g_usleep -g_time_val_add -g_time_val_from_iso8601 -g_time_val_to_iso8601 - - -g_get_monotonic_time -g_get_real_time - - -GDate -GTime -GDateDMY -GDateDay -GDateMonth -GDateYear -GDateWeekday - - -G_DATE_BAD_DAY -G_DATE_BAD_JULIAN -G_DATE_BAD_YEAR - - -g_date_new -g_date_new_dmy -g_date_new_julian -g_date_clear -g_date_free -g_date_copy - - -g_date_set_day -g_date_set_month -g_date_set_year -g_date_set_dmy -g_date_set_julian -g_date_set_time -g_date_set_time_t -g_date_set_time_val -g_date_set_parse - - -g_date_add_days -g_date_subtract_days -g_date_add_months -g_date_subtract_months -g_date_add_years -g_date_subtract_years -g_date_days_between -g_date_compare -g_date_clamp -g_date_order - - -g_date_get_day -g_date_get_month -g_date_get_year -g_date_get_julian -g_date_get_weekday -g_date_get_day_of_year - - -g_date_get_days_in_month -g_date_is_first_of_month -g_date_is_last_of_month -g_date_is_leap_year -g_date_get_monday_week_of_year -g_date_get_monday_weeks_in_year -g_date_get_sunday_week_of_year -g_date_get_sunday_weeks_in_year -g_date_get_iso8601_week_of_year - - -g_date_strftime -g_date_to_struct_tm - - -g_date_valid -g_date_valid_day -g_date_valid_month -g_date_valid_year -g_date_valid_dmy -g_date_valid_julian -g_date_valid_weekday - - -g_date_weekday -g_date_month -g_date_year -g_date_day -g_date_julian -g_date_day_of_year -g_date_monday_week_of_year -g_date_sunday_week_of_year -g_date_days_in_month -g_date_monday_weeks_in_year -g_date_sunday_weeks_in_year -
- -
-timezone - -GTimeZone -g_time_zone_unref -g_time_zone_ref - -g_time_zone_new -g_time_zone_new_identifier -g_time_zone_new_local -g_time_zone_new_utc -g_time_zone_new_offset - -GTimeType -g_time_zone_find_interval -g_time_zone_adjust_time - -g_time_zone_get_identifier -g_time_zone_get_abbreviation -g_time_zone_get_offset -g_time_zone_is_dst -
- -
-date-time -GTimeSpan -G_TIME_SPAN_DAY -G_TIME_SPAN_HOUR -G_TIME_SPAN_MINUTE -G_TIME_SPAN_SECOND -G_TIME_SPAN_MILLISECOND - - -GDateTime -g_date_time_unref -g_date_time_ref - - -g_date_time_new_now -g_date_time_new_now_local -g_date_time_new_now_utc - - -g_date_time_new_from_unix_local -g_date_time_new_from_unix_utc - - -g_date_time_new_from_timeval_local -g_date_time_new_from_timeval_utc -g_date_time_new_from_iso8601 - - -g_date_time_new -g_date_time_new_local -g_date_time_new_utc - - -g_date_time_add - - -g_date_time_add_years -g_date_time_add_months -g_date_time_add_weeks -g_date_time_add_days - - -g_date_time_add_hours -g_date_time_add_minutes -g_date_time_add_seconds - - -g_date_time_add_full - - -g_date_time_compare -g_date_time_difference -g_date_time_hash -g_date_time_equal - - -g_date_time_get_ymd - - -g_date_time_get_year -g_date_time_get_month -g_date_time_get_day_of_month - - -g_date_time_get_week_numbering_year -g_date_time_get_week_of_year -g_date_time_get_day_of_week - - -g_date_time_get_day_of_year - - -g_date_time_get_hour -g_date_time_get_minute -g_date_time_get_second -g_date_time_get_microsecond -g_date_time_get_seconds - - -g_date_time_to_unix -g_date_time_to_timeval - - -g_date_time_get_utc_offset -g_date_time_get_timezone -g_date_time_get_timezone_abbreviation -g_date_time_is_daylight_savings - - -g_date_time_to_timezone -g_date_time_to_local -g_date_time_to_utc - - -g_date_time_format -g_date_time_format_iso8601 -
- -
-Hook Functions -hooks -GHookList -GHookFinalizeFunc -GHook -GHookFunc -GHookCheckFunc - - -g_hook_list_init -g_hook_list_invoke -g_hook_list_invoke_check -g_hook_list_marshal -GHookMarshaller -g_hook_list_marshal_check -GHookCheckMarshaller -g_hook_list_clear - - -g_hook_alloc -g_hook_append -g_hook_prepend -g_hook_insert_before -g_hook_insert_sorted -GHookCompareFunc -g_hook_compare_ids - - -g_hook_get -g_hook_find -GHookFindFunc -g_hook_find_data -g_hook_find_func -g_hook_find_func_data - - -g_hook_first_valid -g_hook_next_valid - -GHookFlagMask -G_HOOK_FLAGS -G_HOOK_FLAG_USER_SHIFT - - -G_HOOK -G_HOOK_IS_VALID -G_HOOK_ACTIVE -G_HOOK_IN_CALL -G_HOOK_IS_UNLINKED - - -g_hook_ref -g_hook_unref - -g_hook_free -g_hook_destroy -g_hook_destroy_link -
- -
-Miscellaneous Utility Functions -misc_utils -g_get_application_name -g_set_application_name -g_get_prgname -g_set_prgname -g_get_environ -g_environ_getenv -g_environ_setenv -g_environ_unsetenv -g_getenv -g_setenv -g_unsetenv -g_listenv -g_get_user_name -g_get_real_name -g_get_user_cache_dir -g_get_user_data_dir -g_get_user_config_dir -g_get_user_state_dir -g_get_user_runtime_dir -GUserDirectory -g_get_user_special_dir -g_get_system_data_dirs -g_get_system_config_dirs -g_reload_user_special_dirs_cache -g_get_os_info - - -G_OS_INFO_KEY_NAME -G_OS_INFO_KEY_PRETTY_NAME -G_OS_INFO_KEY_VERSION -G_OS_INFO_KEY_VERSION_CODENAME -G_OS_INFO_KEY_VERSION_ID -G_OS_INFO_KEY_ID -G_OS_INFO_KEY_HOME_URL -G_OS_INFO_KEY_DOCUMENTATION_URL -G_OS_INFO_KEY_SUPPORT_URL -G_OS_INFO_KEY_BUG_REPORT_URL -G_OS_INFO_KEY_PRIVACY_POLICY_URL - - -g_get_host_name -g_get_home_dir -g_get_tmp_dir -g_get_current_dir -g_basename -g_dirname -g_canonicalize_filename -g_path_is_absolute -g_path_skip_root -g_path_get_basename -g_path_get_dirname -g_build_filename -g_build_filenamev -g_build_filename_valist -g_build_path -g_build_pathv - - -g_format_size -GFormatSizeFlags -g_format_size_full -g_format_size_for_display - - -g_find_program_in_path - - -g_bit_nth_lsf -g_bit_nth_msf -g_bit_storage - - -g_spaced_primes_closest - - -g_atexit -g_abort - - -g_parse_debug_string -GDebugKey - - -GVoidFunc -GFreeFunc - - -g_qsort_with_data - - -g_nullify_pointer - - -G_NATIVE_ATEXIT -g_ATEXIT -g_win32_get_system_data_dirs_for_module -ATEXIT -g_bit_nth_lsf_impl -g_bit_nth_msf_impl -g_bit_storage_impl - -
- -
-Lexical Scanner -scanner -GScanner -GScannerConfig -g_scanner_new -g_scanner_destroy - - -g_scanner_input_file -g_scanner_sync_file_offset -g_scanner_input_text -g_scanner_peek_next_token -g_scanner_get_next_token -g_scanner_eof - - -g_scanner_cur_line -g_scanner_cur_position -g_scanner_cur_token -g_scanner_cur_value - - -g_scanner_set_scope -g_scanner_scope_add_symbol -g_scanner_scope_foreach_symbol -g_scanner_scope_lookup_symbol -g_scanner_scope_remove_symbol -g_scanner_add_symbol -g_scanner_remove_symbol -g_scanner_foreach_symbol - - -g_scanner_freeze_symbol_table -g_scanner_thaw_symbol_table -g_scanner_lookup_symbol - - -g_scanner_warn -g_scanner_error -g_scanner_unexp_token -GScannerMsgFunc - - -G_CSET_a_2_z -G_CSET_A_2_Z -G_CSET_DIGITS -G_CSET_LATINC -G_CSET_LATINS -GTokenType -GTokenValue -GErrorType - -
- -
-Key-value file parser -gkeyfile -GKeyFile -G_KEY_FILE_ERROR -GKeyFileError -GKeyFileFlags - - -g_key_file_new -g_key_file_free -g_key_file_ref -g_key_file_unref -g_key_file_set_list_separator -g_key_file_load_from_file -g_key_file_load_from_data -g_key_file_load_from_bytes -g_key_file_load_from_data_dirs -g_key_file_load_from_dirs -g_key_file_to_data -g_key_file_save_to_file -g_key_file_get_start_group -g_key_file_get_groups -g_key_file_get_keys -g_key_file_has_group -g_key_file_has_key - - -g_key_file_get_value -g_key_file_get_string -g_key_file_get_locale_string -g_key_file_get_locale_for_key -g_key_file_get_boolean -g_key_file_get_integer -g_key_file_get_int64 -g_key_file_get_uint64 -g_key_file_get_double -g_key_file_get_string_list -g_key_file_get_locale_string_list -g_key_file_get_boolean_list -g_key_file_get_integer_list -g_key_file_get_double_list -g_key_file_get_comment - - -g_key_file_set_value -g_key_file_set_string -g_key_file_set_locale_string -g_key_file_set_boolean -g_key_file_set_integer -g_key_file_set_int64 -g_key_file_set_uint64 -g_key_file_set_double -g_key_file_set_string_list -g_key_file_set_locale_string_list -g_key_file_set_boolean_list -g_key_file_set_integer_list -g_key_file_set_double_list -g_key_file_set_comment -g_key_file_remove_group -g_key_file_remove_key -g_key_file_remove_comment - - -G_KEY_FILE_DESKTOP_GROUP -G_KEY_FILE_DESKTOP_KEY_TYPE -G_KEY_FILE_DESKTOP_KEY_VERSION -G_KEY_FILE_DESKTOP_KEY_NAME -G_KEY_FILE_DESKTOP_KEY_GENERIC_NAME -G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY -G_KEY_FILE_DESKTOP_KEY_COMMENT -G_KEY_FILE_DESKTOP_KEY_ICON -G_KEY_FILE_DESKTOP_KEY_HIDDEN -G_KEY_FILE_DESKTOP_KEY_ONLY_SHOW_IN -G_KEY_FILE_DESKTOP_KEY_NOT_SHOW_IN -G_KEY_FILE_DESKTOP_KEY_TRY_EXEC -G_KEY_FILE_DESKTOP_KEY_EXEC -G_KEY_FILE_DESKTOP_KEY_PATH -G_KEY_FILE_DESKTOP_KEY_TERMINAL -G_KEY_FILE_DESKTOP_KEY_MIME_TYPE -G_KEY_FILE_DESKTOP_KEY_CATEGORIES -G_KEY_FILE_DESKTOP_KEY_STARTUP_NOTIFY -G_KEY_FILE_DESKTOP_KEY_STARTUP_WM_CLASS -G_KEY_FILE_DESKTOP_KEY_URL -G_KEY_FILE_DESKTOP_KEY_ACTIONS -G_KEY_FILE_DESKTOP_KEY_DBUS_ACTIVATABLE -G_KEY_FILE_DESKTOP_TYPE_APPLICATION -G_KEY_FILE_DESKTOP_TYPE_LINK -G_KEY_FILE_DESKTOP_TYPE_DIRECTORY - - -g_key_file_error_quark -g_key_file_get_type -
- -
-Bookmark file parser -gbookmarkfile -GBookmarkFile -G_BOOKMARK_FILE_ERROR -GBookmarkFileError -g_bookmark_file_new -g_bookmark_file_copy -g_bookmark_file_free -g_bookmark_file_load_from_file -g_bookmark_file_load_from_data -g_bookmark_file_load_from_data_dirs -g_bookmark_file_to_data -g_bookmark_file_to_file -g_bookmark_file_has_item -g_bookmark_file_has_group -g_bookmark_file_has_application -g_bookmark_file_get_size -g_bookmark_file_get_uris G_GNUC_MALLOC - - -g_bookmark_file_get_title -g_bookmark_file_get_description -g_bookmark_file_get_mime_type -g_bookmark_file_get_is_private -g_bookmark_file_get_icon -g_bookmark_file_get_added -g_bookmark_file_get_added_date_time -g_bookmark_file_get_modified -g_bookmark_file_get_modified_date_time -g_bookmark_file_get_visited -g_bookmark_file_get_visited_date_time -g_bookmark_file_get_groups -g_bookmark_file_get_applications -g_bookmark_file_get_app_info -g_bookmark_file_get_application_info - - -g_bookmark_file_set_title -g_bookmark_file_set_description -g_bookmark_file_set_mime_type -g_bookmark_file_set_is_private -g_bookmark_file_set_icon -g_bookmark_file_set_added -g_bookmark_file_set_added_date_time -g_bookmark_file_set_groups -g_bookmark_file_set_modified -g_bookmark_file_set_modified_date_time -g_bookmark_file_set_visited -g_bookmark_file_set_visited_date_time -g_bookmark_file_set_app_info -g_bookmark_file_set_application_info -g_bookmark_file_add_group -g_bookmark_file_add_application -g_bookmark_file_remove_group -g_bookmark_file_remove_application -g_bookmark_file_remove_item -g_bookmark_file_move_item - - -g_bookmark_file_error_quark -
- -
-Dynamic Loading of Modules -modules -gmodule.h -GModule -GModuleError -G_MODULE_ERROR -g_module_supported -g_module_build_path -g_module_open -g_module_open_full -GModuleFlags -g_module_symbol -g_module_name -g_module_make_resident -g_module_close -g_module_error - -GModuleCheckInit -GModuleUnload -G_MODULE_SUFFIX -G_MODULE_EXPORT -G_MODULE_IMPORT - -g_module_error_quark -
- -
-Automatic String Completion -completion -GCompletion -g_completion_new -GCompletionFunc -g_completion_add_items -g_completion_remove_items -g_completion_clear_items -g_completion_complete -g_completion_complete_utf8 -g_completion_set_compare -GCompletionStrncmpFunc -g_completion_free -
- -
-Windows Compatibility Functions -windows -MAXPATHLEN -GWin32OSType - -g_win32_check_windows_version -g_win32_get_command_line -g_win32_error_message -g_win32_getlocale -g_win32_get_package_installation_directory -g_win32_get_package_installation_directory_of_module -g_win32_get_package_installation_subdirectory -g_win32_get_windows_version -g_win32_locale_filename_from_utf8 -G_WIN32_DLLMAIN_FOR_DLL_NAME -G_WIN32_HAVE_WIDECHAR_API -G_WIN32_IS_NT_BASED - - -g_win32_ftruncate - -
- -
-UNIX-specific utilities and integration -gunix -G_UNIX_ERROR -g_unix_open_pipe -g_unix_set_fd_nonblocking - - -g_unix_signal_add -g_unix_signal_add_full -g_unix_signal_source_new - - -GUnixFDSourceFunc -g_unix_fd_add -g_unix_fd_add_full -g_unix_fd_source_new - - -g_unix_get_passwd_entry - - -g_unix_error_quark -
- -# Data Structures - -
-Memory Slices -memory_slices -g_slice_alloc -g_slice_alloc0 -g_slice_copy -g_slice_free1 -g_slice_free_chain_with_offset - - -g_slice_new -g_slice_new0 -g_slice_dup -g_slice_free -g_slice_free_chain - - -GSliceConfig -g_slice_set_config -g_slice_get_config -g_slice_get_config_state -g_slice_debug_tree_statistics -
- -
-Doubly-Linked Lists -linked_lists_double -GList - - -g_list_append -g_list_prepend -g_list_insert -g_list_insert_before -g_list_insert_before_link -g_list_insert_sorted -g_list_remove -g_list_remove_link -g_list_delete_link -g_list_remove_all -g_list_free -g_list_free_full -g_clear_list - - -g_list_alloc -g_list_free_1 -g_list_free1 - - -g_list_length -g_list_copy -g_list_copy_deep -g_list_reverse -g_list_sort -GCompareFunc -g_list_insert_sorted_with_data -g_list_sort_with_data -GCompareDataFunc -g_list_concat -g_list_foreach -GFunc - - -g_list_first -g_list_last -g_list_previous -g_list_next -g_list_nth -g_list_nth_data -g_list_nth_prev - - -g_list_find -g_list_find_custom -g_list_position -g_list_index -
- -
-Singly-Linked Lists -linked_lists_single -GSList - - -g_slist_alloc -g_slist_append -g_slist_prepend -g_slist_insert -g_slist_insert_before -g_slist_insert_sorted -g_slist_remove -g_slist_remove_link -g_slist_delete_link -g_slist_remove_all -g_slist_free -g_slist_free_full -g_slist_free_1 -g_slist_free1 -g_clear_slist - - -g_slist_length -g_slist_copy -g_slist_copy_deep -g_slist_reverse -g_slist_insert_sorted_with_data -g_slist_sort -g_slist_sort_with_data -g_slist_concat -g_slist_foreach - - -g_slist_last -g_slist_next -g_slist_nth -g_slist_nth_data - - -g_slist_find -g_slist_find_custom -g_slist_position -g_slist_index -
- -
-Double-ended Queues -queue - -GQueue -g_queue_new -g_queue_free -g_queue_free_full -G_QUEUE_INIT -g_queue_init -g_queue_clear -g_queue_clear_full -g_queue_is_empty -g_queue_get_length -g_queue_reverse -g_queue_copy -g_queue_foreach -g_queue_find -g_queue_find_custom -g_queue_sort -g_queue_push_head -g_queue_push_tail -g_queue_push_nth -g_queue_pop_head -g_queue_pop_tail -g_queue_pop_nth -g_queue_peek_head -g_queue_peek_tail -g_queue_peek_nth -g_queue_index -g_queue_remove -g_queue_remove_all -g_queue_insert_before -g_queue_insert_before_link -g_queue_insert_after -g_queue_insert_after_link -g_queue_insert_sorted -g_queue_push_head_link -g_queue_push_tail_link -g_queue_push_nth_link -g_queue_pop_head_link -g_queue_pop_tail_link -g_queue_pop_nth_link -g_queue_peek_head_link -g_queue_peek_tail_link -g_queue_peek_nth_link -g_queue_link_index -g_queue_unlink -g_queue_delete_link -
- -
-Sequences -sequence - -GSequence -GSequenceIter -GSequenceIterCompareFunc - - -g_sequence_new -g_sequence_free -g_sequence_get_length -g_sequence_is_empty -g_sequence_foreach -g_sequence_foreach_range -g_sequence_sort -g_sequence_sort_iter - - -g_sequence_get_begin_iter -g_sequence_get_end_iter -g_sequence_get_iter_at_pos -g_sequence_append -g_sequence_prepend -g_sequence_insert_before -g_sequence_move -g_sequence_swap -g_sequence_insert_sorted -g_sequence_insert_sorted_iter -g_sequence_sort_changed -g_sequence_sort_changed_iter -g_sequence_remove -g_sequence_remove_range -g_sequence_move_range -g_sequence_search -g_sequence_search_iter -g_sequence_lookup -g_sequence_lookup_iter - - -g_sequence_get -g_sequence_set - - -g_sequence_iter_is_begin -g_sequence_iter_is_end -g_sequence_iter_next -g_sequence_iter_prev -g_sequence_iter_get_position -g_sequence_iter_move -g_sequence_iter_get_sequence - - -g_sequence_iter_compare -g_sequence_range_get_midpoint -
- -
-Trash Stacks -trash_stack -GTrashStack - -g_trash_stack_push -g_trash_stack_pop -g_trash_stack_peek -g_trash_stack_height -
- -
-Hash Tables -hash_tables -GHashTable -g_hash_table_new -g_hash_table_new_full -g_hash_table_new_similar -GHashFunc -GEqualFunc -GEqualFuncFull -g_hash_table_insert -g_hash_table_replace -g_hash_table_add -g_hash_table_contains -g_hash_table_size -g_hash_table_lookup -g_hash_table_lookup_extended -g_hash_table_foreach -g_hash_table_find -GHFunc -g_hash_table_remove -g_hash_table_steal -g_hash_table_steal_extended -g_hash_table_steal_all_keys -g_hash_table_steal_all_values -g_hash_table_foreach_remove -g_hash_table_foreach_steal -g_hash_table_remove_all -g_hash_table_steal_all -g_hash_table_get_keys -g_hash_table_get_values -g_hash_table_get_values_as_ptr_array -g_hash_table_get_keys_as_array -g_hash_table_get_keys_as_ptr_array -GHRFunc -g_hash_table_freeze -g_hash_table_thaw -g_hash_table_destroy -g_hash_table_ref -g_hash_table_unref -GHashTableIter -g_hash_table_iter_init -g_hash_table_iter_next -g_hash_table_iter_get_hash_table -g_hash_table_iter_replace -g_hash_table_iter_remove -g_hash_table_iter_steal - - -g_direct_equal -g_direct_hash -g_int_equal -g_int_hash -g_int64_equal -g_int64_hash -g_double_equal -g_double_hash -g_str_equal -g_str_hash - -
- -
-Strings -strings -GString -g_string_new -g_string_new_take -g_string_new_len -g_string_sized_new -g_string_assign -g_string_sprintf -g_string_sprintfa -g_string_vprintf -g_string_append_vprintf -g_string_printf -g_string_append_printf -g_string_append -g_string_append_c -g_string_append_unichar -g_string_append_len -g_string_append_uri_escaped -g_string_prepend -g_string_prepend_c -g_string_prepend_unichar -g_string_prepend_len -g_string_insert -g_string_insert_c -g_string_insert_unichar -g_string_insert_len -g_string_overwrite -g_string_overwrite_len -g_string_replace -g_string_erase -g_string_truncate -g_string_set_size -g_string_free -g_string_free_to_bytes -g_string_free_and_steal - - -g_string_up -g_string_down - - -g_string_hash -g_string_equal - - -g_string_append_c_inline -g_autoptr_cleanup_gstring_free -
- -
-String Chunks -string_chunks -GStringChunk -g_string_chunk_new -g_string_chunk_insert -g_string_chunk_insert_const -g_string_chunk_insert_len -g_string_chunk_clear -g_string_chunk_free - -
- -
-Arrays -arrays -GArray -g_array_new -g_array_new_take -g_array_new_take_zero_terminated -g_array_steal -g_array_sized_new -g_array_copy -g_array_ref -g_array_unref -g_array_get_element_size -g_array_append_val -g_array_append_vals -g_array_prepend_val -g_array_prepend_vals -g_array_insert_val -g_array_insert_vals -g_array_remove_index -g_array_remove_index_fast -g_array_remove_range -g_array_sort -g_array_sort_with_data -g_array_binary_search -g_array_index -g_array_set_size -g_array_set_clear_func -g_array_free -
- -
-Pointer Arrays -arrays_pointer -GPtrArray -g_ptr_array_new -g_ptr_array_steal -g_ptr_array_sized_new -g_ptr_array_new_with_free_func -g_ptr_array_copy -g_ptr_array_new_full -g_ptr_array_new_null_terminated -g_ptr_array_new_take -g_ptr_array_new_take_null_terminated -g_ptr_array_new_from_array -g_ptr_array_new_from_null_terminated_array -g_ptr_array_set_free_func -g_ptr_array_is_null_terminated -g_ptr_array_ref -g_ptr_array_unref -g_ptr_array_add -g_ptr_array_extend -g_ptr_array_extend_and_steal -g_ptr_array_insert -g_ptr_array_remove -g_ptr_array_remove_index -g_ptr_array_remove_fast -g_ptr_array_remove_index_fast -g_ptr_array_remove_range -g_ptr_array_steal_index -g_ptr_array_steal_index_fast -g_ptr_array_sort -g_ptr_array_sort_with_data -g_ptr_array_sort_values -g_ptr_array_sort_values_with_data -g_ptr_array_set_size -g_ptr_array_index -g_ptr_array_free -g_ptr_array_foreach -g_ptr_array_find -g_ptr_array_find_with_equal_func - -
- -
-Byte Arrays -arrays_byte - -GByteArray -g_byte_array_new -g_byte_array_steal -g_byte_array_new_take -g_byte_array_sized_new -g_byte_array_ref -g_byte_array_unref -g_byte_array_append -g_byte_array_prepend -g_byte_array_remove_index -g_byte_array_remove_index_fast -g_byte_array_remove_range -g_byte_array_sort -g_byte_array_sort_with_data -g_byte_array_set_size -g_byte_array_free -g_byte_array_free_to_bytes - - -GBytes -g_bytes_new -g_bytes_new_take -g_bytes_new_static -g_bytes_new_with_free_func -g_bytes_new_from_bytes -g_bytes_get_data -g_bytes_get_region -g_bytes_get_size -g_bytes_hash -g_bytes_equal -g_bytes_compare -g_bytes_ref -g_bytes_unref -g_bytes_unref_to_data -g_bytes_unref_to_array - - -g_bytes_get_type -
- -
-Balanced Binary Trees -trees-binary -GTree -GTreeNode -g_tree_new -g_tree_ref -g_tree_unref -g_tree_new_with_data -g_tree_new_full -g_tree_node_first -g_tree_node_last -g_tree_node_previous -g_tree_node_next -g_tree_insert_node -g_tree_insert -g_tree_replace_node -g_tree_replace -g_tree_node_key -g_tree_node_value -g_tree_nnodes -g_tree_height -g_tree_lookup_node -g_tree_lookup -g_tree_lookup_extended -g_tree_foreach_node -g_tree_foreach -g_tree_traverse -GTraverseFunc -GTraverseNodeFunc -g_tree_search_node -g_tree_search -g_tree_lower_bound -g_tree_upper_bound -g_tree_remove -g_tree_steal -g_tree_remove_all -g_tree_destroy -
- -
-N-ary Trees -trees-nary -GNode -g_node_new -g_node_copy -GCopyFunc -g_node_copy_deep - - -g_node_insert -g_node_insert_before -g_node_insert_after -g_node_append -g_node_prepend - - -g_node_insert_data -g_node_insert_data_after -g_node_insert_data_before -g_node_append_data -g_node_prepend_data - - -g_node_reverse_children -g_node_traverse -GTraverseType -GTraverseFlags -GNodeTraverseFunc -g_node_children_foreach -GNodeForeachFunc - - -g_node_get_root -g_node_find -g_node_find_child -g_node_child_index -g_node_child_position -g_node_first_child -g_node_last_child -g_node_nth_child -g_node_first_sibling -g_node_next_sibling -g_node_prev_sibling -g_node_last_sibling - - -G_NODE_IS_LEAF -G_NODE_IS_ROOT -g_node_depth -g_node_n_nodes -g_node_n_children -g_node_is_ancestor -g_node_max_height - - -g_node_unlink -g_node_destroy -
- - -
-Quarks -quarks -GQuark -G_DEFINE_QUARK -g_quark_from_string -g_quark_from_static_string -g_quark_to_string -g_quark_try_string -g_intern_string -g_intern_static_string -
- -
-Keyed Data Lists -datalist -GData -g_datalist_init - - -g_datalist_id_set_data -g_datalist_id_set_data_full -g_datalist_id_get_data -g_datalist_id_remove_data -g_datalist_id_remove_no_notify -g_datalist_id_remove_multiple -GDuplicateFunc -g_datalist_id_dup_data -g_datalist_id_replace_data - - -g_datalist_set_data -g_datalist_set_data_full -g_datalist_get_data -g_datalist_remove_data -g_datalist_remove_no_notify - - -g_datalist_foreach -g_datalist_clear -g_datalist_set_flags -g_datalist_unset_flags -g_datalist_get_flags -G_DATALIST_FLAGS_MASK -
- - -
-Datasets -datasets -g_dataset_id_set_data -g_dataset_id_set_data_full -GDestroyNotify -g_dataset_id_get_data -g_dataset_id_remove_data -g_dataset_id_remove_no_notify - - -g_dataset_set_data -g_dataset_set_data_full -g_dataset_get_data -g_dataset_remove_data -g_dataset_remove_no_notify - - -g_dataset_foreach -GDataForeachFunc -g_dataset_destroy - -
- -
-Relations and Tuples -relations -GRelation -g_relation_new -g_relation_index -g_relation_insert -g_relation_exists -g_relation_count -g_relation_select -g_relation_delete -g_relation_destroy - - -g_relation_print - - -GTuples -g_tuples_destroy -g_tuples_index -
- -
-Caches -caches -GCache -g_cache_new -g_cache_insert -g_cache_remove -g_cache_destroy - - -g_cache_key_foreach -g_cache_value_foreach - - -GCacheDestroyFunc -GCacheDupFunc -GCacheNewFunc -
- -
-Random Numbers -random_numbers -GRand -g_rand_new_with_seed -g_rand_new_with_seed_array -g_rand_new -g_rand_copy -g_rand_free -g_rand_set_seed -g_rand_set_seed_array -g_rand_boolean -g_rand_int -g_rand_int_range -g_rand_double -g_rand_double_range -g_random_set_seed -g_random_boolean -g_random_int -g_random_int_range -g_random_double -g_random_double_range -
- -
-Character Set Conversion -conversions -g_convert -g_convert_with_fallback -GIConv -g_convert_with_iconv -G_CONVERT_ERROR -g_iconv_open -g_iconv -g_iconv_close -g_locale_to_utf8 -g_filename_to_utf8 -g_filename_from_utf8 -g_get_filename_charsets -g_filename_display_name -g_filename_display_basename -g_locale_from_utf8 -GConvertError - - -g_get_charset -g_get_codeset -g_get_console_charset - - -g_convert_error_quark -
- -
-Unicode Manipulation -unicode -gunichar -gunichar2 - - -g_unichar_validate -g_unichar_isalnum -g_unichar_isalpha -g_unichar_iscntrl -g_unichar_isdefined -g_unichar_isdigit -g_unichar_isgraph -g_unichar_islower -g_unichar_ismark -g_unichar_isprint -g_unichar_ispunct -g_unichar_isspace -g_unichar_istitle -g_unichar_isupper -g_unichar_isxdigit -g_unichar_iswide -g_unichar_iswide_cjk -g_unichar_iszerowidth -g_unichar_toupper -g_unichar_tolower -g_unichar_totitle -g_unichar_digit_value -g_unichar_xdigit_value -g_unichar_compose -g_unichar_decompose -g_unichar_fully_decompose -G_UNICHAR_MAX_DECOMPOSITION_LENGTH -GUnicodeType -G_UNICODE_COMBINING_MARK -g_unichar_type -GUnicodeBreakType -g_unichar_break_type -g_unichar_combining_class -g_unicode_canonical_ordering -g_unicode_canonical_decomposition -g_unichar_get_mirror_char -GUnicodeScript -g_unichar_get_script -g_unicode_script_from_iso15924 -g_unicode_script_to_iso15924 - - -g_utf8_next_char -g_utf8_get_char -g_utf8_get_char_validated -g_utf8_offset_to_pointer -g_utf8_pointer_to_offset -g_utf8_prev_char -g_utf8_find_next_char -g_utf8_find_prev_char -g_utf8_strlen -g_utf8_strncpy -g_utf8_strchr -g_utf8_strrchr -g_utf8_strreverse -g_utf8_substring -g_utf8_truncate_middle -g_utf8_validate -g_utf8_validate_len -g_utf8_make_valid - - -g_utf8_strup -g_utf8_strdown -g_utf8_casefold -g_utf8_normalize -GNormalizeMode -g_utf8_collate -g_utf8_collate_key -g_utf8_collate_key_for_filename - - -g_utf8_to_utf16 -g_utf8_to_ucs4 -g_utf8_to_ucs4_fast -g_utf16_to_ucs4 -g_utf16_to_utf8 -g_ucs4_to_utf16 -g_ucs4_to_utf8 -g_unichar_to_utf8 - - -g_utf8_skip -
- -
-I18N -i18n -glib.h,glib/gi18n.h -_ -Q_ -C_ -N_ -NC_ -g_dgettext -g_dcgettext -g_dngettext -g_dpgettext -g_dpgettext2 -g_strip_context - -g_get_language_names -g_get_locale_variants -
- -
-Base64 Encoding -base64 -g_base64_encode_step -g_base64_encode_close -g_base64_encode -g_base64_decode_step -g_base64_decode -g_base64_decode_inplace -
- -
-URI Functions -guri -GUri -g_uri_ref -g_uri_unref - -GUriFlags -g_uri_split -g_uri_split_with_user -g_uri_split_network -g_uri_is_valid -g_uri_join -g_uri_join_with_user -g_uri_parse -g_uri_parse_relative -g_uri_resolve_relative -g_uri_build -g_uri_build_with_user -g_uri_peek_scheme -g_uri_parse_scheme - -GUriHideFlags -g_uri_to_string -g_uri_to_string_partial - -g_uri_get_scheme -g_uri_get_userinfo -g_uri_get_user -g_uri_get_password -g_uri_get_auth_params -g_uri_get_host -g_uri_get_port -g_uri_get_path -g_uri_get_query -g_uri_get_fragment -g_uri_get_flags - -GUriParamsIter -GUriParamsFlags -g_uri_params_iter_init -g_uri_params_iter_next -g_uri_parse_params - -G_URI_RESERVED_CHARS_ALLOWED_IN_PATH -G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT -G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO -G_URI_RESERVED_CHARS_GENERIC_DELIMITERS -G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS -g_uri_escape_string -g_uri_unescape_string -g_uri_escape_bytes -g_uri_unescape_bytes -g_uri_unescape_segment - -g_uri_list_extract_uris -g_filename_from_uri -g_filename_to_uri - -G_URI_ERROR -GUriError - -g_uri_error_quark -
- -
-Data Checksums -checksum -GChecksumType -g_checksum_type_get_length -GChecksum -g_checksum_new -g_checksum_copy -g_checksum_free -g_checksum_reset -g_checksum_update -g_checksum_get_string -g_checksum_get_digest - -g_compute_checksum_for_data -g_compute_checksum_for_string -g_compute_checksum_for_bytes -
- -
-Data HMACs -hmac -GHmac -g_hmac_new -g_hmac_copy -g_hmac_ref -g_hmac_unref -g_hmac_update -g_hmac_get_string -g_hmac_get_digest - -g_compute_hmac_for_data -g_compute_hmac_for_string -g_compute_hmac_for_bytes -
- -
-Testing -testing -G_TEST_OPTION_ISOLATE_DIRS -g_test_minimized_result -g_test_maximized_result -g_test_init -g_test_initialized -g_test_quick -g_test_slow -g_test_thorough -g_test_perf -g_test_verbose -g_test_undefined -g_test_quiet -g_test_subprocess -g_test_run -GTestFunc -g_test_add_func -GTestDataFunc -g_test_add_data_func -g_test_add_data_func_full -g_test_add -g_test_get_path - -GTestFileType -g_test_build_filename -g_test_get_filename -g_test_get_dir - -g_test_fail -g_test_fail_printf -g_test_skip -g_test_skip_printf -g_test_incomplete -g_test_incomplete_printf -g_test_failed -g_test_message -g_test_bug_base -g_test_bug -g_test_summary -GTestLogFatalFunc -g_test_log_set_fatal_handler - -g_test_timer_start -g_test_timer_elapsed -g_test_timer_last - -g_test_queue_free -g_test_queue_destroy -g_test_queue_unref - -g_test_expect_message -g_test_assert_expected_messages - -GTestTrapFlags -GTestSubprocessFlags -g_test_trap_subprocess -g_test_trap_has_passed -g_test_trap_reached_timeout -g_test_trap_assert_passed -g_test_trap_assert_failed -g_test_trap_assert_stdout -g_test_trap_assert_stdout_unmatched -g_test_trap_assert_stderr -g_test_trap_assert_stderr_unmatched -g_test_trap_fork -g_test_disable_crash_reporting - -g_test_rand_bit -g_test_rand_int -g_test_rand_int_range -g_test_rand_double -g_test_rand_double_range - -g_assert -g_assert_not_reached - -g_assert_cmpstr -g_assert_cmpstrv -g_assert_cmpint -g_assert_cmpuint -g_assert_cmphex -g_assert_cmpfloat -g_assert_cmpfloat_with_epsilon -g_assert_cmpmem -g_assert_cmpvariant -g_assert_no_error -g_assert_error -g_assert_true -g_assert_false -g_assert_null -g_assert_nonnull -g_assert_no_errno -g_test_set_nonfatal_assertions - -GTestCase -GTestSuite -GTestFixtureFunc -g_test_create_case -g_test_create_suite -g_test_get_root -g_test_suite_add -g_test_suite_add_suite -g_test_run_suite -g_test_case_free -g_test_suite_free - - -g_test_trap_assertions -g_assertion_message -g_assertion_message_expr -g_assertion_message_cmpstr -g_assertion_message_cmpint -g_assertion_message_cmpnum -g_assertion_message_error -g_test_assert_expected_messages_internal - -g_test_config_vars - -g_test_add_vtable -GTestConfig -GTestLogType -GTestLogMsg -GTestLogBuffer -GTestResult - -g_test_log_type_name -g_test_log_buffer_new -g_test_log_buffer_free -g_test_log_buffer_push -g_test_log_buffer_pop -g_test_log_msg_free -
- -
-GVariantType -gvarianttype -GVariantType -G_VARIANT_TYPE_BOOLEAN -G_VARIANT_TYPE_BYTE -G_VARIANT_TYPE_INT16 -G_VARIANT_TYPE_UINT16 -G_VARIANT_TYPE_INT32 -G_VARIANT_TYPE_UINT32 -G_VARIANT_TYPE_INT64 -G_VARIANT_TYPE_UINT64 -G_VARIANT_TYPE_HANDLE -G_VARIANT_TYPE_DOUBLE -G_VARIANT_TYPE_STRING -G_VARIANT_TYPE_OBJECT_PATH -G_VARIANT_TYPE_SIGNATURE -G_VARIANT_TYPE_VARIANT -G_VARIANT_TYPE_ANY -G_VARIANT_TYPE_BASIC -G_VARIANT_TYPE_MAYBE -G_VARIANT_TYPE_ARRAY -G_VARIANT_TYPE_TUPLE -G_VARIANT_TYPE_UNIT -G_VARIANT_TYPE_DICT_ENTRY -G_VARIANT_TYPE_DICTIONARY -G_VARIANT_TYPE_STRING_ARRAY -G_VARIANT_TYPE_OBJECT_PATH_ARRAY -G_VARIANT_TYPE_BYTESTRING -G_VARIANT_TYPE_BYTESTRING_ARRAY -G_VARIANT_TYPE_VARDICT - - -G_VARIANT_TYPE -g_variant_type_free -g_variant_type_copy -g_variant_type_new - - -g_variant_type_string_is_valid -g_variant_type_string_scan -g_variant_type_get_string_length -g_variant_type_peek_string -g_variant_type_dup_string - - -g_variant_type_is_definite -g_variant_type_is_container -g_variant_type_is_basic -g_variant_type_is_maybe -g_variant_type_is_array -g_variant_type_is_tuple -g_variant_type_is_dict_entry -g_variant_type_is_variant - - -g_variant_type_hash -g_variant_type_equal -g_variant_type_is_subtype_of - - -g_variant_type_new_maybe -g_variant_type_new_array -g_variant_type_new_tuple -g_variant_type_new_dict_entry - - -g_variant_type_element -g_variant_type_n_items -g_variant_type_first -g_variant_type_next -g_variant_type_key -g_variant_type_value -
- -
-GVariant -gvariant -GVariant -g_variant_unref -g_variant_ref -g_variant_ref_sink -g_variant_is_floating -g_variant_take_ref -g_variant_get_type -g_variant_get_type_string -g_variant_is_of_type -g_variant_is_container -g_variant_compare - - -g_variant_classify -GVariantClass - - -g_variant_check_format_string -g_variant_get -g_variant_get_va -g_variant_new -g_variant_new_va - - -g_variant_new_boolean -g_variant_new_byte -g_variant_new_int16 -g_variant_new_uint16 -g_variant_new_int32 -g_variant_new_uint32 -g_variant_new_int64 -g_variant_new_uint64 -g_variant_new_handle -g_variant_new_double -g_variant_new_string -g_variant_new_take_string -g_variant_new_printf -g_variant_new_object_path -g_variant_is_object_path -g_variant_new_signature -g_variant_is_signature -g_variant_new_variant -g_variant_new_strv -g_variant_new_objv -g_variant_new_bytestring -g_variant_new_bytestring_array - - -g_variant_get_boolean -g_variant_get_byte -g_variant_get_int16 -g_variant_get_uint16 -g_variant_get_int32 -g_variant_get_uint32 -g_variant_get_int64 -g_variant_get_uint64 -g_variant_get_handle -g_variant_get_double -g_variant_get_string -g_variant_dup_string -g_variant_get_variant -g_variant_get_strv -g_variant_dup_strv -g_variant_get_objv -g_variant_dup_objv -g_variant_get_bytestring -g_variant_dup_bytestring -g_variant_get_bytestring_array -g_variant_dup_bytestring_array - - -g_variant_new_maybe -g_variant_new_array -g_variant_new_tuple -g_variant_new_dict_entry -g_variant_new_fixed_array - - -g_variant_get_maybe -g_variant_n_children -g_variant_get_child_value -g_variant_get_child -g_variant_lookup_value -g_variant_lookup -g_variant_get_fixed_array - - -g_variant_get_size -g_variant_get_data -g_variant_get_data_as_bytes -g_variant_store -g_variant_new_from_data -g_variant_new_from_bytes -g_variant_byteswap -g_variant_get_normal_form -g_variant_is_normal_form - - -g_variant_hash -g_variant_equal - - -g_variant_print -g_variant_print_string - - -GVariantIter -g_variant_iter_copy -g_variant_iter_free -g_variant_iter_init -g_variant_iter_n_children -g_variant_iter_new -g_variant_iter_next_value -g_variant_iter_next -g_variant_iter_loop - - -G_VARIANT_BUILDER_INIT -GVariantBuilder -g_variant_builder_unref -g_variant_builder_ref -g_variant_builder_new -g_variant_builder_init -g_variant_builder_clear -g_variant_builder_add_value -g_variant_builder_add -g_variant_builder_add_parsed -g_variant_builder_end -g_variant_builder_open -g_variant_builder_close - - -G_VARIANT_DICT_INIT -GVariantDict -g_variant_dict_unref -g_variant_dict_ref -g_variant_dict_new -g_variant_dict_init -g_variant_dict_clear -g_variant_dict_contains -g_variant_dict_lookup -g_variant_dict_lookup_value -g_variant_dict_insert -g_variant_dict_insert_value -g_variant_dict_remove -g_variant_dict_end - - -GVariantParseError -G_VARIANT_PARSE_ERROR -g_variant_parse -g_variant_new_parsed_va -g_variant_new_parsed -g_variant_parse_error_print_context - - -g_variant_parse_error_quark -g_variant_parser_get_error_quark -g_variant_type_checked_ -g_variant_type_string_get_depth_ -
- - -
-ghostutils -Hostname Utilities -g_hostname_to_ascii -g_hostname_to_unicode - -g_hostname_is_non_ascii -g_hostname_is_ascii_encoded - -g_hostname_is_ip_address -
- -
-uuid -GUuid -g_uuid_string_is_valid -g_uuid_string_random -
- -
-refcount -grefcount -g_ref_count_init -g_ref_count_inc -g_ref_count_dec -g_ref_count_compare -G_REF_COUNT_INIT - -gatomicrefcount -g_atomic_ref_count_init -g_atomic_ref_count_inc -g_atomic_ref_count_dec -g_atomic_ref_count_compare -G_ATOMIC_REF_COUNT_INIT -
- -
-rcbox -g_rc_box_alloc -g_rc_box_alloc0 -g_rc_box_new -g_rc_box_new0 -g_rc_box_dup -g_rc_box_acquire -g_rc_box_release -g_rc_box_release_full -g_rc_box_get_size -
- -
-arcbox -g_atomic_rc_box_alloc -g_atomic_rc_box_alloc0 -g_atomic_rc_box_new -g_atomic_rc_box_new0 -g_atomic_rc_box_dup -g_atomic_rc_box_acquire -g_atomic_rc_box_release -g_atomic_rc_box_release_full -g_atomic_rc_box_get_size -
- -
-refstring -GRefString -g_ref_string_new -g_ref_string_new_intern -g_ref_string_new_len -g_ref_string_acquire -g_ref_string_release -g_ref_string_length -
- -
-gpathbuf -GPathBuf -G_PATH_BUF_INIT -g_path_buf_new -g_path_buf_new_from_path -g_path_buf_init -g_path_buf_init_from_path -g_path_buf_clear -g_path_buf_clear_to_path -g_path_buf_free -g_path_buf_free_to_path -g_path_buf_push -g_path_buf_pop -g_path_buf_set_filename -g_path_buf_set_extension -g_path_buf_to_path -g_path_buf_copy -g_path_buf_equal -
diff --git a/docs/reference/glib/glib-unix.toml.in b/docs/reference/glib/glib-unix.toml.in new file mode 100644 index 0000000..9280c1a --- /dev/null +++ b/docs/reference/glib/glib-unix.toml.in @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GLibUnix" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_url = "https://docs.gtk.org/glib-unix/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Unix-specific APIs in GLib" +dependencies = [ "GLib-2.0" ] +related = [ "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [related."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [related."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [related."Gio-2.0"] + name = "GIO" + description = "GObject Interfaces and Objects, Networking, IPC, and I/O" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "unix.md", +] +content_images = [] diff --git a/docs/reference/glib/glib-win32.toml.in b/docs/reference/glib/glib-win32.toml.in new file mode 100644 index 0000000..a9f624f --- /dev/null +++ b/docs/reference/glib/glib-win32.toml.in @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GLibWin32" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_url = "https://docs.gtk.org/glib-win32/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Windows-specific APIs in GLib" +dependencies = [ "GLib-2.0" ] +related = [ "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [related."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [related."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [related."Gio-2.0"] + name = "GIO" + description = "GObject Interfaces and Objects, Networking, IPC, and I/O" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "windows.md", +] +content_images = [] diff --git a/docs/reference/glib/glib.toml.in b/docs/reference/glib/glib.toml.in new file mode 100644 index 0000000..83acea5 --- /dev/null +++ b/docs/reference/glib/glib.toml.in @@ -0,0 +1,123 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GLib" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_url = "https://docs.gtk.org/glib/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "GLib is a general-purpose, portable utility library, which provides many useful data types, macros, type conversions, string utilities, file utilities, a mainloop abstraction, and so on." +related = [ "GModule-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [related."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [related."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [related."Gio-2.0"] + name = "GIO" + description = "GObject Interfaces and Objects, Networking, IPC, and I/O" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "building.md", + "compiling.md", + "cross-compiling.md", + "running.md", + "programming.md", + "resources.md", + + "gvariant-format-strings.md", + "gvariant-text-format.md", + + "character-set.md", + "i18n.md", + + "string-utils.md", + + "types.md", + "macros.md", + "conversion-macros.md", + "auto-cleanup.md", + + "memory.md", + "memory-slices.md", + "error-reporting.md", + "logging.md", + "warnings.md", + "file-utils.md", + "host-utils.md", + "misc-utils.md", + "main-loop.md", + "reference-counting.md", + "testing.md", + "atomic.md", + "checked-math.md", + "threads.md", + "spawn.md", + "random.md", + "numerical.md", + "markup.md", + "base64.md", + "goption.md", + "data-structures.md", + "datalist-and-dataset.md", + "shell.md", + "uuid.md", + "unicode.md", + "version.md", + + "threads-deprecated.md", +] +content_images = [ + "file-name-encodings.png", + "mainloop-states.gif", + "Sorted_binary_tree_breadth-first_traversal.svg", + "Sorted_binary_tree_inorder.svg", + "Sorted_binary_tree_postorder.svg", + "Sorted_binary_tree_preorder.svg", +] + +[[object]] +pattern = "DEPRECATED_IN_2_*" +hidden = true + +[[object]] +pattern = "DEPRECATED_MACRO_IN_2_*" +hidden = true + +[[object]] +pattern = "DEPRECATED_ENUMERATOR_IN_2_*" +hidden = true + +[[object]] +pattern = "DEPRECATED_TYPE_IN_2_*" +hidden = true + +[[object]] +name = "test_assert_expected_messages_internal" +hidden = true + +[[object]] +pattern = "macro__has_*" +hidden = true diff --git a/docs/reference/glib/goption.md b/docs/reference/glib/goption.md new file mode 100644 index 0000000..292a1d3 --- /dev/null +++ b/docs/reference/glib/goption.md @@ -0,0 +1,149 @@ +Title: Commandline Option Parser + +# Commandline Option Parser + +The GOption commandline parser is intended to be a simpler replacement +for the popt library. It supports short and long commandline options, +as shown in the following example: + + testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2 + +The example demonstrates a number of features of the GOption commandline parser: + + - Options can be single letters, prefixed by a single dash. + - Multiple short options can be grouped behind a single dash. + - Long options are prefixed by two consecutive dashes. + - Options can have an extra argument, which can be a number, a string or + a filename. For long options, the extra argument can be appended with + an equals sign after the option name, which is useful if the extra + argument starts with a dash, which would otherwise cause it to be + interpreted as another option. + - Non-option arguments are returned to the application as rest arguments. + - An argument consisting solely of two dashes turns off further parsing, + any remaining arguments (even those starting with a dash) are returned + to the application as rest arguments. + +Another important feature of GOption is that it can automatically +generate nicely formatted help output. Unless it is explicitly turned +off with [method@GLib.OptionContext.set_help_enabled], GOption will recognize +the `--help`, `-?`, `--help-all` and `--help-groupname` options (where `groupname` +is the name of a [struct@GLib.OptionGroup]) and write a text similar to the one shown +in the following example to stdout. + + Usage: + testtreemodel [OPTION...] - test tree model performance + + Help Options: + -h, --help Show help options + --help-all Show all help options + --help-gtk Show GTK Options + + Application Options: + -r, --repeats=N Average over N repetitions + -m, --max-size=M Test up to 2^M items + --display=DISPLAY X display to use + -v, --verbose Be verbose + -b, --beep Beep when done + --rand Randomize the data + +GOption groups options in [struct@GLib.OptionGroup]s, which makes it easy to +incorporate options from multiple sources. The intended use for this is +to let applications collect option groups from the libraries it uses, +add them to their #GOptionContext, and parse all options by a single call +to [method@GLib.OptionContext.parse]. + +If an option is declared to be of type string or filename, GOption takes +care of converting it to the right encoding; strings are returned in UTF-8, +filenames are returned in the GLib filename encoding. Note that this only +works if `setlocale()` has been called before [method@GLib.OptionContext.parse] + +Here is a complete example of setting up GOption to parse the example +commandline above and produce the example help output. + +```c +static gint repeats = 2; +static gint max_size = 8; +static gboolean verbose = FALSE; +static gboolean beep = FALSE; +static gboolean randomize = FALSE; + +static GOptionEntry entries[] = +{ + { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" }, + { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" }, + { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, + { "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL }, + { "rand", 0, 0, G_OPTION_ARG_NONE, &randomize, "Randomize the data", NULL }, + G_OPTION_ENTRY_NULL +}; + +int +main (int argc, char *argv[]) +{ + GError *error = NULL; + GOptionContext *context; + + context = g_option_context_new ("- test tree model performance"); + g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); + g_option_context_add_group (context, gtk_get_option_group (TRUE)); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + g_print ("option parsing failed: %s\n", error->message); + exit (1); + } + + ... + +} +``` + +On UNIX systems, the argv that is passed to `main()` has no particular +encoding, even to the extent that different parts of it may have different +encodings. In general, normal arguments and flags will be in the current +locale and filenames should be considered to be opaque byte strings. +Proper use of `G_OPTION_ARG_FILENAME` vs `G_OPTION_ARG_STRING` is +therefore important. + +Note that on Windows, filenames do have an encoding, but using +[struct@GLib.OptionContext] with the argv as passed to `main()` will result +in a program that can only accept commandline arguments with characters +from the system codepage.This can cause problems when attempting to +deal with filenames containing Unicode characters that fall outside +of the codepage. + +A solution to this is to use `g_win32_get_command_line()` and +[method@GLib.OptionContext.parse_strv] which will properly handle full +Unicode filenames. If you are using #GApplication, this is done +automatically for you. + +The following example shows how you can use #GOptionContext directly +in order to correctly deal with Unicode filenames on Windows: + +```c +int +main (int argc, char **argv) +{ + GError *error = NULL; + GOptionContext *context; + gchar **args; + +#ifdef G_OS_WIN32 + args = g_win32_get_command_line (); +#else + args = g_strdupv (argv); +#endif + + // set up context + + if (!g_option_context_parse_strv (context, &args, &error)) + { + // error happened + } + + ... + + g_strfreev (args); + + ... +} +``` diff --git a/docs/reference/glib/gtester-report.rst b/docs/reference/glib/gtester-report.rst new file mode 100644 index 0000000..b6c5b31 --- /dev/null +++ b/docs/reference/glib/gtester-report.rst @@ -0,0 +1,54 @@ +.. _gtester-report(1): +.. meta:: + :copyright: Copyright 2008 Matthias Clasen + :copyright: Copyright 2012, 2013 Red Hat, Inc. + :copyright: Copyright 2019 Endless Mobile, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2008 Matthias Clasen + SPDX-FileCopyrightText: 2012, 2013 Red Hat, Inc. + SPDX-FileCopyrightText: 2019 Endless Mobile, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +============== +gtester-report +============== + +------------------------------ +test report formatting utility +------------------------------ + +SYNOPSIS +-------- + +| **gtester-report** [*OPTION*…] *gtester-log* + +DESCRIPTION +----------- + +``gtester-report`` is a script which converts the XML output generated by +``gtester`` into HTML. + +Since GLib 2.62, ``gtester-report`` is deprecated. Use TAP for reporting test +results instead, and feed it to the test harness provided by your build system. + +OPTIONS +------- + +``-h``, ``--help`` + + Print help and exit. + +``-v``, ``--version`` + + Print version information and exit. + +``-s``, ``--subunit`` + + Output subunit. Needs ``python-subunit``. + +SEE ALSO +-------- + +`gtester(1) `_ \ No newline at end of file diff --git a/docs/reference/glib/gtester-report.xml b/docs/reference/glib/gtester-report.xml deleted file mode 100644 index eee9337..0000000 --- a/docs/reference/glib/gtester-report.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - -gtester-report -GLib - - -Developer -Tim -Janik - - - - - -gtester-report -1 -User Commands - - - -gtester-report -test report formatting utility - - - - -gtester-report -option -gtester-log - - - -Description -gtester-report is a script which converts -the XML output generated by gtester into HTML. - -Since GLib 2.62, gtester-report is deprecated. Use -TAP for reporting test results instead, and feed it to the test harness provided -by your build system. - - -Options - - - -, - -print help and exit - - - - -, - -print version information and exit - - - - -, - -Output subunit. Needs python-subunit. - - - - - - -See also - - -gtester -1 - - - - diff --git a/docs/reference/glib/gtester.rst b/docs/reference/glib/gtester.rst new file mode 100644 index 0000000..68c3f24 --- /dev/null +++ b/docs/reference/glib/gtester.rst @@ -0,0 +1,120 @@ +.. _gtester(1): +.. meta:: + :copyright: Copyright 2008 Matthias Clasen + :copyright: Copyright 2011 Collabora, Ltd. + :copyright: Copyright 2011 Carlos Garcia Campos + :copyright: Copyright 2012 Red Hat, Inc. + :copyright: Copyright 2019 Endless Mobile, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2008 Matthias Clasen + SPDX-FileCopyrightText: 2011 Collabora, Ltd. + SPDX-FileCopyrightText: 2011 Carlos Garcia Campos + SPDX-FileCopyrightText: 2012 Red Hat, Inc. + SPDX-FileCopyrightText: 2019 Endless Mobile, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +======= +gtester +======= + +-------------------- +test running utility +-------------------- + +SYNOPSIS +-------- + +| **gtester** [*OPTION*…] *test-program* + +DESCRIPTION +----------- + +``gtester`` is a utility to run unit tests that have been written using the GLib +test framework. + +Since GLib 2.62, ``gtester-report`` is deprecated. Use TAP for reporting test +results instead, and feed it to the test harness provided by your build system. + +When called with the ``-o`` option, ``gtester`` writes an XML report of the test +results, which can be converted into HTML using the ``gtester-report`` utility. + +OPTIONS +------- + +``-h``, ``--help`` + + Print help and exit. + +``-v``, ``--verbose`` + + Print version information and exit. + +``--g-fatal-warnings`` + + Make warnings fatal. + +``-k``, ``--keep-going`` + + Continue running after tests failed. + +``-l`` + + List paths of available test cases. + +``-m=`` + + Run test cases in ``MODE``, which can be one of: + + * ``perf`` + + Run performance tests. + + * ``slow``, ``thorough`` + + Run slow tests, or repeat non-deterministic tests more often. + + * ``quick`` + + Do not run slow or performance tests, or do extra repeats of + non-deterministic tests (default). + + * ``undefined`` + + Run test cases that deliberately provoke checks or assertion failures, if + implemented (default). + + * ``no-undefined`` + + Do not run test cases that deliberately provoke checks or assertion + failures. + +``-p=`` + + Only run test cases matching ``TEST-PATH``. + +``-s=`` + + Skip test cases matching ``TEST-PATH``. + +``--seed=`` + + Run all test cases with random number seed ``SEED-STRING``. + +``-o=`` + + Write the test log to ``LOG-FILE``. + +``-q``, ``--quiet`` + + Suppress per-test-binary output. + +``--verbose`` + + Report success per testcase. + +SEE ALSO +-------- + +`gtester-report(1) `_ \ No newline at end of file diff --git a/docs/reference/glib/gtester.xml b/docs/reference/glib/gtester.xml deleted file mode 100644 index 5626d4d..0000000 --- a/docs/reference/glib/gtester.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - -gtester -GLib - - -Developer -Tim -Janik - - -Developer -Sven -Herzberg - - - - - -gtester -1 -User Commands - - - -gtester -test running utility - - - - -gtester -OPTION -testprogram - - - -Description -gtester is a utility to run unit tests that have -been written using the GLib test framework. - -Since GLib 2.62, gtester-report is deprecated. Use -TAP for reporting test results instead, and feed it to the test harness provided -by your build system. - -When called with the option, gtester -writes an XML report of the test results, which can be converted -into HTML using the gtester-report utility. - - - -Options - - - -, - -print help and exit - - - - -, - -print version information and exit - - - - - - -make warnings fatal - - - - -, - -continue running after tests failed - - - - - - -list paths of available test cases - - - - - - - run test cases in MODE, which can be one of: - - - - - - run performance tests - - - - - , - - run slow tests, or repeat non-deterministic tests more often - - - - - - - do not run slow or performance tests, or do extra repeats - of non-deterministic tests (default) - - - - - - - run test cases that deliberately provoke checks or assertion - failures, if implemented (default) - - - - - - - do not run test cases that deliberately provoke checks or - assertion failures - - - - - - - - - - -only run test cases matching TESTPATH - - - - - - -skip test cases matching TESTPATH - - - - - - -run all test cases with random number seed SEEDSTRING - - - - - - -write the test log to LOGFILE - - - - -, - -suppress per test binary output - - - - - - -report success per testcase - - - - - - -See also - - -gtester-report -1 - - - - diff --git a/docs/reference/glib/gvariant-format-strings.md b/docs/reference/glib/gvariant-format-strings.md new file mode 100644 index 0000000..668282c --- /dev/null +++ b/docs/reference/glib/gvariant-format-strings.md @@ -0,0 +1,503 @@ +Title: GVariant Format Strings + +# GVariant Format Strings + +## Variable Argument Conversions + +This page attempts to document how to perform variable argument conversions +with [struct@GLib.Variant]. + +Conversions occur according to format strings. A format string is a two-way +mapping between a single `GVariant` value and one or more C values. + +A conversion from C values into a `GVariant` value is made using the +[ctor@GLib.Variant.new] function. A conversion from a `GVariant` into C +values is made using the [method@GLib.Variant.get] function. + +## Syntax + +This section exhaustively describes all possibilities for GVariant format +strings. There are no valid forms of format strings other than those +described here. Please note that the format string syntax is likely to +expand in the future. + +Valid format strings have one of the following forms: + +- any type string +- a type string prefixed with a `@` +- `&s`, `&o`, `&g`, `^as`, `^a&s`, `^ao`, `^a&o`, `^ay`, `^&ay`, `^aay` or + `^a&ay`. +- any format string, prefixed with an `m` +- a sequence of zero or more format strings, concatenated and enclosed in + parentheses +- an opening brace, followed by two format strings, followed by a closing + brace (subject to the constraint that the first format string correspond + to a type valid for use as the key type of a dictionary) + +## Symbols + +The following table describes the rough meaning of symbols that may appear inside a GVariant format string. Each symbol is described in detail in its own section, including usage examples. + +| Symbol | Meaning | +|--------|---------| +| `b`, `y`, `n`, `q`, `i`, `u`, `x`, `t`, `h`, `d` | Used for building or deconstructing boolean, byte and numeric types. See [Numeric Types](#numeric-types) below. | +| `s`, `o`, `g` | Used for building or deconstructing string types. See [Strings](#strings) below. | +| `v` | Used for building or deconstructing variant types. See [Variants](#variants) below. | +| `a` | Used for building or deconstructing arrays. See [Arrays](#arrays) below. | +| `m` | Used for building or deconstructing maybe types. See [Maybe Types](#maybe-types) below. | +| `()` | Used for building or deconstructing tuples. See [Tuples](#tuples) below. | +| `{}` | Used for building or deconstructing dictionary entries. See [Dictionaries](#dictionaries) below. | +| `@` | Used as a prefix for a `GVariant` type string (not a prefix for a format string, so `@as` is a valid format string but `@^as` is not). Denotes that a pointer to a GVariant should be used in place of the normal C type or types. For `g_variant_new()` this means that you must pass a non-`NULL` `(GVariant *)`; if it is a floating reference, ownership will be taken, as if by using `g_variant_ref_sink()`. For `g_variant_get()` this means that you must pass a pointer to a `(GVariant *)` for the value to be returned by reference or `NULL` to ignore the value. See [`GVariant *`](#gvariant) below. | +| `*`, `?`, `r` | Exactly equivalent to `@*`, `@?` and `@r`. Provided only for completeness so that all `GVariant` type strings can be used also as format strings. See [`GVariant *`](#gvariant) below. | +| `&` | Used as a prefix for a `GVariant` type string (not a prefix for a format string, so `&s` is a valid format string but `&@s` is not). Denotes that a C pointer to serialised data should be used in place of the normal C type. See [Pointers](#pointers) below. | +| `^` | Used as a prefix on some specific types of format strings. See [Convenience Conversions](#convenience-conversions) below. | + +## Numeric Types + +Characters: `b`, `y`, `n`, `q`, `i`, `u`, `x`, `t`, `h`, `d` + +Variable argument conversions from numeric types work in the most obvious +way possible. Upon encountering one of these characters, `g_variant_new()` +takes the equivalent C type as an argument. `g_variant_get()` takes a pointer +to the equivalent C type (or `NULL` to ignore the value). + +The equivalent C types are as follows: + +| Character | Equivalent C type | +|-----------|-------------------| +| `b` | `gboolean` | +| `y` | `guchar` | +| `n` | `gint16` | +| `q` | `guint16` | +| `i` | `gint32` | +| `u` | `guint32` | +| `x` | `gint64` | +| `t` | `guint64` | +| `h` | `gint32` | +| `d` | `gdouble` | + +Note that in C, small integer types in variable argument lists are promoted +up to `int` or `unsigned int` as appropriate, and read back accordingly. `int` +is 32 bits on every platform on which GLib is currently supported. This +means that you can use C expressions of type `int` with `g_variant_new()` and +format characters `b`, `y`, `n`, `q`, `i`, `u` and `h`. Specifically, you +can use integer literals with these characters. + +When using the `x` and `t` characters, you must ensure that the value that +you provide is 64 bit. This means that you should use a cast or make use of +the `G_GINT64_CONSTANT` or `G_GUINT64_CONSTANT` macros. + +No type promotion occurs when using `g_variant_get()` since it operates with +pointers. The pointers must always point to a memory region of exactly the +correct size. + +### Examples + +```c +GVariant *value1, *value2, *value3, *value4; + +value1 = g_variant_new ("y", 200); +value2 = g_variant_new ("b", TRUE); +value3 = g_variant_new ("d", 37.5): +value4 = g_variant_new ("x", G_GINT64_CONSTANT (998877665544332211)); + +{ + gdouble floating; + gboolean truth; + gint64 bignum; + + + g_variant_get (value1, "y", NULL); /* ignore the value. */ + g_variant_get (value2, "b", &truth); + g_variant_get (value3, "d", &floating); + g_variant_get (value4, "x", &bignum); +} +``` + +## Strings + +Characters: `s`, `o`, `g` + +String conversions occur to and from standard nul-terminated C strings. Upon +encountering an `s`, `o` or `g` in a format string, `g_variant_new()` takes a +`(const gchar *)` and makes a copy of it. `NULL` is not a valid string; use +maybe types to encode that. If the `o` or `g` characters are used, care must +be taken to ensure that the passed string is a valid D-Bus object path or +D-Bus type signature, respectively. + +Upon encountering `s`, `o` or `g`, `g_variant_get()` takes a pointer to a +`(gchar *)` (ie: `(gchar **)`) and sets it to a newly-allocated copy of the +string. It is appropriate to free this copy using `g_free()`. `NULL` may +also be passed to indicate that the value of the string should be ignored +(in which case no copy is made). + +### Examples + +```c +GVariant *value1, *value2, *value3; + +value1 = g_variant_new ("s", "hello world!"); +value2 = g_variant_new ("o", "/must/be/a/valid/path"); +value3 = g_variant_new ("g", "iias"); + +#if 0 + g_variant_new ("s", NULL); /* not valid: NULL is not a string. */ +#endif + +{ + gchar *result; + + g_variant_get (value1, "s", &result); + g_print ("It was '%s'\n", result); + g_free (result); +} +``` + +## Variants + +Characters: `v` + +Upon encountering a `v`, `g_variant_new()` takes a `(GVariant *)`. The value +of the `GVariant` is used as the contents of the variant value. + +Upon encountering a `v`, `g_variant_get()` takes a pointer to a `(GVariant +*)` (ie: `(GVariant **)`). It is set to a new reference to a `GVariant` +instance containing the contents of the variant value. It is appropriate to +free this reference using `g_variant_unref()`. `NULL` may also be passed to +indicate that the value should be ignored (in which case no new reference is +created). + +### Examples + +```c +GVariant *x, *y; + +/* the following two lines are equivalent: */ +x = g_variant_new ("v", y); +x = g_variant_new_variant (y); + +/* as are these: */ +g_variant_get (x, "v", &y); +y = g_variant_get_variant (x); +``` + +## Arrays + +Characters: `a` + +Upon encountering an `a` character followed by a type string, +`g_variant_new()` will take a `(GVariantBuilder *)` that has been created as +an array builder for an array of the type given in the type string. The +builder will have `g_variant_builder_end()` called on it and the result will +be used as the value. As a special exception, if the given type string is a +definite type, then `NULL` may be given to mean an empty array of that type. + +Upon encountering an `a` character followed by a type string, +`g_variant_get()` will take a pointer to a `(GVariantIter *)` (ie: +`(GVariantIter **)`). A new heap-allocated iterator is created and returned, +initialised for iterating over the elements of the array. This iterator +should be freed when you are done with it, using `g_variant_iter_free()`. +`NULL` may also be given to indicate that the value of the array should be +ignored. + +### Examples + +```c +GVariantBuilder *builder; +GVariant *value; + +builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); +g_variant_builder_add (builder, "s", "when"); +g_variant_builder_add (builder, "s", "in"); +g_variant_builder_add (builder, "s", "the"); +g_variant_builder_add (builder, "s", "course"); +value = g_variant_new ("as", builder); +g_variant_builder_unref (builder); + +{ + GVariantIter *iter; + gchar *str; + + g_variant_get (value, "as", &iter); + while (g_variant_iter_loop (iter, "s", &str)) + g_print ("%s\n", str); + g_variant_iter_free (iter); +} + +g_variant_unref (value); +``` + +## Maybe Types + +Characters: `m` + +Maybe types are handled in two separate ways depending on the format string +that follows the `m`. The method that is used currently depends entirely on +the character immediately following the `m`. + +The first way is used with format strings starting with `a`, `s`, `o`, `g`, +`v`, `@`, `*`, `?`, `r`, `&`, or `^`. In all of these cases, for non-maybe +types, `g_variant_new()` takes a pointer to a non-`NULL` value and +`g_variant_get()` returns (by reference) a non-`NULL` pointer. When any of +these format strings are prefixed with an `m`, the type of arguments that +are collected does not change in any way, but `NULL` becomes a permissible +value, to indicate the Nothing case. + +Note that the "special exception" introduced in the array section for +constructing empty arrays is ignored here. Using a `NULL` pointer with the +format string `mas` constructs the Nothing value -- not an empty array. + +The second way is used with all other format strings. For `g_variant_new()` +an additional gboolean argument is collected and for `g_variant_get()` an +additional `(gboolean *)`. Following this argument, the arguments that are +normally collected for the equivalent non-maybe type will be collected. + +If `FALSE` is given to `g_variant_new()` then the Nothing value is +constructed and the collected arguments are ignored. Otherwise (if `TRUE` +was given), the arguments are used in the normal way to create the Just +value. + +If `NULL` is given to `g_variant_get()` then the value is ignored. If a +non-`NULL` pointer is given then it is used to return by reference whether +the value was Just. In the case that the value was Just, the `gboolean` will +be set to `TRUE` and the value will be stored in the arguments in the usual +way. In the case that the value was Nothing, the `gboolean` will be set to +`FALSE` and the arguments will be collected in the normal way but have their +values set to binary zero. + +### Examples + +```c +GVariant *value1, *value2, *value3, *value4, *value5, *value6; +value1 = g_variant_new ("ms", "Hello world"); +value2 = g_variant_new ("ms", NULL); +value3 = g_variant_new ("(m(ii)s)", TRUE, 123, 456, "Done"); +value4 = g_variant_new ("(m(ii)s)", FALSE, -1, -1, "Done"); /* both '-1' are ignored. */ +value5 = g_variant_new ("(m@(ii)s)", NULL, "Done"); + +{ + GVariant *contents; + const gchar *cstr; + gboolean just; + gint32 x, y; + gchar *str; + + g_variant_get (value1, "ms", &str); + if (str != NULL) + g_print ("str: %s\n", str); + else + g_print ("it was null\n"); + g_free (str); + + + g_variant_get (value2, "m&s", &cstr); + if (cstr != NULL) + g_print ("str: %s\n", cstr); + else + g_print ("it was null\n"); + /* don't free 'cstr' */ + + + /* NULL passed for the gboolean *, but two 'gint32 *' still collected */ + g_variant_get (value3, "(m(ii)s)", NULL, NULL, NULL, &str); + g_print ("string is %s\n", str); + g_free (str); + + /* note: &s used, so g_free() not needed */ + g_variant_get (value4, "(m(ii)&s)", &just, &x, &y, &cstr); + if (just) + g_print ("it was (%d, %d)\n", x, y); + else + g_print ("it was null\n"); + g_print ("string is %s\n", cstr); + /* don't free 'cstr' */ + + + g_variant_get (value5, "(m*s)", &contents, NULL); /* ignore the string. */ + if (contents != NULL) + { + g_variant_get (contents, "(ii)", &x, &y); + g_print ("it was (%d, %d)\n", x, y); + g_variant_unref (contents); + } + else + g_print ("it was null\n"); +} +``` + +## Tuples + +Characters: `()` + +Tuples are handled by handling each item in the tuple, in sequence. Each +item is handled in the usual way. + +### Examples + +```c +GVariant *value1, *value2; + +value1 = g_variant_new ("(s(ii))", "Hello", 55, 77); +value2 = g_variant_new ("()"); + +{ + gchar *string; + gint x, y; + + g_variant_get (value1, "(s(ii))", &string, &x, &y); + g_print ("%s, %d, %d\n", string, x, y); + g_free (string); + + g_variant_get (value2, "()"); /* do nothing... */ +} +``` + +## `GVariant *` + +Characters: `@`, `*`, `?`, `r` + +Upon encountering a `@` in front of a type string, `g_variant_new()` takes a +non-`NULL` pointer to a `GVariant` and uses its value directly instead of +collecting arguments to create the value. The provided `GVariant` must have +a type that matches the type string following the `@`. `*` is the same as +`@*` (ie: take a `GVariant` of any type). `?` is the same as `@?` (ie: take +a `GVariant` of any basic type). `r` is the same as `@r` (ie: take a +`GVariant` of any tuple type). + +Upon encountering a `@` in front of a type string, `g_variant_get()` takes a +pointer to a `(GVariant *)` (ie: a `(GVariant **)`) and sets it to a new +reference to a `GVariant` containing the value (instead of deconstructing +the value into C types in the usual way). `NULL` can be given to ignore the +value. `*`, `?` and `r` are handled in a way analogous to what is stated +above. + +You can always use `*` as an alternative to `?`, `r` or any use of `@`. +Using the other characters where possible is recommended, however, due to +the improvements in type safety and code self-documentation. + +### Examples + +```c +GVariant *value1, *value2; + +value1 = g_variant_new ("(i@ii)", 44, g_variant_new_int32 (55), 66); + +/* note: consumes floating reference count on 'value1' */ +value2 = g_variant_new ("(@(iii)*)", value1, g_variant_new_string ("foo")); + +{ + const gchar *string; + GVariant *tmp; + gsize length; + gint x, y, z; + + g_variant_get (value2, "((iii)*)", &x, &y, &z, &tmp); + string = g_variant_get_string (tmp, &length); + g_print ("it is %d %d %d %s (length=%d)\n", x, y, z, string, (int) length); + g_variant_unref (tmp); + + /* quick way to skip all the values in a tuple */ + g_variant_get (value2, "(rs)", NULL, &string); /* or "(@(iii)s)" */ + g_print ("i only got the string: %s\n", string); + g_free (string); +} +``` + +## Dictionaries + +Characters: `{}` + +Dictionary entries are handled by handling first the key, then the value. Each is handled in the usual way. + +### Examples + +```c +GVariantBuilder *b; +GVariant *dict; + +b = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); +g_variant_builder_add (b, "{sv}", "name", g_variant_new_string ("foo")); +g_variant_builder_add (b, "{sv}", "timeout", g_variant_new_int32 (10)); +dict = g_variant_builder_end (b); +``` + +To extract data from nested dictionaries you can go through a vardict. + +### Examples + +```c +GVariant *data; +gint value = 1; +gint max = 3; + +/* type (oa{sa{sv}) */ +data = g_variant_new_parsed ("(%o, {'brightness': {'value': <%i>, 'max': <%i>}})", + "/object/path", value, max); +{ + GVariant *params; + GVariant *p_brightness; + gchar *obj + gint p_max; + + g_variant_get (data, "(o@a{?*})", &obj, ¶ms); + g_print ("object_path: %s\n", obj); + + p_brightness = g_variant_lookup_value (params, "brightness", G_VARIANT_TYPE_VARDICT); + g_variant_lookup (p_brightness, "max", "i", &p_max); + g_print ("max: %d\n", p_max); +} +``` + +## Pointers + +Characters: `&` + +The `&` character is used to indicate that serialised data should be +directly exchanged via a pointer. + +Currently, the only use for this character is when it is applied to a string +(ie: `&s`, `&o` or `&g`). For `g_variant_new()` this has absolutely no +effect. The string is collected and duplicated normally. For +`g_variant_get()` it means that instead of creating a newly allocated copy +of the string, a pointer to the serialised data is returned. This pointer +should not be freed. Validity checks are performed to ensure that the string +data will always be properly nul-terminated. + +### Examples + +```c +{ + const gchar *str; + GVariant *value; + + value = g_variant_new ("&s", "hello world"); + g_variant_get (value, "&s", &str); + g_print ("string is: %s\n", str); + /* no need to free str */ +} +``` + +## Convenience Conversions + +Characters: `^` + +The `^` character currently supports conversion to and from bytestrings or +to and from arrays of strings or bytestrings. It does not support byte +arrays. It has a number of forms. + +In all forms, when used with `g_variant_new()` one pointer value is +collected from the variable arguments and passed to a function (as given in +the table below). The result of that function is used as the value for this +position. When used with `g_variant_get()` one pointer value is produced by +using the function (given in the table) and returned by reference. + +| Conversion | Used with `g_variant_new()` | Used with `g_variant_get()` | +|------------|----------------------------------------------------------|------------------------------------------------------------| +| `^as` | equivalent to [`ctor@GLib.Variant.new_strv`] | equivalent to [`method@GLib.Variant.dup_strv`] | +| `^a&s` | | equivalent to [`method@GLib.Variant.get_strv`] | +| `^ao` | equivalent to [`ctor@GLib.Variant.new_objv`] | equivalent to [`method@GLib.Variant.dup_objv`] | +| `^a&o` | | equivalent to [`method@GLib.Variant.get_objv`] | +| `^ay` | equivalent to [`ctor@GLib.Variant.new_bytestring`] | equivalent to [`method@GLib.Variant.dup_bytestring`] | +| `^&ay` | | equivalent to [`method@GLib.Variant.get_bytestring`] | +| `^aay` | equivalent to [`ctor@GLib.Variant.new_bytestring_array`] | equivalent to [`method@GLib.Variant.dup_bytestring_array`] | +| `^a&ay` | | equivalent to [`method@GLib.Variant.get_bytestring_array`] | diff --git a/docs/reference/glib/gvariant-text-format.md b/docs/reference/glib/gvariant-text-format.md new file mode 100644 index 0000000..4a142e4 --- /dev/null +++ b/docs/reference/glib/gvariant-text-format.md @@ -0,0 +1,346 @@ +Title: GVariant Text Format + +# GVariant Text Format + +This page attempts to document the `GVariant` text format as produced by +[`method@GLib.Variant.print`] and parsed by the [`func@GLib.Variant.parse`] +family of functions. In most cases the style closely resembles the +formatting of literals in Python but there are some additions and +exceptions. + +The functions that deal with `GVariant` text format absolutely always deal +in UTF-8. Conceptually, `GVariant` text format is a string of Unicode +characters, not bytes. Non-ASCII but otherwise printable Unicode characters +are not treated any differently from normal ASCII characters. + +The parser makes two passes. The purpose of the first pass is to determine +the type of the value being parsed. The second pass does the actual parsing. +Based on the fact that all elements in an array have to have the same type, +`GVariant` is able to make some deductions that would not otherwise be +possible. As an example: + + [[1, 2, 3], [4, 5, 6]] + +is parsed as an array of arrays of integers (type `aai`), but + + [[1, 2, 3], [4, 5, 6.0]] + +is parsed as an array of arrays of doubles (type `aad`). + +As another example, `GVariant` is able to determine that + + ["hello", nothing] + +is an array of maybe strings (type `ams`). + +What the parser accepts as valid input is dependent on context. The API +permits for out-of-band type information to be supplied to the parser (which +will change its behaviour). This can be seen in the GSettings and GDBus +command line utilities where the type information is available from the +schema or the remote introspection information. The additional information +can cause parses to succeed when they would not otherwise have been able to +(by resolving ambiguous type information) or can cause them to fail (due to +conflicting type information). Unless stated otherwise, the examples given +in this section assume that no out-of-band type data has been given to the +parser. + +## Syntax Summary + +The following table describes the rough meaning of symbols that may appear +inside GVariant text format. Each symbol is described in detail in its own +section, including usage examples. + +| Symbol | Meaning | +|--------|---------| +| `true`, `false` | [Booleans](#booleans). | +| `""`, `''` | String literal. See [Strings](#strings) below. | +| numbers | See [Numbers](#numbers) below. | +| `()` | [Tuples](#tuples). | +| `[]` | [Arrays](#arrays). | +| `{}` | [Dictionaries and Dictionary Entries](#dictionaries-and-dictionary-entries). | +| `<>` | [Variants](#variants). | +| `just`, `nothing` | [Maybe Types](#maybe-types). | +| `@` | [Type Annotations](#type-annotations). | +| `boolean`, `byte`, `int16`, `uint16`, `int32`, `uint32`, `handle`, `int64`, `uint64`, `double`, `string`, `objectpath`, `signature` | [Type Annotations](#type-annotations) | +| `b""`, `b''` | [Bytestrings](#bytestrings). | +| `%` | [Positional Parameters](#positional-parameters). | + +## Booleans + +The strings `true` and `false` are parsed as booleans. This is the only way +to specify a boolean value. + +## Strings + +Strings literals must be quoted using `""` or `''`. The two are completely +equivalent (except for the fact that each one is unable to contain itself +unescaped). + +Strings are Unicode strings with no particular encoding. For example, to +specify the character `é`, you just write `'é'`. You could also give the +Unicode codepoint of that character (`U+E9`) as the escape sequence +`'\u00e9'`. Since the strings are pure Unicode, you should not attempt to +encode the UTF-8 byte sequence corresponding to the string using escapes; it +won't work and you'll end up with the individual characters corresponding to +each byte. + +Unicode escapes of the form `\uxxxx` and `\Uxxxxxxxx` are supported, in +hexadecimal. The usual control sequence escapes `\a`, `\b`, `\f`, `\n`, +`\r`, `\t` and `\v` are supported. Additionally, a `\` before a newline +character causes the newline to be ignored. Finally, any other character +following `\` is copied literally (for example, `\"` or `\\`) but for +forwards compatibility with future additions you should only use this +feature when necessary for escaping backslashes or quotes. + +The usual octal and hexadecimal escapes `\0nnn` and `\xnn` are not supported +here. Those escapes are used to encode byte values and `GVariant` strings +are Unicode. + +Single-character strings are not interpreted as bytes. Bytes must be +specified by their numerical value. + +## Numbers + +Numbers are given by default as decimal values. Octal and hex values can be +given in the usual way (by prefixing with `0` or `0x`). Note that `GVariant` +considers bytes to be unsigned integers and will print them as a two digit +hexadecimal number by default. + +Floating point numbers can also be given in the usual ways, including +scientific and hexadecimal notations. + +For lack of additional information, integers will be parsed as `int32` +values by default. If the number has a point or an `e` in it, then it will +be parsed as a double precision floating point number by default. If type +information is available (either explicitly or inferred) then that type will +be used instead. + +Some examples: + +`5` parses as the `int32` value five. + +`37.5` parses as a floating point value. + +`3.75e1` parses the same as the value above. + +`uint64 7` parses seven as a `uint64`. See [Type Annotations](#type-annotations). + +## Tuples + +Tuples are formed using the same syntax as Python. Here are some examples: + +`()` parses as the empty tuple. + +`(5,)` is a tuple containing a single value. + +`("hello", 42)` is a pair. Note that values of different types are +permitted. + +## Arrays + +Arrays are formed using the same syntax as Python uses for lists (which is +arguably the term that `GVariant` should have used). Note that, unlike Python +lists, `GVariant` arrays are statically typed. This has two implications. + +First, all items in the array must have the same type. Second, the type of +the array must be known, even in the case that it is empty. This means that +(unless there is some other way to infer it) type information will need to +be given explicitly for empty arrays. + +The parser is able to infer some types based on the fact that all items in +an array must have the same type. See the examples below: + +`[1]` parses (without additional type information) as a one-item array of +signed integers. + +`[1, 2, 3]` parses (similarly) as a three-item array. + +`[1, 2, 3.0]` parses as an array of doubles. This is the most simple case of +the type inferencing in action. + +`[(1, 2), (3, 4.0)]` causes the 2 to also be parsed as a double (but the 1 +and 3 are still integers). + +`["", nothing]` parses as an array of maybe strings. The presence of +"nothing" clearly implies that the array elements are nullable. + +`[[], [""]]` will parse properly because the type of the first (empty) array +can be inferred to be equal to the type of the second array (both are arrays +of strings). + +`[b'hello', []]` looks odd but will parse properly. See +[Bytestrings](#bytestrings). + +And some examples of errors: + +`["hello", 42]` fails to parse due to conflicting types. + +`[]` will fail to parse without additional type information. + +## Dictionaries and Dictionary Entries + +Dictionaries and dictionary entries are both specified using the `{}` +characters. + +The dictionary syntax is more commonly used. This is what the printer elects +to use in the normal case of dictionary entries appearing in an array (AKA +"a dictionary"). The separate syntax for dictionary entries is typically +only used for when the entries appear on their own, outside of an array +(which is valid but unusual). Of course, you are free to use the dictionary +entry syntax within arrays but there is no good reason to do so (and the +printer itself will never do so). Note that, as with arrays, the type of +empty dictionaries must be established (either explicitly or through +inference). + +The dictionary syntax is the same as Python's syntax for dictionaries. Some +examples: + +`@a{sv} {}` parses as the empty dictionary of everyone's favourite type. + +`@a{sv} []` is the same as above (owing to the fact that dictionaries are +really arrays). + +`{1: "one", 2: "two", 3: "three"}` parses as a dictionary mapping integers +to strings. + +The dictionary entry syntax looks just like a pair (2-tuple) that uses +braces instead of parens. The presence of a comma immediately following the +key differentiates it from the dictionary syntax (which features a colon +after the first key). Some examples: + +`{1, "one"}` is a free-standing dictionary entry that can be parsed on its +own or as part of another container value. + +`[{1, "one"}, {2, "two"}, {3, "three"}]` is exactly equivalent to the +dictionary example given above. + +## Variants + +Variants are denoted using angle brackets (aka "XML brackets"), `<>`. They +may not be omitted. + +Using `<>` effectively disrupts the type inferencing that occurs between +array elements. This can have positive and negative effects. + +`[<"hello">, <42>]` will parse whereas `["hello", 42]` would not. + +`[<['']>, <[]>]` will fail to parse even though `[[''], []]` parses +successfully. You would need to specify `[<['']>, <@as []>]`. + +`{"title": <"frobit">, "enabled": , "width": <800>}` is an example of +perhaps the most pervasive use of both dictionaries and variants. + +## Maybe Types + +The syntax for specifying maybe types is inspired by Haskell. + +The null case is specified using the keyword nothing and the non-null case +is explicitly specified using the keyword just. GVariant allows just to be +omitted in every case that it is able to unambiguously determine the +intention of the writer. There are two cases where it must be specified: + +- when using nested maybes, in order to specify the just nothing case +- to establish the nullability of the type of a value without explicitly + specifying its full type + +Some examples: + +`just 'hello'` parses as a non-null nullable string. + +`@ms 'hello'` is the same (demonstrating how just can be dropped if the type is already known). + +`nothing` will not parse without extra type information. + +`@ms nothing` parses as a null nullable string. + +`[just 3, nothing]` is an array of nullable integers + +`[3, nothing]` is the same as the above (demonstrating another place were just can be dropped). + +`[3, just nothing]` parses as an array of maybe maybe integers (type `ammi`). + +## Type Annotations + +Type annotations allow additional type information to be given to the +parser. Depending on the context, this type information can change the +output of the parser, cause an error when parsing would otherwise have +succeeded or resolve an error when parsing would have otherwise failed. + +Type annotations come in two forms: type codes and type keywords. + +Type keywords can be seen as more verbose (and more legible) versions of a +common subset of the type codes. The type keywords `boolean`, `byte`, +`int16`, `uint16`, `int32`, `uint32`, `handle`, `int64`, `uint64`, `double`, +`string`, `objectpath` and literal signature are each exactly equivalent to +their corresponding type code. + +Type codes are an `@` ("at" sign) followed by a definite `GVariant` type +string. Some examples: + +`uint32 5` causes the number to be parsed unsigned instead of signed (the +default). + +`@u 5` is the same + +`objectpath "/org/gnome/xyz"` creates an object path instead of a normal +string + +`@au []` specifies the type of the empty array (which would not parse +otherwise) + +`@ms ""` indicates that a string value is meant to have a maybe type + +## Bytestrings + +The bytestring syntax is a piece of syntactic sugar meant to complement the +bytestring APIs in GVariant. It constructs arrays of non-`NUL` bytes (type +`ay`) with a `NUL` terminator at the end. These are normal C strings with no +particular encoding enforced, so the bytes may not be valid UTF-8. +Bytestrings are a special case of byte arrays; byte arrays (also type 'ay'), +in the general case, can contain a `NUL` byte at any position, and need not +end with a `NUL` byte. + +Bytestrings are specified with either `b""` or `b''`. As with strings, there +is no fundamental difference between the two different types of quotes. + +Bytestrings support the full range of escapes that you would expect (ie: +those supported by [`func@GLib.strcompress`]. This includes the normal control +sequence escapes (as mentioned in the section on strings) as well as octal +and hexadecimal escapes of the forms `\0nnn` and `\xnn`. + +`b'abc'` is equivalent to `[byte 0x61, 0x62, 0x63, 0]`. + +When formatting arrays of bytes, the printer will choose to display the +array as a bytestring if it contains a nul character at the end and no other +nul bytes within. Otherwise, it is formatted as a normal array. + +## Positional Parameters + +Positional parameters are not a part of the normal `GVariant` text format, +but they are mentioned here because they can be used with +[`ctor@GLib.Variant.new_parsed`]. + +A positional parameter is indicated with a `%` followed by any valid +[GVariant Format String](gvariant-format-strings.html). Variable arguments +are collected as specified by the format string and the resulting value is +inserted at the current position. + +This feature is best explained by example: + +```c +char *t = "xyz"; +gboolean en = false; +GVariant *value; + +value = g_variant_new_parsed ("{'title': <%s>, 'enabled': <%b>}", t, en); +``` + +This constructs a dictionary mapping strings to variants (type `a{sv}`) with +two items in it. The key names are parsed from the string and the values for +those keys are taken as variable arguments parameters. + +The arguments are always collected in the order that they appear in the +string to be parsed. Format strings that collect multiple arguments are +permitted, so you may require more varargs parameters than the number of `%` +signs that appear. You can also give format strings that collect no +arguments, but there's no good reason to do so. diff --git a/docs/reference/glib/gvariant-text.xml b/docs/reference/glib/gvariant-text.xml deleted file mode 100644 index 55d476e..0000000 --- a/docs/reference/glib/gvariant-text.xml +++ /dev/null @@ -1,622 +0,0 @@ - - - - - GVariant Text Format - - - GVariant Text Format - textual representation of GVariants - - - - GVariant Text Format - - - This page attempts to document the GVariant text format as produced by - g_variant_print() and parsed by the - g_variant_parse() family of functions. In most - cases the style closely resembles the formatting of literals in Python but there are some additions and - exceptions. - - - - The functions that deal with GVariant text format absolutely always deal in utf-8. Conceptually, GVariant - text format is a string of Unicode characters -- not bytes. Non-ASCII but otherwise printable Unicode - characters are not treated any differently from normal ASCII characters. - - - - The parser makes two passes. The purpose of the first pass is to determine the type of the value being - parsed. The second pass does the actual parsing. Based on the fact that all elements in an array have to - have the same type, GVariant is able to make some deductions that would not otherwise be possible. As an - example: - - [[1, 2, 3], [4, 5, 6]] - - is parsed as an array of arrays of integers (type 'aai'), but - - [[1, 2, 3], [4, 5, 6.0]] - - is parsed as an array of arrays of doubles (type 'aad'). - - - - As another example, GVariant is able to determine that - - ["hello", nothing] - - is an array of maybe strings (type 'ams'). - - - - What the parser accepts as valid input is dependent on context. The API permits for out-of-band type - information to be supplied to the parser (which will change its behaviour). This can be seen in the - GSettings and GDBus command line utilities where the type information is available from the schema or the - remote introspection information. The additional information can cause parses to succeed when they would not - otherwise have been able to (by resolving ambiguous type information) or can cause them to fail (due to - conflicting type information). Unless stated otherwise, the examples given in this section assume that no - out-of-band type data has been given to the parser. - - - - - Syntax Summary - - - The following table describes the rough meaning of symbols that may appear inside GVariant text format. - Each symbol is described in detail in its own section, including usage examples. - - - - - - - - - - - - Symbol - - - - - Meaning - - - - - - - - true, - false - - - - - Booleans. - - - - - - - - "", - '' - - - - - String literal. See Strings below. - - - - - - - - numbers - - - - - See Numbers below. - - - - - - - - () - - - - - Tuples. - - - - - - - - [] - - - - - Arrays. - - - - - - - - {} - - - - - Dictionaries and Dictionary Entries. - - - - - - - - <> - - - - - Variants. - - - - - - - - just, - nothing - - - - - Maybe Types. - - - - - - - - @ - - - - - Type Annotations. - - - - - - - - type keywords - - - - - boolean, - byte, - int16, - uint16, - int32, - uint32, - handle, - int64, - uint64, - double, - string, - objectpath, - signature - - - See Type Annotations below. - - - - - - - - b"", - b'' - - - - - Bytestrings. - - - - - - - - % - - - - - Positional Parameters. - - - - - - - - - Booleans - - The strings true and false are parsed as booleans. This is the only - way to specify a boolean value. - - - - - Strings - - Strings literals must be quoted using "" or ''. The two are - completely equivalent (except for the fact that each one is unable to contain itself unescaped). - - - Strings are Unicode strings with no particular encoding. For example, to specify the character - é, you just write 'é'. You could also give the Unicode codepoint of - that character (U+E9) as the escape sequence '\u00e9'. Since the strings are pure - Unicode, you should not attempt to encode the utf-8 byte sequence corresponding to the string using escapes; - it won't work and you'll end up with the individual characters corresponding to each byte. - - - Unicode escapes of the form \uxxxx and \Uxxxxxxxx are supported, in - hexadecimal. The usual control sequence escapes \a, \b, - \f, \n, \r, \t and - \v are supported. Additionally, a \ before a newline character causes - the newline to be ignored. Finally, any other character following \ is copied literally - (for example, \" or \\) but for forwards compatibility with future - additions you should only use this feature when necessary for escaping backslashes or quotes. - - - The usual octal and hexadecimal escapes \0nnn and \xnn are not - supported here. Those escapes are used to encode byte values and GVariant strings are Unicode. - - - Single-character strings are not interpreted as bytes. Bytes must be specified by their numerical value. - - - - - Numbers - - Numbers are given by default as decimal values. Octal and hex values can be given in the usual way (by - prefixing with 0 or 0x). Note that GVariant considers bytes to be - unsigned integers and will print them as a two digit hexadecimal number by default. - - - Floating point numbers can also be given in the usual ways, including scientific and hexadecimal notations. - - - For lack of additional information, integers will be parsed as int32 values by default. If the number has a - point or an 'e' in it, then it will be parsed as a double precision floating point number by default. If - type information is available (either explicitly or inferred) then that type will be used instead. - - - Some examples: - - - 5 parses as the int32 value five. - - - 37.5 parses as a floating point value. - - - 3.75e1 parses the same as the value above. - - - uint64 7 parses seven as a uint64. - See Type Annotations. - - - - - Tuples - - Tuples are formed using the same syntax as Python. Here are some examples: - - - () parses as the empty tuple. - - - (5,) is a tuple containing a single value. - - - ("hello", 42) is a pair. Note that values of different types are permitted. - - - - - Arrays - - Arrays are formed using the same syntax as Python uses for lists (which is arguably the term that GVariant - should have used). Note that, unlike Python lists, GVariant arrays are statically typed. This has two - implications. - - - First, all items in the array must have the same type. Second, the type of the array must be known, even in - the case that it is empty. This means that (unless there is some other way to infer it) type information - will need to be given explicitly for empty arrays. - - - The parser is able to infer some types based on the fact that all items in an array must have the same type. - See the examples below: - - - [1] parses (without additional type information) as a one-item array of signed integers. - - - [1, 2, 3] parses (similarly) as a three-item array. - - - [1, 2, 3.0] parses as an array of doubles. This is the most simple case of the type - inferencing in action. - - - [(1, 2), (3, 4.0)] causes the 2 to also be parsed as a double (but the 1 and 3 are still - integers). - - - ["", nothing] parses as an array of maybe strings. The presence of - "nothing" clearly implies that the array elements are nullable. - - - [[], [""]] will parse properly because the type of the first (empty) array can be - inferred to be equal to the type of the second array (both are arrays of strings). - - - [b'hello', []] looks odd but will parse properly. - See Bytestrings - - - And some examples of errors: - - - ["hello", 42] fails to parse due to conflicting types. - - - [] will fail to parse without additional type information. - - - - - Dictionaries and Dictionary Entries - - Dictionaries and dictionary entries are both specified using the {} characters. - - - The dictionary syntax is more commonly used. This is what the printer elects to use in the normal case of - dictionary entries appearing in an array (aka "a dictionary"). The separate syntax for dictionary entries - is typically only used for when the entries appear on their own, outside of an array (which is valid but - unusual). Of course, you are free to use the dictionary entry syntax within arrays but there is no good - reason to do so (and the printer itself will never do so). Note that, as with arrays, the type of empty - dictionaries must be established (either explicitly or through inference). - - - The dictionary syntax is the same as Python's syntax for dictionaries. Some examples: - - - @a{sv} {} parses as the empty dictionary of everyone's favourite type. - - - @a{sv} [] is the same as above (owing to the fact that dictionaries are really arrays). - - - {1: "one", 2: "two", 3: "three"} parses as a dictionary mapping integers to strings. - - - The dictionary entry syntax looks just like a pair (2-tuple) that uses braces instead of parens. The - presence of a comma immediately following the key differentiates it from the dictionary syntax (which - features a colon after the first key). Some examples: - - - {1, "one"} is a free-standing dictionary entry that can be parsed on its own or as part - of another container value. - - - [{1, "one"}, {2, "two"}, {3, "three"}] is exactly equivalent to the dictionary example - given above. - - - - - Variants - - Variants are denoted using angle brackets (aka "XML brackets"), <>. They may not - be omitted. - - - Using <> effectively disrupts the type inferencing that occurs between array - elements. This can have positive and negative effects. - - - [<"hello">, <42>] will parse whereas ["hello", 42] would - not. - - - [<['']>, <[]>] will fail to parse even though [[''], []] - parses successfully. You would need to specify [<['']>, <@as []>]. - - - {"title": <"frobit">, "enabled": <true>, "width": <800>} is an example of - perhaps the most pervasive use of both dictionaries and variants. - - - - - Maybe Types - - The syntax for specifying maybe types is inspired by Haskell. - - - The null case is specified using the keyword nothing and the non-null case is explicitly - specified using the keyword just. GVariant allows just to be omitted - in every case that it is able to unambiguously determine the intention of the writer. There are two cases - where it must be specified: - - - - when using nested maybes, in order to specify the just nothing case - - - - to establish the nullability of the type of a value without explicitly specifying its full type - - - - - Some examples: - - - just 'hello' parses as a non-null nullable string. - - - @ms 'hello' is the same (demonstrating how just can be dropped if the type is already - known). - - - nothing will not parse wtihout extra type information. - - - @ms nothing parses as a null nullable string. - - - [just 3, nothing] is an array of nullable integers - - - [3, nothing] is the same as the above (demonstrating another place were - just can be dropped). - - - [3, just nothing] parses as an array of maybe maybe integers (type - 'ammi'). - - - - - Type Annotations - - Type annotations allow additional type information to be given to the parser. Depending on the context, - this type information can change the output of the parser, cause an error when parsing would otherwise have - succeeded or resolve an error when parsing would have otherwise failed. - - - Type annotations come in two forms: type codes and type keywords. - - - Type keywords can be seen as more verbose (and more legible) versions of a common subset of the type codes. - The type keywords boolean, byte, int16, - uint16, int32, uint32, handle, - int64, uint64, double, string, - objectpath and literal signature are each exactly equivalent to their - corresponding type code. - - - Type codes are an @ ("at" sign) followed by a definite GVariant type string. Some - examples: - - - uint32 5 causes the number to be parsed unsigned instead of signed (the default). - - - @u 5 is the same - - - objectpath "/org/gnome/xyz" creates an object path instead of a normal string - - - @au [] specifies the type of the empty array (which would not parse otherwise) - - - @ms "" indicates that a string value is meant to have a maybe type - - - - - Bytestrings - - The bytestring syntax is a piece of syntactic sugar meant to complement the bytestring APIs in GVariant. It - constructs arrays of non-nul bytes (type 'ay') with a nul terminator at the end. These are - normal C strings with no particular encoding enforced, so the bytes may not be valid UTF-8. - Bytestrings are a special case of byte arrays; byte arrays (also type 'ay'), in the general - case, can contain nul at any position, and need not end with nul. - - - Bytestrings are specified with either b"" or b''. As with strings, - there is no fundamental difference between the two different types of quotes. - - - Bytestrings support the full range of escapes that you would expect (ie: those supported by - g_strcompress(). This includes the normal control - sequence escapes (as mentioned in the section on strings) as well as octal and hexadecimal escapes of the - forms \0nnn and \xnn. - - - b'abc' is equivalent to [byte 0x61, 0x62, 0x63, 0]. - - - When formatting arrays of bytes, the printer will choose to display the array as a bytestring if it contains - a nul character at the end and no other nul bytes within. Otherwise, it is formatted as a normal array. - - - - - Positional Parameters - - Positional parameters are not a part of the normal GVariant text format, but they are mentioned here because - they can be used with g_variant_new_parsed(). - - - A positional parameter is indicated with a % followed by any valid - GVariant Format String. Variable arguments are collected as - specified by the format string and the resulting value is inserted at the current position. - - - This feature is best explained by example: - - , 'enabled': <%b>}", t, en);]]> - - This constructs a dictionary mapping strings to variants (type 'a{sv}') with two items in - it. The key names are parsed from the string and the values for those keys are taken as variable arguments - parameters. - - - The arguments are always collected in the order that they appear in the string to be parsed. Format strings - that collect multiple arguments are permitted, so you may require more varargs parameters than the number of - % signs that appear. You can also give format strings that collect no arguments, but - there's no good reason to do so. - - - - diff --git a/docs/reference/glib/gvariant-varargs.xml b/docs/reference/glib/gvariant-varargs.xml deleted file mode 100644 index f60eabb..0000000 --- a/docs/reference/glib/gvariant-varargs.xml +++ /dev/null @@ -1,1178 +0,0 @@ - - - - - GVariant Format Strings - - - GVariant Format Strings - varargs conversion of GVariants - - - - Variable Argument Conversions - - - This page attempts to document how to perform variable argument - conversions with GVariant. - - - Conversions occur according to format strings. A format string is a two-way mapping between a single - GVariant value and one or more C values. - - - A conversion from C values into a GVariant value is made using the - g_variant_new() function. A conversion from a - GVariant into C values is made using the - g_variant_get() function. - - - - - Syntax - - - This section exhaustively describes all possibilities for GVariant format strings. There are no valid forms of - format strings other than those described here. Please note that the format string syntax is likely to expand in the - future. - - - Valid format strings have one of the following forms: - - - - any type string - - - - a type string prefixed with a '@' - - - - - '&s' '&o', '&g', '^as', - '^a&s', '^ao', '^a&o','^ay', - '^&ay', '^aay' or '^a&ay'. - - - - - any format string, prefixed with an 'm' - - - - - a sequence of zero or more format strings, concatenated and enclosed in parentheses - - - - - an opening brace, followed by two format strings, followed by a closing brace (subject to the constraint that the - first format string correspond to a type valid for use as the key type of a dictionary) - - - - - - Symbols - - - The following table describes the rough meaning of symbols that may appear inside a GVariant format string. Each - symbol is described in detail in its own section, including usage examples. - - - - - - - - - - - - Symbol - - - - - Meaning - - - - - - - - - b, y, n, q, i, - u, x, t, h, d - - - - - - Used for building or deconstructing boolean, byte and numeric types. See - Numeric Types below. - - - - - - - - - s, o, g - - - - - - Used for building or deconstructing string types. See - Strings below. - - - - - - - - v - - - - - Used for building or deconstructing variant types. See - Variants below. - - - - - - - - - a - - - - - - Used for building or deconstructing arrays. See - Arrays below. - - - - - - - - - m - - - - - - Used for building or deconstructing maybe types. See - Maybe Types below. - - - - - - - - - () - - - - - - Used for building or deconstructing tuples. See - Tuples below. - - - - - - - - - {} - - - - - - Used for building or deconstructing dictionary entries. See - Dictionaries below. - - - - - - - - - @ - - - - - - Used as a prefix for a GVariant type string (not a prefix for a format string, so @as is - a valid format string but @^as is not). Denotes that a pointer to a - GVariant should be used in place of the normal C type or types. For - g_variant_new() this means that you must pass a - non-NULL (GVariant - *); if it is a floating reference, ownership will be taken, as - if by using g_variant_ref_sink(). - For g_variant_get() this means that you - must pass a pointer to a (GVariant *) for the value to be returned - by reference or NULL to ignore the value. See - GVariant * below. - - - - - - - - - *, ?, r - - - - - - Exactly equivalent to @*, @? and @r. Provided only for - completeness so that all GVariant type strings can be used also as format strings. See GVariant * below. - - - - - - - - & - - - - - Used as a prefix for a GVariant type string (not a prefix for a format string, so &s is - a valid format string but &@s is not). - Denotes that a C pointer to serialized data - should be used in place of the normal C type. See - Pointers below. - - - - - - - - ^ - - - - - Used as a prefix on some specific types of format strings. See - Convenience Conversions below. - - - - - - - - - - Numeric Types - - - Characters: b, y, n, q, - i, u, x, t, h, - d - - - - - Variable argument conversions from numeric types work in the most obvious way possible. Upon encountering one of - these characters, g_variant_new() takes the equivalent C - type as an argument. g_variant_get() takes a pointer to - the equivalent C type (or NULL to ignore the value). - - - - The equivalent C types are as follows: - - - - - - - - - - Character - - - - - Equivalent C type - - - - - - - - b - - - - - - gboolean - - - - - - - - y - - - - - - guchar - - - - - - - - n - - - - - - gint16 - - - - - - - - q - - - - - - guint16 - - - - - - - - i - - - - - - gint32 - - - - - - - - u - - - - - - guint32 - - - - - - - - x - - - - - - gint64 - - - - - - - - t - - - - - - guint64 - - - - - - - - h - - - - - - gint32 - - - - - - - - d - - - - - - gdouble - - - - - - - - - - Note that in C, small integer types in variable argument lists are promoted up to int or unsigned int as appropriate, and - read back accordingly. int is 32 bits on every platform on which GLib is - currently supported. This means that you can use C expressions of type int - with g_variant_new() and format characters - 'b', 'y', 'n', 'q', - 'i', 'u' and 'h'. Specifically, you can use integer - literals with these characters. - - - - When using the 'x' and 't' characters, you must ensure that the value that you - provide is 64 bit. This means that you should use a cast or make use of the - G_GINT64_CONSTANT or - G_GUINT64_CONSTANT macros. - - - - No type promotion occurs when using g_variant_get() since - it operates with pointers. The pointers must always point to a memory region of exactly the correct size. - - - - Examples - - - - - - - Strings - - - Characters: s, o, g - - - - - String conversions occur to and from standard nul-terminated C strings. Upon encountering an - 's', 'o' or 'g' in a format string, - g_variant_new() takes a (const - gchar *) and makes a copy of it. - NULL is not a valid string; use - maybe types to encode that. If the 'o' or - 'g' characters are used, care must be taken to ensure that the passed string is a valid D-Bus - object path or D-Bus type signature, respectively. - - - Upon encounting 's', 'o' or 'g', g_variant_get() takes a pointer to a - (gchar *) (ie: (gchar **)) and - sets it to a newly-allocated copy of the string. It is appropriate to free this copy using - g_free(). - NULL may also be passed to indicate that the value of the - string should be ignored (in which case no copy is made). - - - - Examples - - - - - - - Variants - - - Characters: v - - - - - Upon encountering a 'v', - g_variant_new() takes a (GVariant *). The value of the - GVariant is used as the contents of the variant value. - - - Upon encountering a 'v', g_variant_get() takes a pointer to a - (GVariant *) (ie: (GVariant **) - ). It is set to a new reference to a GVariant instance - containing the contents of the variant value. It is appropriate to free this reference using - g_variant_unref(). - NULL may also be passed to indicate that the value should be - ignored (in which case no new reference is created). - - - - Examples - - - - - - - - Arrays - - - Characters: a - - - - - Upon encountering an 'a' character followed by a type string, - g_variant_new() will take a - (GVariantBuilder *) that has been created as an array builder - for an array of the type given in the type string. The builder will have - g_variant_builder_end() called on it and the - result will be used as the value. As a special exception, if the given type string is a definite type, then - NULL may be given to mean an empty array of that type. - - - - Upon encountering an 'a' character followed by a type string, - g_variant_get() will take a pointer to a - (GVariantIter *) (ie: - (GVariantIter **)). - A new heap-allocated iterator is created and returned, initialised for iterating over the elements of the array. - This iterator should be freed when you are done with it, using - g_variant_iter_free(). - NULL may also be given to indicate that the value of the array - should be ignored. - - - - Examples - - - - - - - Maybe Types - - - Characters: m - - - - Maybe types are handled in two separate ways depending on the format string that follows the - 'm'. The method that is used currently depends entirely on the character immediately following the - 'm'. - - - - The first way is used with format strings starting with 'a', 's', - 'o', 'g', 'v', '@', - '*', '?', 'r', '&', or - '^'. In all of these cases, for non-maybe types, - g_variant_new() takes a pointer to a - non-NULL value and - g_variant_get() returns (by reference) a - non-NULL pointer. When any of these format strings are - prefixed with an 'm', the type of arguments that are collected does not change in any way, but - NULL becomes a permissible value, to indicate the Nothing case. - - - Note that the "special exception" introduced in the array section for constructing empty arrays is ignored - here. Using a NULL pointer with the format string 'mas' constructs - the Nothing value -- not an empty array. - - - The second way is used with all other format strings. For - g_variant_new() an additional - gboolean argument is collected and for - g_variant_get() an additional - (gboolean *). Following this argument, the arguments that are normally - collected for the equivalent non-maybe type will be collected. - - - If FALSE is given to - g_variant_new() then the Nothing value is constructed and - the collected arguments are ignored. Otherwise (if TRUE was - given), the arguments are used in the normal way to create the Just value. - - - If NULL is given to - g_variant_get() then the value is ignored. If a - non-NULL pointer is given then it is used to return by reference - whether the value was Just. In the case that the value was Just, the - gboolean will be set to - TRUE and the value will be stored in the arguments in the usual - way. In the case that the value was Nothing, the gboolean will be set to - FALSE and the arguments will be collected in the normal way - but have their values set to binary zero. - - - - Examples - - - - - - - Tuples - - - Characters: () - - - - - Tuples are handled by handling each item in the tuple, in sequence. Each item is handled in the usual way. - - - - Examples - - - - - - - GVariant * - - - Characters: @, *, ?, r - - - - - Upon encountering a '@' in front of a type string, - g_variant_new() takes a - non-NULL pointer to a - GVariant and uses its value directly instead of collecting arguments to - create the value. The provided GVariant must have a type that matches the - type string following the '@'. '*' is - the same as '@*' (ie: take a GVariant of any type). - '?' is the same as '@?' (ie: take a - GVariant of any basic type). 'r' is the same as - '@r' (ie: take a GVariant of any tuple type). - - - Upon encountering a '@' in front of a type string, - g_variant_get() - takes a pointer to a (GVariant *) (ie: a - (GVariant **)) and sets it to a new reference to a - GVariant containing the value (instead of deconstructing the value into - C types in the usual way). NULL can be given to ignore the - value. '*', '?' and 'r' are handled in a way analogous to - what is stated above. - - - You can always use '*' as an alternative to '?', 'r' or any - use of '@'. Using the other characters where possible is recommended, however, due to the - improvements in type safety and code self-documentation. - - - - Examples - - - - - - - Dictionaries - - - Characters: {} - - - - - Dictionary entries are handled by handling first the key, then the value. Each is handled in the usual way. - - - - Examples - - - - - - To extract data from nested dictionaries you can go through a vardict. - - - - Examples - -, 'max': <%i>}})", - "/object/path", value, max); -{ - GVariant *params; - GVariant *p_brightness; - gchar *obj - gint p_max; - - g_variant_get (data, "(o@a{?*})", &obj, ¶ms); - g_print ("object_path: %s\n", obj); - g_free (obj); - - p_brightness = g_variant_lookup_value (params, "brightness", G_VARIANT_TYPE_VARDICT); - g_variant_lookup (p_brightness, "max", "i", &p_max); - g_print ("max: %d\n", p_max); - g_variant_unref (params); -}]]> - - - - - - Pointers - - - Characters: & - - - - - The '&' character is used to indicate that serialized data should be directly exchanged via a - pointer. - - - Currently, the only use for this character is when it is applied to a string (ie: '&s', - '&o' or '&g'). For - g_variant_new() this has absolutely no effect. The string - is collected and duplicated normally. For g_variant_get() - it means that instead of creating a newly allocated copy of the string, a pointer to the serialized data is - returned. This pointer should not be freed. Validity checks are performed to ensure that the string data will - always be properly nul-terminated. - - - - Examples - - - - - - - Convenience Conversions - - - Characters: ^ - - - - - The '^' character currently supports conversion to and from bytestrings or to and from arrays - of strings or bytestrings. It does not support byte arrays. It has a number of forms. - - - - In all forms, when used with g_variant_new() one - pointer value is collected from the variable arguments and passed to a function (as given in the table below). - The result of that function is used as the value for this position. When used with - g_variant_get() one pointer value is produced by using - the function (given in the table) and returned by reference. - - - - - - - - - - - - - Conversion - - - - - - Used with g_variant_new() - - - - - - - Used with g_variant_get() - - - - - - - - - - ^as - - - - - - equivalent to g_variant_new_strv() - - - - - equivalent to g_variant_dup_strv() - - - - - - - - - ^a&s - - - - - - equivalent to g_variant_get_strv() - - - - - - - - - ^ao - - - - - - equivalent to g_variant_new_objv() - - - - - equivalent to g_variant_dup_objv() - - - - - - - - - ^a&o - - - - - - equivalent to g_variant_get_objv() - - - - - - - - - ^ay - - - - - - equivalent to g_variant_new_bytestring() - - - - - equivalent to g_variant_dup_bytestring() - - - - - - - - - ^&ay - - - - - - equivalent to g_variant_get_bytestring() - - - - - - - - - ^aay - - - - - - equivalent to g_variant_new_bytestring_array() - - - - - equivalent to g_variant_dup_bytestring_array() - - - - - - - - - ^a&ay - - - - - - equivalent to g_variant_get_bytestring_array() - - - - - - - - - - diff --git a/docs/reference/glib/host-utils.md b/docs/reference/glib/host-utils.md new file mode 100644 index 0000000..5a86b25 --- /dev/null +++ b/docs/reference/glib/host-utils.md @@ -0,0 +1,30 @@ +Title: Hostname Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2008 Dan Winship + +# Hostname Utilities + +Functions for manipulating internet hostnames; in particular, for +converting between Unicode and ASCII-encoded forms of +Internationalized Domain Names (IDNs). + +The +[Internationalized Domain Names for Applications (IDNA)](http://www.ietf.org/rfc/rfc3490.txt) +standards allow for the use +of Unicode domain names in applications, while providing +backward-compatibility with the old ASCII-only DNS, by defining an +ASCII-Compatible Encoding of any given Unicode name, which can be +used with non-IDN-aware applications and protocols. (For example, +“Παν語.org” maps to “xn--4wa8awb4637h.org”.) + +## Hostname Conversions + + * [func@GLib.hostname_to_ascii] + * [func@GLib.hostname_to_unicode] + +## Hostname Checks + + * [func@GLib.hostname_is_non_ascii] + * [func@GLib.hostname_is_ascii_encoded] + * [func@GLib.hostname_is_ip_address] + diff --git a/docs/reference/glib/i18n.md b/docs/reference/glib/i18n.md new file mode 100644 index 0000000..7c99be4 --- /dev/null +++ b/docs/reference/glib/i18n.md @@ -0,0 +1,49 @@ +Title: Internationalization + +# Internationalization + +GLib doesn't force any particular localization method upon its users. But +since GLib itself is localized using the `gettext()` mechanism, it seems +natural to offer the de-facto standard `gettext()` support macros in an +easy-to-use form. + +In order to use these macros in an application, you must include +``. For use in a library, you must include `` +after defining the `GETTEXT_PACKAGE` macro suitably for your library: + +```c +#define GETTEXT_PACKAGE "gtk4" +#include +``` + +For an application, note that you also have to call `bindtextdomain()`, +`bind_textdomain_codeset()`, `textdomain()` and `setlocale()` early on in your +`main()` to make `gettext()` work. For example: + +```c +#include +#include + +int +main (int argc, char **argv) +{ + setlocale (LC_ALL, ""); + bindtextdomain (GETTEXT_PACKAGE, DATADIR "/locale"); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + // Rest of your application. +} +``` + +where `DATADIR` is as typically provided by Automake or Meson. + +For a library, you only have to call `bindtextdomain()` and +`bind_textdomain_codeset()` in your initialization function. If your library +doesn't have an initialization function, you can call the functions before +the first translated message. + +The [gettext +manual](http://www.gnu.org/software/gettext/manual/gettext.html#Maintainers) +covers details of how to integrate gettext into a project’s build system and +workflow. diff --git a/docs/reference/glib/logging.md b/docs/reference/glib/logging.md new file mode 100644 index 0000000..c4a7262 --- /dev/null +++ b/docs/reference/glib/logging.md @@ -0,0 +1,137 @@ +Title: Message Logging + +# Message Logging + +The `g_return` family of macros (`g_return_if_fail()`, +`g_return_val_if_fail()`, `g_return_if_reached()`, +`g_return_val_if_reached()`) should only be used for programming errors, a +typical use case is checking for invalid parameters at the beginning of a +public function. They should not be used if you just mean "if (error) +return", they should only be used if you mean "if (bug in program) return". +The program behavior is generally considered undefined after one of these +checks fails. They are not intended for normal control flow, only to give a +perhaps-helpful warning before giving up. + +Structured logging output is supported using `g_log_structured()`. This +differs from the traditional `g_log()` API in that log messages are handled +as a collection of key–value pairs representing individual pieces of +information, rather than as a single string containing all the information +in an arbitrary format. + +The convenience macros `g_info()`, `g_message()`, `g_debug()`, `g_warning()` +and `g_error()` will use the traditional `g_log()` API unless you define the +symbol `G_LOG_USE_STRUCTURED` before including `glib.h`. But note that even +messages logged through the traditional `g_log()` API are ultimatively +passed to `g_log_structured()`, so that all log messages end up in same +destination. If `G_LOG_USE_STRUCTURED` is defined, `g_test_expect_message()` +will become ineffective for the wrapper macros `g_warning()` and friends +(see [Testing for Messages](#testing-for-messages).) + +The support for structured logging was motivated by the following needs +(some of which were supported previously; others weren’t): + +- Support for multiple logging levels. +- Structured log support with the ability to add `MESSAGE_ID`s (see + `g_log_structured()`). +- Moving the responsibility for filtering log messages from the program to + the log viewer — instead of libraries and programs installing log handlers + (with `g_log_set_handler()`) which filter messages before output, all log + messages are outputted, and the log viewer program (such as + [`journalctl`](https://www.freedesktop.org/software/systemd/man/journalctl.html)) + must filter them. This is based on the idea that bugs are sometimes hard + to reproduce, so it is better to log everything possible and then use + tools to analyse the logs than it is to not be able to reproduce a bug to + get additional log data. Code which uses logging in performance-critical + sections should compile out the `g_log_structured()` calls in release + builds, and compile them in in debugging builds. +- A single writer function which handles all log messages in a process, from + all libraries and program code; rather than multiple log handlers with + poorly defined interactions between them. This allows a program to easily + change its logging policy by changing the writer function, for example to + log to an additional location or to change what logging output fallbacks + are used. The log writer functions provided by GLib are exposed publicly + so they can be used from programs’ log writers. This allows log writer + policy and implementation to be kept separate. +- If a library wants to add standard information to all of its log messages + (such as library state) or to redact private data (such as passwords or + network credentials), it should use a wrapper function around its + `g_log_structured()` calls or implement that in the single log writer + function. +- If a program wants to pass context data from a `g_log_structured()` call + to its log writer function so that, for example, it can use the correct + server connection to submit logs to, that user data can be passed as a + zero-length `GLogField` to `g_log_structured_array()`. +- Color output needed to be supported on the terminal, to make reading + through logs easier. + +## Using Structured Logging + +To use structured logging (rather than the old-style logging), either use +the `g_log_structured()` and `g_log_structured_array()` functions; or define +`G_LOG_USE_STRUCTURED` before including any GLib header, and use the +`g_message()`, `g_debug()`, `g_error()` (etc.) macros. + +You do not need to define `G_LOG_USE_STRUCTURED` to use +`g_log_structured()`, but it is a good idea to avoid confusion. + +## Log Domains + +Log domains may be used to broadly split up the origins of log messages. +Typically, there are one or a few log domains per application or library. +`G_LOG_DOMAIN` should be used to define the default log domain for the current +compilation unit — it is typically defined at the top of a source file, or +in the preprocessor flags for a group of source files. + +Log domains must be unique, and it is recommended that they are the +application or library name, optionally followed by a hyphen and a +sub-domain name. For example, `bloatpad` or `bloatpad-io`. + +## Debug Message Output + +The default log functions (`g_log_default_handler()` for the old-style API +and `g_log_writer_default()` for the structured API) both drop debug and +informational messages by default, unless the log domains of those messages +are listed in the `G_MESSAGES_DEBUG` environment variable (or it is set to +`all`). + +It is recommended that custom log writer functions re-use the +`G_MESSAGES_DEBUG` environment variable, rather than inventing a custom one, +so that developers can re-use the same debugging techniques and tools across +projects. Since GLib 2.68, this can be implemented by dropping messages for +which `g_log_writer_default_would_drop()` returns `TRUE`. + +## Testing for Messages + +With the old `g_log()` API, `g_test_expect_message()` and +`g_test_assert_expected_messages()` could be used in simple cases to check +whether some code under test had emitted a given log message. These +functions have been deprecated with the structured logging API, for several +reasons: + +- They relied on an internal queue which was too inflexible for many use + cases, where messages might be emitted in several orders, some messages + might not be emitted deterministically, or messages might be emitted by + unrelated log domains. +- They do not support structured log fields. +- Examining the log output of code is a bad approach to testing it, and + while it might be necessary for legacy code which uses `g_log()`, it + should be avoided for new code using `g_log_structured()`. + +They will continue to work as before if `g_log()` is in use (and +`G_LOG_USE_STRUCTURED` is not defined). They will do nothing if used with +the structured logging API. + +Examining the log output of code is discouraged: libraries should not emit +to stderr during defined behaviour, and hence this should not be tested. If +the log emissions of a library during undefined behaviour need to be tested, +they should be limited to asserting that the library aborts and prints a +suitable error message before aborting. This should be done with +`g_test_trap_assert_stderr()`. + +If it is really necessary to test the structured log messages emitted by a +particular piece of code – and the code cannot be restructured to be more +suitable to more conventional unit testing – you should write a custom log +writer function (see `g_log_set_writer_func()`) which appends all log +messages to a queue. When you want to check the log messages, examine and +clear the queue, ignoring irrelevant log messages (for example, from log +domains other than the one under test). diff --git a/docs/reference/glib/macros.md b/docs/reference/glib/macros.md new file mode 100644 index 0000000..2fea9db --- /dev/null +++ b/docs/reference/glib/macros.md @@ -0,0 +1,896 @@ +Title: Macros + +# Macros + +GLib provides a set of C pre-processor macros and symbols for commonly-used +language and platform features. + +## Platform + +`G_OS_WIN32` +: This macro is defined only on Windows, so you can bracket Windows-specific + code using `#ifdef G_OS_WIN32 ... #endif`. + +`G_OS_UNIX` + +: This macro is defined only on UNIX and UNIX-like systems, so you can bracket + UNIX-specific code in `#ifdef G_OS_UNIX ... #endif`. To detect whether to + compile features that require a specific kernel or operating system, check + for the appropriate OS-specific predefined macros instead, for example: + + - Linux kernel (any libc, including glibc, musl or Android): `#ifdef __linux__` + - Linux kernel and GNU user-space: `#if defined(__linux__) && defined(__GLIBC__)` + - FreeBSD kernel (any libc, including glibc): `#ifdef __FreeBSD_kernel__` + - FreeBSD kernel and user-space: `#ifdef __FreeBSD__` + - Apple operating systems (macOS, iOS, tvOS), regardless of whether + Cocoa/Carbon toolkits are available: `#ifdef __APPLE__` + + See for more. + + +`G_DIR_SEPARATOR` +: The directory separator character. This is `'/'` on UNIX machines and `'\'` under Windows. + +`G_DIR_SEPARATOR_S` +: The directory separator as a string. This is `"/"` on UNIX machines and `"\"` under Windows. + +`G_IS_DIR_SEPARATOR(ch)` +: Checks whether a character is a directory separator. It returns true for `'/'` on UNIX machines and for `'\'` or `'/'` under Windows. Available since 2.6. + +`G_SEARCHPATH_SEPARATOR` +: The search path separator character. This is `':'` on UNIX machines and `';'` under Windows. + +`G_SEARCHPATH_SEPARATOR_S` +: The search path separator as a string. This is `":"` on UNIX machines and `";"` under Windows. + +## Values + +`TRUE` +: Defines the true value for the `gboolean` type. + +`FALSE` +: Defines the false value for the `gboolean` type. + +`NULL` +: Defines the standard `NULL` pointer. + +## Maths + +`MIN(a, b)` +: Calculates the minimum of `a` and `b`. + +`MAX(a, b)` +: Calculates the maximum of `a` and `b`. + +`ABS(value)` + +: Calculates the absolute value of a given numerical value. The absolute value + is simply the number with any negative sign taken away. + + For example, + + - `ABS(-10)` is 10. + - `ABS(10)` is also 10. + + +`CLAMP(value, low, high)` + +: Ensures that a value is between the limits set by `low` and `high`. If `low` is + greater than `high` the result is undefined. + + For example, + + - `CLAMP(5, 10, 15)` is 10. + - `CLAMP(15, 5, 10)` is 10. + - `CLAMP(20, 15, 25)` is 20. + + +`G_APPROX_VALUE(a, b, epsilon)` + +: Evaluates to true if the absolute difference between the given numerical + values `a` and `b` is smaller than `epsilon`, and to false otherwise. + + For example, + + - `G_APPROX_VALUE (5, 6, 2)` evaluates to true + - `G_APPROX_VALUE (3.14, 3.15, 0.001)` evaluates to false + - `G_APPROX_VALUE (n, 0.f, FLT_EPSILON)` evaluates to true if `n` is within + the single precision floating point epsilon from zero + + Available since: 2.58 + + +## Structure Access + +`G_STRUCT_MEMBER(member_type, struct_pointer, offset)` +: Returns a member of a structure at a given offset, using the given type. + +`G_STRUCT_MEMBER_P(struct_pointer, offset)` +: Returns an untyped pointer to a given offset of a struct. + +`G_STRUCT_OFFSET(struct_type, member_name)` +: Returns the offset, in bytes, of a member of a struct. + Consider using standard C `offsetof()`, available since at least C89 + and C++98, in new code (but note that `offsetof()` returns a `size_t` + rather than a `long`). + + +## Array Utilities + +`G_N_ELEMENTS(array)` +: Determines the number of elements in an array. The array must be + declared so the compiler knows its size at compile-time; this + macro will not work on an array allocated on the heap, only static + arrays or arrays on the stack. + + +## Miscellaneous Macros + +These macros provide more specialized features which are not needed so often +by application programmers. + +`G_STMT_START` +: Starts a multi-statement macro block so that it can be used in places + where only one statement is expected by the compiler. + +`G_STMT_END` +: Ends a multi-statement macro block so that it can be used in places + where only one statement is expected by the compiler. + +`G_BEGIN_DECLS` +: Used (along with `G_END_DECLS`) to bracket C header files that may be + included by C++ sources. If the compiler in use is a C++ compiler, starts + an `extern "C"` around the header. + +`G_END_DECLS` +: Used (along with `G_BEGIN_DECLS`) to bracket C header files that may be + included by C++ sources, or compiled by a C++ compiler. If the compiler + in use is a C++ compiler, ends the `extern "C"` block around the header. + + +`G_VA_COPY(ap1, ap2)` + +: Portable way to copy `va_list` variables. + + In order to use this function, you must include `string.h` yourself, + because this macro may use `memmove()` and GLib does not include + `string.h` for you. + + Each invocation of `G_VA_COPY (ap1, ap2)` must be matched with a + corresponding `va_end (ap1)` call in the same function. + + This is equivalent to standard C `va_copy()`, available since C99 + and C++11, which should be preferred in new code. + + +`G_STRINGIFY(macro_or_string)` + +: Accepts a macro or a string and converts it into a string after + preprocessor argument expansion. For example, the following code: + + #define AGE 27 + const gchar *greeting = G_STRINGIFY (AGE) " today!"; + + is transformed by the preprocessor into (code equivalent to): + + const gchar *greeting = "27 today!"; + + +`G_PASTE(identifier1, identifier2)` + +: Yields a new preprocessor pasted identifier `identifier1identifier2` from its expanded + arguments `identifier1` and `identifier2`. For example,the following code: + + #define GET(traveller,method) G_PASTE(traveller_get_, method) (traveller) + const char *name = GET (traveller, name); + const char *quest = GET (traveller, quest); + Color *favourite = GET (traveller, favourite_colour); + + is transformed by the preprocessor into: + + const char *name = traveller_get_name (traveller); + const char *quest = traveller_get_quest (traveller); + Color *favourite = traveller_get_favourite_colour (traveller); + + Available since: 2.20 + + +`G_STATIC_ASSERT(expr)` + +: The `G_STATIC_ASSERT()` macro lets the programmer check a condition at + compile time. The condition needs to be compile time computable. The + macro can be used in any place where a `typedef` is valid. + + A `typedef` is generally allowed in exactly the same places that + a variable declaration is allowed. For this reason, you should + not use `G_STATIC_ASSERT()` in the middle of blocks of code. + + The macro should only be used once per source code line. + + Since: 2.20 + + +`G_STATIC_ASSERT_EXPR(expr)` + +: The `G_STATIC_ASSERT_EXPR()` macro lets the programmer check a condition + at compile time. The condition needs to be compile time computable. + + Unlike `G_STATIC_ASSERT()`, this macro evaluates to an expression + and, as such, can be used in the middle of other expressions. + Its value should be ignored. This can be accomplished by placing + it as the first argument of a comma expression. + + #define ADD_ONE_TO_INT(x) \ + (G_STATIC_ASSERT_EXPR(sizeof (x) == sizeof (int)), ((x) + 1)) + + Since: 2.30 + + +## Compiler + + +`G_GNUC_EXTENSION` +: Expands to `__extension__` when GCC is used as the compiler. This simply + tells GCC not to warn about the following non-standard code when compiling + with the `-pedantic` option. + + +`G_GNUC_CONST` + +: Expands to the GNU C `const` function attribute if the compiler is GCC. + Declaring a function as `const` enables better optimization of calls to + the function. A `const` function doesn't examine any values except its + parameters, and has no effects except its return value. + + Place the attribute after the declaration, just before the semicolon. + + gchar g_ascii_tolower (gchar c) G_GNUC_CONST; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute) for more details. + + A function that has pointer arguments and examines the data pointed to + must not be declared `const`. Likewise, a function that calls a non-`const` + function usually must not be `const`. It doesn't make sense for a `const` + function to return `void`. + + +`G_GNUC_PURE` + +: Expands to the GNU C `pure` function attribute if the compiler is GCC. + Declaring a function as `pure` enables better optimization of calls to + the function. A `pure` function has no effects except its return value + and the return value depends only on the parameters and/or global + variables. + + Place the attribute after the declaration, just before the semicolon. + + gboolean g_type_check_value (const GValue *value) G_GNUC_PURE; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute) for more details. + + +`G_GNUC_UNUSED` + +: Expands to the GNU C `unused` function attribute if the compiler is gcc. + It is used for declaring functions and arguments which may never be used. + It avoids possible compiler warnings. + + For functions, place the attribute after the declaration, just before the + semicolon. For arguments, place the attribute at the beginning of the + argument declaration. + + void my_unused_function (G_GNUC_UNUSED gint unused_argument, + gint other_argument) G_GNUC_UNUSED; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute) for more details. + + +`G_GNUC_MALLOC` + +: Expands to the GNU C `malloc` function attribute if the compiler is GCC. + + Declaring a function as `malloc` enables better optimization of the function, + but must only be done if the allocation behaviour of the function is fully + understood, otherwise miscompilation can result. + + A function can have the `malloc` attribute if it returns a pointer which is + guaranteed to not alias with any other pointer valid when the function + returns, and moreover no pointers to valid objects occur in any storage + addressed by the returned pointer. + + In practice, this means that `G_GNUC_MALLOC` can be used with any function + which returns unallocated or zeroed-out memory, but not with functions which + return initialised structures containing other pointers, or with functions + that reallocate memory. This definition changed in GLib 2.58 to match the + stricter definition introduced around GCC 5. + + Place the attribute after the declaration, just before the semicolon. + + gpointer g_malloc (gsize n_bytes) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-functions-that-behave-like-malloc) + for more details. + + Since: 2.6 + + +`G_GNUC_DEPRECATED` + +: Expands to the GNU C `deprecated` attribute if the compiler is GCC. + It can be used to mark `typedef`s, variables and functions as deprecated. + When called with the `-Wdeprecated-declarations` option, + gcc will generate warnings when deprecated interfaces are used. + + Place the attribute after the declaration, just before the semicolon. + + int my_mistake (void) G_GNUC_DEPRECATED; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute) for more details. + + See also: `G_DEPRECATED` + + Since: 2.2 + + +`G_GNUC_DEPRECATED_FOR(func)` + +: Like `G_GNUC_DEPRECATED`, but names the intended replacement for the + deprecated symbol if the version of gcc in use is new enough to support + custom deprecation messages. + + Place the attribute after the declaration, just before the semicolon. + + int my_mistake (void) G_GNUC_DEPRECATED_FOR(my_replacement); + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute) for more details. + + Note that if `func` is a macro, it will be expanded in the warning message. + You can enclose it in quotes to prevent this. (The quotes will show up + in the warning, but it's better than showing the macro expansion.) + + Since: 2.26 + + +`G_GNUC_NORETURN` + +: Expands to the GNU C `noreturn` function attribute if the compiler is GCC. + It is used for declaring functions which never return. It enables + optimization of the function, and avoids possible compiler warnings. + + Since 2.68, it is recommended that code uses `G_NORETURN` instead of + `G_GNUC_NORETURN`, as that works on more platforms and compilers (in + particular, MSVC and C++11) than `G_GNUC_NORETURN`, which works with GCC and + Clang only. `G_GNUC_NORETURN` continues to work, so has not been deprecated + yet. + + Place the attribute after the declaration, just before the semicolon. + + void g_abort (void) G_GNUC_NORETURN; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute) for more details. + + +`G_GNUC_FALLTHROUGH` + +: Expands to the GNU C `fallthrough` statement attribute if the compiler supports it. + This allows declaring case statement to explicitly fall through in switch + statements. To enable this feature, use `-Wimplicit-fallthrough` during + compilation. + + Put the attribute right before the case statement you want to fall through to. + + switch (foo) + { + case 1: + g_message ("it's 1"); + G_GNUC_FALLTHROUGH; + case 2: + g_message ("it's either 1 or 2"); + break; + } + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#index-fallthrough-statement-attribute) for more details. + + Since: 2.60 + + +`G_GNUC_FORMAT(idx)` + +: Expands to the GNU C `format_arg` function attribute if the compiler + is GCC. This function attribute specifies that a function takes a + format string for a `printf()`, `scanf()`, `strftime()` or `strfmon()` + style function and modifies it, so that the result can be passed to + a `printf()`, `scanf()`, `strftime()` or `strfmon()` style function + (with the remaining arguments to the format function the same as they + would have been for the unmodified string). + + Place the attribute after the function declaration, just before the + semicolon. + + gchar *g_dgettext (gchar *domain_name, gchar *msgid) G_GNUC_FORMAT (2); + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-Wformat-nonliteral-1) for more details. + + +`G_GNUC_NULL_TERMINATED` + +: Expands to the GNU C `sentinel` function attribute if the compiler is GCC. + This function attribute only applies to variadic functions and instructs + the compiler to check that the argument list is terminated with an + explicit `NULL`. + + Place the attribute after the declaration, just before the semicolon. + + gchar *g_strconcat (const gchar *string1, + ...) G_GNUC_NULL_TERMINATED; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-sentinel-function-attribute) for more details + + Since: 2.8 + + +`G_GNUC_WARN_UNUSED_RESULT` + +: Expands to the GNU C `warn_unused_result` function attribute if the compiler + is GCC. This function attribute makes the compiler emit a warning if the + result of a function call is ignored. + + Place the attribute after the declaration, just before the semicolon. + + GList *g_list_append (GList *list, + gpointer data) G_GNUC_WARN_UNUSED_RESULT; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-warn_005funused_005fresult-function-attribute) for more details. + + Since: 2.10 + + +`G_GNUC_NO_INLINE` + +: Expands to the GNU C `noinline` function attribute if the compiler is GCC. + + Declaring a function as `noinline` prevents the function from being + considered for inlining. + + This macro is provided for retro-compatibility and will be eventually + deprecated; `G_NO_INLINE` should be used instead. + + The attribute may be placed before the declaration or definition, + right before the `static` keyword. + + G_GNUC_NO_INLINE + static int + do_not_inline_this (void) + { + // ... + } + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute) + for more details. + + See also: `G_NO_INLINE`, `G_ALWAYS_INLINE`. + + Since: 2.58 + + +`G_GNUC_NO_INSTRUMENT` + +: Expands to the GNU C `no_instrument_function` function attribute if the + compiler is GCC. Functions with this attribute will not be instrumented + for profiling, when the compiler is called with the + `-finstrument-functions` option. + + Place the attribute after the declaration, just before the semicolon. + + int do_uninteresting_things (void) G_GNUC_NO_INSTRUMENT; + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005finstrument_005ffunction-function-attribute) for more details. + + +`G_GNUC_MAY_ALIAS` + +: Expands to the GNU C `may_alias` type attribute if the compiler is GCC. + Types with this attribute will not be subjected to type-based alias + analysis, but are assumed to alias with any other type, just like `char`. + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-may_005falias-type-attribute) for details. + + Since: 2.14 + + +`G_GNUC_FUNCTION` + +: Expands to `""` on all modern compilers, and to `__FUNCTION__` on GCC version 2.x. Don't use it. + + Deprecated: 2.16: Use `G_STRFUNC()` instead + + +`G_GNUC_PRETTY_FUNCTION` + +: Expands to `""` on all modern compilers, and to `__PRETTY_FUNCTION__` on GCC version 2.x. Don't use it. + + Deprecated: 2.16: Use `G_STRFUNC()` instead + + +`G_GNUC_CHECK_VERSION(major, minor)` + +: Expands to a check for a compiler with `__GNUC__` defined and a version + greater than or equal to the major and minor numbers provided. For example, + the following would only match on compilers such as GCC 4.8 or newer. + + #if G_GNUC_CHECK_VERSION(4, 8) + // ... + #endif + + Since: 2.42 + + +`G_GNUC_BEGIN_IGNORE_DEPRECATIONS` + +: Tells GCC (if it is a new enough version) to temporarily stop emitting + warnings when functions marked with `G_GNUC_DEPRECATED` or + `G_GNUC_DEPRECATED_FOR` are called. This is useful for when you have + one deprecated function calling another one, or when you still have + regression tests for deprecated functions. + + Use `G_GNUC_END_IGNORE_DEPRECATIONS` to resume warning again. (If you + are not compiling with `-Wdeprecated-declarations` then neither macro + has any effect.) + + This macro can be used either inside or outside of a function body, + but must appear on a line by itself. + + static void + test_deprecated_function (void) + { + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + g_assert_cmpint (my_mistake (), ==, 42); + G_GNUC_END_IGNORE_DEPRECATIONS + } + + Both this macro and the corresponding `G_GNUC_END_IGNORE_DEPRECATIONS` + are considered statements, so they should not be used around branching + or loop conditions; for instance, this use is invalid: + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + if (check == some_deprecated_function ()) + G_GNUC_END_IGNORE_DEPRECATIONS + { + do_something (); + } + + and you should move the deprecated section outside the condition + + // Solution A + some_data_t *res; + + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + res = some_deprecated_function (); + G_GNUC_END_IGNORE_DEPRECATIONS + + if (check == res) + { + do_something (); + } + + // Solution B + G_GNUC_BEGIN_IGNORE_DEPRECATIONS + if (check == some_deprecated_function ()) + { + do_something (); + } + G_GNUC_END_IGNORE_DEPRECATIONS + + Since: 2.32 + + +`G_GNUC_END_IGNORE_DEPRECATIONS` + +: Undoes the effect of `G_GNUC_BEGIN_IGNORE_DEPRECATIONS`, telling + GCC to resume outputting warnings again (assuming those warnings + had been enabled to begin with). + + This macro can be used either inside or outside of a function body, + but must appear on a line by itself. + + Since: 2.32 + + +`G_C_STD_VERSION` + +: The C standard version the code is compiling against, it's normally + defined with the same value of `__STDC_VERSION__` for C standard + compatible compilers, while it uses the lowest standard version + in pure MSVC, given that in such compiler the definition depends on + a compilation flag. + + This is granted to be undefined when compiling with a C++ compiler. + + See also: `G_C_STD_CHECK_VERSION` and `G_CXX_STD_VERSION` + + Since: 2.76 + + +`G_C_STD_CHECK_VERSION(version)` + +: Macro to check if the current compiler supports a specified version + of the C standard. Such value must be numeric and can be provided both + in the short form for the well-known versions (e.g. `90`, `99`...) or in + the complete form otherwise (e.g. `199000L`, `199901L`, `205503L`...). + + When a C++ compiler is used, the macro is defined and evaluates to false. + + This value is compared against `G_C_STD_VERSION`. + + #if G_C_STD_CHECK_VERSION(17) + // ... + #endif + + See also: `G_CXX_STD_CHECK_VERSION` + + Since: 2.76 + + +`G_CXX_STD_VERSION` + +: The C++ standard version the code is compiling against, it's defined + with the same value of `__cplusplus` for C++ standard compatible + compilers, while it uses `_MSVC_LANG` in MSVC, given that the + standard definition depends on a compilation flag in such compiler. + + This is granted to be undefined when not compiling with a C++ compiler. + + See also: `G_CXX_STD_CHECK_VERSION` and `G_C_STD_VERSION` + + Since: 2.76 + + +`G_CXX_STD_CHECK_VERSION(version)` + +: Macro to check if the current compiler supports a specified @version + of the C++ standard. Such value must be numeric and can be provided both + in the short form for the well-known versions (e.g. `11`, `17`...) or in + the complete form otherwise (e.g. `201103L`, `201703L`, `205503L`...). + + When a C compiler is used, the macro evaluates to false. + + This value is compared against `G_CXX_STD_VERSION`. + + #if G_CXX_STD_CHECK_VERSION(20) + // ... + #endif + + See also: `G_C_STD_CHECK_VERSION` + + Since: 2.76 + + +`G_LIKELY(expr)` + +: Hints the compiler that the expression is likely to evaluate to + a true value. The compiler may use this information for optimizations. + + if (G_LIKELY (random () != 1)) + g_print ("not one"); + + Since: 2.2 + + +`G_UNLIKELY(expr)` + +: Hints the compiler that the expression is unlikely to evaluate to + a true value. The compiler may use this information for optimizations. + + if (G_UNLIKELY (random () == 1)) + g_print ("a random one"); + + Since: 2.2 + + +`G_ALIGNOF(type)` + +: Evaluates to the minimal alignment required by the platform ABI for values + of the given type. The address of a variable or struct member of the given + type must always be a multiple of this alignment. For example, most + platforms require int variables to be aligned at a 4-byte boundary, so + `G_ALIGNOF (int)` is 4 on most platforms. + + Note this is not necessarily the same as the value returned by GCC’s + `__alignof__` operator, which returns the preferred alignment for a type. + The preferred alignment may be a stricter alignment than the minimal + alignment. + + Since: 2.60 + + +`G_SIZEOF_MEMBER(struct_type, member_name)` + +: Evaluates to the size in bytes of `member_name` in the struct definition + without having a declared instance of `struct_type`. + + Since: 2.64 + + +`G_NORETURN` + +: Expands to the GNU C or MSVC `noreturn` function attribute depending on + the compiler. It is used for declaring functions which never return. + Enables optimization of the function, and avoids possible compiler warnings. + + Note that `G_NORETURN` supersedes the previous `G_GNUC_NORETURN` macro, which + will eventually be deprecated. `G_NORETURN` supports more platforms. + + Place the attribute before the function declaration as follows: + + G_NORETURN void g_abort (void); + + Since: 2.68 + + +`G_NORETURN_FUNCPTR` + +: Expands to the GNU C or MSVC `noreturn` function attribute depending on + the compiler. It is used for declaring function pointers which never return. + Enables optimization of the function, and avoids possible compiler warnings. + + Place the attribute before the function declaration as follows: + + G_NORETURN_FUNCPTR void (*funcptr) (void); + + Note that if the function is not a function pointer, you can simply use + the `G_NORETURN` macro as follows: + + G_NORETURN void g_abort (void); + + Since: 2.68 + + +`G_ALWAYS_INLINE` + +: Expands to the GNU C `always_inline` or MSVC `__forceinline` function + attribute depending on the compiler. It is used for declaring functions + as always inlined, ignoring the compiler optimization levels. + + The attribute may be placed before the declaration or definition, + right before the `static` keyword. + + G_ALWAYS_INLINE + static int + do_inline_this (void) + { + // ... + } + + See the [GNU C documentation](https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute) + and the [MSVC documentation](https://docs.microsoft.com/en-us/visualstudio/misc/inline-inline-forceinline) + for more details. + + Since: 2.74 + + +`G_NO_INLINE` + +: Expands to the GNU C or MSVC `noinline` function attribute + depending on the compiler. It is used for declaring functions + preventing from being considered for inlining. + + Note that `G_NO_INLINE` supersedes the previous `G_GNUC_NO_INLINE` + macro, which will eventually be deprecated. `G_NO_INLINE` supports + more platforms. + + The attribute may be placed before the declaration or definition, + right before the `static` keyword. + + G_NO_INLINE + static int + do_not_inline_this (void) + { + // ... + } + + Since: 2.74 + + +`G_STRLOC` +: Expands to a string identifying the current code position. + +`G_STRFUNC` +: Expands to a string identifying the current function. Since: 2.4 + +`G_GNUC_INTERNAL` + +: This attribute can be used for marking library functions as being used + internally to the library only, which may allow the compiler to handle + function calls more efficiently. Note that static functions do not need + to be marked as internal in this way. See the GNU C documentation for + details. + + When using a compiler that supports the GNU C hidden visibility attribute, + this macro expands to `__attribute__((visibility("hidden")))`. + When using the Sun Studio compiler, it expands to `__hidden`. + + Note that for portability, the attribute should be placed before the + function declaration. While GCC allows the macro after the declaration, + Sun Studio does not. + + G_GNUC_INTERNAL + void _g_log_fallback_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer unused_data); + + Since: 2.6 + + +`G_HAVE_GNUC_VISIBILITY` +: Defined to 1 if GCC-style visibility handling is supported. + + +## Deprecation + + +`G_DEPRECATED` + +: This macro is similar to `G_GNUC_DEPRECATED`, and can be used to mark + functions declarations as deprecated. Unlike `G_GNUC_DEPRECATED`, it is + meant to be portable across different compilers and must be placed + before the function declaration. + + G_DEPRECATED + int my_mistake (void); + + Since: 2.32 + + +`G_DEPRECATED_FOR(f)` + +: This macro is similar to `G_GNUC_DEPRECATED_FOR`, and can be used to mark + functions declarations as deprecated. Unlike `G_GNUC_DEPRECATED_FOR`, it + is meant to be portable across different compilers and must be placed + before the function declaration. + + G_DEPRECATED_FOR(my_replacement) + int my_mistake (void); + + Since: 2.32 + + +`G_UNAVAILABLE(major, minor)` + +: This macro can be used to mark a function declaration as unavailable. + It must be placed before the function declaration. Use of a function + that has been annotated with this macros will produce a compiler warning. + + Since: 2.32 + + +`GLIB_DISABLE_DEPRECATION_WARNINGS` +: A macro that should be defined before including the `glib.h` header. + If it is defined, no compiler warnings will be produced for uses + of deprecated GLib APIs. + + +## Version checking + +`GLIB_MAJOR_VERSION` + +: A macro that evaluates to the major component of the version of GLib, + e.g. `1` for version `1.2.3`. + + +`GLIB_MINOR_VERSION` + +: A macro that evaluates to the minor component of the version of GLib, + e.g. `2` for version `1.2.3`. + + +`GLIB_MICRO_VERSION` + +: A macro that evaluates to the micro component of the version of GLib, + e.g. `3` for version `1.2.3`. + + +`GLIB_CHECK_VERSION (major, minor, micro)` + +: A macro that evaluates to true if the version of GLib is newer than + the given version tuple. diff --git a/docs/reference/glib/main-loop.md b/docs/reference/glib/main-loop.md new file mode 100644 index 0000000..b89bc07 --- /dev/null +++ b/docs/reference/glib/main-loop.md @@ -0,0 +1,118 @@ +Title: The Main Event Loop + +# The Main Event Loop + +The main event loop manages all the available sources of events for GLib and +GTK applications. These events can come from any number of different types +of sources such as file descriptors (plain files, pipes or sockets) and +timeouts. New types of event sources can also be added using +`g_source_attach()`. + +To allow multiple independent sets of sources to be handled in different +threads, each source is associated with a `GMainContext`. A `GMainContext` +can only be running in a single thread, but sources can be added to it and +removed from it from other threads. All functions which operate on a +`GMainContext` or a built-in `GSource` are thread-safe. + +Each event source is assigned a priority. The default priority, +`G_PRIORITY_DEFAULT`, is 0. Values less than 0 denote higher priorities. +Values greater than 0 denote lower priorities. Events from high priority +sources are always processed before events from lower priority sources. + +Idle functions can also be added, and assigned a priority. These will be run +whenever no events with a higher priority are ready to be processed. + +The `GMainLoop` data type represents a main event loop. A GMainLoop is +created with `g_main_loop_new()`. After adding the initial event sources, +`g_main_loop_run()` is called. This continuously checks for new events from +each of the event sources and dispatches them. Finally, the processing of an +event from one of the sources leads to a call to `g_main_loop_quit()` to +exit the main loop, and `g_main_loop_run()` returns. + +It is possible to create new instances of `GMainLoop` recursively. This is +often used in GTK applications when showing modal dialog boxes. Note that +event sources are associated with a particular `GMainContext`, and will be +checked and dispatched for all main loops associated with that GMainContext. + +Libraries may contain wrappers of some of these functions, e.g. +`gtk_main()`, `gtk_main_quit()` and `gtk_events_pending()`. + +## Creating new source types + +One of the unusual features of the `GMainLoop` functionality is that new +types of event source can be created and used in addition to the builtin +type of event source. A new event source type is used for handling GDK +events. A new source type is created by "deriving" from the `GSource` +structure. The derived type of source is represented by a structure that has +the `GSource` structure as a first element, and other elements specific to +the new source type. To create an instance of the new source type, call +`g_source_new()` passing in the size of the derived structure and a table of +functions. These `GSourceFuncs` determine the behavior of the new source +type. + +New source types basically interact with the main context in two ways. Their +prepare function in `GSourceFuncs` can set a timeout to determine the +maximum amount of time that the main loop will sleep before checking the +source again. In addition, or as well, the source can add file descriptors +to the set that the main context checks using `g_source_add_poll()`. + +## Customizing the main loop iteration + +Single iterations of a `GMainContext` can be run with +`g_main_context_iteration()`. In some cases, more detailed control of +exactly how the details of the main loop work is desired, for instance, when +integrating the `GMainLoop` with an external main loop. In such cases, you +can call the component functions of `g_main_context_iteration()` directly. +These functions are `g_main_context_prepare()`, `g_main_context_query()`, +`g_main_context_check()` and `g_main_context_dispatch()`. + +## State of a Main Context + +The operation of these functions can best be seen in terms of a state +diagram, as shown in this image. + +![](mainloop-states.gif) + +On UNIX, the GLib mainloop is incompatible with `fork()`. Any program using +the mainloop must either `exec()` or `exit()` from the child without +returning to the mainloop. + +## Memory management of sources + +There are two options for memory management of the user data passed to a +`GSource` to be passed to its callback on invocation. This data is provided +in calls to `g_timeout_add()`, `g_timeout_add_full()`, `g_idle_add()`, etc. +and more generally, using `g_source_set_callback()`. This data is typically +an object which ‘owns’ the timeout or idle callback, such as a widget or a +network protocol implementation. In many cases, it is an error for the +callback to be invoked after this owning object has been destroyed, as that +results in use of freed memory. + +The first, and preferred, option is to store the source ID returned by +functions such as `g_timeout_add()` or `g_source_attach()`, and explicitly +remove that source from the main context using `g_source_remove()` when the +owning object is finalized. This ensures that the callback can only be +invoked while the object is still alive. + +The second option is to hold a strong reference to the object in the +callback, and to release it in the callback’s `GDestroyNotify`. This ensures +that the object is kept alive until after the source is finalized, which is +guaranteed to be after it is invoked for the final time. The +`GDestroyNotify` is another callback passed to the ‘full’ variants of +`GSource` functions (for example, `g_timeout_add_full()`). It is called when +the source is finalized, and is designed for releasing references like this. + +One important caveat of this second approach is that it will keep the object +alive indefinitely if the main loop is stopped before the `GSource` is +invoked, which may be undesirable. + +## Tutorial + +`GMainContext` is complicated, and can be particularly intimidating for +developers new to working with GLib. Unfortunately, improper use of +`GMainContext` often results in bugs that may be difficult to debug. The +[Main Contexts tutorial](https://developer.gnome.org/documentation/tutorials/main-contexts.html) +provides valuable guidance for developers working with `GMainContext` +and is highly recommended reading. In particular, the section +[Using GMainContext in a Library](https://developer.gnome.org/documentation/tutorials/main-contexts.html#using-gmaincontext-in-a-library) +documents several pitfalls that library authors should avoid. diff --git a/docs/reference/glib/markup.md b/docs/reference/glib/markup.md new file mode 100644 index 0000000..edd3ec4 --- /dev/null +++ b/docs/reference/glib/markup.md @@ -0,0 +1,50 @@ +Title: Simple XML Subset Parser +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2011, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2012 David King + +# Simple XML Subset Parser + +The "GMarkup" parser is intended to parse a simple markup format +that's a subset of XML. This is a small, efficient, easy-to-use +parser. It should not be used if you expect to interoperate with +other applications generating full-scale XML, and must not be used if you +expect to parse untrusted input. However, it's very useful for application +data files, config files, etc. where you know your application will be the +only one writing the file. + +Full-scale XML parsers should be able to parse the subset used by +GMarkup, so you can easily migrate to full-scale XML at a later +time if the need arises. + +GMarkup is not guaranteed to signal an error on all invalid XML; +the parser may accept documents that an XML parser would not. +However, XML documents which are not well-formed (which is a +weaker condition than being valid. See the +[XML specification](http://www.w3.org/TR/REC-xml/) +for definitions of these terms.) are not considered valid GMarkup +documents. + +## Simplifications to XML + +The simplifications compared to full XML include: + + - Only UTF-8 encoding is allowed + - No user-defined entities + - Processing instructions, comments and the doctype declaration + are "passed through" but are not interpreted in any way + - No DTD or validation + +The markup format does support: + + - Elements + - Attributes + - 5 standard entities: `&` `<` `>` `"` `'` + - Character references + - Sections marked as CDATA + +## An example parser + +Here is an example for a markup parser: +[markup-example.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/markup-example.c) + diff --git a/docs/reference/glib/memory-slices.md b/docs/reference/glib/memory-slices.md new file mode 100644 index 0000000..63dc417 --- /dev/null +++ b/docs/reference/glib/memory-slices.md @@ -0,0 +1,58 @@ +Title: Memory Slices + +# Memory Slices + +GSlice was a space-efficient and multi-processing scalable way to allocate +equal sized pieces of memory. Since GLib 2.76, its implementation has been +removed and it calls `g_malloc()` and `g_free()`, because the performance of the +system-default allocators has improved on all platforms since GSlice was +written. + +The GSlice APIs have not been deprecated, as they are widely in use and doing +so would be very disruptive for little benefit. + +New code should be written using [`func@GLib.new`]/[`func@GLib.malloc`] and +[`func@GLib.free`]. There is no particular benefit in porting existing code away +from `g_slice_new()`/`g_slice_free()` unless it’s being rewritten anyway. + +Here is an example for using the slice allocator: + +```c +gchar *mem[10000]; +gint i; + +// Allocate 10000 blocks. +for (i = 0; i < 10000; i++) + { + mem[i] = g_slice_alloc (50); + + // Fill in the memory with some junk. + for (j = 0; j < 50; j++) + mem[i][j] = i * j; + } + +// Now free all of the blocks. +for (i = 0; i < 10000; i++) + g_slice_free1 (50, mem[i]); +``` + +And here is an example for using the using the slice allocator with data +structures: + +```c +GRealArray *array; + +// Allocate one block, using the g_slice_new() macro. +array = g_slice_new (GRealArray); + +// We can now use array just like a normal pointer to a structure. +array->data = NULL; +array->len = 0; +array->alloc = 0; +array->zero_terminated = (zero_terminated ? 1 : 0); +array->clear = (clear ? 1 : 0); +array->elt_size = elt_size; + +// We can free the block, so it can be reused. +g_slice_free (GRealArray, array); +``` diff --git a/docs/reference/glib/memory.md b/docs/reference/glib/memory.md new file mode 100644 index 0000000..d50f4f6 --- /dev/null +++ b/docs/reference/glib/memory.md @@ -0,0 +1,99 @@ +Title: Memory Allocation +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2000, 2019 Red Hat, Inc. +SPDX-FileCopyrightText: 2007 Emmanuele Bassi +SPDX-FileCopyrightText: 2018 Pavlo Solntsev +SPDX-FileCopyrightText: 2020 Endless Mobile, Inc. + +# Memory Allocation + +These functions provide support for allocating and freeing memory. + +If any call to allocate memory using functions [func@GLib.new], +[func@GLib.new0], [func@GLib.renew], [func@GLib.malloc], [func@GLib.malloc0], +[func@GLib.malloc0_n], [func@GLib.realloc] and [func@GLib.realloc_n] +fails, the application is terminated. This also means that there is no +need to check if the call succeeded. + +On the other hand, the `g_try_…()` family of functions returns `NULL` on failure +that can be used as a check for unsuccessful memory allocation. The application +is not terminated in this case. + +As all GLib functions and data structures use [func@GLib.malloc] internally, +unless otherwise specified, any allocation failure will result in the +application being terminated. + +It’s important to match [func@GLib.malloc] (and wrappers such as +[func@GLib.new]) with [func@GLib.free], [func@GLib.slice_alloc] (and wrappers +such as [func@GLib.slice_new]) with [func@GLib.slice_free], plain +[`malloc()`](man:malloc(3)) with [`free()`](man:free(3)), and (if you’re using +C++) `new` with `delete` and `new[]` with `delete[]`. Otherwise bad things can +happen, since these allocators may use different memory pools (and +`new`/`delete` call constructors and destructors). + +Since GLib 2.46, [func@GLib.malloc] is hardcoded to always use the system malloc +implementation. + +## Struct Allocations + + * [func@GLib.new] + * [func@GLib.new0] + * [func@GLib.renew] + * [func@GLib.try_new] + * [func@GLib.try_new0] + * [func@GLib.try_renew] + +## Block Allocations + + * [func@GLib.malloc] + * [func@GLib.malloc0] + * [func@GLib.realloc] + * [func@GLib.try_malloc] + * [func@GLib.try_malloc0] + * [func@GLib.try_realloc] + * [func@GLib.malloc_n] + * [func@GLib.malloc0_n] + * [func@GLib.realloc_n] + * [func@GLib.try_malloc_n] + * [func@GLib.try_malloc0_n] + * [func@GLib.try_realloc_n] + +## Free Functions + + * [func@GLib.free] + * [func@GLib.free_sized] + * [func@GLib.clear_pointer] + * [func@GLib.steal_pointer] + +In addition, the `g_mem_gc_friendly` exported variable will be true if GLib has +been [run with `G_DEBUG=gc-friendly`](running.html#environment-variables). If +so, memory to be freed will be cleared to zero before being freed. + +## Stack Allocations + + * [func@GLib.alloca] + * [func@GLib.alloca0] + * [func@GLib.newa] + * [func@GLib.newa0] + +## Aligned Allocations + + * [func@GLib.aligned_alloc] + * [func@GLib.aligned_alloc0] + * [func@GLib.aligned_free] + * [func@GLib.aligned_free_sized] + +## Copies and Moves + + * [func@GLib.memmove] + * [func@GLib.memdup2] + +## Deprecated API + + * [func@GLib.memdup] + * [struct@GLib.MemVTable] + * [func@GLib.mem_set_vtable] + * [func@GLib.mem_is_system_malloc] + * `glib_mem_profiler_table` exported variable + * [func@GLib.mem_profile] + diff --git a/docs/reference/glib/meson.build b/docs/reference/glib/meson.build index 3cfff2f..1777e53 100644 --- a/docs/reference/glib/meson.build +++ b/docs/reference/glib/meson.build @@ -1,124 +1,29 @@ -if get_option('gtk_doc') - subdir('xml') - ignore_headers = [ - 'gallocator.h', - 'gdatasetprivate.h', - 'glibintl.h', - 'gbsearcharray.h', - 'glib-private.h', - 'gmoduleconf.h', - 'grcboxprivate.h', - 'gstdioprivate.h', - 'gthreadprivate.h', - 'gunibreak.h', - 'gunicomp.h', - 'gunidecomp.h', - 'gunichartables.h', - 'glib_probes.h', - 'glib_trace.h', - 'libcharset.h', - 'gdebug.h', - 'gprintfint.h', - 'gmirroringtable.h', - 'gscripttable.h', - 'gtrace-private.h', - 'glib-mirroring-tab', - 'gnulib', - 'gbytesprivate.h', - 'gvariant-internal.h', - 'gvariant-serialiser.h', - 'gvariant-core.h', - 'gvarianttypeinfo.h', - 'gwakeup.h', - 'gtranslit-data.h', - 'glib-init.h', - 'gconstructor.h', - 'valgrind.h', - 'gutilsprivate.h', - 'gvalgrind.h', - 'dirent.h', - 'glib-unixprivate.h', - 'glib-visibility.h', - 'gmodule-visibility.h', - ] - - docpath = join_paths(glib_datadir, 'gtk-doc', 'html') - version_conf = configuration_data() - version_conf.set('GLIB_VERSION', meson.project_version()) - configure_file( - input: 'version.xml.in', - output: 'version.xml', - configuration: version_conf - ) - - configure_file( - input: 'glib-sections.txt.in', - output: 'glib-sections.txt', - command: [gen_visibility_macros, meson.project_version(), 'doc-sections', '@INPUT@', '@OUTPUT@'], - ) - - gnome.gtkdoc('glib', - main_xml : 'glib-docs.xml', - namespace : 'g', - mode : 'none', - src_dir : [ 'glib', 'gmodule' ], - dependencies : libglib_dep, - scan_args : [ - '--ignore-decorators=' + ignore_decorators + '|' + ignore_decorators.replace('GLIB', 'GMODULE'), - '--ignore-headers=' + ' '.join(ignore_headers), - ], - content_files : [ - 'cross.xml', - 'running.xml', - 'building.xml', - 'changes.xml', - 'compiling.xml', - 'programming.xml', - 'resources.xml', - 'regex-syntax.xml', - 'glib-gettextize.xml', - 'gtester.xml', - 'gtester-report.xml', - 'gvariant-varargs.xml', - 'gvariant-text.xml', - ], - expand_content_files : [ - 'compiling.xml', - ], - html_assets : [ - 'file-name-encodings.png', - 'mainloop-states.gif', - 'Sorted_binary_tree_breadth-first_traversal.svg', - 'Sorted_binary_tree_inorder.svg', - 'Sorted_binary_tree_postorder.svg', - 'Sorted_binary_tree_preorder.svg', - ], - fixxref_args: [ - '--html-dir=' + docpath, - ], - install: true, - check: true) -endif - -if get_option('man') +if get_option('man-pages').enabled() manpages = ['glib-gettextize', 'gtester', 'gtester-report'] foreach page : manpages custom_target(page + '-man', - input: page + '.xml', + input: page + '.rst', output: page + '.1', - command: xsltproc_command, + command: [ + rst2man, + rst2man_flags, + '@INPUT@', + ], + capture: true, install: true, - install_dir: man1_dir) + install_dir: man1_dir, + install_tag: 'doc', + ) endforeach endif -if get_option('gtk_doc') +if get_option('documentation') # GVariant specification is currently standalone rst2html5 = find_program('rst2html5', 'rst2html5.py', required: false) if rst2html5.found() - spec_path = glib_datadir / 'doc' / 'glib-2.0' + spec_path = docs_dir figures = files( 'gvariant-byte-boundaries.svg', @@ -147,3 +52,118 @@ if get_option('gtk_doc') ) endif endif + +if get_option('documentation') and enable_gir + expand_content_files = [ + 'atomic.md', + 'base64.md', + 'building.md', + 'character-set.md', + 'checked-math.md', + 'compiling.md', + 'cross-compiling.md', + 'datalist-and-dataset.md', + 'error-reporting.md', + 'file-utils.md', + 'gvariant-format-strings.md', + 'gvariant-text-format.md', + 'i18n.md', + 'logging.md', + 'main-loop.md', + 'memory.md', + 'memory-slices.md', + 'numerical.md', + 'random.md', + 'reference-counting.md', + 'running.md', + 'testing.md', + 'threads.md', + 'threads-deprecated.md', + 'markup.md', + 'misc-utils.md', + 'goption.md', + 'host-utils.md', + 'data-structures.md', + 'programming.md', + 'resources.md', + 'shell.md', + 'spawn.md', + 'string-utils.md', + 'types.md', + 'unicode.md', + 'uuid.md', + 'version.md', + 'warnings.md', + ] + expand_content_unix_files = [ + 'unix.md', + ] + expand_content_win32_files = [ + 'windows.md', + ] + + glib_toml = configure_file(input: 'glib.toml.in', output: 'glib.toml', configuration: toml_conf) + + custom_target('glib-docs', + input: [ glib_toml, glib_gir[0] ], + output: 'glib', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + + if host_system == 'windows' + glib_win32_toml = configure_file(input: 'glib-win32.toml.in', output: 'glib-win32.toml', configuration: toml_conf) + + custom_target('glib-win32-docs', + input: [ glib_win32_toml, glib_win32_gir[0] ], + output: 'glib-win32', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_win32_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + else + glib_unix_toml = configure_file(input: 'glib-unix.toml.in', output: 'glib-unix.toml', configuration: toml_conf) + + custom_target('glib-unix-docs', + input: [ glib_unix_toml, glib_unix_gir[0] ], + output: 'glib-unix', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_unix_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) + endif +endif diff --git a/docs/reference/glib/misc-utils.md b/docs/reference/glib/misc-utils.md new file mode 100644 index 0000000..301c8d0 --- /dev/null +++ b/docs/reference/glib/misc-utils.md @@ -0,0 +1,113 @@ +Title: Miscellaneous Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2000 Red Hat, Inc. + +# Miscellaneous Utilities + +These are portable utility functions. + +## Application Name and Environment + +* [func@GLib.get_application_name] +* [func@GLib.set_application_name] +* [func@GLib.get_prgname] +* [func@GLib.set_prgname] +* [func@GLib.get_environ] +* [func@GLib.environ_getenv] +* [func@GLib.environ_setenv] +* [func@GLib.environ_unsetenv] +* [func@GLib.getenv] +* [func@GLib.setenv] +* [func@GLib.unsetenv] +* [func@GLib.listenv] +* [func@GLib.get_user_name] +* [func@GLib.get_real_name] + +## System Directories + +* [func@GLib.get_user_cache_dir] +* [func@GLib.get_user_data_dir] +* [func@GLib.get_user_config_dir] +* [func@GLib.get_user_state_dir] +* [func@GLib.get_user_runtime_dir] +* [func@GLib.get_user_special_dir] +* [func@GLib.get_system_data_dirs] +* [func@GLib.get_system_config_dirs] +* [func@GLib.reload_user_special_dirs_cache] + +## OS Info + +Information about the current OS can be retrieved by calling +[func@GLib.get_os_info] and passing it one of the following keys (this list may +grow in future): + + * `G_OS_INFO_KEY_NAME` + * `G_OS_INFO_KEY_PRETTY_NAME` + * `G_OS_INFO_KEY_VERSION` + * `G_OS_INFO_KEY_VERSION_CODENAME` + * `G_OS_INFO_KEY_VERSION_ID` + * `G_OS_INFO_KEY_ID` + * `G_OS_INFO_KEY_HOME_URL` + * `G_OS_INFO_KEY_DOCUMENTATION_URL` + * `G_OS_INFO_KEY_SUPPORT_URL` + * `G_OS_INFO_KEY_BUG_REPORT_URL` + * `G_OS_INFO_KEY_PRIVACY_POLICY_URL` + +## Paths + + * [func@GLib.get_host_name] + * [func@GLib.get_home_dir] + * [func@GLib.get_tmp_dir] + * [func@GLib.get_current_dir] + * [func@GLib.canonicalize_filename] + * [func@GLib.path_is_absolute] + * [func@GLib.path_skip_root] + * [func@GLib.path_get_basename] + * [func@GLib.path_get_dirname] + * [func@GLib.build_filename] + * [func@GLib.build_filenamev] + * [func@GLib.build_filename_valist] + * [func@GLib.build_path] + * [func@GLib.build_pathv] + +## Size Formatting + + * [func@GLib.format_size] + * [func@GLib.format_size_full] + * [func@GLib.format_size_for_display] + +## Executables + + * [func@GLib.find_program_in_path] + +## Bit Manipulation + + * [func@GLib.bit_nth_lsf] + * [func@GLib.bit_nth_msf] + * [func@GLib.bit_storage] + +## Primes + + * [func@GLib.spaced_primes_closest] + +## Process Lifetime + + * [func@GLib.abort] + +## Debug + + * [func@GLib.parse_debug_string] + +## Sorting + + * [func@GLib.qsort_with_data] + +## Pointers + + * [func@GLib.nullify_pointer] + +## Deprecated API + + * [type@GLib.VoidFunc] + * [type@GLib.FreeFunc] + * [func@GLib.atexit] diff --git a/docs/reference/glib/numerical.md b/docs/reference/glib/numerical.md new file mode 100644 index 0000000..2e389e9 --- /dev/null +++ b/docs/reference/glib/numerical.md @@ -0,0 +1,35 @@ +Title: Numerical Definitions +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2001 Havoc Pennington +SPDX-FileCopyrightText: 2010 Red Hat, Inc. + +# Numerical Definitions + +GLib offers mathematical constants such as [const@GLib.PI] for the value of pi; +many platforms have these in the C library, but some don’t. The GLib +versions always exist. + +The [type@GLib.FloatIEEE754] and [type@GLib.DoubleIEEE754] unions are used to +access the sign, mantissa and exponent of IEEE floats and doubles. These unions +are defined as appropriate for a given platform. IEEE floats and doubles are +supported (used for storage) by at least Intel, PPC and Sparc. See +[IEEE 754-2008](http://en.wikipedia.org/wiki/IEEE_float) +for more information about IEEE number formats. + +## Floating Point + + * [const@GLib.IEEE754_FLOAT_BIAS] + * [const@GLib.IEEE754_DOUBLE_BIAS] + * [type@GLib.FloatIEEE754] + * [type@GLib.DoubleIEEE754] + +## Numerical Constants + + * [const@GLib.E] + * [const@GLib.LN2] + * [const@GLib.LN10] + * [const@GLib.PI] + * [const@GLib.PI_2] + * [const@GLib.PI_4] + * [const@GLib.SQRT2] + * [const@GLib.LOG_2_BASE_10] diff --git a/docs/reference/glib/programming.md b/docs/reference/glib/programming.md new file mode 100644 index 0000000..4438ad7 --- /dev/null +++ b/docs/reference/glib/programming.md @@ -0,0 +1,71 @@ +Title: Writing GLib Applications +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2012 Red Hat, Inc. +SPDX-FileCopyrightText: 2023 Endless OS Foundation, LLC + +# Writing GLib Applications + +## Memory Allocations + +Unless otherwise specified, all functions which allocate memory in GLib will +abort the process if heap allocation fails. This is because it is too hard to +recover from allocation failures in any non-trivial program and, in particular, +to test all the allocation failure code paths. + +## UTF-8 and String Encoding + +All GLib, GObject and GIO functions accept and return strings in +[UTF-8 encoding](https://en.wikipedia.org/wiki/UTF-8) unless otherwise +specified. + +Input strings to function calls are *not* checked to see if +they are valid UTF-8: it is the application developer’s responsibility to +validate input strings at the time of input, either at the program or library +boundary, and to only use valid UTF-8 string constants in their application. +If GLib were to UTF-8 validate all string inputs to all functions, there would +be a significant drop in performance. + +Similarly, output strings from functions are guaranteed to be in UTF-8, +and this does not need to be validated by the calling function. If a function +returns invalid UTF-8 (and is not documented as doing so), that’s a bug. + +See [func@GLib.utf8_validate] and [func@GLib.utf8_make_valid] for validating +UTF-8 input. + +## Threads + +The general policy of GLib is that all functions are invisibly threadsafe +with the exception of data structure manipulation functions, where, if +you have two threads manipulating the *same* data structure, they must use a +lock to synchronize their operation. + +GLib creates a worker thread for its own purposes so GLib applications +will always have at least 2 threads. + +In particular, this means that programs must only use +[async-signal-safe functions](man:signal-safety(7)) between +calling [`fork()`](man:fork(2)) and [`exec()`](man:exec(3)), even if +they haven’t explicitly spawned another thread yet. + +See the sections on [threads](threads.html) and [struct@GLib.ThreadPool] for +GLib APIs that support multithreaded applications. + +## Security and setuid Use + +When writing code that runs with elevated privileges, it is important +to follow some basic rules of secure programming. David Wheeler has an +excellent book on this topic, +[Secure Programming for Linux and Unix HOWTO](http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/index.html). + +When it comes to GLib and its associated libraries, GLib and +GObject are generally fine to use in code that runs with elevated +privileges; they don’t load modules (executable code in shared objects) +or run other programs ‘behind your back’. GIO, however, is not designed to be +used in privileged programs, either ones which are spawned by a privileged +process, or ones which are run with a setuid bit set. + +setuid programs should always reset their environment to contain only +known-safe values before calling into non-trivial libraries such as GIO. This +reduces the risk of an attacker-controlled environment variable being used to +get a privileged GIO process to run arbitrary code via loading a GIO module or +similar. diff --git a/docs/reference/glib/programming.xml b/docs/reference/glib/programming.xml deleted file mode 100644 index 9efa19d..0000000 --- a/docs/reference/glib/programming.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - -Writing GLib Applications -3 -GLib Library - - - -Writing GLib Applications - -General considerations when programming with GLib - - - - -Writing GLib Applications - - -Memory Allocations - - -Unless otherwise specified, all functions which allocate memory in GLib will -abort the process if heap allocation fails. This is because it is too hard to -recover from allocation failures in any non-trivial program and, in particular, -to test all the allocation failure code paths. - - - - -UTF-8 and String Encoding - - -All GLib, GObject and GIO functions accept and return strings in -UTF-8 encoding -unless otherwise specified. - - - -Input strings to function calls are not checked to see if -they are valid UTF-8: it is the application developer’s responsibility to -validate input strings at the time of input, either at the program or library -boundary, and to only use valid UTF-8 string constants in their application. -If GLib were to UTF-8 validate all string inputs to all functions, there would -be a significant drop in performance. - - -Similarly, output strings from functions are guaranteed to be in UTF-8, -and this does not need to be validated by the calling function. If a function -returns invalid UTF-8 (and is not documented as doing so), that’s a bug. - - - -See g_utf8_validate() -and g_utf8_make_valid() -for validating UTF-8 input. - - - - -Threads - - -The general policy of GLib is that all functions are invisibly threadsafe -with the exception of data structure manipulation functions, where, if -you have two threads manipulating the same data -structure, they must use a lock to synchronize their operation. - - - -GLib creates a worker thread for its own purposes so GLib applications -will always have at least 2 threads. - - - -In particular, this means that programs must only use -async-signal-safe functions between -calling fork() and exec(), even if -they haven’t explicitly spawned another thread yet. - - - -See the sections on threads and -thread pools for GLib APIs that -support multithreaded applications. - - - - - -Security and setuid use - - -When writing code that runs with elevated privileges, it is important -to follow some basic rules of secure programming. David Wheeler has an -excellent book on this topic, -Secure Programming for Linux and Unix HOWTO. - - - -When it comes to GLib and its associated libraries, GLib and -GObject are generally fine to use in code that runs with elevated -privileges; they don't load modules (executable code in shared objects) -or run other programs ‘behind your back’. GIO, however, is not designed to be -used in privileged programs, either ones which are spawned by a privileged -process, or ones which are run with a setuid bit set. - - - -setuid programs should always reset their environment to contain only -known-safe values before calling into non-trivial libraries such as GIO. This -reduces the risk of an attacker-controlled environment variable being used to -get a privileged GIO process to run arbitrary code via loading a GIO module or -similar. - - - - - - - diff --git a/docs/reference/glib/random.md b/docs/reference/glib/random.md new file mode 100644 index 0000000..2f1b5e3 --- /dev/null +++ b/docs/reference/glib/random.md @@ -0,0 +1,61 @@ +Title: Random Numbers +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2000, 2002 Sebastian Wilhelmi +SPDX-FileCopyrightText: 2013 Colin Walters + +# Random Numbers + +The following functions allow you to use a portable, fast and good +pseudo-random number generator (PRNG). + +Do not use this API for cryptographic purposes such as key +generation, nonces, salts or one-time pads. + +This PRNG is suitable for non-cryptographic use such as in games +(shuffling a card deck, generating levels), generating data for +a test suite, etc. If you need random data for cryptographic +purposes, it is recommended to use platform-specific APIs such +as `/dev/random` on UNIX, or +[`CryptGenRandom()`](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptgenrandom) +on Windows. + +[type@GLib.Rand] uses the Mersenne Twister PRNG, which was originally +developed by Makoto Matsumoto and Takuji Nishimura. Further +information can be found at +[this page](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html). + +If you just need a random number, you simply call the `g_random_*()` +functions, which will create a globally used [type@GLib.Rand] and use the +according `g_rand_*()` functions internally: + + * [func@GLib.random_int] + * [func@GLib.random_int_range] + * [func@GLib.random_double] + * [func@GLib.random_double_range] + * [func@GLib.random_set_seed] + +Whenever you need a stream of reproducible random numbers, you better create a +[type@GLib.Rand] yourself and use the `g_rand_*()` functions directly, which +will also be slightly faster. Initializing a [type@GLib.Rand] with a +certain seed will produce exactly the same series of random +numbers on all platforms. This can thus be used as a seed for +e.g. games. + +The `g_rand*_range()` functions will return high quality equally +distributed random numbers, whereas for example the +`(g_random_int () % max)` approach often +doesn’t yield equally distributed numbers. + +GLib changed the seeding algorithm for the pseudo-random number +generator Mersenne Twister, as used by [type@GLib.Rand]. This was necessary, +because some seeds would yield very bad pseudo-random streams. +Also the pseudo-random integers generated by `g_rand*_int_range()` +will have a slightly better equal distribution with the new +version of GLib. + +The original seeding and generation algorithms, as found in +GLib 2.0.x, can be used instead of the new ones by setting the +environment variable `G_RANDOM_VERSION` to the value of `2.0`. +Use the GLib-2.0 algorithms only if you have sequences of numbers +generated with Glib-2.0 that you need to reproduce exactly. + diff --git a/docs/reference/glib/reference-counting.md b/docs/reference/glib/reference-counting.md new file mode 100644 index 0000000..cb3a58d --- /dev/null +++ b/docs/reference/glib/reference-counting.md @@ -0,0 +1,164 @@ +Title: Reference Counting + +## Reference counting types + +Reference counting is a garbage collection mechanism that is based on +assigning a counter to a data type, or any memory area; the counter is +increased whenever a new reference to that data type is acquired, and +decreased whenever the reference is released. Once the last reference is +released, the resources associated to that data type are freed. + +GLib uses reference counting in many of its data types, and provides the +`grefcount` and `gatomicrefcount` types to implement safe and atomic +reference counting semantics in new data types. + +It is important to note that `grefcount` and `gatomicrefcount` should be +considered completely opaque types; you should always use the provided API +to increase and decrease the counters, and you should never check their +content directly, or compare their content with other values. + +## Reference counted data + +A "reference counted box", or "RcBox", is an opaque wrapper data type that +is guaranteed to be as big as the size of a given data type, and which +augments the given data type with reference counting semantics for its +memory management. + +RcBox is useful if you have a plain old data type, like a structure +typically placed on the stack, and you wish to provide additional API to use +it on the heap; or if you want to implement a new type to be passed around +by reference without necessarily implementing copy/free semantics or your +own reference counting. + +The typical use is: + +```c +typedef struct { + char *name; + char *address; + char *city; + char *state; + int age; +} Person; + +Person * +person_new (void) +{ + return g_rc_box_new0 (Person); +} +``` + +Every time you wish to acquire a reference on the memory, you should call +`g_rc_box_acquire()`; similarly, when you wish to release a reference you +should call `g_rc_box_release()`: + +```c +// Add a Person to the Database; the Database acquires ownership +// of the Person instance +void +add_person_to_database (Database *db, Person *p) +{ + db->persons = g_list_prepend (db->persons, g_rc_box_acquire (p)); +} + +// Removes a Person from the Database; the reference acquired by +// add_person_to_database() is released here +void +remove_person_from_database (Database *db, Person *p) +{ + db->persons = g_list_remove (db->persons, p); + g_rc_box_release (p); +} +``` + +If you have additional memory allocated inside the structure, you can use +`g_rc_box_release_full()`, which takes a function pointer, which will be +called if the reference released was the last: + +```c +void +person_clear (Person *p) +{ + g_free (p->name); + g_free (p->address); + g_free (p->city); + g_free (p->state); +} + +void +remove_person_from_database (Database *db, Person *p) +{ + db->persons = g_list_remove (db->persons, p); + g_rc_box_release_full (p, (GDestroyNotify) person_clear); +} +``` + +If you wish to transfer the ownership of a reference counted data +type without increasing the reference count, you can use `g_steal_pointer()`: + +```c + Person *p = g_rc_box_new (Person); + + // fill_person_details() is defined elsewhere + fill_person_details (p); + + // add_person_to_database_no_ref() is defined elsewhere; it adds + // a Person to the Database without taking a reference + add_person_to_database_no_ref (db, g_steal_pointer (&p)); +``` + + +## Thread safety + +The reference counting operations on data allocated using +`g_rc_box_alloc()`, `g_rc_box_new()`, and `g_rc_box_dup()` are not thread +safe; it is your code's responsibility to ensure that references are +acquired are released on the same thread. + +If you need thread safe reference counting, you should use the +`g_atomic_rc_*` API: + +| Operation | Atomic equivalent | +|---------------------------|----------------------------------| +| `g_rc_box_alloc()` | `g_atomic_rc_box_alloc()` | +| `g_rc_box_new()` | `g_atomic_rc_box_new()` | +| `g_rc_box_dup()` | `g_atomic_rc_box_dup()` | +| `g_rc_box_acquire()` | `g_atomic_rc_box_acquire()` | +| `g_rc_box_release()` | `g_atomic_rc_box_release()` | +| `g_rc_box_release_full()` | `g_atomic_rc_box_release_full()` | + +The reference counting operations on data allocated using +`g_atomic_rc_box_alloc()`, `g_atomic_rc_box_new()`, and +`g_atomic_rc_box_dup()` are guaranteed to be atomic, and thus can be safely +be performed by different threads. It is important to note that only the +reference acquisition and release are atomic; changes to the content of the +data are your responsibility. + +It is a programmer error to mix the atomic and non-atomic reference counting +operations. + +## Automatic pointer clean up + +If you want to add `g_autoptr()` support to your plain old data type through +reference counting, you can use the `G_DEFINE_AUTOPTR_CLEANUP_FUNC()` and +`g_rc_box_release()`: + +```c +G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, g_rc_box_release) +``` + +If you need to clear the contents of the data, you will need to use an +ancillary function that calls `g_rc_box_release_full()`: + +```c +static void +my_data_struct_release (MyDataStruct *data) +{ + // my_data_struct_clear() is defined elsewhere + g_rc_box_release_full (data, (GDestroyNotify) my_data_struct_clear); +} + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, my_data_struct_release) +``` + +The `g_rc_box*` and `g_atomic_rc_box*` APIs were introduced in GLib 2.58. diff --git a/docs/reference/glib/regex-syntax.xml b/docs/reference/glib/regex-syntax.xml deleted file mode 100644 index 0b413aa..0000000 --- a/docs/reference/glib/regex-syntax.xml +++ /dev/null @@ -1,2485 +0,0 @@ - - - - - Regular expression syntax - - - - - - -Regular expression syntax - -syntax and semantics of regular expressions supported by GRegex - - - - -GRegex regular expression details - -A regular expression is a pattern that is matched against a -string from left to right. Most characters stand for themselves in a -pattern, and match the corresponding characters in the string. As a -trivial example, the pattern - - - -The quick brown fox - - - -matches a portion of a string that is identical to itself. When -caseless matching is specified (the G_REGEX_CASELESS flag), letters are -matched independently of case. - - - -The power of regular expressions comes from the ability to include -alternatives and repetitions in the pattern. These are encoded in the -pattern by the use of metacharacters, which do not stand for themselves -but instead are interpreted in some special way. - - - -There are two different sets of metacharacters: those that are recognized -anywhere in the pattern except within square brackets, and those -that are recognized in square brackets. Outside square brackets, the -metacharacters are as follows: - - - -Metacharacters outside square brackets - - - - - Character - Meaning - - - - - \ - general escape character with several uses - - - ^ - assert start of string (or line, in multiline mode) - - - $ - assert end of string (or line, in multiline mode) - - - . - match any character except newline (by default) - - - [ - start character class definition - - - | - start of alternative branch - - - ( - start subpattern - - - ) - end subpattern - - - ? - extends the meaning of (, or 0/1 quantifier, or quantifier minimizer - - - * - 0 or more quantifier - - - + - 1 or more quantifier, also "possessive quantifier" - - - { - start min/max quantifier - - - -
- - -Part of a pattern that is in square brackets is called a "character -class". In a character class the only metacharacters are: - - - -Metacharacters inside square brackets - - - - - Character - Meaning - - - - - \ - general escape character - - - ^ - negate the class, but only if the first character - - - - - indicates character range - - - [ - POSIX character class (only if followed by POSIX syntax) - - - ] - terminates the character class - - - -
-
- - -Backslash - -The backslash character has several uses. Firstly, if it is followed by -a non-alphanumeric character, it takes away any special meaning that -character may have. This use of backslash as an escape character -applies both inside and outside character classes. - - - -For example, if you want to match a * character, you write \* in the -pattern. This escaping action applies whether or not the following -character would otherwise be interpreted as a metacharacter, so it is -always safe to precede a non-alphanumeric with backslash to specify -that it stands for itself. In particular, if you want to match a -backslash, you write \\. - - - -If a pattern is compiled with the G_REGEX_EXTENDED -option, whitespace in the pattern (other than in a character class) and -characters between a # outside a character class and the next newline -are ignored. -An escaping backslash can be used to include a whitespace or # character -as part of the pattern. - - - -Note that the C compiler interprets backslash in strings itself, therefore -you need to duplicate all \ characters when you put a regular expression -in a C string, like "\\d{3}". - - - -If you want to remove the special meaning from a sequence of characters, -you can do so by putting them between \Q and \E. -The \Q...\E sequence is recognized both inside and outside character -classes. - - - -Non-printing characters - -A second use of backslash provides a way of encoding non-printing -characters in patterns in a visible manner. There is no restriction on the -appearance of non-printing characters, apart from the binary zero that -terminates a pattern, but when a pattern is being prepared by text -editing, it is usually easier to use one of the following escape -sequences than the binary character it represents: - - - -Non-printing characters - - - - - Escape - Meaning - - - - - \a - alarm, that is, the BEL character (hex 07) - - - \cx - "control-x", where x is any character - - - \e - escape (hex 1B) - - - \f - formfeed (hex 0C) - - - \n - newline (hex 0A) - - - \r - carriage return (hex 0D) - - - \t - tab (hex 09) - - - \ddd - character with octal code ddd, or backreference - - - \xhh - character with hex code hh - - - \x{hhh..} - character with hex code hhh.. - - - -
- - -The precise effect of \cx is as follows: if x is a lower case letter, -it is converted to upper case. Then bit 6 of the character (hex 40) is -inverted. Thus \cz becomes hex 1A, but \c{ becomes hex 3B, while \c; -becomes hex 7B. - - - -After \x, from zero to two hexadecimal digits are read (letters can be -in upper or lower case). Any number of hexadecimal digits may appear -between \x{ and }, but the value of the character code -must be less than 2**31 (that is, the maximum hexadecimal value is -7FFFFFFF). If characters other than hexadecimal digits appear between -\x{ and }, or if there is no terminating }, this form of escape is not -recognized. Instead, the initial \x will be interpreted as a basic hexadecimal -escape, with no following digits, giving a character whose -value is zero. - - - -Characters whose value is less than 256 can be defined by either of the -two syntaxes for \x. There is no difference -in the way they are handled. For example, \xdc is exactly the same as -\x{dc}. - - - -After \0 up to two further octal digits are read. If there are fewer -than two digits, just those that are present are used. -Thus the sequence \0\x\07 specifies two binary zeros followed by a BEL -character (code value 7). Make sure you supply two digits after the -initial zero if the pattern character that follows is itself an octal -digit. - - - -The handling of a backslash followed by a digit other than 0 is complicated. -Outside a character class, GRegex reads it and any following digits as a -decimal number. If the number is less than 10, or if there -have been at least that many previous capturing left parentheses in the -expression, the entire sequence is taken as a back reference. A -description of how this works is given later, following the discussion -of parenthesized subpatterns. - - - -Inside a character class, or if the decimal number is greater than 9 -and there have not been that many capturing subpatterns, GRegex re-reads -up to three octal digits following the backslash, and uses them to generate -a data character. Any subsequent digits stand for themselves. For example: - - - -Non-printing characters - - - - - Escape - Meaning - - - - - \040 - is another way of writing a space - - - \40 - is the same, provided there are fewer than 40 previous capturing subpatterns - - - \7 - is always a back reference - - - \11 - might be a back reference, or another way of writing a tab - - - \011 - is always a tab - - - \0113 - is a tab followed by the character "3" - - - \113 - might be a back reference, otherwise the character with octal code 113 - - - \377 - might be a back reference, otherwise the byte consisting entirely of 1 bits - - - \81 - is either a back reference, or a binary zero followed by the two characters "8" and "1" - - - -
- - -Note that octal values of 100 or greater must not be introduced by a -leading zero, because no more than three octal digits are ever read. - - - -All the sequences that define a single character can be used both inside -and outside character classes. In addition, inside a character class, the -sequence \b is interpreted as the backspace character (hex 08), and the -sequences \R and \X are interpreted as the characters "R" and "X", respectively. -Outside a character class, these sequences have different meanings (see below). - -
- - -Absolute and relative back references - -The sequence \g followed by a positive or negative number, optionally enclosed -in braces, is an absolute or relative back reference. Back references are -discussed later, following the discussion of parenthesized subpatterns. - - - - -Generic character types - - -Another use of backslash is for specifying generic character types. -The following are always recognized: - - - -Generic characters - - - - - Escape - Meaning - - - - - \d - any decimal digit - - - \D - any character that is not a decimal digit - - - \s - any whitespace character - - - \S - any character that is not a whitespace character - - - \w - any "word" character - - - \W - any "non-word" character - - - -
- - -Each pair of escape sequences partitions the complete set of characters -into two disjoint sets. Any given character matches one, and only one, -of each pair. - - - -These character type sequences can appear both inside and outside character -classes. They each match one character of the appropriate type. -If the current matching point is at the end of the passed string, all -of them fail, since there is no character to match. - - - -For compatibility with Perl, \s does not match the VT character (code -11). This makes it different from the POSIX "space" class. The \s -characters are HT (9), LF (10), FF (12), CR (13), and space (32). - - - -A "word" character is an underscore or any character less than 256 that -is a letter or digit. - - -Characters with values greater than 128 never match \d, -\s, or \w, and always match \D, \S, and \W. - -
- - -Newline sequences -Outside a character class, the escape sequence \R matches any Unicode -newline sequence. -This particular group matches either the two-character sequence CR followed by -LF, or one of the single characters LF (linefeed, U+000A), VT (vertical tab, -U+000B), FF (formfeed, U+000C), CR (carriage return, U+000D), NEL (next -line, U+0085), LS (line separator, U+2028), or PS (paragraph separator, U+2029). -The two-character sequence is treated as a single unit that -cannot be split. Inside a character class, \R matches the letter "R". - - - -Unicode character properties - -To support generic character types there are three additional escape -sequences, they are: - - - -Generic character types - - - - - Escape - Meaning - - - - - \p{xx} - a character with the xx property - - - \P{xx} - a character without the xx property - - - \X - an extended Unicode sequence - - - -
- - -The property names represented by xx above are limited to the Unicode -script names, the general category properties, and "Any", which matches -any character (including newline). Other properties such as "InMusicalSymbols" -are not currently supported. Note that \P{Any} does not match any characters, -so always causes a match failure. - - - -Sets of Unicode characters are defined as belonging to certain scripts. A -character from one of these sets can be matched using a script name. For -example, \p{Greek} or \P{Han}. - - - -Those that are not part of an identified script are lumped together as -"Common". The current list of scripts can be found in the documentation for -the #GUnicodeScript enumeration. Script names for use with \p{} can be -found by replacing all spaces with underscores, e.g. for Linear B use -\p{Linear_B}. - - - -Each character has exactly one general category property, specified by a -two-letter abbreviation. For compatibility with Perl, negation can be specified -by including a circumflex between the opening brace and the property name. For -example, \p{^Lu} is the same as \P{Lu}. - - - -If only one letter is specified with \p or \P, it includes all the general -category properties that start with that letter. In this case, in the absence -of negation, the curly brackets in the escape sequence are optional; these two -examples have the same effect: - - - -\p{L} -\pL - - - -In addition to the two-letter category codes listed in the -documentation for the #GUnicodeType enumeration, the following -general category property codes are supported: - - - -Property codes - - - - - Code - Meaning - - - - - C - Other - - - L - Letter - - - M - Mark - - - N - Number - - - P - Punctuation - - - S - Symbol - - - Z - Separator - - - -
- - -The special property L& is also supported: it matches a character that has -the Lu, Ll, or Lt property, in other words, a letter that is not classified as -a modifier or "other". - - - -The long synonyms for these properties that Perl supports (such as \ep{Letter}) -are not supported by GRegex, nor is it permitted to prefix any of these -properties with "Is". - - - -No character that is in the Unicode table has the Cn (unassigned) property. -Instead, this property is assumed for any code point that is not in the -Unicode table. - - - -Specifying caseless matching does not affect these escape sequences. -For example, \p{Lu} always matches only upper case letters. - - - -The \X escape matches any number of Unicode characters that form an -extended Unicode sequence. \X is equivalent to - - - -(?>\PM\pM*) - - - -That is, it matches a character without the "mark" property, followed -by zero or more characters with the "mark" property, and treats the -sequence as an atomic group (see below). Characters with the "mark" -property are typically accents that affect the preceding character. - - - -Matching characters by Unicode property is not fast, because GRegex has -to search a structure that contains data for over fifteen thousand -characters. That is why the traditional escape sequences such as \d and -\w do not use Unicode properties. - -
- - -Simple assertions - -The final use of backslash is for certain simple assertions. An -assertion specifies a condition that has to be met at a particular point in -a match, without consuming any characters from the string. The -use of subpatterns for more complicated assertions is described below. -The backslashed assertions are: - - - -Simple assertions - - - - - Escape - Meaning - - - - - \b - matches at a word boundary - - - \B - matches when not at a word boundary - - - \A - matches at the start of the string - - - \Z - matches at the end of the string or before a newline at the end of the string - - - \z - matches only at the end of the string - - - \G - matches at first matching position in the string - - - -
- - -These assertions may not appear in character classes (but note that \b -has a different meaning, namely the backspace character, inside a -character class). - - - -A word boundary is a position in the string where the current -character and the previous character do not both match \w or \W (i.e. -one matches \w and the other matches \W), or the start or end of the -string if the first or last character matches \w, respectively. - - - -The \A, \Z, and \z assertions differ from the traditional circumflex -and dollar (described in the next section) in that they only ever match -at the very start and end of the string, whatever options are -set. Thus, they are independent of multiline mode. These three assertions -are not affected by the G_REGEX_MATCH_NOTBOL or G_REGEX_MATCH_NOTEOL options, -which affect only the behaviour of the circumflex and dollar metacharacters. -However, if the start_position argument of a matching function is non-zero, -indicating that matching is to start at a point other than the beginning of -the string, \A can never match. The difference between \Z and \z is -that \Z matches before a newline at the end of the string as well at the -very end, whereas \z matches only at the end. - - - -The \G assertion is true only when the current matching position is at -the start point of the match, as specified by the start_position argument -to the matching functions. It differs from \A when the value of startoffset is -non-zero. - - - -Note, however, that the interpretation of \G, as the start of the -current match, is subtly different from Perl’s, which defines it as the -end of the previous match. In Perl, these can be different when the -previously matched string was empty. - - - -If all the alternatives of a pattern begin with \G, the expression is -anchored to the starting match position, and the "anchored" flag is set -in the compiled regular expression. - -
-
- - -Circumflex and dollar - -Outside a character class, in the default matching mode, the circumflex -character is an assertion that is true only if the current matching -point is at the start of the string. If the start_position argument to -the matching functions is non-zero, circumflex can never match if the -G_REGEX_MULTILINE option is unset. Inside a character class, circumflex -has an entirely different meaning (see below). - - - -Circumflex need not be the first character of the pattern if a number -of alternatives are involved, but it should be the first thing in each -alternative in which it appears if the pattern is ever to match that -branch. If all possible alternatives start with a circumflex, that is, -if the pattern is constrained to match only at the start of the string, -it is said to be an "anchored" pattern. (There are also other -constructs that can cause a pattern to be anchored.) - - - -A dollar character is an assertion that is true only if the current -matching point is at the end of the string, or immediately -before a newline at the end of the string (by default). Dollar need not -be the last character of the pattern if a number of alternatives are -involved, but it should be the last item in any branch in which it -appears. Dollar has no special meaning in a character class. - - - -The meaning of dollar can be changed so that it matches only at the -very end of the string, by setting the G_REGEX_DOLLAR_ENDONLY option at -compile time. This does not affect the \Z assertion. - - - -The meanings of the circumflex and dollar characters are changed if the -G_REGEX_MULTILINE option is set. When this is the case, -a circumflex matches immediately after internal newlines as well as at the -start of the string. It does not match after a newline that ends the string. -A dollar matches before any newlines in the string, as well as at the very -end, when G_REGEX_MULTILINE is set. When newline is -specified as the two-character sequence CRLF, isolated CR and LF characters -do not indicate newlines. - - - -For example, the pattern /^abc$/ matches the string "def\nabc" (where -\n represents a newline) in multiline mode, but not otherwise. Consequently, -patterns that are anchored in single line mode because all branches start with -^ are not anchored in multiline mode, and a match for circumflex is possible -when the start_position argument of a matching function -is non-zero. The G_REGEX_DOLLAR_ENDONLY option is ignored -if G_REGEX_MULTILINE is set. - - - -Note that the sequences \A, \Z, and \z can be used to match the start and -end of the string in both modes, and if all branches of a pattern start with -\A it is always anchored, whether or not G_REGEX_MULTILINE -is set. - - - - -Full stop (period, dot) - -Outside a character class, a dot in the pattern matches any one character -in the string, including a non-printing character, but not (by -default) newline. In UTF-8 a character might be more than one byte long. - - - -When a line ending is defined as a single character, dot never matches that -character; when the two-character sequence CRLF is used, dot does not match CR -if it is immediately followed by LF, but otherwise it matches all characters -(including isolated CRs and LFs). When any Unicode line endings are being -recognized, dot does not match CR or LF or any of the other line ending -characters. - - - -If the G_REGEX_DOTALL flag is set, dots match newlines -as well. The handling of dot is entirely independent of the handling of circumflex -and dollar, the only relationship being that they both involve newline -characters. Dot has no special meaning in a character class. - - - -The behaviour of dot with regard to newlines can be changed. If the -G_REGEX_DOTALL option is set, a dot matches any one -character, without exception. If newline is defined as the two-character -sequence CRLF, it takes two dots to match it. - - - -The handling of dot is entirely independent of the handling of circumflex and -dollar, the only relationship being that they both involve newlines. Dot has no -special meaning in a character class. - - - - -Matching a single byte - -Outside a character class, the escape sequence \C matches any one byte, -both in and out of UTF-8 mode. Unlike a dot, it always matches any line -ending characters. -The feature is provided in Perl in order to match individual bytes in -UTF-8 mode. Because it breaks up UTF-8 characters into individual -bytes, what remains in the string may be a malformed UTF-8 string. For -this reason, the \C escape sequence is best avoided. - - - -GRegex does not allow \C to appear in lookbehind assertions (described -below), because in UTF-8 mode this would make it impossible to calculate -the length of the lookbehind. - - - - -Square brackets and character classes - -An opening square bracket introduces a character class, terminated by a -closing square bracket. A closing square bracket on its own is not special. If a closing square bracket is required as a member of the class, -it should be the first data character in the class (after an initial -circumflex, if present) or escaped with a backslash. - - - -A character class matches a single character in the string. A matched character -must be in the set of characters defined by the class, unless the first -character in the class definition is a circumflex, in which case the -string character must not be in the set defined by the class. If a -circumflex is actually required as a member of the class, ensure it is -not the first character, or escape it with a backslash. - - - -For example, the character class [aeiou] matches any lower case vowel, -while [^aeiou] matches any character that is not a lower case vowel. -Note that a circumflex is just a convenient notation for specifying the -characters that are in the class by enumerating those that are not. A -class that starts with a circumflex is not an assertion: it still consumes -a character from the string, and therefore it fails if the current pointer -is at the end of the string. - - - -In UTF-8 mode, characters with values greater than 255 can be included -in a class as a literal string of bytes, or by using the \x{ escaping -mechanism. - - - -When caseless matching is set, any letters in a class represent both -their upper case and lower case versions, so for example, a caseless -[aeiou] matches "A" as well as "a", and a caseless [^aeiou] does not -match "A", whereas a caseful version would. - - - -Characters that might indicate line breaks are never treated -in any special way when matching character classes, whatever line-ending -sequence is in use, and whatever setting of the G_REGEX_DOTALL -and G_REGEX_MULTILINE options is used. A class such as [^a] -always matches one of these characters. - - - -The minus (hyphen) character can be used to specify a range of characters in -a character class. For example, [d-m] matches any letter -between d and m, inclusive. If a minus character is required in a -class, it must be escaped with a backslash or appear in a position -where it cannot be interpreted as indicating a range, typically as the -first or last character in the class. - - - -It is not possible to have the literal character "]" as the end character -of a range. A pattern such as [W-]46] is interpreted as a class of -two characters ("W" and "-") followed by a literal string "46]", so it -would match "W46]" or "-46]". However, if the "]" is escaped with a -backslash it is interpreted as the end of range, so [W-\]46] is interpreted -as a class containing a range followed by two other characters. -The octal or hexadecimal representation of "]" can also be used to end -a range. - - - -Ranges operate in the collating sequence of character values. They can -also be used for characters specified numerically, for example -[\000-\037]. In UTF-8 mode, ranges can include characters whose values -are greater than 255, for example [\x{100}-\x{2ff}]. - - - -The character types \d, \D, \p, \P, \s, \S, \w, and \W may also appear -in a character class, and add the characters that they match to the -class. For example, [\dABCDEF] matches any hexadecimal digit. A -circumflex can conveniently be used with the upper case character types to -specify a more restricted set of characters than the matching lower -case type. For example, the class [^\W_] matches any letter or digit, -but not underscore. - - - -The only metacharacters that are recognized in character classes are -backslash, hyphen (only where it can be interpreted as specifying a -range), circumflex (only at the start), opening square bracket (only -when it can be interpreted as introducing a POSIX class name - see the -next section), and the terminating closing square bracket. However, -escaping other non-alphanumeric characters does no harm. - - - - -Posix character classes - -GRegex supports the POSIX notation for character classes. This uses names -enclosed by [: and :] within the enclosing square brackets. For example, - - - -[01[:alpha:]%] - - - -matches "0", "1", any alphabetic character, or "%". The supported class -names are - - - -Posix classes - - - - - Name - Meaning - - - - - alnum - letters and digits - - - alpha - letters - - - ascii - character codes 0 - 127 - - - blank - space or tab only - - - cntrl - control characters - - - digit - decimal digits (same as \d) - - - graph - printing characters, excluding space - - - lower - lower case letters - - - print - printing characters, including space - - - punct - printing characters, excluding letters and digits - - - space - white space (not quite the same as \s) - - - upper - upper case letters - - - word - "word" characters (same as \w) - - - xdigit - hexadecimal digits - - - -
- - -The "space" characters are HT (9), LF (10), VT (11), FF (12), CR (13), -and space (32). Notice that this list includes the VT character (code -11). This makes "space" different to \s, which does not include VT (for -Perl compatibility). - - - -The name "word" is a Perl extension, and "blank" is a GNU extension. -Another Perl extension is negation, which is indicated by a ^ character -after the colon. For example, - - - -[12[:^digit:]] - - - -matches "1", "2", or any non-digit. GRegex also recognize the -POSIX syntax [.ch.] and [=ch=] where "ch" is a "collating element", but -these are not supported, and an error is given if they are encountered. - - - -In UTF-8 mode, characters with values greater than 128 do not match any -of the POSIX character classes. - -
- - -Vertical bar - -Vertical bar characters are used to separate alternative patterns. For -example, the pattern - - - - gilbert|sullivan - - - -matches either "gilbert" or "sullivan". Any number of alternatives may -appear, and an empty alternative is permitted (matching the empty -string). The matching process tries each alternative in turn, from -left to right, and the first one that succeeds is used. If the alternatives are within a subpattern (defined below), "succeeds" means matching the rest of the main pattern as well as the alternative in the subpattern. - - - - -Internal option setting - -The settings of the G_REGEX_CASELESS, G_REGEX_MULTILINE, G_REGEX_MULTILINE, -and G_REGEX_EXTENDED options can be changed from within the pattern by a -sequence of Perl-style option letters enclosed between "(?" and ")". The -option letters are - - - -Option settings - - - - - Option - Flag - - - - - i - G_REGEX_CASELESS - - - m - G_REGEX_MULTILINE - - - s - G_REGEX_DOTALL - - - x - G_REGEX_EXTENDED - - - -
- - -For example, (?im) sets caseless, multiline matching. It is also -possible to unset these options by preceding the letter with a hyphen, and a -combined setting and unsetting such as (?im-sx), which sets G_REGEX_CASELESS -and G_REGEX_MULTILINE while unsetting G_REGEX_DOTALL and G_REGEX_EXTENDED, -is also permitted. If a letter appears both before and after the -hyphen, the option is unset. - - - -When an option change occurs at top level (that is, not inside subpattern -parentheses), the change applies to the remainder of the pattern -that follows. - - - -An option change within a subpattern (see below for a description of subpatterns) -affects only that part of the current pattern that follows it, so - - - -(a(?i)b)c - - - -matches abc and aBc and no other strings (assuming G_REGEX_CASELESS is not -used). By this means, options can be made to have different settings -in different parts of the pattern. Any changes made in one alternative -do carry on into subsequent branches within the same subpattern. For -example, - - - -(a(?i)b|c) - - - -matches "ab", "aB", "c", and "C", even though when matching "C" the -first branch is abandoned before the option setting. This is because -the effects of option settings happen at compile time. There would be -some very weird behaviour otherwise. - - - -The options G_REGEX_UNGREEDY and -G_REGEX_EXTRA and G_REGEX_DUPNAMES -can be changed in the same way as the Perl-compatible options by using -the characters U, X and J respectively. - -
- - -Subpatterns - -Subpatterns are delimited by parentheses (round brackets), which can be -nested. Turning part of a pattern into a subpattern does two things: - - - - -It localizes a set of alternatives. For example, the pattern -cat(aract|erpillar|) matches one of the words "cat", "cataract", or -"caterpillar". Without the parentheses, it would match "cataract", -"erpillar" or an empty string. - - -It sets up the subpattern as a capturing subpattern. This means -that, when the whole pattern matches, that portion of the -string that matched the subpattern can be obtained using g_match_info_fetch(). -Opening parentheses are counted from left to right (starting from 1, as -subpattern 0 is the whole matched string) to obtain numbers for the -capturing subpatterns. - - - - -For example, if the string "the red king" is matched against the pattern - - - -the ((red|white) (king|queen)) - - - -the captured substrings are "red king", "red", and "king", and are numbered 1, 2, and 3, respectively. - - - -The fact that plain parentheses fulfil two functions is not always -helpful. There are often times when a grouping subpattern is required -without a capturing requirement. If an opening parenthesis is followed -by a question mark and a colon, the subpattern does not do any capturing, -and is not counted when computing the number of any subsequent -capturing subpatterns. For example, if the string "the white queen" is -matched against the pattern - - - -the ((?:red|white) (king|queen)) - - - -the captured substrings are "white queen" and "queen", and are numbered -1 and 2. The maximum number of capturing subpatterns is 65535. - - - -As a convenient shorthand, if any option settings are required at the -start of a non-capturing subpattern, the option letters may appear -between the "?" and the ":". Thus the two patterns - - - -(?i:saturday|sunday) -(?:(?i)saturday|sunday) - - - -match exactly the same set of strings. Because alternative branches are -tried from left to right, and options are not reset until the end of -the subpattern is reached, an option setting in one branch does affect -subsequent branches, so the above patterns match "SUNDAY" as well as -"Saturday". - - - - -Named subpatterns - -Identifying capturing parentheses by number is simple, but it can be -very hard to keep track of the numbers in complicated regular expressions. -Furthermore, if an expression is modified, the numbers may -change. To help with this difficulty, GRegex supports the naming of -subpatterns. A subpattern can be named in one of three ways: (?<name>...) or -(?'name'...) as in Perl, or (?P<name>...) as in Python. -References to capturing parentheses from other -parts of the pattern, such as backreferences, recursion, and conditions, -can be made by name as well as by number. - - - -Names consist of up to 32 alphanumeric characters and underscores. Named -capturing parentheses are still allocated numbers as well as names, exactly as -if the names were not present. -By default, a name must be unique within a pattern, but it is possible to relax -this constraint by setting the G_REGEX_DUPNAMES option at -compile time. This can be useful for patterns where only one instance of the -named parentheses can match. Suppose you want to match the name of a weekday, -either as a 3-letter abbreviation or as the full name, and in both cases you -want to extract the abbreviation. This pattern (ignoring the line breaks) does -the job: - - - -(?<DN>Mon|Fri|Sun)(?:day)?| -(?<DN>Tue)(?:sday)?| -(?<DN>Wed)(?:nesday)?| -(?<DN>Thu)(?:rsday)?| -(?<DN>Sat)(?:urday)? - - - -There are five capturing substrings, but only one is ever set after a match. -The function for extracting the data by name returns the substring -for the first (and in this example, the only) subpattern of that name that -matched. This saves searching to find which numbered subpattern it was. If you -make a reference to a non-unique named subpattern from elsewhere in the -pattern, the one that corresponds to the lowest number is used. - - - - -Repetition - -Repetition is specified by quantifiers, which can follow any of the -following items: - - - -a literal data character -the dot metacharacter -the \C escape sequence -the \X escape sequence (in UTF-8 mode) -the \R escape sequence -an escape such as \d that matches a single character -a character class -a back reference (see next section) -a parenthesized subpattern (unless it is an assertion) - - - -The general repetition quantifier specifies a minimum and maximum number -of permitted matches, by giving the two numbers in curly brackets -(braces), separated by a comma. The numbers must be less than 65536, -and the first must be less than or equal to the second. For example: - - - -z{2,4} - - - -matches "zz", "zzz", or "zzzz". A closing brace on its own is not a -special character. If the second number is omitted, but the comma is -present, there is no upper limit; if the second number and the comma -are both omitted, the quantifier specifies an exact number of required -matches. Thus - - - -[aeiou]{3,} - - - -matches at least 3 successive vowels, but may match many more, while - - - -\d{8} - - - -matches exactly 8 digits. An opening curly bracket that appears in a -position where a quantifier is not allowed, or one that does not match -the syntax of a quantifier, is taken as a literal character. For example, -{,6} is not a quantifier, but a literal string of four characters. - - - -In UTF-8 mode, quantifiers apply to UTF-8 characters rather than to -individual bytes. Thus, for example, \x{100}{2} matches two UTF-8 -characters, each of which is represented by a two-byte sequence. Similarly, -\X{3} matches three Unicode extended sequences, each of which may be -several bytes long (and they may be of different lengths). - - - -The quantifier {0} is permitted, causing the expression to behave as if -the previous item and the quantifier were not present. - - - -For convenience, the three most common quantifiers have single-character -abbreviations: - - - -Abbreviations for quantifiers - - - - - Abbreviation - Meaning - - - - - * - is equivalent to {0,} - - - + - is equivalent to {1,} - - - ? - is equivalent to {0,1} - - - -
- - -It is possible to construct infinite loops by following a subpattern -that can match no characters with a quantifier that has no upper limit, -for example: - - - -(a?)* - - - -Because there are cases where this can be useful, such patterns are -accepted, but if any repetition of the subpattern does in fact match -no characters, the loop is forcibly broken. - - - -By default, the quantifiers are "greedy", that is, they match as much -as possible (up to the maximum number of permitted times), without -causing the rest of the pattern to fail. The classic example of where -this gives problems is in trying to match comments in C programs. These -appear between /* and */ and within the comment, individual * and / -characters may appear. An attempt to match C comments by applying the -pattern - - - -/\*.*\*/ - - - -to the string - - - -/* first comment */ not comment /* second comment */ - - - -fails, because it matches the entire string owing to the greediness of -the .* item. - - - -However, if a quantifier is followed by a question mark, it ceases to -be greedy, and instead matches the minimum number of times possible, so -the pattern - - - -/\*.*?\*/ - - - -does the right thing with the C comments. The meaning of the various -quantifiers is not otherwise changed, just the preferred number of -matches. Do not confuse this use of question mark with its use as a -quantifier in its own right. Because it has two uses, it can sometimes -appear doubled, as in - - - -\d??\d - - - -which matches one digit by preference, but can match two if that is the -only way the rest of the pattern matches. - - - -If the G_REGEX_UNGREEDY flag is set, the quantifiers are not greedy -by default, but individual ones can be made greedy by following them with -a question mark. In other words, it inverts the default behaviour. - - - -When a parenthesized subpattern is quantified with a minimum repeat -count that is greater than 1 or with a limited maximum, more memory is -required for the compiled pattern, in proportion to the size of the -minimum or maximum. - - - -If a pattern starts with .* or .{0,} and the G_REGEX_DOTALL flag -is set, thus allowing the dot to match newlines, the -pattern is implicitly anchored, because whatever follows will be tried -against every character position in the string, so there is no -point in retrying the overall match at any position after the first. -GRegex normally treats such a pattern as though it were preceded by \A. - - - -In cases where it is known that the string contains no newlines, it -is worth setting G_REGEX_DOTALL in order to obtain this optimization, -or alternatively using ^ to indicate anchoring explicitly. - - - -However, there is one situation where the optimization cannot be used. -When .* is inside capturing parentheses that are the subject of a -backreference elsewhere in the pattern, a match at the start may fail -where a later one succeeds. Consider, for example: - - - -(.*)abc\1 - - - -If the string is "xyz123abc123" the match point is the fourth character. -For this reason, such a pattern is not implicitly anchored. - - - -When a capturing subpattern is repeated, the value captured is the -substring that matched the final iteration. For example, after - - - -(tweedle[dume]{3}\s*)+ - - - -has matched "tweedledum tweedledee" the value of the captured substring -is "tweedledee". However, if there are nested capturing subpatterns, -the corresponding captured values may have been set in previous iterations. -For example, after - - - -/(a|(b))+/ - - - -matches "aba" the value of the second captured substring is "b". - -
- - -Atomic grouping and possessive quantifiers - -With both maximizing ("greedy") and minimizing ("ungreedy" or "lazy") -repetition, failure of what follows normally causes the repeated -item to be re-evaluated to see if a different number -of repeats allows the rest of the pattern to match. Sometimes it -is useful to prevent this, either to change the nature of the -match, or to cause it fail earlier than it otherwise might, when the -author of the pattern knows there is no point in carrying on. - - - -Consider, for example, the pattern \d+foo when applied to the string - - - -123456bar - - - -After matching all 6 digits and then failing to match "foo", the normal -action of the matcher is to try again with only 5 digits matching the -\d+ item, and then with 4, and so on, before ultimately failing. -"Atomic grouping" (a term taken from Jeffrey Friedl’s book) provides -the means for specifying that once a subpattern has matched, it is not -to be re-evaluated in this way. - - - -If we use atomic grouping for the previous example, the matcher -give up immediately on failing to match "foo" the first time. The notation -is a kind of special parenthesis, starting with (?> as in this -example: - - - -(?>\d+)foo - - - -This kind of parenthesis "locks up" the part of the pattern it contains -once it has matched, and a failure further into the pattern is -prevented from backtracking into it. Backtracking past it to previous -items, however, works as normal. - - - -An alternative description is that a subpattern of this type matches -the string of characters that an identical standalone pattern would -match, if anchored at the current point in the string. - - - -Atomic grouping subpatterns are not capturing subpatterns. Simple cases -such as the above example can be thought of as a maximizing repeat that -must swallow everything it can. So, while both \d+ and \d+? are prepared -to adjust the number of digits they match in order to make the -rest of the pattern match, (?>\d+) can only match an entire sequence of -digits. - - - -Atomic groups in general can of course contain arbitrarily complicated -subpatterns, and can be nested. However, when the subpattern for an -atomic group is just a single repeated item, as in the example above, a -simpler notation, called a "possessive quantifier" can be used. This -consists of an additional + character following a quantifier. Using -this notation, the previous example can be rewritten as - - - -\d++foo - - - -Possessive quantifiers are always greedy; the setting of the -G_REGEX_UNGREEDY option is ignored. They are a convenient notation for the -simpler forms of atomic group. However, there is no difference in the -meaning of a possessive quantifier and the equivalent -atomic group, though there may be a performance difference; -possessive quantifiers should be slightly faster. - - - -The possessive quantifier syntax is an extension to the Perl syntax. -It was invented by Jeffrey Friedl in the first edition of his book and -then implemented by Mike McCloskey in Sun's Java package. -It ultimately found its way into Perl at release 5.10. - - - -GRegex has an optimization that automatically "possessifies" certain simple -pattern constructs. For example, the sequence A+B is treated as A++B because -there is no point in backtracking into a sequence of A's when B must follow. - - - -When a pattern contains an unlimited repeat inside a subpattern that -can itself be repeated an unlimited number of times, the use of an -atomic group is the only way to avoid some failing matches taking a -very long time indeed. The pattern - - - -(\D+|<\d+>)*[!?] - - - -matches an unlimited number of substrings that either consist of non- -digits, or digits enclosed in <>, followed by either ! or ?. When it -matches, it runs quickly. However, if it is applied to - - - -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - - - -it takes a long time before reporting failure. This is because the -string can be divided between the internal \D+ repeat and the external -* repeat in a large number of ways, and all have to be tried. (The -example uses [!?] rather than a single character at the end, because -GRegex has an optimization that allows for fast failure -when a single character is used. It remember the last single character -that is required for a match, and fail early if it is not present -in the string.) If the pattern is changed so that it uses an atomic -group, like this: - - - -((?>\D+)|<\d+>)*[!?] - - - -sequences of non-digits cannot be broken, and failure happens quickly. - - - - -Back references - -Outside a character class, a backslash followed by a digit greater than -0 (and possibly further digits) is a back reference to a capturing subpattern -earlier (that is, to its left) in the pattern, provided there have been that -many previous capturing left parentheses. - - - -However, if the decimal number following the backslash is less than 10, -it is always taken as a back reference, and causes an error only if -there are not that many capturing left parentheses in the entire pattern. -In other words, the parentheses that are referenced need not be -to the left of the reference for numbers less than 10. A "forward back -reference" of this type can make sense when a repetition is involved and -the subpattern to the right has participated in an earlier iteration. - - - -It is not possible to have a numerical "forward back reference" to subpattern -whose number is 10 or more using this syntax because a sequence such as \e50 is -interpreted as a character defined in octal. See the subsection entitled -"Non-printing characters" above for further details of the handling of digits -following a backslash. There is no such problem when named parentheses are used. -A back reference to any subpattern is possible using named parentheses (see below). - - - -Another way of avoiding the ambiguity inherent in the use of digits following a -backslash is to use the \g escape sequence (introduced in Perl 5.10.) -This escape must be followed by a positive or a negative number, -optionally enclosed in braces. - - - -A positive number specifies an absolute reference without the ambiguity that is -present in the older syntax. It is also useful when literal digits follow the -reference. A negative number is a relative reference. Consider "(abc(def)ghi)\g{-1}", -the sequence \g{-1} is a reference to the most recently started capturing -subpattern before \g, that is, is it equivalent to \2. Similarly, \g{-2} -would be equivalent to \1. The use of relative references can be helpful in -long patterns, and also in patterns that are created by joining together -fragments that contain references within themselves. - - - -A back reference matches whatever actually matched the capturing subpattern -in the current string, rather than anything matching -the subpattern itself (see "Subpatterns as subroutines" below for a way -of doing that). So the pattern - - - -(sens|respons)e and \1ibility - - - -matches "sense and sensibility" and "response and responsibility", but -not "sense and responsibility". If caseful matching is in force at the -time of the back reference, the case of letters is relevant. For example, - - - -((?i)rah)\s+\1 - - - -matches "rah rah" and "RAH RAH", but not "RAH rah", even though the -original capturing subpattern is matched caselessly. - - - -Back references to named subpatterns use the Perl syntax \k<name> or \k'name' -or the Python syntax (?P=name). We could rewrite the above example in either of -the following ways: - - - -(?<p1>(?i)rah)\s+\k<p1> -(?P<p1>(?i)rah)\s+(?P=p1) - - - -A subpattern that is referenced by name may appear in the pattern before or -after the reference. - - - -There may be more than one back reference to the same subpattern. If a -subpattern has not actually been used in a particular match, any back -references to it always fail. For example, the pattern - - - -(a|(bc))\2 - - - -always fails if it starts to match "a" rather than "bc". Because there -may be many capturing parentheses in a pattern, all digits following -the backslash are taken as part of a potential back reference number. -If the pattern continues with a digit character, some delimiter must be -used to terminate the back reference. If the G_REGEX_EXTENDED flag is -set, this can be whitespace. Otherwise an empty comment (see "Comments" below) can be used. - - - -A back reference that occurs inside the parentheses to which it refers -fails when the subpattern is first used, so, for example, (a\1) never -matches. However, such references can be useful inside repeated subpatterns. -For example, the pattern - - - -(a|b\1)+ - - - -matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration -of the subpattern, the back reference matches the character -string corresponding to the previous iteration. In order for this to -work, the pattern must be such that the first iteration does not need -to match the back reference. This can be done using alternation, as in -the example above, or by a quantifier with a minimum of zero. - - - - -Assertions - -An assertion is a test on the characters following or preceding the -current matching point that does not actually consume any characters. -The simple assertions coded as \b, \B, \A, \G, \Z, \z, ^ and $ are -described above. - - - -More complicated assertions are coded as subpatterns. There are two -kinds: those that look ahead of the current position in the -string, and those that look behind it. An assertion subpattern is -matched in the normal way, except that it does not cause the current -matching position to be changed. - - - -Assertion subpatterns are not capturing subpatterns, and may not be -repeated, because it makes no sense to assert the same thing several -times. If any kind of assertion contains capturing subpatterns within -it, these are counted for the purposes of numbering the capturing -subpatterns in the whole pattern. However, substring capturing is carried -out only for positive assertions, because it does not make sense for -negative assertions. - - - -Lookahead assertions - -Lookahead assertions start with (?= for positive assertions and (?! for -negative assertions. For example, - - - -\w+(?=;) - - - -matches a word followed by a semicolon, but does not include the semicolon -in the match, and - - - -foo(?!bar) - - - -matches any occurrence of "foo" that is not followed by "bar". Note -that the apparently similar pattern - - - -(?!foo)bar - - - -does not find an occurrence of "bar" that is preceded by something -other than "foo"; it finds any occurrence of "bar" whatsoever, because -the assertion (?!foo) is always true when the next three characters are -"bar". A lookbehind assertion is needed to achieve the other effect. - - - -If you want to force a matching failure at some point in a pattern, the -most convenient way to do it is with (?!) because an empty string -always matches, so an assertion that requires there not to be an empty -string must always fail. - - - - -Lookbehind assertions - -Lookbehind assertions start with (?<= for positive assertions and (?<! -for negative assertions. For example, - - - -(?<!foo)bar - - - -does find an occurrence of "bar" that is not preceded by "foo". The -contents of a lookbehind assertion are restricted such that all the -strings it matches must have a fixed length. However, if there are -several top-level alternatives, they do not all have to have the same -fixed length. Thus - - - -(?<=bullock|donkey) - - - -is permitted, but - - - -(?<!dogs?|cats?) - - - -causes an error at compile time. Branches that match different length -strings are permitted only at the top level of a lookbehind assertion. -An assertion such as - - - -(?<=ab(c|de)) - - - -is not permitted, because its single top-level branch can match two -different lengths, but it is acceptable if rewritten to use two top- -level branches: - - - -(?<=abc|abde) - - - -The implementation of lookbehind assertions is, for each alternative, -to temporarily move the current position back by the fixed length and -then try to match. If there are insufficient characters before the -current position, the assertion fails. - - - -GRegex does not allow the \C escape (which matches a single byte in UTF-8 -mode) to appear in lookbehind assertions, because it makes it impossible -to calculate the length of the lookbehind. The \X and \R escapes, which can -match different numbers of bytes, are also not permitted. - - - -Possessive quantifiers can be used in conjunction with lookbehind assertions to -specify efficient matching at the end of the subject string. Consider a simple -pattern such as - - - -abcd$ - - - -when applied to a long string that does not match. Because matching -proceeds from left to right, GRegex will look for each "a" in the string -and then see if what follows matches the rest of the pattern. If the -pattern is specified as - - - -^.*abcd$ - - - -the initial .* matches the entire string at first, but when this fails -(because there is no following "a"), it backtracks to match all but the -last character, then all but the last two characters, and so on. Once -again the search for "a" covers the entire string, from right to left, -so we are no better off. However, if the pattern is written as - - - -^.*+(?<=abcd) - - - -there can be no backtracking for the .*+ item; it can match only the -entire string. The subsequent lookbehind assertion does a single test -on the last four characters. If it fails, the match fails immediately. -For long strings, this approach makes a significant difference to the -processing time. - - - - -Using multiple assertions - -Several assertions (of any sort) may occur in succession. For example, - - - -(?<=\d{3})(?<!999)foo - - - -matches "foo" preceded by three digits that are not "999". Notice that -each of the assertions is applied independently at the same point in -the string. First there is a check that the previous three -characters are all digits, and then there is a check that the same -three characters are not "999". This pattern does not match "foo" preceded -by six characters, the first of which are digits and the last -three of which are not "999". For example, it doesn’t match "123abcfoo". -A pattern to do that is - - - -(?<=\d{3}...)(?<!999)foo - - - -This time the first assertion looks at the preceding six characters, -checking that the first three are digits, and then the second assertion -checks that the preceding three characters are not "999". - - - -Assertions can be nested in any combination. For example, - - - -(?<=(?<!foo)bar)baz - - - -matches an occurrence of "baz" that is preceded by "bar" which in turn -is not preceded by "foo", while - - - -(?<=\d{3}(?!999)...)foo - - - -is another pattern that matches "foo" preceded by three digits and any -three characters that are not "999". - - - - - -Conditional subpatterns - -It is possible to cause the matching process to obey a subpattern -conditionally or to choose between two alternative subpatterns, depending -on the result of an assertion, or whether a previous capturing subpattern -matched or not. The two possible forms of conditional subpattern are - - - -(?(condition)yes-pattern) -(?(condition)yes-pattern|no-pattern) - - - -If the condition is satisfied, the yes-pattern is used; otherwise the -no-pattern (if present) is used. If there are more than two alternatives -in the subpattern, a compile-time error occurs. - - - -There are four kinds of condition: references to subpatterns, references to -recursion, a pseudo-condition called DEFINE, and assertions. - - - -Checking for a used subpattern by number - -If the text between the parentheses consists of a sequence of digits, the -condition is true if the capturing subpattern of that number has previously -matched. - - - -Consider the following pattern, which contains non-significant white space -to make it more readable (assume the G_REGEX_EXTENDED) -and to divide it into three parts for ease of discussion: - - - -( \( )? [^()]+ (?(1) \) ) - - - -The first part matches an optional opening parenthesis, and if that -character is present, sets it as the first captured substring. The second -part matches one or more characters that are not parentheses. The -third part is a conditional subpattern that tests whether the first set -of parentheses matched or not. If they did, that is, if string started -with an opening parenthesis, the condition is true, and so the yes-pattern -is executed and a closing parenthesis is required. Otherwise, -since no-pattern is not present, the subpattern matches nothing. In -other words, this pattern matches a sequence of non-parentheses, -optionally enclosed in parentheses. - - - - -Checking for a used subpattern by name - -Perl uses the syntax (?(<name>)...) or (?('name')...) to test for a used -subpattern by name, the Python syntax (?(name)...) is also recognized. However, -there is a possible ambiguity with this syntax, because subpattern names may -consist entirely of digits. GRegex looks first for a named subpattern; if it -cannot find one and the name consists entirely of digits, GRegex looks for a -subpattern of that number, which must be greater than zero. Using subpattern -names that consist entirely of digits is not recommended. - - - -Rewriting the above example to use a named subpattern gives this: - - - -(?<OPEN> \( )? [^()]+ (?(<OPEN>) \) ) - - - - -Checking for pattern recursion - -If the condition is the string (R), and there is no subpattern with the name R, -the condition is true if a recursive call to the whole pattern or any -subpattern has been made. If digits or a name preceded by ampersand follow the -letter R, for example: - - - -(?(R3)...) -(?(R&name)...) - - - -the condition is true if the most recent recursion is into the subpattern whose -number or name is given. This condition does not check the entire recursion -stack. - - - -At "top level", all these recursion test conditions are false. Recursive -patterns are described below. - - - - -Defining subpatterns for use by reference only - -If the condition is the string (DEFINE), and there is no subpattern with the -name DEFINE, the condition is always false. In this case, there may be only one -alternative in the subpattern. It is always skipped if control reaches this -point in the pattern; the idea of DEFINE is that it can be used to define -"subroutines" that can be referenced from elsewhere. (The use of "subroutines" -is described below.) For example, a pattern to match an IPv4 address could be -written like this (ignore whitespace and line breaks): - - - -(?(DEFINE) (?<byte> 2[0-4]\d | 25[0-5] | 1\d\d | [1-9]?\d) ) -\b (?&byte) (\.(?&byte)){3} \b - - - -The first part of the pattern is a DEFINE group inside which another group -named "byte" is defined. This matches an individual component of an IPv4 -address (a number less than 256). When matching takes place, this part of the -pattern is skipped because DEFINE acts like a false condition. - - - -The rest of the pattern uses references to the named group to match the four -dot-separated components of an IPv4 address, insisting on a word boundary at -each end. - - - - -Assertion conditions - -If the condition is not in any of the above formats, it must be an -assertion. This may be a positive or negative lookahead or lookbehind -assertion. Consider this pattern, again containing non-significant -white space, and with the two alternatives on the second line: - - - -(?(?=[^a-z]*[a-z]) -\d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) - - - -The condition is a positive lookahead assertion that matches an -optional sequence of non-letters followed by a letter. In other words, -it tests for the presence of at least one letter in the string. If a -letter is found, the string is matched against the first alternative; -otherwise it is matched against the second. This pattern matches -strings in one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are -letters and dd are digits. - - - - - -Comments - -The sequence (?# marks the start of a comment that continues up to the -next closing parenthesis. Nested parentheses are not permitted. The -characters that make up a comment play no part in the pattern matching -at all. - - - -If the G_REGEX_EXTENDED option is set, an unescaped # -character outside a character class introduces a comment that continues to -immediately after the next newline in the pattern. - - - - -Recursive patterns - -Consider the problem of matching a string in parentheses, allowing for -unlimited nested parentheses. Without the use of recursion, the best -that can be done is to use a pattern that matches up to some fixed -depth of nesting. It is not possible to handle an arbitrary nesting -depth. - - - -For some time, Perl has provided a facility that allows regular expressions to -recurse (amongst other things). It does this by interpolating Perl code in the -expression at run time, and the code can refer to the expression itself. A Perl -pattern using code interpolation to solve the parentheses problem can be -created like this: - - - -$re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; - - - -The (?p{...}) item interpolates Perl code at run time, and in this case refers -recursively to the pattern in which it appears. - - - -Obviously, GRegex cannot support the interpolation of Perl code. Instead, it -supports special syntax for recursion of the entire pattern, and also for -individual subpattern recursion. This kind of recursion was introduced into -Perl at release 5.10. - - - -A special item that consists of (? followed by a number greater than zero and a -closing parenthesis is a recursive call of the subpattern of the given number, -provided that it occurs inside that subpattern. (If not, it is a "subroutine" -call, which is described in the next section.) The special item (?R) or (?0) is -a recursive call of the entire regular expression. - - - -In GRegex (like Python, but unlike Perl), a recursive subpattern call is always -treated as an atomic group. That is, once it has matched some of the subject -string, it is never re-entered, even if it contains untried alternatives and -there is a subsequent matching failure. - - - -This pattern solves the nested parentheses problem (assume the -G_REGEX_EXTENDED option is set so that white space is -ignored): - - - -\( ( (?>[^()]+) | (?R) )* \) - - - -First it matches an opening parenthesis. Then it matches any number of -substrings which can either be a sequence of non-parentheses, or a -recursive match of the pattern itself (that is, a correctly parenthesized -substring). Finally there is a closing parenthesis. - - - -If this were part of a larger pattern, you would not want to recurse -the entire pattern, so instead you could use this: - - - -( \( ( (?>[^()]+) | (?1) )* \) ) - - - -We have put the pattern into parentheses, and caused the recursion to -refer to them instead of the whole pattern. In a larger pattern, keeping -track of parenthesis numbers can be tricky. It may be more convenient to -use named parentheses instead. -The Perl syntax for this is (?&name); GRegex also supports the(?P>name) -syntax. We could rewrite the above example as follows: - - - -(?<pn> \( ( (?>[^()]+) | (?&pn) )* \) ) - - - -If there is more than one subpattern with the same name, the earliest one is -used. This particular example pattern contains nested unlimited repeats, and so -the use of atomic grouping for matching strings of non-parentheses is important -when applying the pattern to strings that do not match. -For example, when this pattern is applied to - - - -(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() - - - -it yields "no match" quickly. However, if atomic grouping is not used, -the match runs for a very long time indeed because there are so many -different ways the + and * repeats can carve up the string, and all -have to be tested before failure can be reported. - - - -At the end of a match, the values set for any capturing subpatterns are -those from the outermost level of the recursion at which the subpattern -value is set. - - - -If the pattern above is matched against - - - -(ab(cd)ef) - - - -the value for the capturing parentheses is "ef", which is the last -value taken on at the top level. If additional parentheses are added, -giving - - - -\( ( ( (?>[^()]+) | (?R) )* ) \) - ^ ^ - ^ ^ - - - -the string they capture is "ab(cd)ef", the contents of the top level -parentheses. - - - -Do not confuse the (?R) item with the condition (R), which tests for -recursion. Consider this pattern, which matches text in angle brackets, -allowing for arbitrary nesting. Only digits are allowed in nested -brackets (that is, when recursing), whereas any characters are permitted -at the outer level. - - - -< (?: (?(R) \d++ | [^<>]*+) | (?R)) * > - - - -In this pattern, (?(R) is the start of a conditional subpattern, with -two different alternatives for the recursive and non-recursive cases. -The (?R) item is the actual recursive call. - - - - -Subpatterns as subroutines - -If the syntax for a recursive subpattern reference (either by number or -by name) is used outside the parentheses to which it refers, it operates -like a subroutine in a programming language. The "called" subpattern may -be defined before or after the reference. An earlier example pointed out -that the pattern - - - -(sens|respons)e and \1ibility - - - -matches "sense and sensibility" and "response and responsibility", but -not "sense and responsibility". If instead the pattern - - - -(sens|respons)e and (?1)ibility - - - -is used, it does match "sense and responsibility" as well as the other -two strings. Another example is given in the discussion of DEFINE above. - - - -Like recursive subpatterns, a "subroutine" call is always treated as an atomic -group. That is, once it has matched some of the string, it is never -re-entered, even if it contains untried alternatives and there is a subsequent -matching failure. - - - -When a subpattern is used as a subroutine, processing options such as -case-independence are fixed when the subpattern is defined. They cannot be -changed for different calls. For example, consider this pattern: - - - -(abc)(?i:(?1)) - - - -It matches "abcabc". It does not match "abcABC" because the change of -processing option does not affect the called subpattern. - - - - -Copyright - -This document was copied and adapted from the PCRE documentation, -specifically from the man page for pcrepattern. -The original copyright note is: - - - -Copyright (c) 1997-2006 University of Cambridge. - -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 the University of Cambridge nor the name of Google - Inc. nor the names of their 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. - - - -
diff --git a/docs/reference/glib/resources.md b/docs/reference/glib/resources.md new file mode 100644 index 0000000..fbac645 --- /dev/null +++ b/docs/reference/glib/resources.md @@ -0,0 +1,43 @@ +Title: Support and Bug Reports +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2002 Matthias Clasen +SPDX-FileCopyrightText: 2018 Collabora, Ltd. +SPDX-FileCopyrightText: 2019 Emmanuele Bassi + +# Support and Bug Reports + +## Filing a Bug Report or Feature Request + +If you encounter a bug, misfeature, or missing feature in GLib, please +file a bug report on the issue tracker at +[https://gitlab.gnome.org/GNOME/glib/issues/new](https://gitlab.gnome.org/GNOME/glib/issues/new). +We’d also appreciate reports of incomplete or misleading information in +the GLib documentation; file those with the ‘Documentation’ label. + +Don’t hesitate to file a bug report, even if you think we may know +about it already, or aren’t sure of the details. Just give us as much +information as you have, and if it’s already fixed or has already been +discussed, we’ll add a note to that effect in the report. + +The issue tracker should definitely be used for feature requests, it’s +not only for bugs. We track all GLib development in GitLab, so it’s +the way to be sure the GLib developers won’t forget about an issue. + +## Code Contributions + +If you develop a bugfix or enhancement for GLib, please open a merge request +for that in GitLab as well. All branches must be offered under the terms of +the GNU LGPL license, so be sure you are authorized to give us the branch +under those terms. + +If you want to discuss your branch before or after developing it, open a +topic on [Discourse](https://discourse.gnome.org/tags/glib). +But be sure to create the GitLab merge request as well; if the branch is only +on the list and not in GitLab, it’s likely to slip through the cracks. + +## Discussions and User Questions + +The [GLib issue tracker](https://gitlab.gnome.org/GNOME/glib/issues) +is meant for discussions with actionable topics. If you want to ask a question +about using GLib, or discuss new features, you should use +[the `glib` tag on Discourse](https://discourse.gnome.org/tags/glib). diff --git a/docs/reference/glib/resources.xml b/docs/reference/glib/resources.xml deleted file mode 100644 index c5cfa78..0000000 --- a/docs/reference/glib/resources.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - -Mailing lists and bug reports -3 -Mailing lists and bug reports - - - -Mailing lists and bug reports - -Getting help with GLib - - - - -Filing a bug report or feature request - - -If you encounter a bug, misfeature, or missing feature in GLib, please -file a bug report on the issue tracker at -https://gitlab.gnome.org/GNOME/glib/issues/new. -We'd also appreciate reports of incomplete or misleading information in -the GLib documentation; file those with the ‘Documentation’ label. - - - -Don't hesitate to file a bug report, even if you think we may know -about it already, or aren't sure of the details. Just give us as much -information as you have, and if it's already fixed or has already been -discussed, we'll add a note to that effect in the report. - - - -The issue tracker should definitely be used for feature requests, it's -not only for bugs. We track all GLib development in GitLab, so it's -the way to be sure the GLib developers won't forget about an issue. - - - - - -Code Contributions - - -If you develop a bugfix or enhancement for GLib, please open a merge request -for that in GitLab as well. All branches must be offered under the terms of -the GNU LGPL license, so be sure you are authorized to give us the branch -under those terms. - - - -If you want to discuss your branch before or after developing it, open a -topic on Discourse. -But be sure to create the GitLab merge request as well; if the branch is only -on the list and not in GitLab, it's likely to slip through the cracks. - - - - - -Discussions and user questions - - -The GLib issue tracker -is meant for discussions with actionable topics. If you want to ask a question -about using GLib, or discuss new features, you should use -the glib tag on Discourse. - - - - - - diff --git a/docs/reference/glib/running.md b/docs/reference/glib/running.md new file mode 100644 index 0000000..687ca75 --- /dev/null +++ b/docs/reference/glib/running.md @@ -0,0 +1,295 @@ +Title: Running GLib Applications + +# Running GLib Applications + +## Environment variables + +The runtime behaviour of GLib applications can be influenced by a number of +environment variables. + +Standard variables +: GLib reads standard environment variables like `LANG`, `PATH`, `HOME`, + `TMPDIR`, `TZ` and `LOGNAME`. + +XDG directories +: GLib consults the environment variables `XDG_DATA_HOME`, + `XDG_DATA_DIRS`, `XDG_CONFIG_HOME`, `XDG_CONFIG_DIRS`, `XDG_CACHE_HOME` and + `XDG_RUNTIME_DIR` for the various XDG directories. For more information, see + the [XDG basedir specification](https://specifications.freedesktop.org/basedir-spec/latest/). + +`G_FILENAME_ENCODING` +: This environment variable can be set to a comma-separated list of character + set names. GLib assumes that filenames are encoded in the first character + set from that list rather than in UTF-8. The special token "@locale" can be + used to specify the character set for the current locale. + +`G_BROKEN_FILENAMES` +: If this environment variable is set, GLib assumes that filenames are in the + locale encoding rather than in UTF-8. `G_FILENAME_ENCODING` takes priority + over `G_BROKEN_FILENAMES`. + +`G_MESSAGES_PREFIXED` +: A list of log levels for which messages should be prefixed by the program + name and PID of the application. The default is to prefix everything except + `G_LOG_LEVEL_MESSAGE` and `G_LOG_LEVEL_INFO`. The possible values are error, + warning, critical, message, info and debug. You can also use the special + values all and help. This environment variable only affects the default log + handler, `g_log_default_handler()`. + +`G_MESSAGES_DEBUG` +: A space-separated list of log domains for which informational and debug + messages should be printed. By default, these messages are not printed. You + can also use the special value all. This environment variable only affects + the default log handler, `g_log_default_handler()`. + +`G_DEBUG` +: This environment variable can be set to a list of debug options, which cause + GLib to print out different types of debugging information. + + - `fatal-warnings`: Causes GLib to abort the program at the first call to + `g_warning()` or `g_critical()`. Use of this flag is not recommended + except when debugging. + - `fatal-criticals`: Causes GLib to abort the program at the first call + to `g_critical()`. This flag can be useful during debugging and + testing. + - `gc-friendly`: Newly allocated memory that isn't directly initialized, + as well as memory being freed will be reset to 0. The point here is to + allow memory checkers and similar programs that use Boehm GC alike + algorithms to produce more accurate results. + - `resident-modules`: All modules loaded by GModule will be made + resident. This can be useful for tracking memory leaks in modules which + are later unloaded; but it can also hide bugs where code is accessed + after the module would have normally been unloaded. + - `bind-now-modules`: All modules loaded by GModule will bind their + symbols at load time, even when the code uses `G_MODULE_BIND_LAZY`. + + The special value `all` can be used to turn on all debug options. The special + value `help` can be used to print all available options. + +`G_SLICE` +: This environment variable allowed reconfiguration of the GSlice memory + allocator. Since GLib 2.76, GSlice uses the system `malloc()` implementation + internally, so this variable is ignored. + +`G_RANDOM_VERSION` +: If this environment variable is set to '2.0', the outdated pseudo-random + number seeding and generation algorithms from GLib 2.0 are used instead of + the newer, better ones. You should only set this variable if you have + sequences of numbers that were generated with Glib 2.0 that you need to + reproduce exactly. + +`LIBCHARSET_ALIAS_DIR` +: Allows to specify a nonstandard location for the `charset.aliases` file + that is used by the character set conversion routines. The default + location is the `libdir` specified at compilation time. + +`TZDIR` +: Allows to specify a nonstandard location for the timezone data files that + are used by the `GDateTime` API. The default location is under + `/usr/share/zoneinfo`. For more information, also look at the `tzset` manual + page. + +`G_ENABLE_DIAGNOSTIC` +: If set to a non-zero value, this environment variable enables diagnostic + messages, like deprecation messages for GObject properties and signals. + +`G_DEBUGGER` +: When running on Windows, if set to a non-empty string, GLib will try to + interpret the contents of this environment variable as a command line to a + debugger, and run it if the process crashes. The debugger command line + should contain `%p` and `%e` substitution tokens, which GLib will replace + with the process ID of the crashing process and a handle to an event that + the debugger should signal to let GLib know that the debugger successfully + attached to the process. If `%e` is absent, or if the debugger is not able + to signal events, GLib will resume execution after 60 seconds. If `%p` is + absent, the debugger won't know which process to attach to, and GLib will + also resume execution after 60 seconds. Additionally, even if `G_DEBUGGER` + is not set, GLib would still try to print basic exception information (code + and address) into `stderr`. By default the debugger gets a new console + allocated for it. Set the `G_DEBUGGER_OLD_CONSOLE` environment variable to + any non-empty string to make the debugger inherit the console of the + crashing process. Normally this is only used by the GLib testsuite. The + exception handler is written with the aim of making it as simple as + possible, to minimize the risk of it invoking buggy functions or running + buggy code, which would result in exceptions being raised recursively. + Because of that it lacks most of the amenities that one would expect of + GLib. Namely, it does not support Unicode, so it is highly advisable to + only use ASCII characters in `G_DEBUGGER`. See also `G_VEH_CATCH`. + +`G_VEH_CATCH` +: Catching some exceptions can break the program, since Windows will + sometimes use exceptions for execution flow control and other purposes + other than signalling a crash. The `G_VEH_CATCH` environment variable + augments Vectored Exception Handling on Windows (see `G_DEBUGGER`), + allowing GLib to catch more exceptions. Set this variable to a + comma-separated list of hexadecimal exception codes that should + additionally be caught. By default GLib will only catch Access Violation, + Stack Overflow and Illegal Instruction exceptions. + +## Locale + +A number of interfaces in GLib depend on the current locale in which an +application is running. Therefore, most GLib-using applications should call +`setlocale (LC_ALL, "")` to set up the current locale. + +On Windows, in a C program there are several locale concepts that not +necessarily are synchronized. On one hand, there is the system default ANSI +code-page, which determines what encoding is used for file names handled by +the C library's functions and the Win32 API. (We are talking about the +"narrow" functions here that take character pointers, not the "wide" ones.) + +On the other hand, there is the C library's current locale. The character +set (code-page) used by that is not necessarily the same as the system +default ANSI code-page. Strings in this character set are returned by +functions like `strftime()`. + +## Debugging with GDB + +GLib ships with a set of Python macros for the GDB debugger. These +macros make it easier to debug applications written using GLib. + +To use this you need to install GLib in the same prefix as GDB so that +the Python GDB autoloaded files get installed in the right place for +GDB to pick up. + +You can check if gdb has picked up the GLib gdb scripts correctly by +running the following command in your gdb session. + +``` +(gdb) info auto-load python-scripts +Loaded Script +Yes /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libglib-2.0.so.0.7800.0-gdb.py +Yes /usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.7800.0-gdb.py +``` + +The version numbers and paths might differ based on the OS +distribution, but if you see the entries listed for libglib and +libgobject, then the gdb scripts should work. + +GLib Python macros provide the following benefits while debugging +applications written using GLib. + +1. Pretty printing GLib types +2. Iterating lists using `gforeach` command +3. Backtrace decorations + +### 1. Pretty printing GLib types: + +General pretty printing GLib types should work without having to do +anything special. + +For example, printing a hash table with string keys will display the hash +contents in the following format. + +``` +(gdb) print my_string_hash_variable +$1 = 0x5555556d9660 = { + [0x7ffff76f6592 "GdkWaylandPopup"] = 0x555555768a50, + [0x7ffff76e67e8 "GtkStyleProvider"] = 0x5555557a19c0, + [0x7ffff7db7151 "GHttpProxy"] = 0x5555556f5bc0 +} +``` + +Printing a hash table with pointer keys will display the hash contents +in the following format. + +``` +(gdb) print my_pointer_hash_variable +$2 = 0x5555556dcb50 = { + [0x555555b59ec0] = 0x555555b59770, + [0x555555c79f80] = 0x555555c86b00, + [0x555555c68f40] = 0x555555c69630 +} +``` + +Printing a list will display the list contents in the following +format. + +``` +(gdb) p my_appname_list +$3 = 0x55c4582deef0 = {0x7f16ab85dc90, 0x7f16abb02700, 0x7f16a80066e0} +``` + +It's not possible for us to decode and print string entries even if +the list has string entries, as GLib stores list entries as +`gpointer`s internally. But, that can be achieved using the `gforeach` +command. + +### 2. Iterating lists using "gforeach" command: + +The `gforeach` command can be used to apply a command on each item in +a list (`GList`/`GSList`). We can also type cast the `gpointer`s in the +list to desired type. + +For example, to print all strings in a string list named `my_appname_list`, +you can do the following. + +``` +(gdb) gforeach appname in my_appname_list: print (gchar*) $appname +$4 = (gchar *) 0x7f16ab85dc90 "Boxes" +$5 = (gchar *) 0x7f16abb02700 "GNOME Application Platform version 45" +$6 = (gchar *) 0x7f16a80066e0 "Firefox ESR" +``` + +You can also call functions on each entry in the list, as below: + +``` +(gdb) gforeach appname in my_appname_list: call (int) strlen($appname) +$7 = 5 +$8 = 37 +$9 = 11 +``` + +### 3. Backtrace decorations: + +Backtraces are decorated with GLib type names and signal names. + +E.g. From the below backtrace, we can say that +`gs_updates_page_button_refresh_cb ()` callback function was called +when a button (via the `GtkButton` type decoration) was clicked (via +the `clicked` signal decoration) + +``` +#0 gs_updates_page_button_refresh_cb (widget=0x5602f986b670 [GtkButton], self=0x5602f93aeb80 [GsUpdatesPage]) at ../src/gs-updates-page.c:826 +#1 0x00007f09da7651de in (instance=0x5602f986b670, signal_id=158, detail=0) at ../gobject/gsignal.c:3675 +#2 0x00007f09da747bad in g_cclosure_marshal_VOID__VOIDv (closure=0x5602f986c6a0, return_value=0x0, instance=0x5602f986b670, ...) + at ../gobject/gmarshal.c:165 +… +#20 0x00007f09da52c250 in g_application_run (application=0x5602f9068ae0 [GsApplication], argc=1, argv=0x7ffcfb3bb468) at ../gio/gapplication.c:2577 +#21 0x00005602f8b53ccd in main (argc=1, argv=0x7ffcfb3bb468) at ../src/gs-main.c:49 +``` + +Following is the same backtrace without any GLib decorations, which is +not very useful. + +``` +#0 gs_updates_page_button_refresh_cb (widget=0x5602f986b670, self=0x5602f93aeb80) at ../src/gs-updates-page.c:826 +#1 0x00007f09da747bad in g_cclosure_marshal_VOID__VOIDv (closure=0x5602f986c6a0, return_value=0x0, instance=0x5602f986b670, ...) + at ../gobject/gmarshal.c:165 +… +#20 0x00007f09da52c250 in g_application_run (application=0x5602f9068ae0, argc=1, argv=0x7ffcfb3bb468) at ../gio/gapplication.c:2577 +#21 0x00005602f8b53ccd in main (argc=1, argv=0x7ffcfb3bb468) at ../src/gs-main.c:49 +``` + +## SystemTap + +SystemTap is a dynamic whole-system analysis toolkit. GLib ships with a file +`libglib-2.0.so.*.stp` which defines a set of probe points, which you can hook +into with custom SystemTap scripts. See the files `libglib-2.0.so.*.stp`, +`libgobject-2.0.so.*.stp` and `libgio-2.0.so.*.stp` which are in your shared +SystemTap scripts directory. + +## Memory statistics + +`g_mem_profile()` will output a summary `g_malloc()` memory usage, if memory +profiling has been enabled by calling: + +``` +g_mem_set_vtable (glib_mem_profiler_table); +``` + +upon startup. + +If GLib has been configured with full debugging support, then +`g_slice_debug_tree_statistics()` can be called in a debugger to output details +about the memory usage of the slice allocator. diff --git a/docs/reference/glib/running.xml b/docs/reference/glib/running.xml deleted file mode 100644 index dbf22ad..0000000 --- a/docs/reference/glib/running.xml +++ /dev/null @@ -1,371 +0,0 @@ - - - - -Running GLib Applications -3 -GLib Library - - - -Running GLib Applications - -How to run and debug your GLib application - - - - -Running and debugging GLib Applications - - -Environment variables - - - The runtime behaviour of GLib applications can be influenced by a - number of environment variables. - - - - Standard variables - - - GLib reads standard environment variables like LANG, - PATH, HOME, TMPDIR, - TZ and LOGNAME. - - - - - XDG directories - - - GLib consults the environment variables XDG_DATA_HOME, - XDG_DATA_DIRS, XDG_CONFIG_HOME, - XDG_CONFIG_DIRS, XDG_CACHE_HOME and - XDG_RUNTIME_DIR for the various XDG directories. - For more information, see the XDG basedir spec. - - - - - <envar>G_FILENAME_ENCODING</envar> - - - This environment variable can be set to a comma-separated list of character - set names. GLib assumes that filenames are encoded in the first character - set from that list rather than in UTF-8. The special token "@locale" can be - used to specify the character set for the current locale. - - - - - <envar>G_BROKEN_FILENAMES</envar> - - - If this environment variable is set, GLib assumes that filenames are in - the locale encoding rather than in UTF-8. G_FILENAME_ENCODING takes - priority over G_BROKEN_FILENAMES. - - - - - <envar>G_MESSAGES_PREFIXED</envar> - - - A list of log levels for which messages should be prefixed by the - program name and PID of the application. The default is to prefix - everything except G_LOG_LEVEL_MESSAGE and - G_LOG_LEVEL_INFO. - The possible values are - error, - warning, - critical, - message, - info and - debug. - You can also use the special values - all and - help. - - - This environment variable only affects the default log handler, - g_log_default_handler(). - - - - - <envar>G_MESSAGES_DEBUG</envar> - - - A space-separated list of log domains for which informational - and debug messages should be printed. By default, these - messages are not printed. - - - You can also use the special value all. - - - This environment variable only affects the default log handler, - g_log_default_handler(). - - - - - <envar>G_DEBUG</envar> - - - This environment variable can be set to a list of debug options, - which cause GLib to print out different types of debugging information. - - - fatal-warnings - Causes GLib to abort the program at the first call - to g_warning() or g_critical(). Use of this flag is not - recommended except when debugging. - - - - fatal-criticals - Causes GLib to abort the program at the first call - to g_critical(). This flag can be useful during debugging and - testing. - - - - gc-friendly - Newly allocated memory that isn't directly initialized, - as well as memory being freed will be reset to 0. The point here is - to allow memory checkers and similar programs that use Boehm GC alike - algorithms to produce more accurate results. - - - - resident-modules - All modules loaded by GModule will be made resident. - This can be useful for tracking memory leaks in modules which are - later unloaded; but it can also hide bugs where code is accessed - after the module would have normally been unloaded. - - - - bind-now-modules - All modules loaded by GModule will bind their symbols - at load time, even when the code uses %G_MODULE_BIND_LAZY. - - - - The special value all can be used to turn on all debug options. - The special value help can be used to print all available options. - - - - - <envar>G_SLICE</envar> - - - This environment variable allowed reconfiguration of the GSlice - memory allocator. Since GLib 2.76, GSlice uses the system - malloc() implementation internally, so this variable is - ignored. - - - - - <envar>G_RANDOM_VERSION</envar> - - - If this environment variable is set to '2.0', the outdated - pseudo-random number seeding and generation algorithms from - GLib 2.0 are used instead of the newer, better ones. You should - only set this variable if you have sequences of numbers that were - generated with Glib 2.0 that you need to reproduce exactly. - - - - - <envar>LIBCHARSET_ALIAS_DIR</envar> - - - Allows to specify a nonstandard location for the - charset.aliases file that is used by the - character set conversion routines. The default location is the - libdir specified at compilation time. - - - - - <envar>TZDIR</envar> - - - Allows to specify a nonstandard location for the timezone data files - that are used by the #GDateTime API. The default location is under - /usr/share/zoneinfo. For more information, - also look at the tzset manual page. - - - - - <envar>G_ENABLE_DIAGNOSTIC</envar> - - - If set to a non-zero value, this environment variable enables - diagnostic messages, like deprecation messages for GObject properties - and signals. - - - - - <envar>G_DEBUGGER</envar> - - - When running on Windows, if set to a non-empty string, GLib will - try to interpret the contents of this environment variable as - a command line to a debugger, and run it if the process crashes. - The debugger command line should contain %p and %e substitution - tokens, which GLib will replace with the process ID of the crashing - process and a handle to an event that the debugger should signal - to let GLib know that the debugger successfully attached to the - process. If %e is absent, or if the debugger is not able to - signal events, GLib will resume execution after 60 seconds. - If %p is absent, the debugger won't know which process to attach to, - and GLib will also resume execution after 60 seconds. - - - Additionally, even if G_DEBUGGER is not set, GLib would still - try to print basic exception information (code and address) into - stderr. - - - By default the debugger gets a new console allocated for it. - Set the G_DEBUGGER_OLD_CONSOLE environment variable to any - non-empty string to make the debugger inherit the console of - the crashing process. Normally this is only used by the GLib - testsuite. - - - The exception handler is written with the aim of making it as - simple as possible, to minimize the risk of it invoking - buggy functions or running buggy code, which would result - in exceptions being raised recursively. Because of that - it lacks most of the amenities that one would expect of GLib. - Namely, it does not support Unicode, so it is highly advisable - to only use ASCII characters in G_DEBUGGER. - - - See also G_VEH_CATCH. - - - - - <envar>G_VEH_CATCH</envar> - - - Catching some exceptions can break the program, since Windows - will sometimes use exceptions for execution flow control and - other purposes other than signalling a crash. - - - The G_VEH_CATCH environment variable augments - Vectored Exception Handling - on Windows (see G_DEBUGGER), allowing GLib to catch more - exceptions. Set this variable to a comma-separated list of - hexadecimal exception codes that should additionally be caught. - - - By default GLib will only catch Access Violation, Stack Overflow and - Illegal Instruction exceptions. - - - - - - -Locale - - -A number of interfaces in GLib depend on the current locale in which -an application is running. Therefore, most GLib-using applications should -call setlocale (LC_ALL, "") to set up the current -locale. - - - -On Windows, in a C program there are several locale concepts -that not necessarily are synchronized. On one hand, there is the -system default ANSI code-page, which determines what encoding is used -for file names handled by the C library's functions and the Win32 -API. (We are talking about the "narrow" functions here that take -character pointers, not the "wide" ones.) - - - -On the other hand, there is the C library's current locale. The -character set (code-page) used by that is not necessarily the same as -the system default ANSI code-page. Strings in this character set are -returned by functions like strftime(). - - - - - -GLib ships with a set of Python macros for the GDB debugger. These includes pretty -printers for lists, hashtables and GObject types. It also has a backtrace filter -that makes backtraces with signal emissions easier to read. - - - -To use this you need a version of GDB that supports Python scripting; anything -from 7.0 should be fine. You then need to install GLib in the same prefix as -GDB so that the Python GDB autoloaded files get installed in the right place -for GDB to pick up. - - - -General pretty printing should just happen without having to do anything special. -To get the signal emission filtered backtrace you must use the "new-backtrace" command -instead of the standard one. - - - -There is also a new command called gforeach that can be used to apply a command -on each item in a list. E.g. you can do - -gforeach i in some_list_variable: print *(GtkWidget *)l - -Which would print the contents of each widget in a list of widgets. - - - -SystemTap - - -SystemTap is a dynamic whole-system -analysis toolkit. GLib ships with a file libglib-2.0.so.*.stp which defines a -set of probe points, which you can hook into with custom SystemTap scripts. -See the files libglib-2.0.so.*.stp, libgobject-2.0.so.*.stp -and libgio-2.0.so.*.stp which -are in your shared SystemTap scripts directory. - - - - - -Memory statistics - - -g_mem_profile() will output a summary g_malloc() memory usage, if memory -profiling has been enabled by calling -g_mem_set_vtable (glib_mem_profiler_table) upon startup. - - - -If GLib has been configured with , -then g_slice_debug_tree_statistics() can be called in a debugger to -output details about the memory usage of the slice allocator. - - - - - diff --git a/docs/reference/glib/shell.md b/docs/reference/glib/shell.md new file mode 100644 index 0000000..3be3a2b --- /dev/null +++ b/docs/reference/glib/shell.md @@ -0,0 +1,15 @@ +Title: Shell Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2014 Matthias Clasen + +# Shell Utilities + +GLib provides the functions [func@GLib.shell_quote] and +[func@GLib.shell_unquote] to handle shell-like quoting in strings. The function +[func@GLib.shell_parse_argv] parses a string similar to the way a POSIX shell +(`/bin/sh`) would. + +Note that string handling in shells has many obscure and historical +corner-cases which these functions do not necessarily reproduce. They +are good enough in practice, though. + diff --git a/docs/reference/glib/spawn.md b/docs/reference/glib/spawn.md new file mode 100644 index 0000000..91290b4 --- /dev/null +++ b/docs/reference/glib/spawn.md @@ -0,0 +1,76 @@ +Title: Spawning Processes +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2014 Red Hat, Inc. +SPDX-FileCopyrightText: 2017 Philip Withnall + +# Spawning Processes + +GLib supports spawning of processes with an API that is more +convenient than the bare UNIX [`fork()`](man:fork(2)) and +[`exec()`](man:exec(3)). + +The `g_spawn_…()` family of functions has synchronous ([func@GLib.spawn_sync]) +and asynchronous variants ([func@GLib.spawn_async], +[func@GLib.spawn_async_with_pipes]), as well as convenience variants that take a +complete shell-like command line ([func@GLib.spawn_command_line_sync], +[func@GLib.spawn_command_line_async]). + +See [`GSubprocess`](../gio/class.Subprocess.html) in GIO for a higher-level API +that provides stream interfaces for communication with child processes. + +An example of using [func@GLib.spawn_async_with_pipes]: +```c +const gchar * const argv[] = { "my-favourite-program", "--args", NULL }; +gint child_stdout, child_stderr; +GPid child_pid; +g_autoptr(GError) error = NULL; + +// Spawn child process. +g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, + NULL, &child_pid, NULL, &child_stdout, + &child_stderr, &error); +if (error != NULL) + { + g_error ("Spawning child failed: %s", error->message); + return; + } + +// Add a child watch function which will be called when the child process +// exits. +g_child_watch_add (child_pid, child_watch_cb, NULL); + +// You could watch for output on @child_stdout and @child_stderr using +// #GUnixInputStream or #GIOChannel here. + +static void +child_watch_cb (GPid pid, + gint status, + gpointer user_data) +{ + g_message ("Child %" G_PID_FORMAT " exited %s", pid, + g_spawn_check_wait_status (status, NULL) ? "normally" : "abnormally"); + + // Free any resources associated with the child here, such as I/O channels + // on its stdout and stderr FDs. If you have no code to put in the + // child_watch_cb() callback, you can remove it and the g_child_watch_add() + // call, but you must also remove the G_SPAWN_DO_NOT_REAP_CHILD flag, + // otherwise the child process will stay around as a zombie until this + // process exits. + + g_spawn_close_pid (pid); +} +``` + +## Spawn Functions + + * [func@GLib.spawn_async_with_fds] + * [func@GLib.spawn_async_with_pipes] + * [func@GLib.spawn_async_with_pipes_and_fds] + * [func@GLib.spawn_async] + * [func@GLib.spawn_sync] + * [func@GLib.spawn_check_wait_status] + * [func@GLib.spawn_check_exit_status] + * [func@GLib.spawn_command_line_async] + * [func@GLib.spawn_command_line_sync] + * [func@GLib.spawn_close_pid] + diff --git a/docs/reference/glib/string-utils.md b/docs/reference/glib/string-utils.md new file mode 100644 index 0000000..977af4b --- /dev/null +++ b/docs/reference/glib/string-utils.md @@ -0,0 +1,187 @@ +Title: String Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 1999 Owen Taylor +SPDX-FileCopyrightText: 2000 Red Hat, Inc. +SPDX-FileCopyrightText: 2002, 2003, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2015 Collabora, Ltd. + +# String Utilities + +This section describes a number of utility functions for creating, +duplicating, and manipulating strings. + +Note that the functions [func@GLib.printf], [func@GLib.fprintf], +[func@GLib.sprintf], [func@GLib.vprintf], [func@GLib.vfprintf], +[func@GLib.vsprintf] and [func@GLib.vasprintf] are declared in the header +`gprintf.h` which is not included in `glib.h` +(otherwise using `glib.h` would drag in `stdio.h`), so you'll have to +explicitly include `` in order to use the GLib +`printf()` functions. + +## String precision pitfalls # {#string-precision} + +While you may use the `printf()` functions to format UTF-8 strings, +notice that the precision of a `%Ns` parameter is interpreted +as the number of bytes, not characters to print. On top of that, +the GNU libc implementation of the `printf()` functions has the +‘feature’ that it checks that the string given for the `%Ns` +parameter consists of a whole number of characters in the current +encoding. So, unless you are sure you are always going to be in an +UTF-8 locale or your know your text is restricted to ASCII, avoid +using `%Ns`. If your intention is to format strings for a +certain number of columns, then `%Ns` is not a correct solution +anyway, since it fails to take wide characters (see [func@GLib.unichar_iswide]) +into account. + +Note also that there are various `printf()` parameters which are platform +dependent. GLib provides platform independent macros for these parameters +which should be used instead. A common example is [const@GLib.GUINT64_FORMAT], +which should be used instead of `%llu` or similar parameters for formatting +64-bit integers. These macros are all named `G_*_FORMAT`; see +[Basic Types](types.html). + +## General String Manipulation + + * [func@GLib.strdup] + * [func@GLib.strndup] + * [func@GLib.strdupv] + * [func@GLib.strnfill] + * [func@GLib.stpcpy] + * [func@GLib.strstr_len] + * [func@GLib.strrstr] + * [func@GLib.strrstr_len] + * [func@GLib.str_has_prefix] + * [func@GLib.str_has_suffix] + * [func@GLib.strcmp0] + * [func@GLib.str_to_ascii] + * [func@GLib.str_tokenize_and_fold] + * [func@GLib.str_match_string] + +For users of GLib in C, the `g_set_str()` inline function also exists to set a +string and handle copying the new value and freeing the old one. + +## String Copying + + * [func@GLib.strlcpy] + * [func@GLib.strlcat] + +## Printing + + * [func@GLib.strdup_printf] + * [func@GLib.strdup_vprintf] + * [func@GLib.printf] + * [func@GLib.vprintf] + * [func@GLib.fprintf] + * [func@GLib.vfprintf] + * [func@GLib.sprintf] + * [func@GLib.vsprintf] + * [func@GLib.snprintf] + * [func@GLib.vsnprintf] + * [func@GLib.vasprintf] + * [func@GLib.printf_string_upper_bound] + +## ASCII + + * [func@GLib.str_is_ascii] + * [func@GLib.ascii_isalnum] + * [func@GLib.ascii_isalpha] + * [func@GLib.ascii_iscntrl] + * [func@GLib.ascii_isdigit] + * [func@GLib.ascii_isgraph] + * [func@GLib.ascii_islower] + * [func@GLib.ascii_isprint] + * [func@GLib.ascii_ispunct] + * [func@GLib.ascii_isspace] + * [func@GLib.ascii_isupper] + * [func@GLib.ascii_isxdigit] + +## ASCII Parsing + + * [func@GLib.ascii_digit_value] + * [func@GLib.ascii_xdigit_value] + +## ASCII Comparisons + + * [func@GLib.ascii_strcasecmp] + * [func@GLib.ascii_strncasecmp] + +## ASCII Case Manipulation + + * [func@GLib.ascii_strup] + * [func@GLib.ascii_strdown] + * [func@GLib.ascii_tolower] + * [func@GLib.ascii_toupper + +## ASCII String Manipulation + + * [func@GLib.strreverse] + +## ASCII Number Manipulation + + * [func@GLib.ascii_strtoll] + * [func@GLib.ascii_strtoull] + * [const@GLib.ASCII_DTOSTR_BUF_SIZE] + * [func@GLib.ascii_strtod] + * [func@GLib.ascii_dtostr] + * [func@GLib.ascii_formatd] + * [func@GLib.strtod] + +## ASCII Number Parsing + + * [type@GLib.NumberParserError] + * [func@GLib.ascii_string_to_signed] + * [func@GLib.ascii_string_to_unsigned] + +## Whitespace Removal + + * [func@GLib.strchug] + * [func@GLib.strchomp] + * [func@GLib.strstrip] + +## Find and Replace + + * [func@GLib.strdelimit] + * [const@GLib.STR_DELIMITERS] + * [func@GLib.strescape] + * [func@GLib.strcompress] + * [func@GLib.strcanon] + +## Splitting and Joining + + * [func@GLib.strsplit] + * [func@GLib.strsplit_set] + * [func@GLib.strconcat] + * [func@GLib.strjoin] + * [func@GLib.strjoinv] + +## String Arrays + + * [type@GLib.Strv] + * [func@GLib.strfreev] + * [func@GLib.strv_length] + * [func@GLib.strv_contains] + * [func@GLib.strv_equal] + +## String Array Builder + + * [type@GLib.StrvBuilder] + * [ctor@GLib.StrvBuilder.new] + * [method@GLib.StrvBuilder.ref] + * [method@GLib.StrvBuilder.unref] + * [method@GLib.StrvBuilder.add] + * [method@GLib.StrvBuilder.addv] + * [method@GLib.StrvBuilder.add_many] + * [method@GLib.StrvBuilder.take] + * [method@GLib.StrvBuilder.end] + +## POSIX Errors + + * [func@GLib.strerror] + * [func@GLib.strsignal] + +## Deprecated API + + * [func@GLib.strup] + * [func@GLib.strdown] + * [func@GLib.strcasecmp] + * [func@GLib.strncasecmp] diff --git a/docs/reference/glib/testing.md b/docs/reference/glib/testing.md new file mode 100644 index 0000000..a0f1d12 --- /dev/null +++ b/docs/reference/glib/testing.md @@ -0,0 +1,183 @@ +Title: Testing Framework + +# Testing Framework + +GLib provides a framework for writing and maintaining unit tests in parallel +to the code they are testing. The API is designed according to established +concepts found in the other test frameworks (JUnit, NUnit, RUnit), which in +turn is based on smalltalk unit testing concepts. + +- Test case: Tests (test methods) are grouped together with their fixture + into test cases. +- Fixture: A test fixture consists of fixture data and setup and teardown + methods to establish the environment for the test functions. We use fresh + fixtures, i.e. fixtures are newly set up and torn down around each test + invocation to avoid dependencies between tests. +- Test suite: Test cases can be grouped into test suites, to allow subsets + of the available tests to be run. Test suites can be grouped into other + test suites as well. + +The API is designed to handle creation and registration of test suites and +test cases implicitly. A simple call like: + +```c +g_test_add_func ("/misc/assertions", test_assertions); +``` + +creates a test suite called "misc" with a single test case named +"assertions", which consists of running the `test_assertions` function. + +In addition to the traditional `g_assert_true()`, the test framework +provides an extended set of assertions for comparisons: +`g_assert_cmpfloat()`, `g_assert_cmpfloat_with_epsilon()`, +`g_assert_cmpint()`, `g_assert_cmpuint()`, `g_assert_cmphex()`, +`g_assert_cmpstr()`, `g_assert_cmpmem()` and `g_assert_cmpvariant()`. The +advantage of these variants over plain `g_assert_true()` is that the +assertion messages can be more elaborate, and include the values of the +compared entities. + +Note that `g_assert()` should **not** be used in unit tests, since it is a +no-op when compiling with `G_DISABLE_ASSERT`. Use `g_assert()` in production +code, and `g_assert_true()` in unit tests. + +A full example of creating a test suite with two tests using fixtures: + +```c +#include +#include + +typedef struct { + MyObject *obj; + OtherObject *helper; +} MyObjectFixture; + +static void +my_object_fixture_set_up (MyObjectFixture *fixture, + gconstpointer user_data) +{ + fixture->obj = my_object_new (); + my_object_set_prop1 (fixture->obj, "some-value"); + my_object_do_some_complex_setup (fixture->obj, user_data); + + fixture->helper = other_object_new (); +} + +static void +my_object_fixture_tear_down (MyObjectFixture *fixture, + gconstpointer user_data) +{ + g_clear_object (&fixture->helper); + g_clear_object (&fixture->obj); +} + +static void +test_my_object_test1 (MyObjectFixture *fixture, + gconstpointer user_data) +{ + g_assert_cmpstr (my_object_get_property (fixture->obj), ==, "initial-value"); +} + +static void +test_my_object_test2 (MyObjectFixture *fixture, + gconstpointer user_data) +{ + my_object_do_some_work_using_helper (fixture->obj, fixture->helper); + g_assert_cmpstr (my_object_get_property (fixture->obj), ==, "updated-value"); +} + +int +main (int argc, char *argv[]) +{ + setlocale (LC_ALL, ""); + + g_test_init (&argc, &argv, NULL); + + // Define the tests. + g_test_add ("/my-object/test1", MyObjectFixture, "some-user-data", + my_object_fixture_set_up, test_my_object_test1, + my_object_fixture_tear_down); + g_test_add ("/my-object/test2", MyObjectFixture, "some-user-data", + my_object_fixture_set_up, test_my_object_test2, + my_object_fixture_tear_down); + + return g_test_run (); +} +``` + +### Integrating GTest in your project + +#### Using Meson + +If you are using the Meson build system, you will typically use the provided +`test()` primitive to call the test binaries, e.g.: + +``` +test( + 'foo', + executable('foo', 'foo.c', dependencies: deps), + env: [ + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + ], + protocol: 'tap', +) + +test( + 'bar', + executable('bar', 'bar.c', dependencies: deps), + env: [ + 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), + 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), + ], + protocol: 'tap', +) +``` + +#### Using Autotools + +If you are using Autotools, you're strongly encouraged to use the Automake +TAP harness; GLib provides template files for easily integrating with it: + +- [`glib-tap.mk`](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/glib-tap.mk) +- [`tap-test`](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/tap-test) +- [`tap-driver.sh`](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/tap-driver.sh) + +You can copy these files in your own project's root directory, and then set +up your `Makefile.am` file to reference them, for instance: + +``` +include $(top_srcdir)/glib-tap.mk + +# test binaries +test_programs = \ + foo \ + bar + +# data distributed in the tarball +dist_test_data = \ + foo.data.txt \ + bar.data.txt + +# data not distributed in the tarball +test_data = \ + blah.data.txt +``` + +Make sure to distribute the TAP files, using something like the following in +your top-level `Makefile.am`: + +``` +EXTRA_DIST += \ + tap-driver.sh \ + tap-test +``` + +`glib-tap.mk` will be distributed implicitly due to being included in a +`Makefile.am`. All three files should be added to version control. + +If you don't have access to the Autotools TAP harness, you can use the +gtester and gtester-report tools, and use the +[`glib.mk`](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/glib.mk) +Automake template provided by GLib. Note, however, that since GLib 2.62, +gtester and gtester-report have been deprecated in favour of using TAP. The +`--tap` argument to tests is enabled by default as of GLib 2.62. diff --git a/docs/reference/glib/threads-deprecated.md b/docs/reference/glib/threads-deprecated.md new file mode 100644 index 0000000..4198a63 --- /dev/null +++ b/docs/reference/glib/threads-deprecated.md @@ -0,0 +1,37 @@ +Title: Deprecated Thread API +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2011 Allison Lortie + +# Deprecated Thread API + +These APIs are deprecated. You should not use them in new code. +This section remains only to assist with understanding code that was +written to use these APIs at some point in the past. + +Deprecated thread creation/configuration functions: + + * [type@GLib.ThreadPriority] + * [type@GLib.ThreadFunctions] + * [func@GLib.Thread.init] + * [func@GLib.Thread.get_initialized] + * [method@GLib.Thread.set_priority] + * [func@GLib.Thread.foreach] + * [func@GLib.Thread.create] + * [func@GLib.Thread.create_full] + +Deprecated static variants of locking primitives: + + * [type@GLib.StaticMutex] + * [type@GLib.StaticRecMutex] + * [type@GLib.StaticRWLock] + * [type@GLib.StaticPrivate] + +Deprecated dynamic allocation of locking primitives: + + * [func@GLib.Private.new] + * [func@GLib.Mutex.new] + * [method@GLib.Mutex.free] + * [func@GLib.Cond.new] + * [method@GLib.Cond.free] + * [method@GLib.Cond.timed_wait] + diff --git a/docs/reference/glib/threads.md b/docs/reference/glib/threads.md new file mode 100644 index 0000000..d01689b --- /dev/null +++ b/docs/reference/glib/threads.md @@ -0,0 +1,91 @@ +Title: Threads +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2010 Allison Lortie +SPDX-FileCopyrightText: 2011, 2012, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2014 Collabora, Ltd. + +# Threads + +Threads act almost like processes, but unlike processes all threads of one +process share the same memory. This is good, as it provides easy +communication between the involved threads via this shared memory, and it is +bad, because strange things (so called "Heisenbugs") might happen if the +program is not carefully designed. In particular, due to the concurrent +nature of threads, no assumptions on the order of execution of code running +in different threads can be made, unless order is explicitly forced by the +programmer through synchronization primitives. + +The aim of the thread-related functions in GLib is to provide a portable +means for writing multi-threaded software. There are primitives for mutexes +to protect the access to portions of memory (`GMutex`, `GRecMutex` and +`GRWLock`). There is a facility to use individual bits for locks +(`g_bit_lock()`). There are primitives for condition variables to allow +synchronization of threads (`GCond`). There are primitives for +thread-private data - data that every thread has a private instance of +(`GPrivate`). There are facilities for one-time initialization (`GOnce`, +`g_once_init_enter_pointer()`, `g_once_init_enter()`). Finally, there are +primitives to create and manage threads (`GThread`). + +The GLib threading system used to be initialized with `g_thread_init()`. +This is no longer necessary. Since version 2.32, the GLib threading system +is automatically initialized at the start of your program, and all +thread-creation functions and synchronization primitives are available right +away. + +Note that it is not safe to assume that your program has no threads even if +you don't call `g_thread_new()` yourself. GLib and GIO can and will create +threads for their own purposes in some cases, such as when using +`g_unix_signal_source_new()` or when using GDBus. + +Originally, UNIX did not have threads, and therefore some traditional UNIX +APIs are problematic in threaded programs. Some notable examples are + +- C library functions that return data in statically allocated buffers, such + as `strtok()` or `strerror()`. For many of these, there are thread-safe + variants with a `_r` suffix, or you can look at corresponding GLib APIs + (`like g_strsplit()` or `g_strerror()`). +- The functions `setenv()` and `unsetenv()` manipulate the process + environment in a not thread-safe way, and may interfere with `getenv()` + calls in other threads. Note that `getenv()` calls may be hidden behind + other APIs. For example, GNU `gettext()` calls `getenv()` under the + covers. In general, it is best to treat the environment as readonly. If + you absolutely have to modify the environment, do it early in `main()`, + when no other threads are around yet. +- The `setlocale()` function changes the locale for the entire process, + affecting all threads. Temporary changes to the locale are often made to + change the behavior of string scanning or formatting functions like + `scanf()` or `printf()`. GLib offers a number of string APIs (like + `g_ascii_formatd()` or `g_ascii_strtod()`) that can often be used as an + alternative. Or you can use the `uselocale()` function to change the + locale only for the current thread. +- The `fork()` function only takes the calling thread into the child's copy + of the process image. If other threads were executing in critical sections + they could have left mutexes locked which could easily cause deadlocks in + the new child. For this reason, you should call `exit()` or `exec()` as + soon as possible in the child and only make signal-safe library calls + before that. +- The `daemon()` function uses `fork()` in a way contrary to what is + described above. It should not be used with GLib programs. + +GLib itself is internally completely thread-safe (all global data is +automatically locked), but individual data structure instances are not +automatically locked for performance reasons. For example, you must +coordinate accesses to the same `GHashTable` from multiple threads. The two +notable exceptions from this rule are `GMainLoop` and `GAsyncQueue`, which are +thread-safe and need no further application-level locking to be accessed +from multiple threads. Most refcounting functions such as `g_object_ref()` are +also thread-safe. + +A common use for GThreads is to move a long-running blocking operation out +of the main thread and into a worker thread. For GLib functions, such as +single GIO operations, this is not necessary, and complicates the code. +Instead, the `…_async()` version of the function should be used from the main +thread, eliminating the need for locking and synchronisation between +multiple threads. If an operation does need to be moved to a worker thread, +consider using `g_task_run_in_thread()`, or a `GThreadPool`. `GThreadPool` is +often a better choice than `GThread`, as it handles thread reuse and task +queueing; `GTask` uses this internally. + +However, if multiple blocking operations need to be performed in sequence, +and it is not possible to use `GTask` for them, moving them to a worker thread +can clarify the code. diff --git a/docs/reference/glib/types.md b/docs/reference/glib/types.md new file mode 100644 index 0000000..f8e5ab0 --- /dev/null +++ b/docs/reference/glib/types.md @@ -0,0 +1,882 @@ +Title: Basic Types +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 1999 Owen Taylor +SPDX-FileCopyrightText: 2000 Red Hat, Inc. +SPDX-FileCopyrightText: 2000 Sebastian Wilhelmi +SPDX-FileCopyrightText: 2008 Matthias Clasen +SPDX-FileCopyrightText: 2008, 2010 Behdad Esfahbod +SPDX-FileCopyrightText: 2009 Christian Persch +SPDX-FileCopyrightText: 2014, 2022 Collabora, Ltd. +SPDX-FileCopyrightText: 2017, 2018 Endless Mobile, Inc. +SPDX-FileCopyrightText: 2018 Christoph Reiter +SPDX-FileCopyrightText: 2019 Alistair Thomas + +# Basic Types + +GLib defines a number of commonly used types, which can be divided +into several groups: + + - New types which are not part of standard C (but are defined in + various C standard library header files) — [`gboolean`](#gboolean), + [`gssize`](#gssize). + - Integer types which are guaranteed to be the same size across + all platforms — [`gint8`](#gint8), [`guint8`](#guint8), [`gint16`](#gint16), + [`guint16`](#guint16), [`gint32`](#gint32), [`guint32`](#guint32), + [`gint64`](#gint64), [`guint64`](#guint64). + - Types which are easier to use than their standard C counterparts — + [`gpointer`](#gpointer), [`gconstpointer`](#gconstpointer), + [`guchar`](#guchar), [`guint`](#guint), [`gushort`](#gushort), + [`gulong`](#gulong). + - Types which correspond exactly to standard C types, but are + included for completeness — [`gchar`](#gchar), [`gint`](#gint), + [`gshort`](#gshort), [`glong`](#glong), [`gfloat`](#gfloat), + [`gdouble`](#gdouble). + - Types which correspond exactly to standard C99 types, but are available + to use even if your compiler does not support C99 — [`gsize`](#gsize), + [`goffset`](#goffset), [`gintptr`](#gintptr), [`guintptr`](#guintptr). + +GLib also defines macros for the limits of some of the standard +integer and floating point types, as well as macros for suitable +[`printf()`](man:printf(3)) formats for these types. + +Note that depending on the platform and build configuration, the format +macros might not be compatible with the system provided +[`printf()`](man:printf(3)) function, because GLib might use a different +`printf()` implementation internally. The format macros will always work with +GLib API (like [func@GLib.print]), and with any C99 compatible `printf()` +implementation. + +## Basic Types + +### `gboolean` + +A standard boolean type. Variables of this type should only contain the value +`TRUE` or `FALSE`. + +Never directly compare the contents of a `gboolean` variable with the values +`TRUE` or `FALSE`. Use `if (condition)` to check a `gboolean` is ‘true’, instead +of `if (condition == TRUE)`. Likewise use `if (!condition)` to check a +`gboolean` is ‘false’. + +There is no validation when assigning to a `gboolean` variable and so it could +contain any value represented by a `gint`. This is why the use of `if +(condition)` is recommended. All non-zero values in C evaluate to ‘true’. + +### `gpointer` + +An untyped pointer, exactly equivalent to `void *`. + +The standard C `void *` type should usually be preferred in +new code, but `gpointer` can be used in contexts where a type name +must be a single word, such as in the `GType` name of +`G_TYPE_POINTER` or when generating a family of function names for +multiple types using macros. + +### `gconstpointer` + +An untyped pointer to constant data, exactly equivalent to `const void *`. + +The data pointed to should not be changed. + +This is typically used in function prototypes to indicate +that the data pointed to will not be altered by the function. + +The standard C `const void *` type should usually be preferred in +new code, but `gconstpointer` can be used in contexts where a type name +must be a single word. + +### `gchar` + +Equivalent to the standard C `char` type. + +This type only exists for symmetry with `guchar`. +The standard C `char` type should be preferred in new code. + +### `guchar` + +Equivalent to the standard C `unsigned char` type. + +The standard C `unsigned char` type should usually be preferred in +new code, but `guchar` can be used in contexts where a type name +must be a single word, such as in the `GType` name of +`G_TYPE_UCHAR` or when generating a family of function names for +multiple types using macros. + +## Naturally Sized Integers + +### `gint` + +Equivalent to the standard C `int` type. + +Values of this type can range from `INT_MIN` to `INT_MAX`, +or equivalently from `G_MININT` to `G_MAXINT`. + +This type only exists for symmetry with [`guint`](#guint). +The standard C `int` type should be preferred in new code. + +`G_MININT` +: The minimum value which can be held in a `gint`. + + This is the same as standard C `INT_MIN`, which is available since C99 + and should be preferred in new code. + +`G_MAXINT` +: The maximum value which can be held in a `gint`. + + This is the same as standard C `INT_MAX`, which is available since C99 + and should be preferred in new code. + +### `guint` + +Equivalent to the standard C `unsigned int` type. + +Values of this type can range from `0` to `UINT_MAX`, +or equivalently `0` to `G_MAXUINT`. + +The standard C `unsigned int` type should usually be preferred in +new code, but `guint` can be used in contexts where a type name +must be a single word, such as in the `GType` name of +`G_TYPE_UINT` or when generating a family of function names for +multiple types using macros. + +`G_MAXUINT` +: The maximum value which can be held in a `guint`. + + This is the same as standard C `UINT_MAX`, which is available since C99 + and should be preferred in new code. + +### `gshort` + +Equivalent to the standard C `short` type. + +Values of this type can range from `SHRT_MIN` to `SHRT_MAX`, +or equivalently `G_MINSHORT` to `G_MAXSHORT`. + +This type only exists for symmetry with `gushort`. +The standard C `short` type should be preferred in new code. + +`G_MINSHORT` +: The minimum value which can be held in a `gshort`. + + This is the same as standard C `SHRT_MIN`, which is available since C99 + and should be preferred in new code. + +`G_MAXSHORT` +: The maximum value which can be held in a `gshort`. + + This is the same as standard C `SHRT_MAX`, which is available since C99 + and should be preferred in new code. + +### `gushort` + +Equivalent to the standard C `unsigned short` type. + +Values of this type can range from `0` to `USHRT_MAX`, +or equivalently from `0` to `G_MAXUSHORT`. + +The standard C `unsigned short` type should usually be preferred in +new code, but `gushort` can be used in contexts where a type name +must be a single word, such as when generating a family of function +names for multiple types using macros. + + +`G_MAXUSHORT` +: The maximum value which can be held in a `gushort`. + + This is the same as standard C `USHRT_MAX`, which is available since C99 + and should be preferred in new code. + +### `glong` + +Equivalent to the standard C `long` type. + +Values of this type can range from `LONG_MIN` to `LONG_MAX`, +or equivalently `G_MINLONG` to `G_MAXLONG`. + +This type only exists for symmetry with `gulong`. +The standard C `long` type should be preferred in new code. + +`G_MINLONG` +: The minimum value which can be held in a `glong`. + + This is the same as standard C `LONG_MIN`, which is available since C99 + and should be preferred in new code. + +`G_MAXLONG` +: The maximum value which can be held in a `glong`. + + This is the same as standard C `ULONG_MAX`, which is available since C99 + and should be preferred in new code. + +### `gulong` + +Equivalent to the standard C `unsigned long` type. + +Values of this type can range from `0` to `G_MAXULONG`. + +The standard C `unsigned long` type should usually be preferred in +new code, but `gulong` can be used in contexts where a type name +must be a single word, such as in the `GType` name of +`G_TYPE_ULONG` or when generating a family of function names for +multiple types using macros. + +`G_MAXULONG` +: The maximum value which can be held in a `gulong`. + + This is the same as standard C `ULONG_MAX`, which is available since C99 + and should be preferred in new code. + +## Fixed Width Integers + +### `gint8` + +A signed integer guaranteed to be 8 bits on all platforms, +similar to the standard C `int8_t`. + +The `int8_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `gint8` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `G_MININT8` (= -128) to +`G_MAXINT8` (= 127). + +`G_MININT8` +: The minimum value which can be held in a `gint8`. + + Since: 2.4 + +`G_MAXINT8` +: The maximum value which can be held in a `gint8`. + + This is the same as standard C `INT8_MAX`, which should be + preferred in new code. + + Since: 2.4 + +### `guint8` + +An unsigned integer guaranteed to be 8 bits on all platforms, +similar to the standard C `uint8_t`. + +The `uint8_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `guint8` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `0` to `G_MAXUINT8` (= 255). + +`G_MAXUINT8` +: The maximum value which can be held in a `guint8`. + + This is the same as standard C `UINT8_MAX`, which should be + preferred in new code. + + Since: 2.4 + +### `gint16` + +A signed integer guaranteed to be 16 bits on all platforms, +similar to the standard C `int16_t`. + +The `int16_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `gint16` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `G_MININT16` (= -32,768) to +`G_MAXINT16` (= 32,767). + +To print or scan values of this type, use +`G_GINT16_MODIFIER` and/or `G_GINT16_FORMAT`. + +`G_MININT16` +: The minimum value which can be held in a `gint16`. + + Since: 2.4 + +`G_MAXINT16` +: The maximum value which can be held in a `gint16`. + + This is the same as standard C `INT16_MAX`, which should be + preferred in new code. + + Since: 2.4 + +`G_GINT16_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gint16` or `guint16`. It + is a string literal, but doesn’t include the percent-sign, such + that you can add precision and length modifiers between percent-sign + and conversion specifier and append a conversion specifier. + + The following example prints `0x7b`; + ```c + gint16 value = 123; + g_print ("%#" G_GINT16_MODIFIER "x", value); + ``` + + This is not necessarily the correct modifier for printing and scanning + `int16_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId16` and `SCNd16` should be used for `int16_t`. + + Since: 2.4 + +`G_GINT16_FORMAT` +: This is the platform dependent conversion specifier for scanning and + printing values of type `gint16`. It is a string literal, but doesn’t + include the percent-sign, such that you can add precision and length + modifiers between percent-sign and conversion specifier. + + ```c + gint16 in; + gint32 out; + sscanf ("42", "%" G_GINT16_FORMAT, &in) + out = in * 1000; + g_print ("%" G_GINT32_FORMAT, out); + ``` + + This is not necessarily the correct format for printing and scanning + `int16_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId16` and `SCNd16` should be used for `int16_t`. + +### `guint16` + +An unsigned integer guaranteed to be 16 bits on all platforms, +similar to the standard C `uint16_t`. + +The `uint16_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `guint16` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `0` to `G_MAXUINT16` (= 65,535). + +To print or scan values of this type, use +`G_GINT16_MODIFIER` and/or `G_GUINT16_FORMAT`. + +`G_MAXUINT16` +: The maximum value which can be held in a `guint16`. + + This is the same as standard C `UINT16_MAX`, which should be + preferred in new code. + + Since: 2.4 + +`G_GUINT16_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `guint16`. See also `G_GINT16_FORMAT` + + This is not necessarily the correct modifier for printing and scanning + `uint16_t` values, even though the in-memory representation is the same. + Standard C macros like `PRIu16` and `SCNu16` should be used for `uint16_t`. + +### `gint32` + +A signed integer guaranteed to be 32 bits on all platforms. + +The `int32_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `gint16` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `G_MININT32` (= -2,147,483,648) +to `G_MAXINT32` (= 2,147,483,647). + +To print or scan values of this type, use +`G_GINT32_MODIFIER` and/or `G_GINT32_FORMAT`. + +Note that on platforms with more than one 32-bit standard integer type, +`gint32` and `int32_t` are not necessarily implemented by the same +32-bit integer type. +For example, on an ILP32 platform where `int` and `long` are both 32-bit, +it might be the case that one of these types is `int` and the other +is `long`. +See [`gsize`](#gsize) for more details of what this implies. + +`G_MININT32` +: The minimum value which can be held in a `gint32`. + + Since: 2.4 + +`G_MAXINT32` +: The maximum value which can be held in a `gint32`. + + This is the same as standard C `INT32_MAX`, which should be + preferred in new code. + + Since: 2.4 + +`G_GINT32_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gint32` or `guint32`. It + is a string literal. See also `G_GINT16_MODIFIER`. + + This is not necessarily the correct modifier for printing and scanning + `int32_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId32` and `SCNd32` should be used for `int32_t`. + + Since: 2.4 + +`G_GINT32_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `gint32`. See also `G_GINT16_FORMAT`. + + This is not necessarily the correct modifier for printing and scanning + `int32_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId32` and `SCNd32` should be used for `int32_t`. + +### `guint32` + +An unsigned integer guaranteed to be 32 bits on all platforms, +similar to the standard C `uint32_t`. + +The `uint32_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `guint32` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `0` to `G_MAXUINT32` (= 4,294,967,295). + +To print or scan values of this type, use +`G_GINT32_MODIFIER` and/or `G_GUINT32_FORMAT`. + +Note that on platforms with more than one 32-bit standard integer type, +`guint32` and `uint32_t` are not necessarily implemented by the same +32-bit integer type. +See [`gsize`](#gsize) for more details of what this implies. + +`G_MAXUINT32` +: The maximum value which can be held in a `guint32`. + + This is the same as standard C `UINT32_MAX`, which should be + preferred in new code. + + Since: 2.4 + +`G_GUINT32_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `guint32`. See also `G_GINT16_FORMAT`. + + This is not necessarily the correct modifier for printing and scanning + `uint32_t` values, even though the in-memory representation is the same. + Standard C macros like `PRIu32` and `SCNu32` should be used for `uint32_t`. + +### `gint64` + +A signed integer guaranteed to be 64 bits on all platforms, +similar to the standard C `int64_t`. + +The `int64_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `gint64` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `G_MININT64` +(= -9,223,372,036,854,775,808) to `G_MAXINT64` +(= 9,223,372,036,854,775,807). + +To print or scan values of this type, use +`G_GINT64_MODIFIER` and/or `G_GINT64_FORMAT`. + +Note that on platforms with more than one 64-bit standard integer type, +`gint64` and `int64_t` are not necessarily implemented by the same +64-bit integer type. +For example, on a platform where both `long` and `long long` are 64-bit, +it might be the case that one of those types is used for `gint64` +and the other is used for `int64_t`. +See [`gsize`](#gsize) for more details of what this implies. + +`G_MININT64` +: The minimum value which can be held in a `gint64`. + +`G_MAXINT64` +: The maximum value which can be held in a `gint64`. + +`G_GINT64_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gint64` or `guint64`. + It is a string literal. + + Some platforms do not support printing 64-bit integers, even + though the types are supported. On such platforms `G_GINT64_MODIFIER` + is not defined. + + This is not necessarily the correct modifier for printing and scanning + `int64_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId64` and `SCNd64` should be used for `int64_t`. + + Since: 2.4 + +`G_GINT64_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `gint64`. See also `G_GINT16_FORMAT`. + + Some platforms do not support scanning and printing 64-bit integers, + even though the types are supported. On such platforms `G_GINT64_FORMAT` + is not defined. Note that [`scanf()`](man:scanf(3)) may not support 64-bit + integers, even if `G_GINT64_FORMAT` is defined. Due to its weak error + handling, `scanf()` is not recommended for parsing anyway; consider using + [func@GLib.ascii_strtoull] instead. + + This is not necessarily the correct format for printing and scanning + `int64_t` values, even though the in-memory representation is the same. + Standard C macros like `PRId64` and `SCNd64` should be used for `int64_t`. + +`G_GINT64_CONSTANT(val)` +: This macro is used to insert 64-bit integer literals + into the source code. + + It is similar to the standard C `INT64_C` macro, + which should be preferred in new code. + +### `guint64` + +An unsigned integer guaranteed to be 64-bits on all platforms, +similar to the standard C `uint64_t` type. + +The `uint64_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires use of `guint64` +(see [`gsize`](#gsize) for more details). + +Values of this type can range from `0` to `G_MAXUINT64` +(= 18,446,744,073,709,551,615). + +To print or scan values of this type, use +`G_GINT64_MODIFIER` and/or `G_GUINT64_FORMAT`. + +Note that on platforms with more than one 64-bit standard integer type, +`guint64` and `uint64_t` are not necessarily implemented by the same +64-bit integer type. +See [`gsize`](#gsize) for more details of what this implies. + +`G_MAXUINT64` +: The maximum value which can be held in a `guint64`. + + This is the same as standard C `UINT64_MAX`, which should be + preferred in new code. + +`G_GUINT64_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `guint64`. See also `G_GINT16_FORMAT`. + + Some platforms do not support scanning and printing 64-bit integers, + even though the types are supported. On such platforms `G_GUINT64_FORMAT` + is not defined. Note that [`scanf()`](man:scanf(3)) may not support 64-bit + integers, even if `G_GINT64_FORMAT` is defined. Due to its weak error + handling, `scanf()` is not recommended for parsing anyway; consider using + [func@GLib.ascii_strtoull] instead. + + This is not necessarily the correct modifier for printing and scanning + `uint64_t` values, even though the in-memory representation is the same. + Standard C macros like `PRIu64` and `SCNu64` should be used for `uint64_t`. + +`G_GUINT64_CONSTANT(val)` +: This macro is used to insert 64-bit unsigned integer + literals into the source code. + + It is similar to the standard C `UINT64_C` macro, + which should be preferred in new code. + + Since: 2.10 + +## Floating Point + +### `gfloat` + +Equivalent to the standard C `float` type. + +Values of this type can range from `-FLT_MAX` to `FLT_MAX`, +or equivalently from `-G_MAXFLOAT` to `G_MAXFLOAT`. + +`G_MINFLOAT` +: The minimum positive value which can be held in a `gfloat`. + + If you are interested in the smallest value which can be held + in a `gfloat`, use `-G_MAXFLOAT`. + + This is the same as standard C `FLT_MIN`, which is available since C99 + and should be preferred in new code. + +`G_MAXFLOAT` +: The maximum value which can be held in a `gfloat`. + + This is the same as standard C `FLT_MAX`, which is available since C99 + and should be preferred in new code. + +### `gdouble` + +Equivalent to the standard C `double` type. + +Values of this type can range from `-DBL_MAX` to `DBL_MAX`, +or equivalently from `-G_MAXDOUBLE` to `G_MAXDOUBLE`. + +`G_MINDOUBLE` +: The minimum positive value which can be held in a `gdouble`. + + If you are interested in the smallest value which can be held + in a `gdouble`, use `-G_MAXDOUBLE`. + + This is the same as standard C `DBL_MIN`, which is available since C99 + and should be preferred in new code. + +`G_MAXDOUBLE` +: The maximum value which can be held in a `gdouble`. + + This is the same as standard C `DBL_MAX`, which is available since C99 + and should be preferred in new code. + +## Architecture Sized Integers + +### `gsize` + +An unsigned integer type of the result of the `sizeof` operator, +corresponding to the `size_t` type defined in C99. + +The standard `size_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires `gsize` +(see below for more details). + +`gsize` is usually 32 bit wide on a 32-bit platform and 64 bit wide +on a 64-bit platform. Values of this type can range from `0` to +`G_MAXSIZE`. + +This type is wide enough to hold the size of the largest possible +memory allocation, but is not guaranteed to be wide enough to hold +the numeric value of a pointer: on platforms that use tagged pointers, +such as [CHERI](https://cheri-cpu.org/), pointers can be numerically +larger than the size of the address space. +If the numeric value of a pointer needs to be stored in an integer +without information loss, use the standard C types `intptr_t` or +`uintptr_t`, or the similar GLib types [`gintptr`](#gintptr) or +[`guintptr`](#guintptr). + +To print or scan values of this type, use +`G_GSIZE_MODIFIER` and/or `G_GSIZE_FORMAT`. + +Note that on platforms where more than one standard integer type is +the same size, `size_t` and `gsize` are always the same size but are +not necessarily implemented by the same standard integer type. +For example, on an ILP32 platform where `int`, `long` and pointers +are all 32-bit, `size_t` might be `unsigned long` while `gsize` +might be `unsigned int`. +This can result in compiler warnings or unexpected C++ name-mangling +if the two types are used inconsistently. + +As a result, changing a type from `gsize` to `size_t` in existing APIs +might be an incompatible API or ABI change, especially if C++ +is involved. The safe option is to leave existing APIs using the same type +that they have historically used, and only use the standard C types in +new APIs. + +Similar considerations apply to all the fixed-size types +([`gint8`](#gint8), [`guint8`](#guint8), [`gint16`](#gint16), +[`guint16`](#guint16), [`gint32`](#gint32), [`guint32`](#guint32), +[`gint64`](#gint64), [`guint64`](#guint64) and [`goffset`](#goffset)), as well +as [`gintptr`](#gintptr) and [`guintptr`](#guintptr). +Types that are 32 bits or larger are particularly likely to be +affected by this. + +`G_MAXSIZE` +: The maximum value which can be held in a `gsize`. + + This is the same as standard C `SIZE_MAX` (available since C99), + which should be preferred in new code. + + Since: 2.4 + +`G_GSIZE_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gsize`. It + is a string literal. + + Note that this is not necessarily the correct modifier to scan or + print a `size_t`, even though the in-memory representation is the + same. The Standard C `"z"` modifier should be used for `size_t`, + assuming a C99-compliant `printf` implementation is available. + + Since: 2.6 + +`G_GSIZE_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `gsize`. See also `G_GINT16_FORMAT`. + + Note that this is not necessarily the correct format to scan or + print a `size_t`, even though the in-memory representation is the + same. The standard C `"zu"` format should be used for `size_t`, + assuming a C99-compliant `printf` implementation is available. + + Since: 2.6 + +### `gssize` + +A signed variant of [`gsize`](#gsize), corresponding to the +`ssize_t` defined in POSIX or the similar `SSIZE_T` in Windows. + +In new platform-specific code, consider using `ssize_t` or `SSIZE_T` +directly. + +Values of this type can range from `G_MINSSIZE` to `G_MAXSSIZE`. + +Note that on platforms where `ssize_t` is implemented, `ssize_t` and +`gssize` might be implemented by different standard integer types +of the same size. Similarly, on Windows, `SSIZE_T` and `gssize` +might be implemented by different standard integer types of the same +size. See [`gsize`](#gsize) for more details. + +This type is also not guaranteed to be the same as standard C +`ptrdiff_t`, although they are the same on many platforms. + +To print or scan values of this type, use +`G_GSSIZE_MODIFIER` and/or `G_GSSIZE_FORMAT`. + +`G_MINSSIZE` +: The minimum value which can be held in a `gssize`. + + Since: 2.14 + +`G_MAXSSIZE` +: The maximum value which can be held in a `gssize`. + + Since: 2.14 + +`G_GSSIZE_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `gssize`. See also `G_GINT16_FORMAT`. + + Note that this is not necessarily the correct format to scan or print + a POSIX `ssize_t` or a Windows `SSIZE_T`, even though the in-memory + representation is the same. + On POSIX platforms, the `"zd"` format should be used for `ssize_t`. + + Since: 2.6 + +`G_GSSIZE_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gssize`. It + is a string literal. + + Note that this is not necessarily the correct modifier to scan or print + a POSIX `ssize_t` or a Windows `SSIZE_T`, even though the in-memory + representation is the same. + On POSIX platforms, the `"z"` modifier should be used for `ssize_t`. + + Since: 2.6 + +### `goffset` + +A signed integer type that is used for file offsets, +corresponding to the POSIX type `off_t` as if compiling with +`_FILE_OFFSET_BITS` set to 64. `goffset` is always 64 bits wide, even on +32-bit architectures, and even if `off_t` is only 32 bits. +Values of this type can range from `G_MINOFFSET` to +`G_MAXOFFSET`. + +To print or scan values of this type, use +`G_GOFFSET_MODIFIER` and/or `G_GOFFSET_FORMAT`. + +On platforms with more than one 64-bit standard integer type, +even if `off_t` is also 64 bits in size, `goffset` and `off_t` are not +necessarily implemented by the same 64-bit integer type. +See [`gsize`](#gsize) for more details of what this implies. + +Since: 2.14 + +`G_MINOFFSET` +: The minimum value which can be held in a `goffset`. + +`G_MAXOFFSET` +: The maximum value which can be held in a `goffset`. + +`G_GOFFSET_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `goffset`. It is a string + literal. See also `G_GINT64_MODIFIER`. + + This modifier should only be used with `goffset` values, and not + with `off_t`, which is not necessarily the same type or even the same size. + + Since: 2.20 + +`G_GOFFSET_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `goffset`. See also `G_GINT64_FORMAT`. + + This format should only be used with `goffset` values, and not + with `off_t`, which is not necessarily the same type or even the same size. + + Since: 2.20 + +`G_GOFFSET_CONSTANT(val)` +: This macro is used to insert `goffset` 64-bit integer literals + into the source code. + + See also `G_GINT64_CONSTANT()`. + + Since: 2.20 + +### `gintptr` + +Corresponds to the C99 type `intptr_t`, +a signed integer type that can hold any pointer. + +The standard `intptr_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires `gintptr`. +Note that `intptr_t` and `gintptr` might be implemented by different +standard integer types of the same size. See [`gsize`](#gsize) for more details. + +`gintptr` is not guaranteed to be the same type or the same size as +[`gssize`](#gssize), even though they are the same on many CPU architectures. + +To print or scan values of this type, use +`G_GINTPTR_MODIFIER` and/or `G_GINTPTR_FORMAT`. + +Since: 2.18 + +`G_GINTPTR_MODIFIER` +: The platform dependent length modifier for conversion specifiers + for scanning and printing values of type `gintptr` or `guintptr`. + It is a string literal. + + Note that this is not necessarily the correct modifier to scan or + print an `intptr_t`, even though the in-memory representation is the + same. + Standard C macros like `PRIdPTR` and `SCNdPTR` should be used for + `intptr_t`. + + Since: 2.22 + +`G_GINTPTR_FORMAT` +: This is the platform dependent conversion specifier for scanning + and printing values of type `gintptr`. + + Note that this is not necessarily the correct format to scan or + print an `intptr_t`, even though the in-memory representation is the + same. + Standard C macros like `PRIdPTR` and `SCNdPTR` should be used for + `intptr_t`. + + Since: 2.22 + +### `guintptr` + +Corresponds to the C99 type `uintptr_t`, +an unsigned integer type that can hold any pointer. + +The standard `uintptr_t` type should be preferred in new code, unless +consistency with pre-existing APIs requires `guintptr`. +Note that `uintptr_t` and `guintptr` might be implemented by different +standard integer types of the same size. See [`gsize`](#gsize) for more details. + +`guintptr` is not guaranteed to be the same type or the same size as +[`gsize`](#gsize), even though they are the same on many CPU architectures. + +To print or scan values of this type, use +`G_GINTPTR_MODIFIER` and/or `G_GUINTPTR_FORMAT`. + +Since: 2.18 + +`G_GUINTPTR_FORMAT` +: This is the platform dependent conversion specifier + for scanning and printing values of type `guintptr`. + + Note that this is not necessarily the correct format to scan or + print a `uintptr_t`, even though the in-memory representation is the + same. + Standard C macros like `PRIuPTR` and `SCNuPTR` should be used for + `uintptr_t`. + + Since: 2.22 diff --git a/docs/reference/glib/unicode.md b/docs/reference/glib/unicode.md new file mode 100644 index 0000000..da4ed96 --- /dev/null +++ b/docs/reference/glib/unicode.md @@ -0,0 +1,37 @@ +Title: Unicode +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2011, 2014, 2023 Matthias Clasen +SPDX-FileCopyrightText: 2020 Endless OS Foundation, LLC + +# Unicode support + +GLib has support for various aspects of Unicode, and provides a number of APIs for dealing +with Unicode characters and strings. + +There are analogues of the traditional `ctype.h` character classification and case conversion +functions, UTF-8 analogues of some string utility functions, functions to perform normalization, +case conversion and collation on UTF-8 strings and finally functions to convert between the UTF-8, +UTF-16 and UCS-4 encodings of Unicode. + +The implementations of the Unicode functions in GLib are based on the Unicode Character Data tables, +which are available from [www.unicode.org](http://www.unicode.org/). + + - Unicode 4.0 was added in GLib 2.8 + - Unicode 4.1 was added in GLib 2.10 + - Unicode 5.0 was added in GLib 2.12 + - Unicode 5.1 was added in GLib 2.16.3 + - Unicode 6.0 was added in GLib 2.30 + - Unicode 6.1 was added in GLib 2.32 + - Unicode 6.2 was added in GLib 2.36 + - Unicode 6.3 was added in GLib 2.40 + - Unicode 7.0 was added in GLib 2.42 + - Unicode 8.0 was added in GLib 2.48 + - Unicode 9.0 was added in GLib 2.50.1 + - Unicode 10.0 was added in GLib 2.54 + - Unicode 11.10 was added in GLib 2.58 + - Unicode 12.0 was added in GLib 2.62 + - Unicode 12.1 was added in GLib 2.62 + - Unicode 13.0 was added in GLib 2.66 + - Unicode 14.0 was added in GLib 2.71 + - Unicode 15.0 was added in GLib 2.76 + diff --git a/docs/reference/glib/unix.md b/docs/reference/glib/unix.md new file mode 100644 index 0000000..4dad673 --- /dev/null +++ b/docs/reference/glib/unix.md @@ -0,0 +1,48 @@ +Title: Unix-specific Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2011 Colin Walters + +# Unix-specific Utilities + +Most of GLib is intended to be portable; in contrast, this set of +functions is designed for programs which explicitly target Unix, +or are using it to build higher level abstractions which would be +conditionally compiled if the platform matches `G_OS_UNIX`. + +To use these functions, you must explicitly include the +`glib-unix.h` header. + +## File Descriptors + + * [func@GLibUnix.open_pipe] + * [func@GLibUnix.set_fd_nonblocking] + +## Pipes + +The [struct@GLibUnix.Pipe] structure can be used to conveniently open and +manipulate a Unix pipe. + + +The methods for it are all static inline for efficiency. They are: + + * `g_unix_pipe_open()` + * `g_unix_pipe_get()` + * `g_unix_pipe_steal()` + * `g_unix_pipe_close()` + * `g_unix_pipe_clear()` + +## Signals + + * [func@GLibUnix.signal_add] + * [func@GLibUnix.signal_add_full] + * [func@GLibUnix.signal_source_new] + +## Polling + + * [func@GLibUnix.fd_add] + * [func@GLibUnix.fd_add_full] + * [func@GLibUnix.fd_source_new] + +## User Database + + * [func@GLibUnix.get_passwd_entry] diff --git a/docs/reference/glib/uuid.md b/docs/reference/glib/uuid.md new file mode 100644 index 0000000..3abebe3 --- /dev/null +++ b/docs/reference/glib/uuid.md @@ -0,0 +1,25 @@ +Title: GUuid +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2017 Bastien Nocera +SPDX-FileCopyrightText: 2017 Marc-André Lureau + +# GUuid + +A UUID, or Universally unique identifier, is intended to uniquely +identify information in a distributed environment. For the +definition of UUID, see [RFC 4122](https://tools.ietf.org/html/rfc4122.html). + +The creation of UUIDs does not require a centralized authority. + +UUIDs are of relatively small size (128 bits, or 16 bytes). The +common string representation (ex: +`1d6c0810-2bd6-45f3-9890-0268422a6f14`) needs 37 bytes. +[func@GLib.uuid_string_is_valid] can be used to check whether a string is a +valid UUID. + +The UUID specification defines 5 versions, and calling +[func@GLib.uuid_string_random] will generate a unique (or rather random) +UUID of the most common version, version 4. + +UUID support was added to GLib in version 2.52. + diff --git a/docs/reference/glib/version.md b/docs/reference/glib/version.md new file mode 100644 index 0000000..4d9ddcf --- /dev/null +++ b/docs/reference/glib/version.md @@ -0,0 +1,46 @@ +Title: Version Information +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2004 Matthias Clasen +SPDX-FileCopyrightText: 2012 Emmanuele Bassi + +# Version Information + +GLib provides version information, primarily useful in configure +checks for builds that have a configure script. Applications will +not typically use the features described here. + +## Run-time Version Numbers + +The variables `glib_major_version`, `glib_minor_version`, `glib_micro_version`, +`glib_binary_age` and `glib_interface_age` are all available to check. + +They can be compared using the function [func@GLib.check_version]. + +## Compile-time Version Numbers + + * [const@GLib.MAJOR_VERSION] + * [const@GLib.MINOR_VERSION] + * [const@GLib.MICRO_VERSION] + * [func@GLib.CHECK_VERSION] + +## Version Numbers + +The GLib headers annotate deprecated APIs in a way that produces +compiler warnings if these deprecated APIs are used. The warnings +can be turned off by defining the macro `GLIB_DISABLE_DEPRECATION_WARNINGS` +before including the `glib.h` header. + +GLib also provides support for building applications against +defined subsets of deprecated or new GLib APIs. Define the macro +`GLIB_VERSION_MIN_REQUIRED` to specify up to what version of GLib +you want to receive warnings about deprecated APIs. Define the +macro `GLIB_VERSION_MAX_ALLOWED` to specify the newest version of +GLib whose API you want to use. + +The macros `GLIB_VERSION_2_2`, `GLIB_VERSION_2_4`, …, `GLIB_VERSION_2_80`, etc. +are defined automatically in each release, and can be used to set the value +of macros like `GLIB_VERSION_MIN_REQUIRED`. + +The macros `GLIB_VERSION_CUR_STABLE` and `GLIB_VERSION_PREV_STABLE` are also +automatically defined to point to the right version definitions. + diff --git a/docs/reference/glib/version.xml.in b/docs/reference/glib/version.xml.in deleted file mode 100644 index af9b9c4..0000000 --- a/docs/reference/glib/version.xml.in +++ /dev/null @@ -1 +0,0 @@ -@GLIB_VERSION@ diff --git a/docs/reference/glib/warnings.md b/docs/reference/glib/warnings.md new file mode 100644 index 0000000..bb05656 --- /dev/null +++ b/docs/reference/glib/warnings.md @@ -0,0 +1,73 @@ +Title: Warnings and Assertions +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2018 Endless Mobile, Inc. +SPDX-FileCopyrightText: 2023 Daniel Carpenter + +# Warnings and Assertions + +GLib defines several warning functions and assertions which can be used to +warn of programmer errors when calling functions, and print error messages +from command line programs. + +## Pre-condition Assertions + +The [func@GLib.return_if_fail], [func@GLib.return_val_if_fail], +[func@GLib.return_if_reached] and [func@GLib.return_val_if_reached] macros are +intended as pre-condition assertions, to be used at the top of a public function +to check that the function’s arguments are acceptable. Any failure of such a +pre-condition assertion is considered a programming error on the part of the +caller of the public API, and the program is considered to be in an undefined +state afterwards. They are similar to the libc [`assert()`](man:assert(3)) +function, but provide more context on failures. + +For example: +```c +gboolean +g_dtls_connection_shutdown (GDtlsConnection *conn, + gboolean shutdown_read, + gboolean shutdown_write, + GCancellable *cancellable, + GError **error) +{ + // local variable declarations + + g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), FALSE); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + // function body + + return return_val; +} +``` + +[func@GLib.warn_if_fail] and [func@GLib.warn_if_reached] behave similarly, but +they will not abort the program on failure. The program should be considered to +be in an undefined state if they fail, however. + +## Messages + +[func@GLib.print] and [func@GLib.printerr] are intended to be used for +output from command line applications, since they output to standard output +and standard error by default — whereas functions like [func@GLib.message] and +[func@GLib.log] may be redirected to special purpose message windows, files, or +the system journal. + +The default print handlers may be overridden with [func@GLib.set_print_handler] +and [func@GLib.set_printerr_handler]. + +### Encoding + +If the console encoding is not UTF-8 (as specified by +[func@GLib.get_console_charset]) then these functions convert the message first. +Any Unicode characters not defined by that charset are replaced by `'?'`. On +Linux, [`setlocale()`](man:setlocale(3)) must be called early in `main()` to +load the encoding. This behaviour can be changed by providing custom handlers to +[func@GLib.set_print_handler], [func@GLib.set_printerr_handler] and +[func@GLib.log_set_handler]. + +## Debugging Utilities + + * [func@GLib.on_error_query] + * [func@GLib.on_error_stack_trace] + * [func@GLib.BREAKPOINT] diff --git a/docs/reference/glib/windows.md b/docs/reference/glib/windows.md new file mode 100644 index 0000000..bdef6da --- /dev/null +++ b/docs/reference/glib/windows.md @@ -0,0 +1,26 @@ +Title: Windows-specific Utilities +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2005 Ross Burton + +# Windows-specific Utilities + +These functions provide some level of Unix emulation on the +Windows platform. If your application really needs the POSIX +APIs, we suggest you try the [Cygwin project](https://cygwin.com/). + + * [type@GLibWin32.OSType] + * [func@GLibWin32.check_windows_version] + * [func@GLibWin32.get_command_line] + * [func@GLibWin32.error_message] + * [func@GLibWin32.getlocale] + * [func@GLibWin32.get_package_installation_directory] + * [func@GLibWin32.get_package_installation_directory_of_module] + * [func@GLibWin32.get_package_installation_subdirectory] + * [func@GLibWin32.get_windows_version] + * [func@GLibWin32.locale_filename_from_utf8] + * [func@GLibWin32.HAVE_WIDECHAR_API] + * [func@GLibWin32.IS_NT_BASED] + +## Deprecated API + + * [func@GLib.WIN32_DLLMAIN_FOR_DLL_NAME] diff --git a/docs/reference/glib/xml/gtkdocentities.ent.in b/docs/reference/glib/xml/gtkdocentities.ent.in deleted file mode 100644 index f12c9ff..0000000 --- a/docs/reference/glib/xml/gtkdocentities.ent.in +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/reference/glib/xml/meson.build b/docs/reference/glib/xml/meson.build deleted file mode 100644 index 6aeb745..0000000 --- a/docs/reference/glib/xml/meson.build +++ /dev/null @@ -1,14 +0,0 @@ -ent_conf = configuration_data() -ent_conf.set('PACKAGE', 'glib') -ent_conf.set('PACKAGE_BUGREPORT', 'https://gitlab.gnome.org/GNOME/glib/issues/new') -ent_conf.set('PACKAGE_NAME', 'glib') -ent_conf.set('PACKAGE_STRING', 'glib') -ent_conf.set('PACKAGE_TARNAME', 'glib') -ent_conf.set('PACKAGE_URL', 'FIXME') -ent_conf.set('PACKAGE_VERSION', glib_version) -ent_conf.set('PACKAGE_API_VERSION', glib_api_version) -configure_file( - input: 'gtkdocentities.ent.in', - output: 'gtkdocentities.ent', - configuration: ent_conf -) diff --git a/docs/reference/gmodule/gmodule.toml.in b/docs/reference/gmodule/gmodule.toml.in new file mode 100644 index 0000000..20a0a9d --- /dev/null +++ b/docs/reference/gmodule/gmodule.toml.in @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GModule" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_url = "https://docs.gtk.org/gmodule/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "Portable API for dynamically loading modules" +dependencies = [ "GLib-2.0", "GObject-2.0", "Gio-2.0" ] +devhelp = true +search_index = true + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + + [dependencies."GObject-2.0"] + name = "GObject" + description = "The base type system library" + docs_url = "https://docs.gtk.org/gobject/" + + [dependencies."Gio-2.0"] + name = "GIO" + description = "GObject Interfaces and Objects, Networking, IPC, and I/O" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[source-location] +base_url = "https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/" + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "modules.md", +] +content_images = [ +] diff --git a/docs/reference/gmodule/meson.build b/docs/reference/gmodule/meson.build new file mode 100644 index 0000000..25a2e4e --- /dev/null +++ b/docs/reference/gmodule/meson.build @@ -0,0 +1,26 @@ +if get_option('documentation') and enable_gir + expand_content_files = [ + 'modules.md', + ] + + gmodule_toml = configure_file(input: 'gmodule.toml.in', output: 'gmodule.toml', configuration: toml_conf) + + custom_target('gmodule-docs', + input: [ gmodule_toml, gmodule_gir[0] ], + output: 'gmodule', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) +endif diff --git a/docs/reference/gmodule/modules.md b/docs/reference/gmodule/modules.md new file mode 100644 index 0000000..8f0eeeb --- /dev/null +++ b/docs/reference/gmodule/modules.md @@ -0,0 +1,92 @@ +Title: Dynamic Loading of Modules + +## Dynamic Loading of Modules + +These functions provide a portable way to dynamically load object files +(commonly known as 'plug-ins'). The current implementation supports all +systems that provide an implementation of `dlopen()` (e.g. Linux/Sun), as +well as Windows platforms via DLLs. + +A program which wants to use these functions must be linked to the libraries +output by the command: + + pkg-config --libs gmodule-2.0 + +To use them you must first determine whether dynamic loading is supported on +the platform by calling [`func@GModule.Module.supported`]. If it is, you can +open a module with [`func@GModule.Module.open`], find the module's symbols +(e.g. function names) with [`method@GModule.Module.symbol`], and later close +the module with [`method@GModule.Module.close`]. +[`method@GModule.Module.name`] will return the file name of a currently +opened module. + +If any of the above functions fail, the error status can be found with +[`func@GModule.Module.error`]. + +The `GModule` implementation features reference counting for opened modules, +and supports hook functions within a module which are called when the module +is loaded and unloaded (see [callback@GModule.ModuleCheckInit] and +[callback@GModule.ModuleUnload]). + +If your module introduces static data to common subsystems in the running +program, e.g. through calling API like: + +```c +static GQuark my_module_quark = + g_quark_from_static_string ("my-module-stuff"); +``` + +it must ensure that it is never unloaded, by calling +[`method@GModule.Module.make_resident`]. + +### Calling a function defined in a GModule + +```c +// the function signature for 'say_hello' +typedef void (* SayHelloFunc) (const char *message); + +gboolean +just_say_hello (const char *filename, GError **error) +{ + SayHelloFunc say_hello; + GModule *module; + + module = g_module_open (filename, G_MODULE_BIND_LAZY); + if (module == NULL) + { + g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH, + "%s", g_module_error ()); + return FALSE; + } + + if (!g_module_symbol (module, "say_hello", (gpointer *)&say_hello)) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, + "%s: %s", filename, g_module_error ()); + + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + + return FALSE; + } + + if (say_hello == NULL) + { + g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, + "symbol say_hello is NULL"); + + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + + return FALSE; + } + + // call our function in the module + say_hello ("Hello world!"); + + if (!g_module_close (module)) + g_warning ("%s: %s", filename, g_module_error ()); + + return TRUE; + } +``` diff --git a/docs/reference/gobject/boxed.md b/docs/reference/gobject/boxed.md new file mode 100644 index 0000000..d311221 --- /dev/null +++ b/docs/reference/gobject/boxed.md @@ -0,0 +1,113 @@ +Title: Boxed Types + +# Boxed Types + +A "boxed type" is a generic wrapper mechanism for arbitrary C structures. +The only thing the type system needs to know about the structures is how to +copy them (a [`callback@GObject.BoxedCopyFunc`]) and how to free them (a +[`callback@GObject.BoxedFreeFunc`])—beyond that they are treated as opaque +chunks of memory. + +Boxed types are useful for simple value-holder structures like rectangles or +points. They can also be used for wrapping structures defined in non-GObject +based libraries. They allow arbitrary structures to be handled in a uniform +way, allowing uniform copying (or referencing) and freeing (or +unreferencing) of them, and uniform representation of the type of the +contained structure. In turn, this allows any type which can be boxed to be +set as the data in a `GValue`, which allows for polymorphic handling of a much +wider range of data types, and hence usage of such types as `GObject` property +values. + +All boxed types inherit from the `G_TYPE_BOXED` fundamental type. + +It is very important to note that boxed types are **not** deeply +inheritable: you cannot register a boxed type that inherits from another +boxed type. This means you cannot create your own custom, parallel type +hierarchy and map it to GType using boxed types. If you want to have deeply +inheritable types without using GObject, you will need to use +`GTypeInstance`. + +## Registering a new boxed type + +The recommended way to register a new boxed type is to use the +[`func@GObject.DEFINE_BOXED_TYPE`] macro: + +```c +// In the header + +#define EXAMPLE_TYPE_RECTANGLE (example_rectangle_get_type()) + +typedef struct { + double x, y; + double width, height; +} ExampleRectangle; + +GType +example_rectangle_get_type (void); + +ExampleRectangle * +example_rectangle_copy (ExampleRectangle *r); + +void +example_rectangle_free (ExampleRectangle *r); + +// In the source +G_DEFINE_BOXED_TYPE (ExampleRectangle, example_rectangle, + example_rectangle_copy, + example_rectangle_free) +``` + +Just like `G_DEFINE_TYPE` and `G_DEFINE_INTERFACE_TYPE`, the +`G_DEFINE_BOXED_TYPE` macro will provide the definition of the `get_type()` +function, which will call [`func@GObject.boxed_type_register_static`] with +the given type name as well as the `GBoxedCopyFunc` and `GBoxedFreeFunc` +functions. + +## Using boxed types + +### Object properties + +In order to use a boxed type with GObject properties you will need to +register the property using [`func@GObject.param_spec_boxed`], e.g. + +```c +obj_props[PROP_BOUNDS] = + g_param_spec_boxed ("bounds", NULL, NULL, + EXAMPLE_TYPE_RECTANGLE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); +``` + +In the `set_property` implementation you can use `g_value_get_boxed()` to +retrieve a pointer to the boxed type: + +```c +switch (prop_id) + { + // ... + case PROP_BOUNDS: + example_object_set_bounds (self, g_value_get_boxed (value)); + break; + // ... + } +``` + +Similarly, you can use `g_value_set_boxed()` in the implementation of the +`get_property` virtual function: + +```c +switch (prop_id) + { + // ... + case PROP_BOUNDS: + g_value_set_boxed (self, &self->bounds); + break; + // ... + } +``` + +## Reference counting + +Boxed types are designed so that reference counted types can be boxed. Use +the type’s ‘ref’ function as the `GBoxedCopyFunc`, and its ‘unref’ function as +the `GBoxedFreeFunc`. For example, for `GBytes`, the `GBoxedCopyFunc` is +`g_bytes_ref()`, and the GBoxedFreeFunc is `g_bytes_unref()`. diff --git a/docs/reference/gobject/concepts.md b/docs/reference/gobject/concepts.md new file mode 100644 index 0000000..62bdf95 --- /dev/null +++ b/docs/reference/gobject/concepts.md @@ -0,0 +1,1847 @@ +Title: Type System Concepts + +# Type System Concepts + +## Introduction + +Most modern programming languages come with their own native object systems +and additional fundamental algorithmic language constructs. Just as GLib +serves as an implementation of such fundamental types and algorithms (linked +lists, hash tables and so forth), the GLib Object System provides the +required implementations of a flexible, extensible, and intentionally easy +to map (into other languages) object-oriented framework for C. The +substantial elements that are provided can be summarized as: + +- A generic type system to register arbitrary single-inherited flat and deep + derived types as well as interfaces for structured types. It takes care of + creation, initialization and memory management of the assorted object and + class structures, maintains parent/child relationships and deals with + dynamic implementations of such types. That is, their type specific + implementations are relocatable/unloadable during runtime. +- A collection of fundamental type implementations, such as integers, + doubles, enums and structured types, to name a few. +- A sample fundamental type implementation to base object hierarchies upon - + the GObject fundamental type. +- A signal system that allows very flexible user customization of + virtual/overridable object methods and can serve as a powerful + notification mechanism. +- An extensible parameter/value system, supporting all the provided + fundamental types that can be used to generically handle object properties + or otherwise parameterized types. + +## Background + +GObject, and its lower-level type system, GType, are used by GTK and most +GNOME libraries to provide: + +- object-oriented C-based APIs and +- automatic transparent API bindings to other compiled or interpreted + languages. + +A lot of programmers are used to working with compiled-only or dynamically +interpreted-only languages and do not understand the challenges associated +with cross-language interoperability. This introduction tries to provide an +insight into these challenges and briefly describes the solution chosen by +GLib. + +The following chapters go into greater detail into how GType and GObject +work and how you can use them as a C programmer. It is useful to keep in +mind that allowing access to C objects from other interpreted languages was +one of the major design goals: this can often explain the sometimes rather +convoluted APIs and features present in this library. + +### Data types and programming + +One could say that a programming language is merely a way to create data +types and manipulate them. Most languages provide a number of +language-native types and a few primitives to create more complex types +based on these primitive types. + +In C, the language provides types such as char, long, pointer. During +compilation of C code, the compiler maps these language types to the +compiler's target architecture machine types. If you are using a C +interpreter (assuming one exists), the interpreter (the program which +interprets the source code and executes it) maps the language types to the +machine types of the target machine at runtime, during the program execution +(or just before execution if it uses a Just In Time compiler engine). + +Perl and Python are interpreted languages which do not really provide type +definitions similar to those used by C. Perl and Python programmers +manipulate variables and the type of the variables is decided only upon the +first assignment or upon the first use which forces a type on the variable. +The interpreter also often provides a lot of automatic conversions from one +type to the other. For example, in Perl, a variable which holds an integer +can be automatically converted to a string given the required context: + +```perl +my $tmp = 10; +print "this is an integer converted to a string:" . $tmp . "\n"; +``` + +Of course, it is also often possible to explicitly specify conversions when +the default conversions provided by the language are not intuitive. + +### Exporting a C API + +C APIs are defined by a set of functions and global variables which are +usually exported from a binary. C functions have an arbitrary number of +arguments and one return value. Each function is thus uniquely identified by +the function name and the set of C types which describe the function +arguments and return value. The global variables exported by the API are +similarly identified by their name and their type. + +A C API is thus merely defined by a set of names to which a set of types are +associated. If you know the function calling convention and the mapping of +the C types to the machine types used by the platform you are on, you can +resolve the name of each function to find where the code associated to this +function is located in memory, and then construct a valid argument list for +the function. Finally, all you have to do is trigger a call to the target C +function with the argument list. + +For the sake of discussion, here is a sample C function and the associated +32 bit x86 assembly code generated by GCC on a Linux computer: + +```c +static void +function_foo (int foo) +{ +} + +int +main (int argc, + char *argv[]) +{ + function_foo (10); + + return 0; +} +``` + +```asm +push $0xa +call 0x80482f4 +``` + +The assembly code shown above is pretty straightforward: the first +instruction pushes the hexadecimal value 0xa (decimal value 10) as a 32-bit +integer on the stack and calls `function_foo`. As you can see, C function +calls are implemented by GCC as native function calls (this is probably the +fastest implementation possible). + +Now, let's say we want to call the C function `function_foo` from a Python +program. To do this, the Python interpreter needs to: + +- Find where the function is located. This probably means finding the binary + generated by the C compiler which exports this function. +- Load the code of the function in executable memory. +- Convert the Python parameters to C-compatible parameters before calling + the function. +- Call the function with the right calling convention. +- Convert the return values of the C function to Python-compatible variables + to return them to the Python code. + +The process described above is pretty complex and there are a lot of ways to +make it entirely automatic and transparent to C and Python programmers: + +- The first solution is to write by hand a lot of glue code, once for each + function exported or imported, which does the Python-to-C parameter + conversion and the C-to-Python return value conversion. This glue code is + then linked with the interpreter which allows Python programs to call + Python functions which delegate work to C functions. +- Another, nicer solution is to automatically generate the glue code, once + for each function exported or imported, with a special compiler which + reads the original function signature. + +The solution used by GLib is to use the GType library which holds at runtime +a description of all the objects manipulated by the programmer. This +so-called dynamic type library is then used by special generic glue code to +automatically convert function parameters and function calling conventions +between different runtime domains. + +The greatest advantage of the solution implemented by GType is that the glue +code sitting at the runtime domain boundaries is written once: the figure +below states this more clearly. + +![](./glue.png) + +Currently, there exist multiple generic glue code which makes it possible to +use C objects written with GType directly in a variety of languages, with a +minimum amount of work: there is no need to generate huge amounts of glue +code either automatically or by hand. + +Although that goal was arguably laudable, its pursuit has had a major +influence on the whole GType/GObject library. C programmers are likely to be +puzzled at the complexity of the features exposed in the following chapters +if they forget that the GType/GObject library was not only designed to offer +OO-like features to C programmers but also transparent cross-language +interoperability. + +## The GLib Dynamic Type System + +A type, as manipulated by the GLib type system, is much more generic than what is usually understood as an Object type. It is best explained by looking at the structure and the functions used to register new types in the type system. + +```c +typedef struct _GTypeInfo GTypeInfo; +struct _GTypeInfo +{ + /* interface types, classed types, instantiated types */ + guint16 class_size; + + GBaseInitFunc base_init; + GBaseFinalizeFunc base_finalize; + + /* classed types, instantiated types */ + GClassInitFunc class_init; + GClassFinalizeFunc class_finalize; + gconstpointer class_data; + + /* instantiated types */ + guint16 instance_size; + guint16 n_preallocs; + GInstanceInitFunc instance_init; + + /* value handling */ + const GTypeValueTable *value_table; +}; + +GType +g_type_register_static (GType parent_type, + const gchar *type_name, + const GTypeInfo *info, + GTypeFlags flags); + +GType +g_type_register_fundamental (GType type_id, + const gchar *type_name, + const GTypeInfo *info, + const GTypeFundamentalInfo *finfo, + GTypeFlags flags); +``` + +`g_type_register_static()`, `g_type_register_dynamic()` and +`g_type_register_fundamental()` are the C functions, defined in `gtype.h` +and implemented in `gtype.c` which you should use to register a new GType in +the program's type system. It is not likely you will ever need to use +`g_type_register_fundamental()` but in case you want to, the last chapter +explains how to create new fundamental types. + +Fundamental types are top-level types which do not derive from any other +type while other non-fundamental types derive from other types. Upon +initialization, the type system not only initializes its internal data +structures but it also registers a number of core types: some of these are +fundamental types. Others are types derived from these fundamental types. + +Fundamental and non-fundamental types are defined by: + +- class size: the `class_size` field in `GTypeInfo`. +- class initialization functions (C++ constructor): the `base_init` and + `class_init` fields in `GTypeInfo`. +- class destruction functions (C++ destructor): the `base_finalize` and + `class_finalize` fields in `GTypeInfo`. +- instance size (C++ parameter to new): the `instance_size` field in + `GTypeInfo`. +- instantiation policy (C++ type of new operator): the `n_preallocs` field + in `GTypeInfo`. +- copy functions (C++ copy operators): the `value_table` field in + `GTypeInfo`. +- type characteristic flags: `GTypeFlags`. + +Fundamental types are also defined by a set of `GTypeFundamentalFlags` which +are stored in a `GTypeFundamentalInfo`. Non-fundamental types are +furthermore defined by the type of their parent which is passed as the +`parent_type` parameter to `g_type_register_static()` and +`g_type_register_dynamic()`. + +## Copy functions + +The major common point between all GLib types (fundamental and +non-fundamental, classed and non-classed, instantiatable and +non-instantiatable) is that they can all be manipulated through a single API +to copy/assign them. + +The `GValue` structure is used as an abstract container for all of these +types. Its simplistic API (defined in `gobject/gvalue.h`) can be used to +invoke the `value_table` functions registered during type registration: for +example `g_value_copy()` copies the content of a `GValue` to another +`GValue`. This is similar to a C++ assignment which invokes the C++ copy +operator to modify the default bit-by-bit copy semantics of C++/C +structures/classes. + +The following code shows how you can copy around a 64 bit integer, as well +as a `GObject` instance pointer: + +```c +static void test_int (void) +{ + GValue a_value = G_VALUE_INIT; + GValue b_value = G_VALUE_INIT; + guint64 a, b; + + a = 0xdeadbeef; + + g_value_init (&a_value, G_TYPE_UINT64); + g_value_set_uint64 (&a_value, a); + + g_value_init (&b_value, G_TYPE_UINT64); + g_value_copy (&a_value, &b_value); + + b = g_value_get_uint64 (&b_value); + + if (a == b) { + g_print ("Yay !! 10 lines of code to copy around a uint64.\n"); + } else { + g_print ("Are you sure this is not a Z80 ?\n"); + } +} + +static void test_object (void) +{ + GObject *obj; + GValue obj_vala = G_VALUE_INIT; + GValue obj_valb = G_VALUE_INIT; + obj = g_object_new (VIEWER_TYPE_FILE, NULL); + + g_value_init (&obj_vala, VIEWER_TYPE_FILE); + g_value_set_object (&obj_vala, obj); + + g_value_init (&obj_valb, G_TYPE_OBJECT); + + /* g_value_copy's semantics for G_TYPE_OBJECT types is to copy the reference. + * This function thus calls g_object_ref. + * It is interesting to note that the assignment works here because + * VIEWER_TYPE_FILE is a G_TYPE_OBJECT. + */ + g_value_copy (&obj_vala, &obj_valb); + + g_object_unref (G_OBJECT (obj)); + g_object_unref (G_OBJECT (obj)); +} +``` + +The important point about the above code is that the exact semantics of the +copy calls is undefined since they depend on the implementation of the copy +function. Certain copy functions might decide to allocate a new chunk of +memory and then to copy the data from the source to the destination. Others +might want to simply increment the reference count of the instance and copy +the reference to the new `GValue`. + +The value table used to specify these assignment functions is documented in +`GTypeValueTable`. + +Interestingly, it is also very unlikely you will ever need to specify a +`value_table` during type registration because these `value_tables` are +inherited from the parent types for non-fundamental types. + +## Conventions + +There are a number of conventions users are expected to follow when creating +new types which are to be exported in a header file: + +- Type names (including object names) must be at least three characters long + and start with "a–z", "A–Z" or "\_". +- Use the `object_method` pattern for function names: to invoke the method + named save on an instance of object type file, call `file_save`. +- Use prefixing to avoid namespace conflicts with other projects. If your + library (or application) is named `Viewer`, prefix all your function names + with viewer_. For example: `viewer_object_method`. +- Create a macro named `PREFIX_TYPE_OBJECT` which always returns the GType + for the associated object type. For an object of type `File` in the + `Viewer` namespace, use: `VIEWER_TYPE_FILE`. This macro is implemented + using a function named `prefix_object_get_type`; for example, + `viewer_file_get_type`. +- Use `G_DECLARE_FINAL_TYPE` or `G_DECLARE_DERIVABLE_TYPE` to define various + other conventional macros for your object: + - `PREFIX_OBJECT (obj)`, which returns a pointer of type `PrefixObject`. + This macro is used to enforce static type safety by doing explicit casts + wherever needed. It also enforces dynamic type safety by doing runtime + checks. It is possible to disable the dynamic type checks in production + builds (see "Building GLib" section in the GLib API reference). For + example, we would create `VIEWER_FILE (obj)` to keep the previous + example. + - `PREFIX_OBJECT_CLASS (klass)`, which is strictly equivalent to the + previous casting macro: it does static casting with dynamic type + checking of class structures. It is expected to return a pointer to a + class structure of type `PrefixObjectClass`. An example is: + `VIEWER_FILE_CLASS`. + - `PREFIX_IS_OBJECT (obj)`, which returns a gboolean which indicates + whether the input object instance pointer is non-`NULL` and of type + `OBJECT`. For example, `VIEWER_IS_FILE`. + - `PREFIX_IS_OBJECT_CLASS (klass)`, which returns a boolean if the input + class pointer is a pointer to a class of type `OBJECT`. For example, + `VIEWER_IS_FILE_CLASS`. + - `PREFIX_OBJECT_GET_CLASS (obj)`, which returns the class pointer + associated to an instance of a given type. This macro is used for static + and dynamic type safety purposes (just like the previous casting + macros). For example, `VIEWER_FILE_GET_CLASS`. + +The implementation of these macros is pretty straightforward: a number of +simple-to-use macros are provided in `gtype.h`. For the example we used above, +we would write the following trivial code to declare the macros: + +```c +#define VIEWER_TYPE_FILE viewer_file_get_type() +G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) +``` + +Unless your code has special requirements, you can use the `G_DEFINE_TYPE` +macro to define a class: + +```c +G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) +``` + +Otherwise, the `viewer_file_get_type` function must be implemented manually: + +```c +GType viewer_file_get_type (void) +{ + static GType type = 0; + if (type == 0) { + const GTypeInfo info = { + /* You fill this structure. */ + }; + type = g_type_register_static (G_TYPE_OBJECT, + "ViewerFile", + &info, 0); + } + return type; +} +``` + +## Non-instantiatable non-classed fundamental types + +A lot of types are not instantiatable by the type system and do not have a class. Most of these types are fundamental trivial types such as `gchar`, and are already registered by GLib. + +In the rare case of needing to register such a type in the type system, fill a `GTypeInfo` structure with zeros since these types are also most of the time fundamental: + +```c +GTypeInfo info = { + .class_size = 0, + + .base_init = NULL, + .base_finalize = NULL, + + .class_init = NULL, + .class_finalize = NULL, + .class_data = NULL, + + .instance_size = 0, + .n_preallocs = 0, + .instance_init = NULL, + + .value_table = NULL, +}; + +static const GTypeValueTable value_table = { + .value_init = value_init_long0, + .value_free = NULL, + .value_copy = value_copy_long0, + .value_peek_pointer = NULL, + + .collect_format = "i", + .collect_value = value_collect_int, + .lcopy_format = "p", + .lcopy_value = value_lcopy_char, +}; + +info.value_table = &value_table; + +type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0); +``` + +Having non-instantiatable types might seem a bit useless: what good is a +type if you cannot instantiate an instance of that type? Most of these types +are used in conjunction with `GValue`s: a `GValue` is initialized with an +integer or a string and it is passed around by using the registered type's +`value_table`. `GValue`s (and by extension these trivial fundamental types) +are most useful when used in conjunction with object properties and signals. + +## Instantiatable classed types: objects + +Types which are registered with a class and are declared instantiatable are +what most closely resembles an object. Although `GObject`s are the most well +known type of instantiatable classed types, other kinds of similar objects +used as the base of an inheritance hierarchy have been externally developed +and they are all built on the fundamental features described below. + +For example, the code below shows how you could register such a fundamental +object type in the type system (using none of the GObject convenience API): + +```c +typedef struct { + GObject parent_instance; + + /* instance members */ + char *filename; +} ViewerFile; + +typedef struct { + GObjectClass parent_class; + + /* class members */ + + /* the first is public, pure and virtual */ + void (*open) (ViewerFile *self, + GError **error); + + /* the second is public and virtual */ + void (*close) (ViewerFile *self, + GError **error); +} ViewerFileClass; + +#define VIEWER_TYPE_FILE (viewer_file_get_type ()) + +GType +viewer_file_get_type (void) +{ + static GType type = 0; + if (type == 0) { + const GTypeInfo info = { + .class_size = sizeof (ViewerFileClass), + .base_init = NULL, + .base_finalize = NULL, + .class_init = (GClassInitFunc) viewer_file_class_init, + .class_finalize = NULL, + .class_data = NULL, + .instance_size = sizeof (ViewerFile), + .n_preallocs = 0, + .instance_init = (GInstanceInitFunc) viewer_file_init, + }; + type = g_type_register_static (G_TYPE_OBJECT, + "ViewerFile", + &info, 0); + } + return type; +} +``` + +Upon the first call to `viewer_file_get_type`, the type named `ViewerFile` will be registered in the type system as inheriting from the type `G_TYPE_OBJECT`. + +Every object must define two structures: its class structure and its instance structure. All class structures must contain as first member a `GTypeClass` structure. All instance structures must contain as first member a `GTypeInstance` structure. The declaration of these C types, coming from `gtype.h` is shown below: + +``` +struct _GTypeClass +{ + GType g_type; +}; + +struct _GTypeInstance +{ + GTypeClass *g_class; +}; +``` + +These constraints allow the type system to make sure that every object instance (identified by a pointer to the object's instance structure) contains in its first bytes a pointer to the object's class structure. + +This relationship is best explained by an example: let's take object B which inherits from object A: + +```c +/* A definitions */ +typedef struct { + GTypeInstance parent; + int field_a; + int field_b; +} A; + +typedef struct { + GTypeClass parent_class; + void (*method_a) (void); + void (*method_b) (void); +} AClass; + +/* B definitions. */ +typedef struct { + A parent; + int field_c; + int field_d; +} B; + +typedef struct { + AClass parent_class; + void (*method_c) (void); + void (*method_d) (void); +} BClass; +``` + +The C standard mandates that the first field of a C structure is stored starting in the first byte of the buffer used to hold the structure's fields in memory. This means that the first field of an instance of an object B is A's first field which in turn is `GTypeInstance`'s first field which in turn is `g_class`, a pointer to B's class structure. + +Thanks to these simple conditions, it is possible to detect the type of every object instance by doing: + +```c +B *b; +b->parent.parent.g_class->g_type +``` + +or, more compactly: + +```c +B *b; +((GTypeInstance *) b)->g_class->g_type +``` + +### Initialization and destruction + +Instantiation of these types can be done with `g_type_create_instance()`, which +will look up the type information structure associated with the type +requested. Then, the instance size and instantiation policy (if the +`n_preallocs` field is set to a non-zero value, the type system allocates the +object's instance structures in chunks rather than mallocing for every +instance) declared by the user are used to get a buffer to hold the object's +instance structure. + +If this is the first instance of the object ever created, the type system +must create a class structure. It allocates a buffer to hold the object's +class structure and initializes it. The first part of the class structure +(ie: the embedded parent class structure) is initialized by copying the +contents from the class structure of the parent class. The rest of class +structure is initialized to zero. If there is no parent, the entire class +structure is initialized to zero. The type system then invokes the +`base_init` functions `(GBaseInitFunc)` from topmost fundamental +object to bottom-most most derived object. The object's `class_init` +`(GClassInitFunc)` function is invoked afterwards to complete initialization +of the class structure. Finally, the object's interfaces are initialized (we +will discuss interface initialization in more detail later). + +Once the type system has a pointer to an initialized class structure, it +sets the object's instance class pointer to the object's class structure and +invokes the object's `instance_init` `(GInstanceInitFunc)` functions, from +top-most fundamental type to bottom-most most-derived type. + +Object instance destruction through `g_type_free_instance()` is very simple: +the instance structure is returned to the instance pool if there is one and +if this was the last living instance of the object, the class is destroyed. + +Class destruction (the concept of destruction is sometimes partly referred +to as finalization in GType) is the symmetric process of the initialization: +interfaces are destroyed first. Then, the most derived `class_finalize` +`(GClassFinalizeFunc)` function is invoked. Finally, the `base_finalize` +`(GBaseFinalizeFunc)` functions are invoked from bottom-most most-derived type +to top-most fundamental type and the class structure is freed. + +The base initialization/finalization process is very similar to the C++ +constructor/destructor paradigm. The practical details are different though +and it is important not to get confused by superficial similarities. GTypes +have no instance destruction mechanism. It is the user's responsibility to +implement correct destruction semantics on top of the existing GType code. +(This is what `GObject` does) Furthermore, C++ +code equivalent to the `base_init` and `class_init` callbacks of GType is +usually not needed because C++ cannot really create object types at runtime. + +The instantiation/finalization process can be summarized as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction invokedFunction's parameters
First call to g_type_create_instance() for target typetype's base_init functionOn the inheritance tree of classes from fundamental type to target type. base_init is invoked once for each class structure.
target type's class_init functionOn target type's class structure
interface initialization, see the section called “Interface Initialization”
Each call to g_type_create_instance() for target typetarget type's instance_init functionOn object's instance
Last call to g_type_free_instance() for target typeinterface destruction, see the section called “Interface Destruction”
target type's class_finalize functionOn target type's class structure
type's base_finalize functionOn the inheritance tree of classes from fundamental type to target type. base_finalize is invoked once for each class structure.
+ +## Non-instantiatable classed types: interfaces + +GType's interfaces are very similar to Java's interfaces. They allow to +describe a common API that several classes will adhere to. Imagine the play, +pause and stop buttons on hi-fi equipment—those can be seen as a playback +interface. Once you know what they do, you can control your CD player, MP3 +player or anything that uses these symbols. + +To declare an interface you have to register a non-instantiatable classed +type which derives from `GTypeInterface`. The following piece of code declares +such an interface: + +```c +#define VIEWER_TYPE_EDITABLE viewer_editable_get_type () +G_DECLARE_INTERFACE (ViewerEditable, viewer_editable, VIEWER, EDITABLE, GObject) + +struct _ViewerEditableInterface { + GTypeInterface parent; + + void (*save) (ViewerEditable *self, + GError **error); +}; + +void viewer_editable_save (ViewerEditable *self, + GError **error); +``` + +The interface function, `viewer_editable_save` is implemented in a pretty +simple way: + +```c +void +viewer_editable_save (ViewerEditable *self, + GError **error) +{ + ViewerEditableinterface *iface; + + g_return_if_fail (VIEWER_IS_EDITABLE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + iface = VIEWER_EDITABLE_GET_IFACE (self); + g_return_if_fail (iface->save != NULL); + iface->save (self); +} +``` + +`viewer_editable_get_type` registers a type named `ViewerEditable` which +inherits from `G_TYPE_INTERFACE`. All interfaces must be children of +`G_TYPE_INTERFACE` in the inheritance tree. + +An interface is defined by only one structure which must contain as first +member a `GTypeInterface` structure. The interface structure is expected to +contain the function pointers of the interface methods. It is good style to +define helper functions for each of the interface methods which simply call +the interface's method directly: `viewer_editable_save` is one of these. + +If you have no special requirements you can use the `G_IMPLEMENT_INTERFACE` +macro to implement an interface: + +```c +static void +viewer_file_save (ViewerEditable *self) +{ + g_print ("File implementation of editable interface save method.\n"); +} + +static void +viewer_file_editable_interface_init (ViewerEditableInterface *iface) +{ + iface->save = viewer_file_save; +} + +G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, VIEWER_TYPE_FILE, + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_file_editable_interface_init)) +``` + +If your code does have special requirements, you must write a custom +`get_type` function to register your GType which inherits from some GObject +and which implements the interface `ViewerEditable`. For example, this code +registers a new `ViewerFile` class which implements `ViewerEditable`: + +```c +static void +viewer_file_save (ViewerEditable *editable) +{ + g_print ("File implementation of editable interface save method.\n"); +} + +static void +viewer_file_editable_interface_init (gpointer g_iface, + gpointer iface_data) +{ + ViewerEditableInterface *iface = g_iface; + + iface->save = viewer_file_save; +} + +GType +viewer_file_get_type (void) +{ + static GType type = 0; + if (type == 0) { + const GTypeInfo info = { + .class_size = sizeof (ViewerFileClass), + .base_init = NULL, + .base_finalize = NULL, + .class_init = (GClassInitFunc) viewer_file_class_init, + .class_finalize = NULL, + .class_data = NULL, + .instance_size = sizeof (ViewerFile), + .n_preallocs = 0, + .instance_init = (GInstanceInitFunc) viewer_file_init + }; + + const GInterfaceInfo editable_info = { + .interface_init = (GInterfaceInitFunc) viewer_file_editable_interface_init, + .interface_finalize = NULL, + .interface_data = NULL, + }; + + type = g_type_register_static (VIEWER_TYPE_FILE, + "ViewerFile", + &info, 0); + + g_type_add_interface_static (type, + VIEWER_TYPE_EDITABLE, + &editable_info); + } + return type; +} +``` + +`g_type_add_interface_static()` records in the type system that the given +`ViewerFile` type implements also `ViewerEditable` +(`viewer_editable_get_type()` returns the type of `ViewerEditable`). The +`GInterfaceInfo` structure holds information about the implementation of the +interface: + +```c +struct _GInterfaceInfo +{ + GInterfaceInitFunc interface_init; + GInterfaceFinalizeFunc interface_finalize; + gpointer interface_data; +}; +``` + +### Interface initialization + +When an instantiatable classed type which implements an interface (either +directly or by inheriting an implementation from a superclass) is created +for the first time, its class structure is initialized following the process +described in the section called "Instantiatable classed types: objects". +After that, the interface implementations associated with the type are +initialized. + +First a memory buffer is allocated to hold the interface structure. The +parent's interface structure is then copied over to the new interface +structure (the parent interface is already initialized at that point). If +there is no parent interface, the interface structure is initialized with +zeros. The `g_type` and the `g_instance_type` fields are then initialized: +`g_type` is set to the type of the most-derived interface and `g_instance_type` +is set to the type of the most derived type which implements this interface. + +The interface's `base_init` function is called, and then the interface's +`default_init` is invoked. Finally if the type has registered an +implementation of the interface, the implementation's `interface_init` +function is invoked. If there are multiple implementations of an interface +the `base_init` and `interface_init` functions will be invoked once for each +implementation initialized. + +It is thus recommended to use a `default_init` function to initialize an +interface. This function is called only once for the interface no matter how +many implementations there are. The `default_init` function is declared by +`G_DEFINE_INTERFACE` which can be used to define the interface: + +```c +G_DEFINE_INTERFACE (ViewerEditable, viewer_editable, G_TYPE_OBJECT) + +static void +viewer_editable_default_init (ViewerEditableInterface *iface) +{ + /* add properties and signals here, will only be called once */ +} +``` + +Or you can do that yourself in a GType function for your interface: + +```c +GType +viewer_editable_get_type (void) +{ + static gsize type_id = 0; + if (g_once_init_enter (&type_id)) { + const GTypeInfo info = { + sizeof (ViewerEditableInterface), + NULL, /* base_init */ + NULL, /* base_finalize */ + viewer_editable_default_init, /* class_init */ + NULL, /* class_finalize */ + NULL, /* class_data */ + 0, /* instance_size */ + 0, /* n_preallocs */ + NULL /* instance_init */ + }; + GType type = g_type_register_static (G_TYPE_INTERFACE, + "ViewerEditable", + &info, 0); + g_once_init_leave (&type_id, type); + } + return type_id; +} + +static void +viewer_editable_default_init (ViewerEditableInterface *iface) +{ + /* add properties and signals here, will only called once */ +} +``` + +In summary, interface initialization uses the following functions: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parametersRemark
First call to g_type_create_instance() for any type implementing interfaceinterface's base_init functionOn interface's vtableRarely necessary to use this. Called once per instantiated classed type implementing the interface.
First call to g_type_create_instance() for each type implementing interfaceinterface's default_init functionOn interface's vtableRegister interface's signals, properties, etc. here. Will be called once.
First call to g_type_create_instance() for any type implementing interfaceimplementation's interface_init functionOn interface's vtableInitialize interface implementation. Called for each class that that implements the interface. Initialize the interface method pointers in the interface structure to the implementing class's implementation.
+ +### Interface Destruction + +When the last instance of an instantiatable type which registered an +interface implementation is destroyed, the interface's implementations +associated to the type are destroyed. + +To destroy an interface implementation, GType first calls the +implementation's `interface_finalize` function and then the interface's +most-derived `base_finalize` function. + +Again, it is important to understand, as in the section called "Interface +Initialization", that both `interface_finalize` and `base_finalize` are +invoked exactly once for the destruction of each implementation of an +interface. Thus, if you were to use one of these functions, you would need +to use a static integer variable which would hold the number of instances of +implementations of an interface such that the interface's class is destroyed +only once (when the integer variable reaches zero). + +The above process can be summarized as follows: + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction InvokedFunction's parameters
Last call to g_type_free_instance() for type implementing interfaceinterface's interface_finalize functionOn interface's vtable
interface's base_finalize functionOn interface's vtable
+ +## The GObject base class + +The previous chapter discussed the details of GLib's Dynamic Type System. +The GObject library also contains an implementation for a base fundamental +type named `GObject`. + +`GObject` is a fundamental classed instantiatable type. It implements: + +- memory management with reference counting +- construction/Destruction of instances +- generic per-object properties with set/get function pairs +- easy use of signals + +All the GNOME libraries which use the GLib type system (like GTK and +GStreamer) inherit from `GObject` which is why it is important to understand +the details of how it works. + +### Object instantiation + +The `g_object_new()` family of functions can be used to instantiate any +GType which inherits from the GObject base type. All these functions make +sure the class and instance structures have been correctly initialized by +GLib's type system and then invoke at one point or another the constructor +class method which is used to: + +- allocate and clear memory through `g_type_create_instance()` +- initialize the object's instance with the construction properties. + +GObject explicitly guarantees that all class and instance members (except +the fields pointing to the parents) to be set to zero. + +Once all construction operations have been completed and constructor +properties set, the constructed class method is called. + +Objects which inherit from `GObject` are allowed to override this +constructed class method. The example below shows how `ViewerFile` overrides +the parent's construction process: + +```c +#define VIEWER_TYPE_FILE viewer_file_get_type () +G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) + +struct _ViewerFile +{ + GObject parent_instance; + + /* instance members */ + char *filename; + guint zoom_level; +}; + +/* will create viewer_file_get_type and set viewer_file_parent_class */ +G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) + +static void +viewer_file_constructed (GObject *obj) +{ + /* update the object state depending on constructor properties */ + + /* Always chain up to the parent constructed function to complete object + * initialisation. */ + G_OBJECT_CLASS (viewer_file_parent_class)->constructed (obj); +} + +static void +viewer_file_finalize (GObject *obj) +{ + ViewerFile *self = VIEWER_FILE (obj); + + g_free (self->filename); + + /* Always chain up to the parent finalize function to complete object + * destruction. */ + G_OBJECT_CLASS (viewer_file_parent_class)->finalize (obj); +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->constructed = viewer_file_constructed; + object_class->finalize = viewer_file_finalize; +} + +static void +viewer_file_init (ViewerFile *self) +{ + /* initialize the object */ +} +``` + +If the user instantiates an object `ViewerFile` with: + +```c +ViewerFile *file = g_object_new (VIEWER_TYPE_FILE, NULL); +``` + +If this is the first instantiation of such an object, the +`viewer_file_class_init` function will be invoked after any +`viewer_file_base_class_init` function. This will make sure the class +structure of this new object is correctly initialized. Here, +`viewer_file_class_init` is expected to override the object's class methods +and setup the class' own methods. In the example above, the constructed +method is the only overridden method: it is set to +`viewer_file_constructed`. + +Once `g_object_new()` has obtained a reference to an initialized class +structure, it invokes its constructor method to create an instance of the +new object, if the constructor has been overridden in +`viewer_file_class_init`. Overridden constructors must chain up to their +parent’s constructor. In order to find the parent class and chain up to the +parent class constructor, we can use the `viewer_file_parent_class` pointer +that has been set up for us by the `G_DEFINE_TYPE` macro. + +Finally, at one point or another, `g_object_constructor` is invoked by the +last constructor in the chain. This function allocates the object's instance +buffer through `g_type_create_instance()` which means that the +`instance_init` function is invoked at this point if one was registered. +After `instance_init` returns, the object is fully initialized and should be +ready to have its methods called by the user. When +`g_type_create_instance()` returns, `g_object_constructor` sets the +construction properties (i.e. the properties which were given to +`g_object_new()`) and returns to the user's constructor. + +The process described above might seem a bit complicated, but it can be +summarized easily by the table below which lists the functions invoked by +`g_object_new()` and their order of invocation: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction invokedFunction's parametersRemark
First call to g_object_new() for target typetarget type's base_init functionOn the inheritance tree of classes from fundamental type to target type. base_init is invoked once for each class structure.Never used in practice. Unlikely you will need it.
target type's class_init functionOn target type's class structureHere, you should make sure to initialize or override class methods (that is, assign to each class' method its function pointer) and create the signals and the properties associated to your object.
interface's base_init functionOn interface's vtable
interface's interface_init functionOn interface's vtable
Each call to g_object_new() for target typetarget type's class constructor method: GObjectClass->constructor + On object's instanceIf you need to handle construct properties in a custom way, or implement a singleton class, override the constructor method and make sure to chain up to the object's parent class before doing your own initialization. In doubt, do not override the constructor method.
type's instance_init functionOn the inheritance tree of classes from fundamental type to target type. The instance_init provided for each type is invoked once for each instance structure.Provide an instance_init function to initialize your object before its construction properties are set. This is the preferred way to initialize a GObject instance. This function is equivalent to C++ constructors.
target type's class constructed method: GObjectClass->constructedOn object's instanceIf you need to perform object initialization steps after all construct properties have been set. This is the final step in the object initialization process, and is only called if the constructor method returned a new object instance (rather than, for example, an existing singleton).
+ +Readers should feel concerned about one little twist in the order in which +functions are invoked: while, technically, the class' constructor method is +called before the GType's `instance_init` function (since +`g_type_create_instance()` which calls `instance_init` is called by +`g_object_constructor` which is the top-level class constructor method and +to which users are expected to chain to), the user's code which runs in a +user-provided constructor will always run after GType's `instance_init` +function since the user-provided constructor must (you've been warned) chain +up before doing anything useful. + +### Object memory management + +The memory-management API for GObjects is a bit complicated but the idea +behind it is pretty simple: the goal is to provide a flexible model based on +reference counting which can be integrated in applications which use or +require different memory management models (such as garbage collection). The +methods which are used to manipulate this reference count are described +below. + +#### Reference count + +The functions `g_object_ref()` and `g_object_unref()` increase and decrease +the reference count, respectively. These functions are thread-safe. +`g_clear_object()` is a convenience wrapper around `g_object_unref()` which +also clears the pointer passed to it. + +The reference count is initialized to one by `g_object_new()` which means +that the caller is currently the sole owner of the newly-created reference. +(If the object is derived from `GInitiallyUnowned`, this reference is +"floating", and must be "sunk", i.e. transformed into a real reference.) +When the reference count reaches zero, that is, when `g_object_unref()` is +called by the last owner of a reference to the object, the `dispose()` and +the `finalize()` class methods are invoked. + +Finally, after `finalize()` is invoked, `g_type_free_instance()` is called +to free the object instance. Depending on the memory allocation policy +decided when the type was registered (through one of the `g_type_register_*` +functions), the object's instance memory will be freed or returned to the +object pool for this type. Once the object has been freed, if it was the +last instance of the type, the type's class will be destroyed as described +in the section called "Instantiatable classed types: objects" and the +section called "Non-instantiatable classed types: interfaces". + +The table below summarizes the destruction process of a `GObject`: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Invocation timeFunction invokedFunction's parametersRemark
Last call to g_object_unref() for an instance of target typetarget type's dispose class functionGObject instanceWhen dispose ends, the object should not hold any reference to any other member object. The object is also expected to be able to answer client method invocations (with possibly an error code but no memory violation) until finalize is executed. dispose can be executed more than once. dispose should chain up to its parent implementation just before returning to the caller.
target type's finalize class functionGObject instanceFinalize is expected to complete the destruction process initiated by dispose. It should complete the object's destruction. finalize will be executed only once. finalize should chain up to its parent implementation just before returning to the caller. See the section on "Reference counts and cycles" for more information.
Last call to g_object_unref() for the last instance of target typeinterface's interface_finalize functionOn interface's vtableNever used in practice. Unlikely you will need it.
interface's base_finalize functionOn interface's vtableNever used in practice. Unlikely you will need it.
target type's class_finalize functionOn target type's class structureNever used in practice. Unlikely you will need it.
type's base_finalize functionOn the inheritance tree of classes from fundamental type to target type. base_init is invoked once for each class structure.Never used in practice. Unlikely you will need it.
+ +#### Weak References + +Weak references are used to monitor object finalization: +`g_object_weak_ref()` adds a monitoring callback which does not hold a +reference to the object but which is invoked when the object runs its +dispose method. Weak references on the object are automatically dropped when +the instance is disposed, so there is no need to invoke `g_object_weak_unref()` +from the `GWeakNotify` callback. Remember that the object instance is not +passed to the `GWeakNotify` callback because the object has already been +disposed. Instead, the callback receives a pointer to where the object +previously was. + +Weak references are also used to implement `g_object_add_weak_pointer()` and +`g_object_remove_weak_pointer()`. These functions add a weak reference to +the object they are applied to which makes sure to nullify the pointer given +by the user when object is finalized. + +Similarly, `GWeakRef` can be used to implement weak references if thread +safety is required. + +#### Reference counts and cycles + +GObject's memory management model was designed to be easily integrated in +existing code using garbage collection. This is why the destruction process +is split in two phases: the first phase, executed in the `dispose()` handler is +supposed to release all references to other member objects. The second +phase, executed by the `finalize()` handler is supposed to complete the object's +destruction process. Object methods should be able to run without program +error in-between the two phases. + +This two-step destruction process is very useful to break reference counting +cycles. While the detection of the cycles is up to the external code, once +the cycles have been detected, the external code can invoke +`g_object_run_dispose()` which will indeed break any existing cycles since +it will run the dispose handler associated to the object and thus release +all references to other objects. + +This explains one of the rules about the `dispose()` handler stated earlier: +the `dispose()` handler can be invoked multiple times. Let's say we have a +reference count cycle: object A references B which itself references object +A. Let's say we have detected the cycle and we want to destroy the two +objects. One way to do this would be to invoke `g_object_run_dispose()` on one +of the objects. + +If object A releases all its references to all objects, this means it +releases its reference to object B. If object B was not owned by anyone +else, this is its last reference count which means this last unref runs B's +dispose handler which, in turn, releases B's reference on object A. If this +is A's last reference count, this last unref runs A's dispose handler which +is running for the second time before A's finalize handler is invoked! + +The above example, which might seem a bit contrived, can really happen if +GObjects are being handled by language bindings—hence the rules for object +destruction should be closely followed. + +### Object properties + +One of GObject's nice features is its generic get/set mechanism for object +properties. When an object is instantiated, the object's `class_init` +handler should be used to register the object's properties with +`g_object_class_install_properties()`. + +The best way to understand how object properties work is by looking at a +real example of how it is used: + +```c +// Implementation + +typedef enum +{ + PROP_FILENAME = 1, + PROP_ZOOM_LEVEL, + N_PROPERTIES +} ViewerFileProperty; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +viewer_file_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + ViewerFile *self = VIEWER_FILE (object); + + switch ((ViewerFileProperty) property_id) + { + case PROP_FILENAME: + g_free (self->filename); + self->filename = g_value_dup_string (value); + g_print ("filename: %s\n", self->filename); + break; + + case PROP_ZOOM_LEVEL: + self->zoom_level = g_value_get_uint (value); + g_print ("zoom level: %u\n", self->zoom_level); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +viewer_file_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + ViewerFile *self = VIEWER_FILE (object); + + switch ((ViewerFileProperty) property_id) + { + case PROP_FILENAME: + g_value_set_string (value, self->filename); + break; + + case PROP_ZOOM_LEVEL: + g_value_set_uint (value, self->zoom_level); + break; + + default: + /* We don't have any other property... */ + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + break; + } +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = viewer_file_set_property; + object_class->get_property = viewer_file_get_property; + + obj_properties[PROP_FILENAME] = + g_param_spec_string ("filename", + "Filename", + "Name of the file to load and display from.", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + obj_properties[PROP_ZOOM_LEVEL] = + g_param_spec_uint ("zoom-level", + "Zoom level", + "Zoom level to view the file at.", + 0 /* minimum value */, + 10 /* maximum value */, + 2 /* default value */, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); +} +``` + +```c +// Use + +ViewerFile *file; +GValue val = G_VALUE_INIT; + +file = g_object_new (VIEWER_TYPE_FILE, NULL); + +g_value_init (&val, G_TYPE_UINT); +g_value_set_char (&val, 11); + +g_object_set_property (G_OBJECT (file), "zoom-level", &val); + +g_value_unset (&val); +``` + +The client code above looks simple but a lot of things happen under the hood: + +`g_object_set_property()` first ensures a property with this name was +registered in file's `class_init` handler. If so it walks the class +hierarchy, from bottom-most most-derived type, to top-most fundamental type +to find the class which registered that property. It then tries to convert +the user-provided GValue into a GValue whose type is that of the associated +property. + +If the user provides a signed char GValue, as is shown here, and if the +object's property was registered as an `unsigned int`, `g_value_transform()` +will try to transform the input signed char into an unsigned int. Of course, +the success of the transformation depends on the availability of the +required transform function. In practice, there will almost always be a +transformation which matches and conversion will be carried out if needed. + +After transformation, the GValue is validated by `g_param_value_validate()` +which makes sure the user's data stored in the GValue matches the +characteristics specified by the property's GParamSpec. Here, the GParamSpec +we provided in `class_init` has a validation function which makes sure that +the GValue contains a value which respects the minimum and maximum bounds of +the GParamSpec. In the example above, the client's GValue does not respect +these constraints (it is set to 11, while the maximum is 10). As such, the +`g_object_set_property()` function will return with an error. + +If the user's GValue had been set to a valid value, +`g_object_set_property()` would have proceeded with calling the object's +`set_property` class method. Here, since our implementation of ViewerFile +did override this method, execution would jump to `viewer_file_set_property` +after having retrieved from the GParamSpec the `param_id` which had been +stored by `g_object_class_install_property()`. + +Once the property has been set by the object's `set_property` class method, +execution returns to `g_object_set_property()` which makes sure that the +"notify" signal is emitted on the object's instance with the changed +property as parameter unless notifications were frozen by +`g_object_freeze_notify()`. + +`g_object_thaw_notify()` can be used to re-enable notification of property +modifications through the “notify” signal. It is important to remember that +even if properties are changed while property change notification is frozen, +the "notify" signal will be emitted once for each of these changed +properties as soon as the property change notification is thawed: no +property change is lost for the "notify" signal, although multiple +notifications for a single property are compressed. Signals can only be +delayed by the notification freezing mechanism. + +It sounds like a tedious task to set up GValues every time when one wants to +modify a property. In practice one will rarely do this. The functions +`g_object_set_property()` and `g_object_get_property()` are meant to be used +by language bindings. For application there is an easier way and that is +described next. + +### Accessing multiple properties at once + +It is interesting to note that the `g_object_set()` and +`g_object_set_valist()` (variadic version) functions can be used to set +multiple properties at once. The client code shown above can then be +re-written as: + +```c +ViewerFile *file; +file = /* */; +g_object_set (G_OBJECT (file), + "zoom-level", 6, + "filename", "~/some-file.txt", + NULL); +``` + +This saves us from managing the GValues that we were needing to handle when +using `g_object_set_property()`. The code above will trigger one notify +signal emission for each property modified. + +Equivalent `_get` versions are also available: `g_object_get()` and +`g_object_get_valist()` (variadic version) can be used to get numerous +properties at once. + +These high level functions have one drawback — they don't provide a return +value. One should pay attention to the argument types and ranges when using +them. A known source of errors is to pass a different type from what the +property expects; for instance, passing an integer when the property expects +a floating point value and thus shifting all subsequent parameters by some +number of bytes. Also forgetting the terminating NULL will lead to undefined +behaviour. + +This explains how `g_object_new()`, `g_object_newv()` and +`g_object_new_valist()` work: they parse the user-provided variable number +of parameters and invoke `g_object_set()` on the parameters only after the +object has been successfully constructed. The "notify" signal will be +emitted for each property set. + +## The GObject messaging system + +### Closures + +Closures are central to the concept of asynchronous signal delivery which is +widely used throughout GTK and GNOME applications. A closure is an +abstraction, a generic representation of a callback. It is a small structure +which contains three objects: + +- a function pointer (the callback itself) whose prototype looks like: + `return_type function_callback (... , gpointer user_data);` +- the `user_data` pointer which is passed to the callback upon invocation of + the closure +- a function pointer which represents the destructor of the closure: + whenever the closure's refcount reaches zero, this function will be called + before the closure structure is freed + +The `GClosure` structure represents the common functionality of all closure +implementations: there exists a different closure implementation for each +separate runtime which wants to use the GObject type system. The GObject +library provides a simple GCClosure type which is a specific implementation +of closures to be used with C/C++ callbacks. + +A `GClosure` provides simple services: + +- invocation (`g_closure_invoke()`): this is what closures were created for; + they hide the details of callback invocation from the callback invoker. +- notification: the closure notifies listeners of certain events such as + closure invocation, closure invalidation and closure finalization. + Listeners can be registered with `g_closure_add_finalize_notifier()` + (finalization notification), `g_closure_add_invalidate_notifier()` + (invalidation notification) and `g_closure_add_marshal_guards()` + (invocation notification). There exist symmetric deregistration functions + for finalization and invalidation events + (`g_closure_remove_finalize_notifier()` and + `g_closure_remove_invalidate_notifier()`) but not for the invocation + process + +#### C Closures + +If you are using C or C++ to connect a callback to a given event, you will +either use simple `GCClosures` which have a pretty minimal API or the even +simpler `g_signal_connect()` functions (which will be presented a bit later). + +`g_cclosure_new()` will create a new closure which can invoke the +user-provided `callback_func` with the user-provided `user_data` as its last +parameter. When the closure is finalized (second stage of the destruction +process), it will invoke the `destroy_data` function if the user has +supplied one. + +`g_cclosure_new_swap()` will create a new closure which can invoke the +user-provided `callback_func` with the user-provided `user_data` as its +first parameter (instead of being the last parameter as with +`g_cclosure_new()`). When the closure is finalized (second stage of the +destruction process), it will invoke the `destroy_data` function if the user +has supplied one. + +#### Non-C closures (for the fearless) + +As was explained above, closures hide the details of callback invocation. In +C, callback invocation is just like function invocation: it is a matter of +creating the correct stack frame for the called function and executing a +call assembly instruction. + +C closure marshallers transform the array of GValues which represent the +parameters to the target function into a C-style function parameter list, +invoke the user-supplied C function with this new parameter list, get the +return value of the function, transform it into a GValue and return this +GValue to the marshaller caller. + +A generic C closure marshaller is available as +`g_cclosure_marshal_generic()` which implements marshalling for all function +types using libffi. Custom marshallers for different types are not needed +apart from performance critical code where the libffi-based marshaller may +be too slow. + +An example of a custom marshaller is given below, illustrating how GValues +can be converted to a C function call. The marshaller is for a C function +which takes an integer as its first parameter and returns `void`. + +```c +g_cclosure_marshal_VOID__INT (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__INT) (gpointer data1, + gint arg_1, + gpointer data2); + register GMarshalFunc_VOID__INT callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 2); + + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + + callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_marshal_value_peek_int (param_values + 1), + data2); +} +``` + +There exist other kinds of marshallers, for example there is a generic +Python marshaller which is used by all Python closures (a Python closure is +used to invoke a callback written in Python). This Python marshaller +transforms the input GValue list representing the function parameters into a +Python tuple which is the equivalent structure in Python. + +### Signals + +GObject's signals have nothing to do with standard UNIX signals: they +connect arbitrary application-specific events with any number of listeners. +For example, in GTK, every user event (keystroke or mouse move) is received +from the windowing system and generates a GTK event in the form of a signal +emission on the widget object instance. + +Each signal is registered in the type system together with the type on which +it can be emitted: users of the type are said to connect to the signal on a +given type instance when they register a closure to be invoked upon the +signal emission. Users can also emit the signal by themselves or stop the +emission of the signal from within one of the closures connected to the +signal. + +When a signal is emitted on a given type instance, all the closures +connected to this signal on this type instance will be invoked. All the +closures connected to such a signal represent callbacks whose signature +looks like: + +```c +return_type +function_callback (gpointer instance, + ..., + gpointer user_data); +``` + +#### Signal registration + +To register a new signal on an existing type, we can use any of +`g_signal_newv()`, `g_signal_new_valist()` or `g_signal_new()` functions: + +```c +guint +g_signal_newv (const gchar *signal_name, + GType itype, + GSignalFlags signal_flags, + GClosure *class_closure, + GSignalAccumulator accumulator, + gpointer accu_data, + GSignalCMarshaller c_marshaller, + GType return_type, + guint n_params, + GType *param_types); +``` + +The number of parameters to these functions is a bit intimidating but they are relatively simple: + +- `signal_name`: is a string which can be used to uniquely identify a given + signal +- `itype`: is the instance type on which this signal can be emitted +- `signal_flags`: partly defines the order in which closures which were + connected to the signal are invoked +- `class_closure`: this is the default closure for the signal: if it is not + `NULL` upon the signal emission, it will be invoked upon this emission of + the signal. The moment where this closure is invoked compared to other + closures connected to that signal depends partly on the `signal_flags` +- `accumulator`: this is a function pointer which is invoked after each + closure has been invoked. If it returns `FALSE`, signal emission is stopped. + If it returns `TRUE`, signal emission proceeds normally. It is also used to + compute the return value of the signal based on the return value of all + the invoked closures. For example, an accumulator could ignore `NULL` + returns from closures; or it could build a list of the values returned by + the closures +- `accu_data`: this pointer will be passed down to each invocation of the + accumulator during emission +- `c_marshaller`: this is the default C marshaller for any closure which is + connected to this signal +- `return_type`: this is the type of the return value of the signal +- `n_params`: this is the number of parameters this signal takes +- `param_types`: this is an array of GTypes which indicate the type of each + parameter of the signal. The length of this array is indicated by + `n_params`. + +As you can see from the above definition, a signal is basically a +description of the closures which can be connected to this signal and a +description of the order in which the closures connected to this signal will +be invoked. + +#### Signal connection + +If you want to connect to a signal with a closure, you have three possibilities: + +- you can register a class closure at signal registration: this is a + system-wide operation. i.e.: the class closure will be invoked during each + emission of a given signal on any of the instances of the type which + supports that signal +- tou can use `g_signal_override_class_closure()` which overrides the class + closure of a given type. It is possible to call this function only on a + derived type of the type on which the signal was registered. This function + is of use only to language bindings +- you can register a closure with the `g_signal_connect()` family of + functions. This is an instance-specific operation: the closure will be + invoked only during emission of a given signal on a given instance + +It is also possible to connect a different kind of callback on a given +signal: emission hooks are invoked whenever a given signal is emitted +whatever the instance on which it is emitted. Emission hooks are connected +with `g_signal_add_emission_hook()` and removed with +`g_signal_remove_emission_hook()`. + +#### Signal emission + +Signal emission is done through the use of the `g_signal_emit()` family of functions. + +```c +void +g_signal_emitv (const GValue instance_and_params[], + guint signal_id, + GQuark detail, + GValue *return_value); +``` + +- the `instance_and_params` array of GValues contains the list of input + parameters to the signal. The first element of the array is the instance + pointer on which to invoke the signal. The following elements of the array + contain the list of parameters to the signal +- `signal_id` identifies the signal to invoke +- `detail` identifies the specific detail of the signal to invoke. A detail + is a kind of magic token/argument which is passed around during signal + emission and which is used by closures connected to the signal to filter + out unwanted signal emissions. In most cases, you can safely set this + value to zero. See the section called "The detail argument" for more + information about this parameter +- `return_value` holds the return value of the last closure invoked during + emission if no accumulator was specified. If an accumulator was specified + during signal creation, this accumulator is used to calculate the return + value as a function of the return values of all the closures invoked + during emission. If no closure is invoked during emission, the + `return_value` is nonetheless initialized to zero/`NULL` + +Signal emission can be decomposed in 6 steps: + +1. `RUN_FIRST`: if the `G_SIGNAL_RUN_FIRST` flag was used during signal + registration and if there exists a class closure for this signal, the + class closure is invoked. +2. `EMISSION_HOOK`: if any emission hook was added to the signal, they are + invoked from first to last added. Accumulate return values. +3. `HANDLER_RUN_FIRST`: if any closure were connected with the + `g_signal_connect()` family of functions, and if they are not blocked + (with the `g_signal_handler_block()` family of functions) they are run + here, from first to last connected. +4. `RUN_LAST`: if the `G_SIGNAL_RUN_LAST` flag was set during registration + and if a class closure was set, it is invoked here. +5. `HANDLER_RUN_LAST`: if any closure were connected with the + `g_signal_connect_after()` family of functions, if they were not invoked + during `HANDLER_RUN_FIRST` and if they are not blocked, they are run + here, from first to last connected. +6. `RUN_CLEANUP`: if the `G_SIGNAL_RUN_CLEANUP` flag was set during + registration and if a class closure was set, it is invoked here. Signal + emission is completed here. + +If, at any point during the emission (except in the `RUN_CLEANUP` or +`EMISSION_HOOK` states), one of the closures stops the signal emission with +`g_signal_stop_emission()`, the emission jumps to the `RUN_CLEANUP` state. + +If, at any point during emission, one of the closures or emission hook emits +the same signal on the same instance, emission is restarted from the +`RUN_FIRST` state. + +The accumulator function is invoked in all states, after invocation of each +closure (except in `RUN_EMISSION_HOOK` and `RUN_CLEANUP`). It accumulates +the closure return value into the signal return value and returns `TRUE` or +`FALSE`. If, at any point, it does not return `TRUE`, emission jumps to +`RUN_CLEANUP` state. + +If no accumulator function was provided, the value returned by the last +handler run will be returned by `g_signal_emit()`. + +#### The detail argument + +All the functions related to signal emission or signal connection have a +parameter named the detail. Sometimes, this parameter is hidden by the API +but it is always there, in one form or another. + +Of the three main connection functions, only one has an explicit detail +parameter as a GQuark: `g_signal_connect_closure_by_id()`. + +The two other functions, `g_signal_connect_closure()` and +`g_signal_connect_data()` hide the detail parameter in the signal name +identification. Their `detailed_signal` parameter is a string which +identifies the name of the signal to connect to. The format of this string +should match `signal_name::detail_name`. For example, connecting to the +signal named `notify::cursor_position` will actually connect to the signal +named `notify` with the `cursor_position` detail. Internally, the detail +string is transformed to a GQuark if it is present. + +Of the four main signal emission functions, one hides it in its signal name +parameter: `g_signal_emit_by_name()`. The other three have an explicit +detail parameter as a GQuark again: `g_signal_emit()`, `g_signal_emitv()` +and `g_signal_emit_valist()`. + +If a detail is provided by the user to the emission function, it is used +during emission to match against the closures which also provide a detail. +If a closure's detail does not match the detail provided by the user, it +will not be invoked (even though it is connected to a signal which is being +emitted). + +This completely optional filtering mechanism is mainly used as an +optimization for signals which are often emitted for many different reasons: +the clients can filter out which events they are interested in before the +closure's marshalling code runs. For example, this is used extensively by +the notify signal of GObject: whenever a property is modified on a GObject, +instead of just emitting the notify signal, GObject associates as a detail +to this signal emission the name of the property modified. This allows +clients who wish to be notified of changes to only one property to filter +most events before receiving them. + +As a simple rule, users can and should set the detail parameter to zero: +this will disable completely this optional filtering for that signal. diff --git a/docs/reference/gobject/enum-types.md b/docs/reference/gobject/enum-types.md new file mode 100644 index 0000000..a9dee87 --- /dev/null +++ b/docs/reference/gobject/enum-types.md @@ -0,0 +1,36 @@ +Title: Enumeration Types + +# Enumeration Types + +The GLib type system provides fundamental types for enumeration and flags +types. Enumerations types are collection of identifiers associated with a +numeric value; flags types are like enumerations, but allow their values to +be combined by bitwise or. + +A registered enumeration or flags type associates a name and a nickname with +each allowed value, and the methods [`func@GObject.enum_get_value_by_name`], +[`func@GObject.enum_get_value_by_nick`], [`func@GObject.flags_get_value_by_name`] and +[`func@GObject.flags_get_value_by_nick`] can look up values by their name or nickname. + +When an enumeration or flags type is registered with the GLib type system, +it can be used as value type for object properties, using +[`func@GObject.param_spec_enum`] or [`func@GObject.param_spec_flags`]. + +GObject ships with a utility called `glib-mkenums`, that can construct +suitable type registration functions from C enumeration definitions. + +Example of how to get a string representation of an enum value: + +```c +GEnumClass *enum_class; +GEnumValue *enum_value; + +enum_class = g_type_class_ref (EXAMPLE_TYPE_ENUM); +enum_value = g_enum_get_value (enum_class, EXAMPLE_ENUM_FOO); + +g_print ("Name: %s\n", enum_value->value_name); + +g_type_class_unref (enum_class); +``` + +Alternatively, you can use [`func@GObject.enum_to_string`]. diff --git a/docs/reference/gobject/floating-refs.md b/docs/reference/gobject/floating-refs.md new file mode 100644 index 0000000..9d044e2 --- /dev/null +++ b/docs/reference/gobject/floating-refs.md @@ -0,0 +1,128 @@ +Title: Floating References + +# Floating References + +**Note**: Floating references are a C convenience API and should not be used +in modern GObject code. Language bindings in particular find the concept +highly problematic, as floating references are not identifiable through +annotations, and neither are deviations from the floating reference +behavior, like types that inherit from [class@GObject.InitiallyUnowned] and +still return a full reference from [`id@g_object_new`]. + +[class@GObject.InitiallyUnowned] is derived from [class@GObject.Object]. The +only difference between the two is that the initial reference of a +`GInitiallyUnowned` is flagged as a "floating" reference. This means that it +is not specifically claimed to be "owned" by any code portion. The main +motivation for providing floating references is C convenience. In +particular, it allows code to be written as: + +```c +container = create_container (); +container_add_child (container, create_child()); +``` + +If `container_add_child()` calls [`method@GObject.Object.ref_sink`] on the +passed-in child, no reference of the newly created child is leaked. Without +floating references, `container_add_child()` can only acquire a reference +the new child, so to implement this code without reference leaks, it would +have to be written as: + +```c +Child *child; +container = create_container (); +child = create_child (); +container_add_child (container, child); +g_object_unref (child); +``` + +The floating reference can be converted into an ordinary reference by +calling `g_object_ref_sink()`. For already sunken objects (objects that +don't have a floating reference anymore), `g_object_ref_sink()` is +equivalent to [`method@GObject.Object.ref`] and returns a new reference. + +Since floating references are useful almost exclusively for C convenience, +language bindings that provide automated reference and memory ownership +maintenance (such as smart pointers or garbage collection) should not expose +floating references in their API. The best practice for handling types that +have initially floating references is to immediately sink those references +after `g_object_new()` returns, by checking if the `GType` inherits from +`GInitiallyUnowned`. For instance: + +```c +GObject *res = g_object_new_with_properties (gtype, + n_props, + prop_names, + prop_values); + +// or: if (g_type_is_a (gtype, G_TYPE_INITIALLY_UNOWNED)) +if (G_IS_INITIALLY_UNOWNED (res)) + g_object_ref_sink (res); + +return res; +``` + +Some object implementations may need to save an object's floating state +across certain code portions (an example is `GtkMenu` in GTK3), to achieve +this, the following sequence can be used: + +```c +// save floating state +gboolean was_floating = g_object_is_floating (object); +g_object_ref_sink (object); +// protected code portion + +... + +// restore floating state +if (was_floating) + g_object_force_floating (object); +else + g_object_unref (object); // release previously acquired reference +``` + +## Replacing floating references with annotations + +You should avoid basing your object hierarchy on floating references, as +they are hard to understand even in C, and introduce additional limitations +when consuming a GObject-based API in other languages. + +One way to express the ownership transfer between ‘container’ and ‘child’ +instances is to use ownership transfer annotations in your documentation and +introspection data. For instance, you can implement this pattern: + +```c +container_add_child (container, create_child ()); +``` + +without leaking by having `container_add_child()` defined as: + +```c +/** + * container_add_child: + * @self: a container + * @child: (transfer full): the child to add to the container + * + * ... + */ +void +container_add_child (Container *container, + Child *child) +{ + container->children = g_list_append (container->children, child); +} +``` + +The container does not explicitly acquire a reference on the child; instead, +the ownership of the child is transferred to the container. The transfer +annotation will be used by language bindings to ensure that there are no +leaks; and documentation tools will explicitly note that the callee now owns +the value passed by the caller. + +## Replacing floating references with weak references + +Another option for replacing floating references is to use weak references +in place of strong ones. A ‘container’ can acquire a weak reference on the +‘child’ instance by using [`method@GObject.Object.weak_ref`]. Once the +child instance loses its last strong reference, the container holding a +weak reference is notified, and it can either remove the child from its +internal list, or turn a weak reference into a strong one. diff --git a/docs/reference/gobject/glib-genmarshal.rst b/docs/reference/gobject/glib-genmarshal.rst new file mode 100644 index 0000000..0e50348 --- /dev/null +++ b/docs/reference/gobject/glib-genmarshal.rst @@ -0,0 +1,390 @@ +.. _glib-genmarshal(1): +.. meta:: + :copyright: Copyright 2003 Matthias Clasen + :copyright: Copyright 2005, 2012, 2013, 2016 Red Hat, Inc. + :copyright: Copyright 2010 Christian Persch + :copyright: Copyright 2017, 2019, 2020 Emmanuele Bassi + :copyright: Copyright 2020 Centricular + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2003 Matthias Clasen + SPDX-FileCopyrightText: 2005, 2012, 2013, 2016 Red Hat, Inc. + SPDX-FileCopyrightText: 2010 Christian Persch + SPDX-FileCopyrightText: 2017, 2019, 2020 Emmanuele Bassi + SPDX-FileCopyrightText: 2020 Centricular + SPDX-License-Identifier: LGPL-2.1-or-later + +=============== +glib-genmarshal +=============== + +------------------------------------------------------ +C code marshaller generation utility for GLib closures +------------------------------------------------------ + +SYNOPSIS +-------- + +| **glib-genmarshal** [OPTION…] [FILE…] + +DESCRIPTION +----------- + +``glib-genmarshal`` is a small utility that generates C code marshallers for +callback functions of the GClosure mechanism in the GObject sublibrary of GLib. +The marshaller functions have a standard signature, they get passed in the +invoking closure, an array of value structures holding the callback function +parameters and a value structure for the return value of the callback. The +marshaller is then responsible to call the respective C code function of the +closure with all the parameters on the stack and to collect its return value. + +``glib-genmarshal`` takes a list of marshallers to generate as input. The +marshaller list is either read from files passed as additional arguments +on the command line; or from standard input, by using ``-`` as the input file. + +MARSHALLER LIST FORMAT +^^^^^^^^^^^^^^^^^^^^^^ + +The marshaller lists are processed line by line, a line can contain a comment in +the form of:: + + # this is a comment + +or a marshaller specification of the form:: + + RTYPE:PTYPE + RTYPE:PTYPE,PTYPE + RTYPE:PTYPE,PTYPE,PTYPE + … + +The ``RTYPE`` part specifies the callback’s return type and the ``PTYPE`` +instances right of the colon specify the callback’s parameter list, except for +the first and the last arguments which are always pointers. + +PARAMETER TYPES +^^^^^^^^^^^^^^^ + +Currently, the following types are supported: + +``VOID`` + + Indicates no return type, or no extra parameters. If ``VOID`` is used as the + parameter list, no additional parameters may be present. + +``BOOLEAN`` + + For boolean types (``gboolean``). + +``CHAR`` + + For signed char types (``gchar``). + +``UCHAR`` + + For unsigned char types (``guchar``). + +``INT`` + + For signed integer types (``gint``). + +``UINT`` + + For unsigned integer types (``guint``). + +``LONG`` + + For signed long integer types (``glong``). + +``ULONG`` + + For unsigned long integer types (``gulong``). + +``INT64`` + + For signed 64-bit integer types (``gint64``). + +``UINT64`` + + For unsigned 64-bit integer types (``guint64``). + +``ENUM`` + + For enumeration types (``gint``). + +``FLAGS`` + + For flag enumeration types (``guint``). + +``FLOAT`` + + For single-precision float types (``gfloat``). + +``DOUBLE`` + + For double-precision float types (``gdouble``). + +``STRING`` + + For string types (``gchar*``). + +``BOXED`` + + For boxed (anonymous but reference counted) types (``GBoxed*``). + +``PARAM`` + + For ``GParamSpec`` or derived types (``GParamSpec*``). + +``POINTER`` + + For anonymous pointer types (``gpointer``). + +``OBJECT`` + + For ``GObject`` or derived types (``GObject*``). + +``VARIANT`` + + For ``GVariant`` types (``GVariant*``). + +``NONE`` + + Deprecated alias for ``VOID``. + +``BOOL`` + + Deprecated alias for ``BOOLEAN``. + +OPTIONS +------- + +``--header`` + + Generate header file contents of the marshallers. This option is mutually + exclusive with the ``--body`` option. + +``--body`` + + Generate C code file contents of the marshallers. This option is mutually + exclusive with the ``--header`` option. + +``--prefix `` + + Specify marshaller prefix. The default prefix is ``g_cclosure_user_marshal``. + +``--skip-source`` + + Skip source location remarks in generated comments. + +``--stdinc`` + + Use the standard marshallers of the GObject library, and include + ``glib-object.h`` in generated header files. This option is mutually exclusive + with the ``--nostdinc`` option. + +``--nostdinc`` + + Do not use the standard marshallers of the GObject library, and skip the + ``glib-object.h`` include directive in generated header files. + This option is mutually exclusive with the ``--stdinc`` option. + +``--internal`` + + Mark generated functions as internal, using ``G_GNUC_INTERNAL``. + +``-valist-marshallers`` + + Generate ``valist`` marshallers, for use with + ``g_signal_set_va_marshaller()``. + +``-v``, ``--version`` + + Print version information and exit. + +``--g-fatal-warnings`` + + Make warnings fatal. That is, exit immediately once a warning occurs. + +``-h``, ``--help`` + + Print brief help and exit. + +``--output `` + + Write output to ``FILE`` instead of the standard output. + +``--prototypes`` + + Generate function prototypes before the function definition in the C source + file, in order to avoid a ``missing-prototypes`` compiler warning. This option + is only useful when using the ``--body`` option. + +``--pragma-once`` + + Use the ``once`` pragma instead of an old style header guard + when generating the C header file. This option is only useful when using the + ``--header`` option. + +``--include-header
`` + + Adds a ``#include`` directive for the given file in the C source file. This + option is only useful when using the ``--body`` option. + +``-D [=]`` + + Adds a ``#define`` C pre-processor directive for ``SYMBOL`` and its given + ``VALUE``, or ``"1"`` if the value is unset. You can use this option multiple + times; if you do, all the symbols will be defined in the same order given on + the command line, before the symbols undefined using the ``-U`` option. This + option is only useful when using the ``--body`` option. + +``-U `` + + Adds a ``#undef`` C pre-processor directive to undefine the given ``SYMBOL``. + You can use this option multiple times; if you do, all the symbols will be + undefined in the same order given on the command line, after the symbols + defined using the ``-D`` option. This option is only useful when using the + ``--body`` option. + +``--quiet`` + + Minimizes the output of ``glib-genmarshal``, by printing only warnings and + errors. This option is mutually exclusive with the ``--verbose`` option. + +``--verbose`` + + Increases the verbosity of ``glib-genmarshal``, by printing debugging + information. This option is mutually exclusive with the ``--quiet`` option. + +USING GLIB-GENMARSHAL WITH MESON +-------------------------------- + +Meson supports generating closure marshallers using ``glib-genmarshal`` out of +the box in its ``gnome`` module. + +In your ``meson.build`` file you will typically call the ``gnome.genmarshal()`` +method with the source list of marshallers to generate:: + + gnome = import('gnome') + marshal_files = gnome.genmarshal('marshal', + sources: 'marshal.list', + internal: true, + ) + +The ``marshal_files`` variable will contain an array of two elements in the +following order: + +* a build target for the source file +* a build target for the header file + +You should use the returned objects to provide a dependency on every other +build target that references the source or header file; for instance, if you +are using the source to build a library:: + + mainlib = library('project', + sources: project_sources + marshal_files, + … + ) + +Additionally, if you are including the generated header file inside a build +target that depends on the library you just built, you must ensure that the +internal dependency includes the generated header as a required source file:: + + mainlib_dep = declare_dependency(sources: marshal_files[1], link_with: mainlib) + +You should not include the generated source file as well, otherwise it will +be built separately for every target that depends on it, causing build +failures. To know more about why all this is required, please refer to the +`corresponding Meson FAQ entry `_. + +For more information on how to use the method, see the +`Meson documentation `_ +for ``gnome.genmarshal()``. + +USING GLIB-GENMARSHAL WITH AUTOTOOLS +------------------------------------ + +In order to use ``glib-genmarshal`` in your project when using Autotools as the +build system, you will first need to modify your ``configure.ac`` file to ensure +you find the appropriate command using ``pkg-config``, similarly as to how you +discover the compiler and linker flags for GLib:: + + PKG_PROG_PKG_CONFIG([0.28]) + + PKG_CHECK_VAR([GLIB_GENMARSHAL], [glib-2.0], [glib_genmarshal]) + +In your ``Makefile.am`` file you will typically need very simple rules to +generate the C files needed for the build:: + + marshal.h: marshal.list + $(AM_V_GEN)$(GLIB_GENMARSHAL) \ + --header \ + --output=$@ \ + $< + + marshal.c: marshal.list marshal.h + $(AM_V_GEN)$(GLIB_GENMARSHAL) \ + --include-header=marshal.h \ + --body \ + --output=$@ \ + $< + + BUILT_SOURCES += marshal.h marshal.c + CLEANFILES += marshal.h marshal.c + EXTRA_DIST += marshal.list + +In the example above, the first rule generates the header file and depends on +a ``marshal.list`` file in order to regenerate the result in case the +marshallers list is updated. The second rule generates the source file for the +same ``marshal.list``, and includes the file generated by the header rule. + +EXAMPLE +------- + +To generate marshallers for the following callback functions:: + + void foo (gpointer data1, + gpointer data2); + void bar (gpointer data1, + gint param1, + gpointer data2); + gfloat baz (gpointer data1, + gboolean param1, + guchar param2, + gpointer data2); + +The ``marshaller.list`` file has to look like this:: + + VOID:VOID + VOID:INT + FLOAT:BOOLEAN,UCHAR + +and you call ``glib-genmarshal`` like this:: + + glib-genmarshal --header marshaller.list > marshaller.h + glib-genmarshal --body marshaller.list > marshaller.c + +The generated marshallers have the arguments encoded in their function name. +For this particular list, they are:: + + g_cclosure_user_marshal_VOID__VOID(...), + g_cclosure_user_marshal_VOID__INT(...), + g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR(...). + +They can be used directly for GClosures or be passed in as the +``GSignalCMarshaller c_marshaller`` argument upon creation of signals:: + + GClosure *cc_foo, *cc_bar, *cc_baz; + + cc_foo = g_cclosure_new (NULL, foo, NULL); + g_closure_set_marshal (cc_foo, g_cclosure_user_marshal_VOID__VOID); + cc_bar = g_cclosure_new (NULL, bar, NULL); + g_closure_set_marshal (cc_bar, g_cclosure_user_marshal_VOID__INT); + cc_baz = g_cclosure_new (NULL, baz, NULL); + g_closure_set_marshal (cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR); + +SEE ALSO +-------- + +`glib-mkenums(1) `_ \ No newline at end of file diff --git a/docs/reference/gobject/glib-genmarshal.xml b/docs/reference/gobject/glib-genmarshal.xml deleted file mode 100644 index 2b3e86f..0000000 --- a/docs/reference/gobject/glib-genmarshal.xml +++ /dev/null @@ -1,579 +0,0 @@ - - - - glib-genmarshal - GObject - - - Developer - Emmanuele - Bassi - - - Original developer - Tim - Janik - - - - - -glib-genmarshal -1 -User Commands - - - -glib-genmarshal -C code marshaller generation utility for GLib closures - - - - -glib-genmarshal -OPTION -FILE - - - -Description -glib-genmarshal is a small utility that generates C code -marshallers for callback functions of the GClosure mechanism in the GObject -sublibrary of GLib. The marshaller functions have a standard signature, -they get passed in the invoking closure, an array of value structures holding -the callback function parameters and a value structure for the return value -of the callback. The marshaller is then responsible to call the respective C -code function of the closure with all the parameters on the stack and to -collect its return value. - - -glib-genmarshal takes a list of marshallers to generate as -input. The marshaller list is either read from files passed as additional arguments -on the command line; or from standard input, by using - as the -input file. - - -Marshaller list format - -The marshaller lists are processed line by line, a line can contain a -comment in the form of - -# this is a comment - -or a marshaller specification of the form - -RTYPE:PTYPE -RTYPE:PTYPE,PTYPE -RTYPE:PTYPE,PTYPE,PTYPE - - - -The RTYPE part specifies the callback's return -type and the PTYPEs right to the colon specify -the callback's parameter list, except for the first and the last arguments -which are always pointers. - - -Parameter types - -Currently, the following types are supported: - - -VOID - -indicates no return type, or no extra parameters. -If VOID is used as the parameter list, no -additional parameters may be present. - - - - -BOOLEAN - -for boolean types (gboolean) - - - - -CHAR - -for signed char types (gchar) - - - - -UCHAR - -for unsigned char types (guchar) - - - - -INT - -for signed integer types (gint) - - - - -UINT - -for unsigned integer types (guint) - - - - -LONG - -for signed long integer types (glong) - - - - -ULONG - -for unsigned long integer types (gulong) - - - - -INT64 - -for signed 64bit integer types (gint64) - - - - -UINT64 - -for unsigned 64bit integer types (guint64) - - - - -ENUM - -for enumeration types (gint) - - - - -FLAGS - -for flag enumeration types (guint) - - - - -FLOAT - -for single-precision float types (gfloat) - - - - -DOUBLE - -for double-precision float types (gdouble) - - - - -STRING - -for string types (gchar*) - - - - -BOXED - -for boxed (anonymous but reference counted) types (GBoxed*) - - - - -PARAM - -for GParamSpec or derived types (GParamSpec*) - - - - -POINTER - -for anonymous pointer types (gpointer) - - - - -OBJECT - -for GObject or derived types (GObject*) - - - - -VARIANT - -for GVariant types (GVariant*) - - - - -NONE - -deprecated alias for VOID - - - - -BOOL - -deprecated alias for BOOLEAN - - - - - - - -Options - - - - - -Generate header file contents of the marshallers. This option is mutually -exclusive with the option. - - - - - - -Generate C code file contents of the marshallers. This option is mutually -exclusive with the option. - - - - - - -Specify marshaller prefix. The default prefix is `g_cclosure_user_marshal'. - - - - - - -Skip source location remarks in generated comments. - - - - - - -Use the standard marshallers of the GObject library, and include -glib-object.h in generated header files. This -option is mutually exclusive with the -option. - - - - - - -Do not use the standard marshallers of the GObject library, and skip -glib-object.h include directive in generated header files. -This option is mutually exclusive with the option. - - - - - - -Mark generated functions as internal, using G_GNUC_INTERNAL. - - - - - - -Generate valist marshallers, for use with g_signal_set_va_marshaller(). - - - - -, - -Print version information. - - - - - - -Make warnings fatal, that is, exit immediately once a warning occurs. - - - - -, - -Print brief help and exit. - - - - -, - -Print version and exit. - - - - - - -Write output to FILE instead of the standard output. - - - - - - -Generate function prototypes before the function definition in the C source -file, in order to avoid a missing-prototypes compiler -warning. This option is only useful when using the -option. - - - - - - -Use the once pragma instead of an old style header guard -when generating the C header file. This option is only useful when using the - option. - - - - - - -Adds a #include directive for the given file in the C -source file. This option is only useful when using the -option. - - - - - - -Adds a #define C pre-processor directive for -SYMBOL and its given VALUE, -or "1" if the value is unset. You can use this option multiple times; if you do, -all the symbols will be defined in the same order given on the command line, before -the symbols undefined using the option. This option is only -useful when using the option. - - - - - - -Adds a #undef C pre-processor directive to undefine the -given SYMBOL. You can use this option multiple times; -if you do, all the symbols will be undefined in the same order given on the -command line, after the symbols defined using the option. -This option is only useful when using the option. - - - - - - -Minimizes the output of glib-genmarshal, by printing only -warnings and errors. This option is mutually exclusive with the - option. - - - - - - -Increases the verbosity of glib-genmarshal, by printing -debugging information. This option is mutually exclusive with the - option. - - - - - - -Using <command>glib-genmarshal</command> with Meson - -Meson supports generating closure marshallers using glib-genmarshal -out of the box in its "gnome" module. - - - -In your meson.build file you will typically call the -gnome.genmarshal() method with the source list of marshallers -to generate: - - -gnome = import('gnome') -marshal_files = gnome.genmarshal('marshal', - sources: 'marshal.list', - internal: true, -) - - -The marshal_files variable will contain an array of two elements -in the following order: - - - a build target for the source file - a build target for the header file - - -You should use the returned objects to provide a dependency on every other -build target that references the source or header file; for instance, if you -are using the source to build a library: - - -mainlib = library('project', - sources: project_sources + marshal_files, - ... -) - - -Additionally, if you are including the generated header file inside a build -target that depends on the library you just built, you must ensure that the -internal dependency includes the generated header as a required source file: - - -mainlib_dep = declare_dependency(sources: marshal_files[1], link_with: mainlib) - - -You should not include the generated source file as well, otherwise it will -be built separately for every target that depends on it, causing build -failures. To know more about why all this is required, please refer to the - -corresponding Meson FAQ entry. - - -For more information on how to use the method, see the -Meson -documentation for gnome.genmarshal(). - - - -Using <command>glib-genmarshal</command> with Autotools - -In order to use glib-genmarshal in your project when using -Autotools as the build system, you will first need to modify your -configure.ac file to ensure you find the appropriate -command using pkg-config, similarly as to how you discover -the compiler and linker flags for GLib. - - -PKG_PROG_PKG_CONFIG([0.28]) - -PKG_CHECK_VAR([GLIB_GENMARSHAL], [glib-2.0], [glib_genmarshal]) - - -In your Makefile.am file you will typically need very -simple rules to generate the C files needed for the build. - - -marshal.h: marshal.list - $(AM_V_GEN)$(GLIB_GENMARSHAL) \ - --header \ - --output=$@ \ - $< - -marshal.c: marshal.list marshal.h - $(AM_V_GEN)$(GLIB_GENMARSHAL) \ - --include-header=marshal.h \ - --body \ - --output=$@ \ - $< - -BUILT_SOURCES += marshal.h marshal.c -CLEANFILES += marshal.h marshal.c -EXTRA_DIST += marshal.list - - -In the example above, the first rule generates the header file and depends on -a marshal.list file in order to regenerate the result in -case the marshallers list is updated. The second rule generates the source file -for the same marshal.list, and includes the file generated -by the header rule. - - - -Example - -To generate marshallers for the following callback functions: - - -void foo (gpointer data1, - gpointer data2); -void bar (gpointer data1, - gint param1, - gpointer data2); -gfloat baz (gpointer data1, - gboolean param1, - guchar param2, - gpointer data2); - - -The marshaller.list file has to look like this: - - -VOID:VOID -VOID:INT -FLOAT:BOOLEAN,UCHAR - - -and you call glib-genmarshal like this: - - -glib-genmarshal --header marshaller.list > marshaller.h -glib-genmarshal --body marshaller.list > marshaller.c - - -The generated marshallers have the arguments encoded in their function name. -For this particular list, they are - - -g_cclosure_user_marshal_VOID__VOID(...), -g_cclosure_user_marshal_VOID__INT(...), -g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR(...). - - -They can be used directly for GClosures or be passed in as the -GSignalCMarshaller c_marshaller; argument upon creation of signals: - - -GClosure *cc_foo, *cc_bar, *cc_baz; - -cc_foo = g_cclosure_new (NULL, foo, NULL); -g_closure_set_marshal (cc_foo, g_cclosure_user_marshal_VOID__VOID); -cc_bar = g_cclosure_new (NULL, bar, NULL); -g_closure_set_marshal (cc_bar, g_cclosure_user_marshal_VOID__INT); -cc_baz = g_cclosure_new (NULL, baz, NULL); -g_closure_set_marshal (cc_baz, g_cclosure_user_marshal_FLOAT__BOOLEAN_UCHAR); - - -See also - - -glib-mkenums -1 - - - - diff --git a/docs/reference/gobject/glib-mkenums.rst b/docs/reference/gobject/glib-mkenums.rst new file mode 100644 index 0000000..d6a5cce --- /dev/null +++ b/docs/reference/gobject/glib-mkenums.rst @@ -0,0 +1,491 @@ +.. _glib-mkenums(1): +.. meta:: + :copyright: Copyright 2003 Matthias Clasen + :copyright: Copyright 2009 Christian Persch + :copyright: Copyright 2010 Allison Karlitskaya + :copyright: Copyright 2012, 2013, 2016 Red Hat, Inc. + :copyright: Copyright 2017, 2019, 2022 Emmanuele Bassi + :copyright: Copyright 2018, 2020 Centricular + :copyright: Copyright 2020 Aleksander Morgado + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2003 Matthias Clasen + SPDX-FileCopyrightText: 2009 Christian Persch + SPDX-FileCopyrightText: 2010 Allison Karlitskaya + SPDX-FileCopyrightText: 2012, 2013, 2016 Red Hat, Inc. + SPDX-FileCopyrightText: 2017, 2019, 2022 Emmanuele Bassi + SPDX-FileCopyrightText: 2018, 2020 Centricular + SPDX-FileCopyrightText: 2020 Aleksander Morgado + SPDX-License-Identifier: LGPL-2.1-or-later + +============ +glib-mkenums +============ + +---------------------------------------------- +C language enum description generation utility +---------------------------------------------- + +SYNOPSIS +-------- + +| **glib-mkenums** [OPTION…] [FILE…] + +DESCRIPTION +----------- + +``glib-mkenums`` is a small utility that parses C code to extract enum +definitions and produces enum descriptions based on text templates specified by +the user. Typically, you can use this tool to generate enumeration +types for the GType type system, for GObject properties and signal marshalling; +additionally, you can use it to generate enumeration values of GSettings +schemas. + +``glib-mkenums`` takes a list of valid C code files as input. The options +specified control the text that generated, substituting various keywords +enclosed in ``@`` characters in the templates. + +Since version 2.74, GLib provides the ``G_DEFINE_ENUM_TYPE`` and +``G_DEFINE_FLAGS_TYPE`` C pre-processor macros. These macros can be used to +define a GType for projects that have few, small enumeration types without going +through the complexities of generating code at build time. + +PRODUCTION TEXT SUBSTITUTIONS +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Certain keywords enclosed in ``@`` characters will be substituted in the +emitted text. For the substitution examples of the keywords below, +the following example enum definition is assumed:: + + typedef enum + { + PREFIX_THE_XVALUE = 1 << 3, + PREFIX_ANOTHER_VALUE = 1 << 4 + } PrefixTheXEnum; + +``@EnumName@`` + + The name of the enum currently being processed, enum names are assumed to be + properly namespaced and to use mixed capitalization to separate + words (e.g. ``PrefixTheXEnum``). + +``@enum_name@`` + + The enum name with words lowercase and word-separated by underscores + (e.g. ``prefix_the_xenum``). + +``@ENUMNAME@`` + + The enum name with words uppercase and word-separated by underscores + (e.g. ``PREFIX_THE_XENUM``). + +``@ENUMSHORT@`` + + The enum name with words uppercase and word-separated by underscores, + prefix stripped (e.g. ``THE_XENUM``). + +``@ENUMPREFIX@`` + + The prefix of the enum name (e.g. ``PREFIX``). + +``@VALUENAME@`` + + The enum value name currently being processed with words uppercase and + word-separated by underscores, this is the assumed literal notation of enum + values in the C sources (e.g. ``PREFIX_THE_XVALUE``). + +``@valuenick@`` + + A nick name for the enum value currently being processed, this is usually + generated by stripping common prefix words of all the enum values of the + current enum, the words are lowercase and underscores are substituted by a + minus (e.g. ``the-xvalue``). + +``@valuenum@`` + + The integer value for the enum value currently being processed. If the + evaluation fails then ``glib-mkenums`` will exit with an + error status, but this only happens if ``@valuenum@`` + appears in your value production template. (Since: 2.26) + +``@type@`` + + This is substituted either by ‘enum’ or ‘flags’, depending on whether the + enum value definitions contained bit-shift operators (e.g. ``flags``). + +``@Type@`` + + The same as ``@type@`` with the first letter capitalized (e.g. ``Flags``). + +``@TYPE@`` + + The same as ``@type@`` with all letters uppercased (e.g. ``FLAGS``). + +``@filename@`` + + The full path of the input file currently being processed + (e.g. ``/build/environment/project/src/foo.h``). + +``@basename@`` + + The base name of the input file currently being processed (e.g. ``foo.h``). + Typically you want to use ``@basename@`` in place of ``@filename@`` + in your templates, to improve the reproducibility of the build. (Since: 2.22) + +TRIGRAPH EXTENSIONS +^^^^^^^^^^^^^^^^^^^ + +Some C comments are treated specially in the parsed enum definitions, such +comments start out with the trigraph sequence ``/*<`` and end with the trigraph +sequence ``>*/``. + +The following options can be specified per enum definition: + +``skip`` + + Indicates this enum definition should be skipped. + +``flags`` + + Indicates this enum should be treated as a flags definition. + +``underscore_name`` + + Specifies the word separation used in the ``*_get_type()`` + function. For instance, + ``/*< underscore_name=gnome_vfs_uri_hide_options >*/``. + +``since`` + + Specifies the version tag that will be used to substitute the ``@enumsince@`` + keyword in the template, useful when documenting methods generated from the + enums (e.g. ``Since: @enumsince@``). (Since: 2.66) + +The following options can be specified per value definition: + +``skip`` + + Indicates the value should be skipped. + +``nick`` + + Specifies the otherwise auto-generated nickname. + +Examples:: + + typedef enum /*< skip >*/ + { + PREFIX_FOO + } PrefixThisEnumWillBeSkipped; + typedef enum /*< flags,prefix=PREFIX,since=1.0 >*/ + { + PREFIX_THE_ZEROTH_VALUE, /*< skip >*/ + PREFIX_THE_FIRST_VALUE, + PREFIX_THE_SECOND_VALUE, + PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/ + } PrefixTheFlagsEnum; + +OPTIONS +------- + +``--fhead `` + + Emits ``TEXT`` prior to processing input files. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be prepended to the + template’s ``file-header`` section. + +``--fprod `` + + Emits ``TEXT`` every time a new input file is being processed. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be appended to the + template’s ``file-production`` section. + +``--ftail `` + + Emits ``TEXT`` after all input files have been processed. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be appended to the + template’s ``file-tail`` section. + +``--eprod `` + + Emits ``TEXT`` every time an enum is encountered in the input files. + +``--vhead `` + + Emits ``TEXT`` before iterating over the set of values of an enum. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be prepended to the + template’s ``value-header`` section. + +``--vprod `` + + Emits ``TEXT`` for every value of an enum. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be appended to the + template’s ``value-production`` section. + +``--vtail `` + + Emits ``TEXT`` after iterating over all values of an enum. + + You can specify this option multiple times, and the ``TEXT`` will be + concatenated. + + When used along with a template file, ``TEXT`` will be appended to the + template’s ``value-tail`` section. + +``--comments `` + + Template for auto-generated comments, the default (for C code generations) is + ``"/* @comment@ */"``. + +``--template `` + + Read templates from the given file. The templates are enclosed in + specially-formatted C comments:: + + /*** BEGIN section ***/ + /*** END section ***/ + + ``section`` may be ``file-header``, ``file-production``, ``file-tail``, + ``enumeration-production``, ``value-header``, ``value-production``, + ``value-tail`` or ``comment``. + +``--identifier-prefix `` + + Indicates what portion of the enum name should be interpreted as the prefix + (e.g. the ``Gtk`` in ``GtkDirectionType``). Normally this will be figured out + automatically, but you may need to override the default if your namespace is + capitalized oddly. + +``--symbol-prefix `` + + Indicates what prefix should be used to correspond to the identifier prefix in + related C function names (e.g. the ``gtk`` in + ``gtk_direction_type_get_type``). Equivalently, this is the lowercase version + of the prefix component of the enum value names (e.g. the ``GTK`` in + ``GTK_DIR_UP``). The default value is the identifier prefix, converted to + lowercase. + +``--help`` + + Print brief help and exit. + +``--version`` + + Print version and exit. + +``--output `` + + Write output to ``FILE`` instead of stdout. + +``@RSPFILE`` + + When passed as the sole argument, read and parse the actual arguments from + ``RSPFILE``. Useful on systems with a low command-line length limit. For + example, Windows has a limit of 8191 characters. + +USING TEMPLATES +--------------- + +Instead of passing the various sections of the generated file to the command +line of ``glib-mkenums``, it’s strongly recommended to use a template file, +especially for generating C sources. + +A C header template file will typically look like this:: + + /*** BEGIN file-header ***/ + #pragma once + + /* Include the main project header */ + #include "project.h" + + G_BEGIN_DECLS + /*** END file-header ***/ + + /*** BEGIN file-production ***/ + + /* enumerations from "@basename@" */ + /*** END file-production ***/ + + /*** BEGIN value-header ***/ + GType @enum_name@_get_type (void) G_GNUC_CONST; + #define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) + /*** END value-header ***/ + + /*** BEGIN file-tail ***/ + G_END_DECLS + /*** END file-tail ***/ + +A C source template file will typically look like this:: + + /*** BEGIN file-header ***/ + #include "config.h" + #include "enum-types.h" + + /*** END file-header ***/ + + /*** BEGIN file-production ***/ + /* enumerations from "@basename@" */ + /*** END file-production ***/ + + /*** BEGIN value-header ***/ + GType + @enum_name@_get_type (void) + { + static GType static_g_@type@_type_id = 0; + + if (g_once_init_enter_pointer (&static_g_@type@_type_id)) + { + static const G@Type@Value values[] = { + /*** END value-header ***/ + + /*** BEGIN value-production ***/ + { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, + /*** END value-production ***/ + + /*** BEGIN value-tail ***/ + { 0, NULL, NULL } + }; + + GType g_@type@_type_id = + g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); + + g_once_init_leave_pointer (&static_g_@type@_type_id, g_@type@_type_id); + } + + return static_g_@type@_type_id; + } + + /*** END value-tail ***/ + +Template files are easier to modify and update, and can be used to generate +various types of outputs using the same command line or tools during the build. + +USING GLIB-MKENUMS WITH MESON +----------------------------- + +Meson supports generating enumeration types using ``glib-mkenums`` out of the +box in its ``gnome`` module. + +In your ``meson.build`` file you will typically call the +``gnome.mkenums_simple()`` method to generate idiomatic enumeration types from a +list of headers to inspect:: + + project_headers = [ + 'project-foo.h', + 'project-bar.h', + 'project-baz.h', + ] + + gnome = import('gnome') + enum_files = gnome.mkenums_simple('enum-types', + sources: project_headers, + ) + +The ``enum_files`` variable will contain an array of two elements +in the following order: + +1. a build target for the source file +2. a build target for the header file + +You should use the returned objects to provide a dependency on every other +build target that references the source or header file; for instance, if you +are using the source to build a library:: + + mainlib = library('project', + sources: project_sources + enum_files, + … + ) + +Additionally, if you are including the generated header file inside a build +target that depends on the library you just built, you must ensure that the +internal dependency includes the generated header as a required source file:: + + mainlib_dep = declare_dependency(sources: enum_files[1], link_with: mainlib) + +You should not include the generated source file as well, otherwise it will +be built separately for every target that depends on it, causing build +failures. To know more about why all this is required, please refer to the +`corresponding Meson FAQ entry `_. + +If you are generating C header and source files that require special templates, +you can use ``gnome.mkenums()`` to provide those headers, for instance:: + + enum_files = gnome.mkenums('enum-types', + sources: project_headers, + h_template: 'enum-types.h.in', + c_template: 'enum-types.c.in', + install_header: true, + ) + +For more information, see the +`Meson documentation `_ +for ``gnome.mkenums()``. + +USING GLIB-MKENUMS WITH AUTOTOOLS +--------------------------------- + +In order to use ``glib-mkenums`` in your project when using Autotools as the +build system, you will first need to modify your ``configure.ac`` file to ensure +you find the appropriate command using ``pkg-config``, similarly as to how you +discover the compiler and linker flags for GLib:: + + PKG_PROG_PKG_CONFIG([0.28]) + + PKG_CHECK_VAR([GLIB_MKENUMS], [glib-2.0], [glib_mkenums]) + +In your ``Makefile.am`` file you will typically use rules like these:: + + # A list of headers to inspect + project_headers = \ + project-foo.h \ + project-bar.h \ + project-baz.h + + enum-types.h: $(project_headers) enum-types.h.in + $(AM_V_GEN)$(GLIB_MKENUMS) \ + --template=enum-types.h.in \ + --output=$@ \ + $(project_headers) + + enum-types.c: $(project_headers) enum-types.c.in enum-types.h + $(AM_V_GEN)$(GLIB_MKENUMS) \ + --template=enum-types.c.in \ + --output=$@ \ + $(project_headers) + + # Build the enum types files before every other target + BUILT_SOURCES += enum-types.h enum-types.c + CLEANFILES += enum-types.h enum-types.c + EXTRA_DIST += enum-types.h.in enum-types.c.in + +In the example above, we have a variable called ``project_headers`` where we +reference all header files we want to inspect for generating enumeration GTypes. +In the ``enum-types.h`` rule we use ``glib-mkenums`` with a template called +``enum-types.h.in`` in order to generate the header file; similarly, in the +``enum-types.c`` rule we use a template called ``enum-types.c.in``. + +SEE ALSO +-------- + +`glib-genmarshal(1) `_ \ No newline at end of file diff --git a/docs/reference/gobject/glib-mkenums.xml b/docs/reference/gobject/glib-mkenums.xml deleted file mode 100644 index f290fe0..0000000 --- a/docs/reference/gobject/glib-mkenums.xml +++ /dev/null @@ -1,659 +0,0 @@ - - - - gdbus - GObject - - - Developer - Owen - Taylor - - - - - -glib-mkenums -1 -User Commands - - - -glib-mkenums -C language enum description generation utility - - - - -glib-mkenums -OPTION -FILE - - - -Description -glib-mkenums is a small utility that parses C code to -extract enum definitions and produces enum descriptions based on text templates -specified by the user. Typically, you can use this tool to generate enumeration -types for the GType type system, for GObject properties and signal marshalling; -additionally, you can use it to generate enumeration values of GSettings schemas. - - -glib-mkenums takes a list of valid C code files as -input. The options specified control the text that generated, substituting various -keywords enclosed in @ characters in the templates. - - -Since version 2.74, GLib provides the G_DEFINE_ENUM_TYPE -and G_DEFINE_FLAGS_TYPE C pre-processor macros. These macros -can be used to define a GType for projects that have few, small enumeration -types without going through the complexities of generating code at build -time. - -Production text substitutions - -Certain keywords enclosed in @ characters will be substituted in the -emitted text. For the substitution examples of the keywords below, -the following example enum definition is assumed: - - -typedef enum -{ - PREFIX_THE_XVALUE = 1 << 3, - PREFIX_ANOTHER_VALUE = 1 << 4 -} PrefixTheXEnum; - - - -@EnumName@ - -The name of the enum currently being processed, enum names are assumed to be -properly namespaced and to use mixed capitalization to separate -words (e.g. PrefixTheXEnum). - - - - -@enum_name@ - -The enum name with words lowercase and word-separated by underscores -(e.g. prefix_the_xenum). - - - - -@ENUMNAME@ - -The enum name with words uppercase and word-separated by underscores -(e.g. PREFIX_THE_XENUM). - - - - -@ENUMSHORT@ - -The enum name with words uppercase and word-separated by underscores, -prefix stripped (e.g. THE_XENUM). - - - - -@ENUMPREFIX@ - -The prefix of the enum name (e.g. PREFIX). - - - - -@VALUENAME@ - -The enum value name currently being processed with words uppercase and -word-separated by underscores, -this is the assumed literal notation of enum values in the C sources -(e.g. PREFIX_THE_XVALUE). - - - - -@valuenick@ - -A nick name for the enum value currently being processed, this is usually -generated by stripping common prefix words of all the enum values of the -current enum, the words are lowercase and underscores are substituted by a -minus (e.g. the-xvalue). - - - - -@valuenum@ - -The integer value for the enum value currently being processed. If the -evaluation fails then glib-mkenums will exit with an -error status, but this only happens if @valuenum@ -appears in your value production template. (Since: 2.26) - - - - -@type@ - -This is substituted either by "enum" or "flags", depending on whether the -enum value definitions contained bit-shift operators or not (e.g. flags). - - - - -@Type@ - -The same as @type@ with the first letter capitalized (e.g. Flags). - - - - -@TYPE@ - -The same as @type@ with all letters uppercased (e.g. FLAGS). - - - - -@filename@ - -The full path of the input file currently being processed (e.g. /build/environment/project/src/foo.h). - - - - -@basename@ - -The base name of the input file currently being processed (e.g. foo.h). -Typically you want to use @basename@ in place of @filename@ -in your templates, to improve the reproducibility of the build. (Since: 2.22) - - - - -Trigraph extensions - -Some C comments are treated specially in the parsed enum definitions, -such comments start out with the trigraph sequence /*< -and end with the trigraph sequence >*/. - - -The following options can be specified per enum definition: - - -skip - -Indicates this enum definition should be skipped. - - - -flags - -Indicates this enum should be treated as a flags definition. - - - -underscore_name - -Specifies the word separation used in the *_get_type() -function. For instance, /*< underscore_name=gnome_vfs_uri_hide_options >*/. - - - -since - -Specifies the version tag that will be used to substitute the @enumsince@ -keyword in the template, useful when documenting methods generated from the enums -(e.g. Since: @enumsince@). (Since: 2.66) - - - - -The following options can be specified per value definition: - - -skip - -Indicates the value should be skipped. - - - -nick - -Specifies the otherwise auto-generated nickname. - - - - -Examples: - -typedef enum /*< skip >*/ -{ - PREFIX_FOO -} PrefixThisEnumWillBeSkipped; -typedef enum /*< flags,prefix=PREFIX,since=1.0 >*/ -{ - PREFIX_THE_ZEROTH_VALUE, /*< skip >*/ - PREFIX_THE_FIRST_VALUE, - PREFIX_THE_SECOND_VALUE, - PREFIX_THE_THIRD_VALUE, /*< nick=the-last-value >*/ -} PrefixTheFlagsEnum; - - - - -Options - - - - TEXT - -Emits TEXT prior to processing input files. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be prepended to the template's file-header section. - - - - - TEXT - -Emits TEXT every time a new input file -is being processed. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be appended to the template's file-production section. - - - - - TEXT - -Emits TEXT after all input files have been -processed. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be appended to the template's file-tail section. - - - - - TEXT - -Emits TEXT every time an enum is encountered -in the input files. - - - - - TEXT - -Emits TEXT before iterating over the set of -values of an enum. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be prepended to the template's value-header section. - - - - - TEXT - -Emits TEXT for every value of an enum. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be appended to the template's value-production section. - - - - - TEXT - -Emits TEXT after iterating over all values -of an enum. - - -You can specify this option multiple times, and the TEXT -will be concatenated. - - -When used along with a template file, TEXT -will be appended to the template's value-tail section. - - - - - TEXT - -Template for auto-generated comments, the default (for C code generations) is -"/* @comment@ */". - - - - - FILE - -Read templates from the given file. The templates are enclosed in -specially-formatted C comments: - - -/*** BEGIN section ***/ -/*** END section ***/ - - -section may be file-header, -file-production, file-tail, -enumeration-production, value-header, -value-production, value-tail or -comment. - - - - - PREFIX - -Indicates what portion of the enum name should be interpreted as the -prefix (eg, the "Gtk" in -"GtkDirectionType"). Normally this will be figured -out automatically, but you may need to override the default if your -namespace is capitalized oddly. - - - - - PREFIX - -Indicates what prefix should be used to correspond to the identifier -prefix in related C function names (eg, the "gtk" -in "gtk_direction_type_get_type". Equivalently, -this is the lowercase version of the prefix component of the enum -value names (eg, the "GTK" in -"GTK_DIR_UP". The default value is the identifier -prefix, converted to lowercase. - - - - - - -Print brief help and exit. - - - - - - -Print version and exit. - - - - - - -Write output to FILE instead of stdout. - - - - - - -When passed as the sole argument, read and parse the actual arguments from -RSPFILE. Useful on systems with a low command-line length -limit. For example, Windows has a limit of 8191 characters. - - - - - - -Using templates - -Instead of passing the various sections of the generated file to the command -line of glib-mkenums, it's strongly recommended to use a -template file, especially for generating C sources. - - - -A C header template file will typically look like this: - - -/*** BEGIN file-header ***/ -#pragma once - -/* Include the main project header */ -#include "project.h" - -G_BEGIN_DECLS -/*** END file-header ***/ - -/*** BEGIN file-production ***/ - -/* enumerations from "@basename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType @enum_name@_get_type (void) G_GNUC_CONST; -#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) -/*** END value-header ***/ - -/*** BEGIN file-tail ***/ -G_END_DECLS -/*** END file-tail ***/ - - - -A C source template file will typically look like this: - - -/*** BEGIN file-header ***/ -#include "config.h" -#include "enum-types.h" - -/*** END file-header ***/ - -/*** BEGIN file-production ***/ -/* enumerations from "@basename@" */ -/*** END file-production ***/ - -/*** BEGIN value-header ***/ -GType -@enum_name@_get_type (void) -{ - static gsize static_g_@type@_type_id; - - if (g_once_init_enter (&static_g_@type@_type_id)) - { - static const G@Type@Value values[] = { -/*** END value-header ***/ - -/*** BEGIN value-production ***/ - { @VALUENAME@, "@VALUENAME@", "@valuenick@" }, -/*** END value-production ***/ - -/*** BEGIN value-tail ***/ - { 0, NULL, NULL } - }; - - GType g_@type@_type_id = - g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - - g_once_init_leave (&static_g_@type@_type_id, g_@type@_type_id); - } - return static_g_@type@_type_id; -} - -/*** END value-tail ***/ - - - -Template files are easier to modify and update, and can be used -to generate various types of outputs using the same command line -or tools during the build. - - - -Using glib-mkenums with Meson - -Meson supports generating enumeration types using glib-mkenums -out of the box in its "gnome" module. - - - -In your meson.build file you will typically call the -gnome.mkenums_simple() method to generate idiomatic enumeration -types from a list of headers to inspect: - - -project_headers = [ - 'project-foo.h', - 'project-bar.h', - 'project-baz.h', -] - -gnome = import('gnome') -enum_files = gnome.mkenums_simple('enum-types', - sources: project_headers, -) - - - -The enum_files variable will contain an array of two elements -in the following order: - - - a build target for the source file - a build target for the header file - - -You should use the returned objects to provide a dependency on every other -build target that references the source or header file; for instance, if you -are using the source to build a library: - - -mainlib = library('project', - sources: project_sources + enum_files, - ... -) - - -Additionally, if you are including the generated header file inside a build -target that depends on the library you just built, you must ensure that the -internal dependency includes the generated header as a required source file: - - -mainlib_dep = declare_dependency(sources: enum_files[1], link_with: mainlib) - - -You should not include the generated source file as well, otherwise it will -be built separately for every target that depends on it, causing build -failures. To know more about why all this is required, please refer to the - -corresponding Meson FAQ entry. - - - -If you are generating C header and source files that require special -templates, you can use gnome.mkenums() to provide those -headers, for instance: - - -enum_files = gnome.mkenums('enum-types', - sources: project_headers, - h_template: 'enum-types.h.in', - c_template: 'enum-types.c.in', - install_header: true, -) - - -For more information, see the Meson -documentation for gnome.mkenums(). - - - -Using glib-mkenums with Autotools - -In order to use glib-mkenums in your project when using -Autotools as the build system, you will first need to modify your -configure.ac file to ensure you find the appropriate -command using pkg-config, similarly as to how you discover -the compiler and linker flags for GLib. - - -PKG_PROG_PKG_CONFIG([0.28]) - -PKG_CHECK_VAR([GLIB_MKENUMS], [glib-2.0], [glib_mkenums]) - - -In your Makefile.am file you will typically use rules -like these: - - -# A list of headers to inspect -project_headers = \ - project-foo.h \ - project-bar.h \ - project-baz.h - -enum-types.h: $(project_headers) enum-types.h.in - $(AM_V_GEN)$(GLIB_MKENUMS) \ - --template=enum-types.h.in \ - --output=$@ \ - $(project_headers) - -enum-types.c: $(project_headers) enum-types.c.in enum-types.h - $(AM_V_GEN)$(GLIB_MKENUMS) \ - --template=enum-types.c.in \ - --output=$@ \ - $(project_headers) - -# Build the enum types files before every other target -BUILT_SOURCES += enum-types.h enum-types.c -CLEANFILES += enum-types.h enum-types.c -EXTRA_DIST += enum-types.h.in enum-types.c.in - - -In the example above, we have a variable called project_headers -where we reference all header files we want to inspect for generating enumeration -GTypes. In the enum-types.h rule we use glib-mkenums -with a template called enum-types.h.in in order to generate the -header file; similarly, in the enum-types.c rule we use a -template called enum-types.c.in. - - - -See also - - -glib-genmarshal -1 - - - - diff --git a/docs/reference/gobject/gobject-docs.xml b/docs/reference/gobject/gobject-docs.xml deleted file mode 100644 index 69147e2..0000000 --- a/docs/reference/gobject/gobject-docs.xml +++ /dev/null @@ -1,236 +0,0 @@ - - - -]> - - - GObject Reference Manual - - for GObject &version; - The latest version of this documentation can be found on-line at - https://developer.gnome.org/gobject/unstable/. - - - - - Introduction - - Most modern programming languages come with their own native object - systems and additional fundamental algorithmic language constructs. - Just as GLib serves as an implementation of such fundamental - types and algorithms (linked lists, hash tables and so forth), the - GLib Object System provides the required implementations of a - flexible, extensible, and intentionally easy to map (into other - languages) object-oriented framework for C. - The substantial elements that are provided can be summarized as: - - - A generic type system to register arbitrary single-inherited - flat and deep derived types as well as interfaces for - structured types. - It takes care of creation, initialization and memory management - of the assorted object and class structures, maintains - parent/child relationships and deals with dynamic implementations - of such types. That is, their type specific implementations are - relocatable/unloadable during runtime. - - - A collection of fundamental type implementations, such as integers, - doubles, enums and structured types, to name a few. - - - A sample fundamental type implementation to base object hierarchies - upon - the GObject fundamental type. - - - A signal system that allows very flexible user customization of - virtual/overridable object methods and can serve as a powerful - notification mechanism. - - - An extensible parameter/value system, supporting all the provided - fundamental types that can be used to generically handle object - properties or otherwise parameterized types. - - - - - - - Concepts - - - - - - - - API Reference - - - - - - - - - - - - - - - - - - - - Tools Reference - - - - - - - - - - - Index - - - - Index of deprecated symbols - - - - Index of new symbols in 2.2 - - - - Index of new symbols in 2.4 - - - - Index of new symbols in 2.6 - - - - Index of new symbols in 2.8 - - - - Index of new symbols in 2.10 - - - - Index of new symbols in 2.12 - - - - Index of new symbols in 2.14 - - - - Index of new symbols in 2.18 - - - - Index of new symbols in 2.22 - - - - Index of new symbols in 2.24 - - - - Index of new symbols in 2.26 - - - - Index of new symbols in 2.28 - - - - Index of new symbols in 2.30 - - - - Index of new symbols in 2.32 - - - - Index of new symbols in 2.34 - - - - Index of new symbols in 2.36 - - - - Index of new symbols in 2.38 - - - - Index of new symbols in 2.40 - - - - Index of new symbols in 2.42 - - - - Index of new symbols in 2.44 - - - - Index of new symbols in 2.46 - - - - Index of new symbols in 2.54 - - - - Index of new symbols in 2.56 - - - - Index of new symbols in 2.62 - - - - Index of new symbols in 2.66 - - - - Index of new symbols in 2.68 - - - - Index of new symbols in 2.70 - - - - Index of new symbols in 2.72 - - - - Index of new symbols in 2.74 - - - - Index of new symbols in 2.76 - - - - Index of new symbols in 2.78 - - - - - - diff --git a/docs/reference/gobject/gobject-overrides.txt b/docs/reference/gobject/gobject-overrides.txt deleted file mode 100644 index e69de29..0000000 diff --git a/docs/reference/gobject/gobject-query.rst b/docs/reference/gobject/gobject-query.rst new file mode 100644 index 0000000..4aa4d0c --- /dev/null +++ b/docs/reference/gobject/gobject-query.rst @@ -0,0 +1,74 @@ +.. _gobject-query(1): +.. meta:: + :copyright: Copyright 2003 Matthias Clasen + :copyright: Copyright 2012 Red Hat, Inc. + :license: LGPL-2.1-or-later +.. + This has to be duplicated from above to make it machine-readable by `reuse`: + SPDX-FileCopyrightText: 2003 Matthias Clasen + SPDX-FileCopyrightText: 2012 Red Hat, Inc. + SPDX-License-Identifier: LGPL-2.1-or-later + +============= +gobject-query +============= + +----------------------- +display a tree of types +----------------------- + +SYNOPSIS +-------- + +| **gobject-query** froots [*OPTION*…] +| **gobject-query** tree [*OPTION*…] + +DESCRIPTION +----------- + +``gobject-query`` is a small utility that draws a tree of types. + +It takes a mandatory argument that specifies whether it should iterate over the +fundamental types or print a type tree. + +COMMANDS +-------- + +``froots`` + + Iterate over fundamental roots. + +``tree`` + + Print type tree. + +OPTIONS +------- + +``-r `` + + Specify the root type. + +``-n`` + + Don’t descend type tree. + +``-b `` + + Specify indent string. + +``-i `` + + Specify incremental indent string. + +``-s `` + + Specify line spacing. + +``-h``, ``--help`` + + Print brief help and exit. + +``-v``, ``--version`` + + Print version and exit. \ No newline at end of file diff --git a/docs/reference/gobject/gobject-query.xml b/docs/reference/gobject/gobject-query.xml deleted file mode 100644 index 437d714..0000000 --- a/docs/reference/gobject/gobject-query.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - - gobject-query - GObject - - - Developer - Tim - Janik - - - - - -gobject-query -1 -User Commands - - - -gobject-query -display a tree of types - - - - -gobject-query -froots -OPTION - - -gobject-query -tree -OPTION - - - -Description - -gobject-query is a small utility that draws a tree of -types. - - - -gobject-query takes a mandatory argument that specifies -whether it should iterate over the fundamental types or print a type tree. - - - -Commands - - - - -iterate over fundamental roots - - - - - -print type tree - - - - - -Options - - - - TYPE - -specify the root type - - - - - - -don't descend type tree - - - - - STRING - -specify indent string - - - - - STRING - -specify incremental indent string - - - - - - NUMBER - -specify line spacing - - - - -, - -Print brief help and exit. - - - - -, - -Print version and exit. - - - - - - diff --git a/docs/reference/gobject/gobject-sections.txt b/docs/reference/gobject/gobject-sections.txt deleted file mode 100644 index 8b0d330..0000000 --- a/docs/reference/gobject/gobject-sections.txt +++ /dev/null @@ -1,1060 +0,0 @@ -glib-object.h - -
-gtype -Type Information -GType -G_TYPE_FUNDAMENTAL -G_TYPE_FUNDAMENTAL_MAX -G_TYPE_MAKE_FUNDAMENTAL -G_TYPE_IS_ABSTRACT -G_TYPE_IS_DERIVED -G_TYPE_IS_FUNDAMENTAL -G_TYPE_IS_VALUE_TYPE -G_TYPE_HAS_VALUE_TABLE -G_TYPE_IS_CLASSED -G_TYPE_IS_INSTANTIATABLE -G_TYPE_IS_DERIVABLE -G_TYPE_IS_DEEP_DERIVABLE -G_TYPE_IS_INTERFACE -G_TYPE_IS_FINAL -G_TYPE_IS_DEPRECATED -GTypeInterface -GTypeInstance -GTypeClass -GTypeInfo -GTypeFundamentalInfo -GInterfaceInfo -GTypeValueInitFunc -GTypeValueFreeFunc -GTypeValueCopyFunc -GTypeValuePeekPointerFunc -GTypeValueCollectFunc -GTypeValueLCopyFunc -GTypeValueTable -G_TYPE_FROM_INSTANCE -G_TYPE_FROM_CLASS -G_TYPE_FROM_INTERFACE -G_TYPE_INSTANCE_GET_CLASS -G_TYPE_INSTANCE_GET_INTERFACE -G_TYPE_INSTANCE_GET_PRIVATE -G_TYPE_CLASS_GET_PRIVATE -G_TYPE_CHECK_INSTANCE -G_TYPE_CHECK_INSTANCE_CAST -G_TYPE_CHECK_INSTANCE_TYPE -G_TYPE_CHECK_INSTANCE_FUNDAMENTAL_TYPE -G_TYPE_CHECK_CLASS_CAST -G_TYPE_CHECK_CLASS_TYPE -G_TYPE_CHECK_VALUE -G_TYPE_CHECK_VALUE_TYPE -G_TYPE_FLAG_RESERVED_ID_BIT -g_type_init -GTypeDebugFlags -g_type_init_with_debug_flags -g_type_name -g_type_qname -g_type_from_name -g_type_parent -g_type_depth -g_type_next_base -g_type_is_a -g_type_class_ref -g_type_class_peek -g_type_class_peek_static -g_type_class_unref -g_type_class_peek_parent -g_type_class_add_private -g_type_add_class_private -g_type_interface_peek -g_type_interface_peek_parent -g_type_default_interface_ref -g_type_default_interface_peek -g_type_default_interface_unref -g_type_children -g_type_interfaces -g_type_interface_prerequisites -g_type_interface_instantiatable_prerequisite -g_type_set_qdata -g_type_get_qdata -g_type_query -GTypeQuery -GBaseInitFunc -GBaseFinalizeFunc -GClassInitFunc -GClassFinalizeFunc -GInstanceInitFunc -GInterfaceInitFunc -GInterfaceFinalizeFunc -GTypeClassCacheFunc -GTypeFlags -GTypeFundamentalFlags -g_type_register_static -g_type_register_static_simple -g_type_register_dynamic -g_type_register_fundamental -g_type_add_interface_static -g_type_add_interface_dynamic -g_type_interface_add_prerequisite -g_type_get_plugin -g_type_interface_get_plugin -g_type_fundamental_next -g_type_fundamental -g_type_create_instance -g_type_free_instance -g_type_add_class_cache_func -g_type_remove_class_cache_func -g_type_class_unref_uncached -g_type_add_interface_check -g_type_remove_interface_check -GTypeInterfaceCheckFunc -g_type_value_table_peek -g_type_ensure -g_type_get_type_registration_serial -g_type_get_instance_count - -G_DECLARE_FINAL_TYPE -G_DECLARE_DERIVABLE_TYPE -G_DECLARE_INTERFACE -G_DEFINE_TYPE -G_DEFINE_TYPE_WITH_PRIVATE -G_DEFINE_TYPE_WITH_CODE -G_DEFINE_ABSTRACT_TYPE -G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE -G_DEFINE_ABSTRACT_TYPE_WITH_CODE -G_DEFINE_FINAL_TYPE -G_DEFINE_FINAL_TYPE_WITH_PRIVATE -G_DEFINE_FINAL_TYPE_WITH_CODE -G_ADD_PRIVATE -G_PRIVATE_OFFSET -G_PRIVATE_FIELD -G_PRIVATE_FIELD_P -G_DEFINE_INTERFACE -G_DEFINE_INTERFACE_WITH_CODE -G_IMPLEMENT_INTERFACE -G_DEFINE_TYPE_EXTENDED -G_DEFINE_BOXED_TYPE -G_DEFINE_BOXED_TYPE_WITH_CODE -G_DEFINE_POINTER_TYPE -G_DEFINE_POINTER_TYPE_WITH_CODE -G_DEFINE_ENUM_VALUE -G_DEFINE_ENUM_TYPE -G_DEFINE_FLAGS_TYPE - - -G_TYPE_FUNDAMENTAL_SHIFT -g_type_check_instance -g_type_check_instance_cast -g_type_check_instance_is_a -g_type_check_instance_is_fundamentally_a -g_type_check_class_cast -g_type_check_class_is_a -g_type_check_is_value_type -g_type_check_value -g_type_check_value_holds -g_type_class_adjust_private_offset -g_type_add_instance_private -g_type_instance_get_private -g_type_class_get_instance_private_offset -g_type_class_get_private -g_type_test_flags -g_type_name_from_instance -g_type_name_from_class - - -G_TYPE_INVALID -G_TYPE_NONE -G_TYPE_INTERFACE -G_TYPE_CHAR -G_TYPE_UCHAR -G_TYPE_BOOLEAN -G_TYPE_INT -G_TYPE_UINT -G_TYPE_LONG -G_TYPE_ULONG -G_TYPE_INT64 -G_TYPE_UINT64 -G_TYPE_ENUM -G_TYPE_FLAGS -G_TYPE_FLOAT -G_TYPE_DOUBLE -G_TYPE_STRING -G_TYPE_POINTER -G_TYPE_BOXED -G_TYPE_PARAM -G_TYPE_OBJECT -G_TYPE_GTYPE -G_TYPE_VARIANT -G_TYPE_CHECKSUM - - -G_TYPE_RESERVED_GLIB_FIRST -G_TYPE_RESERVED_GLIB_LAST -G_TYPE_RESERVED_BSE_FIRST -G_TYPE_RESERVED_BSE_LAST -G_TYPE_RESERVED_USER_FIRST -
- -
-gtypeplugin -GTypePlugin -GTypePlugin -GTypePluginClass -GTypePluginUse -GTypePluginUnuse -GTypePluginCompleteTypeInfo -GTypePluginCompleteInterfaceInfo -g_type_plugin_use -g_type_plugin_unuse -g_type_plugin_complete_type_info -g_type_plugin_complete_interface_info - -G_TYPE_PLUGIN -G_IS_TYPE_PLUGIN -G_TYPE_TYPE_PLUGIN -g_type_plugin_get_type -G_TYPE_PLUGIN_CLASS -G_IS_TYPE_PLUGIN_CLASS -G_TYPE_PLUGIN_GET_CLASS -
- -
-gtypemodule -GTypeModule -GTypeModule -GTypeModuleClass -g_type_module_use -g_type_module_unuse -g_type_module_set_name -g_type_module_register_type -g_type_module_add_interface -g_type_module_register_enum -g_type_module_register_flags - -G_DEFINE_DYNAMIC_TYPE -G_DEFINE_DYNAMIC_TYPE_EXTENDED -G_IMPLEMENT_INTERFACE_DYNAMIC -G_ADD_PRIVATE_DYNAMIC - - -G_TYPE_MODULE -G_IS_TYPE_MODULE -G_TYPE_TYPE_MODULE -g_type_module_get_type -G_TYPE_MODULE_CLASS -G_IS_TYPE_MODULE_CLASS -G_TYPE_MODULE_GET_CLASS -
- -
-The Base Object Type -objects -GObject -GObjectClass -GObjectConstructParam -GObjectGetPropertyFunc -GObjectSetPropertyFunc -GObjectFinalizeFunc -G_TYPE_IS_OBJECT -G_OBJECT -G_IS_OBJECT -G_OBJECT_CLASS -G_IS_OBJECT_CLASS -G_OBJECT_GET_CLASS -G_OBJECT_TYPE -G_OBJECT_TYPE_NAME -G_OBJECT_CLASS_TYPE -G_OBJECT_CLASS_NAME -g_object_class_install_property -g_object_class_install_properties -g_object_class_find_property -g_object_class_list_properties -g_object_class_override_property -g_object_interface_install_property -g_object_interface_find_property -g_object_interface_list_properties -g_object_new -g_object_new_with_properties -g_object_newv -GParameter -g_object_ref -g_object_unref -g_object_ref_sink -g_object_take_ref -g_set_object -g_clear_object -GInitiallyUnowned -GInitiallyUnownedClass -G_TYPE_INITIALLY_UNOWNED -g_object_is_floating -g_object_force_floating -GWeakNotify -g_object_weak_ref -g_object_weak_unref -g_object_add_weak_pointer -g_object_remove_weak_pointer -g_set_weak_pointer -g_clear_weak_pointer -GToggleNotify -g_object_add_toggle_ref -g_object_remove_toggle_ref -g_object_connect -g_object_disconnect -g_object_set -g_object_setv -g_object_get -g_object_getv -g_object_notify -g_object_notify_by_pspec -g_object_freeze_notify -g_object_thaw_notify -g_object_get_data -g_object_set_data -g_object_set_data_full -g_object_steal_data -g_object_dup_data -g_object_replace_data -g_object_get_qdata -g_object_set_qdata -g_object_set_qdata_full -g_object_steal_qdata -g_object_dup_qdata -g_object_replace_qdata -g_object_set_property -g_object_get_property -g_object_new_valist -g_object_set_valist -g_object_get_valist -g_object_watch_closure -g_object_run_dispose -G_OBJECT_WARN_INVALID_PROPERTY_ID - - -GWeakRef -g_weak_ref_init -g_weak_ref_clear -g_weak_ref_get -g_weak_ref_set - - -g_assert_finalize_object - - -G_INITIALLY_UNOWNED -G_INITIALLY_UNOWNED_CLASS -G_INITIALLY_UNOWNED_GET_CLASS -G_IS_INITIALLY_UNOWNED -G_IS_INITIALLY_UNOWNED_CLASS - - -G_OBJECT_WARN_INVALID_PSPEC -g_initially_unowned_get_type -g_object_compat_control -g_object_get_type -
- -
-Enumeration and Flag Types -enumerations_flags -GEnumClass -GFlagsClass -G_ENUM_CLASS_TYPE -G_ENUM_CLASS_TYPE_NAME -G_TYPE_IS_ENUM -G_ENUM_CLASS -G_IS_ENUM_CLASS -G_TYPE_IS_FLAGS -G_FLAGS_CLASS -G_IS_FLAGS_CLASS -G_FLAGS_CLASS_TYPE -G_FLAGS_CLASS_TYPE_NAME -GEnumValue -GFlagsValue -g_enum_get_value -g_enum_get_value_by_name -g_enum_get_value_by_nick -g_enum_to_string -g_flags_get_first_value -g_flags_get_value_by_name -g_flags_get_value_by_nick -g_flags_to_string -g_enum_register_static -g_flags_register_static -g_enum_complete_type_info -g_flags_complete_type_info -
- -
-gboxed -Boxed Types -GBoxedCopyFunc -GBoxedFreeFunc -g_boxed_copy -g_boxed_free -g_boxed_type_register_static -g_pointer_type_register_static - - -G_TYPE_HASH_TABLE -G_TYPE_DATE -G_TYPE_GSTRING -G_TYPE_STRV -G_TYPE_REGEX -G_TYPE_MATCH_INFO -G_TYPE_ARRAY -G_TYPE_BYTE_ARRAY -G_TYPE_PTR_ARRAY -G_TYPE_BYTES -G_TYPE_VARIANT_TYPE -G_TYPE_ERROR -G_TYPE_DATE_TIME -G_TYPE_TIME_ZONE -G_TYPE_IO_CHANNEL -G_TYPE_IO_CONDITION -G_TYPE_VARIANT_BUILDER -G_TYPE_VARIANT_DICT -G_TYPE_KEY_FILE -G_TYPE_MAIN_CONTEXT -G_TYPE_MAIN_LOOP -G_TYPE_MAPPED_FILE -G_TYPE_MARKUP_PARSE_CONTEXT -G_TYPE_SOURCE -G_TYPE_POLLFD -G_TYPE_THREAD -G_TYPE_OPTION_GROUP -G_TYPE_URI -G_TYPE_TREE -G_TYPE_PATTERN_SPEC -G_TYPE_BOOKMARK_FILE - - -G_TYPE_IS_BOXED - - -g_gstring_get_type -g_strv_get_type -g_date_get_type -g_hash_table_get_type -g_regex_get_type -g_match_info_get_type -g_array_get_type -g_byte_array_get_type -g_ptr_array_get_type -g_error_get_type -g_date_time_get_type -g_time_zone_get_type -g_variant_get_gtype -g_variant_type_get_gtype -g_variant_builder_get_type -g_variant_dict_get_type -g_gtype_get_type -g_main_context_get_type -g_main_loop_get_type -g_source_get_type -g_pollfd_get_type -g_bytes_get_type -g_key_file_get_type -g_checksum_get_type -g_mapped_file_get_type -g_markup_parse_context_get_type -g_thread_get_type -g_option_group_get_type -g_uri_get_type -g_tree_get_type -g_pattern_spec_get_type -g_bookmark_file_get_type -
- -
-Generic values -generic_values -G_VALUE_INIT -G_VALUE_HOLDS -G_VALUE_TYPE -G_VALUE_TYPE_NAME -G_TYPE_IS_VALUE -G_TYPE_IS_VALUE_ABSTRACT -G_IS_VALUE -GValue -G_TYPE_VALUE -G_TYPE_VALUE_ARRAY -g_value_init -g_value_copy -g_value_reset -g_value_unset -g_value_init_from_instance -g_value_set_instance -g_value_fits_pointer -g_value_peek_pointer -g_value_type_compatible -g_value_type_transformable -g_value_transform -GValueTransform -g_value_register_transform_func -g_strdup_value_contents - - -G_VALUE_NOCOPY_CONTENTS -g_value_get_type -g_value_array_get_type -
- -
-Value arrays -value_arrays -GValueArray -g_value_array_get_nth -g_value_array_new -g_value_array_copy -g_value_array_free -g_value_array_append -g_value_array_prepend -g_value_array_insert -g_value_array_remove -g_value_array_sort -g_value_array_sort_with_data -
- -
-GParamSpec -gparamspec -G_TYPE_IS_PARAM -G_PARAM_SPEC -G_IS_PARAM_SPEC -G_PARAM_SPEC_CLASS -G_IS_PARAM_SPEC_CLASS -G_PARAM_SPEC_GET_CLASS -G_PARAM_SPEC_TYPE -G_PARAM_SPEC_TYPE_NAME -G_PARAM_SPEC_VALUE_TYPE -GParamSpec -GParamSpecClass -GParamFlags -G_PARAM_STATIC_STRINGS -G_PARAM_MASK -G_PARAM_USER_SHIFT -g_param_spec_ref -g_param_spec_unref -g_param_spec_sink -g_param_spec_ref_sink -g_param_spec_get_default_value -g_param_value_set_default -g_param_value_defaults -g_param_value_validate -g_param_value_is_valid -g_param_value_convert -g_param_values_cmp -g_param_spec_is_valid_name -g_param_spec_get_name -g_param_spec_get_name_quark -g_param_spec_get_nick -g_param_spec_get_blurb -g_param_spec_get_qdata -g_param_spec_set_qdata -g_param_spec_set_qdata_full -g_param_spec_steal_qdata -g_param_spec_get_redirect_target -g_param_spec_internal -GParamSpecTypeInfo -g_param_type_register_static -GParamSpecPool -g_param_spec_pool_new -g_param_spec_pool_insert -g_param_spec_pool_remove -g_param_spec_pool_lookup -g_param_spec_pool_list -g_param_spec_pool_list_owned -
- -
-Standard Parameter and Value Types -param_value_types - - -G_IS_PARAM_SPEC_BOOLEAN -G_PARAM_SPEC_BOOLEAN -G_VALUE_HOLDS_BOOLEAN -G_TYPE_PARAM_BOOLEAN -GParamSpecBoolean -g_param_spec_boolean -g_value_set_boolean -g_value_get_boolean - - -G_IS_PARAM_SPEC_CHAR -G_PARAM_SPEC_CHAR -G_VALUE_HOLDS_CHAR -G_TYPE_PARAM_CHAR -GParamSpecChar -g_param_spec_char -g_value_set_char -g_value_get_char -g_value_get_schar -g_value_set_schar - - -G_IS_PARAM_SPEC_UCHAR -G_PARAM_SPEC_UCHAR -G_VALUE_HOLDS_UCHAR -G_TYPE_PARAM_UCHAR -GParamSpecUChar -g_param_spec_uchar -g_value_set_uchar -g_value_get_uchar - - -G_IS_PARAM_SPEC_INT -G_PARAM_SPEC_INT -G_VALUE_HOLDS_INT -G_TYPE_PARAM_INT -GParamSpecInt -g_param_spec_int -g_value_set_int -g_value_get_int - - -G_IS_PARAM_SPEC_UINT -G_PARAM_SPEC_UINT -G_VALUE_HOLDS_UINT -G_TYPE_PARAM_UINT -GParamSpecUInt -g_param_spec_uint -g_value_set_uint -g_value_get_uint - - -G_IS_PARAM_SPEC_LONG -G_PARAM_SPEC_LONG -G_VALUE_HOLDS_LONG -G_TYPE_PARAM_LONG -GParamSpecLong -g_param_spec_long -g_value_set_long -g_value_get_long - - -G_IS_PARAM_SPEC_ULONG -G_PARAM_SPEC_ULONG -G_VALUE_HOLDS_ULONG -G_TYPE_PARAM_ULONG -GParamSpecULong -g_param_spec_ulong -g_value_set_ulong -g_value_get_ulong - - -G_IS_PARAM_SPEC_INT64 -G_PARAM_SPEC_INT64 -G_VALUE_HOLDS_INT64 -G_TYPE_PARAM_INT64 -GParamSpecInt64 -g_param_spec_int64 -g_value_set_int64 -g_value_get_int64 - - -G_IS_PARAM_SPEC_UINT64 -G_PARAM_SPEC_UINT64 -G_VALUE_HOLDS_UINT64 -G_TYPE_PARAM_UINT64 -GParamSpecUInt64 -g_param_spec_uint64 -g_value_set_uint64 -g_value_get_uint64 - - -G_IS_PARAM_SPEC_FLOAT -G_PARAM_SPEC_FLOAT -G_VALUE_HOLDS_FLOAT -G_TYPE_PARAM_FLOAT -GParamSpecFloat -g_param_spec_float -g_value_set_float -g_value_get_float - - -G_IS_PARAM_SPEC_DOUBLE -G_PARAM_SPEC_DOUBLE -G_VALUE_HOLDS_DOUBLE -G_TYPE_PARAM_DOUBLE -GParamSpecDouble -g_param_spec_double -g_value_set_double -g_value_get_double - - -G_IS_PARAM_SPEC_ENUM -G_PARAM_SPEC_ENUM -G_VALUE_HOLDS_ENUM -G_TYPE_PARAM_ENUM -GParamSpecEnum -g_param_spec_enum -g_value_set_enum -g_value_get_enum - - -G_IS_PARAM_SPEC_FLAGS -G_PARAM_SPEC_FLAGS -G_VALUE_HOLDS_FLAGS -G_TYPE_PARAM_FLAGS -GParamSpecFlags -g_param_spec_flags -g_value_set_flags -g_value_get_flags - - -G_IS_PARAM_SPEC_STRING -G_PARAM_SPEC_STRING -G_VALUE_HOLDS_STRING -G_TYPE_PARAM_STRING -G_VALUE_IS_INTERNED_STRING -G_VALUE_INTERNED_STRING -GParamSpecString -gchararray -g_param_spec_string -g_value_set_string -g_value_set_static_string -g_value_take_string -g_value_set_string_take_ownership -g_value_get_string -g_value_dup_string -g_value_set_interned_string - - -G_IS_PARAM_SPEC_PARAM -G_PARAM_SPEC_PARAM -G_VALUE_HOLDS_PARAM -G_TYPE_PARAM_PARAM -GParamSpecParam -g_param_spec_param -g_value_set_param -g_value_take_param -g_value_set_param_take_ownership -g_value_get_param -g_value_dup_param - - -G_IS_PARAM_SPEC_BOXED -G_PARAM_SPEC_BOXED -G_VALUE_HOLDS_BOXED -G_TYPE_PARAM_BOXED -GParamSpecBoxed -g_param_spec_boxed -g_value_set_boxed -g_value_set_static_boxed -g_value_take_boxed -g_value_set_boxed_take_ownership -g_value_get_boxed -g_value_dup_boxed - - -G_IS_PARAM_SPEC_POINTER -G_PARAM_SPEC_POINTER -G_VALUE_HOLDS_POINTER -G_TYPE_PARAM_POINTER -GParamSpecPointer -g_param_spec_pointer -g_value_set_pointer -g_value_get_pointer - - -G_IS_PARAM_SPEC_OBJECT -G_PARAM_SPEC_OBJECT -G_VALUE_HOLDS_OBJECT -G_TYPE_PARAM_OBJECT -GParamSpecObject -g_param_spec_object -g_value_set_object -g_value_take_object -g_value_set_object_take_ownership -g_value_get_object -g_value_dup_object - - -G_IS_PARAM_SPEC_UNICHAR -G_PARAM_SPEC_UNICHAR -G_TYPE_PARAM_UNICHAR -GParamSpecUnichar -g_param_spec_unichar - - -G_IS_PARAM_SPEC_VALUE_ARRAY -G_PARAM_SPEC_VALUE_ARRAY -G_TYPE_PARAM_VALUE_ARRAY -GParamSpecValueArray -g_param_spec_value_array - - -G_IS_PARAM_SPEC_OVERRIDE -G_PARAM_SPEC_OVERRIDE -G_TYPE_PARAM_OVERRIDE -GParamSpecOverride -g_param_spec_override - - -G_IS_PARAM_SPEC_GTYPE -G_PARAM_SPEC_GTYPE -G_VALUE_HOLDS_GTYPE -G_TYPE_PARAM_GTYPE -GParamSpecGType -g_param_spec_gtype -g_value_get_gtype -g_value_set_gtype - - -G_IS_PARAM_SPEC_VARIANT -G_PARAM_SPEC_VARIANT -G_VALUE_HOLDS_VARIANT -G_TYPE_PARAM_VARIANT -GParamSpecVariant -g_param_spec_variant -g_value_get_variant -g_value_dup_variant -g_value_set_variant -g_value_take_variant - - -g_value_set_instance -g_param_spec_types -
- -
-Varargs Value Collection -value_collection -glib-object.h,gobject/gvaluecollector.h -GTypeCValue -G_VALUE_COLLECT_INIT -G_VALUE_COLLECT_INIT2 -G_VALUE_COLLECT -G_VALUE_COLLECT_SKIP -G_VALUE_LCOPY -G_VALUE_COLLECT_FORMAT_MAX_LENGTH -
- -
-Signals -signals -GSignalInvocationHint -GSignalAccumulator -GSignalCMarshaller -GSignalCVaMarshaller -GSignalEmissionHook -GSignalFlags -GSignalMatchType -GSignalQuery -G_SIGNAL_TYPE_STATIC_SCOPE -G_SIGNAL_MATCH_MASK -G_SIGNAL_FLAGS_MASK -g_signal_new -g_signal_newv -g_signal_new_valist -g_signal_set_va_marshaller -g_signal_query -g_signal_lookup -g_signal_name -g_signal_list_ids -g_signal_emit -g_signal_emit_by_name -g_signal_emitv -g_signal_emit_valist -g_signal_connect -g_signal_connect_after -g_signal_connect_swapped -g_signal_connect_object -GConnectFlags -g_signal_connect_data -g_signal_connect_closure -g_signal_connect_closure_by_id -g_signal_handler_block -g_signal_handler_unblock -g_signal_handler_disconnect -g_signal_handler_find -g_signal_handlers_block_matched -g_signal_handlers_unblock_matched -g_signal_handlers_disconnect_matched -g_signal_handler_is_connected -g_signal_handlers_block_by_func -g_signal_handlers_unblock_by_func -g_signal_handlers_disconnect_by_func -g_signal_handlers_disconnect_by_data -g_signal_has_handler_pending -g_signal_stop_emission -g_signal_stop_emission_by_name -g_signal_override_class_closure -g_signal_chain_from_overridden -g_signal_new_class_handler -g_signal_override_class_handler -g_signal_chain_from_overridden_handler -g_signal_add_emission_hook -g_signal_remove_emission_hook -g_signal_is_valid_name -g_signal_parse_name -g_signal_get_invocation_hint -g_signal_type_cclosure_new -g_signal_accumulator_first_wins -g_signal_accumulator_true_handled -g_clear_signal_handler - -g_signal_handlers_destroy -
- -
-gclosure -Closures -G_CLOSURE_NEEDS_MARSHAL -G_CLOSURE_N_NOTIFIERS -G_CCLOSURE_SWAP_DATA -G_CALLBACK -GCallback -GClosure -G_TYPE_CLOSURE -GCClosure -GClosureMarshal -GVaClosureMarshal -GClosureNotify -g_cclosure_new -g_cclosure_new_swap -g_cclosure_new_object -g_cclosure_new_object_swap -g_cclosure_marshal_generic -g_closure_new_object -g_closure_ref -g_closure_sink -g_closure_unref -g_closure_invoke -g_closure_invalidate -g_closure_add_finalize_notifier -g_closure_add_invalidate_notifier -g_closure_remove_finalize_notifier -g_closure_remove_invalidate_notifier -g_closure_new_simple -g_closure_set_marshal -g_closure_add_marshal_guards -g_closure_set_meta_marshal -g_source_set_closure -g_source_set_dummy_callback - - -g_cclosure_marshal_VOID__VOID -g_cclosure_marshal_VOID__BOOLEAN -g_cclosure_marshal_VOID__CHAR -g_cclosure_marshal_VOID__UCHAR -g_cclosure_marshal_VOID__INT -g_cclosure_marshal_VOID__UINT -g_cclosure_marshal_VOID__LONG -g_cclosure_marshal_VOID__ULONG -g_cclosure_marshal_VOID__ENUM -g_cclosure_marshal_VOID__FLAGS -g_cclosure_marshal_VOID__FLOAT -g_cclosure_marshal_VOID__DOUBLE -g_cclosure_marshal_VOID__STRING -g_cclosure_marshal_VOID__PARAM -g_cclosure_marshal_VOID__BOXED -g_cclosure_marshal_VOID__POINTER -g_cclosure_marshal_VOID__OBJECT -g_cclosure_marshal_VOID__VARIANT -g_cclosure_marshal_STRING__OBJECT_POINTER -g_cclosure_marshal_VOID__UINT_POINTER -g_cclosure_marshal_BOOLEAN__FLAGS -g_cclosure_marshal_BOOL__FLAGS -g_cclosure_marshal_BOOLEAN__BOXED_BOXED -g_cclosure_marshal_BOOL__BOXED_BOXED - - -g_cclosure_marshal_generic_va -g_cclosure_marshal_VOID__VOIDv -g_cclosure_marshal_VOID__BOOLEANv -g_cclosure_marshal_VOID__CHARv -g_cclosure_marshal_VOID__UCHARv -g_cclosure_marshal_VOID__INTv -g_cclosure_marshal_VOID__UINTv -g_cclosure_marshal_VOID__LONGv -g_cclosure_marshal_VOID__ULONGv -g_cclosure_marshal_VOID__ENUMv -g_cclosure_marshal_VOID__FLAGSv -g_cclosure_marshal_VOID__FLOATv -g_cclosure_marshal_VOID__DOUBLEv -g_cclosure_marshal_VOID__STRINGv -g_cclosure_marshal_VOID__PARAMv -g_cclosure_marshal_VOID__BOXEDv -g_cclosure_marshal_VOID__POINTERv -g_cclosure_marshal_VOID__OBJECTv -g_cclosure_marshal_VOID__VARIANTv -g_cclosure_marshal_STRING__OBJECT_POINTERv -g_cclosure_marshal_VOID__UINT_POINTERv -g_cclosure_marshal_BOOLEAN__FLAGSv -g_cclosure_marshal_BOOLEAN__BOXED_BOXEDv - - -GClosureNotifyData -g_closure_get_type -g_io_channel_get_type -g_io_condition_get_type -
- -
-gbinding -GBinding -GBindingFlags -g_binding_get_source -g_binding_dup_source -g_binding_get_source_property -g_binding_get_target -g_binding_dup_target -g_binding_get_target_property -g_binding_get_flags -g_binding_unbind - -g_object_bind_property -GBindingTransformFunc -g_object_bind_property_full -g_object_bind_property_with_closures - -G_TYPE_BINDING -G_TYPE_BINDING_FLAGS -G_BINDING -G_IS_BINDING - -g_binding_flags_get_type -g_binding_get_type -
- -
-gbindinggroup -GBindingGroup -g_binding_group_new -g_binding_group_dup_source -g_binding_group_set_source -g_binding_group_bind -g_binding_group_bind_full -g_binding_group_bind_with_closures - -G_TYPE_BINDING_GROUP -G_TYPE_BINDING_GROUP_CLASS -G_BINDING_GROUP -G_IS_BINDING_GROUP - -g_binding_group_get_type -
- -
-gsignalgroup -GSignalGroup -g_signal_group_block -g_signal_group_connect -g_signal_group_connect_after -g_signal_group_connect_data -g_signal_group_connect_object -g_signal_group_connect_swapped -g_signal_group_connect_closure -g_signal_group_dup_target -g_signal_group_get_type -g_signal_group_new -g_signal_group_set_target -g_signal_group_unblock - -G_IS_SIGNAL_GROUP -G_SIGNAL_GROUP -G_TYPE_SIGNAL_GROUP - -g_signal_group_get_type -
diff --git a/docs/reference/gobject/gobject.toml.in b/docs/reference/gobject/gobject.toml.in new file mode 100644 index 0000000..8c26672 --- /dev/null +++ b/docs/reference/gobject/gobject.toml.in @@ -0,0 +1,64 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# Copyright 2023 Matthias Clasen +# Copyright 2023 Philip Withnall + +[library] +name = "GObject" +version = "@VERSION@" +browse_url = "https://gitlab.gnome.org/GNOME/glib/" +repository_url = "https://gitlab.gnome.org/GNOME/glib.git" +website_url = "https://www.gtk.org" +docs_url = "https://docs.gtk.org/gobject/" +authors = "GLib Development Team" +license = "LGPL-2.1-or-later" +description = "The base type system and object class" +devhelp = true +search_index = true +dependencies = ["GLib-2.0"] + + [dependencies."GLib-2.0"] + name = "GLib" + description = "The base utility library" + docs_url = "https://docs.gtk.org/glib/" + +related = ["GModule-2.0", "Gio-2.0"] + + [related."GModule-2.0"] + name = "GModule" + description = "Portable API for dynamically loading modules" + docs_url = "https://docs.gtk.org/gmodule/" + + [related."Gio-2.0"] + name = "GIO" + description = "GObject Interfaces and Objects, Networking, IPC, and I/O" + docs_url = "https://docs.gtk.org/gio/" + +[theme] +name = "basic" +show_index_summary = true +show_class_hierarchy = true + +[extra] +urlmap_file = "../urlmap.js" +# The same order will be used when generating the index +content_files = [ + "concepts.md", + "tutorial.md", + "types.md", + "signals.md", + "floating-refs.md", + "boxed.md", + "enum-types.md", + "gvalue.md", + "value-collection.md", +] +content_images = [ + "images/glue.png", +] + +# This is the anonymous union inside GValue; we don't need it +# as a type, and including it just generates a dummy union +# definition +[[object]] +name = "_Value__data__union" +hidden = true diff --git a/docs/reference/gobject/gvalue.md b/docs/reference/gobject/gvalue.md new file mode 100644 index 0000000..e2af92b --- /dev/null +++ b/docs/reference/gobject/gvalue.md @@ -0,0 +1,108 @@ +Title: Generic Value Container + +# Generic Value Container + +The [`struct@GObject.Value`] structure is basically a variable container +that consists of a type identifier and a specific value of that type. The +type identifier within a `GValue` structure always determines the type of the +associated value. + +To create an undefined `GValue` structure, simply create a zero-filled +GValue structure. To initialize the `GValue`, use the +[`method@GObject.Value.init`] function. A `GValue` cannot be used until it +is initialized. + +Once you have finished using a `GValue`, you must call +[`method@GObject.Value.unset`] to ensure that all the resources associated +with the `GValue` are freed. + +The basic type operations (such as freeing and copying) are determined by +the [`struct@GObject.TypeValueTable`] associated with the type ID stored in +the `GValue`. Other `GValue` operations (such as converting values between +types) are provided by this interface. + +The code in the example program below demonstrates `GValue`'s features: + +```c +#include + +static void +int2string (const GValue *src_value, + GValue *dest_value) +{ + if (g_value_get_int (src_value) == 42) + g_value_set_static_string (dest_value, "An important number"); + else + g_value_set_static_string (dest_value, "What's that?"); +} + +int +main (int argc, + char *argv[]) +{ + // GValues must be initialized + GValue a = G_VALUE_INIT; + GValue b = G_VALUE_INIT; + const char *message; + + // The GValue starts empty + g_assert (!G_VALUE_HOLDS_STRING (&a)); + + // Put a string in it + g_value_init (&a, G_TYPE_STRING); + g_assert (G_VALUE_HOLDS_STRING (&a)); + g_value_set_static_string (&a, "Hello, world!"); + g_printf ("%s\n", g_value_get_string (&a)); + + // Reset it to its pristine state + g_value_unset (&a); + + // It can then be reused for another type + g_value_init (&a, G_TYPE_INT); + g_value_set_int (&a, 42); + + // Attempt to transform it into a GValue of type STRING + g_value_init (&b, G_TYPE_STRING); + + // An INT is transformable to a STRING + g_assert (g_value_type_transformable (G_TYPE_INT, G_TYPE_STRING)); + + g_value_transform (&a, &b); + g_printf ("%s\n", g_value_get_string (&b)); + + // Attempt to transform it again using a custom transform function + g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, int2string); + g_value_transform (&a, &b); + g_printf ("%s\n", g_value_get_string (&b)); + + g_value_unset (&b); + g_value_unset (&a); + + return 0; +} +``` + +For letting a `GValue` own (and memory manage) arbitrary types or pointers, +they need to become a [boxed type](boxed.html). The example below shows how +the pointer `mystruct` of type `MyStruct` is used as a [boxed type](boxed.html). + +```c +typedef struct { ... } MyStruct; +G_DEFINE_BOXED_TYPE (MyStruct, my_struct, my_struct_copy, my_struct_free) + +// These two lines normally go in a public header. By GObject convention, +// the naming scheme is NAMESPACE_TYPE_NAME: +#define MY_TYPE_STRUCT (my_struct_get_type ()) +GType my_struct_get_type (void); + +void +foo (void) +{ + GValue *value = g_new0 (GValue, 1); + g_value_init (value, MY_TYPE_STRUCT); + g_value_set_boxed (value, mystruct); + // [... your code ....] + g_value_unset (value); + g_free (value); +} +``` diff --git a/docs/reference/gobject/meson.build b/docs/reference/gobject/meson.build index dd3e53d..221c54a 100644 --- a/docs/reference/gobject/meson.build +++ b/docs/reference/gobject/meson.build @@ -1,70 +1,53 @@ -if get_option('gtk_doc') - subdir('xml') - - ignore_headers = [ - 'tests', - 'gatomicarray.h', - 'gobject_probes.h', - 'gobject_trace.h', - 'gtype-private.h', - 'glib-enumtypes.h', - 'gobject-visibility.h', - ] - - docpath = join_paths(glib_datadir, 'gtk-doc', 'html') - version_conf = configuration_data() - version_conf.set('GLIB_VERSION', meson.project_version()) - configure_file( - input: 'version.xml.in', - output: 'version.xml', - configuration: version_conf - ) - - gtkdocincl = include_directories('.') - - gnome.gtkdoc('gobject', - main_xml : 'gobject-docs.xml', - namespace : 'g', - mode : 'none', - dependencies : [libgobject_dep, libglib_dep], - include_directories : [gtkdocincl], - src_dir : 'gobject', - scan_args : [ - '--ignore-decorators=' + '|'.join(ignore_decorators.replace('GLIB', 'GOBJECT')), - '--rebuild-types', - '--ignore-headers=' + ' '.join(ignore_headers), - ], - content_files : [ - 'glib-mkenums.xml', - 'glib-genmarshal.xml', - 'gobject-query.xml', - 'tut_gobject.xml', - 'tut_gsignal.xml', - 'tut_gtype.xml', - 'tut_howto.xml', - 'tut_intro.xml', - 'tut_tools.xml' - ], - html_assets : [ - 'images/glue.png' - ], - fixxref_args: [ - '--html-dir=' + docpath, - '--extra-dir=' + join_paths('gobject', '..', 'glib', 'html'), - ], - install: true, - check: true, - ) -endif - -if get_option('man') +if get_option('man-pages').enabled() manpages = ['glib-mkenums', 'glib-genmarshal', 'gobject-query'] foreach page : manpages custom_target(page + '-man', - input: page + '.xml', + input: page + '.rst', output: page + '.1', - command: xsltproc_command, + command: [ + rst2man, + rst2man_flags, + '@INPUT@', + ], + capture: true, install: true, - install_dir: man1_dir) + install_dir: man1_dir, + install_tag: 'doc', + ) endforeach endif + +if get_option('documentation') and enable_gir + expand_content_files = [ + 'boxed.md', + 'concepts.md', + 'enum-types.md', + 'floating-refs.md', + 'gvalue.md', + 'tutorial.md', + 'types.md', + 'signals.md', + 'value-collection.md', + ] + + gobject_toml = configure_file(input: 'gobject.toml.in', output: 'gobject.toml', configuration: toml_conf) + + custom_target('gobject-docs', + input: [ gobject_toml, gobject_gir[0] ], + output: 'gobject', + command: [ + gidocgen, + 'generate', + gidocgen_common_args, + '--config=@INPUT0@', + '--output-dir=@OUTPUT@', + '--content-dir=@0@'.format(meson.current_source_dir()), + '@INPUT1@', + ], + build_by_default: true, + depend_files: expand_content_files, + install: true, + install_dir: docs_dir, + install_tag: 'doc', + ) +endif diff --git a/docs/reference/gobject/signals.md b/docs/reference/gobject/signals.md new file mode 100644 index 0000000..ab7444b --- /dev/null +++ b/docs/reference/gobject/signals.md @@ -0,0 +1,114 @@ +Title: Signals +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2000, 2001 Tim Janik +SPDX-FileCopyrightText: 2000 Owen Taylor +SPDX-FileCopyrightText: 2002, 2014 Matthias Clasen +SPDX-FileCopyrightText: 2014 Collabora, Ltd. +SPDX-FileCopyrightText: 2019 Endless Mobile, Inc. + +# Signals + +The basic concept of the signal system is that of the emission +of a signal. Signals are introduced per-type and are identified +through strings. Signals introduced for a parent type are available +in derived types as well, so basically they are a per-type facility +that is inherited. + +## Handlers + +A signal emission mainly involves invocation of a certain set of +callbacks in precisely defined manner. There are two main categories +of such callbacks, per-object ones and user provided ones. +(Although signals can deal with any kind of instantiatable type, those types are +referred to as ‘object types’ in the following, simply +because that is the context most users will encounter signals in.) +The per-object callbacks are most often referred to as "object method +handler" or "default (signal) handler", while user provided callbacks are +usually just called "signal handler". + +The object method handler is provided at signal creation time (this most +frequently happens at the end of an object class' creation), while user +provided handlers are frequently connected and disconnected to/from a +certain signal on certain object instances. + +A handler must match the type defined by the signal in both its arguments and +return value (which is often `void`). All handlers take a pointer to the type +instance as their first argument, and a `gpointer user_data` as their final +argument, with signal-defined arguments in-between. The `user_data` is always +filled with the user data provided when the handler was connected to the signal. +Handlers are documented as having type [type@GObject.Callback], but this is +simply a generic placeholder type — an artifact of the GSignal APIs being +polymorphic. + +When a signal handler is connected, its first (‘instance’) and final (‘user +data’) arguments may be swapped if [func@GObject.signal_connect_swapped] is used +rather than [func@GObject.signal_connect]. This can sometimes be convenient for +avoiding defining wrapper functions as signal handlers, instead just directly +passing a function which takes the user data as its first argument. + +## Emissions + +A signal emission consists of five stages, unless prematurely stopped: + +1. Invocation of the object method handler for `G_SIGNAL_RUN_FIRST` signals + +2. Invocation of normal user-provided signal handlers (where the `after` + flag is not set) + +3. Invocation of the object method handler for `G_SIGNAL_RUN_LAST` signals + +4. Invocation of user provided signal handlers (where the `after` flag is set) + +5. Invocation of the object method handler for `G_SIGNAL_RUN_CLEANUP` signals + +The user-provided signal handlers are called in the order they were +connected in. + +All handlers may prematurely stop a signal emission, and any number of +handlers may be connected, disconnected, blocked or unblocked during +a signal emission. + +There are certain criteria for skipping user handlers in stages 2 and 4 +of a signal emission. + +First, user handlers may be blocked. Blocked handlers are omitted during +callback invocation, to return from the blocked state, a handler has to +get unblocked exactly the same amount of times it has been blocked before. + +Second, upon emission of a `G_SIGNAL_DETAILED` signal, an additional +`detail` argument passed in to [func@GObject.signal_emit] has to match +the detail argument of the signal handler currently subject to invocation. +Specification of no detail argument for signal handlers (omission of the +detail part of the signal specification upon connection) serves as a +wildcard and matches any detail argument passed in to emission. + +While the `detail` argument is typically used to pass an object property name +(as with [signal@GObject.Object::notify]), no specific format is mandated for the detail +string, other than that it must be non-empty. + +## Memory management of signal handlers + +If you are connecting handlers to signals and using a `GObject` instance as +your signal handler user data, you should remember to pair calls to +[func@GObject.signal_connect] with calls to [func@GObject.signal_handler_disconnect] +or [func@GObject.signal_handlers_disconnect_by_func]. While signal handlers are +automatically disconnected when the object emitting the signal is finalised, +they are not automatically disconnected when the signal handler user data is +destroyed. If this user data is a `GObject` instance, using it from a +signal handler after it has been finalised is an error. + +There are two strategies for managing such user data. The first is to +disconnect the signal handler (using [func@GObject.signal_handler_disconnect] +or [func@GObject.signal_handlers_disconnect_by_func]) when the user data (object) +is finalised; this has to be implemented manually. For non-threaded programs, +[func@GObject.signal_connect_object] can be used to implement this automatically. +Currently, however, it is unsafe to use in threaded programs. + +The second is to hold a strong reference on the user data until after the +signal is disconnected for other reasons. This can be implemented +automatically using [func@GObject.signal_connect_data]. + +The first approach is recommended, as the second approach can result in +effective memory leaks of the user data if the signal handler is never +disconnected for some reason. + diff --git a/docs/reference/gobject/tut_gobject.xml b/docs/reference/gobject/tut_gobject.xml deleted file mode 100644 index 53f38ab..0000000 --- a/docs/reference/gobject/tut_gobject.xml +++ /dev/null @@ -1,728 +0,0 @@ - - - - The GObject base class - - - The previous chapter discussed the details of GLib's Dynamic Type System. - The GObject library also contains an implementation for a base fundamental - type named GObject. - - - - GObject is a fundamental classed instantiatable type. It implements: - - Memory management with reference counting - Construction/Destruction of instances - Generic per-object properties with set/get function pairs - Easy use of signals - - All the GNOME libraries which use the GLib type system (like GTK and GStreamer) - inherit from GObject which is why it is important to understand - the details of how it works. - - - - Object instantiation - - - The g_object_new - family of functions can be used to instantiate any GType which inherits - from the GObject base type. All these functions make sure the class and - instance structures have been correctly initialized by GLib's type system - and then invoke at one point or another the constructor class method - which is used to: - - - Allocate and clear memory through g_type_create_instance, - - - Initialize the object's instance with the construction properties. - - - Although one can expect all class and instance members (except the fields - pointing to the parents) to be set to zero, some consider it good practice - to explicitly set them. - - - - Once all construction operations have been completed and constructor - properties set, the constructed class method is called. - - - - Objects which inherit from GObject are allowed to override this - constructed class method. - The example below shows how ViewerFile overrides the parent's construction process: - -#define VIEWER_TYPE_FILE viewer_file_get_type () -G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) - -struct _ViewerFile -{ - GObject parent_instance; - - /* instance members */ - gchar *filename; - guint zoom_level; -}; - -/* will create viewer_file_get_type and set viewer_file_parent_class */ -G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) - -static void -viewer_file_constructed (GObject *obj) -{ - /* update the object state depending on constructor properties */ - - /* Always chain up to the parent constructed function to complete object - * initialisation. */ - G_OBJECT_CLASS (viewer_file_parent_class)->constructed (obj); -} - -static void -viewer_file_finalize (GObject *obj) -{ - ViewerFile *self = VIEWER_FILE (obj); - - g_free (self->filename); - - /* Always chain up to the parent finalize function to complete object - * destruction. */ - G_OBJECT_CLASS (viewer_file_parent_class)->finalize (obj); -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->constructed = viewer_file_constructed; - object_class->finalize = viewer_file_finalize; -} - -static void -viewer_file_init (ViewerFile *self) -{ - /* initialize the object */ -} - - - If the user instantiates an object ViewerFile with: - -ViewerFile *file = g_object_new (VIEWER_TYPE_FILE, NULL); - - If this is the first instantiation of such an object, the - viewer_file_class_init function will be invoked - after any viewer_file_base_class_init function. - This will make sure the class structure of this new object is - correctly initialized. Here, viewer_file_class_init - is expected to override the object's class methods and setup the - class' own methods. In the example above, the constructed - method is the only overridden method: it is set to - viewer_file_constructed. - - - - Once g_object_new has obtained a reference to an initialized - class structure, it invokes its constructor method to create an instance of the new - object, if the constructor has been overridden in viewer_file_class_init. - Overridden constructors must chain up to their parent’s constructor. In - order to find the parent class and chain up to the parent class - constructor, we can use the viewer_file_parent_class - pointer that has been set up for us by the - G_DEFINE_TYPE - macro. - - - - Finally, at one point or another, g_object_constructor is invoked - by the last constructor in the chain. This function allocates the object's instance buffer - through g_type_create_instance - which means that the instance_init function is invoked at this point if one - was registered. After instance_init returns, the object is fully initialized and should be - ready to have its methods called by the user. When - g_type_create_instance - returns, g_object_constructor sets the construction properties - (i.e. the properties which were given to g_object_new) and returns - to the user's constructor. - - - - The process described above might seem a bit complicated, but it can be - summarized easily by the table below which lists the functions invoked - by g_object_new - and their order of invocation: - - - - - <function><link linkend="g-object-new">g_object_new</link></function> - - - - - - - - Invocation time - Function invoked - Function's parameters - Remark - - - - - First call to g_object_new for target type - target type's base_init function - On the inheritance tree of classes from fundamental type to target type. - base_init is invoked once for each class structure. - Never used in practice. Unlikely you will need it. - - - - target type's class_init function - On target type's class structure - - Here, you should make sure to initialize or override class methods (that is, - assign to each class' method its function pointer) and create the signals and - the properties associated to your object. - - - - - interface's base_init function - On interface's vtable - - - - - interface's interface_init function - On interface's vtable - - - - Each call to g_object_new for target type - target type's class constructor method: GObjectClass->constructor - On object's instance - - If you need to handle construct properties in a custom way, or implement a singleton class, override the constructor - method and make sure to chain up to the object's - parent class before doing your own initialization. - In doubt, do not override the constructor method. - - - - - type's instance_init function - On the inheritance tree of classes from fundamental type to target type. - the instance_init provided for each type is invoked once for each instance - structure. - - Provide an instance_init function to initialize your object before its construction - properties are set. This is the preferred way to initialize a GObject instance. - This function is equivalent to C++ constructors. - - - - - target type's class constructed method: GObjectClass->constructed - On object's instance - - If you need to perform object initialization steps after all construct properties have been set. - This is the final step in the object initialization process, and is only called if the constructor - method returned a new object instance (rather than, for example, an existing singleton). - - - - -
-
- - - Readers should feel concerned about one little twist in the order in - which functions are invoked: while, technically, the class' constructor - method is called before the GType's instance_init - function (since g_type_create_instance which calls instance_init is called by - g_object_constructor which is the top-level class - constructor method and to which users are expected to chain to), the - user's code which runs in a user-provided constructor will always - run after GType's instance_init function since the - user-provided constructor must (you've been warned) - chain up before doing anything useful. - -
- - - Object memory management - - - The memory-management API for GObjects is a bit complicated but the idea behind it - is pretty simple: the goal is to provide a flexible model based on reference counting - which can be integrated in applications which use or require different memory management - models (such as garbage collection). The methods which are used to - manipulate this reference count are described below. - - - - Reference count - - - The functions g_object_ref/g_object_unref respectively - increase and decrease the reference count. These functions are - thread-safe. - g_clear_object - is a convenience wrapper around g_object_unref - which also clears the pointer passed to it. - - - The reference count is initialized to one by - g_object_new which means that the caller - is currently the sole owner of the newly-created reference. (If the object is derived from GInitiallyUnowned, this reference count is floating.) - When the reference count reaches zero, that is, - when g_object_unref is called by the last client holding - a reference to the object, the dispose and the - finalize class methods are invoked. - - - Finally, after finalize is invoked, - g_type_free_instance is called to free the object instance. - Depending on the memory allocation policy decided when the type was registered (through - one of the g_type_register_* functions), the object's instance - memory will be freed or returned to the object pool for this type. - Once the object has been freed, if it was the last instance of the type, the type's class - will be destroyed as described in and - . - - - - The table below summarizes the destruction process of a GObject: - - <function><link linkend="g-object-unref">g_object_unref</link></function> - - - - - - - - Invocation time - Function invoked - Function's parameters - Remark - - - - - Last call to g_object_unref for an instance - of target type - - target type's dispose class function - GObject instance - - When dispose ends, the object should not hold any reference to any other - member object. The object is also expected to be able to answer client - method invocations (with possibly an error code but no memory violation) - until finalize is executed. dispose can be executed more than once. - dispose should chain up to its parent implementation just before returning - to the caller. - - - - - target type's finalize class function - GObject instance - - Finalize is expected to complete the destruction process initiated by - dispose. It should complete the object's destruction. finalize will be - executed only once. - finalize should chain up to its parent implementation just before returning - to the caller. - The reason why the destruction process is split is two different phases is - explained in . - - - - Last call to g_object_unref for the last - instance of target type - - interface's interface_finalize function - On interface's vtable - Never used in practice. Unlikely you will need it. - - - - interface's base_finalize function - On interface's vtable - Never used in practice. Unlikely you will need it. - - - - target type's class_finalize function - On target type's class structure - Never used in practice. Unlikely you will need it. - - - - type's base_finalize function - On the inheritance tree of classes from fundamental type to target type. - base_init is invoked once for each class structure. - Never used in practice. Unlikely you will need it. - - - -
-
- -
- - - Weak References - - - Weak references are used to monitor object finalization: - g_object_weak_ref adds a monitoring callback which does - not hold a reference to the object but which is invoked when the object runs - its dispose method. As such, each weak ref can be invoked more than once upon - object finalization (since dispose can run more than once during object - finalization). - - - - g_object_weak_unref can be used to remove a monitoring - callback from the object. - - - - Weak references are also used to implement g_object_add_weak_pointer - and g_object_remove_weak_pointer. These functions add a weak reference - to the object they are applied to which makes sure to nullify the pointer given by the user - when object is finalized. - - - - Similarly, GWeakRef can be - used to implement weak references if thread safety is required. - - - - - Reference counts and cycles - - - GObject's memory management model was designed to be easily integrated in existing code - using garbage collection. This is why the destruction process is split in two phases: - the first phase, executed in the dispose handler is supposed to release all references - to other member objects. The second phase, executed by the finalize handler is supposed - to complete the object's destruction process. Object methods should be able to run - without program error in-between the two phases. - - - - This two-step destruction process is very useful to break reference counting cycles. - While the detection of the cycles is up to the external code, once the cycles have been - detected, the external code can invoke g_object_run_dispose which - will indeed break any existing cycles since it will run the dispose handler associated - to the object and thus release all references to other objects. - - - - This explains one of the rules about the dispose handler stated earlier: - the dispose handler can be invoked multiple times. Let's say we - have a reference count cycle: object A references B which itself references object A. - Let's say we have detected the cycle and we want to destroy the two objects. One way to - do this would be to invoke g_object_run_dispose on one of the - objects. - - - - If object A releases all its references to all objects, this means it releases its - reference to object B. If object B was not owned by anyone else, this is its last - reference count which means this last unref runs B's dispose handler which, in turn, - releases B's reference on object A. If this is A's last reference count, this last - unref runs A's dispose handler which is running for the second time before - A's finalize handler is invoked ! - - - - The above example, which might seem a bit contrived, can really happen if - GObjects are being handled by language bindings — hence the rules for - object destruction should be closely followed. - - -
- - - Object properties - - - One of GObject's nice features is its generic get/set mechanism for object - properties. When an object - is instantiated, the object's class_init handler should be used to register - the object's properties with g_object_class_install_properties. - - - - The best way to understand how object properties work is by looking at a real example - of how it is used: - -/************************************************/ -/* Implementation */ -/************************************************/ - -typedef enum -{ - PROP_FILENAME = 1, - PROP_ZOOM_LEVEL, - N_PROPERTIES -} ViewerFileProperty; - -static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; - -static void -viewer_file_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - ViewerFile *self = VIEWER_FILE (object); - - switch ((ViewerFileProperty) property_id) - { - case PROP_FILENAME: - g_free (self->filename); - self->filename = g_value_dup_string (value); - g_print ("filename: %s\n", self->filename); - break; - - case PROP_ZOOM_LEVEL: - self->zoom_level = g_value_get_uint (value); - g_print ("zoom level: %u\n", self->zoom_level); - break; - - default: - /* We don't have any other property... */ - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -viewer_file_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - ViewerFile *self = VIEWER_FILE (object); - - switch ((ViewerFileProperty) property_id) - { - case PROP_FILENAME: - g_value_set_string (value, self->filename); - break; - - case PROP_ZOOM_LEVEL: - g_value_set_uint (value, self->zoom_level); - break; - - default: - /* We don't have any other property... */ - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - break; - } -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = viewer_file_set_property; - object_class->get_property = viewer_file_get_property; - - obj_properties[PROP_FILENAME] = - g_param_spec_string ("filename", - "Filename", - "Name of the file to load and display from.", - NULL /* default value */, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - - obj_properties[PROP_ZOOM_LEVEL] = - g_param_spec_uint ("zoom-level", - "Zoom level", - "Zoom level to view the file at.", - 0 /* minimum value */, - 10 /* maximum value */, - 2 /* default value */, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - - g_object_class_install_properties (object_class, - N_PROPERTIES, - obj_properties); -} - -/************************************************/ -/* Use */ -/************************************************/ - -ViewerFile *file; -GValue val = G_VALUE_INIT; - -file = g_object_new (VIEWER_TYPE_FILE, NULL); - -g_value_init (&val, G_TYPE_UINT); -g_value_set_char (&val, 11); - -g_object_set_property (G_OBJECT (file), "zoom-level", &val); - -g_value_unset (&val); - - The client code above looks simple but a lot of things happen under the hood: - - - - g_object_set_property first ensures a property - with this name was registered in file's class_init handler. If so it walks the class hierarchy, - from bottom-most most-derived type, to top-most fundamental type to find the class - which registered that property. It then tries to convert the user-provided - GValue - into a GValue whose type is that of the associated property. - - - - If the user provides a signed char GValue, as is shown - here, and if the object's property was registered as an unsigned int, - g_value_transform will try to transform the input signed char into - an unsigned int. Of course, the success of the transformation depends on the availability - of the required transform function. In practice, there will almost always be a transformation - - Its behaviour might not be what you expect but it is up to you to actually avoid - relying on these transformations. - - - which matches and conversion will be carried out if needed. - - - - After transformation, the GValue is validated by - g_param_value_validate which makes sure the user's - data stored in the GValue matches the characteristics specified by - the property's GParamSpec. - Here, the GParamSpec we - provided in class_init has a validation function which makes sure that the GValue - contains a value which respects the minimum and maximum bounds of the - GParamSpec. In the example above, the client's GValue does not - respect these constraints (it is set to 11, while the maximum is 10). As such, the - g_object_set_property function will return with an error. - - - - If the user's GValue had been set to a valid value, g_object_set_property - would have proceeded with calling the object's - set_property class method. Here, since our - implementation of ViewerFile did override this method, execution would jump to - viewer_file_set_property after having retrieved from the - GParamSpec the param_id - - - It should be noted that the param_id used here need only to uniquely identify each - GParamSpec within the ViewerFileClass such that the switch - used in the set and get methods actually works. Of course, this locally-unique - integer is purely an optimization: it would have been possible to use a set of - if (strcmp (a, b) == 0) {} else if (strcmp (a, b) == 0) {} statements. - - - which had been stored by - g_object_class_install_property. - - - - Once the property has been set by the object's - set_property class method, execution - returns to g_object_set_property which makes sure that - the "notify" signal is emitted on the object's instance with the changed property as - parameter unless notifications were frozen by g_object_freeze_notify. - - - - g_object_thaw_notify can be used to re-enable notification of - property modifications through the - “notify” signal. It is important to remember that - even if properties are changed while property change notification is frozen, the "notify" - signal will be emitted once for each of these changed properties as soon as the property - change notification is thawed: no property change is lost for the "notify" - signal, although multiple notifications for a single property are - compressed. Signals can only be delayed by the notification freezing - mechanism. - - - - It sounds like a tedious task to set up GValues every time when one wants to modify a property. - In practice one will rarely do this. The functions g_object_set_property - and g_object_get_property - are meant to be used by language bindings. For application there is an easier way and - that is described next. - - - - Accessing multiple properties at once - - - It is interesting to note that the g_object_set and - g_object_set_valist (variadic version) functions can be used to set - multiple properties at once. The client code shown above can then be re-written as: - -ViewerFile *file; -file = /* */; -g_object_set (G_OBJECT (file), - "zoom-level", 6, - "filename", "~/some-file.txt", - NULL); - - This saves us from managing the GValues that we were needing to handle when using - g_object_set_property. - The code above will trigger one notify signal emission for each property modified. - - - - Equivalent _get versions are also available: - g_object_get - and g_object_get_valist (variadic version) can be used to get numerous - properties at once. - - - - These high level functions have one drawback — they don't provide a return value. - One should pay attention to the argument types and ranges when using them. - A known source of errors is to pass a different type from what the - property expects; for instance, passing an integer when the property - expects a floating point value and thus shifting all subsequent parameters - by some number of bytes. Also forgetting the terminating - NULL will lead to undefined behaviour. - - - - This explains how g_object_new, - g_object_newv and g_object_new_valist - work: they parse the user-provided variable number of parameters and invoke - g_object_set on the parameters only after the object has been successfully constructed. - The "notify" signal will be emitted for each property set. - - - - - - - - -
diff --git a/docs/reference/gobject/tut_gsignal.xml b/docs/reference/gobject/tut_gsignal.xml deleted file mode 100644 index d690d16..0000000 --- a/docs/reference/gobject/tut_gsignal.xml +++ /dev/null @@ -1,495 +0,0 @@ - - - - The GObject messaging system - - - Closures - - - Closures are central to the concept of asynchronous signal delivery - which is widely used throughout GTK and GNOME applications. A closure is an - abstraction, a generic representation of a callback. It is a small structure - which contains three objects: - - a function pointer (the callback itself) whose prototype looks like: - -return_type function_callback (… , gpointer user_data); - - - - the user_data pointer which is passed to the callback upon invocation of the closure - - - a function pointer which represents the destructor of the closure: whenever the - closure's refcount reaches zero, this function will be called before the closure - structure is freed. - - - - - - The GClosure structure represents the common functionality of all - closure implementations: there exists a different closure implementation for - each separate runtime which wants to use the GObject type system. - - In practice, closures sit at the boundary of language runtimes: if you are - writing Python code and one of your Python callbacks receives a signal from - a GTK widget, the C code in GTK needs to execute your Python - code. The closure invoked by the GTK object invokes the Python callback: - it behaves as a normal C object for GTK and as a normal Python object for - Python code. - - The GObject library provides a simple GCClosure type which - is a specific implementation of closures to be used with C/C++ callbacks. - - - A GClosure provides simple services: - - - Invocation (g_closure_invoke): this is what closures - were created for: they hide the details of callback invocation from the - callback invoker. - - - Notification: the closure notifies listeners of certain events such as - closure invocation, closure invalidation and closure finalization. Listeners - can be registered with g_closure_add_finalize_notifier - (finalization notification), g_closure_add_invalidate_notifier - (invalidation notification) and - g_closure_add_marshal_guards (invocation notification). - There exist symmetric deregistration functions for finalization and invalidation - events (g_closure_remove_finalize_notifier and - g_closure_remove_invalidate_notifier) but not for the invocation - process. - - Closures are reference counted and notify listeners of their destruction in a two-stage - process: the invalidation notifiers are invoked before the finalization notifiers. - - - - - - - C Closures - - - If you are using C or C++ - to connect a callback to a given event, you will either use simple GCClosures - which have a pretty minimal API or the even simpler g_signal_connect - functions (which will be presented a bit later). - - - - g_cclosure_new will create a new closure which can invoke the - user-provided callback_func with the user-provided - user_data as its last parameter. When the closure - is finalized (second stage of the destruction process), it will invoke - the destroy_data function if the user has - supplied one. - - - - g_cclosure_new_swap will create a new closure which can invoke the - user-provided callback_func with the - user-provided user_data as its first parameter - (instead of being the - last parameter as with g_cclosure_new). When the closure - is finalized (second stage of the destruction process), it will invoke - the destroy_data function if the user has - supplied one. - - - - - Non-C closures (for the fearless) - - - As was explained above, closures hide the details of callback invocation. In C, - callback invocation is just like function invocation: it is a matter of creating - the correct stack frame for the called function and executing a call - assembly instruction. - - - - C closure marshallers transform the array of GValues which represent - the parameters to the target function into a C-style function parameter list, invoke - the user-supplied C function with this new parameter list, get the return value of the - function, transform it into a GValue and return this GValue to the marshaller caller. - - - - A generic C closure marshaller is available as - g_cclosure_marshal_generic - which implements marshalling for all function types using libffi. Custom - marshallers for different types are not needed apart from performance - critical code where the libffi-based marshaller may be too slow. - - - - An example of a custom marshaller is given below, illustrating how - GValues can be converted to a C function call. The - marshaller is for a C function which takes an integer as its first - parameter and returns void. - -g_cclosure_marshal_VOID__INT (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef void (*GMarshalFunc_VOID__INT) (gpointer data1, - gint arg_1, - gpointer data2); - register GMarshalFunc_VOID__INT callback; - register GCClosure *cc = (GCClosure*) closure; - register gpointer data1, data2; - - g_return_if_fail (n_param_values == 2); - - data1 = g_value_peek_pointer (param_values + 0); - data2 = closure->data; - - callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback); - - callback (data1, - g_marshal_value_peek_int (param_values + 1), - data2); -} - - - - - There exist other kinds of marshallers, for example there is a generic - Python marshaller which is used by all Python closures (a Python closure - is used to invoke a callback written in Python). This Python marshaller - transforms the input GValue list representing the function parameters - into a Python tuple which is the equivalent structure in Python. - - - - - - - Signals - - - GObject's signals have nothing to do with standard UNIX signals: they connect - arbitrary application-specific events with any number of listeners. - For example, in GTK, every user event (keystroke or mouse move) is received - from the windowing system and generates a GTK event in the form of a signal emission - on the widget object instance. - - - - Each signal is registered in the type system together with the type on which - it can be emitted: users of the type are said to connect - to the signal on a given type instance when they register a closure to be - invoked upon the signal emission. The closure will be called synchronously on emission. - Users can also emit the signal by themselves or stop the emission of the signal from - within one of the closures connected to the signal. - - - - When a signal is emitted on a given type instance, all the closures - connected to this signal on this type instance will be invoked. All the closures - connected to such a signal represent callbacks whose signature looks like: - -return_type function_callback (gpointer instance, …, gpointer user_data); - - - - - Signal registration - - - To register a new signal on an existing type, we can use any of g_signal_newv, - g_signal_new_valist or g_signal_new functions: - -guint g_signal_newv (const gchar *signal_name, - GType itype, - GSignalFlags signal_flags, - GClosure *class_closure, - GSignalAccumulator accumulator, - gpointer accu_data, - GSignalCMarshaller c_marshaller, - GType return_type, - guint n_params, - GType *param_types); - - The number of parameters to these functions is a bit intimidating but they are relatively - simple: - - - signal_name: is a string which can be used to uniquely identify a given signal. - - - itype: is the instance type on which this signal can be emitted. - - - signal_flags: partly defines the order in which closures which were connected to the - signal are invoked. - - - class_closure: this is the default closure for the signal: if it is not NULL upon - the signal emission, it will be invoked upon this emission of the signal. The - moment where this closure is invoked compared to other closures connected to that - signal depends partly on the signal_flags. - - - accumulator: this is a function pointer which is invoked after each closure - has been invoked. If it returns FALSE, signal emission is stopped. If it returns - TRUE, signal emission proceeds normally. It is also used to compute the return - value of the signal based on the return value of all the invoked closures. - For example, an accumulator could ignore - NULL returns from closures; or it - could build a list of the values returned by the - closures. - - - accu_data: this pointer will be passed down to each invocation of the - accumulator during emission. - - - c_marshaller: this is the default C marshaller for any closure which is connected to - this signal. - - - return_type: this is the type of the return value of the signal. - - - n_params: this is the number of parameters this signal takes. - - - param_types: this is an array of GTypes which indicate the type of each parameter - of the signal. The length of this array is indicated by n_params. - - - - - - As you can see from the above definition, a signal is basically a description - of the closures which can be connected to this signal and a description of the - order in which the closures connected to this signal will be invoked. - - - - - - Signal connection - - - If you want to connect to a signal with a closure, you have three possibilities: - - - You can register a class closure at signal registration: this is a - system-wide operation. i.e.: the class closure will be invoked during each emission - of a given signal on any of the instances of the type which supports that signal. - - - You can use g_signal_override_class_closure which - overrides the class closure of a given type. It is possible to call this function - only on a derived type of the type on which the signal was registered. - This function is of use only to language bindings. - - - You can register a closure with the g_signal_connect - family of functions. This is an instance-specific operation: the closure - will be invoked only during emission of a given signal on a given instance. - - - It is also possible to connect a different kind of callback on a given signal: - emission hooks are invoked whenever a given signal is emitted whatever the instance on - which it is emitted. Emission hooks are used for example to get all mouse_clicked - emissions in an application to be able to emit the small mouse click sound. - Emission hooks are connected with g_signal_add_emission_hook - and removed with g_signal_remove_emission_hook. - - - - - - Signal emission - - - Signal emission is done through the use of the g_signal_emit family - of functions. - -void g_signal_emitv (const GValue *instance_and_params, - guint signal_id, - GQuark detail, - GValue *return_value); - - - - The instance_and_params array of GValues contains the list of input - parameters to the signal. The first element of the array is the - instance pointer on which to invoke the signal. The following elements of - the array contain the list of parameters to the signal. - - - signal_id identifies the signal to invoke. - - - detail identifies the specific detail of the signal to invoke. A detail is a kind of - magic token/argument which is passed around during signal emission and which is used - by closures connected to the signal to filter out unwanted signal emissions. In most - cases, you can safely set this value to zero. See for - more details about this parameter. - - - return_value holds the return value of the last closure invoked during emission if - no accumulator was specified. If an accumulator was specified during signal creation, - this accumulator is used to calculate the return value as a function of the return - values of all the closures invoked during emission. - If no closure is invoked during - emission, the return_value is nonetheless initialized to zero/null. - - - - - - Signal emission is done synchronously and can be decomposed in 5 steps: - - - RUN_FIRST: if the - G_SIGNAL_RUN_FIRST flag was used - during signal registration and if there exists a class closure for this signal, - the class closure is invoked. - - - EMISSION_HOOK: if any emission hook was added to - the signal, they are invoked from first to last added. Accumulate return values. - - - HANDLER_RUN_FIRST: if any closure were connected - with the g_signal_connect family of - functions, and if they are not blocked (with the g_signal_handler_block - family of functions) they are run here, from first to last connected. - - - RUN_LAST: if the G_SIGNAL_RUN_LAST - flag was set during registration and if a class closure - was set, it is invoked here. - - - HANDLER_RUN_LAST: if any closure were connected - with the g_signal_connect_after family of - functions, if they were not invoked during HANDLER_RUN_FIRST and if they - are not blocked, they are run here, from first to last connected. - - - RUN_CLEANUP: if the G_SIGNAL_RUN_CLEANUP flag - was set during registration and if a class closure was set, - it is invoked here. Signal emission is completed here. - - - - - - If, at any point during emission (except in RUN_CLEANUP or - EMISSION_HOOK state), one of the closures stops the signal emission with - g_signal_stop_emission, - emission jumps to RUN_CLEANUP state. - - - - If, at any point during emission, one of the closures or emission hook - emits the same signal on the same instance, emission is restarted from - the RUN_FIRST state. - - - - The accumulator function is invoked in all states, after invocation - of each closure (except in RUN_EMISSION_HOOK and - RUN_CLEANUP). It accumulates - the closure return value into the signal return value and returns TRUE or - FALSE. If, at any point, it does not return TRUE, emission jumps - to RUN_CLEANUP state. - - - - If no accumulator function was provided, the value returned by the last handler - run will be returned by g_signal_emit. - - - - - - - The <emphasis>detail</emphasis> argument - - All the functions related to signal emission or signal connection have a parameter - named the detail. Sometimes, this parameter is hidden by the API - but it is always there, in one form or another. - - - - Of the three main connection functions, - only one has an explicit detail parameter as a GQuark: - g_signal_connect_closure_by_id. - - A GQuark is an integer which uniquely represents a string. It is possible to transform - back and forth between the integer and string representations with the functions - g_quark_from_string and g_quark_to_string. - - - - - The two other functions, - g_signal_connect_closure and - g_signal_connect_data - hide the detail parameter in the signal name identification. - Their detailed_signal parameter is a - string which identifies the name of the signal to connect to. - The format of this string should match - signal_name::detail_name. For example, - connecting to the signal named - notify::cursor_position will actually - connect to the signal named notify with the - cursor_position detail. - Internally, the detail string is transformed to a GQuark if it is present. - - - - Of the four main signal emission functions, one hides it in its - signal name parameter: - g_signal_connect. - The other three have an explicit detail parameter as a - GQuark again: - g_signal_emit, - g_signal_emitv and - g_signal_emit_valist. - - - - If a detail is provided by the user to the emission function, it is used during emission to match - against the closures which also provide a detail. - If a closure's detail does not match the detail provided by the user, it - will not be invoked (even though it is connected to a signal which is - being emitted). - - - - This completely optional filtering mechanism is mainly used as an optimization for signals - which are often emitted for many different reasons: the clients can filter out which events they are - interested in before the closure's marshalling code runs. For example, this is used extensively - by the notify signal of GObject: whenever a property is modified on a GObject, - instead of just emitting the notify signal, GObject associates as a detail to this - signal emission the name of the property modified. This allows clients who wish to be notified of changes - to only one property to filter most events before receiving them. - - - - As a simple rule, users can and should set the detail parameter to zero: this will disable completely - this optional filtering for that signal. - - - - - - - diff --git a/docs/reference/gobject/tut_gtype.xml b/docs/reference/gobject/tut_gtype.xml deleted file mode 100644 index c2d51b9..0000000 --- a/docs/reference/gobject/tut_gtype.xml +++ /dev/null @@ -1,1003 +0,0 @@ - - - - The GLib Dynamic Type System - - - A type, as manipulated by the GLib type system, is much more generic than what - is usually understood as an Object type. It is best explained by looking at the - structure and the functions used to register new types in the type system. - -typedef struct _GTypeInfo GTypeInfo; -struct _GTypeInfo -{ - /* interface types, classed types, instantiated types */ - guint16 class_size; - - GBaseInitFunc base_init; - GBaseFinalizeFunc base_finalize; - - /* classed types, instantiated types */ - GClassInitFunc class_init; - GClassFinalizeFunc class_finalize; - gconstpointer class_data; - - /* instantiated types */ - guint16 instance_size; - guint16 n_preallocs; - GInstanceInitFunc instance_init; - - /* value handling */ - const GTypeValueTable *value_table; -}; -GType g_type_register_static (GType parent_type, - const gchar *type_name, - const GTypeInfo *info, - GTypeFlags flags); -GType g_type_register_fundamental (GType type_id, - const gchar *type_name, - const GTypeInfo *info, - const GTypeFundamentalInfo *finfo, - GTypeFlags flags); - - - - - g_type_register_static, - g_type_register_dynamic and - g_type_register_fundamental - are the C functions, defined in - gtype.h and implemented in gtype.c - which you should use to register a new GType in the program's type system. - It is not likely you will ever need to use - g_type_register_fundamental - but in case you want to, the last chapter explains how to create - new fundamental types. - - - - Fundamental types are top-level types which do not derive from any other type - while other non-fundamental types derive from other types. - Upon initialization, the type system not only initializes its - internal data structures but it also registers a number of core - types: some of these are fundamental types. Others are types derived from these - fundamental types. - - - - Fundamental and non-fundamental types are defined by: - - - class size: the class_size field in GTypeInfo. - - - class initialization functions (C++ constructor): the base_init and - class_init fields in GTypeInfo. - - - class destruction functions (C++ destructor): the base_finalize and - class_finalize fields in GTypeInfo. - - - instance size (C++ parameter to new): the instance_size field in - GTypeInfo. - - - instantiation policy (C++ type of new operator): the n_preallocs - field in GTypeInfo. - - - copy functions (C++ copy operators): the value_table field in - GTypeInfo. - - - type characteristic flags: GTypeFlags. - - - Fundamental types are also defined by a set of GTypeFundamentalFlags - which are stored in a GTypeFundamentalInfo. - Non-fundamental types are furthermore defined by the type of their parent which is - passed as the parent_type parameter to g_type_register_static - and g_type_register_dynamic. - - - - Copy functions - - - The major common point between all GLib types (fundamental and - non-fundamental, classed and non-classed, instantiatable and non-instantiatable) is that - they can all be manipulated through a single API to copy/assign them. - - - - The GValue structure is used as an abstract container for all of these - types. Its simplistic API (defined in gobject/gvalue.h) can be - used to invoke the value_table functions registered - during type registration: for example g_value_copy copies the - content of a GValue to another GValue. This is similar - to a C++ assignment which invokes the C++ copy operator to modify the default - bit-by-bit copy semantics of C++/C structures/classes. - - - - The following code shows how you can copy around a 64 bit integer, as well as a GObject - instance pointer: - -static void test_int (void) -{ - GValue a_value = G_VALUE_INIT; - GValue b_value = G_VALUE_INIT; - guint64 a, b; - - a = 0xdeadbeef; - - g_value_init (&a_value, G_TYPE_UINT64); - g_value_set_uint64 (&a_value, a); - - g_value_init (&b_value, G_TYPE_UINT64); - g_value_copy (&a_value, &b_value); - - b = g_value_get_uint64 (&b_value); - - if (a == b) { - g_print ("Yay !! 10 lines of code to copy around a uint64.\n"); - } else { - g_print ("Are you sure this is not a Z80 ?\n"); - } -} - -static void test_object (void) -{ - GObject *obj; - GValue obj_vala = G_VALUE_INIT; - GValue obj_valb = G_VALUE_INIT; - obj = g_object_new (VIEWER_TYPE_FILE, NULL); - - g_value_init (&obj_vala, VIEWER_TYPE_FILE); - g_value_set_object (&obj_vala, obj); - - g_value_init (&obj_valb, G_TYPE_OBJECT); - - /* g_value_copy's semantics for G_TYPE_OBJECT types is to copy the reference. - * This function thus calls g_object_ref. - * It is interesting to note that the assignment works here because - * VIEWER_TYPE_FILE is a G_TYPE_OBJECT. - */ - g_value_copy (&obj_vala, &obj_valb); - - g_object_unref (G_OBJECT (obj)); - g_object_unref (G_OBJECT (obj)); -} - - The important point about the above code is that the exact semantics of the copy calls - is undefined since they depend on the implementation of the copy function. Certain - copy functions might decide to allocate a new chunk of memory and then to copy the - data from the source to the destination. Others might want to simply increment - the reference count of the instance and copy the reference to the new GValue. - - - - The value table used to specify these assignment functions is - documented in - GTypeValueTable. - - - Interestingly, it is also very unlikely - you will ever need to specify a value_table during type registration - because these value_tables are inherited from the parent types for - non-fundamental types. - - - - - Conventions - - - - There are a number of conventions users are expected to follow when creating new types - which are to be exported in a header file: - - - Type names (including object names) must be at least three - characters long and start with ‘a–z’, ‘A–Z’ or ‘_’. - - - Use the object_method pattern for function names: to invoke - the method named save on an instance of object type file, call - file_save. - - Use prefixing to avoid namespace conflicts with other projects. - If your library (or application) is named Viewer, - prefix all your function names with viewer_. - For example: viewer_object_method. - - Create a macro named PREFIX_TYPE_OBJECT which always - returns the GType for the associated object type. For an object of type - File in the Viewer namespace, - use: VIEWER_TYPE_FILE. - This macro is implemented using a function named - prefix_object_get_type; for example, viewer_file_get_type. - - - - Use G_DECLARE_FINAL_TYPE - or G_DECLARE_DERIVABLE_TYPE - to define various other conventional macros for your object: - - - PREFIX_OBJECT (obj), which - returns a pointer of type PrefixObject. This macro is used to enforce - static type safety by doing explicit casts wherever needed. It also enforces - dynamic type safety by doing runtime checks. It is possible to disable the dynamic - type checks in production builds (see building GLib). - For example, we would create - VIEWER_FILE (obj) to keep the previous example. - - PREFIX_OBJECT_CLASS (klass), which - is strictly equivalent to the previous casting macro: it does static casting with - dynamic type checking of class structures. It is expected to return a pointer - to a class structure of type PrefixObjectClass. An example is: - VIEWER_FILE_CLASS. - - PREFIX_IS_OBJECT (obj), which - returns a gboolean which indicates whether the input - object instance pointer is non-NULL and of type OBJECT. - For example, VIEWER_IS_FILE. - - PREFIX_IS_OBJECT_CLASS (klass), which returns a boolean - if the input class pointer is a pointer to a class of type OBJECT. - For example, VIEWER_IS_FILE_CLASS. - - PREFIX_OBJECT_GET_CLASS (obj), - which returns the class pointer associated to an instance of a given type. This macro - is used for static and dynamic type safety purposes (just like the previous casting - macros). - For example, VIEWER_FILE_GET_CLASS. - - - - - The implementation of these macros is pretty straightforward: a number of simple-to-use - macros are provided in gtype.h. For the example we used above, we would - write the following trivial code to declare the macros: - -#define VIEWER_TYPE_FILE viewer_file_get_type () -G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) - - - - - Unless your code has special requirements, you can use the - G_DEFINE_TYPE - macro to define a class: - -G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) - - - - - Otherwise, the viewer_file_get_type function must be - implemented manually: - -GType viewer_file_get_type (void) -{ - static GType type = 0; - if (type == 0) { - const GTypeInfo info = { - /* You fill this structure. */ - }; - type = g_type_register_static (G_TYPE_OBJECT, - "ViewerFile", - &info, 0); - } - return type; -} - - - - - - - Non-instantiatable non-classed fundamental types - - - A lot of types are not instantiatable by the type system and do not have - a class. Most of these types are fundamental trivial types such as gchar, - and are already registered by GLib. - - - - In the rare case of needing to register such a type in the type - system, fill a - GTypeInfo structure with zeros since these types are also most of the time - fundamental: - - GTypeInfo info = { - 0, /* class_size */ - NULL, /* base_init */ - NULL, /* base_destroy */ - NULL, /* class_init */ - NULL, /* class_destroy */ - NULL, /* class_data */ - 0, /* instance_size */ - 0, /* n_preallocs */ - NULL, /* instance_init */ - NULL, /* value_table */ - }; - static const GTypeValueTable value_table = { - value_init_long0, /* value_init */ - NULL, /* value_free */ - value_copy_long0, /* value_copy */ - NULL, /* value_peek_pointer */ - "i", /* collect_format */ - value_collect_int, /* collect_value */ - "p", /* lcopy_format */ - value_lcopy_char, /* lcopy_value */ - }; - info.value_table = &value_table; - type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0); - - - - - - Having non-instantiatable types might seem a bit useless: what good is a type - if you cannot instantiate an instance of that type ? Most of these types - are used in conjunction with GValues: a GValue is initialized - with an integer or a string and it is passed around by using the registered - type's value_table. GValues (and by extension these trivial fundamental - types) are most useful when used in conjunction with object properties and signals. - - - - - - Instantiatable classed types: objects - - - This section covers the theory behind objects. See - for the recommended way to define a - GObject. - - - - Types which are registered with a class and are declared instantiatable are - what most closely resembles an object. - Although GObjects (detailed in ) - are the most well known type of instantiatable - classed types, other kinds of similar objects used as the base of an inheritance - hierarchy have been externally developed and they are all built on the fundamental - features described below. - - - - For example, the code below shows how you could register - such a fundamental object type in the type system (using none of the - GObject convenience API): - -typedef struct { - GObject parent; - - /* instance members */ - gchar *filename; -} ViewerFile; - -typedef struct { - GObjectClass parent; - - /* class members */ - /* the first is public, pure and virtual */ - void (*open) (ViewerFile *self, - GError **error); - - /* the second is public and virtual */ - void (*close) (ViewerFile *self, - GError **error); -} ViewerFileClass; - -#define VIEWER_TYPE_FILE (viewer_file_get_type ()) - -GType -viewer_file_get_type (void) -{ - static GType type = 0; - if (type == 0) { - const GTypeInfo info = { - sizeof (ViewerFileClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) viewer_file_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ViewerFile), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL /* instance_init */ - }; - type = g_type_register_static (G_TYPE_OBJECT, - "ViewerFile", - &info, 0); - } - return type; -} - - Upon the first call to viewer_file_get_type, the type named - ViewerFile will be registered in the type system as inheriting - from the type G_TYPE_OBJECT. - - - - Every object must define two structures: its class structure and its - instance structure. All class structures must contain as first member - a GTypeClass structure. All instance structures must contain as first - member a GTypeInstance structure. The declaration of these C types, - coming from gtype.h is shown below: - -struct _GTypeClass -{ - GType g_type; -}; -struct _GTypeInstance -{ - GTypeClass *g_class; -}; - - These constraints allow the type system to make sure that every object instance - (identified by a pointer to the object's instance structure) contains in its - first bytes a pointer to the object's class structure. - - - This relationship is best explained by an example: let's take object B which - inherits from object A: - -/* A definitions */ -typedef struct { - GTypeInstance parent; - int field_a; - int field_b; -} A; -typedef struct { - GTypeClass parent_class; - void (*method_a) (void); - void (*method_b) (void); -} AClass; - -/* B definitions. */ -typedef struct { - A parent; - int field_c; - int field_d; -} B; -typedef struct { - AClass parent_class; - void (*method_c) (void); - void (*method_d) (void); -} BClass; - - The C standard mandates that the first field of a C structure is stored starting - in the first byte of the buffer used to hold the structure's fields in memory. - This means that the first field of an instance of an object B is A's first field - which in turn is GTypeInstance's first field which in - turn is g_class, a pointer - to B's class structure. - - - - Thanks to these simple conditions, it is possible to detect the type of every - object instance by doing: - -B *b; -b->parent.parent.g_class->g_type - - or, more quickly: - -B *b; -((GTypeInstance *) b)->g_class->g_type - - - - - Initialization and Destruction - - - instantiation of these types can be done with - g_type_create_instance, - which will look up the type information - structure associated with the type requested. Then, the instance size and instantiation - policy (if the n_preallocs field is set - to a non-zero value, the type system allocates - the object's instance structures in chunks rather than mallocing for every instance) - declared by the user are used to get a buffer to hold the object's instance - structure. - - - - If this is the first instance of the object ever created, the type system must create a class structure. - It allocates a buffer to hold the object's class structure and initializes it. The first part of the - class structure (ie: the embedded parent class structure) is initialized by copying the contents from - the class structure of the parent class. The rest of class structure is initialized to zero. If there - is no parent, the entire class structure is initialized to zero. The type system then invokes the - base_class_initialization functions - (GBaseInitFunc) from topmost - fundamental object to bottom-most most derived object. The object's class_init - (GClassInitFunc) function is invoked afterwards to complete - initialization of the class structure. - Finally, the object's interfaces are initialized (we will discuss interface initialization - in more detail later). - - - - Once the type system has a pointer to an initialized class structure, it sets the object's - instance class pointer to the object's class structure and invokes the object's - instance_init - (GInstanceInitFunc) - functions, from top-most fundamental - type to bottom-most most-derived type. - - - - Object instance destruction through g_type_free_instance is very simple: - the instance structure is returned to the instance pool if there is one and if this was the - last living instance of the object, the class is destroyed. - - - - - Class destruction (the concept of destruction is sometimes partly - referred to as finalization in GType) is the symmetric process of - the initialization: interfaces are destroyed first. - Then, the most derived - class_finalize (GClassFinalizeFunc) function is invoked. Finally, the - base_class_finalize (GBaseFinalizeFunc) functions are - invoked from bottom-most most-derived type to top-most fundamental type and - the class structure is freed. - - - - The base initialization/finalization process is - very similar to the C++ constructor/destructor paradigm. The practical details are different - though and it is important not to get confused by superficial similarities. - GTypes have no instance destruction mechanism. It is - the user's responsibility to implement correct destruction semantics on top - of the existing GType code. (This is what GObject does: see - .) - Furthermore, C++ code equivalent to the base_init - and class_init callbacks of GType is usually not needed because C++ cannot really create object - types at runtime. - - - - The instantiation/finalization process can be summarized as follows: - - GType Instantiation/Finalization - - - - - - - - Invocation time - Function invoked - Function's parameters - - - - - First call to g_type_create_instance for target type - type's base_init function - On the inheritance tree of classes from fundamental type to target type. - base_init is invoked once for each class structure. - - - - target type's class_init function - On target type's class structure - - - - interface initialization, see - - - - - Each call to g_type_create_instance for target type - target type's instance_init function - On object's instance - - - Last call to g_type_free_instance for target type - interface destruction, see - - - - - - target type's class_finalize function - On target type's class structure - - - - type's base_finalize function - On the inheritance tree of classes from fundamental type to target type. - base_finalize is invoked once for each class structure. - - - -
-
- -
- -
- - - Non-instantiatable non-classed types: interfaces - - - This section covers the theory behind interfaces. See - for the recommended way to define an - interface. - - - - GType's interfaces are very similar to Java's interfaces. They allow - to describe a common API that several classes will adhere to. - Imagine the play, pause and stop buttons on hi-fi equipment — those can - be seen as a playback interface. Once you know what they do, you can - control your CD player, MP3 player or anything that uses these symbols. - To declare an interface you have to register a non-instantiatable - non-classed type which derives from - GTypeInterface. The following piece of code declares such an interface. - -#define VIEWER_TYPE_EDITABLE viewer_editable_get_type () -G_DECLARE_INTERFACE (ViewerEditable, viewer_editable, VIEWER, EDITABLE, GObject) - -struct _ViewerEditableInterface { - GTypeInterface parent; - - void (*save) (ViewerEditable *self, - GError **error); -}; - -void viewer_editable_save (ViewerEditable *self, - GError **error); - - The interface function, viewer_editable_save is implemented - in a pretty simple way: - -void -viewer_editable_save (ViewerEditable *self, - GError **error) -{ - ViewerEditableinterface *iface; - - g_return_if_fail (VIEWER_IS_EDITABLE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - iface = VIEWER_EDITABLE_GET_IFACE (self); - g_return_if_fail (iface->save != NULL); - iface->save (self); -} - - viewer_editable_get_type registers a type named ViewerEditable - which inherits from G_TYPE_INTERFACE. All interfaces must - be children of G_TYPE_INTERFACE in the inheritance tree. - - - - An interface is defined by only one structure which must contain as first member - a GTypeInterface structure. The interface structure is expected to - contain the function pointers of the interface methods. It is good style to - define helper functions for each of the interface methods which simply call - the interface's method directly: viewer_editable_save - is one of these. - - - - If you have no special requirements you can use the - G_IMPLEMENT_INTERFACE macro - to implement an interface: - -static void -viewer_file_save (ViewerEditable *self) -{ - g_print ("File implementation of editable interface save method.\n"); -} - -static void -viewer_file_editable_interface_init (ViewerEditableInterface *iface) -{ - iface->save = viewer_file_save; -} - -G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, VIEWER_TYPE_FILE, - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_file_editable_interface_init)) - - - - - If your code does have special requirements, you must write a custom - get_type function to register your GType which - inherits from some GObject - and which implements the interface ViewerEditable. For - example, this code registers a new ViewerFile class which - implements ViewerEditable: - -static void -viewer_file_save (ViewerEditable *editable) -{ - g_print ("File implementation of editable interface save method.\n"); -} - -static void -viewer_file_editable_interface_init (gpointer g_iface, - gpointer iface_data) -{ - ViewerEditableInterface *iface = g_iface; - - iface->save = viewer_file_save; -} - -GType -viewer_file_get_type (void) -{ - static GType type = 0; - if (type == 0) { - const GTypeInfo info = { - sizeof (ViewerFileClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - NULL, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (ViewerFile), - 0, /* n_preallocs */ - NULL /* instance_init */ - }; - const GInterfaceInfo editable_info = { - (GInterfaceInitFunc) viewer_file_editable_interface_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - type = g_type_register_static (VIEWER_TYPE_FILE, - "ViewerFile", - &info, 0); - g_type_add_interface_static (type, - VIEWER_TYPE_EDITABLE, - &editable_info); - } - return type; -} - - - - - g_type_add_interface_static records in the type system that - a given type implements also FooInterface - (foo_interface_get_type returns the type of - FooInterface). - The GInterfaceInfo structure holds - information about the implementation of the interface: - -struct _GInterfaceInfo -{ - GInterfaceInitFunc interface_init; - GInterfaceFinalizeFunc interface_finalize; - gpointer interface_data; -}; - - - - - Interface Initialization - - - When an instantiatable classed type which implements an interface - (either directly or by inheriting an implementation from a superclass) - is created for the first time, its class structure is initialized - following the process described in . - After that, the interface implementations associated with - the type are initialized. - - - - First a memory buffer is allocated to hold the interface structure. The parent's - interface structure is then copied over to the new interface structure (the parent - interface is already initialized at that point). If there is no parent interface, - the interface structure is initialized with zeros. The - g_type and the - g_instance_type fields are then - initialized: g_type is set to the type of - the most-derived interface and - g_instance_type is set to the type of the - most derived type which implements this interface. - - - - The interface's base_init function is called, - and then the interface's default_init is invoked. - Finally if the type has registered an implementation of the interface, - the implementation's interface_init - function is invoked. If there are multiple implementations of an - interface the base_init and - interface_init functions will be invoked once - for each implementation initialized. - - - - It is thus recommended to use a default_init function to - initialize an interface. This function is called only once for the interface no - matter how many implementations there are. The - default_init function is declared by - G_DEFINE_INTERFACE - which can be used to define the interface: - -G_DEFINE_INTERFACE (ViewerEditable, viewer_editable, G_TYPE_OBJECT) - -static void -viewer_editable_default_init (ViewerEditableInterface *iface) -{ - /* add properties and signals here, will only be called once */ -} - - - - - Or you can do that yourself in a GType function for your interface: - -GType -viewer_editable_get_type (void) -{ - static gsize type_id = 0; - if (g_once_init_enter (&type_id)) { - const GTypeInfo info = { - sizeof (ViewerEditableInterface), - NULL, /* base_init */ - NULL, /* base_finalize */ - viewer_editable_default_init, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - 0, /* instance_size */ - 0, /* n_preallocs */ - NULL /* instance_init */ - }; - GType type = g_type_register_static (G_TYPE_INTERFACE, - "ViewerEditable", - &info, 0); - g_once_init_leave (&type_id, type); - } - return type_id; -} - -static void -viewer_editable_default_init (ViewerEditableInterface *iface) -{ - /* add properties and signals here, will only called once */ -} - - - - - In summary, interface initialization uses the following functions: - - - - - Interface Initialization - - - - - - - - Invocation time - Function Invoked - Function's parameters - Remark - - - - - First call to g_type_create_instance - for any type implementing interface - - interface's base_init function - On interface's vtable - Rarely necessary to use this. Called once per instantiated classed type implementing the interface. - - - First call to g_type_create_instance - for each type implementing interface - - interface's default_init function - On interface's vtable - Register interface's signals, properties, etc. here. Will be called once. - - - First call to g_type_create_instance - for any type implementing interface - - implementation's interface_init function - On interface's vtable - - Initialize interface implementation. Called for each class that that - implements the interface. Initialize the interface method pointers - in the interface structure to the implementing class's implementation. - - - - -
-
- -
- - - Interface Destruction - - - When the last instance of an instantiatable type which registered - an interface implementation is destroyed, the interface's - implementations associated to the type are destroyed. - - - - To destroy an interface implementation, GType first calls the - implementation's interface_finalize function - and then the interface's most-derived - base_finalize function. - - - - Again, it is important to understand, as in - , - that both interface_finalize and base_finalize - are invoked exactly once for the destruction of each implementation of an interface. Thus, - if you were to use one of these functions, you would need to use a static integer variable - which would hold the number of instances of implementations of an interface such that - the interface's class is destroyed only once (when the integer variable reaches zero). - - - - The above process can be summarized as follows: - - Interface Finalization - - - - - - - - Invocation time - Function Invoked - Function's parameters - - - - - Last call to g_type_free_instance for type - implementing interface - - interface's interface_finalize function - On interface's vtable - - - - interface's base_finalize function - On interface's vtable - - - -
-
-
-
-
diff --git a/docs/reference/gobject/tut_howto.xml b/docs/reference/gobject/tut_howto.xml deleted file mode 100644 index 8241923..0000000 --- a/docs/reference/gobject/tut_howto.xml +++ /dev/null @@ -1,1535 +0,0 @@ - - - - Tutorial - - - This chapter tries to answer the real-life questions of users and presents - the most common use cases in order from most likely to least - likely. - - - - - How to define and implement a new GObject - - - This chapter focuses on the implementation of a subtype of GObject, for - example to create a custom class hierarchy, or to subclass a GTK widget. - - - - Throughout the chapter, a running example of a file viewer program is used, - which has a ViewerFile class to represent a single file being - viewed, and various derived classes for different types of files with - special functionality, such as audio files. The example application also - supports editing files (for example, to tweak a photo being viewed), using - a ViewerEditable interface. - - - - Boilerplate header code - - - The first step before writing the code for your GObject is to write the - type's header which contains the needed type, function and macro - definitions. Each of these elements is nothing but a convention which - is followed by almost all users of GObject, and has been refined over - multiple years of experience developing GObject-based code. If you are - writing a library, it is particularly important for you to adhere closely - to these conventions; users of your library will assume that you have. - Even if not writing a library, it will help other people who want to work - on your project. - - - - Pick a name convention for your headers and source code and stick to it: - - use a dash to separate the prefix from the typename: - viewer-file.h and viewer-file.c - (this is the convention used by Nautilus and most GNOME libraries). - use an underscore to separate the prefix from the - typename: viewer_file.h and - viewer_file.c. - Do not separate the prefix from the typename: - viewerfile.h and viewerfile.c. - (this is the convention used by GTK) - - Some people like the first two solutions better: it makes reading file - names easier for those with poor eyesight. - - - - The basic conventions for any header which exposes a GType are described - in . - - - - If you want to declare a type named ‘file’ in namespace ‘viewer’, name the - type instance ViewerFile and its class - ViewerFileClass (names are case sensitive). The - recommended method of declaring a type differs based on whether the type - is final or derivable. - - - - Final types cannot be subclassed further, and should be the default choice - for new types — changing a final type to be derivable is always a change - that will be compatible with existing uses of the code, but the converse - will often cause problems. Final types are declared using - G_DECLARE_FINAL_TYPE, - and require a structure to hold the instance data to be declared in the - source code (not the header file). - - -/* - * Copyright/Licensing information. - */ - -/* inclusion guard */ -#ifndef __VIEWER_FILE_H__ -#define __VIEWER_FILE_H__ - -#include <glib-object.h> -/* - * Potentially, include other headers on which this header depends. - */ - -G_BEGIN_DECLS - -/* - * Type declaration. - */ -#define VIEWER_TYPE_FILE viewer_file_get_type () -G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) - -/* - * Method definitions. - */ -ViewerFile *viewer_file_new (void); - -G_END_DECLS - -#endif /* __VIEWER_FILE_H__ */ - - - - - Derivable types can be subclassed further, and their class and - instance structures form part of the public API which must not be changed - if API stability is cared about. They are declared using - G_DECLARE_DERIVABLE_TYPE: - -/* - * Copyright/Licensing information. - */ - -/* inclusion guard */ -#ifndef __VIEWER_FILE_H__ -#define __VIEWER_FILE_H__ - -#include <glib-object.h> -/* - * Potentially, include other headers on which this header depends. - */ - -G_BEGIN_DECLS - -/* - * Type declaration. - */ -#define VIEWER_TYPE_FILE viewer_file_get_type () -G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) - -struct _ViewerFileClass -{ - GObjectClass parent_class; - - /* Class virtual function fields. */ - void (* open) (ViewerFile *file, - GError **error); - - /* Padding to allow adding up to 12 new virtual functions without - * breaking ABI. */ - gpointer padding[12]; -}; - -/* - * Method definitions. - */ -ViewerFile *viewer_file_new (void); - -G_END_DECLS - -#endif /* __VIEWER_FILE_H__ */ - - - - - The convention for header includes is to add the minimum number of - #include directives to the top of your headers needed - to compile that header. This - allows client code to simply #include "viewer-file.h", - without needing to know the prerequisites for - viewer-file.h. - - - - - Boilerplate code - - - In your code, the first step is to #include the - needed headers: - -/* - * Copyright information - */ - -#include "viewer-file.h" - -/* Private structure definition. */ -typedef struct { - gchar *filename; - /* stuff */ -} ViewerFilePrivate; - -/* - * forward definitions - */ - - - - - If the class is being declared as final using - G_DECLARE_FINAL_TYPE, its instance structure should - be defined in the C file: - -struct _ViewerFile -{ - GObject parent_instance; - - /* Other members, including private data. */ -}; - - - - - Call the G_DEFINE_TYPE macro (or - G_DEFINE_TYPE_WITH_PRIVATE if your class needs - private data — final types do not need private data) - using the name - of the type, the prefix of the functions and the parent GType to - reduce the amount of boilerplate needed. This macro will: - - - implement the viewer_file_get_type - function - define a parent class pointer accessible from - the whole .c file - add private instance data to the type (if using - G_DEFINE_TYPE_WITH_PRIVATE) - - - - - If the class has been declared as final using - G_DECLARE_FINAL_TYPE (see - ), private data should be placed in - the instance structure, ViewerFile, and - G_DEFINE_TYPE should be used instead of - G_DEFINE_TYPE_WITH_PRIVATE. The instance structure - for a final class is not exposed publicly, and is not embedded in the - instance structures of any derived classes (because the class is final); - so its size can vary without causing incompatibilities for code which uses - the class. Conversely, private data for derivable classes - must be included in a private structure, and - G_DEFINE_TYPE_WITH_PRIVATE must be used. - - -G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) - -or - -G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) - - - - - It is also possible to use the - G_DEFINE_TYPE_WITH_CODE macro to control the - get_type function implementation — for instance, to - add a call to the G_IMPLEMENT_INTERFACE macro to - implement an interface. - - - - - Object construction - - - People often get confused when trying to construct their GObjects because of the - sheer number of different ways to hook into the objects's construction process: it is - difficult to figure which is the correct, recommended way. - - - - shows what user-provided functions - are invoked during object instantiation and in which order they are invoked. - A user looking for the equivalent of the simple C++ constructor function should use - the instance_init method. It will be invoked after - all the parents’ instance_init - functions have been invoked. It cannot take arbitrary construction parameters - (as in C++) but if your object needs arbitrary parameters to complete initialization, - you can use construction properties. - - - - Construction properties will be set only after all - instance_init functions have run. - No object reference will be returned to the client of g_object_new - until all the construction properties have been set. - - - - It is important to note that object construction cannot ever - fail. If you require a fallible GObject construction, you can use the - GInitable and - GAsyncInitable - interfaces provided by the GIO library. - - - - You should write the following code first: - -G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ -} - -static void -viewer_file_init (ViewerFile *self) -{ - ViewerFilePrivate *priv = viewer_file_get_instance_private (self); - - /* initialize all public and private members to reasonable default values. - * They are all automatically initialized to 0 to begin with. */ -} - - - - - If you need special construction properties (with - G_PARAM_CONSTRUCT_ONLY - set), install the properties in - the class_init() function, override the set_property() - and get_property() methods of the GObject class, - and implement them as described by . - - - - Property IDs must start from 1, as 0 is reserved for internal use by - GObject. - -enum -{ - PROP_FILENAME = 1, - PROP_ZOOM_LEVEL, - N_PROPERTIES -}; - -static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = viewer_file_set_property; - object_class->get_property = viewer_file_get_property; - - obj_properties[PROP_FILENAME] = - g_param_spec_string ("filename", - "Filename", - "Name of the file to load and display from.", - NULL /* default value */, - G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); - - obj_properties[PROP_ZOOM_LEVEL] = - g_param_spec_uint ("zoom-level", - "Zoom level", - "Zoom level to view the file at.", - 0 /* minimum value */, - 10 /* maximum value */, - 2 /* default value */, - G_PARAM_READWRITE); - - g_object_class_install_properties (object_class, - N_PROPERTIES, - obj_properties); -} - - If you need this, make sure you can build and run code similar to the - code shown above. Also, make sure your construct properties can be set - without side effects during construction. - - - - Some people sometimes need to complete the initialization of an instance - of a type only after the properties passed to the constructors have been - set. This is possible through the use of the constructor() - class method as described in or, - more simply, using the constructed() class method. - Note that the constructed() - virtual function will only be invoked after the properties marked as - G_PARAM_CONSTRUCT_ONLY or - G_PARAM_CONSTRUCT have been consumed, but - before the regular properties passed to g_object_new() - have been set. - - - - - Object destruction - - - Again, it is often difficult to figure out which mechanism to use to - hook into the object's destruction process: when the last - g_object_unref - function call is made, a lot of things happen as described in - . - - - - The destruction process of your object is in two phases: dispose and - finalize. This split is necessary to handle - potential cycles due to the nature of the reference counting mechanism - used by GObject, as well as dealing with temporary revival of - instances in case of signal emission during the destruction sequence. - See for more information. - -struct _ViewerFilePrivate -{ - gchar *filename; - guint zoom_level; - - GInputStream *input_stream; -}; - -G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) - -static void -viewer_file_dispose (GObject *gobject) -{ - ViewerFilePrivate *priv = viewer_file_get_instance_private (VIEWER_FILE (gobject)); - - /* In dispose(), you are supposed to free all types referenced from this - * object which might themselves hold a reference to self. Generally, - * the most simple solution is to unref all members on which you own a - * reference. - */ - - /* dispose() might be called multiple times, so we must guard against - * calling g_object_unref() on an invalid GObject by setting the member - * NULL; g_clear_object() does this for us. - */ - g_clear_object (&priv->input_stream); - - /* Always chain up to the parent class; there is no need to check if - * the parent class implements the dispose() virtual function: it is - * always guaranteed to do so - */ - G_OBJECT_CLASS (viewer_file_parent_class)->dispose (gobject); -} - -static void -viewer_file_finalize (GObject *gobject) -{ - ViewerFilePrivate *priv = viewer_file_get_instance_private (VIEWER_FILE (gobject)); - - g_free (priv->filename); - - /* Always chain up to the parent class; as with dispose(), finalize() - * is guaranteed to exist on the parent's class virtual function table - */ - G_OBJECT_CLASS (viewer_file_parent_class)->finalize (gobject); -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = viewer_file_dispose; - object_class->finalize = viewer_file_finalize; -} - -static void -viewer_file_init (ViewerFile *self); -{ - ViewerFilePrivate *priv = viewer_file_get_instance_private (self); - - priv->input_stream = g_object_new (VIEWER_TYPE_INPUT_STREAM, NULL); - priv->filename = /* would be set as a property */; -} - - - - - It is possible that object methods might be invoked after dispose is - run and before finalize runs. GObject does not consider this to be a - program error: you must gracefully detect this and neither crash nor - warn the user, by having a disposed instance revert to an inert state. - - - - - Object methods - - - Just as with C++, there are many different ways to define object - methods and extend them: the following list and sections draw on - C++ vocabulary. (Readers are expected to know basic C++ concepts. - Those who have not had to write C++ code recently can refer to e.g. - to refresh - their memories.) - - - non-virtual public methods, - - - virtual public methods and - - - virtual private methods - - - - - - Non-virtual public methods - - - These are the simplest, providing a simple method which - acts on the object. Provide a function - prototype in the header and an implementation of that prototype - in the source file. - -/* declaration in the header. */ -void viewer_file_open (ViewerFile *self, - GError **error); - -/* implementation in the source file */ -void -viewer_file_open (ViewerFile *self, - GError **error) -{ - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - /* do stuff here. */ -} - - - - - - Virtual public methods - - - This is the preferred way to create GObjects with overridable methods: - - - Define the common method and its virtual function in the - class structure in the public header - - - Define the common method in the header file and implement it in the - source file - - - Implement a base version of the virtual function in the source - file and initialize the virtual function pointer to this - implementation in the object’s class_init - function; or leave it as NULL for a ‘pure - virtual’ method which must be overridden by derived classes - - - Re-implement the virtual function in each derived class which needs - to override it - - - - - Note that virtual functions can only be defined if the class is - derivable, declared using - G_DECLARE_DERIVABLE_TYPE - so the class structure can be defined. - -/* declaration in viewer-file.h. */ -#define VIEWER_TYPE_FILE viewer_file_get_type () -G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) - -struct _ViewerFileClass -{ - GObjectClass parent_class; - - /* stuff */ - void (*open) (ViewerFile *self, - GError **error); - - /* Padding to allow adding up to 12 new virtual functions without - * breaking ABI. */ - gpointer padding[12]; -}; - -void viewer_file_open (ViewerFile *self, - GError **error); - -/* implementation in viewer-file.c */ -void -viewer_file_open (ViewerFile *self, - GError **error) -{ - ViewerFileClass *klass; - - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - klass = VIEWER_FILE_GET_CLASS (self); - g_return_if_fail (klass->open != NULL); - - klass->open (self, error); -} - - The code above simply redirects the open call - to the relevant virtual function. - - - - It is possible to provide a default - implementation for this class method in the object's - class_init function: initialize the - klass->open field to a pointer to the - actual implementation. - By default, class methods that are not inherited are initialized to - NULL, and thus are to be considered "pure virtual". - -static void -viewer_file_real_close (ViewerFile *self, - GError **error) -{ - /* Default implementation for the virtual method. */ -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - /* this is not necessary, except for demonstration purposes. - * - * pure virtual method: mandates implementation in children. - */ - klass->open = NULL; - - /* merely virtual method. */ - klass->close = viewer_file_real_close; -} - -void -viewer_file_open (ViewerFile *self, - GError **error) -{ - ViewerFileClass *klass; - - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - klass = VIEWER_FILE_GET_CLASS (self); - - /* if the method is purely virtual, then it is a good idea to - * check that it has been overridden before calling it, and, - * depending on the intent of the class, either ignore it silently - * or warn the user. - */ - g_return_if_fail (klass->open != NULL); - klass->open (self, error); -} - -void -viewer_file_close (ViewerFile *self, - GError **error) -{ - ViewerFileClass *klass; - - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - klass = VIEWER_FILE_GET_CLASS (self); - if (klass->close != NULL) - klass->close (self, error); -} - - - - - - Virtual private Methods - - - These are very similar to virtual - public methods. They just don't - have a public function to call directly. The header - file contains only a declaration of the virtual function: - -/* declaration in viewer-file.h. */ -struct _ViewerFileClass -{ - GObjectClass parent; - - /* Public virtual method as before. */ - void (*open) (ViewerFile *self, - GError **error); - - /* Private helper function to work out whether the file can be loaded via - * memory mapped I/O, or whether it has to be read as a stream. */ - gboolean (*can_memory_map) (ViewerFile *self); - - /* Padding to allow adding up to 12 new virtual functions without - * breaking ABI. */ - gpointer padding[12]; -}; - -void viewer_file_open (ViewerFile *self, GError **error); - - These virtual functions are often used to delegate part of the job - to child classes: - -/* this accessor function is static: it is not exported outside of this file. */ -static gboolean -viewer_file_can_memory_map (ViewerFile *self) -{ - return VIEWER_FILE_GET_CLASS (self)->can_memory_map (self); -} - -void -viewer_file_open (ViewerFile *self, - GError **error) -{ - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - /* - * Try to load the file using memory mapped I/O, if the implementation of the - * class determines that is possible using its private virtual method. - */ - if (viewer_file_can_memory_map (self)) - { - /* Load the file using memory mapped I/O. */ - } - else - { - /* Fall back to trying to load the file using streaming I/O… */ - } -} - - - - - Again, it is possible to provide a default implementation for this - private virtual function: - -static gboolean -viewer_file_real_can_memory_map (ViewerFile *self) -{ - /* As an example, always return false. Or, potentially return true if the - * file is local. */ - return FALSE; -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - /* non-pure virtual method; does not have to be implemented in children. */ - klass->can_memory_map = viewer_file_real_can_memory_map; -} - - - - - Derived classes can then override the method with code such as: - -static void -viewer_audio_file_class_init (ViewerAudioFileClass *klass) -{ - ViewerFileClass *file_class = VIEWER_FILE_CLASS (klass); - - /* implement pure virtual function. */ - file_class->can_memory_map = viewer_audio_file_can_memory_map; -} - - - - - - - Chaining up - - Chaining up is often loosely defined by the following set of - conditions: - - Parent class A defines a public virtual method named foo and - provides a default implementation. - Child class B re-implements method foo. - B’s implementation of foo calls (‘chains up to’) its parent class A’s implementation of foo. - - There are various uses of this idiom: - - You need to extend the behaviour of a class without modifying its code. You create - a subclass to inherit its implementation, re-implement a public virtual method to modify the behaviour - and chain up to ensure that the previous behaviour is not really modified, just extended. - - You need to implement the - Chain - Of Responsibility pattern: each object of the inheritance - tree chains up to its parent (typically, at the beginning or the end of the method) to ensure that - each handler is run in turn. - - - - - To explicitly chain up to the implementation of the virtual method in the parent class, - you first need a handle to the original parent class structure. This pointer can then be used to - access the original virtual function pointer and invoke it directly. - - - The original adjective used in this sentence is not innocuous. To fully - understand its meaning, recall how class structures are initialized: for each object type, - the class structure associated with this object is created by first copying the class structure of its - parent type (a simple memcpy) and then by invoking the class_init callback on - the resulting class structure. Since the class_init callback is responsible for overwriting the class structure - with the user re-implementations of the class methods, the modified copy of the parent class - structure stored in the derived instance cannot be used. A copy of the class structure of an instance of the parent - class is needed. - - - - - - Use the parent_class pointer created and initialized - by the - G_DEFINE_TYPE - family of macros, for instance: - -static void -b_method_to_call (B *obj, gint some_param) -{ - /* do stuff before chain up */ - - /* call the method_to_call() virtual function on the - * parent of BClass, AClass. - * - * remember the explicit cast to AClass* - */ - A_CLASS (b_parent_class)->method_to_call (obj, some_param); - - /* do stuff after chain up */ -} - - - - - - - - - - How to define and implement interfaces - - - Defining interfaces - - - The theory behind how GObject interfaces work is given in - ; this section covers how to - define and implement an interface. - - - - The first step is to get the header right. This interface - defines three methods: - -/* - * Copyright/Licensing information. - */ - -#ifndef __VIEWER_EDITABLE_H__ -#define __VIEWER_EDITABLE_H__ - -#include <glib-object.h> - -G_BEGIN_DECLS - -#define VIEWER_TYPE_EDITABLE viewer_editable_get_type () -G_DECLARE_INTERFACE (ViewerEditable, viewer_editable, VIEWER, EDITABLE, GObject) - -struct _ViewerEditableInterface -{ - GTypeInterface parent_iface; - - void (*save) (ViewerEditable *self, - GError **error); - void (*undo) (ViewerEditable *self, - guint n_steps); - void (*redo) (ViewerEditable *self, - guint n_steps); -}; - -void viewer_editable_save (ViewerEditable *self, - GError **error); -void viewer_editable_undo (ViewerEditable *self, - guint n_steps); -void viewer_editable_redo (ViewerEditable *self, - guint n_steps); - -G_END_DECLS - -#endif /* __VIEWER_EDITABLE_H__ */ - - This code is the same as the code for a normal GType - which derives from a GObject except for a few details: - - - The _GET_CLASS function is called - _GET_IFACE (and is defined by - G_DECLARE_INTERFACE). - - - The instance type, ViewerEditable, is not fully defined: it is - used merely as an abstract type which represents an instance of - whatever object which implements the interface. - - - The parent of the ViewerEditableInterface is - GTypeInterface, not GObjectClass. - - - - - - The implementation of the ViewerEditable type itself is trivial: - - G_DEFINE_INTERFACE - creates a viewer_editable_get_type function which registers the - type in the type system. The third argument is used to define a - prerequisite interface - (which we'll talk about more later). Just pass 0 for this - argument when an interface has no prerequisite. - - viewer_editable_default_init is expected - to register the interface's signals if there are any (we will see a bit - later how to use them). - The interface methods viewer_editable_save, - viewer_editable_undo and viewer_editable_redo dereference the interface - structure to access its associated interface function and call it. - - - -G_DEFINE_INTERFACE (ViewerEditable, viewer_editable, G_TYPE_OBJECT) - -static void -viewer_editable_default_init (ViewerEditableInterface *iface) -{ - /* add properties and signals to the interface here */ -} - -void -viewer_editable_save (ViewerEditable *self, - GError **error) -{ - ViewerEditableInterface *iface; - - g_return_if_fail (VIEWER_IS_EDITABLE (self)); - g_return_if_fail (error == NULL || *error == NULL); - - iface = VIEWER_EDITABLE_GET_IFACE (self); - g_return_if_fail (iface->save != NULL); - iface->save (self, error); -} - -void -viewer_editable_undo (ViewerEditable *self, - guint n_steps) -{ - ViewerEditableInterface *iface; - - g_return_if_fail (VIEWER_IS_EDITABLE (self)); - - iface = VIEWER_EDITABLE_GET_IFACE (self); - g_return_if_fail (iface->undo != NULL); - iface->undo (self, n_steps); -} - -void -viewer_editable_redo (ViewerEditable *self, - guint n_steps) -{ - ViewerEditableInterface *iface; - - g_return_if_fail (VIEWER_IS_EDITABLE (self)); - - iface = VIEWER_EDITABLE_GET_IFACE (self); - g_return_if_fail (iface->redo != NULL); - iface->redo (self, n_steps); -} - - - - - - Implementing interfaces - - - Once the interface is defined, implementing it is rather trivial. - - - - The first step is to define a normal final GObject class exactly as in - . - - - - The second step is to implement ViewerFile by defining - it using - G_DEFINE_TYPE_WITH_CODE - and - G_IMPLEMENT_INTERFACE - instead of - G_DEFINE_TYPE: - -static void viewer_file_editable_interface_init (ViewerEditableInterface *iface); - -G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_file_editable_interface_init)) - - This definition is very much like all the similar functions seen - previously. The only interface-specific code present here is the use of - G_IMPLEMENT_INTERFACE. - - - Classes can implement multiple interfaces by using multiple calls to - G_IMPLEMENT_INTERFACE - inside the call to - G_DEFINE_TYPE_WITH_CODE - - - - viewer_file_editable_interface_init, the interface - initialization function: inside it every virtual method of the interface - must be assigned to its implementation: - -static void -viewer_file_editable_save (ViewerFile *self, - GError **error) -{ - g_print ("File implementation of editable interface save method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_undo (ViewerFile *self, - guint n_steps) -{ - g_print ("File implementation of editable interface undo method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_redo (ViewerFile *self, - guint n_steps) -{ - g_print ("File implementation of editable interface redo method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_interface_init (ViewerEditableInterface *iface) -{ - iface->save = viewer_file_editable_save; - iface->undo = viewer_file_editable_undo; - iface->redo = viewer_file_editable_redo; -} - -static void -viewer_file_init (ViewerFile *self) -{ - /* Instance variable initialisation code. */ -} - - - - If the object is not of final type, e.g. was declared using - G_DECLARE_DERIVABLE_TYPE - then - G_ADD_PRIVATE - macro should be added. The private structure should be declared exactly - as for a normal derivable object, see . - -G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, - G_ADD_PRIVATE (ViewerFile) - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_file_editable_interface_init)) - - - - - - Interface definition prerequisites - - - To specify that an interface requires the presence of other interfaces - when implemented, GObject introduces the concept of - prerequisites: it is possible to associate - a list of prerequisite types to an interface. For example, if - object A wishes to implement interface I1, and if interface I1 has a - prerequisite on interface I2, A has to implement both I1 and I2. - - - - The mechanism described above is, in practice, very similar to - Java's interface I1 extends interface I2. The example below shows - the GObject equivalent: - -/* Make the ViewerEditableLossy interface require ViewerEditable interface. */ -G_DEFINE_INTERFACE (ViewerEditableLossy, viewer_editable_lossy, VIEWER_TYPE_EDITABLE) - - In the G_DEFINE_INTERFACE - call above, the third parameter defines the prerequisite type. This - is the GType of either an interface or a class. In this case - the ViewerEditable interface is a prerequisite of - ViewerEditableLossy. The code - below shows how an implementation can implement both interfaces and - register their implementations: - -static void -viewer_file_editable_lossy_compress (ViewerEditableLossy *editable) -{ - ViewerFile *self = VIEWER_FILE (editable); - - g_print ("File implementation of lossy editable interface compress method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_lossy_interface_init (ViewerEditableLossyInterface *iface) -{ - iface->compress = viewer_file_editable_lossy_compress; -} - -static void -viewer_file_editable_save (ViewerEditable *editable, - GError **error) -{ - ViewerFile *self = VIEWER_FILE (editable); - - g_print ("File implementation of editable interface save method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_undo (ViewerEditable *editable, - guint n_steps) -{ - ViewerFile *self = VIEWER_FILE (editable); - - g_print ("File implementation of editable interface undo method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_redo (ViewerEditable *editable, - guint n_steps) -{ - ViewerFile *self = VIEWER_FILE (editable); - - g_print ("File implementation of editable interface redo method: %s.\n", - self->filename); -} - -static void -viewer_file_editable_interface_init (ViewerEditableInterface *iface) -{ - iface->save = viewer_file_editable_save; - iface->undo = viewer_file_editable_undo; - iface->redo = viewer_file_editable_redo; -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - /* Nothing here. */ -} - -static void -viewer_file_init (ViewerFile *self) -{ - /* Instance variable initialisation code. */ -} - -G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_file_editable_interface_init) - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE_LOSSY, - viewer_file_editable_lossy_interface_init)) - - It is very important to notice that the order in which interface - implementations are added to the main object is not random: - g_type_add_interface_static, - which is called by - G_IMPLEMENT_INTERFACE, - must be invoked first on the interfaces which have no prerequisites and then on - the others. - - - - - Interface properties - - - GObject interfaces can also have - properties. Declaration of the interface properties is similar to - declaring the properties of ordinary GObject types as explained in - , except that - g_object_interface_install_property - is used to declare the properties instead of - g_object_class_install_property. - - - - To include a property named 'autosave-frequency' of type gdouble in the - ViewerEditable interface example code above, we only need to - add one call in viewer_editable_default_init as shown - below: - -static void -viewer_editable_default_init (ViewerEditableInterface *iface) -{ - g_object_interface_install_property (iface, - g_param_spec_double ("autosave-frequency", - "Autosave frequency", - "Frequency (in per-seconds) to autosave backups of the editable content at. " - "Or zero to disable autosaves.", - 0.0, /* minimum */ - G_MAXDOUBLE, /* maximum */ - 0.0, /* default */ - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); -} - - - - - One point worth noting is that the declared property wasn't assigned an - integer ID. The reason being that integer IDs of properties are used - only inside the get_property and - set_property virtual methods. Since interfaces - declare but do not implement properties, there is no - need to assign integer IDs to them. - - - - An implementation declares and defines its properties in the usual - way as explained in , except for one - small change: it can declare the properties of the interface it - implements using g_object_class_override_property - instead of g_object_class_install_property. - The following code snippet shows the modifications needed in the - ViewerFile declaration and implementation above: - -struct _ViewerFile -{ - GObject parent_instance; - - gdouble autosave_frequency; -}; - -enum -{ - PROP_AUTOSAVE_FREQUENCY = 1, - N_PROPERTIES -}; - -static void -viewer_file_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - ViewerFile *file = VIEWER_FILE (object); - - switch (prop_id) - { - case PROP_AUTOSAVE_FREQUENCY: - file->autosave_frequency = g_value_get_double (value); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -viewer_file_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - ViewerFile *file = VIEWER_FILE (object); - - switch (prop_id) - { - case PROP_AUTOSAVE_FREQUENCY: - g_value_set_double (value, file->autosave_frequency); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -viewer_file_class_init (ViewerFileClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = viewer_file_set_property; - object_class->get_property = viewer_file_get_property; - - g_object_class_override_property (object_class, PROP_AUTOSAVE_FREQUENCY, "autosave-frequency"); -} - - - - - - - Overriding interface methods - - - If a base class already implements an interface and a derived - class needs to implement the same interface but needs to override certain - methods, you must reimplement the interface and set only the interface - methods which need overriding. - - - - In this example, ViewerAudioFile is derived from - ViewerFile. Both implement the ViewerEditable - interface. ViewerAudioFile only implements one method of the - ViewerEditable interface and uses the base class implementation of - the other. - -static void -viewer_audio_file_editable_save (ViewerEditable *editable, - GError **error) -{ - ViewerAudioFile *self = VIEWER_AUDIO_FILE (editable); - - g_print ("Audio file implementation of editable interface save method.\n"); -} - -static void -viewer_audio_file_editable_interface_init (ViewerEditableInterface *iface) -{ - /* Override the implementation of save(). */ - iface->save = viewer_audio_file_editable_save; - - /* - * Leave iface->undo and ->redo alone, they are already set to the - * base class implementation. - */ -} - -G_DEFINE_TYPE_WITH_CODE (ViewerAudioFile, viewer_audio_file, VIEWER_TYPE_FILE, - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_audio_file_editable_interface_init)) - -static void -viewer_audio_file_class_init (ViewerAudioFileClass *klass) -{ - /* Nothing here. */ -} - -static void -viewer_audio_file_init (ViewerAudioFile *self) -{ - /* Nothing here. */ -} - - - - - To access the base class interface implementation use - g_type_interface_peek_parent - from within an interface's default_init function. - - - - To call the base class implementation of an interface - method from a derived class where than interface method has been - overridden, stash away the pointer returned from - g_type_interface_peek_parent - in a global variable. - - - - In this example ViewerAudioFile overrides the - save interface method. In its overridden method - it calls the base class implementation of the same interface method. - -static ViewerEditableInterface *viewer_editable_parent_interface = NULL; - -static void -viewer_audio_file_editable_save (ViewerEditable *editable, - GError **error) -{ - ViewerAudioFile *self = VIEWER_AUDIO_FILE (editable); - - g_print ("Audio file implementation of editable interface save method.\n"); - - /* Now call the base implementation */ - viewer_editable_parent_interface->save (editable, error); -} - -static void -viewer_audio_file_editable_interface_init (ViewerEditableInterface *iface) -{ - viewer_editable_parent_interface = g_type_interface_peek_parent (iface); - - iface->save = viewer_audio_file_editable_save; -} - -G_DEFINE_TYPE_WITH_CODE (ViewerAudioFile, viewer_audio_file, VIEWER_TYPE_FILE, - G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, - viewer_audio_file_editable_interface_init)) - -static void -viewer_audio_file_class_init (ViewerAudioFileClass *klass) -{ - /* Nothing here. */ -} - -static void -viewer_audio_file_init (ViewerAudioFile *self) -{ - /* Nothing here. */ -} - - - - - - - - - - How to create and use signals - - - The signal system in GType is pretty complex and - flexible: it is possible for its users to connect at runtime any - number of callbacks (implemented in any language for which a binding - exists) - - A Python callback can be connected to any signal on any - C-based GObject, and vice versa, assuming that the Python object - inherits from GObject. - - to any signal and to stop the emission of any signal at any - state of the signal emission process. This flexibility makes it - possible to use GSignal for much more than just emitting signals to - multiple clients. - - - - Simple use of signals - - - The most basic use of signals is to implement event - notification. For example, given a ViewerFile object with - a write method, a signal could be emitted whenever - the file is changed using that method. - The code below shows how the user can connect a callback to the - "changed" signal. - -file = g_object_new (VIEWER_FILE_TYPE, NULL); - -g_signal_connect (file, "changed", (GCallback) changed_event, NULL); - -viewer_file_write (file, buffer, strlen (buffer)); - - - - - The ViewerFile signal is registered in the - class_init function: - -file_signals[CHANGED] = - g_signal_newv ("changed", - G_TYPE_FROM_CLASS (object_class), - G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, - NULL /* closure */, - NULL /* accumulator */, - NULL /* accumulator data */, - NULL /* C marshaller */, - G_TYPE_NONE /* return_type */, - 0 /* n_params */, - NULL /* param_types */); - - and the signal is emitted in viewer_file_write: - -void -viewer_file_write (ViewerFile *self, - const guint8 *buffer, - gsize size) -{ - g_return_if_fail (VIEWER_IS_FILE (self)); - g_return_if_fail (buffer != NULL || size == 0); - - /* First write data. */ - - /* Then, notify user of data written. */ - g_signal_emit (self, file_signals[CHANGED], 0 /* details */); -} - - As shown above, the details parameter can safely be set to zero if no - detail needs to be conveyed. For a discussion of what it can be used for, - see - - - - The C signal marshaller should always be NULL, in which - case the best marshaller for the given closure type will be chosen by - GLib. This may be an internal marshaller specific to the closure type, or - g_cclosure_marshal_generic, which implements generic - conversion of arrays of parameters to C callback invocations. GLib used to - require the user to write or generate a type-specific marshaller and pass - that, but that has been deprecated in favour of automatic selection of - marshallers. - - - - Note that g_cclosure_marshal_generic is slower than - non-generic marshallers, so should be avoided for performance critical - code. However, performance critical code should rarely be using signals - anyway, as emitting a signal blocks on emitting it to all listeners, which - has potentially unbounded cost. - - - - diff --git a/docs/reference/gobject/tut_intro.xml b/docs/reference/gobject/tut_intro.xml deleted file mode 100644 index 87e8a49..0000000 --- a/docs/reference/gobject/tut_intro.xml +++ /dev/null @@ -1,185 +0,0 @@ - - - - Background - - - GObject, and its lower-level type system, GType, are used by GTK and most GNOME libraries to - provide: - - object-oriented C-based APIs and - automatic transparent API bindings to other compiled - or interpreted languages. - - - - - A lot of programmers are used to working with compiled-only or dynamically interpreted-only - languages and do not understand the challenges associated with cross-language interoperability. - This introduction tries to provide an insight into these challenges and briefly describes - the solution chosen by GLib. - - - - The following chapters go into greater detail into how GType and GObject work and - how you can use them as a C programmer. It is useful to keep in mind that - allowing access to C objects from other interpreted languages was one of the major design - goals: this can often explain the sometimes rather convoluted APIs and features present - in this library. - - - - Data types and programming - - - One could say - that a programming language is merely a way to create data types and manipulate them. Most languages - provide a number of language-native types and a few primitives to create more complex types based - on these primitive types. - - - - In C, the language provides types such as char, long, - pointer. During compilation of C code, the compiler maps these - language types to the compiler's target architecture machine types. If you are using a C interpreter - (assuming one exists), the interpreter (the program which interprets - the source code and executes it) maps the language types to the machine types of the target machine at - runtime, during the program execution (or just before execution if it uses a Just In Time compiler engine). - - - - Perl and Python are interpreted languages which do not really provide type definitions similar - to those used by C. Perl and Python programmers manipulate variables and the type of the variables - is decided only upon the first assignment or upon the first use which forces a type on the variable. - The interpreter also often provides a lot of automatic conversions from one type to the other. For example, - in Perl, a variable which holds an integer can be automatically converted to a string given the - required context: - -my $tmp = 10; -print "this is an integer converted to a string:" . $tmp . "\n"; - - Of course, it is also often possible to explicitly specify conversions when the default conversions provided - by the language are not intuitive. - - - - - - Exporting a C API - - - C APIs are defined by a set of functions and global variables which are usually exported from a - binary. C functions have an arbitrary number of arguments and one return value. Each function is thus - uniquely identified by the function name and the set of C types which describe the function arguments - and return value. The global variables exported by the API are similarly identified by their name and - their type. - - - - A C API is thus merely defined by a set of names to which a set of types are associated. If you know the - function calling convention and the mapping of the C types to the machine types used by the platform you - are on, you can resolve the name of each function to find where the code associated to this function - is located in memory, and then construct a valid argument list for the function. Finally, all you have to - do is trigger a call to the target C function with the argument list. - - - - For the sake of discussion, here is a sample C function and the associated 32 bit x86 - assembly code generated by GCC on a Linux computer: - -static void -function_foo (int foo) -{ -} - -int -main (int argc, - char *argv[]) -{ - function_foo (10); - - return 0; -} - -push $0xa -call 0x80482f4 <function_foo> - - The assembly code shown above is pretty straightforward: the first instruction pushes - the hexadecimal value 0xa (decimal value 10) as a 32-bit integer on the stack and calls - function_foo. As you can see, C function calls are implemented by - GCC as native function calls (this is probably the fastest implementation possible). - - - - Now, let's say we want to call the C function function_foo from - a Python program. To do this, the Python interpreter needs to: - - Find where the function is located. This probably means finding the binary generated by the C compiler - which exports this function. - Load the code of the function in executable memory. - Convert the Python parameters to C-compatible parameters before calling - the function. - Call the function with the right calling convention. - Convert the return values of the C function to Python-compatible - variables to return them to the Python code. - - - - - The process described above is pretty complex and there are a lot of ways to make it entirely automatic - and transparent to C and Python programmers: - - The first solution is to write by hand a lot of glue code, once for each function exported or imported, - which does the Python-to-C parameter conversion and the C-to-Python return value conversion. This glue code is then - linked with the interpreter which allows Python programs to call Python functions which delegate work to - C functions. - Another, nicer solution is to automatically generate the glue code, once for each function exported or - imported, with a special compiler which - reads the original function signature. - The solution used by GLib is to use the GType library which holds at runtime a description of - all the objects manipulated by the programmer. This so-called dynamic type - - - There are numerous different implementations of dynamic type systems: all C++ - compilers have one, Java and .NET have one too. A dynamic type system allows you - to get information about every instantiated object at runtime. It can be implemented - by a process-specific database: every new object created registers the characteristics - of its associated type in the type system. It can also be implemented by introspection - interfaces. The common point between all these different type systems and implementations - is that they all allow you to query for object metadata at runtime. - - - library is then used by special generic glue code to automatically convert function parameters and - function calling conventions between different runtime domains. - - The greatest advantage of the solution implemented by GType is that the glue code sitting at the runtime domain - boundaries is written once: the figure below states this more clearly. -
- - - - - - - - -
- - Currently, there exist at least Python and Perl generic glue code which makes it possible to use - C objects written with GType directly in Python or Perl, with a minimum amount of work: there - is no need to generate huge amounts of glue code either automatically or by hand. -
- - - Although that goal was arguably laudable, its pursuit has had a major influence on - the whole GType/GObject library. C programmers are likely to be puzzled at the complexity - of the features exposed in the following chapters if they forget that the GType/GObject library - was not only designed to offer OO-like features to C programmers but also transparent - cross-language interoperability. - - -
- -
diff --git a/docs/reference/gobject/tut_tools.xml b/docs/reference/gobject/tut_tools.xml deleted file mode 100644 index c56431e..0000000 --- a/docs/reference/gobject/tut_tools.xml +++ /dev/null @@ -1,125 +0,0 @@ - - - - Related Tools - - - - Several useful developer tools have been build around GObject - technology. The next sections briefly introduce them and link to - the respective project pages. - - - - For example, writing GObjects is often seen as a tedious task. It - requires a lot of typing and just doing a copy/paste requires a - great deal of care. A lot of projects and scripts have been - written to generate GObject skeleton form boilerplate code, or - even translating higher-level language into plain C. - - - - - Vala - - From the Vala - homepage itself: Vala is a new programming language - that aims to bring modern programming language features to GNOME - developers without imposing any additional runtime requirements - and without using a different ABI compared to applications and - libraries written in C. - - - - The syntax of Vala is similar to C#. The available compiler - translates Vala into GObject C code. It can also compile - non-GObject C, using plain C API. - - - - - GObject builder - - - In order to help a GObject class developer, one obvious idea is - to use some sort of templates for the skeletons and then run - them through a special tool to generate the real C files. GOB (or GOB2) is - such a tool. It is a preprocessor which can be used to build - GObjects with inline C code so that there is no need to edit the - generated C code. The syntax is inspired by Java and Yacc or - Lex. The implementation is intentionally kept simple: the inline C - code provided by the user is not parsed. - - - - - Graphical inspection of GObjects - - - Yet another tool that you may find helpful when working with - GObjects is G-Inspector. It - is able to display GLib/GTK objects and their properties. - - - - - Debugging reference count problems - - - The reference counting scheme used by GObject does solve quite - a few memory management problems but also introduces new sources of bugs. - In large applications, finding the exact spot where the reference count - of an Object is not properly handled can be very difficult. - - - A useful tool in debugging reference counting problems is to - set breakpoints in gdb on g_object_ref() and g_object_unref(). - Once you know the address of the object you are interested in, - you can make the breakpoints conditional: - -break g_object_ref if _object == 0xcafebabe -break g_object_unref if _object == 0xcafebabe - - - - - - Writing API docs - - The API documentation for most of the GLib, GObject, GTK and GNOME - libraries is built with a combination of complex tools. Typically, the part of - the documentation which describes the behavior of each function is extracted - from the specially-formatted source code comments by a tool named gtk-doc which - generates DocBook XML and merges this DocBook XML with a set of template XML - DocBook files. These XML DocBook files are finally processed with xsltproc - (a small program part of the libxslt library) to generate the final HTML - output. Other tools can be used to generate PDF output from the source XML. - The following code excerpt shows what these comments look like. - -/** - * gtk_widget_freeze_child_notify: - * @widget: a #GtkWidget - * - * Stops emission of "child-notify" signals on @widget. The signals are - * queued until gtk_widget_thaw_child_notify() is called on @widget. - * - * This is the analogue of g_object_freeze_notify() for child properties. - **/ -void -gtk_widget_freeze_child_notify (GtkWidget *widget) -{ -... - - - - Thorough - documentation - on how to set up and use gtk-doc in your project is provided on the - GNOME developer website. - - - diff --git a/docs/reference/gobject/tutorial.md b/docs/reference/gobject/tutorial.md new file mode 100644 index 0000000..ec5eab9 --- /dev/null +++ b/docs/reference/gobject/tutorial.md @@ -0,0 +1,1288 @@ +Title: GObject Tutorial + +# GObject Tutorial + +## How to define and implement a new GObject + +This document focuses on the implementation of a subtype of GObject, for +example to create a custom class hierarchy, or to subclass a GTK widget. + +Throughout the chapter, a running example of a file viewer program is used, +which has a `ViewerFile` class to represent a single file being viewed, and +various derived classes for different types of files with special +functionality, such as audio files. The example application also supports +editing files (for example, to tweak a photo being viewed), using a +`ViewerEditable` interface. + +### Boilerplate header code + +The first step before writing the code for your GObject is to write the +type's header which contains the needed type, function and macro +definitions. Each of these elements is nothing but a convention which is +followed by almost all users of GObject, and has been refined over multiple +years of experience developing GObject-based code. If you are writing a +library, it is particularly important for you to adhere closely to these +conventions; users of your library will assume that you have. Even if not +writing a library, it will help other people who want to work on your +project. + +Pick a name convention for your headers and source code and stick to it: + +- use a dash to separate the prefix from the typename: `viewer-file.h` and + `viewer-file.c` (this is the convention used by most GNOME libraries and + applications) +- use an underscore to separate the prefix from the typename: + `viewer_file.h` and `viewer_file.c` +- do not separate the prefix from the typename: `viewerfile.h` and + `viewerfile.c` (this is the convention used by GTK) + +Some people like the first two solutions better: it makes reading file names +easier for those with poor eyesight. + +The basic conventions for any header which exposes a GType are described in +the section of the Type system introduction called +["Conventions"](concepts.html#conventions). + +If you want to declare a type named "file" in the namespace "viewer", name +the type instance `ViewerFile` and its class `ViewerFileClass` (names are +case sensitive). The recommended method of declaring a type differs based on +whether the type is final or derivable. + +Final types cannot be subclassed further, and should be the default choice +for new types—changing a final type to be derivable is always a change that +will be compatible with existing uses of the code, but the converse will +often cause problems. Final types are declared using the +`G_DECLARE_FINAL_TYPE` macro, and require a structure to hold the instance +data to be declared in the source code (not the header file). + +```c +/* + * Copyright/Licensing information. + */ + +/* inclusion guard */ +#pragma once + +#include + +/* + * Potentially, include other headers on which this header depends. + */ + +G_BEGIN_DECLS + +/* + * Type declaration. + */ +#define VIEWER_TYPE_FILE viewer_file_get_type() +G_DECLARE_FINAL_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) + +/* + * Method definitions. + */ +ViewerFile *viewer_file_new (void); + +G_END_DECLS +``` + +Derivable types can be subclassed further, and their class and instance +structures form part of the public API which must not be changed if API +stability is cared about. They are declared using the +`G_DECLARE_DERIVABLE_TYPE` macro: + +```c +/* + * Copyright/Licensing information. + */ + +/* inclusion guard */ +#pragma once + +#include + +/* + * Potentially, include other headers on which this header depends. + */ + +G_BEGIN_DECLS + +/* + * Type declaration. + */ +#define VIEWER_TYPE_FILE viewer_file_get_type() +G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) + +struct _ViewerFileClass +{ + GObjectClass parent_class; + + /* Class virtual function fields. */ + void (* open) (ViewerFile *file, + GError **error); + + /* Padding to allow adding up to 12 new virtual functions without + * breaking ABI. */ + gpointer padding[12]; +}; + +/* + * Method definitions. + */ +ViewerFile *viewer_file_new (void); + +G_END_DECLS +``` + +The convention for header includes is to add the minimum number of +`#include` directives to the top of your headers needed to compile that +header. This allows client code to simply `#include "viewer-file.h"`, +without needing to know the prerequisites for `viewer-file.h`. + +### Boilerplate code + +In your code, the first step is to `#include` the needed headers: + +```c +/* + * Copyright/Licensing information + */ + +#include "viewer-file.h" + +/* Private structure definition. */ +typedef struct { + char *filename; + + /* other private fields */ +} ViewerFilePrivate; + +/* + * forward definitions + */ +``` + +If the class is being declared as final using `G_DECLARE_FINAL_TYPE`, its instance structure should be defined in the C file: + +```c +struct _ViewerFile +{ + GObject parent_instance; + + /* Other members, including private data. */ +}; +``` + +Call the `G_DEFINE_TYPE` macro (or `G_DEFINE_TYPE_WITH_PRIVATE` if your +class needs private data—final types do not need private data) using the +name of the type, the prefix of the functions and the parent GType to reduce +the amount of boilerplate needed. This macro will: + +- implement the `viewer_file_get_type` function +- define a parent class pointer accessible from the whole `.c` file +- add private instance data to the type (if using `G_DEFINE_TYPE_WITH_PRIVATE`) + +If the class has been declared as final using `G_DECLARE_FINAL_TYPE` private +data should be placed in the instance structure, `ViewerFile`, and +`G_DEFINE_TYPE` should be used instead of `G_DEFINE_TYPE_WITH_PRIVATE`. The +instance structure for a final class is not exposed publicly, and is not +embedded in the instance structures of any derived classes (because the +class is final); so its size can vary without causing incompatibilities for +code which uses the class. Conversely, private data for derivable classes +must be included in a private structure, and `G_DEFINE_TYPE_WITH_PRIVATE` +must be used. + +```c +G_DEFINE_TYPE (ViewerFile, viewer_file, G_TYPE_OBJECT) +``` + +or + +```c +G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) +``` + +It is also possible to use the `G_DEFINE_TYPE_WITH_CODE` macro to control +the `get_type` function implementation — for instance, to add a call to the +`G_IMPLEMENT_INTERFACE` macro to implement an interface. + +### Object construction + +People often get confused when trying to construct their GObjects because of +the sheer number of different ways to hook into the objects's construction +process: it is difficult to figure which is the correct, recommended way. + +The [documentation on object +instantiation](concepts.html#object-instantiation) shows what user-provided +functions are invoked during object instantiation and in which order they +are invoked. A user looking for the equivalent of the simple C++ constructor +function should use the `instance_init` method. It will be invoked after all +the parents’ `instance_init` functions have been invoked. It cannot take +arbitrary construction parameters (as in C++) but if your object needs +arbitrary parameters to complete initialization, you can use construction +properties. + +Construction properties will be set only after all `instance_init` functions have run. No object reference will be returned to the client of `g_object_new()` until all the construction properties have been set. + +It is important to note that object construction cannot ever fail. If you +require a fallible GObject construction, you can use the `GInitable` and +`GAsyncInitable` interfaces provided by the GIO library. + +You should write the following code first: + +```c +G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ +} + +static void +viewer_file_init (ViewerFile *self) +{ + ViewerFilePrivate *priv = viewer_file_get_instance_private (self); + + /* initialize all public and private members to reasonable default values. + * They are all automatically initialized to 0 to begin with. */ +} +``` + +If you need special construction properties (with `G_PARAM_CONSTRUCT_ONLY` +set), install the properties in the `class_init()` function, override the +`set_property()` and `get_property()` methods of the GObject class, and +implement them as described by the section called ["Object +properties"](concepts.html#object-properties). + +Property identifiers must start from 1, as 0 is reserved for internal use by GObject. + +```c +enum +{ + PROP_FILENAME = 1, + PROP_ZOOM_LEVEL, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, }; + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = viewer_file_set_property; + object_class->get_property = viewer_file_get_property; + + obj_properties[PROP_FILENAME] = + g_param_spec_string ("filename", + "Filename", + "Name of the file to load and display from.", + NULL /* default value */, + G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE); + + obj_properties[PROP_ZOOM_LEVEL] = + g_param_spec_uint ("zoom-level", + "Zoom level", + "Zoom level to view the file at.", + 0 /* minimum value */, + 10 /* maximum value */, + 2 /* default value */, + G_PARAM_READWRITE); + + g_object_class_install_properties (object_class, + N_PROPERTIES, + obj_properties); +} +``` + +If you need this, make sure you can build and run code similar to the code +shown above. Also, make sure your construct properties can be set without +side effects during construction. + +Some people sometimes need to complete the initialization of an instance of +a type only after the properties passed to the constructors have been set. +This is possible through the use of the `constructor()` class method as +described in the section called "Object instantiation" or, more simply, +using the `constructed()` class method. Note that the `constructed()` virtual +function will only be invoked after the properties marked as +`G_PARAM_CONSTRUCT_ONLY` or `G_PARAM_CONSTRUCT` have been consumed, but before +the regular properties passed to `g_object_new()` have been set. + +### Object destruction + +Again, it is often difficult to figure out which mechanism to use to hook +into the object's destruction process: when the last `g_object_unref()` function +call is made, a lot of things happen as described in [the "Object memory +management" section](concepts.html#object-memory-management) of the +documentation. + +The destruction process of your object is in two phases: dispose and +finalize. This split is necessary to handle potential cycles due to the +nature of the reference counting mechanism used by GObject, as well as +dealing with temporary revival of instances in case of signal emission +during the destruction sequence. + +```c +struct _ViewerFilePrivate +{ + gchar *filename; + guint zoom_level; + + GInputStream *input_stream; +}; + +G_DEFINE_TYPE_WITH_PRIVATE (ViewerFile, viewer_file, G_TYPE_OBJECT) + +static void +viewer_file_dispose (GObject *gobject) +{ + ViewerFilePrivate *priv = viewer_file_get_instance_private (VIEWER_FILE (gobject)); + + /* In dispose(), you are supposed to free all types referenced from this + * object which might themselves hold a reference to self. Generally, + * the most simple solution is to unref all members on which you own a + * reference. + */ + + /* dispose() might be called multiple times, so we must guard against + * calling g_object_unref() on an invalid GObject by setting the member + * NULL; g_clear_object() does this for us. + */ + g_clear_object (&priv->input_stream); + + /* Always chain up to the parent class; there is no need to check if + * the parent class implements the dispose() virtual function: it is + * always guaranteed to do so + */ + G_OBJECT_CLASS (viewer_file_parent_class)->dispose (gobject); +} + +static void +viewer_file_finalize (GObject *gobject) +{ + ViewerFilePrivate *priv = viewer_file_get_instance_private (VIEWER_FILE (gobject)); + + g_free (priv->filename); + + /* Always chain up to the parent class; as with dispose(), finalize() + * is guaranteed to exist on the parent's class virtual function table + */ + G_OBJECT_CLASS (viewer_file_parent_class)->finalize (gobject); +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = viewer_file_dispose; + object_class->finalize = viewer_file_finalize; +} + +static void +viewer_file_init (ViewerFile *self); +{ + ViewerFilePrivate *priv = viewer_file_get_instance_private (self); + + priv->input_stream = g_object_new (VIEWER_TYPE_INPUT_STREAM, NULL); + priv->filename = /* would be set as a property */; +} +``` + +It is possible that object methods might be invoked after dispose is run and +before finalize runs. GObject does not consider this to be a program error: +you must gracefully detect this and neither crash nor warn the user, by +having a disposed instance revert to an inert state. + +### Object methods + +Just as with C++, there are many different ways to define object methods and +extend them: the following list and sections draw on C++ vocabulary. +(Readers are expected to know basic C++ concepts. Those who have not had to +write C++ code recently can refer to a [C++ +tutorial](http://www.cplusplus.com/doc/tutorial/) to refresh their +memories.) + +- non-virtual public methods, +- virtual public methods and +- virtual private methods +- non-virtual private methods + +#### Non-Virtual Methods + +These are the simplest, providing a simple method which acts on the object. +Provide a function prototype in the header and an implementation of that +prototype in the source file. + +```c +/* declaration in the header. */ +void viewer_file_open (ViewerFile *self, + GError **error); +``` + +```c +/* implementation in the source file */ +void +viewer_file_open (ViewerFile *self, + GError **error) +{ + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + /* do stuff here. */ +} +``` + +#### Virtual public methods + +This is the preferred way to create GObjects with overridable methods: + +- define the common method and its virtual function in the class structure + in the public header +- define the common method in the header file and implement it in the source + file +- implement a base version of the virtual function in the source file and + initialize the virtual function pointer to this implementation in the + object’s `class_init` function; or leave it as `NULL` for a ‘pure virtual’ + method which must be overridden by derived classes +- re-implement the virtual function in each derived class which needs to + override it + +Note that virtual functions can only be defined if the class is derivable, +declared using `G_DECLARE_DERIVABLE_TYPE` so the class structure can be +defined. + +```c +/* declaration in viewer-file.h. */ +#define VIEWER_TYPE_FILE viewer_file_get_type () +G_DECLARE_DERIVABLE_TYPE (ViewerFile, viewer_file, VIEWER, FILE, GObject) + +struct _ViewerFileClass +{ + GObjectClass parent_class; + + /* stuff */ + void (*open) (ViewerFile *self, + GError **error); + + /* Padding to allow adding up to 12 new virtual functions without + * breaking ABI. */ + gpointer padding[12]; +}; + +void viewer_file_open (ViewerFile *self, + GError **error); +``` + +```c +/* implementation in viewer-file.c */ +void +viewer_file_open (ViewerFile *self, + GError **error) +{ + ViewerFileClass *klass; + + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + klass = VIEWER_FILE_GET_CLASS (self); + g_return_if_fail (klass->open != NULL); + + klass->open (self, error); +} +``` + +The code above simply redirects the open call to the relevant virtual +function. + +It is possible to provide a default implementation for this class method in +the object's `class_init` function: initialize the `klass->open` field to a +pointer to the actual implementation. By default, class methods that are not +inherited are initialized to `NULL`, and thus are to be considered "pure +virtual". + +```c +static void +viewer_file_real_close (ViewerFile *self, + GError **error) +{ + /* Default implementation for the virtual method. */ +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + /* this is not necessary, except for demonstration purposes. + * + * pure virtual method: mandates implementation in children. + */ + klass->open = NULL; + + /* merely virtual method. */ + klass->close = viewer_file_real_close; +} + +void +viewer_file_open (ViewerFile *self, + GError **error) +{ + ViewerFileClass *klass; + + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + klass = VIEWER_FILE_GET_CLASS (self); + + /* if the method is purely virtual, then it is a good idea to + * check that it has been overridden before calling it, and, + * depending on the intent of the class, either ignore it silently + * or warn the user. + */ + g_return_if_fail (klass->open != NULL); + klass->open (self, error); +} + +void +viewer_file_close (ViewerFile *self, + GError **error) +{ + ViewerFileClass *klass; + + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + klass = VIEWER_FILE_GET_CLASS (self); + if (klass->close != NULL) + klass->close (self, error); +} +``` + +#### Virtual private Methods + +These are very similar to virtual public methods. They just don't have a +public function to call directly. The header file contains only a +declaration of the virtual function: + +```c +/* declaration in viewer-file.h. */ +struct _ViewerFileClass +{ + GObjectClass parent; + + /* Public virtual method as before. */ + void (*open) (ViewerFile *self, + GError **error); + + /* Private helper function to work out whether the file can be loaded via + * memory mapped I/O, or whether it has to be read as a stream. */ + gboolean (*can_memory_map) (ViewerFile *self); + + /* Padding to allow adding up to 12 new virtual functions without + * breaking ABI. */ + gpointer padding[12]; +}; + +void viewer_file_open (ViewerFile *self, GError **error); +``` + +These virtual functions are often used to delegate part of the job to child classes: + +```c +/* this accessor function is static: it is not exported outside of this file. */ +static gboolean +viewer_file_can_memory_map (ViewerFile *self) +{ + return VIEWER_FILE_GET_CLASS (self)->can_memory_map (self); +} + +void +viewer_file_open (ViewerFile *self, + GError **error) +{ + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + /* + * Try to load the file using memory mapped I/O, if the implementation of the + * class determines that is possible using its private virtual method. + */ + if (viewer_file_can_memory_map (self)) + { + /* Load the file using memory mapped I/O. */ + } + else + { + /* Fall back to trying to load the file using streaming I/O… */ + } +} +``` + +Again, it is possible to provide a default implementation for this private virtual function: + +```c +static gboolean +viewer_file_real_can_memory_map (ViewerFile *self) +{ + /* As an example, always return false. Or, potentially return true if the + * file is local. */ + return FALSE; +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + /* non-pure virtual method; does not have to be implemented in children. */ + klass->can_memory_map = viewer_file_real_can_memory_map; +} +``` + +Derived classes can then override the method with code such as: + +```c +static void +viewer_audio_file_class_init (ViewerAudioFileClass *klass) +{ + ViewerFileClass *file_class = VIEWER_FILE_CLASS (klass); + + /* implement pure virtual function. */ + file_class->can_memory_map = viewer_audio_file_can_memory_map; +} +``` + +### Chaining up + +Chaining up is often loosely defined by the following set of conditions: + +- parent class A defines a public virtual method named `foo` and provides a + default implementation +- child class B re-implements method `foo` +- B’s implementation of `foo` calls (‘chains up to’) its parent class A’s + implementation of `foo` + +There are various uses of this idiom: + +- you need to extend the behaviour of a class without modifying its code. + You create a subclass to inherit its implementation, re-implement a public + virtual method to modify the behaviour and chain up to ensure that the + previous behaviour is not really modified, just extended +- you need to implement the + [Chain of Responsibility pattern](https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern): + each object of the inheritance tree chains up to its parent (typically, at the + beginning or the end of the method) to ensure that each handler is run in turn + +To explicitly chain up to the implementation of the virtual method in the +parent class, you first need a handle to the original parent class +structure. This pointer can then be used to access the original virtual +function pointer and invoke it directly + +The "original" adjective used in the sentence above is not innocuous. To +fully understand its meaning, recall how class structures are initialized: +for each object type, the class structure associated with this object is +created by first copying the class structure of its parent type (a simple +memcpy) and then by invoking the `class_init` callback on the resulting class +structure. Since the `class_init` callback is responsible for overwriting the +class structure with the user re-implementations of the class methods, the +modified copy of the parent class structure stored in the derived instance +cannot be used. A copy of the class structure of an instance of the parent +class is needed. + +To chain up, you can use the `parent_class` pointer created and initialized +by the `G_DEFINE_TYPE` family of macros, for instance: + +```c +static void +b_method_to_call (B *obj, int some_param) +{ + /* do stuff before chain up */ + + /* call the method_to_call() virtual function on the + * parent of BClass, AClass. + * + * remember the explicit cast to AClass* + */ + A_CLASS (b_parent_class)->method_to_call (obj, some_param); + + /* do stuff after chain up */ +} +``` + +## How to define and implement interfaces + +### Defining interfaces + +The theory behind how GObject interfaces work is given in the section called +["Non-instantiatable classed types: +interfaces"](concepts.html#non-instantiatable-classed-types-interfaces); +this section covers how to define and implement an interface. + +The first step is to get the header right. This interface defines three +methods: + +```c +/* + * Copyright/Licensing information. + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#define VIEWER_TYPE_EDITABLE viewer_editable_get_type() +G_DECLARE_INTERFACE (ViewerEditable, viewer_editable, VIEWER, EDITABLE, GObject) + +struct _ViewerEditableInterface +{ + GTypeInterface parent_iface; + + void (*save) (ViewerEditable *self, + GError **error); + void (*undo) (ViewerEditable *self, + guint n_steps); + void (*redo) (ViewerEditable *self, + guint n_steps); +}; + +void viewer_editable_save (ViewerEditable *self, + GError **error); +void viewer_editable_undo (ViewerEditable *self, + guint n_steps); +void viewer_editable_redo (ViewerEditable *self, + guint n_steps); + +G_END_DECLS +``` + +This code is the same as the code for a normal GType which derives from a +GObject except for a few details: + +- the `_GET_CLASS` function is called `_GET_IFACE` (and is defined by `G_DECLARE_INTERFACE`) +- the instance type, `ViewerEditable`, is not fully defined: it is used merely as an abstract type which represents an instance of whatever object which implements the interface +- the parent of the `ViewerEditableInterface` is `GTypeInterface`, not `GObjectClass` + +The implementation of the `ViewerEditable` type itself is trivial: + +- `G_DEFINE_INTERFACE` creates a `viewer_editable_get_type` function which registers the type in the type system. The third argument is used to define a prerequisite interface (which we'll talk about more later). Just pass 0 for this argument when an interface has no prerequisite +- `viewer_editable_default_init` is expected to register the interface's signals if there are any (we will see a bit later how to use them) +- the interface methods `viewer_editable_save`, `viewer_editable_undo` and `viewer_editable_redo` dereference the interface structure to access its associated interface function and call it + +```c +G_DEFINE_INTERFACE (ViewerEditable, viewer_editable, G_TYPE_OBJECT) + +static void +viewer_editable_default_init (ViewerEditableInterface *iface) +{ + /* add properties and signals to the interface here */ +} + +void +viewer_editable_save (ViewerEditable *self, + GError **error) +{ + ViewerEditableInterface *iface; + + g_return_if_fail (VIEWER_IS_EDITABLE (self)); + g_return_if_fail (error == NULL || *error == NULL); + + iface = VIEWER_EDITABLE_GET_IFACE (self); + g_return_if_fail (iface->save != NULL); + iface->save (self, error); +} + +void +viewer_editable_undo (ViewerEditable *self, + guint n_steps) +{ + ViewerEditableInterface *iface; + + g_return_if_fail (VIEWER_IS_EDITABLE (self)); + + iface = VIEWER_EDITABLE_GET_IFACE (self); + g_return_if_fail (iface->undo != NULL); + iface->undo (self, n_steps); +} + +void +viewer_editable_redo (ViewerEditable *self, + guint n_steps) +{ + ViewerEditableInterface *iface; + + g_return_if_fail (VIEWER_IS_EDITABLE (self)); + + iface = VIEWER_EDITABLE_GET_IFACE (self); + g_return_if_fail (iface->redo != NULL); + iface->redo (self, n_steps); +} +``` + +### Implementing interfaces + +Once the interface is defined, implementing it is rather trivial. + +The first step is to define a normal final GObject class exactly as usual. + +The second step is to implement `ViewerFile` by defining it using +`G_DEFINE_TYPE_WITH_CODE` and `G_IMPLEMENT_INTERFACE` instead of +`G_DEFINE_TYPE`: + +```c +static void viewer_file_editable_interface_init (ViewerEditableInterface *iface); + +G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_file_editable_interface_init)) +``` + +This definition is very much like all the similar functions seen previously. +The only interface-specific code present here is the use of +`G_IMPLEMENT_INTERFACE`. + +Classes can implement multiple interfaces by using multiple calls to +`G_IMPLEMENT_INTERFACE` inside the call to `G_DEFINE_TYPE_WITH_CODE`. + +`viewer_file_editable_interface_init` is the interface initialization +function: inside it, every virtual method of the interface must be assigned +to its implementation: + +```c +static void +viewer_file_editable_save (ViewerFile *self, + GError **error) +{ + g_print ("File implementation of editable interface save method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_undo (ViewerFile *self, + guint n_steps) +{ + g_print ("File implementation of editable interface undo method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_redo (ViewerFile *self, + guint n_steps) +{ + g_print ("File implementation of editable interface redo method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_interface_init (ViewerEditableInterface *iface) +{ + iface->save = viewer_file_editable_save; + iface->undo = viewer_file_editable_undo; + iface->redo = viewer_file_editable_redo; +} + +static void +viewer_file_init (ViewerFile *self) +{ + /* Instance variable initialisation code. */ +} +``` + +If the object is not of final type, e.g. was declared using +`G_DECLARE_DERIVABLE_TYPE` then `G_ADD_PRIVATE` macro should be added. The +private structure should be declared exactly as for a normal derivable +object. + +```c +G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, + G_ADD_PRIVATE (ViewerFile) + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_file_editable_interface_init)) +``` + +### Interface definition prerequisites + +To specify that an interface requires the presence of other interfaces when +implemented, GObject introduces the concept of prerequisites: it is possible +to associate a list of prerequisite types to an interface. For example, if +object A wishes to implement interface I1, and if interface I1 has a +prerequisite on interface I2, A has to implement both I1 and I2. + +The mechanism described above is, in practice, very similar to Java's +interface I1 extends interface I2. The example below shows the GObject +equivalent: + +``` +/* Make the ViewerEditableLossy interface require ViewerEditable interface. */ +G_DEFINE_INTERFACE (ViewerEditableLossy, viewer_editable_lossy, VIEWER_TYPE_EDITABLE) +``` + +In the `G_DEFINE_INTERFACE` call above, the third parameter defines the +prerequisite type. This is the GType of either an interface or a class. In +this case the `ViewerEditable` interface is a prerequisite of +`ViewerEditableLossy`. The code below shows how an implementation can +implement both interfaces and register their implementations: + +```c +static void +viewer_file_editable_lossy_compress (ViewerEditableLossy *editable) +{ + ViewerFile *self = VIEWER_FILE (editable); + + g_print ("File implementation of lossy editable interface compress method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_lossy_interface_init (ViewerEditableLossyInterface *iface) +{ + iface->compress = viewer_file_editable_lossy_compress; +} + +static void +viewer_file_editable_save (ViewerEditable *editable, + GError **error) +{ + ViewerFile *self = VIEWER_FILE (editable); + + g_print ("File implementation of editable interface save method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_undo (ViewerEditable *editable, + guint n_steps) +{ + ViewerFile *self = VIEWER_FILE (editable); + + g_print ("File implementation of editable interface undo method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_redo (ViewerEditable *editable, + guint n_steps) +{ + ViewerFile *self = VIEWER_FILE (editable); + + g_print ("File implementation of editable interface redo method: %s.\n", + self->filename); +} + +static void +viewer_file_editable_interface_init (ViewerEditableInterface *iface) +{ + iface->save = viewer_file_editable_save; + iface->undo = viewer_file_editable_undo; + iface->redo = viewer_file_editable_redo; +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + /* Nothing here. */ +} + +static void +viewer_file_init (ViewerFile *self) +{ + /* Instance variable initialisation code. */ +} + +G_DEFINE_TYPE_WITH_CODE (ViewerFile, viewer_file, G_TYPE_OBJECT, + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_file_editable_interface_init) + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE_LOSSY, + viewer_file_editable_lossy_interface_init)) +``` + +It is very important to notice that the order in which interface +implementations are added to the main object is not random: +`g_type_add_interface_static()`, which is called by `G_IMPLEMENT_INTERFACE`, must +be invoked first on the interfaces which have no prerequisites and then on +the others. + +### Interface properties + +GObject interfaces can also have properties. Declaration of the interface +properties is similar to declaring the properties of ordinary GObject types +as explained in the section called ["Object +properties"](concepts.html#object-properties), except that +`g_object_interface_install_property()` is used to declare the properties +instead of `g_object_class_install_property()`. + +To include a property named 'autosave-frequency' of type gdouble in the +`ViewerEditable` interface example code above, we only need to add one call in +`viewer_editable_default_init()` as shown below: + +```c +static void +viewer_editable_default_init (ViewerEditableInterface *iface) +{ + g_object_interface_install_property (iface, + g_param_spec_double ("autosave-frequency", + "Autosave frequency", + "Frequency (in per-seconds) to autosave backups of the editable content at. " + "Or zero to disable autosaves.", + 0.0, /* minimum */ + G_MAXDOUBLE, /* maximum */ + 0.0, /* default */ + G_PARAM_READWRITE)); +} +``` + +One point worth noting is that the declared property wasn't assigned an +integer ID. The reason being that integer IDs of properties are used only +inside the `get_property` and `set_property` virtual methods. Since interfaces +declare but do not implement properties, there is no need to assign integer +IDs to them. + +An implementation declares and defines its properties in the usual way as +explained in the section called “Object properties”, except for one small +change: it can declare the properties of the interface it implements using +`g_object_class_override_property()` instead of `g_object_class_install_property()`. +The following code snippet shows the modifications needed in the `ViewerFile` +declaration and implementation above: + +```c +struct _ViewerFile +{ + GObject parent_instance; + + double autosave_frequency; +}; + +enum +{ + PROP_AUTOSAVE_FREQUENCY = 1, + N_PROPERTIES +}; + +static void +viewer_file_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ViewerFile *file = VIEWER_FILE (object); + + switch (prop_id) + { + case PROP_AUTOSAVE_FREQUENCY: + file->autosave_frequency = g_value_get_double (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +viewer_file_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ViewerFile *file = VIEWER_FILE (object); + + switch (prop_id) + { + case PROP_AUTOSAVE_FREQUENCY: + g_value_set_double (value, file->autosave_frequency); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +viewer_file_class_init (ViewerFileClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->set_property = viewer_file_set_property; + object_class->get_property = viewer_file_get_property; + + g_object_class_override_property (object_class, PROP_AUTOSAVE_FREQUENCY, "autosave-frequency"); +} +``` + +### Overriding interface methods + +If a base class already implements an interface and a derived class needs to +implement the same interface but needs to override certain methods, you must +reimplement the interface and set only the interface methods which need +overriding. + +In this example, `ViewerAudioFile` is derived from `ViewerFile`. Both implement +the `ViewerEditable` interface. `ViewerAudioFile` only implements one method of +the `ViewerEditable` interface and uses the base class implementation of the +other. + +```c +static void +viewer_audio_file_editable_save (ViewerEditable *editable, + GError **error) +{ + ViewerAudioFile *self = VIEWER_AUDIO_FILE (editable); + + g_print ("Audio file implementation of editable interface save method.\n"); +} + +static void +viewer_audio_file_editable_interface_init (ViewerEditableInterface *iface) +{ + /* Override the implementation of save(). */ + iface->save = viewer_audio_file_editable_save; + + /* + * Leave iface->undo and ->redo alone, they are already set to the + * base class implementation. + */ +} + +G_DEFINE_TYPE_WITH_CODE (ViewerAudioFile, viewer_audio_file, VIEWER_TYPE_FILE, + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_audio_file_editable_interface_init)) + +static void +viewer_audio_file_class_init (ViewerAudioFileClass *klass) +{ + /* Nothing here. */ +} + +static void +viewer_audio_file_init (ViewerAudioFile *self) +{ + /* Nothing here. */ +} +``` + +To access the base class interface implementation use +`g_type_interface_peek_parent()` from within an interface's `default_init` +function. + +To call the base class implementation of an interface method from a derived +class where than interface method has been overridden, stash away the +pointer returned from `g_type_interface_peek_parent()` in a global variable. + +In this example `ViewerAudioFile` overrides the save interface method. In +its overridden method it calls the base class implementation of the same +interface method. + +```c +static ViewerEditableInterface *viewer_editable_parent_interface = NULL; + +static void +viewer_audio_file_editable_save (ViewerEditable *editable, + GError **error) +{ + ViewerAudioFile *self = VIEWER_AUDIO_FILE (editable); + + g_print ("Audio file implementation of editable interface save method.\n"); + + /* Now call the base implementation */ + viewer_editable_parent_interface->save (editable, error); +} + +static void +viewer_audio_file_editable_interface_init (ViewerEditableInterface *iface) +{ + viewer_editable_parent_interface = g_type_interface_peek_parent (iface); + + iface->save = viewer_audio_file_editable_save; +} + +G_DEFINE_TYPE_WITH_CODE (ViewerAudioFile, viewer_audio_file, VIEWER_TYPE_FILE, + G_IMPLEMENT_INTERFACE (VIEWER_TYPE_EDITABLE, + viewer_audio_file_editable_interface_init)) + +static void +viewer_audio_file_class_init (ViewerAudioFileClass *klass) +{ + /* Nothing here. */ +} + +static void +viewer_audio_file_init (ViewerAudioFile *self) +{ + /* Nothing here. */ +} +``` + +## How to create and use signals + +The signal system in GType is pretty complex and flexible: it is possible +for its users to connect at runtime any number of callbacks (implemented in +any language for which a binding exists) to any signal and to stop the +emission of any signal at any state of the signal emission process. This +flexibility makes it possible to use GSignal for much more than just +emitting signals to multiple clients. + +### Simple use of signals + +The most basic use of signals is to implement event notification. For +example, given a `ViewerFile` object with a write method, a signal could be +emitted whenever the file is changed using that method. The code below shows +how the user can connect a callback to the "changed" signal. + +```c +file = g_object_new (VIEWER_FILE_TYPE, NULL); + +g_signal_connect (file, "changed", (GCallback) changed_event, NULL); + +viewer_file_write (file, buffer, strlen (buffer)); +``` + +The ViewerFile signal is registered in the `class_init` function: + +```c +file_signals[CHANGED] = + g_signal_newv ("changed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, + NULL /* closure */, + NULL /* accumulator */, + NULL /* accumulator data */, + NULL /* C marshaller */, + G_TYPE_NONE /* return_type */, + 0 /* n_params */, + NULL /* param_types */); +``` + +and the signal is emitted in `viewer_file_write`: + +```c +void +viewer_file_write (ViewerFile *self, + const guint8 *buffer, + gsize size) +{ + g_return_if_fail (VIEWER_IS_FILE (self)); + g_return_if_fail (buffer != NULL || size == 0); + + /* First write data. */ + + /* Then, notify user of data written. */ + g_signal_emit (self, file_signals[CHANGED], 0 /* details */); +} +``` + +As shown above, the details parameter can safely be set to zero if no detail +needs to be conveyed. For a discussion of what it can be used for, see the +section called [“The detail argument”](concepts.html#the-detail-argument). + +The C signal marshaller should always be `NULL`, in which case the best +marshaller for the given closure type will be chosen by GLib. This may be an +internal marshaller specific to the closure type, or +`g_cclosure_marshal_generic()`, which implements generic conversion of arrays of +parameters to C callback invocations. GLib used to require the user to write +or generate a type-specific marshaller and pass that, but that has been +deprecated in favour of automatic selection of marshallers. + +Note that `g_cclosure_marshal_generic()` is slower than non-generic +marshallers, so should be avoided for performance critical code. However, +performance critical code should rarely be using signals anyway, as signals +are synchronous, and the emission blocks until all listeners are invoked, +which has potentially unbounded cost. diff --git a/docs/reference/gobject/types.md b/docs/reference/gobject/types.md new file mode 100644 index 0000000..8b9bc5d --- /dev/null +++ b/docs/reference/gobject/types.md @@ -0,0 +1,64 @@ +Title: Types +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2001, 2003 Owen Taylor +SPDX-FileCopyrightText: 2002, 2003, 2004, 2005 Matthias Clasen +SPDX-FileCopyrightText: 2003, 2006 Josh Parsons +SPDX-FileCopyrightText: 2005 Stefan Kost +SPDX-FileCopyrightText: 2015 Collabora, Ltd. +SPDX-FileCopyrightText: 2021 Emmanuele Bassi +SPDX-FileCopyrightText: 2023 Endless OS Foundation, LLC + +# Types + +The GType API is the foundation of the GObject system. It provides the +facilities for registering and managing all fundamental data types, +user-defined object and interface types. + +For type creation and registration purposes, all types fall into one of +two categories: static or dynamic. Static types are never loaded or +unloaded at run-time as dynamic types may be. Static types are created +with [func@GObject.type_register_static] that gets type specific +information passed in via a `GTypeInfo` structure. + +Dynamic types are created with [func@GObject.type_register_dynamic], +which takes a `GTypePlugin` structure instead. The remaining type information +(the `GTypeInfo` structure) is retrieved during runtime through `GTypePlugin` +and the `g_type_plugin_*()` API. + +These registration functions are usually called only once from a +function whose only purpose is to return the type identifier for a +specific class. Once the type (or class or interface) is registered, +it may be instantiated, inherited, or implemented depending on exactly +what sort of type it is. + +There is also a third registration function for registering fundamental +types called [func@GObject.type_register_fundamental], which requires +both a `GTypeInfo` structure and a `GTypeFundamentalInfo` structure, but it +is rarely used since most fundamental types are predefined rather than user-defined. + +Type instance and class structs are limited to a total of 64 KiB, +including all parent types. Similarly, type instances' private data +(as created by `G_ADD_PRIVATE()`) are limited to a total of +64 KiB. If a type instance needs a large static buffer, allocate it +separately (typically by using [`struct@GLib.Array`] or [`struct@GLib.PtrArray`]) +and put a pointer to the buffer in the structure. + +As mentioned in the [GType conventions](concepts.html#conventions), type names must +be at least three characters long. There is no upper length limit. The first +character must be a letter (a–z or A–Z) or an underscore (‘\_’). Subsequent +characters can be letters, numbers or any of ‘-\_+’. + +# Runtime Debugging + +When `G_ENABLE_DEBUG` is defined during compilation, the GObject library +supports an environment variable `GOBJECT_DEBUG` that can be set to a +combination of flags to trigger debugging messages about +object bookkeeping and signal emissions during runtime. + +The currently supported flags are: + + - `objects`: Tracks all `GObject` instances in a global hash table called + `debug_objects_ht`, and prints the still-alive objects on exit. + - `instance-count`: Tracks the number of instances of every `GType` and makes + it available via the [func@GObject.type_get_instance_count] function. + - `signals`: Currently unused. diff --git a/docs/reference/gobject/value-collection.md b/docs/reference/gobject/value-collection.md new file mode 100644 index 0000000..f040703 --- /dev/null +++ b/docs/reference/gobject/value-collection.md @@ -0,0 +1,56 @@ +Title: Value Collection +SPDX-License-Identifier: LGPL-2.1-or-later +SPDX-FileCopyrightText: 2005 Matthias Clasen + +# Value Collection + +GLib provides a set of macros for the varargs parsing support needed +in variadic GObject functions such as [ctor@GObject.Object.new] or +[method@GObject.Object.set] + +They currently support the collection of integral types, floating point +types and pointers. + +## Macros + +`G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)` + +: Collects a variable argument value from a `va_list`. + + We have to implement the varargs collection as a macro, because on some + systems `va_list` variables cannot be passed by reference. + + Since: 2.24 + +`G_VALUE_COLLECT_INIT2(value, g_vci_vtab, _value_type, var_args, flags, __error)` + +: A variant of `G_VALUE_COLLECT_INIT` that provides the [struct@GObject.TypeValueTable] + to the caller. + + Since: 2.74 + +`G_VALUE_COLLECT(value, var_args, flags, __error)` + +: Collects a variable argument value from a `va_list`. + + We have to implement the varargs collection as a macro, because on some systems + `va_list` variables cannot be passed by reference. + + Note: If you are creating the `value argument` just before calling this macro, + you should use the `G_VALUE_COLLECT_INIT` variant and pass the uninitialized + `GValue`. That variant is faster than `G_VALUE_COLLECT`. + +`G_VALUE_COLLECT_SKIP(_value_type, var_args)` + +: Skip an argument of type `_value_type` from `var_args`. + +`G_VALUE_LCOPY(value, var_args, flags, __error)` + +: Stores a value’s value into one or more argument locations from a `va_list`. + + This is the inverse of G_VALUE_COLLECT(). + +`G_VALUE_COLLECT_FORMAT_MAX_LENGTH` + +: The maximal number of [type@GObject.TypeCValue]s which can be collected for a + single `GValue`. diff --git a/docs/reference/gobject/version.xml.in b/docs/reference/gobject/version.xml.in deleted file mode 100644 index af9b9c4..0000000 --- a/docs/reference/gobject/version.xml.in +++ /dev/null @@ -1 +0,0 @@ -@GLIB_VERSION@ diff --git a/docs/reference/gobject/xml/gtkdocentities.ent.in b/docs/reference/gobject/xml/gtkdocentities.ent.in deleted file mode 100644 index f12c9ff..0000000 --- a/docs/reference/gobject/xml/gtkdocentities.ent.in +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/docs/reference/gobject/xml/meson.build b/docs/reference/gobject/xml/meson.build deleted file mode 100644 index 6aeb745..0000000 --- a/docs/reference/gobject/xml/meson.build +++ /dev/null @@ -1,14 +0,0 @@ -ent_conf = configuration_data() -ent_conf.set('PACKAGE', 'glib') -ent_conf.set('PACKAGE_BUGREPORT', 'https://gitlab.gnome.org/GNOME/glib/issues/new') -ent_conf.set('PACKAGE_NAME', 'glib') -ent_conf.set('PACKAGE_STRING', 'glib') -ent_conf.set('PACKAGE_TARNAME', 'glib') -ent_conf.set('PACKAGE_URL', 'FIXME') -ent_conf.set('PACKAGE_VERSION', glib_version) -ent_conf.set('PACKAGE_API_VERSION', glib_api_version) -configure_file( - input: 'gtkdocentities.ent.in', - output: 'gtkdocentities.ent', - configuration: ent_conf -) diff --git a/docs/reference/meson.build b/docs/reference/meson.build index c417ffe..25904d6 100644 --- a/docs/reference/meson.build +++ b/docs/reference/meson.build @@ -1,58 +1,26 @@ -# The list of minor versions in the 2.x.x series which have had -# GLIB_AVAILABLE_IN_* macros. This should include the current unreleased stable -# version. -first_version = 26 -last_version = minor_version.is_odd() ? minor_version + 1 : minor_version +if get_option('documentation') and enable_gir + gidocgen_dep = dependency('gi-docgen', version: '>= 2023.1', + fallback: ['gi-docgen', 'dummy_dep'], + native: true, + required: true) -ignore_decorators = [ - 'GLIB_VAR', - 'G_GNUC_INTERNAL', - 'G_GNUC_WARN_UNUSED_RESULT', - 'GLIB_AVAILABLE_IN_ALL', -] + toml_conf = configuration_data() + toml_conf.set('VERSION', meson.project_version()) -foreach i : range(first_version, last_version + 2, 2) - version = i.to_string() - ignore_decorators += [ - # Note that gtkdoc is going to use those in regex, and the longest match - # must come first. That's why '_FOR()' variant comes first. - # gtkdoc special-case '()' and replace it by a regex matching a symbol name. - 'GLIB_AVAILABLE_IN_2_' + version, - 'GLIB_DEPRECATED_IN_2_' + version + '_FOR()', - 'GLIB_DEPRECATED_IN_2_' + version, + gidocgen = find_program('gi-docgen', native: true, required: true) - 'GLIB_AVAILABLE_STATIC_INLINE_IN_2_' + version, - - 'GLIB_AVAILABLE_ENUMERATOR_IN_2_' + version, - 'GLIB_DEPRECATED_ENUMERATOR_IN_2_' + version + '_FOR()', - 'GLIB_DEPRECATED_ENUMERATOR_IN_2_' + version, - - 'GLIB_AVAILABLE_MACRO_IN_2_' + version, - 'GLIB_DEPRECATED_MACRO_IN_2_' + version + '_FOR()', - 'GLIB_DEPRECATED_MACRO_IN_2_' + version, - - 'GLIB_AVAILABLE_TYPE_IN_2_' + version, - 'GLIB_DEPRECATED_TYPE_IN_2_' + version + '_FOR()', - 'GLIB_DEPRECATED_TYPE_IN_2_' + version, + gidocgen_common_args = [ + '--quiet', + '--no-namespace-dir', + '--fatal-warnings', + '--add-include-path=@0@'.format(meson.current_build_dir() / '../../girepository/introspection'), ] -endforeach - -ignore_decorators = '|'.join(ignore_decorators) - -if get_option('gtk_doc') - # Check we have the minimum gtk-doc version required. Older versions won't - # generate correct documentation. - dependency('gtk-doc', version : '>=1.32.1', - fallback : ['gtk-doc', 'dummy_dep'], - default_options : ['tests=false']) - - # We cannot built the API reference off of a static library, - # as symbols might get dropped by the linker - if not glib_build_shared - error('The API reference can only be built against a shared library') - endif endif -subdir('gio') +docs_dir = glib_datadir / 'doc' / 'glib-2.0' + subdir('glib') +subdir('gmodule') subdir('gobject') +subdir('gio') +subdir('girepository') diff --git a/docs/reference/urlmap.js b/docs/reference/urlmap.js new file mode 100644 index 0000000..05ca767 --- /dev/null +++ b/docs/reference/urlmap.js @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: LGPL-2.1-or-later +// SPDX-FileCopyrightText: 2023 Matthias Clasen +var baseURLs = [ + [ 'GLib', 'https://docs.gtk.org/glib/' ], + [ 'GLibUnix', 'https://docs.gtk.org/glib-unix/' ], + [ 'GLibWin32', 'https://docs.gtk.org/glib-win32/' ], + [ 'GModule', 'https://docs.gtk.org/gmodule/' ], + [ 'GObject', 'https://docs.gtk.org/gobject/' ], + [ 'Gio', 'https://docs.gtk.org/gio/' ], + [ 'GioUnix', 'https://docs.gtk.org/gio-unix/' ], + [ 'GioWin32', 'https://docs.gtk.org/gio-win32/' ], + [ 'Gtk', 'https://docs.gtk.org/gtk4/' ], +]; diff --git a/docs/roadmap.md b/docs/roadmap.md index 57999d9..c444a42 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -59,7 +59,7 @@ proportionally to the time since the initial release of that branch. There is no limit on the number of micro releases in a stable release series. Typically there will be around 6. Micro releases stop once there are no more -bugs found in a stable series, or once a new stable series supercedes it. +bugs found in a stable series, or once a new stable series supersedes it. The milestone for the next micro release in a stable series is created when the previous micro release is made, such that only one stable micro release is diff --git a/docs/supported-platforms.md b/docs/supported-platforms.md index ef627de..74dd01d 100644 --- a/docs/supported-platforms.md +++ b/docs/supported-platforms.md @@ -23,8 +23,6 @@ their vendor. * Windows: [minimum version is Windows 8](https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1970), minimum build chain is Visual Studio 2012 - * Static builds are only supported with MinGW-based toolchains (cf - [this comment](https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2384#note_1336662)) * Android: [minimum NDK version 15](https://gitlab.gnome.org/GNOME/glib/issues/1113) * Linux: glibc newer than 2.5 (if using glibc; other forms of libc are supported) diff --git a/docs/toolchain-requirements.md b/docs/toolchain-requirements.md index b432be5..9a1c7bf 100644 --- a/docs/toolchain-requirements.md +++ b/docs/toolchain-requirements.md @@ -156,6 +156,34 @@ and back again losslessly. Any platform or compiler which doesn’t support this cannot be used to compile GLib or code which uses GLib. This precludes use of the `-pedantic` GCC flag with GLib. +NULL defined as void pointer, or same size and representation as void pointer +--- + +_Hard requirement._ + +GLib assumes that it is safe to pass `NULL` to a variadic function without +explicitly casting it to a char * pointer, e.g.: + +``` +g_object_new (G_TYPE_FOO, + "bar", bar, + NULL); +``` + +This pattern is pervasive throughout GLib and applications that use GLib, but it +is also nonportable. If `NULL` is defined as an integer type, `0`, rather than a +pointer type, `(void *) 0`, then using an integer where a pointer is expected +results in stack corruption if the size of a pointer is different from the size +of `NULL`. Portable code would use `(char *) NULL`, `(void *) NULL` or `nullptr` +(in C23 or C++11 or later) instead. + +This requirement technically only applies to C, since GLib is written in C and +since C++ does not permit `NULL` to be defined as a void pointer. If you are +writing C++ code that uses GLib, use `nullptr` to avoid this problem. + +GLib further assumes that the representations of pointers of different types are +identical, which is not guaranteed. + `stdint.h` --- diff --git a/fuzzing/fuzz_resolver.c b/fuzzing/fuzz_resolver.c index 90119a5..877024a 100644 --- a/fuzzing/fuzz_resolver.c +++ b/fuzzing/fuzz_resolver.c @@ -21,6 +21,7 @@ #include "gio/gnetworking.h" #include "../gio/gthreadedresolver.h" +#include "../gio/gthreadedresolver-private.h" static void test_for_rrtype (const guint8 *data, diff --git a/gio/gaction.c b/gio/gaction.c index 5599137..33e0ff7 100644 --- a/gio/gaction.c +++ b/gio/gaction.c @@ -28,47 +28,37 @@ G_DEFINE_INTERFACE (GAction, g_action, G_TYPE_OBJECT) /** - * SECTION:gaction - * @title: GAction - * @short_description: An action interface - * @include: gio/gio.h + * GAction: * - * #GAction represents a single named action. + * `GAction` represents a single named action. * * The main interface to an action is that it can be activated with - * g_action_activate(). This results in the 'activate' signal being - * emitted. An activation has a #GVariant parameter (which may be - * %NULL). The correct type for the parameter is determined by a static + * [method@Gio.Action.activate]. This results in the 'activate' signal being + * emitted. An activation has a `GVariant` parameter (which may be + * `NULL`). The correct type for the parameter is determined by a static * parameter type (which is given at construction time). * * An action may optionally have a state, in which case the state may be - * set with g_action_change_state(). This call takes a #GVariant. The + * set with [method@Gio.Action.change_state]. This call takes a #GVariant. The * correct type for the state is determined by a static state type * (which is given at construction time). * * The state may have a hint associated with it, specifying its valid * range. * - * #GAction is merely the interface to the concept of an action, as + * `GAction` is merely the interface to the concept of an action, as * described above. Various implementations of actions exist, including - * #GSimpleAction. + * [class@Gio.SimpleAction]. * * In all cases, the implementing class is responsible for storing the - * name of the action, the parameter type, the enabled state, the - * optional state type and the state and emitting the appropriate - * signals when these change. The implementor is responsible for filtering - * calls to g_action_activate() and g_action_change_state() for type - * safety and for the state being enabled. + * name of the action, the parameter type, the enabled state, the optional + * state type and the state and emitting the appropriate signals when these + * change. The implementor is responsible for filtering calls to + * [method@Gio.Action.activate] and [method@Gio.Action.change_state] + * for type safety and for the state being enabled. * - * Probably the only useful thing to do with a #GAction is to put it - * inside of a #GSimpleActionGroup. - **/ - -/** - * GAction: - * - * #GAction is an opaque data structure and can only be accessed - * using the following functions. + * Probably the only useful thing to do with a `GAction` is to put it + * inside of a [class@Gio.SimpleActionGroup]. **/ /** @@ -100,9 +90,7 @@ g_action_default_init (GActionInterface *iface) * Since: 2.28 **/ g_object_interface_install_property (iface, - g_param_spec_string ("name", - P_("Action Name"), - P_("The name used to invoke the action"), + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -117,9 +105,7 @@ g_action_default_init (GActionInterface *iface) * Since: 2.28 **/ g_object_interface_install_property (iface, - g_param_spec_boxed ("parameter-type", - P_("Parameter Type"), - P_("The type of GVariant passed to activate()"), + g_param_spec_boxed ("parameter-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -135,9 +121,7 @@ g_action_default_init (GActionInterface *iface) * Since: 2.28 **/ g_object_interface_install_property (iface, - g_param_spec_boolean ("enabled", - P_("Enabled"), - P_("If the action can be activated"), + g_param_spec_boolean ("enabled", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -151,9 +135,7 @@ g_action_default_init (GActionInterface *iface) * Since: 2.28 **/ g_object_interface_install_property (iface, - g_param_spec_boxed ("state-type", - P_("State Type"), - P_("The type of the state kept by the action"), + g_param_spec_boxed ("state-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -166,9 +148,7 @@ g_action_default_init (GActionInterface *iface) * Since: 2.28 **/ g_object_interface_install_property (iface, - g_param_spec_variant ("state", - P_("State"), - P_("The state the action is in"), + g_param_spec_variant ("state", NULL, NULL, G_VARIANT_TYPE_ANY, NULL, G_PARAM_READABLE | diff --git a/gio/gactiongroup.c b/gio/gactiongroup.c index a327195..7f7cb1c 100644 --- a/gio/gactiongroup.c +++ b/gio/gactiongroup.c @@ -26,31 +26,26 @@ #include "gmarshal-internal.h" /** - * SECTION:gactiongroup - * @title: GActionGroup - * @short_description: A group of actions - * @include: gio/gio.h - * @see_also: #GAction + * GActionGroup: * - * #GActionGroup represents a group of actions. Actions can be used to - * expose functionality in a structured way, either from one part of a - * program to another, or to the outside world. Action groups are often - * used together with a #GMenuModel that provides additional - * representation data for displaying the actions to the user, e.g. in - * a menu. + * `GActionGroup` represents a group of actions. * - * The main way to interact with the actions in a GActionGroup is to - * activate them with g_action_group_activate_action(). Activating an - * action may require a #GVariant parameter. The required type of the - * parameter can be inquired with g_action_group_get_action_parameter_type(). - * Actions may be disabled, see g_action_group_get_action_enabled(). + * Actions can be used to expose functionality in a structured way, either + * from one part of a program to another, or to the outside world. Action + * groups are often used together with a `GMenuModel` that provides additional + * representation data for displaying the actions to the user, e.g. in a menu. + * + * The main way to interact with the actions in a `GActionGroup` is to + * activate them with [method@Gio.ActionGroup.activate_action]. Activating an + * action may require a `GVariant` parameter. The required type of the + * parameter can be inquired with [method@Gio.ActionGroup.get_action_parameter_type]. + * Actions may be disabled, see [method@Gio.ActionGroup.get_action_enabled]. * Activating a disabled action has no effect. * - * Actions may optionally have a state in the form of a #GVariant. The - * current state of an action can be inquired with - * g_action_group_get_action_state(). Activating a stateful action may - * change its state, but it is also possible to set the state by calling - * g_action_group_change_action_state(). + * Actions may optionally have a state in the form of a #GVariant. The current + * state of an action can be inquired with [method@Gio.ActionGroup.get_action_state]. + * Activating a stateful action may change its state, but it is also possible to + * set the state by calling [method@Gio.ActionGroup.change_action_state]. * * As typical example, consider a text editing application which has an * option to change the current font to 'bold'. A good way to represent @@ -58,34 +53,27 @@ * action would toggle the state. * * Each action in the group has a unique name (which is a string). All - * method calls, except g_action_group_list_actions() take the name of + * method calls, except [method@Gio.ActionGroup.list_actions] take the name of * an action as an argument. * - * The #GActionGroup API is meant to be the 'public' API to the action - * group. The calls here are exactly the interaction that 'external + * The `GActionGroup` API is meant to be the 'public' API to the action + * group. The calls here are exactly the interaction that 'external * forces' (eg: UI, incoming D-Bus messages, etc.) are supposed to have - * with actions. 'Internal' APIs (ie: ones meant only to be accessed by - * the action group implementation) are found on subclasses. This is - * why you will find - for example - g_action_group_get_action_enabled() + * with actions. 'Internal' APIs (ie: ones meant only to be accessed by + * the action group implementation) are found on subclasses. This is + * why you will find - for example - [method@Gio.ActionGroup.get_action_enabled] * but not an equivalent set() call. * * Signals are emitted on the action group in response to state changes * on individual actions. * - * Implementations of #GActionGroup should provide implementations for - * the virtual functions g_action_group_list_actions() and - * g_action_group_query_action(). The other virtual functions should + * Implementations of `GActionGroup` should provide implementations for + * the virtual functions [method@Gio.ActionGroup.list_actions] and + * [method@Gio.ActionGroup.query_action]. The other virtual functions should * not be implemented - their "wrappers" are actually implemented with - * calls to g_action_group_query_action(). + * calls to [method@Gio.ActionGroup.query_action]. */ -/** - * GActionGroup: - * - * #GActionGroup is an opaque data structure and can only be accessed - * using the following functions. - **/ - /** * GActionGroupInterface: * @has_action: the virtual function pointer for g_action_group_has_action() @@ -96,13 +84,12 @@ * @get_action_enabled: the virtual function pointer for g_action_group_get_action_enabled() * @get_action_state: the virtual function pointer for g_action_group_get_action_state() * @change_action_state: the virtual function pointer for g_action_group_change_action_state() - * @query_action: the virtual function pointer for g_action_group_query_action() * @activate_action: the virtual function pointer for g_action_group_activate_action() - * @change_action_state: the virtual function pointer for g_action_group_change_action_state() * @action_added: the class closure for the #GActionGroup::action-added signal * @action_removed: the class closure for the #GActionGroup::action-removed signal * @action_enabled_changed: the class closure for the #GActionGroup::action-enabled-changed signal * @action_state_changed: the class closure for the #GActionGroup::action-enabled-changed signal + * @query_action: the virtual function pointer for g_action_group_query_action() * * The virtual function table for #GActionGroup. * diff --git a/gio/gactiongroupexporter.c b/gio/gactiongroupexporter.c index 3bc2f04..3ec1db2 100644 --- a/gio/gactiongroupexporter.c +++ b/gio/gactiongroupexporter.c @@ -32,18 +32,14 @@ #include "gdbuserror.h" /** - * SECTION:gactiongroupexporter - * @title: GActionGroup exporter - * @include: gio/gio.h - * @short_description: Export GActionGroups on D-Bus - * @see_also: #GActionGroup, #GDBusActionGroup + * GActionGroupExporter: * - * These functions support exporting a #GActionGroup on D-Bus. + * These functions support exporting a [class@Gio.ActionGroup] on D-Bus. * The D-Bus interface that is used is a private implementation * detail. * - * To access an exported #GActionGroup remotely, use - * g_dbus_action_group_get() to obtain a #GDBusActionGroup. + * To access an exported `GActionGroup` remotely, use + * [method@Gio.DBusActionGroup.get] to obtain a [class@Gio.DBusActionGroup]. */ static GVariant * diff --git a/gio/gactionmap.c b/gio/gactionmap.c index 60c5ed5..4b58831 100644 --- a/gio/gactionmap.c +++ b/gio/gactionmap.c @@ -26,14 +26,13 @@ #include "gaction.h" /** - * SECTION:gactionmap - * @title: GActionMap - * @include: gio/gio.h - * @short_description: Interface for action containers + * GActionMap: * - * The GActionMap interface is implemented by #GActionGroup - * implementations that operate by containing a number of - * named #GAction instances, such as #GSimpleActionGroup. + * `GActionMap` is an interface for action containers. + * + * The `GActionMap` interface is implemented by [iface@Gio.ActionGroup] + * implementations that operate by containing a number of named + * [iface@Gio.Action] instances, such as [class@Gio.SimpleActionGroup]. * * One useful application of this interface is to map the * names of actions from various action groups to unique, @@ -42,14 +41,7 @@ * name. * * Since: 2.32 - **/ - -/** - * GActionMap: - * - * #GActionMap is an opaque data structure and can only be accessed - * using the following functions. - **/ + */ /** * GActionMapInterface: diff --git a/gio/gappinfo.c b/gio/gappinfo.c index 787b774..652cae6 100644 --- a/gio/gappinfo.c +++ b/gio/gappinfo.c @@ -45,37 +45,37 @@ #endif /** - * SECTION:gappinfo - * @short_description: Application information and launch contexts - * @include: gio/gio.h - * @see_also: #GAppInfoMonitor - * - * #GAppInfo and #GAppLaunchContext are used for describing and launching + * GAppInfo: + * + * Information about an installed application and methods to launch + * it (with file arguments). + + * `GAppInfo` and `GAppLaunchContext` are used for describing and launching * applications installed on the system. * * As of GLib 2.20, URIs will always be converted to POSIX paths - * (using g_file_get_path()) when using g_app_info_launch() even if - * the application requested an URI and not a POSIX path. For example + * (using [method@Gio.File.get_path]) when using [method@Gio.AppInfo.launch] + * even if the application requested an URI and not a POSIX path. For example * for a desktop-file based application with Exec key `totem * %U` and a single URI, `sftp://foo/file.avi`, then * `/home/user/.gvfs/sftp on foo/file.avi` will be passed. This will - * only work if a set of suitable GIO extensions (such as gvfs 2.26 + * only work if a set of suitable GIO extensions (such as GVfs 2.26 * compiled with FUSE support), is available and operational; if this * is not the case, the URI will be passed unmodified to the application. * Some URIs, such as `mailto:`, of course cannot be mapped to a POSIX - * path (in gvfs there's no FUSE mount for it); such URIs will be + * path (in GVfs there's no FUSE mount for it); such URIs will be * passed unmodified to the application. * - * Specifically for gvfs 2.26 and later, the POSIX URI will be mapped - * back to the GIO URI in the #GFile constructors (since gvfs - * implements the #GVfs extension point). As such, if the application - * needs to examine the URI, it needs to use g_file_get_uri() or - * similar on #GFile. In other words, an application cannot assume - * that the URI passed to e.g. g_file_new_for_commandline_arg() is - * equal to the result of g_file_get_uri(). The following snippet + * Specifically for GVfs 2.26 and later, the POSIX URI will be mapped + * back to the GIO URI in the [iface@Gio.File] constructors (since GVfs + * implements the GVfs extension point). As such, if the application + * needs to examine the URI, it needs to use [method@Gio.File.get_uri] + * or similar on [iface@Gio.File]. In other words, an application cannot + * assume that the URI passed to e.g. [func@Gio.File.new_for_commandline_arg] + * is equal to the result of [method@Gio.File.get_uri]. The following snippet * illustrates this: * - * |[ + * ```c * GFile *f; * char *uri; * @@ -90,7 +90,7 @@ * // do something special with uri * } * g_object_unref (file); - * ]| + * ``` * * This code will work when both `cdda://sr0/Track 1.wav` and * `/home/user/.gvfs/cdda on sr0/Track 1.wav` is passed to the @@ -721,8 +721,8 @@ g_app_info_launch_uris_async (GAppInfo *appinfo, task = g_task_new (appinfo, cancellable, callback, user_data); g_task_set_source_tag (task, g_app_info_launch_uris_async); - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, - "Operation not supported for the current backend."); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + "Operation not supported for the current backend."); g_object_unref (task); return; @@ -1304,7 +1304,7 @@ g_app_info_can_delete (GAppInfo *appinfo) /** - * g_app_info_delete: + * g_app_info_delete: (virtual do_delete) * @appinfo: a #GAppInfo * * Tries to delete a #GAppInfo. @@ -1313,7 +1313,6 @@ g_app_info_can_delete (GAppInfo *appinfo) * #GAppInfos which can be deleted, and system-wide ones which cannot. * See g_app_info_can_delete(). * - * Virtual: do_delete * Returns: %TRUE if @appinfo has been deleted * * Since: 2.20 @@ -1653,54 +1652,51 @@ g_app_launch_context_launch_failed (GAppLaunchContext *context, } -/** - * SECTION:gappinfomonitor - * @short_description: Monitor application information for changes - * - * #GAppInfoMonitor is a very simple object used for monitoring the app - * info database for changes (newly installed or removed applications). - * - * Call g_app_info_monitor_get() to get a #GAppInfoMonitor and connect - * to the #GAppInfoMonitor::changed signal. The signal will be emitted once when - * the app info database changes, and will not be emitted again until after the - * next call to g_app_info_get_all() or another `g_app_info_*()` function. This - * is because monitoring the app info database for changes is expensive. - * - * The following functions will re-arm the #GAppInfoMonitor::changed signal so - * it can be emitted again: - * - g_app_info_get_all() - * - g_app_info_get_all_for_type() - * - g_app_info_get_default_for_type() - * - g_app_info_get_fallback_for_type() - * - g_app_info_get_recommended_for_type() - * - g_desktop_app_info_get_implementations() - * - g_desktop_app_info_new() - * - g_desktop_app_info_new_from_filename() - * - g_desktop_app_info_new_from_keyfile() - * - g_desktop_app_info_search() - * - * In the usual case, applications should try to make note of the change - * (doing things like invalidating caches) but not act on it. In - * particular, applications should avoid making calls to #GAppInfo APIs - * in response to the change signal, deferring these until the time that - * the updated data is actually required. The exception to this case is when - * application information is actually being displayed on the screen - * (for example, during a search or when the list of all applications is shown). - * The reason for this is that changes to the list of installed - * applications often come in groups (like during system updates) and - * rescanning the list on every change is pointless and expensive. - * - * Since: 2.40 - **/ - /** * GAppInfoMonitor: * - * The only thing you can do with this is to get it via - * g_app_info_monitor_get() and connect to the "changed" signal. + * `GAppInfoMonitor` monitors application information for changes. + * + * `GAppInfoMonitor` is a very simple object used for monitoring the app + * info database for changes (newly installed or removed applications). + * + * Call [func@Gio.AppInfoMonitor.get] to get a `GAppInfoMonitor` and connect + * to the [signal@Gio.AppInfoMonitor::changed] signal. The signal will be emitted once when + * the app info database changes, and will not be emitted again until after the + * next call to [func@Gio.AppInfo.get_all] or another `g_app_info_*()` function. + * This is because monitoring the app info database for changes is expensive. + * + * The following functions will re-arm the [signal@Gio.AppInfoMonitor::changed] + * signal so it can be emitted again: + * + * - [func@Gio.AppInfo.get_all] + * - [func@Gio.AppInfo.get_all_for_type] + * - [func@Gio.AppInfo.get_default_for_type] + * - [func@Gio.AppInfo.get_fallback_for_type] + * - [func@Gio.AppInfo.get_recommended_for_type] + * - [`g_desktop_app_info_get_implementations()`](../gio-unix/type_func.DesktopAppInfo.get_implementation.html) + * - [`g_desktop_app_info_new()`](../gio-unix/ctor.DesktopAppInfo.new.html) + * - [`g_desktop_app_info_new_from_filename()`](../gio-unix/ctor.DesktopAppInfo.new_from_filename.html) + * - [`g_desktop_app_info_new_from_keyfile()`](../gio-unix/ctor.DesktopAppInfo.new_from_keyfile.html) + * - [`g_desktop_app_info_search()`](../gio-unix/type_func.DesktopAppInfo.search.html) + * + * The latter functions are available if using + * [`GDesktopAppInfo`](../gio-unix/class.DesktopAppInfo.html) from + * `gio-unix-2.0.pc` (GIR namespace `GioUnix-2.0`). + * + * In the usual case, applications should try to make note of the change + * (doing things like invalidating caches) but not act on it. In + * particular, applications should avoid making calls to `GAppInfo` APIs + * in response to the change signal, deferring these until the time that + * the updated data is actually required. The exception to this case is when + * application information is actually being displayed on the screen + * (for example, during a search or when the list of all applications is shown). + * The reason for this is that changes to the list of installed applications + * often come in groups (like during system updates) and rescanning the list + * on every change is pointless and expensive. * * Since: 2.40 - **/ + */ typedef struct _GAppInfoMonitorClass GAppInfoMonitorClass; diff --git a/gio/gappinfo.h b/gio/gappinfo.h index 6b13596..93974db 100644 --- a/gio/gappinfo.h +++ b/gio/gappinfo.h @@ -46,13 +46,6 @@ G_BEGIN_DECLS typedef struct _GAppLaunchContextClass GAppLaunchContextClass; typedef struct _GAppLaunchContextPrivate GAppLaunchContextPrivate; -/** - * GAppInfo: - * - * Information about an installed application and methods to launch - * it (with file arguments). - */ - /** * GAppInfoIface: * @g_iface: The parent interface. diff --git a/gio/gapplication.c b/gio/gapplication.c index 31508eb..b7d2870 100644 --- a/gio/gapplication.c +++ b/gio/gapplication.c @@ -38,6 +38,7 @@ #include "gioenumtypes.h" #include "gioenums.h" #include "gfile.h" +#include "glib-private.h" #include "glibintl.h" #include "gmarshal-internal.h" @@ -45,25 +46,25 @@ #include /** - * SECTION:gapplication - * @title: GApplication - * @short_description: Core application class - * @include: gio/gio.h + * GApplication: * - * A #GApplication is the foundation of an application. It wraps some + * `GApplication` is the core class for application support. + * + * A `GApplication` is the foundation of an application. It wraps some * low-level platform-specific services and is intended to act as the * foundation for higher-level application classes such as - * #GtkApplication or #MxApplication. In general, you should not use + * `GtkApplication` or `MxApplication`. In general, you should not use * this class outside of a higher level framework. * - * GApplication provides convenient life cycle management by maintaining + * `GApplication` provides convenient life-cycle management by maintaining * a "use count" for the primary application instance. The use count can - * be changed using g_application_hold() and g_application_release(). If - * it drops to zero, the application exits. Higher-level classes such as - * #GtkApplication employ the use count to ensure that the application - * stays alive as long as it has any opened windows. + * be changed using [method@Gio.Application.hold] and + * [method@Gio.Application.release]. If it drops to zero, the application + * exits. Higher-level classes such as `GtkApplication` employ the use count + * to ensure that the application stays alive as long as it has any opened + * windows. * - * Another feature that GApplication (optionally) provides is process + * Another feature that `GApplication` (optionally) provides is process * uniqueness. Applications can make use of this functionality by * providing a unique application ID. If given, only one application * with this ID can be running at a time per session. The session @@ -75,53 +76,54 @@ * always the current instance. On Linux, the D-Bus session bus * is used for communication. * - * The use of #GApplication differs from some other commonly-used + * The use of `GApplication` differs from some other commonly-used * uniqueness libraries (such as libunique) in important ways. The * application is not expected to manually register itself and check * if it is the primary instance. Instead, the main() function of a - * #GApplication should do very little more than instantiating the + * `GApplication` should do very little more than instantiating the * application instance, possibly connecting signal handlers, then - * calling g_application_run(). All checks for uniqueness are done + * calling [method@Gio.Application.run]. All checks for uniqueness are done * internally. If the application is the primary instance then the * startup signal is emitted and the mainloop runs. If the application * is not the primary instance then a signal is sent to the primary - * instance and g_application_run() promptly returns. See the code + * instance and [method@Gio.Application.run] promptly returns. See the code * examples below. * - * If used, the expected form of an application identifier is the + * If used, the expected form of an application identifier is the * same as that of a * [D-Bus well-known bus name](https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-names-bus). * Examples include: `com.example.MyApp`, `org.example.internal_apps.Calculator`, * `org._7_zip.Archiver`. - * For details on valid application identifiers, see g_application_id_is_valid(). + * For details on valid application identifiers, see [func@Gio.Application.id_is_valid]. * * On Linux, the application identifier is claimed as a well-known bus name - * on the user's session bus. This means that the uniqueness of your - * application is scoped to the current session. It also means that your + * on the user's session bus. This means that the uniqueness of your + * application is scoped to the current session. It also means that your * application may provide additional services (through registration of other - * object paths) at that bus name. The registration of these object paths - * should be done with the shared GDBus session bus. Note that due to the + * object paths) at that bus name. The registration of these object paths + * should be done with the shared GDBus session bus. Note that due to the * internal architecture of GDBus, method calls can be dispatched at any time - * (even if a main loop is not running). For this reason, you must ensure that + * (even if a main loop is not running). For this reason, you must ensure that * any object paths that you wish to register are registered before #GApplication * attempts to acquire the bus name of your application (which happens in - * g_application_register()). Unfortunately, this means that you cannot use - * g_application_get_is_remote() to decide if you want to register object paths. + * [method@Gio.Application.register]). Unfortunately, this means that you cannot + * use [property@Gio.Application:is-remote] to decide if you want to register + * object paths. * - * GApplication also implements the #GActionGroup and #GActionMap + * `GApplication` also implements the [iface@Gio.ActionGroup] and [iface@Gio.ActionMap] * interfaces and lets you easily export actions by adding them with - * g_action_map_add_action(). When invoking an action by calling - * g_action_group_activate_action() on the application, it is always + * [method@Gio.ActionMap.add_action]. When invoking an action by calling + * [method@Gio.ActionGroup.activate_action] on the application, it is always * invoked in the primary instance. The actions are also exported on - * the session bus, and GIO provides the #GDBusActionGroup wrapper to - * conveniently access them remotely. GIO provides a #GDBusMenuModel wrapper - * for remote access to exported #GMenuModels. + * the session bus, and GIO provides the [class@Gio.DBusActionGroup] wrapper to + * conveniently access them remotely. GIO provides a [class@Gio.DBusMenuModel] wrapper + * for remote access to exported [class@Gio.MenuModel]s. * * Note: Due to the fact that actions are exported on the session bus, * using `maybe` parameters is not supported, since D-Bus does not support * `maybe` types. * - * There is a number of different entry points into a GApplication: + * There is a number of different entry points into a `GApplication`: * * - via 'Activate' (i.e. just starting the application) * @@ -131,50 +133,45 @@ * * - via activating an action * - * The #GApplication::startup signal lets you handle the application + * The [signal@Gio.Application::startup] signal lets you handle the application * initialization for all of these in a single place. * * Regardless of which of these entry points is used to start the - * application, GApplication passes some ‘platform data’ from the + * application, `GApplication` passes some ‘platform data’ from the * launching instance to the primary instance, in the form of a - * #GVariant dictionary mapping strings to variants. To use platform - * data, override the @before_emit or @after_emit virtual functions - * in your #GApplication subclass. When dealing with - * #GApplicationCommandLine objects, the platform data is - * directly available via g_application_command_line_get_cwd(), - * g_application_command_line_get_environ() and - * g_application_command_line_get_platform_data(). + * [struct@GLib.Variant] dictionary mapping strings to variants. To use platform + * data, override the [vfunc@Gio.Application.before_emit] or + * [vfunc@Gio.Application.after_emit] virtual functions + * in your `GApplication` subclass. When dealing with + * [class@Gio.ApplicationCommandLine] objects, the platform data is + * directly available via [method@Gio.ApplicationCommandLine.get_cwd], + * [method@Gio.ApplicationCommandLine.get_environ] and + * [method@Gio.ApplicationCommandLine.get_platform_data]. * * As the name indicates, the platform data may vary depending on the * operating system, but it always includes the current directory (key - * "cwd"), and optionally the environment (ie the set of environment - * variables and their values) of the calling process (key "environ"). + * `cwd`), and optionally the environment (ie the set of environment + * variables and their values) of the calling process (key `environ`). * The environment is only added to the platform data if the - * %G_APPLICATION_SEND_ENVIRONMENT flag is set. #GApplication subclasses - * can add their own platform data by overriding the @add_platform_data - * virtual function. For instance, #GtkApplication adds startup notification - * data in this way. + * `G_APPLICATION_SEND_ENVIRONMENT` flag is set. `GApplication` subclasses + * can add their own platform data by overriding the + * [vfunc@Gio.Application.add_platform_data] virtual function. For instance, + * `GtkApplication` adds startup notification data in this way. * * To parse commandline arguments you may handle the - * #GApplication::command-line signal or override the local_command_line() - * vfunc, to parse them in either the primary instance or the local instance, - * respectively. + * [signal@Gio.Application::command-line] signal or override the + * [vfunc@Gio.Application.local_command_line] virtual funcion, to parse them in + * either the primary instance or the local instance, respectively. * - * For an example of opening files with a GApplication, see + * For an example of opening files with a `GApplication`, see * [gapplication-example-open.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-open.c). * - * For an example of using actions with GApplication, see + * For an example of using actions with `GApplication`, see * [gapplication-example-actions.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-actions.c). * - * For an example of using extra D-Bus hooks with GApplication, see + * For an example of using extra D-Bus hooks with `GApplication`, see * [gapplication-example-dbushooks.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-dbushooks.c). - */ - -/** - * GApplication: * - * #GApplication is an opaque data structure and can only be accessed - * using the following functions. * Since: 2.28 */ @@ -211,7 +208,7 @@ * using its D-Bus backend. You can use this to export extra objects on the * bus, that need to exist before the application tries to own the bus name. * The function is passed the #GDBusConnection to to session bus, and the - * object path that #GApplication will use to export is D-Bus API. + * object path that #GApplication will use to export its D-Bus API. * If this function returns %TRUE, registration will proceed; otherwise * registration will abort. Since: 2.34 * @dbus_unregister: invoked locally during unregistration, if the application @@ -230,6 +227,7 @@ struct _GApplicationPrivate { GApplicationFlags flags; gchar *id; + gchar *version; gchar *resource_path; GActionGroup *actions; @@ -267,6 +265,7 @@ enum { PROP_NONE, PROP_APPLICATION_ID, + PROP_VERSION, PROP_FLAGS, PROP_RESOURCE_BASE_PATH, PROP_IS_REGISTERED, @@ -481,11 +480,13 @@ g_application_pack_option_entries (GApplication *application, static GVariantDict * g_application_parse_command_line (GApplication *application, gchar ***arguments, + gboolean *print_version, GError **error) { gboolean become_service = FALSE; gchar *app_id = NULL; gboolean replace = FALSE; + gboolean version = FALSE; GVariantDict *dict = NULL; GOptionContext *context; GOptionGroup *gapplication_group; @@ -567,6 +568,17 @@ g_application_parse_command_line (GApplication *application, g_option_group_add_entries (gapplication_group, entries); } + if (application->priv->version) + { + GOptionEntry entries[] = { + { "version", '\0', 0, G_OPTION_ARG_NONE, &version, + N_("Print the application version"), NULL }, + G_OPTION_ENTRY_NULL + }; + + g_option_group_add_entries (gapplication_group, entries); + } + /* Allow replacing if the application allows it */ if (application->priv->flags & G_APPLICATION_ALLOW_REPLACEMENT) { @@ -583,6 +595,8 @@ g_application_parse_command_line (GApplication *application, if (!g_option_context_parse_strv (context, arguments, error)) goto out; + *print_version = version; + /* Check for --gapplication-service */ if (become_service) application->priv->flags |= G_APPLICATION_IS_SERVICE; @@ -658,8 +672,8 @@ add_packed_option (GApplication *application, /** * g_application_add_main_option_entries: * @application: a #GApplication - * @entries: (array zero-terminated=1) (element-type GOptionEntry) a - * %NULL-terminated list of #GOptionEntrys + * @entries: (array zero-terminated=1) (element-type GOptionEntry): the + * main options for the application * * Adds main option entries to be handled by @application. * @@ -1079,13 +1093,19 @@ g_application_call_command_line (GApplication *application, { GApplicationCommandLine *cmdline; GVariant *v; + gint handler_exit_status; v = g_variant_new_bytestring_array ((const gchar **) arguments, -1); cmdline = g_object_new (G_TYPE_APPLICATION_COMMAND_LINE, "arguments", v, "options", options, NULL); - g_signal_emit (application, g_application_signals[SIGNAL_COMMAND_LINE], 0, cmdline, exit_status); + g_signal_emit (application, g_application_signals[SIGNAL_COMMAND_LINE], 0, cmdline, &handler_exit_status); + + /* For consistency with remote invocations */ + g_application_command_line_set_exit_status (cmdline, handler_exit_status); + *exit_status = g_application_command_line_get_exit_status (cmdline); + g_object_unref (cmdline); } } @@ -1098,8 +1118,9 @@ g_application_real_local_command_line (GApplication *application, GError *error = NULL; GVariantDict *options; gint n_args; + gboolean print_version = FALSE; - options = g_application_parse_command_line (application, arguments, &error); + options = g_application_parse_command_line (application, arguments, &print_version, &error); if (!options) { g_printerr ("%s\n", error->message); @@ -1108,6 +1129,21 @@ g_application_real_local_command_line (GApplication *application, return TRUE; } + /* Exit quickly with --version? */ + if (print_version) + { + const char *prgname = g_get_prgname (); + + g_assert (application->priv->version != NULL); + + if (prgname != NULL) + g_print ("%s %s\n", prgname, application->priv->version); + else + g_print ("%s\n", application->priv->version); + *exit_status = EXIT_SUCCESS; + return TRUE; + } + g_signal_emit (application, g_application_signals[SIGNAL_HANDLE_LOCAL_OPTIONS], 0, options, exit_status); if (*exit_status >= 0) @@ -1233,6 +1269,10 @@ g_application_set_property (GObject *object, g_value_get_string (value)); break; + case PROP_VERSION: + g_application_set_version (application, g_value_get_string (value)); + break; + case PROP_FLAGS: g_application_set_flags (application, g_value_get_flags (value)); break; @@ -1303,6 +1343,11 @@ g_application_get_property (GObject *object, g_application_get_application_id (application)); break; + case PROP_VERSION: + g_value_set_string (value, + g_application_get_version (application)); + break; + case PROP_FLAGS: g_value_set_flags (value, g_application_get_flags (application)); @@ -1398,6 +1443,7 @@ g_application_finalize (GObject *object) g_free (application->priv->parameter_string); g_free (application->priv->summary); g_free (application->priv->description); + g_free (application->priv->version); g_slist_free_full (application->priv->option_strings, g_free); @@ -1481,49 +1527,96 @@ g_application_class_init (GApplicationClass *class) class->dbus_unregister = g_application_real_dbus_unregister; class->name_lost = g_application_real_name_lost; + /** + * GApplication:application-id: + * + * The unique identifier for the application. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_APPLICATION_ID, - g_param_spec_string ("application-id", - P_("Application identifier"), - P_("The unique identifier for the application"), + g_param_spec_string ("application-id", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:version: + * + * The human-readable version number of the application. + * + * Since: 2.80 + */ + g_object_class_install_property (object_class, PROP_VERSION, + g_param_spec_string ("version", NULL, NULL, + NULL, G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); + + /** + * GApplication:flags: + * + * Flags specifying the behaviour of the application. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("Application flags"), - P_("Flags specifying the behaviour of the application"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_APPLICATION_FLAGS, G_APPLICATION_DEFAULT_FLAGS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:resource-base-path: + * + * The base resource path for the application. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_RESOURCE_BASE_PATH, - g_param_spec_string ("resource-base-path", - P_("Resource base path"), - P_("The base resource path for the application"), + g_param_spec_string ("resource-base-path", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:is-registered: + * + * Whether [method@Gio.Application.register] has been called. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_IS_REGISTERED, - g_param_spec_boolean ("is-registered", - P_("Is registered"), - P_("If g_application_register() has been called"), + g_param_spec_boolean ("is-registered", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:is-remote: + * + * Whether this application instance is remote. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_IS_REMOTE, - g_param_spec_boolean ("is-remote", - P_("Is remote"), - P_("If this application instance is remote"), + g_param_spec_boolean ("is-remote", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:inactivity-timeout: + * + * Time (in milliseconds) to stay alive after becoming idle. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_INACTIVITY_TIMEOUT, - g_param_spec_uint ("inactivity-timeout", - P_("Inactivity timeout"), - P_("Time (ms) to stay alive after becoming idle"), + g_param_spec_uint ("inactivity-timeout", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GApplication:action-group: + * + * The group of actions that the application exports. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_ACTION_GROUP, - g_param_spec_object ("action-group", - P_("Action group"), - P_("The group of actions that the application exports"), + g_param_spec_object ("action-group", NULL, NULL, G_TYPE_ACTION_GROUP, G_PARAM_DEPRECATED | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); @@ -1536,9 +1629,7 @@ g_application_class_init (GApplicationClass *class) * Since: 2.44 */ g_object_class_install_property (object_class, PROP_IS_BUSY, - g_param_spec_boolean ("is-busy", - P_("Is busy"), - P_("If this application is currently marked busy"), + g_param_spec_boolean ("is-busy", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); /** @@ -1851,6 +1942,50 @@ g_application_set_application_id (GApplication *application, } } +/** + * g_application_get_version: + * @application: a #GApplication + * + * Gets the version of @application. + * + * Returns: (nullable): the version of @application + * + * Since: 2.80 + **/ +const gchar * +g_application_get_version (GApplication *application) +{ + g_return_val_if_fail (G_IS_APPLICATION (application), NULL); + + return application->priv->version; +} + +/** + * g_application_set_version + * @application: a #GApplication + * @version: the version of @application + * + * Sets the version number of @application. This will be used to implement + * a `--version` command line argument + * + * The application version can only be modified if @application has not yet + * been registered. + * + * Since: 2.80 + **/ +void +g_application_set_version (GApplication *application, + const gchar *version) +{ + g_return_if_fail (G_IS_APPLICATION (application)); + g_return_if_fail (version != NULL); + g_return_if_fail (!application->priv->is_registered); + + if (g_set_str (&application->priv->version, version)) + g_object_notify (G_OBJECT (application), "version"); +} + + /** * g_application_get_flags: * @application: a #GApplication @@ -2530,7 +2665,7 @@ g_application_run (GApplication *application, gchar *prgname; prgname = g_path_get_basename (argv[0]); - g_set_prgname (prgname); + GLIB_PRIVATE_CALL (g_set_prgname_once) (prgname); g_free (prgname); } @@ -2945,6 +3080,9 @@ g_application_get_is_busy (GApplication *application) * If @notification is no longer relevant, it can be withdrawn with * g_application_withdraw_notification(). * + * It is an error to call this function if @application has no + * application ID. + * * Since: 2.40 */ void @@ -2958,6 +3096,7 @@ g_application_send_notification (GApplication *application, g_return_if_fail (G_IS_NOTIFICATION (notification)); g_return_if_fail (g_application_get_is_registered (application)); g_return_if_fail (!g_application_get_is_remote (application)); + g_return_if_fail (g_application_get_application_id (application) != NULL); if (application->priv->notifications == NULL) application->priv->notifications = g_notification_backend_new_default (application); diff --git a/gio/gapplication.h b/gio/gapplication.h index cb6b908..6df0bb4 100644 --- a/gio/gapplication.h +++ b/gio/gapplication.h @@ -139,6 +139,12 @@ GIO_AVAILABLE_IN_ALL void g_application_set_application_id (GApplication *application, const gchar *application_id); +GIO_AVAILABLE_IN_2_80 +const gchar * g_application_get_version (GApplication *application); +GIO_AVAILABLE_IN_2_80 +void g_application_set_version (GApplication *application, + const gchar *version); + GIO_AVAILABLE_IN_2_34 GDBusConnection * g_application_get_dbus_connection (GApplication *application); GIO_AVAILABLE_IN_2_34 diff --git a/gio/gapplicationcommandline.c b/gio/gapplicationcommandline.c index e9a6f46..b3a6d00 100644 --- a/gio/gapplicationcommandline.c +++ b/gio/gapplicationcommandline.c @@ -40,36 +40,35 @@ #endif /** - * SECTION:gapplicationcommandline - * @title: GApplicationCommandLine - * @short_description: A command-line invocation of an application - * @include: gio/gio.h - * @see_also: #GApplication + * GApplicationCommandLine: * - * #GApplicationCommandLine represents a command-line invocation of - * an application. It is created by #GApplication and emitted - * in the #GApplication::command-line signal and virtual function. + * `GApplicationCommandLine` represents a command-line invocation of + * an application. + * + * It is created by [class@Gio.Application] and emitted + * in the [signal@Gio.Application::command-line] signal and virtual function. * * The class contains the list of arguments that the program was invoked - * with. It is also possible to query if the commandline invocation was + * with. It is also possible to query if the commandline invocation was * local (ie: the current process is running in direct response to the * invocation) or remote (ie: some other process forwarded the * commandline to this process). * - * The GApplicationCommandLine object can provide the @argc and @argv - * parameters for use with the #GOptionContext command-line parsing API, - * with the g_application_command_line_get_arguments() function. See + * The `GApplicationCommandLine` object can provide the @argc and @argv + * parameters for use with the [struct@GLib.OptionContext] command-line parsing API, + * with the [method@Gio.ApplicationCommandLine.get_arguments] function. See * [gapplication-example-cmdline3.c][gapplication-example-cmdline3] * for an example. * * The exit status of the originally-invoked process may be set and - * messages can be printed to stdout or stderr of that process. The - * lifecycle of the originally-invoked process is tied to the lifecycle - * of this object (ie: the process exits when the last reference is - * dropped). + * messages can be printed to stdout or stderr of that process. * - * The main use for #GApplicationCommandLine (and the - * #GApplication::command-line signal) is 'Emacs server' like use cases: + * For remote invocation, the originally-invoked process exits when + * [method@Gio.ApplicationCommandLine.done] method is called. This method is + * also automatically called when the object is disposed. + * + * The main use for `GApplicationCommandLine` (and the + * [signal@Gio.Application::command-line] signal) is 'Emacs server' like use cases: * You can set the `EDITOR` environment variable to have e.g. git use * your favourite editor to edit commit messages, and if you already * have an instance of the editor running, the editing will happen @@ -78,11 +77,12 @@ * does not return until the editing is done. * * Normally, the commandline is completely handled in the - * #GApplication::command-line handler. The launching instance exits + * [signal@Gio.Application::command-line] handler. The launching instance exits * once the signal handler in the primary instance has returned, and * the return value of the signal handler becomes the exit status * of the launching instance. - * |[ + * + * ```c * static int * command_line (GApplication *application, * GApplicationCommandLine *cmdline) @@ -104,13 +104,15 @@ * * return 0; * } - * ]| - * The complete example can be found here: + * ``` + * + * The complete example can be found here: * [gapplication-example-cmdline.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline.c) * * In more complicated cases, the handling of the commandline can be * split between the launcher and the primary instance. - * |[ + * + * ```c * static gboolean * test_local_cmdline (GApplication *application, * gchar ***arguments, @@ -156,18 +158,19 @@ * * ... * } - * ]| + * ``` + * * In this example of split commandline handling, options that start * with `--local-` are handled locally, all other options are passed - * to the #GApplication::command-line handler which runs in the primary + * to the [signal@Gio.Application::command-line] handler which runs in the primary * instance. * * The complete example can be found here: * [gapplication-example-cmdline2.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline2.c) * - * If handling the commandline requires a lot of work, it may - * be better to defer it. - * |[ + * If handling the commandline requires a lot of work, it may be better to defer it. + * + * ```c * static gboolean * my_cmdline_handler (gpointer data) * { @@ -197,10 +200,11 @@ * * return 0; * } - * ]| + * ``` + * * In this example the commandline is not completely handled before - * the #GApplication::command-line handler returns. Instead, we keep - * a reference to the #GApplicationCommandLine object and handle it + * the [signal@Gio.Application::command-line] handler returns. Instead, we keep + * a reference to the `GApplicationCommandLine` object and handle it * later (in this example, in an idle). Note that it is necessary to * hold the application until you are done with the commandline. * @@ -208,13 +212,6 @@ * [gapplication-example-cmdline3.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gapplication-example-cmdline3.c) */ -/** - * GApplicationCommandLine: - * - * #GApplicationCommandLine is an opaque data structure and can only be accessed - * using the following functions. - */ - /** * GApplicationCommandLineClass: * @@ -242,6 +239,7 @@ struct _GApplicationCommandLinePrivate gchar **environ; gint exit_status; + gboolean done; }; G_DEFINE_TYPE_WITH_PRIVATE (GApplicationCommandLine, g_application_command_line, G_TYPE_OBJECT) @@ -304,6 +302,11 @@ g_application_command_line_real_get_stdin (GApplicationCommandLine *cmdline) #endif } +static void +g_application_command_line_real_done (GApplicationCommandLine *cmdline) +{ +} + static void g_application_command_line_get_property (GObject *object, guint prop_id, @@ -363,6 +366,16 @@ g_application_command_line_set_property (GObject *object, } } +static void +g_application_command_line_dispose (GObject *object) +{ + GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); + + g_application_command_line_done (cmdline); + + G_OBJECT_CLASS (g_application_command_line_parent_class)->dispose (object); +} + static void g_application_command_line_finalize (GObject *object) { @@ -416,39 +429,63 @@ g_application_command_line_class_init (GApplicationCommandLineClass *class) object_class->get_property = g_application_command_line_get_property; object_class->set_property = g_application_command_line_set_property; object_class->finalize = g_application_command_line_finalize; + object_class->dispose = g_application_command_line_dispose; object_class->constructed = g_application_command_line_constructed; class->printerr_literal = g_application_command_line_real_printerr_literal; class->print_literal = g_application_command_line_real_print_literal; class->get_stdin = g_application_command_line_real_get_stdin; + class->done = g_application_command_line_real_done; + + /** + * GApplicationCommandLine:arguments: + * + * The commandline that caused this [signal@Gio.Application::command-line] + * signal emission. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_ARGUMENTS, - g_param_spec_variant ("arguments", - P_("Commandline arguments"), - P_("The commandline that caused this ::command-line signal emission"), + g_param_spec_variant ("arguments", NULL, NULL, G_VARIANT_TYPE_BYTESTRING_ARRAY, NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GApplicationCommandLine:options: + * + * The options sent along with the commandline. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_OPTIONS, - g_param_spec_variant ("options", - P_("Options"), - P_("The options sent along with the commandline"), + g_param_spec_variant ("options", NULL, NULL, G_VARIANT_TYPE_VARDICT, NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GApplicationCommandLine:platform-data: + * + * Platform-specific data for the commandline. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_PLATFORM_DATA, - g_param_spec_variant ("platform-data", - P_("Platform data"), - P_("Platform-specific data for the commandline"), + g_param_spec_variant ("platform-data", NULL, NULL, G_VARIANT_TYPE ("a{sv}"), NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GApplicationCommandLine:is-remote: + * + * Whether this is a remote commandline. + * + * Since: 2.28 + */ g_object_class_install_property (object_class, PROP_IS_REMOTE, - g_param_spec_boolean ("is-remote", - P_("Is remote"), - P_("TRUE if this is a remote commandline"), + g_param_spec_boolean ("is-remote", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } @@ -658,6 +695,54 @@ g_application_command_line_get_is_remote (GApplicationCommandLine *cmdline) return IS_REMOTE (cmdline); } +/** + * g_application_command_line_print_literal: + * @cmdline: a #GApplicationCommandLine + * @message: the message + * + * Prints a message using the stdout print handler in the invoking process. + * + * Unlike g_application_command_line_print(), @message is not a `printf()`-style + * format string. Use this function if @message contains text you don't have + * control over, that could include `printf()` escape sequences. + * + * Since: 2.80 + **/ +void +g_application_command_line_print_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + g_return_if_fail (message != NULL); + + G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline) + ->print_literal (cmdline, message); +} + +/** + * g_application_command_line_printerr_literal: + * @cmdline: a #GApplicationCommandLine + * @message: the message + * + * Prints a message using the stderr print handler in the invoking process. + * + * Unlike g_application_command_line_printerr(), @message is not + * a `printf()`-style format string. Use this function if @message contains text + * you don't have control over, that could include `printf()` escape sequences. + * + * Since: 2.80 + **/ +void +g_application_command_line_printerr_literal (GApplicationCommandLine *cmdline, + const gchar *message) +{ + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + g_return_if_fail (message != NULL); + + G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline) + ->printerr_literal (cmdline, message); +} + /** * g_application_command_line_print: * @cmdline: a #GApplicationCommandLine @@ -755,6 +840,9 @@ g_application_command_line_printerr (GApplicationCommandLine *cmdline, * always zero. If the application use count is zero, though, the exit * status of the local #GApplicationCommandLine is used. * + * This method is a no-op if g_application_command_line_done() has + * been called. + * * Since: 2.28 **/ void @@ -763,6 +851,9 @@ g_application_command_line_set_exit_status (GApplicationCommandLine *cmdline, { g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + if (cmdline->priv->done) + return; + cmdline->priv->exit_status = exit_status; } @@ -846,3 +937,38 @@ g_application_command_line_create_file_for_arg (GApplicationCommandLine *cmdline return g_file_new_for_commandline_arg (arg); } + +/** + * g_application_command_line_done: + * @cmdline: a #GApplicationCommandLine + * + * Signals that command line processing is completed. + * + * For remote invocation, it causes the invoking process to terminate. + * + * For local invocation, it does nothing. + * + * This method should be called in the [signal@Gio.Application::command-line] + * handler, after the exit status is set and all messages are printed. + * + * After this call, g_application_command_line_set_exit_status() has no effect. + * Subsequent calls to this method are no-ops. + * + * This method is automatically called when the #GApplicationCommandLine + * object is disposed — so you can omit the call in non-garbage collected + * languages. + * + * Since: 2.80 + **/ +void +g_application_command_line_done (GApplicationCommandLine *cmdline) +{ + g_return_if_fail (G_IS_APPLICATION_COMMAND_LINE (cmdline)); + + if (cmdline->priv->done) + return; + + G_APPLICATION_COMMAND_LINE_GET_CLASS (cmdline)->done (cmdline); + + cmdline->priv->done = TRUE; +} diff --git a/gio/gapplicationcommandline.h b/gio/gapplicationcommandline.h index abb6852..51133c4 100644 --- a/gio/gapplicationcommandline.h +++ b/gio/gapplicationcommandline.h @@ -67,8 +67,9 @@ struct _GApplicationCommandLineClass void (* printerr_literal) (GApplicationCommandLine *cmdline, const gchar *message); GInputStream * (* get_stdin) (GApplicationCommandLine *cmdline); + void (* done) (GApplicationCommandLine *cmdline); - gpointer padding[11]; + gpointer padding[10]; }; GIO_AVAILABLE_IN_ALL @@ -97,6 +98,13 @@ const gchar * g_application_command_line_get_cwd (GApplic GIO_AVAILABLE_IN_ALL gboolean g_application_command_line_get_is_remote (GApplicationCommandLine *cmdline); +GIO_AVAILABLE_IN_2_80 +void g_application_command_line_print_literal (GApplicationCommandLine *cmdline, + const gchar *message); +GIO_AVAILABLE_IN_2_80 +void g_application_command_line_printerr_literal (GApplicationCommandLine *cmdline, + const gchar *message); + GIO_AVAILABLE_IN_ALL void g_application_command_line_print (GApplicationCommandLine *cmdline, const gchar *format, @@ -119,6 +127,9 @@ GIO_AVAILABLE_IN_2_36 GFile * g_application_command_line_create_file_for_arg (GApplicationCommandLine *cmdline, const gchar *arg); +GIO_AVAILABLE_IN_2_80 +void g_application_command_line_done (GApplicationCommandLine *cmdline); + G_END_DECLS #endif /* __G_APPLICATION_COMMAND_LINE_H__ */ diff --git a/gio/gapplicationimpl-dbus.c b/gio/gapplicationimpl-dbus.c index ac6644d..f9bf28c 100644 --- a/gio/gapplicationimpl-dbus.c +++ b/gio/gapplicationimpl-dbus.c @@ -970,18 +970,26 @@ g_dbus_command_line_get_stdin (GApplicationCommandLine *cmdline) static void g_dbus_command_line_finalize (GObject *object) { - GApplicationCommandLine *cmdline = G_APPLICATION_COMMAND_LINE (object); GDBusCommandLine *gdbcl = (GDBusCommandLine *) object; + + g_object_unref (gdbcl->invocation); + + G_OBJECT_CLASS (g_dbus_command_line_parent_class) + ->finalize (object); +} + +static void +g_dbus_command_line_done (GApplicationCommandLine *cmdline) +{ + GDBusCommandLine *gdbcl = (GDBusCommandLine *) cmdline; gint status; status = g_application_command_line_get_exit_status (cmdline); g_dbus_method_invocation_return_value (gdbcl->invocation, g_variant_new ("(i)", status)); - g_object_unref (gdbcl->invocation); - G_OBJECT_CLASS (g_dbus_command_line_parent_class) - ->finalize (object); + G_APPLICATION_COMMAND_LINE_CLASS (g_dbus_command_line_parent_class)->done (cmdline); } static void @@ -998,6 +1006,7 @@ g_dbus_command_line_class_init (GApplicationCommandLineClass *class) class->printerr_literal = g_dbus_command_line_printerr_literal; class->print_literal = g_dbus_command_line_print_literal; class->get_stdin = g_dbus_command_line_get_stdin; + class->done = g_dbus_command_line_done; } static GApplicationCommandLine * diff --git a/gio/gasynchelper.c b/gio/gasynchelper.c index 433837f..346fd5b 100644 --- a/gio/gasynchelper.c +++ b/gio/gasynchelper.c @@ -26,14 +26,10 @@ /*< private > - * SECTION:gasynchelper - * @short_description: Asynchronous Helper Functions - * @include: gio/gio.h - * @see_also: #GAsyncResult + * GAsyncHelper: * * Provides helper functions for asynchronous operations. - * - **/ + */ #ifdef G_OS_WIN32 gboolean diff --git a/gio/gasyncinitable.c b/gio/gasyncinitable.c index c1a05e8..024efa2 100644 --- a/gio/gasyncinitable.c +++ b/gio/gasyncinitable.c @@ -29,27 +29,26 @@ /** - * SECTION:gasyncinitable - * @short_description: Asynchronously failable object initialization interface - * @include: gio/gio.h - * @see_also: #GInitable + * GAsyncInitable: * - * This is the asynchronous version of #GInitable; it behaves the same + * `GAsyncInitable` is an interface for asynchronously initializable objects. + * + * This is the asynchronous version of [iface@Gio.Initable]; it behaves the same * in all ways except that initialization is asynchronous. For more details - * see the descriptions on #GInitable. + * see the descriptions on `GInitable`. * - * A class may implement both the #GInitable and #GAsyncInitable interfaces. + * A class may implement both the `GInitable` and `GAsyncInitable` interfaces. * * Users of objects implementing this are not intended to use the interface * method directly; instead it will be used automatically in various ways. - * For C applications you generally just call g_async_initable_new_async() + * For C applications you generally just call [func@Gio.AsyncInitable.new_async] * directly, or indirectly via a foo_thing_new_async() wrapper. This will call - * g_async_initable_init_async() under the cover, calling back with %NULL and - * a set %GError on failure. + * [method@Gio.AsyncInitable.init_async] under the covers, calling back with `NULL` + * and a set `GError` on failure. * * A typical implementation might look something like this: * - * |[ + * ```c * enum { * NOT_INITIALIZED, * INITIALIZING, @@ -132,7 +131,9 @@ * iface->init_async = foo_init_async; * iface->init_finish = foo_init_finish; * } - * ]| + * ``` + * + * Since: 2.22 */ static void g_async_initable_real_init_async (GAsyncInitable *initable, diff --git a/gio/gasyncinitable.h b/gio/gasyncinitable.h index 1808398..eb9b026 100644 --- a/gio/gasyncinitable.h +++ b/gio/gasyncinitable.h @@ -38,13 +38,6 @@ G_BEGIN_DECLS #define G_ASYNC_INITABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ASYNC_INITABLE, GAsyncInitableIface)) #define G_TYPE_IS_ASYNC_INITABLE(type) (g_type_is_a ((type), G_TYPE_ASYNC_INITABLE)) -/** - * GAsyncInitable: - * - * Interface for asynchronously initializable objects. - * - * Since: 2.22 - **/ typedef struct _GAsyncInitableIface GAsyncInitableIface; /** diff --git a/gio/gasyncresult.c b/gio/gasyncresult.c index 4d2f5f9..70024bc 100644 --- a/gio/gasyncresult.c +++ b/gio/gasyncresult.c @@ -27,42 +27,40 @@ /** - * SECTION:gasyncresult - * @short_description: Asynchronous Function Results - * @include: gio/gio.h - * @see_also: #GTask + * GAsyncResult: * - * Provides a base class for implementing asynchronous function results. + * `GAsyncResult` provides a base class for implementing asynchronous function results. * * Asynchronous operations are broken up into two separate operations - * which are chained together by a #GAsyncReadyCallback. To begin - * an asynchronous operation, provide a #GAsyncReadyCallback to the + * which are chained together by a `GAsyncReadyCallback`. To begin + * an asynchronous operation, provide a `GAsyncReadyCallback` to the * asynchronous function. This callback will be triggered when the * operation has completed, and must be run in a later iteration of - * the [thread-default main context][g-main-context-push-thread-default] - * from where the operation was initiated. It will be passed a - * #GAsyncResult instance filled with the details of the operation's - * success or failure, the object the asynchronous function was - * started for and any error codes returned. The asynchronous callback - * function is then expected to call the corresponding "_finish()" + * the thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) from where the operation was + * initiated. It will be passed a `GAsyncResult` instance filled with the + * details of the operation's success or failure, the object the asynchronous + * function was started for and any error codes returned. The asynchronous + * callback function is then expected to call the corresponding `_finish()` * function, passing the object the function was called for, the - * #GAsyncResult instance, and (optionally) an @error to grab any + * `GAsyncResult` instance, and (optionally) an @error to grab any * error conditions that may have occurred. * - * The "_finish()" function for an operation takes the generic result - * (of type #GAsyncResult) and returns the specific result that the - * operation in question yields (e.g. a #GFileEnumerator for a + * The `_finish()` function for an operation takes the generic result + * (of type `GAsyncResult`) and returns the specific result that the + * operation in question yields (e.g. a [class@Gio.FileEnumerator] for a * "enumerate children" operation). If the result or error status of the - * operation is not needed, there is no need to call the "_finish()" + * operation is not needed, there is no need to call the `_finish()` * function; GIO will take care of cleaning up the result and error - * information after the #GAsyncReadyCallback returns. You can pass - * %NULL for the #GAsyncReadyCallback if you don't need to take any + * information after the `GAsyncReadyCallback` returns. You can pass + * `NULL` for the `GAsyncReadyCallback` if you don't need to take any * action at all after the operation completes. Applications may also - * take a reference to the #GAsyncResult and call "_finish()" later; - * however, the "_finish()" function may be called at most once. + * take a reference to the `GAsyncResult` and call `_finish()` later; + * however, the `_finish()` function may be called at most once. * * Example of a typical asynchronous operation flow: - * |[ + * + * ```c * void _theoretical_frobnitz_async (Theoretical *t, * GCancellable *c, * GAsyncReadyCallback cb, @@ -101,20 +99,20 @@ * * ... * } - * ]| + * ``` * * The callback for an asynchronous operation is called only once, and is * always called, even in the case of a cancelled operation. On cancellation - * the result is a %G_IO_ERROR_CANCELLED error. + * the result is a `G_IO_ERROR_CANCELLED` error. * - * ## I/O Priority # {#io-priority} + * ## I/O Priority * * Many I/O-related asynchronous operations have a priority parameter, * which is used in certain cases to determine the order in which * operations are executed. They are not used to determine system-wide * I/O scheduling. Priorities are integers, with lower numbers indicating * higher priority. It is recommended to choose priorities between - * %G_PRIORITY_LOW and %G_PRIORITY_HIGH, with %G_PRIORITY_DEFAULT + * `G_PRIORITY_LOW` and `G_PRIORITY_HIGH`, with `G_PRIORITY_DEFAULT` * as a default. */ diff --git a/gio/gasyncresult.h b/gio/gasyncresult.h index 4a98c5f..17c79d4 100644 --- a/gio/gasyncresult.h +++ b/gio/gasyncresult.h @@ -36,12 +36,6 @@ G_BEGIN_DECLS #define G_IS_ASYNC_RESULT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_ASYNC_RESULT)) #define G_ASYNC_RESULT_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ASYNC_RESULT, GAsyncResultIface)) -/** - * GAsyncResult: - * - * Holds results information for an asynchronous operation, - * usually passed directly to an asynchronous _finish() operation. - **/ typedef struct _GAsyncResultIface GAsyncResultIface; diff --git a/gio/gbufferedinputstream.c b/gio/gbufferedinputstream.c index 1729ebd..64cb293 100644 --- a/gio/gbufferedinputstream.c +++ b/gio/gbufferedinputstream.c @@ -34,25 +34,21 @@ /** - * SECTION:gbufferedinputstream - * @short_description: Buffered Input Stream - * @include: gio/gio.h - * @see_also: #GFilterInputStream, #GInputStream + * GBufferedInputStream: * * Buffered input stream implements #GFilterInputStream and provides * for buffered reads. * - * By default, #GBufferedInputStream's buffer size is set at 4 kilobytes. + * By default, `GBufferedInputStream`'s buffer size is set at 4 kilobytes. * - * To create a buffered input stream, use g_buffered_input_stream_new(), - * or g_buffered_input_stream_new_sized() to specify the buffer's size at + * To create a buffered input stream, use [ctor@Gio.BufferedInputStream.new], + * or [ctor@Gio.BufferedInputStream.new_sized] to specify the buffer's size at * construction. * * To get the size of a buffer within a buffered input stream, use - * g_buffered_input_stream_get_buffer_size(). To change the size of a - * buffered input stream's buffer, use - * g_buffered_input_stream_set_buffer_size(). Note that the buffer's size - * cannot be reduced below the size of the data within the buffer. + * [method@Gio.BufferedInputStream.get_buffer_size]. To change the size of a + * buffered input stream's buffer, use [method@Gio.BufferedInputStream.set_buffer_size]. + * Note that the buffer's size cannot be reduced below the size of the data within the buffer. */ @@ -161,11 +157,14 @@ g_buffered_input_stream_class_init (GBufferedInputStreamClass *klass) bstream_class->fill_async = g_buffered_input_stream_real_fill_async; bstream_class->fill_finish = g_buffered_input_stream_real_fill_finish; + /** + * GBufferedInputStream:buffer-size: + * + * The size of the backend buffer, in bytes. + */ g_object_class_install_property (object_class, PROP_BUFSIZE, - g_param_spec_uint ("buffer-size", - P_("Buffer Size"), - P_("The size of the backend buffer"), + g_param_spec_uint ("buffer-size", NULL, NULL, 1, G_MAXUINT, DEFAULT_BUFFER_SIZE, diff --git a/gio/gbufferedinputstream.h b/gio/gbufferedinputstream.h index c6b1dea..eced51f 100644 --- a/gio/gbufferedinputstream.h +++ b/gio/gbufferedinputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_BUFFERED_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_BUFFERED_INPUT_STREAM)) #define G_BUFFERED_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_BUFFERED_INPUT_STREAM, GBufferedInputStreamClass)) -/** - * GBufferedInputStream: - * - * Implements #GFilterInputStream with a sized input buffer. - **/ typedef struct _GBufferedInputStreamClass GBufferedInputStreamClass; typedef struct _GBufferedInputStreamPrivate GBufferedInputStreamPrivate; diff --git a/gio/gbufferedoutputstream.c b/gio/gbufferedoutputstream.c index 4999a7d..f82b10f 100644 --- a/gio/gbufferedoutputstream.c +++ b/gio/gbufferedoutputstream.c @@ -30,26 +30,22 @@ #include "glibintl.h" /** - * SECTION:gbufferedoutputstream - * @short_description: Buffered Output Stream - * @include: gio/gio.h - * @see_also: #GFilterOutputStream, #GOutputStream - * - * Buffered output stream implements #GFilterOutputStream and provides - * for buffered writes. - * - * By default, #GBufferedOutputStream's buffer size is set at 4 kilobytes. - * - * To create a buffered output stream, use g_buffered_output_stream_new(), - * or g_buffered_output_stream_new_sized() to specify the buffer's size + * GBufferedOutputStream: + * + * Buffered output stream implements [class@Gio.FilterOutputStream] and provides + * for buffered writes. + * + * By default, `GBufferedOutputStream`'s buffer size is set at 4 kilobytes. + * + * To create a buffered output stream, use [ctor@Gio.BufferedOutputStream.new], + * or [ctor@Gio.BufferedOutputStream.new_sized] to specify the buffer's size * at construction. - * - * To get the size of a buffer within a buffered input stream, use - * g_buffered_output_stream_get_buffer_size(). To change the size of a - * buffered output stream's buffer, use - * g_buffered_output_stream_set_buffer_size(). Note that the buffer's - * size cannot be reduced below the size of the data within the buffer. - **/ + * + * To get the size of a buffer within a buffered input stream, use + * [method@Gio.BufferedOutputStream.get_buffer_size]. To change the size of a + * buffered output stream's buffer, use [method@Gio.BufferedOutputStream.set_buffer_size]. + * Note that the buffer's size cannot be reduced below the size of the data within the buffer. + */ #define DEFAULT_BUFFER_SIZE 4096 @@ -149,22 +145,28 @@ g_buffered_output_stream_class_init (GBufferedOutputStreamClass *klass) ostream_class->close_async = g_buffered_output_stream_close_async; ostream_class->close_finish = g_buffered_output_stream_close_finish; + /** + * GBufferedOutputStream:buffer-size: + * + * The size of the backend buffer, in bytes. + */ g_object_class_install_property (object_class, PROP_BUFSIZE, - g_param_spec_uint ("buffer-size", - P_("Buffer Size"), - P_("The size of the backend buffer"), + g_param_spec_uint ("buffer-size", NULL, NULL, 1, G_MAXUINT, DEFAULT_BUFFER_SIZE, G_PARAM_READWRITE|G_PARAM_CONSTRUCT| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + /** + * GBufferedOutputStream:auto-grow: + * + * Whether the buffer should automatically grow. + */ g_object_class_install_property (object_class, PROP_AUTO_GROW, - g_param_spec_boolean ("auto-grow", - P_("Auto-grow"), - P_("Whether the buffer should automatically grow"), + g_param_spec_boolean ("auto-grow", NULL, NULL, FALSE, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); diff --git a/gio/gbufferedoutputstream.h b/gio/gbufferedoutputstream.h index 1259c76..339b916 100644 --- a/gio/gbufferedoutputstream.h +++ b/gio/gbufferedoutputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_BUFFERED_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_BUFFERED_OUTPUT_STREAM)) #define G_BUFFERED_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_BUFFERED_OUTPUT_STREAM, GBufferedOutputStreamClass)) -/** - * GBufferedOutputStream: - * - * An implementation of #GFilterOutputStream with a sized buffer. - **/ typedef struct _GBufferedOutputStreamClass GBufferedOutputStreamClass; typedef struct _GBufferedOutputStreamPrivate GBufferedOutputStreamPrivate; diff --git a/gio/gbytesicon.c b/gio/gbytesicon.c index b402a51..37c242a 100644 --- a/gio/gbytesicon.c +++ b/gio/gbytesicon.c @@ -33,16 +33,13 @@ /** - * SECTION:gbytesicon - * @short_description: An icon stored in memory as a GBytes - * @include: gio/gio.h - * @see_also: #GIcon, #GLoadableIcon, #GBytes + * GBytesIcon: * - * #GBytesIcon specifies an image held in memory in a common format (usually - * png) to be used as icon. + * `GBytesIcon` specifies an image held in memory in a common format (usually + * PNG) to be used as icon. * * Since: 2.38 - **/ + */ typedef GObjectClass GBytesIconClass; @@ -130,9 +127,7 @@ g_bytes_icon_class_init (GBytesIconClass *klass) * The bytes containing the icon. */ g_object_class_install_property (gobject_class, PROP_BYTES, - g_param_spec_boxed ("bytes", - P_("bytes"), - P_("The bytes containing the icon"), + g_param_spec_boxed ("bytes", NULL, NULL, G_TYPE_BYTES, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gbytesicon.h b/gio/gbytesicon.h index c917d38..1d5ccd7 100644 --- a/gio/gbytesicon.h +++ b/gio/gbytesicon.h @@ -35,11 +35,6 @@ G_BEGIN_DECLS #define G_BYTES_ICON(inst) (G_TYPE_CHECK_INSTANCE_CAST ((inst), G_TYPE_BYTES_ICON, GBytesIcon)) #define G_IS_BYTES_ICON(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_BYTES_ICON)) -/** - * GBytesIcon: - * - * Gets an icon for a #GBytes. Implements #GLoadableIcon. - **/ GIO_AVAILABLE_IN_2_38 GType g_bytes_icon_get_type (void) G_GNUC_CONST; diff --git a/gio/gcancellable.c b/gio/gcancellable.c index 5ff479c..41ffab3 100644 --- a/gio/gcancellable.c +++ b/gio/gcancellable.c @@ -29,11 +29,11 @@ /** - * SECTION:gcancellable - * @short_description: Thread-safe Operation Cancellation Stack - * @include: gio/gio.h + * GCancellable: * - * GCancellable is a thread-safe operation cancellation stack used + * `GCancellable` allows operations to be cancelled. + * + * `GCancellable` is a thread-safe operation cancellation stack used * throughout GIO to allow for cancellation of synchronous and * asynchronous operations. */ diff --git a/gio/gcancellable.h b/gio/gcancellable.h index d33215d..6a76b59 100644 --- a/gio/gcancellable.h +++ b/gio/gcancellable.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_CANCELLABLE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CANCELLABLE)) #define G_CANCELLABLE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CANCELLABLE, GCancellableClass)) -/** - * GCancellable: - * - * Allows actions to be cancelled. - */ typedef struct _GCancellableClass GCancellableClass; typedef struct _GCancellablePrivate GCancellablePrivate; diff --git a/gio/gcharsetconverter.c b/gio/gcharsetconverter.c index 4993199..c9437e1 100644 --- a/gio/gcharsetconverter.c +++ b/gio/gcharsetconverter.c @@ -39,22 +39,15 @@ enum { }; /** - * SECTION:gcharsetconverter - * @short_description: Convert between charsets - * @include: gio/gio.h + * GCharsetConverter: * - * #GCharsetConverter is an implementation of #GConverter based on - * GIConv. + * `GCharsetConverter` is an implementation of [iface@Gio.Converter] based on + * [struct@GLib.IConv]. */ static void g_charset_converter_iface_init (GConverterIface *iface); static void g_charset_converter_initable_iface_init (GInitableIface *iface); -/** - * GCharsetConverter: - * - * Conversions between character sets. - */ struct _GCharsetConverter { GObject parent_instance; @@ -159,27 +152,44 @@ g_charset_converter_class_init (GCharsetConverterClass *klass) gobject_class->get_property = g_charset_converter_get_property; gobject_class->set_property = g_charset_converter_set_property; + /** + * GCharsetConverter:to-charset: + * + * The character encoding to convert to. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_TO_CHARSET, - g_param_spec_string ("to-charset", - P_("To Charset"), - P_("The character encoding to convert to"), + g_param_spec_string ("to-charset", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GCharsetConverter:from-charset: + * + * The character encoding to convert from. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_FROM_CHARSET, - g_param_spec_string ("from-charset", - P_("From Charset"), - P_("The character encoding to convert from"), + g_param_spec_string ("from-charset", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GCharsetConverter:use-fallback: + * + * Use fallback (of form `\`) for invalid bytes. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_USE_FALLBACK, - g_param_spec_boolean ("use-fallback", - P_("Fallback enabled"), - P_("Use fallback (of form \\) for invalid bytes"), + g_param_spec_boolean ("use-fallback", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | diff --git a/gio/gcontenttype.c b/gio/gcontenttype.c index 1e21bbd..de9e5a7 100644 --- a/gio/gcontenttype.c +++ b/gio/gcontenttype.c @@ -38,9 +38,7 @@ /** - * SECTION:gcontenttype - * @short_description: Platform-specific content typing - * @include: gio/gio.h + * GContentType: * * A content type is a platform specific string that defines the type * of a file. On UNIX it is a @@ -1276,7 +1274,7 @@ component_match (Enumerator *e, gint depth, const gchar *name) { - gchar *case_folded, *key; + gchar *case_folded, *key, *utf8_name; gboolean found; if (strcmp (name, e->components[depth]) == 0) @@ -1285,11 +1283,16 @@ component_match (Enumerator *e, if (!e->ignore_case) return FALSE; - case_folded = g_utf8_casefold (name, -1); + utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL); + if (utf8_name == NULL) + utf8_name = g_utf8_make_valid (name, -1); + + case_folded = g_utf8_casefold (utf8_name, -1); key = g_utf8_collate_key (case_folded, -1); found = strcmp (key, e->case_components[depth]) == 0; + g_free (utf8_name); g_free (case_folded); g_free (key); diff --git a/gio/gcontextspecificgroup.c b/gio/gcontextspecificgroup.c index e1def3b..41a35de 100644 --- a/gio/gcontextspecificgroup.c +++ b/gio/gcontextspecificgroup.c @@ -153,18 +153,8 @@ g_context_specific_group_request_state (GContextSpecificGroup *group, } } - /* we only block for positive transitions */ - if (requested_state) - { - while (group->requested_state != group->effective_state) - g_cond_wait (&group->cond, &group->lock); - - /* there is no way this could go back to FALSE because the object - * that we just created in this thread would have to have been - * destroyed again (from this thread) before that could happen. - */ - g_assert (group->effective_state); - } + while (group->requested_state != group->effective_state) + g_cond_wait (&group->cond, &group->lock); } gpointer diff --git a/gio/gconverter.c b/gio/gconverter.c index 57ee1b9..973224f 100644 --- a/gio/gconverter.c +++ b/gio/gconverter.c @@ -26,12 +26,11 @@ /** - * SECTION:gconverter - * @short_description: Data conversion interface - * @include: gio/gio.h - * @see_also: #GInputStream, #GOutputStream + * GConverter: * - * #GConverter is implemented by objects that convert + * `GConverter` is an interface for streaming conversions. + * + * `GConverter` is implemented by objects that convert * binary data in various ways. The conversion can be * stateful and may fail at any place. * @@ -40,7 +39,7 @@ * replace. * * Since: 2.24 - **/ + */ typedef GConverterIface GConverterInterface; diff --git a/gio/gconverter.h b/gio/gconverter.h index 16e94a1..87afbf3 100644 --- a/gio/gconverter.h +++ b/gio/gconverter.h @@ -36,13 +36,6 @@ G_BEGIN_DECLS #define G_IS_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_CONVERTER)) #define G_CONVERTER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_CONVERTER, GConverterIface)) -/** - * GConverter: - * - * Seek object for streaming operations. - * - * Since: 2.24 - **/ typedef struct _GConverterIface GConverterIface; /** diff --git a/gio/gconverterinputstream.c b/gio/gconverterinputstream.c index 59277bf..c74ec29 100644 --- a/gio/gconverterinputstream.c +++ b/gio/gconverterinputstream.c @@ -33,17 +33,14 @@ /** - * SECTION:gconverterinputstream - * @short_description: Converter Input Stream - * @include: gio/gio.h - * @see_also: #GInputStream, #GConverter + * GConverterInputStream: * - * Converter input stream implements #GInputStream and allows + * Converter input stream implements [class@Gio.InputStream] and allows * conversion of data of various types during reading. * - * As of GLib 2.34, #GConverterInputStream implements - * #GPollableInputStream. - **/ + * As of GLib 2.34, `GConverterInputStream` implements + * [iface@Gio.PollableInputStream]. + */ #define INITIAL_BUFFER_SIZE 4096 @@ -116,11 +113,14 @@ g_converter_input_stream_class_init (GConverterInputStreamClass *klass) istream_class = G_INPUT_STREAM_CLASS (klass); istream_class->read_fn = g_converter_input_stream_read; + /** + * GConverterInputStream:converter: + * + * The converter object. + */ g_object_class_install_property (object_class, PROP_CONVERTER, - g_param_spec_object ("converter", - P_("Converter"), - P_("The converter object"), + g_param_spec_object ("converter", NULL, NULL, G_TYPE_CONVERTER, G_PARAM_READWRITE| G_PARAM_CONSTRUCT_ONLY| diff --git a/gio/gconverterinputstream.h b/gio/gconverterinputstream.h index 01de11e..96f4dc0 100644 --- a/gio/gconverterinputstream.h +++ b/gio/gconverterinputstream.h @@ -39,12 +39,6 @@ G_BEGIN_DECLS #define G_IS_CONVERTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CONVERTER_INPUT_STREAM)) #define G_CONVERTER_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CONVERTER_INPUT_STREAM, GConverterInputStreamClass)) -/** - * GConverterInputStream: - * - * An implementation of #GFilterInputStream that allows data - * conversion. - **/ typedef struct _GConverterInputStreamClass GConverterInputStreamClass; typedef struct _GConverterInputStreamPrivate GConverterInputStreamPrivate; diff --git a/gio/gconverteroutputstream.c b/gio/gconverteroutputstream.c index b26f645..1877b0e 100644 --- a/gio/gconverteroutputstream.c +++ b/gio/gconverteroutputstream.c @@ -33,17 +33,14 @@ /** - * SECTION:gconverteroutputstream - * @short_description: Converter Output Stream - * @include: gio/gio.h - * @see_also: #GOutputStream, #GConverter + * GConverterOutputStream: * - * Converter output stream implements #GOutputStream and allows + * Converter output stream implements [class@Gio.OutputStream] and allows * conversion of data of various types during reading. * - * As of GLib 2.34, #GConverterOutputStream implements - * #GPollableOutputStream. - **/ + * As of GLib 2.34, `GConverterOutputStream` implements + * [iface@Gio.PollableOutputStream]. + */ #define INITIAL_BUFFER_SIZE 4096 @@ -132,11 +129,14 @@ g_converter_output_stream_class_init (GConverterOutputStreamClass *klass) istream_class->write_fn = g_converter_output_stream_write; istream_class->flush = g_converter_output_stream_flush; + /** + * GConverterOutputStream:converter: + * + * The converter object. + */ g_object_class_install_property (object_class, PROP_CONVERTER, - g_param_spec_object ("converter", - P_("Converter"), - P_("The converter object"), + g_param_spec_object ("converter", NULL, NULL, G_TYPE_CONVERTER, G_PARAM_READWRITE| G_PARAM_CONSTRUCT_ONLY| diff --git a/gio/gconverteroutputstream.h b/gio/gconverteroutputstream.h index c090846..e184500 100644 --- a/gio/gconverteroutputstream.h +++ b/gio/gconverteroutputstream.h @@ -39,12 +39,6 @@ G_BEGIN_DECLS #define G_IS_CONVERTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_CONVERTER_OUTPUT_STREAM)) #define G_CONVERTER_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_CONVERTER_OUTPUT_STREAM, GConverterOutputStreamClass)) -/** - * GConverterOutputStream: - * - * An implementation of #GFilterOutputStream that allows data - * conversion. - **/ typedef struct _GConverterOutputStreamClass GConverterOutputStreamClass; typedef struct _GConverterOutputStreamPrivate GConverterOutputStreamPrivate; diff --git a/gio/gcredentials.c b/gio/gcredentials.c index ba5be63..11eb556 100644 --- a/gio/gcredentials.c +++ b/gio/gcredentials.c @@ -35,58 +35,48 @@ #include "glibintl.h" -/** - * SECTION:gcredentials - * @short_description: An object containing credentials - * @include: gio/gio.h - * - * The #GCredentials type is a reference-counted wrapper for native - * credentials. This information is typically used for identifying, - * authenticating and authorizing other processes. - * - * Some operating systems supports looking up the credentials of the - * remote peer of a communication endpoint - see e.g. - * g_socket_get_credentials(). - * - * Some operating systems supports securely sending and receiving - * credentials over a Unix Domain Socket, see - * #GUnixCredentialsMessage, g_unix_connection_send_credentials() and - * g_unix_connection_receive_credentials() for details. - * - * On Linux, the native credential type is a `struct ucred` - see the - * unix(7) man page for details. This corresponds to - * %G_CREDENTIALS_TYPE_LINUX_UCRED. - * - * On Apple operating systems (including iOS, tvOS, and macOS), - * the native credential type is a `struct xucred`. - * This corresponds to %G_CREDENTIALS_TYPE_APPLE_XUCRED. - * - * On FreeBSD, Debian GNU/kFreeBSD, and GNU/Hurd, the native - * credential type is a `struct cmsgcred`. This corresponds - * to %G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED. - * - * On NetBSD, the native credential type is a `struct unpcbid`. - * This corresponds to %G_CREDENTIALS_TYPE_NETBSD_UNPCBID. - * - * On OpenBSD, the native credential type is a `struct sockpeercred`. - * This corresponds to %G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED. - * - * On Solaris (including OpenSolaris and its derivatives), the native - * credential type is a `ucred_t`. This corresponds to - * %G_CREDENTIALS_TYPE_SOLARIS_UCRED. - * - * Since GLib 2.72, on Windows, the native credentials may contain the PID of a - * process. This corresponds to %G_CREDENTIALS_TYPE_WIN32_PID. - */ - /** * GCredentials: * - * The #GCredentials structure contains only private data and - * should only be accessed using the provided API. + * The `GCredentials` type is a reference-counted wrapper for native + * credentials. + * + * The information in `GCredentials` is typically used for identifying, + * authenticating and authorizing other processes. + * + * Some operating systems supports looking up the credentials of the remote + * peer of a communication endpoint - see e.g. [method@Gio.Socket.get_credentials]. + * + * Some operating systems supports securely sending and receiving + * credentials over a Unix Domain Socket, see [class@Gio.UnixCredentialsMessage], + * [method@Gio.UnixConnection.send_credentials] and + * [method@Gio.UnixConnection.receive_credentials] for details. + * + * On Linux, the native credential type is a `struct ucred` - see the + * [`unix(7)` man page](man:unix(7)) for details. This corresponds to + * `G_CREDENTIALS_TYPE_LINUX_UCRED`. + * + * On Apple operating systems (including iOS, tvOS, and macOS), the native credential + * type is a `struct xucred`. This corresponds to `G_CREDENTIALS_TYPE_APPLE_XUCRED`. + * + * On FreeBSD, Debian GNU/kFreeBSD, and GNU/Hurd, the native credential type is a + * `struct cmsgcred`. This corresponds to `G_CREDENTIALS_TYPE_FREEBSD_CMSGCRED`. + * + * On NetBSD, the native credential type is a `struct unpcbid`. + * This corresponds to `G_CREDENTIALS_TYPE_NETBSD_UNPCBID`. + * + * On OpenBSD, the native credential type is a `struct sockpeercred`. + * This corresponds to `G_CREDENTIALS_TYPE_OPENBSD_SOCKPEERCRED`. + * + * On Solaris (including OpenSolaris and its derivatives), the native credential type + * is a `ucred_t`. This corresponds to `G_CREDENTIALS_TYPE_SOLARIS_UCRED`. + * + * Since GLib 2.72, on Windows, the native credentials may contain the PID of a + * process. This corresponds to `G_CREDENTIALS_TYPE_WIN32_PID`. * * Since: 2.26 */ + struct _GCredentials { /*< private >*/ diff --git a/gio/gdatagrambased.c b/gio/gdatagrambased.c index f8de372..81b3d18 100644 --- a/gio/gdatagrambased.c +++ b/gio/gdatagrambased.c @@ -32,57 +32,56 @@ #include "glibintl.h" /** - * SECTION:gdatagrambased - * @short_description: Low-level datagram communications interface - * @include: gio/gio.h - * @see_also: #GSocket, [][gio-gnetworking.h] + * GDatagramBased: * - * A #GDatagramBased is a networking interface for representing datagram-based + * Interface for socket-like objects with datagram semantics. + * + * A `GDatagramBased` is a networking interface for representing datagram-based * communications. It is a more or less direct mapping of the core parts of the * BSD socket API in a portable GObject interface. It is implemented by - * #GSocket, which wraps the UNIX socket API on UNIX and winsock2 on Windows. + * [class@Gio.Socket], which wraps the UNIX socket API on UNIX and winsock2 on Windows. * - * #GDatagramBased is entirely platform independent, and is intended to be used - * alongside higher-level networking APIs such as #GIOStream. + * `GDatagramBased` is entirely platform independent, and is intended to be used + * alongside higher-level networking APIs such as [class@Gio.IOStream]. * * It uses vectored scatter/gather I/O by default, allowing for many messages * to be sent or received in a single call. Where possible, implementations of * the interface should take advantage of vectored I/O to minimise processing - * or system calls. For example, #GSocket uses recvmmsg() and sendmmsg() where - * possible. Callers should take advantage of scatter/gather I/O (the use of + * or system calls. For example, `GSocket` uses `recvmmsg()` and `sendmmsg()` + * where possible. Callers should take advantage of scatter/gather I/O (the use of * multiple buffers per message) to avoid unnecessary copying of data to * assemble or disassemble a message. * - * Each #GDatagramBased operation has a timeout parameter which may be negative + * Each `GDatagramBased` operation has a timeout parameter which may be negative * for blocking behaviour, zero for non-blocking behaviour, or positive for * timeout behaviour. A blocking operation blocks until finished or there is an * error. A non-blocking operation will return immediately with a - * %G_IO_ERROR_WOULD_BLOCK error if it cannot make progress. A timeout operation + * `G_IO_ERROR_WOULD_BLOCK` error if it cannot make progress. A timeout operation * will block until the operation is complete or the timeout expires; if the * timeout expires it will return what progress it made, or - * %G_IO_ERROR_TIMED_OUT if no progress was made. To know when a call would - * successfully run you can call g_datagram_based_condition_check() or - * g_datagram_based_condition_wait(). You can also use - * g_datagram_based_create_source() and attach it to a #GMainContext to get - * callbacks when I/O is possible. + * `G_IO_ERROR_TIMED_OUT` if no progress was made. To know when a call would + * successfully run you can call [method@Gio.DatagramBased.condition_check] or + * [method@Gio.DatagramBased.condition_wait]. You can also use + * [method@Gio.DatagramBased.create_source] and attach it to a [struct@GLib.MainContext] + * to get callbacks when I/O is possible. * * When running a non-blocking operation applications should always be able to - * handle getting a %G_IO_ERROR_WOULD_BLOCK error even when some other function + * handle getting a `G_IO_ERROR_WOULD_BLOCK` error even when some other function * said that I/O was possible. This can easily happen in case of a race * condition in the application, but it can also happen for other reasons. For * instance, on Windows a socket is always seen as writable until a write - * returns %G_IO_ERROR_WOULD_BLOCK. + * returns `G_IO_ERROR_WOULD_BLOCK`. * - * As with #GSocket, #GDatagramBaseds can be either connection oriented (for - * example, SCTP) or connectionless (for example, UDP). #GDatagramBaseds must be + * As with `GSocket`, `GDatagramBased`s can be either connection oriented (for + * example, SCTP) or connectionless (for example, UDP). `GDatagramBased`s must be * datagram-based, not stream-based. The interface does not cover connection * establishment — use methods on the underlying type to establish a connection - * before sending and receiving data through the #GDatagramBased API. For + * before sending and receiving data through the `GDatagramBased` API. For * connectionless socket types the target/source address is specified or * received in each I/O operation. * - * Like most other APIs in GLib, #GDatagramBased is not inherently thread safe. - * To use a #GDatagramBased concurrently from multiple threads, you must + * Like most other APIs in GLib, `GDatagramBased` is not inherently thread safe. + * To use a `GDatagramBased` concurrently from multiple threads, you must * implement your own locking. * * Since: 2.48 diff --git a/gio/gdatagrambased.h b/gio/gdatagrambased.h index 585728c..aa2a1f2 100644 --- a/gio/gdatagrambased.h +++ b/gio/gdatagrambased.h @@ -41,13 +41,6 @@ G_BEGIN_DECLS #define G_TYPE_IS_DATAGRAM_BASED(type) (g_type_is_a ((type), \ G_TYPE_DATAGRAM_BASED)) -/** - * GDatagramBased: - * - * Interface for socket-like objects with datagram semantics. - * - * Since: 2.48 - */ typedef struct _GDatagramBasedInterface GDatagramBasedInterface; /** diff --git a/gio/gdatainputstream.c b/gio/gdatainputstream.c index b2c080b..e2921e4 100644 --- a/gio/gdatainputstream.c +++ b/gio/gdatainputstream.c @@ -33,15 +33,11 @@ #include /** - * SECTION:gdatainputstream - * @short_description: Data Input Stream - * @include: gio/gio.h - * @see_also: #GInputStream - * - * Data input stream implements #GInputStream and includes functions for - * reading structured data directly from a binary input stream. + * GDataInputStream: * - **/ + * Data input stream implements [class@Gio.InputStream] and includes functions + * for reading structured data directly from a binary input stream. + */ struct _GDataInputStreamPrivate { GDataStreamByteOrder byte_order; @@ -86,9 +82,7 @@ g_data_input_stream_class_init (GDataInputStreamClass *klass) */ g_object_class_install_property (object_class, PROP_BYTE_ORDER, - g_param_spec_enum ("byte-order", - P_("Byte order"), - P_("The byte order"), + g_param_spec_enum ("byte-order", NULL, NULL, G_TYPE_DATA_STREAM_BYTE_ORDER, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); @@ -101,9 +95,7 @@ g_data_input_stream_class_init (GDataInputStreamClass *klass) */ g_object_class_install_property (object_class, PROP_NEWLINE_TYPE, - g_param_spec_enum ("newline-type", - P_("Newline type"), - P_("The accepted types of line ending"), + g_param_spec_enum ("newline-type", NULL, NULL, G_TYPE_DATA_STREAM_NEWLINE_TYPE, G_DATA_STREAM_NEWLINE_TYPE_LF, G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); diff --git a/gio/gdatainputstream.h b/gio/gdatainputstream.h index e130295..2e14a55 100644 --- a/gio/gdatainputstream.h +++ b/gio/gdatainputstream.h @@ -38,12 +38,6 @@ G_BEGIN_DECLS #define G_IS_DATA_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DATA_INPUT_STREAM)) #define G_DATA_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DATA_INPUT_STREAM, GDataInputStreamClass)) -/** - * GDataInputStream: - * - * An implementation of #GBufferedInputStream that allows for high-level - * data manipulation of arbitrary data (including binary operations). - **/ typedef struct _GDataInputStreamClass GDataInputStreamClass; typedef struct _GDataInputStreamPrivate GDataInputStreamPrivate; diff --git a/gio/gdataoutputstream.c b/gio/gdataoutputstream.c index f2d1f39..f183f96 100644 --- a/gio/gdataoutputstream.c +++ b/gio/gdataoutputstream.c @@ -30,16 +30,11 @@ /** - * SECTION:gdataoutputstream - * @short_description: Data Output Stream - * @include: gio/gio.h - * @see_also: #GOutputStream - * - * Data output stream implements #GOutputStream and includes functions for - * writing data directly to an output stream. + * GDataOutputStream: * - **/ - + * Data output stream implements [class@Gio.OutputStream] and includes functions + * for writing data directly to an output stream. + */ struct _GDataOutputStreamPrivate { @@ -99,9 +94,7 @@ g_data_output_stream_class_init (GDataOutputStreamClass *klass) */ g_object_class_install_property (object_class, PROP_BYTE_ORDER, - g_param_spec_enum ("byte-order", - P_("Byte order"), - P_("The byte order"), + g_param_spec_enum ("byte-order", NULL, NULL, G_TYPE_DATA_STREAM_BYTE_ORDER, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN, G_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_BLURB)); diff --git a/gio/gdataoutputstream.h b/gio/gdataoutputstream.h index a8d434a..9fad093 100644 --- a/gio/gdataoutputstream.h +++ b/gio/gdataoutputstream.h @@ -38,12 +38,6 @@ G_BEGIN_DECLS #define G_IS_DATA_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_DATA_OUTPUT_STREAM)) #define G_DATA_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_DATA_OUTPUT_STREAM, GDataOutputStreamClass)) -/** - * GDataOutputStream: - * - * An implementation of #GBufferedOutputStream that allows for high-level - * data manipulation of arbitrary data (including binary operations). - **/ typedef struct _GDataOutputStream GDataOutputStream; typedef struct _GDataOutputStreamClass GDataOutputStreamClass; typedef struct _GDataOutputStreamPrivate GDataOutputStreamPrivate; diff --git a/gio/gdbus-2.0/codegen/codegen.py b/gio/gdbus-2.0/codegen/codegen.py index 3933281..2e8ef8e 100644 --- a/gio/gdbus-2.0/codegen/codegen.py +++ b/gio/gdbus-2.0/codegen/codegen.py @@ -57,6 +57,9 @@ def generate_namespace(namespace): def generate_header_guard(header_name): + if header_name == "-": + return "STDOUT" + # There might be more characters that are safe to use than these, but lets # stay conservative. safe_valid_chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1121,15 +1124,13 @@ class InterfaceInfoBodyCodeGenerator: self.outfile.write("\n") self.outfile.write( - "#ifdef HAVE_CONFIG_H\n" - '# include "config.h"\n' - "#endif\n" - "\n" - '#include "%s"\n' - "\n" - "#include \n" % (self.header_name) + "#ifdef HAVE_CONFIG_H\n" '# include "config.h"\n' "#endif\n" "\n" ) - self.outfile.write("\n") + + if self.header_name: + self.outfile.write('#include "%s"\n\n' % (self.header_name)) + + self.outfile.write("#include \n\n") # ---------------------------------------------------------------------------------------------------- @@ -1469,20 +1470,21 @@ class CodeGenerator: def generate_body_preamble(self): basenames = ", ".join(self.input_files_basenames) self.outfile.write(LICENSE_STR.format(config.VERSION, basenames)) + if self.symbol_decoration_define is not None: self.outfile.write("\n") self.outfile.write("#define %s\n" % self.symbol_decoration_define) + self.outfile.write("\n") self.outfile.write( - "#ifdef HAVE_CONFIG_H\n" - '# include "config.h"\n' - "#endif\n" - "\n" - '#include "%s"\n' - "\n" - "#include \n" % (self.header_name) + "#ifdef HAVE_CONFIG_H\n" '# include "config.h"\n' "#endif\n" "\n" ) + if self.header_name: + self.outfile.write('#include "%s"\n\n' % (self.header_name)) + + self.outfile.write("#include \n") + self.outfile.write( "#ifdef G_OS_UNIX\n" "# include \n" "#endif\n" "\n" ) @@ -5160,12 +5162,12 @@ class CodeGenerator: ) for i in self.ifaces: self.outfile.write( - ' g_hash_table_insert (lookup_hash, (gpointer) "%s", GSIZE_TO_POINTER (%sTYPE_%s_PROXY));\n' + ' g_hash_table_insert (lookup_hash, (gpointer) "%s", (gpointer) (guintptr) (%sTYPE_%s_PROXY));\n' % (i.name, i.ns_upper, i.name_upper) ) self.outfile.write(" g_once_init_leave (&once_init_value, 1);\n" " }\n") self.outfile.write( - " ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));\n" + " ret = (GType) (guintptr) (g_hash_table_lookup (lookup_hash, interface_name));\n" " if (ret == (GType) 0)\n" " ret = G_TYPE_DBUS_PROXY;\n" ) diff --git a/gio/gdbus-2.0/codegen/codegen_main.py b/gio/gdbus-2.0/codegen/codegen_main.py index c0f44d5..d5353f5 100644 --- a/gio/gdbus-2.0/codegen/codegen_main.py +++ b/gio/gdbus-2.0/codegen/codegen_main.py @@ -24,6 +24,7 @@ import argparse import os import sys +from contextlib import contextmanager from . import config from . import dbustypes @@ -63,6 +64,15 @@ def find_prop(iface, prop): return None +@contextmanager +def file_or_stdout(filename): + if filename is None or filename == "-": + yield sys.stdout + else: + with open(filename, "w") as outfile: + yield outfile + + def apply_annotation(iface_list, iface, method, signal, prop, arg, key, value): iface_obj = None for i in iface_list: @@ -326,7 +336,11 @@ def codegen_main(): print_error("Using --body requires --output") c_file = args.output - header_name = os.path.splitext(os.path.basename(c_file))[0] + ".h" + + if c_file == "-": + header_name = "" + else: + header_name = os.path.splitext(os.path.basename(c_file))[0] + ".h" elif args.interface_info_header: if args.output is None: print_error("Using --interface-info-header requires --output") @@ -348,7 +362,11 @@ def codegen_main(): ) c_file = args.output - header_name = os.path.splitext(os.path.basename(c_file))[0] + ".h" + + if c_file == "-": + header_name = "" + else: + header_name = os.path.splitext(os.path.basename(c_file))[0] + ".h" # Check the minimum GLib version. The minimum --glib-min-required is 2.30, # because that’s when gdbus-codegen was introduced. Support 1, 2 or 3 @@ -446,7 +464,7 @@ def codegen_main(): rst_gen.generate(rst, args.output_directory) if args.header: - with open(h_file, "w") as outfile: + with file_or_stdout(h_file) as outfile: gen = codegen.HeaderCodeGenerator( all_ifaces, args.c_namespace, @@ -463,7 +481,7 @@ def codegen_main(): gen.generate() if args.body: - with open(c_file, "w") as outfile: + with file_or_stdout(c_file) as outfile: gen = codegen.CodeGenerator( all_ifaces, args.c_namespace, @@ -478,7 +496,7 @@ def codegen_main(): gen.generate() if args.interface_info_header: - with open(h_file, "w") as outfile: + with file_or_stdout(h_file) as outfile: gen = codegen.InterfaceInfoHeaderCodeGenerator( all_ifaces, args.c_namespace, @@ -493,7 +511,7 @@ def codegen_main(): gen.generate() if args.interface_info_body: - with open(c_file, "w") as outfile: + with file_or_stdout(c_file) as outfile: gen = codegen.InterfaceInfoBodyCodeGenerator( all_ifaces, args.c_namespace, diff --git a/gio/gdbus-2.0/codegen/codegen_md.py b/gio/gdbus-2.0/codegen/codegen_md.py index 4644ef6..c509ce0 100644 --- a/gio/gdbus-2.0/codegen/codegen_md.py +++ b/gio/gdbus-2.0/codegen/codegen_md.py @@ -88,7 +88,7 @@ class MdCodeGenerator: f"Title: {iface.name} D-Bus Interface", f"Slug: {iface.name}", "", - "# " + iface.name, + "# " + iface.name_without_prefix, "", "## Description", "", diff --git a/gio/gdbus-2.0/codegen/codegen_rst.py b/gio/gdbus-2.0/codegen/codegen_rst.py index 026ad67..6a023f6 100644 --- a/gio/gdbus-2.0/codegen/codegen_rst.py +++ b/gio/gdbus-2.0/codegen/codegen_rst.py @@ -82,12 +82,13 @@ class RstCodeGenerator: def _generate_header(self, iface): """Generates the header and preamble of the document.""" - header_len = len(iface.name) + iface_name = iface.name_without_prefix + header_len = len(iface_name) res = [ f".. _{iface.name}:", "", "=" * header_len, - iface.name, + iface_name, "=" * header_len, "", "-----------", @@ -142,7 +143,7 @@ class RstCodeGenerator: else: access = "readable" res += [ - ".. _{title}:", + f".. _{title}:", "", title, "^" * len(title), @@ -218,7 +219,7 @@ class RstCodeGenerator: for m in iface.methods: title = f"{iface.name}.{m.name}" res += [ - ".. _{title}:", + f".. _{title}:", "", title, "^" * len(title), @@ -296,7 +297,7 @@ class RstCodeGenerator: for s in iface.signals: title = f"{iface.name}::{s.name}" res += [ - ".. _{title}:", + f".. _{title}:", "", title, "^" * len(title), diff --git a/gio/gdbus-2.0/codegen/meson.build b/gio/gdbus-2.0/codegen/meson.build index 65faae9..6d19cd4 100644 --- a/gio/gdbus-2.0/codegen/meson.build +++ b/gio/gdbus-2.0/codegen/meson.build @@ -30,6 +30,7 @@ meson.override_find_program('gdbus-codegen', gdbus_codegen) codegen_dir = join_paths(glib_datadir, 'glib-2.0', 'codegen') gdbus_codegen_built_files = [] +gdbus_codegen_built_targets = [] gdbus_codegen_built_files += configure_file(input : 'config.py.in', output : 'config.py', install_dir : codegen_dir, @@ -39,8 +40,8 @@ gdbus_codegen_built_files += configure_file(input : 'config.py.in', foreach f : gdbus_codegen_files # Copy these into the builddir so that gdbus-codegen can be used uninstalled # and then install it too so that it can be used after installation - gdbus_codegen_built_files += configure_file(input : f, output : f, - install_dir : codegen_dir, - install_tag : 'bin-devel', - copy : true) + gdbus_codegen_built_targets += fs.copyfile(f, f, + install : true, + install_dir : codegen_dir, + install_tag : 'bin-devel') endforeach diff --git a/gio/gdbus-2.0/codegen/utils.py b/gio/gdbus-2.0/codegen/utils.py index 0204610..08f1ba9 100644 --- a/gio/gdbus-2.0/codegen/utils.py +++ b/gio/gdbus-2.0/codegen/utils.py @@ -19,7 +19,7 @@ # # Author: David Zeuthen -import distutils.version +import packaging.version import os import sys @@ -166,4 +166,4 @@ def version_cmp_key(key): v = str(key[0]) else: v = "0" - return (distutils.version.LooseVersion(v), key[1]) + return (packaging.version.Version(v), key[1]) diff --git a/gio/gdbus-tool.c b/gio/gdbus-tool.c index 2435998..63c7ec9 100644 --- a/gio/gdbus-tool.c +++ b/gio/gdbus-tool.c @@ -404,7 +404,7 @@ static const GOptionEntry connection_entries[] = { { "system", 'y', 0, G_OPTION_ARG_NONE, &opt_connection_system, N_("Connect to the system bus"), NULL}, { "session", 'e', 0, G_OPTION_ARG_NONE, &opt_connection_session, N_("Connect to the session bus"), NULL}, - { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_connection_address, N_("Connect to given D-Bus address"), NULL}, + { "address", 'a', 0, G_OPTION_ARG_STRING, &opt_connection_address, N_("Connect to given D-Bus address"), N_("ADDRESS") }, G_OPTION_ENTRY_NULL }; diff --git a/gio/gdbusactiongroup.c b/gio/gdbusactiongroup.c index 275c5fc..0bd5311 100644 --- a/gio/gdbusactiongroup.c +++ b/gio/gdbusactiongroup.c @@ -28,23 +28,14 @@ #include "gdbusconnection.h" #include "gactiongroup.h" -/** - * SECTION:gdbusactiongroup - * @title: GDBusActionGroup - * @short_description: A D-Bus GActionGroup implementation - * @include: gio/gio.h - * @see_also: [GActionGroup exporter][gio-GActionGroup-exporter] - * - * #GDBusActionGroup is an implementation of the #GActionGroup - * interface that can be used as a proxy for an action group - * that is exported over D-Bus with g_dbus_connection_export_action_group(). - */ - /** * GDBusActionGroup: * - * #GDBusActionGroup is an opaque data structure and can only be accessed - * using the following functions. + * `GDBusActionGroup` is an implementation of the [iface@Gio.ActionGroup] + * interface. + * + * `GDBusActionGroup` can be used as a proxy for an action group + * that is exported over D-Bus with [method@Gio.DBusConnection.export_action_group]. */ struct _GDBusActionGroup diff --git a/gio/gdbusaddress.c b/gio/gdbusaddress.c index b73ff0d..0bd0b39 100644 --- a/gio/gdbusaddress.c +++ b/gio/gdbusaddress.c @@ -62,10 +62,7 @@ #include "glibintl.h" /** - * SECTION:gdbusaddress - * @title: D-Bus Addresses - * @short_description: D-Bus connection endpoints - * @include: gio/gio.h + * GDBusAddress: * * Routines for working with D-Bus addresses. A D-Bus address is a string * like `unix:tmpdir=/tmp/my-app-name`. The exact format of addresses diff --git a/gio/gdbusauth.c b/gio/gdbusauth.c index b52a06e..9e31c83 100644 --- a/gio/gdbusauth.c +++ b/gio/gdbusauth.c @@ -172,9 +172,7 @@ _g_dbus_auth_class_init (GDBusAuthClass *klass) g_object_class_install_property (gobject_class, PROP_STREAM, - g_param_spec_object ("stream", - P_("IO Stream"), - P_("The underlying GIOStream used for I/O"), + g_param_spec_object ("stream", NULL, NULL, G_TYPE_IO_STREAM, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gdbusauthmechanism.c b/gio/gdbusauthmechanism.c index 6e494db..be1b1dc 100644 --- a/gio/gdbusauthmechanism.c +++ b/gio/gdbusauthmechanism.c @@ -122,9 +122,7 @@ _g_dbus_auth_mechanism_class_init (GDBusAuthMechanismClass *klass) g_object_class_install_property (gobject_class, PROP_STREAM, - g_param_spec_object ("stream", - P_("IO Stream"), - P_("The underlying GIOStream used for I/O"), + g_param_spec_object ("stream", NULL, NULL, G_TYPE_IO_STREAM, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -144,9 +142,7 @@ _g_dbus_auth_mechanism_class_init (GDBusAuthMechanismClass *klass) */ g_object_class_install_property (gobject_class, PROP_CREDENTIALS, - g_param_spec_object ("credentials", - P_("Credentials"), - P_("The credentials of the remote peer"), + g_param_spec_object ("credentials", NULL, NULL, G_TYPE_CREDENTIALS, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gdbusauthobserver.c b/gio/gdbusauthobserver.c index c695e1a..a840532 100644 --- a/gio/gdbusauthobserver.c +++ b/gio/gdbusauthobserver.c @@ -32,26 +32,25 @@ #include "gmarshal-internal.h" /** - * SECTION:gdbusauthobserver - * @short_description: Object used for authenticating connections - * @include: gio/gio.h + * GDBusAuthObserver: * - * The #GDBusAuthObserver type provides a mechanism for participating - * in how a #GDBusServer (or a #GDBusConnection) authenticates remote - * peers. Simply instantiate a #GDBusAuthObserver and connect to the + * `GDBusAuthObserver` provides a mechanism for participating + * in how a [class@Gio.DBusServer] (or a [class@Gio.DBusConnection]) + * authenticates remote peers. + * + * Simply instantiate a `GDBusAuthObserver` and connect to the * signals you are interested in. Note that new signals may be added - * in the future + * in the future. * * ## Controlling Authentication Mechanisms * - * By default, a #GDBusServer or server-side #GDBusConnection will allow - * any authentication mechanism to be used. If you only - * want to allow D-Bus connections with the `EXTERNAL` mechanism, - * which makes use of credentials passing and is the recommended - * mechanism for modern Unix platforms such as Linux and the BSD family, - * you would use a signal handler like this: + * By default, a `GDBusServer` or server-side `GDBusConnection` will allow + * any authentication mechanism to be used. If you only want to allow D-Bus + * connections with the `EXTERNAL` mechanism, which makes use of credentials + * passing and is the recommended mechanism for modern Unix platforms such + * as Linux and the BSD family, you would use a signal handler like this: * - * |[ + * ```c * static gboolean * on_allow_mechanism (GDBusAuthObserver *observer, * const gchar *mechanism, @@ -64,19 +63,19 @@ * * return FALSE; * } - * ]| + * ``` * - * ## Controlling Authorization # {#auth-observer} + * ## Controlling Authorization * - * By default, a #GDBusServer or server-side #GDBusConnection will accept + * By default, a `GDBusServer` or server-side `GDBusConnection` will accept * connections from any successfully authenticated user (but not from * anonymous connections using the `ANONYMOUS` mechanism). If you only * want to allow D-Bus connections from processes owned by the same uid * as the server, since GLib 2.68, you should use the - * %G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER flag. It’s equivalent + * `G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER` flag. It’s equivalent * to the following signal handler: - * - * |[ + * + * ```c * static gboolean * on_authorize_authenticated_peer (GDBusAuthObserver *observer, * GIOStream *stream, @@ -97,7 +96,9 @@ * * return authorized; * } - * ]| + * ``` + * + * Since: 2.26 */ typedef struct _GDBusAuthObserverClass GDBusAuthObserverClass; @@ -126,14 +127,6 @@ struct _GDBusAuthObserverClass const gchar *mechanism); }; -/** - * GDBusAuthObserver: - * - * The #GDBusAuthObserver structure contains only private data and - * should only be accessed using the provided API. - * - * Since: 2.26 - */ struct _GDBusAuthObserver { GObject parent_instance; diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c index 1ee2ab4..42134a6 100644 --- a/gio/gdbusconnection.c +++ b/gio/gdbusconnection.c @@ -131,59 +131,62 @@ G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER) /** - * SECTION:gdbusconnection - * @short_description: D-Bus Connections - * @include: gio/gio.h + * GDBusConnection: * - * The #GDBusConnection type is used for D-Bus connections to remote - * peers such as a message buses. It is a low-level API that offers a - * lot of flexibility. For instance, it lets you establish a connection - * over any transport that can by represented as a #GIOStream. + * The `GDBusConnection` type is used for D-Bus connections to remote + * peers such as a message buses. + * + * It is a low-level API that offers a lot of flexibility. For instance, + * it lets you establish a connection over any transport that can by represented + * as a [class@Gio.IOStream]. * * This class is rarely used directly in D-Bus clients. If you are writing - * a D-Bus client, it is often easier to use the g_bus_own_name(), - * g_bus_watch_name() or g_dbus_proxy_new_for_bus() APIs. + * a D-Bus client, it is often easier to use the [func@Gio.bus_own_name], + * [func@Gio.bus_watch_name] or [func@Gio.DBusProxy.new_for_bus] APIs. * * As an exception to the usual GLib rule that a particular object must not - * be used by two threads at the same time, #GDBusConnection's methods may be - * called from any thread. This is so that g_bus_get() and g_bus_get_sync() - * can safely return the same #GDBusConnection when called from any thread. + * be used by two threads at the same time, `GDBusConnection`s methods may be + * called from any thread. This is so that [func@Gio.bus_get] and + * [func@Gio.bus_get_sync] can safely return the same `GDBusConnection` when + * called from any thread. * - * Most of the ways to obtain a #GDBusConnection automatically initialize it - * (i.e. connect to D-Bus): for instance, g_dbus_connection_new() and - * g_bus_get(), and the synchronous versions of those methods, give you an - * initialized connection. Language bindings for GIO should use - * g_initable_new() or g_async_initable_new_async(), which also initialize the - * connection. + * Most of the ways to obtain a `GDBusConnection` automatically initialize it + * (i.e. connect to D-Bus): for instance, [func@Gio.DBusConnection.new] and + * [func@Gio.bus_get], and the synchronous versions of those methods, give you + * an initialized connection. Language bindings for GIO should use + * [func@Gio.Initable.new] or [func@Gio.AsyncInitable.new_async], which also + * initialize the connection. * - * If you construct an uninitialized #GDBusConnection, such as via - * g_object_new(), you must initialize it via g_initable_init() or - * g_async_initable_init_async() before using its methods or properties. - * Calling methods or accessing properties on a #GDBusConnection that has not + * If you construct an uninitialized `GDBusConnection`, such as via + * [ctor@GObject.Object.new], you must initialize it via [method@Gio.Initable.init] or + * [method@Gio.AsyncInitable.init_async] before using its methods or properties. + * Calling methods or accessing properties on a `GDBusConnection` that has not * completed initialization successfully is considered to be invalid, and leads * to undefined behaviour. In particular, if initialization fails with a - * #GError, the only valid thing you can do with that #GDBusConnection is to - * free it with g_object_unref(). + * `GError`, the only valid thing you can do with that `GDBusConnection` is to + * free it with [method@GObject.Object.unref]. * - * ## An example D-Bus server # {#gdbus-server} + * ## An example D-Bus server * * Here is an example for a D-Bus server: * [gdbus-example-server.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-server.c) * - * ## An example for exporting a subtree # {#gdbus-subtree-server} + * ## An example for exporting a subtree * * Here is an example for exporting a subtree: * [gdbus-example-subtree.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-subtree.c) * - * ## An example for file descriptor passing # {#gdbus-unix-fd-client} + * ## An example for file descriptor passing * * Here is an example for passing UNIX file descriptors: * [gdbus-unix-fd-client.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-unix-fd-client.c) * - * ## An example for exporting a GObject # {#gdbus-export} + * ## An example for exporting a GObject * * Here is an example for exporting a #GObject: * [gdbus-example-export.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-export.c) + * + * Since: 2.26 */ /* ---------------------------------------------------------------------------------------------------- */ @@ -312,14 +315,6 @@ enum { FLAG_CLOSED = 1 << 2 }; -/** - * GDBusConnection: - * - * The #GDBusConnection structure contains only private data and - * should only be accessed using the provided API. - * - * Since: 2.26 - */ struct _GDBusConnection { /*< private >*/ @@ -820,9 +815,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_STREAM, - g_param_spec_object ("stream", - P_("IO Stream"), - P_("The underlying streams used for I/O"), + g_param_spec_object ("stream", NULL, NULL, G_TYPE_IO_STREAM, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -841,9 +834,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_ADDRESS, - g_param_spec_string ("address", - P_("Address"), - P_("D-Bus address specifying potential socket endpoints"), + g_param_spec_string ("address", NULL, NULL, NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -860,9 +851,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("Flags"), - P_("Flags"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_DBUS_CONNECTION_FLAGS, G_DBUS_CONNECTION_FLAGS_NONE, G_PARAM_READABLE | @@ -902,9 +891,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_GUID, - g_param_spec_string ("guid", - P_("GUID"), - P_("GUID of the server peer"), + g_param_spec_string ("guid", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -923,9 +910,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_UNIQUE_NAME, - g_param_spec_string ("unique-name", - P_("unique-name"), - P_("Unique name of bus connection"), + g_param_spec_string ("unique-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -941,9 +926,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_CLOSED, - g_param_spec_boolean ("closed", - P_("Closed"), - P_("Whether the connection is closed"), + g_param_spec_boolean ("closed", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -964,9 +947,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_EXIT_ON_CLOSE, - g_param_spec_boolean ("exit-on-close", - P_("Exit on close"), - P_("Whether the process is terminated when the connection is closed"), + g_param_spec_boolean ("exit-on-close", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -984,9 +965,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_CAPABILITY_FLAGS, - g_param_spec_flags ("capabilities", - P_("Capabilities"), - P_("Capabilities"), + g_param_spec_flags ("capabilities", NULL, NULL, G_TYPE_DBUS_CAPABILITY_FLAGS, G_DBUS_CAPABILITY_FLAGS_NONE, G_PARAM_READABLE | @@ -1003,9 +982,7 @@ g_dbus_connection_class_init (GDBusConnectionClass *klass) */ g_object_class_install_property (gobject_class, PROP_AUTHENTICATION_OBSERVER, - g_param_spec_object ("authentication-observer", - P_("Authentication Observer"), - P_("Object used to assist in the authentication process"), + g_param_spec_object ("authentication-observer", NULL, NULL, G_TYPE_DBUS_AUTH_OBSERVER, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -1851,7 +1828,7 @@ send_message_data_deliver_error (GTask *task, send_message_with_reply_cleanup (task, TRUE); CONNECTION_UNLOCK (connection); - g_task_return_new_error (task, domain, code, "%s", message); + g_task_return_new_error_literal (task, domain, code, message); g_object_unref (task); } @@ -2409,10 +2386,10 @@ cancel_method_on_close (gpointer key, gpointer value, gpointer user_data) if (data->delivered) return FALSE; - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CLOSED, - _("The connection is closed")); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CLOSED, + _("The connection is closed")); /* Ask send_message_with_reply_cleanup not to remove the element from the * hash table - we're in the middle of a foreach; that would be unsafe. @@ -2665,7 +2642,26 @@ initable_init (GInitable *initable, g_propagate_error (error, g_error_copy (connection->initialization_error)); } - g_atomic_int_or (&connection->atomic_flags, FLAG_INITIALIZED); + /* Don't cache canceled errors. Otherwise other concurrent users of the same connection + * object will be canceled as well. */ + if (g_error_matches (connection->initialization_error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + { + if (connection->worker != NULL) + { + _g_dbus_worker_stop (connection->worker); + connection->worker = NULL; + if (alive_connections != NULL) + g_warn_if_fail (g_hash_table_remove (alive_connections, connection)); + } + g_clear_error (&connection->initialization_error); + g_clear_object (&connection->stream); + g_clear_object (&connection->auth); + g_clear_object (&connection->credentials); + g_clear_pointer (&connection->guid, g_free); + connection->capabilities = 0; + } + else + g_atomic_int_or (&connection->atomic_flags, FLAG_INITIALIZED); g_mutex_unlock (&connection->init_lock); return ret; @@ -3872,16 +3868,22 @@ schedule_callbacks (GDBusConnection *connection, const gchar *member; const gchar *path; const gchar *arg0; + const gchar *arg0_path; interface = NULL; member = NULL; path = NULL; arg0 = NULL; + arg0_path = NULL; interface = g_dbus_message_get_interface (message); member = g_dbus_message_get_member (message); path = g_dbus_message_get_path (message); arg0 = g_dbus_message_get_arg0 (message); + arg0_path = g_dbus_message_get_arg0_path (message); + + /* These two are mutually exclusive through the type system. */ + g_assert (arg0 == NULL || arg0_path == NULL); #if 0 g_print ("In schedule_callbacks:\n" @@ -3915,17 +3917,15 @@ schedule_callbacks (GDBusConnection *connection, if (signal_data->arg0 != NULL) { - if (arg0 == NULL) - continue; - if (signal_data->flags & G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE) { - if (!namespace_rule_matches (signal_data->arg0, arg0)) + if (arg0 == NULL || !namespace_rule_matches (signal_data->arg0, arg0)) continue; } else if (signal_data->flags & G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH) { - if (!path_rule_matches (signal_data->arg0, arg0)) + if ((arg0 == NULL || !path_rule_matches (signal_data->arg0, arg0)) && + (arg0_path == NULL || !path_rule_matches (signal_data->arg0, arg0_path))) continue; } else if (!g_str_equal (signal_data->arg0, arg0)) diff --git a/gio/gdbusdaemon.c b/gio/gdbusdaemon.c index 70009f9..3474b70 100644 --- a/gio/gdbusdaemon.c +++ b/gio/gdbusdaemon.c @@ -1692,9 +1692,7 @@ g_dbus_daemon_class_init (GDBusDaemonClass *klass) g_object_class_install_property (gobject_class, PROP_ADDRESS, - g_param_spec_string ("address", - "Bus Address", - "The address the bus should use", + g_param_spec_string ("address", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gdbuserror.c b/gio/gdbuserror.c index 1cee9e5..432b24c 100644 --- a/gio/gdbuserror.c +++ b/gio/gdbuserror.c @@ -33,82 +33,6 @@ #include "glibintl.h" -/** - * SECTION:gdbuserror - * @title: GDBusError - * @short_description: Mapping D-Bus errors to and from GError - * @include: gio/gio.h - * - * All facilities that return errors from remote methods (such as - * g_dbus_connection_call_sync()) use #GError to represent both D-Bus - * errors (e.g. errors returned from the other peer) and locally - * in-process generated errors. - * - * To check if a returned #GError is an error from a remote peer, use - * g_dbus_error_is_remote_error(). To get the actual D-Bus error name, - * use g_dbus_error_get_remote_error(). Before presenting an error, - * always use g_dbus_error_strip_remote_error(). - * - * In addition, facilities used to return errors to a remote peer also - * use #GError. See g_dbus_method_invocation_return_error() for - * discussion about how the D-Bus error name is set. - * - * Applications can associate a #GError error domain with a set of D-Bus errors in order to - * automatically map from D-Bus errors to #GError and back. This - * is typically done in the function returning the #GQuark for the - * error domain: - * |[ - * // foo-bar-error.h: - * - * #define FOO_BAR_ERROR (foo_bar_error_quark ()) - * GQuark foo_bar_error_quark (void); - * - * typedef enum - * { - * FOO_BAR_ERROR_FAILED, - * FOO_BAR_ERROR_ANOTHER_ERROR, - * FOO_BAR_ERROR_SOME_THIRD_ERROR, - * FOO_BAR_N_ERRORS / *< skip >* / - * } FooBarError; - * - * // foo-bar-error.c: - * - * static const GDBusErrorEntry foo_bar_error_entries[] = - * { - * {FOO_BAR_ERROR_FAILED, "org.project.Foo.Bar.Error.Failed"}, - * {FOO_BAR_ERROR_ANOTHER_ERROR, "org.project.Foo.Bar.Error.AnotherError"}, - * {FOO_BAR_ERROR_SOME_THIRD_ERROR, "org.project.Foo.Bar.Error.SomeThirdError"}, - * }; - * - * // Ensure that every error code has an associated D-Bus error name - * G_STATIC_ASSERT (G_N_ELEMENTS (foo_bar_error_entries) == FOO_BAR_N_ERRORS); - * - * GQuark - * foo_bar_error_quark (void) - * { - * static gsize quark = 0; - * g_dbus_error_register_error_domain ("foo-bar-error-quark", - * &quark, - * foo_bar_error_entries, - * G_N_ELEMENTS (foo_bar_error_entries)); - * return (GQuark) quark; - * } - * ]| - * With this setup, a D-Bus peer can transparently pass e.g. %FOO_BAR_ERROR_ANOTHER_ERROR and - * other peers will see the D-Bus error name org.project.Foo.Bar.Error.AnotherError. - * - * If the other peer is using GDBus, and has registered the association with - * g_dbus_error_register_error_domain() in advance (e.g. by invoking the %FOO_BAR_ERROR quark - * generation itself in the previous example) the peer will see also %FOO_BAR_ERROR_ANOTHER_ERROR instead - * of %G_IO_ERROR_DBUS_ERROR. Note that GDBus clients can still recover - * org.project.Foo.Bar.Error.AnotherError using g_dbus_error_get_remote_error(). - * - * Note that the %G_DBUS_ERROR error domain is intended only - * for returning errors from a remote message bus process. Errors - * generated locally in-process by e.g. #GDBusConnection should use the - * %G_IO_ERROR domain. - */ - static const GDBusErrorEntry g_dbus_error_entries[] = { {G_DBUS_ERROR_FAILED, "org.freedesktop.DBus.Error.Failed"}, diff --git a/gio/gdbusinterface.c b/gio/gdbusinterface.c index b479676..317834b 100644 --- a/gio/gdbusinterface.c +++ b/gio/gdbusinterface.c @@ -28,13 +28,15 @@ #include "glibintl.h" /** - * SECTION:gdbusinterface - * @short_description: Base type for D-Bus interfaces - * @include: gio/gio.h + * GDBusInterface: * - * The #GDBusInterface type is the base type for D-Bus interfaces both - * on the service side (see #GDBusInterfaceSkeleton) and client side - * (see #GDBusProxy). + * Base type for D-Bus interfaces. + * + * The `GDBusInterface` type is the base type for D-Bus interfaces both + * on the service side (see [class@Gio.DBusInterfaceSkeleton]) and client side + * (see [class@Gio.DBusProxy]). + * + * Since: 2.30 */ typedef GDBusInterfaceIface GDBusInterfaceInterface; diff --git a/gio/gdbusinterface.h b/gio/gdbusinterface.h index 838a54e..4488975 100644 --- a/gio/gdbusinterface.h +++ b/gio/gdbusinterface.h @@ -32,14 +32,6 @@ G_BEGIN_DECLS #define G_IS_DBUS_INTERFACE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_DBUS_INTERFACE)) #define G_DBUS_INTERFACE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE((o), G_TYPE_DBUS_INTERFACE, GDBusInterfaceIface)) -/** - * GDBusInterface: - * - * Base type for D-Bus interfaces. - * - * Since: 2.30 - */ - typedef struct _GDBusInterfaceIface GDBusInterfaceIface; /** diff --git a/gio/gdbusinterfaceskeleton.c b/gio/gdbusinterfaceskeleton.c index 1a6aa64..5f9be9c 100644 --- a/gio/gdbusinterfaceskeleton.c +++ b/gio/gdbusinterfaceskeleton.c @@ -36,11 +36,11 @@ #include "glibintl.h" /** - * SECTION:gdbusinterfaceskeleton - * @short_description: Service-side D-Bus interface - * @include: gio/gio.h + * GDBusInterfaceSkeleton: * * Abstract base class for D-Bus interfaces on the service side. + * + * Since: 2.30 */ struct _GDBusInterfaceSkeletonPrivate @@ -192,9 +192,7 @@ g_dbus_interface_skeleton_class_init (GDBusInterfaceSkeletonClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_FLAGS, - g_param_spec_flags ("g-flags", - "g-flags", - "Flags for the interface skeleton", + g_param_spec_flags ("g-flags", NULL, NULL, G_TYPE_DBUS_INTERFACE_SKELETON_FLAGS, G_DBUS_INTERFACE_SKELETON_FLAGS_NONE, G_PARAM_READABLE | diff --git a/gio/gdbusinterfaceskeleton.h b/gio/gdbusinterfaceskeleton.h index 244ee0e..5de5ff9 100644 --- a/gio/gdbusinterfaceskeleton.h +++ b/gio/gdbusinterfaceskeleton.h @@ -37,14 +37,6 @@ G_BEGIN_DECLS typedef struct _GDBusInterfaceSkeletonClass GDBusInterfaceSkeletonClass; typedef struct _GDBusInterfaceSkeletonPrivate GDBusInterfaceSkeletonPrivate; -/** - * GDBusInterfaceSkeleton: - * - * The #GDBusInterfaceSkeleton structure contains private data and should - * only be accessed using the provided API. - * - * Since: 2.30 - */ struct _GDBusInterfaceSkeleton { /*< private >*/ diff --git a/gio/gdbusintrospection.c b/gio/gdbusintrospection.c index c7be334..7ee3e32 100644 --- a/gio/gdbusintrospection.c +++ b/gio/gdbusintrospection.c @@ -29,20 +29,6 @@ #include "glibintl.h" -/** - * SECTION:gdbusintrospection - * @title: D-Bus Introspection Data - * @short_description: Node and interface description data structures - * @include: gio/gio.h - * - * Various data structures and convenience routines to parse and - * generate D-Bus introspection XML. Introspection information is - * used when registering objects with g_dbus_connection_register_object(). - * - * The format of D-Bus introspection XML is specified in the - * [D-Bus specification](http://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format) - */ - /* ---------------------------------------------------------------------------------------------------- */ #define _MY_DEFINE_BOXED_TYPE(TypeName, type_name) \ diff --git a/gio/gdbusmenumodel.c b/gio/gdbusmenumodel.c index 0a34ed2..dd77f5e 100644 --- a/gio/gdbusmenumodel.c +++ b/gio/gdbusmenumodel.c @@ -28,23 +28,12 @@ /* Prelude {{{1 */ -/** - * SECTION:gdbusmenumodel - * @title: GDBusMenuModel - * @short_description: A D-Bus GMenuModel implementation - * @include: gio/gio.h - * @see_also: [GMenuModel Exporter][gio-GMenuModel-exporter] - * - * #GDBusMenuModel is an implementation of #GMenuModel that can be used - * as a proxy for a menu model that is exported over D-Bus with - * g_dbus_connection_export_menu_model(). - */ - /** * GDBusMenuModel: * - * #GDBusMenuModel is an opaque data structure and can only be accessed - * using the following functions. + * `GDBusMenuModel` is an implementation of [class@Gio.MenuModel] that can be + * used as a proxy for a menu model that is exported over D-Bus with + * [method@Gio.DBusConnection.export_menu_model]. */ /* diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c index adddb31..5a5fec8 100644 --- a/gio/gdbusmessage.c +++ b/gio/gdbusmessage.c @@ -462,16 +462,6 @@ g_memory_buffer_put_string (GMemoryBuffer *mbuf, return g_memory_buffer_write (mbuf, str, strlen (str)); } - -/** - * SECTION:gdbusmessage - * @short_description: D-Bus Message - * @include: gio/gio.h - * - * A type for representing D-Bus messages that can be sent or received - * on a #GDBusConnection. - */ - typedef struct _GDBusMessageClass GDBusMessageClass; /** @@ -490,8 +480,8 @@ struct _GDBusMessageClass /** * GDBusMessage: * - * The #GDBusMessage structure contains only private data and should - * only be accessed using the provided API. + * A type for representing D-Bus messages that can be sent or received + * on a [class@Gio.DBusConnection]. * * Since: 2.26 */ @@ -508,6 +498,7 @@ struct _GDBusMessage guint32 serial; GHashTable *headers; GVariant *body; + GVariant *arg0_cache; /* (nullable) (owned) */ #ifdef G_OS_UNIX GUnixFDList *fd_list; #endif @@ -530,6 +521,7 @@ g_dbus_message_finalize (GObject *object) g_hash_table_unref (message->headers); if (message->body != NULL) g_variant_unref (message->body); + g_clear_pointer (&message->arg0_cache, g_variant_unref); #ifdef G_OS_UNIX if (message->fd_list != NULL) g_object_unref (message->fd_list); @@ -577,9 +569,7 @@ g_dbus_message_class_init (GDBusMessageClass *klass) */ g_object_class_install_property (gobject_class, PROP_LOCKED, - g_param_spec_boolean ("locked", - P_("Locked"), - P_("Whether the message is locked"), + g_param_spec_boolean ("locked", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -1168,6 +1158,7 @@ g_dbus_message_set_body (GDBusMessage *message, if (body == NULL) { message->body = NULL; + message->arg0_cache = NULL; g_dbus_message_set_signature (message, NULL); } else @@ -1178,6 +1169,12 @@ g_dbus_message_set_body (GDBusMessage *message, message->body = g_variant_ref_sink (body); + if (g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE) && + g_variant_n_children (message->body) > 0) + message->arg0_cache = g_variant_get_child_value (message->body, 0); + else + message->arg0_cache = NULL; + type_string = g_variant_get_type_string (body); type_string_len = strlen (type_string); g_assert (type_string_len >= 2); @@ -1286,17 +1283,225 @@ get_type_fixed_size (const GVariantType *type) } } +static const char * +message_type_to_string (GDBusMessageType message_type) +{ + switch (message_type) + { + case G_DBUS_MESSAGE_TYPE_INVALID: + return "INVALID"; + case G_DBUS_MESSAGE_TYPE_METHOD_CALL: + return "METHOD_CALL"; + case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: + return "METHOD_RETURN"; + case G_DBUS_MESSAGE_TYPE_ERROR: + return "ERROR"; + case G_DBUS_MESSAGE_TYPE_SIGNAL: + return "SIGNAL"; + default: + return "unknown-type"; + } +} + +static const char * +message_header_field_to_string (GDBusMessageHeaderField field) +{ + switch (field) + { + case G_DBUS_MESSAGE_HEADER_FIELD_INVALID: + return "INVALID"; + case G_DBUS_MESSAGE_HEADER_FIELD_PATH: + return "PATH"; + case G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE: + return "INTERFACE"; + case G_DBUS_MESSAGE_HEADER_FIELD_MEMBER: + return "MEMBER"; + case G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME: + return "ERROR_NAME"; + case G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL: + return "REPLY_SERIAL"; + case G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION: + return "DESTINATION"; + case G_DBUS_MESSAGE_HEADER_FIELD_SENDER: + return "SENDER"; + case G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE: + return "SIGNATURE"; + case G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS: + return "NUM_UNIX_FDS"; + default: + return "unknown-field"; + } +} + +static gboolean +validate_header (GDBusMessage *message, + GDBusMessageHeaderField field, + GVariant *header_value, + const GVariantType *expected_type, + GError **error) +{ + g_assert (header_value != NULL); + + if (!g_variant_is_of_type (header_value, expected_type)) + { + char *expected_type_string = g_variant_type_dup_string (expected_type); + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: %s header field is invalid; expected a value of type ‘%s’"), + message_type_to_string (message->type), + message_header_field_to_string (field), + expected_type_string); + g_free (expected_type_string); + return FALSE; + } + + return TRUE; +} + +static gboolean +require_header (GDBusMessage *message, + GDBusMessageHeaderField field, + GError **error) +{ + GVariant *header_value = g_dbus_message_get_header (message, field); + + if (header_value == NULL) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: %s header field is missing or invalid"), + message_type_to_string (message->type), + message_header_field_to_string (field)); + return FALSE; + } + + return TRUE; +} + +/* Implement the validation rules given in + * https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-header-fields */ static gboolean validate_headers (GDBusMessage *message, GError **error) { gboolean ret; + GHashTableIter headers_iter; + gpointer key; + GVariant *header_value; g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); ret = FALSE; + /* Validate the types of all known headers. */ + g_hash_table_iter_init (&headers_iter, message->headers); + while (g_hash_table_iter_next (&headers_iter, &key, (gpointer) &header_value)) + { + GDBusMessageHeaderField field_type = GPOINTER_TO_INT (key); + + switch (field_type) + { + case G_DBUS_MESSAGE_HEADER_FIELD_INVALID: + /* The invalid header must be rejected as per + * https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-header-fields */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: INVALID header field supplied"), + message_type_to_string (message->type)); + goto out; + case G_DBUS_MESSAGE_HEADER_FIELD_PATH: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_OBJECT_PATH, error)) + goto out; + if (g_strcmp0 (g_variant_get_string (header_value, NULL), "/org/freedesktop/DBus/Local") == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: PATH header field is using the reserved value /org/freedesktop/DBus/Local"), + message_type_to_string (message->type)); + goto out; + } + break; + case G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_STRING, error)) + goto out; + if (!g_dbus_is_interface_name (g_variant_get_string (header_value, NULL))) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: INTERFACE header field does not contain a valid interface name"), + message_type_to_string (message->type)); + goto out; + } + if (g_strcmp0 (g_variant_get_string (header_value, NULL), "org.freedesktop.DBus.Local") == 0) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: INTERFACE header field is using the reserved value org.freedesktop.DBus.Local"), + message_type_to_string (message->type)); + goto out; + } + break; + case G_DBUS_MESSAGE_HEADER_FIELD_MEMBER: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_STRING, error)) + goto out; + if (!g_dbus_is_member_name (g_variant_get_string (header_value, NULL))) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: MEMBER header field does not contain a valid member name"), + message_type_to_string (message->type)); + goto out; + } + break; + case G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_STRING, error)) + goto out; + if (!g_dbus_is_error_name (g_variant_get_string (header_value, NULL))) + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_ARGUMENT, + _("%s message: ERROR_NAME header field does not contain a valid error name"), + message_type_to_string (message->type)); + goto out; + } + break; + case G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_UINT32, error)) + goto out; + break; + case G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_STRING, error)) + goto out; + break; + case G_DBUS_MESSAGE_HEADER_FIELD_SENDER: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_STRING, error)) + goto out; + break; + case G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_SIGNATURE, error)) + goto out; + break; + case G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS: + if (!validate_header (message, field_type, header_value, G_VARIANT_TYPE_UINT32, error)) + goto out; + break; + default: + /* Ignore unknown fields as per + * https://dbus.freedesktop.org/doc/dbus-specification.html#message-protocol-header-fields. */ + continue; + } + } + + /* Check for message-type-specific required headers. */ switch (message->type) { case G_DBUS_MESSAGE_TYPE_INVALID: @@ -1305,102 +1510,29 @@ validate_headers (GDBusMessage *message, G_IO_ERROR_INVALID_ARGUMENT, _("type is INVALID")); goto out; - break; case G_DBUS_MESSAGE_TYPE_METHOD_CALL: - { - GVariant *path_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH); - GVariant *member_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER); - - if (path_variant == NULL || - !g_variant_is_of_type (path_variant, G_VARIANT_TYPE_OBJECT_PATH) || - member_variant == NULL || - !g_variant_is_of_type (member_variant, G_VARIANT_TYPE_STRING) || - !g_dbus_is_member_name (g_variant_get_string (member_variant, NULL))) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("METHOD_CALL message: PATH or MEMBER header field is missing or invalid")); - goto out; - } - } + if (!require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH, error) || + !require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, error)) + goto out; break; case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: - { - GVariant *reply_serial_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL); - - if (reply_serial_variant == NULL || - !g_variant_is_of_type (reply_serial_variant, G_VARIANT_TYPE_UINT32)) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid")); - goto out; - } - } + if (!require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, error)) + goto out; break; case G_DBUS_MESSAGE_TYPE_ERROR: - { - GVariant *error_name_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME); - GVariant *reply_serial_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL); - - if (error_name_variant == NULL || - !g_variant_is_of_type (error_name_variant, G_VARIANT_TYPE_STRING) || - !g_dbus_is_error_name (g_variant_get_string (error_name_variant, NULL)) || - reply_serial_variant == NULL || - !g_variant_is_of_type (reply_serial_variant, G_VARIANT_TYPE_UINT32)) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid")); - goto out; - } - } + if (!require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME, error) || + !require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, error)) + goto out; break; case G_DBUS_MESSAGE_TYPE_SIGNAL: - { - GVariant *path_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH); - GVariant *interface_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE); - GVariant *member_variant = g_dbus_message_get_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER); - - if (path_variant == NULL || - !g_variant_is_of_type (path_variant, G_VARIANT_TYPE_OBJECT_PATH) || - interface_variant == NULL || - !g_variant_is_of_type (interface_variant, G_VARIANT_TYPE_STRING) || - !g_dbus_is_interface_name (g_variant_get_string (interface_variant, NULL)) || - member_variant == NULL || - !g_variant_is_of_type (member_variant, G_VARIANT_TYPE_STRING) || - !g_dbus_is_member_name (g_variant_get_string (member_variant, NULL))) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid")); - goto out; - } - if (g_strcmp0 (g_dbus_message_get_path (message), "/org/freedesktop/DBus/Local") == 0) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local")); - goto out; - } - if (g_strcmp0 (g_dbus_message_get_interface (message), "org.freedesktop.DBus.Local") == 0) - { - g_set_error_literal (error, - G_IO_ERROR, - G_IO_ERROR_INVALID_ARGUMENT, - _("SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local")); - goto out; - } - } + if (!require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_PATH, error) || + !require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE, error) || + !require_header (message, G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, error)) + goto out; break; default: @@ -2362,6 +2494,14 @@ g_dbus_message_new_from_blob (guchar *blob, 2, &local_error); g_variant_type_free (variant_type); + + if (message->body != NULL && + g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE) && + g_variant_n_children (message->body) > 0) + message->arg0_cache = g_variant_get_child_value (message->body, 0); + else + message->arg0_cache = NULL; + if (message->body == NULL) goto fail; } @@ -3393,6 +3533,9 @@ g_dbus_message_set_signature (GDBusMessage *message, * * Convenience to get the first item in the body of @message. * + * See [method@Gio.DBusMessage.get_arg0_path] for returning object-path-typed + * arg0 values. + * * Returns: (nullable): The string item or %NULL if the first item in the body of * @message is not a string. * @@ -3401,22 +3544,38 @@ g_dbus_message_set_signature (GDBusMessage *message, const gchar * g_dbus_message_get_arg0 (GDBusMessage *message) { - const gchar *ret; - g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); - ret = NULL; + if (message->arg0_cache != NULL && + g_variant_is_of_type (message->arg0_cache, G_VARIANT_TYPE_STRING)) + return g_variant_get_string (message->arg0_cache, NULL); - if (message->body != NULL && g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE)) - { - GVariant *item; - item = g_variant_get_child_value (message->body, 0); - if (g_variant_is_of_type (item, G_VARIANT_TYPE_STRING)) - ret = g_variant_get_string (item, NULL); - g_variant_unref (item); - } + return NULL; +} - return ret; +/** + * g_dbus_message_get_arg0_path: + * @message: A `GDBusMessage`. + * + * Convenience to get the first item in the body of @message. + * + * See [method@Gio.DBusMessage.get_arg0] for returning string-typed arg0 values. + * + * Returns: (nullable): The object path item or `NULL` if the first item in the + * body of @message is not an object path. + * + * Since: 2.80 + */ +const gchar * +g_dbus_message_get_arg0_path (GDBusMessage *message) +{ + g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL); + + if (message->arg0_cache != NULL && + g_variant_is_of_type (message->arg0_cache, G_VARIANT_TYPE_OBJECT_PATH)) + return g_variant_get_string (message->arg0_cache, NULL); + + return NULL; } /* ---------------------------------------------------------------------------------------------------- */ @@ -3594,7 +3753,7 @@ _sort_keys_func (gconstpointer a, * The contents of the description has no ABI guarantees, the contents * and formatting is subject to change at any time. Typical output * looks something like this: - * |[ + * ``` * Type: method-call * Flags: none * Version: 0 @@ -3607,9 +3766,9 @@ _sort_keys_func (gconstpointer a, * Body: () * UNIX File Descriptors: * (none) - * ]| + * ``` * or - * |[ + * ``` * Type: method-return * Flags: no-reply-expected * Version: 0 @@ -3622,9 +3781,9 @@ _sort_keys_func (gconstpointer a, * Body: () * UNIX File Descriptors: * fd 12: dev=0:10,mode=020620,ino=5,uid=500,gid=5,rdev=136:2,size=0,atime=1273085037,mtime=1273085851,ctime=1272982635 - * ]| + * ``` * - * Returns: (not nullable): A string that should be freed with g_free(). + * Returns: (not nullable): A string that should be freed with [func@GLib.free]. * * Since: 2.26 */ @@ -3859,6 +4018,7 @@ g_dbus_message_copy (GDBusMessage *message, * to just ref (as opposed to deep-copying) the GVariant instances */ ret->body = message->body != NULL ? g_variant_ref (message->body) : NULL; + ret->arg0_cache = message->arg0_cache != NULL ? g_variant_ref (message->arg0_cache) : NULL; g_hash_table_iter_init (&iter, message->headers); while (g_hash_table_iter_next (&iter, &header_key, (gpointer) &header_value)) g_hash_table_insert (ret->headers, header_key, g_variant_ref (header_value)); diff --git a/gio/gdbusmessage.h b/gio/gdbusmessage.h index 6e4bb9e..643aca0 100644 --- a/gio/gdbusmessage.h +++ b/gio/gdbusmessage.h @@ -176,7 +176,8 @@ void g_dbus_message_set_num_unix_fds (GDBusMessage GIO_AVAILABLE_IN_ALL const gchar *g_dbus_message_get_arg0 (GDBusMessage *message); - +GIO_AVAILABLE_IN_2_80 +const gchar *g_dbus_message_get_arg0_path (GDBusMessage *message); GIO_AVAILABLE_IN_ALL GDBusMessage *g_dbus_message_new_from_blob (guchar *blob, diff --git a/gio/gdbusmethodinvocation.c b/gio/gdbusmethodinvocation.c index e5a9166..00a6de2 100644 --- a/gio/gdbusmethodinvocation.c +++ b/gio/gdbusmethodinvocation.c @@ -40,17 +40,18 @@ #include "glibintl.h" /** - * SECTION:gdbusmethodinvocation - * @short_description: Object for handling remote calls - * @include: gio/gio.h + * GDBusMethodInvocation: * - * Instances of the #GDBusMethodInvocation class are used when + * Instances of the `GDBusMethodInvocation` class are used when * handling D-Bus method calls. It provides a way to asynchronously * return results and errors. * - * The normal way to obtain a #GDBusMethodInvocation object is to receive - * it as an argument to the handle_method_call() function in a - * #GDBusInterfaceVTable that was passed to g_dbus_connection_register_object(). + * The normal way to obtain a `GDBusMethodInvocation` object is to receive + * it as an argument to the `handle_method_call()` function in a + * [type@Gio.DBusInterfaceVTable] that was passed to + * [method@Gio.DBusConnection.register_object]. + * + * Since: 2.26 */ typedef struct _GDBusMethodInvocationClass GDBusMethodInvocationClass; @@ -68,14 +69,6 @@ struct _GDBusMethodInvocationClass GObjectClass parent_class; }; -/** - * GDBusMethodInvocation: - * - * The #GDBusMethodInvocation structure contains only private data and - * should only be accessed using the provided API. - * - * Since: 2.26 - */ struct _GDBusMethodInvocation { /*< private >*/ diff --git a/gio/gdbusnameowning.c b/gio/gdbusnameowning.c index 289ea03..40feba2 100644 --- a/gio/gdbusnameowning.c +++ b/gio/gdbusnameowning.c @@ -32,18 +32,6 @@ #include "glibintl.h" -/** - * SECTION:gdbusnameowning - * @title: Owning Bus Names - * @short_description: Simple API for owning bus names - * @include: gio/gio.h - * - * Convenience API for owning bus names. - * - * A simple example for owning a name can be found in - * [gdbus-example-own-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-own-name.c) - */ - G_LOCK_DEFINE_STATIC (lock); /* ---------------------------------------------------------------------------------------------------- */ @@ -521,8 +509,10 @@ connection_get_cb (GObject *source_object, * @connection: a #GDBusConnection * @name: the well-known name to own * @flags: a set of flags from the #GBusNameOwnerFlags enumeration - * @name_acquired_handler: (nullable): handler to invoke when @name is acquired or %NULL - * @name_lost_handler: (nullable): handler to invoke when @name is lost or %NULL + * @name_acquired_handler: (nullable) (scope notified): handler to invoke when + * @name is acquired or %NULL + * @name_lost_handler: (nullable) (scope notified): handler to invoke when @name + * is lost or %NULL * @user_data: user data to pass to handlers * @user_data_free_func: (nullable): function for freeing @user_data or %NULL * @@ -583,9 +573,12 @@ g_bus_own_name_on_connection (GDBusConnection *connection, * @bus_type: the type of bus to own a name on * @name: the well-known name to own * @flags: a set of flags from the #GBusNameOwnerFlags enumeration - * @bus_acquired_handler: (nullable): handler to invoke when connected to the bus of type @bus_type or %NULL - * @name_acquired_handler: (nullable): handler to invoke when @name is acquired or %NULL - * @name_lost_handler: (nullable): handler to invoke when @name is lost or %NULL + * @bus_acquired_handler: (nullable) (scope notified): handler to invoke when + * connected to the bus of type @bus_type or %NULL + * @name_acquired_handler: (nullable) (scope notified): handler to invoke when + * @name is acquired or %NULL + * @name_lost_handler: (nullable) (scope notified): handler to invoke when @name + * is lost or %NULL * @user_data: user data to pass to handlers * @user_data_free_func: (nullable): function for freeing @user_data or %NULL * diff --git a/gio/gdbusnamewatching.c b/gio/gdbusnamewatching.c index c834fe1..c86051c 100644 --- a/gio/gdbusnamewatching.c +++ b/gio/gdbusnamewatching.c @@ -33,18 +33,6 @@ #include "glibintl.h" -/** - * SECTION:gdbusnamewatching - * @title: Watching Bus Names - * @short_description: Simple API for watching bus names - * @include: gio/gio.h - * - * Convenience API for watching bus names. - * - * A simple example for watching a name can be found in - * [gdbus-example-watch-name.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-name.c) - */ - G_LOCK_DEFINE_STATIC (lock); /* ---------------------------------------------------------------------------------------------------- */ @@ -576,8 +564,10 @@ connection_get_cb (GObject *source_object, * @bus_type: The type of bus to watch a name on. * @name: The name (well-known or unique) to watch. * @flags: Flags from the #GBusNameWatcherFlags enumeration. - * @name_appeared_handler: (nullable): Handler to invoke when @name is known to exist or %NULL. - * @name_vanished_handler: (nullable): Handler to invoke when @name is known to not exist or %NULL. + * @name_appeared_handler: (nullable) (scope notified): Handler to invoke when + * @name is known to exist or %NULL. + * @name_vanished_handler: (nullable) (scope notified): Handler to invoke when + * @name is known to not exist or %NULL. * @user_data: User data to pass to handlers. * @user_data_free_func: (nullable): Function for freeing @user_data or %NULL. * @@ -665,8 +655,10 @@ g_bus_watch_name (GBusType bus_type, * @connection: A #GDBusConnection. * @name: The name (well-known or unique) to watch. * @flags: Flags from the #GBusNameWatcherFlags enumeration. - * @name_appeared_handler: (nullable): Handler to invoke when @name is known to exist or %NULL. - * @name_vanished_handler: (nullable): Handler to invoke when @name is known to not exist or %NULL. + * @name_appeared_handler: (nullable) (scope notified): Handler to invoke when + * @name is known to exist or %NULL. + * @name_vanished_handler: (nullable) (scope notified): Handler to invoke when + * @name is known to not exist or %NULL. * @user_data: User data to pass to handlers. * @user_data_free_func: (nullable): Function for freeing @user_data or %NULL. * diff --git a/gio/gdbusobject.c b/gio/gdbusobject.c index 5cd425e..ab670d2 100644 --- a/gio/gdbusobject.c +++ b/gio/gdbusobject.c @@ -28,22 +28,13 @@ #include "glibintl.h" -/** - * SECTION:gdbusobject - * @short_description: Base type for D-Bus objects - * @include: gio/gio.h - * - * The #GDBusObject type is the base type for D-Bus objects on both - * the service side (see #GDBusObjectSkeleton) and the client side - * (see #GDBusObjectProxy). It is essentially just a container of - * interfaces. - */ - /** * GDBusObject: * - * #GDBusObject is an opaque data structure and can only be accessed - * using the following functions. + * The `GDBusObject` type is the base type for D-Bus objects on both + * the service side (see [class@Gio.DBusObjectSkeleton]) and the client side + * (see [class@Gio.DBusObjectProxy]). It is essentially just a container of + * interfaces. */ typedef GDBusObjectIface GDBusObjectInterface; diff --git a/gio/gdbusobjectmanager.c b/gio/gdbusobjectmanager.c index cd56c2a..2578c9b 100644 --- a/gio/gdbusobjectmanager.c +++ b/gio/gdbusobjectmanager.c @@ -30,25 +30,16 @@ #include "glibintl.h" #include "gmarshal-internal.h" -/** - * SECTION:gdbusobjectmanager - * @short_description: Base type for D-Bus object managers - * @include: gio/gio.h - * - * The #GDBusObjectManager type is the base type for service- and - * client-side implementations of the standardized - * [org.freedesktop.DBus.ObjectManager](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager) - * interface. - * - * See #GDBusObjectManagerClient for the client-side implementation - * and #GDBusObjectManagerServer for the service-side implementation. - */ - /** * GDBusObjectManager: * - * #GDBusObjectManager is an opaque data structure and can only be accessed - * using the following functions. + * The `GDBusObjectManager` type is the base type for service- and + * client-side implementations of the standardized + * [`org.freedesktop.DBus.ObjectManager`](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager) + * interface. + * + * See [class@Gio.DBusObjectManagerClient] for the client-side implementation + * and [class@Gio.DBusObjectManagerServer] for the service-side implementation. */ typedef GDBusObjectManagerIface GDBusObjectManagerInterface; diff --git a/gio/gdbusobjectmanagerclient.c b/gio/gdbusobjectmanagerclient.c index b6b3b21..cb35d06 100644 --- a/gio/gdbusobjectmanagerclient.c +++ b/gio/gdbusobjectmanagerclient.c @@ -43,85 +43,88 @@ #include "gmarshal-internal.h" /** - * SECTION:gdbusobjectmanagerclient - * @short_description: Client-side object manager - * @include: gio/gio.h + * GDBusObjectManagerClient: * - * #GDBusObjectManagerClient is used to create, monitor and delete object - * proxies for remote objects exported by a #GDBusObjectManagerServer (or any - * code implementing the + * `GDBusObjectManagerClient` is used to create, monitor and delete object + * proxies for remote objects exported by a [class@Gio.DBusObjectManagerServer] + * (or any code implementing the * [org.freedesktop.DBus.ObjectManager](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager) * interface). * * Once an instance of this type has been created, you can connect to - * the #GDBusObjectManager::object-added and - * #GDBusObjectManager::object-removed signals and inspect the - * #GDBusObjectProxy objects returned by - * g_dbus_object_manager_get_objects(). + * the [signal@Gio.DBusObjectManager::object-added] and + * [signal@Gio.DBusObjectManager::object-removed signals] and inspect the + * [class@Gio.DBusObjectProxy] objects returned by + * [method@Gio.DBusObjectManager.get_objects]. * - * If the name for a #GDBusObjectManagerClient is not owned by anyone at + * If the name for a `GDBusObjectManagerClient` is not owned by anyone at * object construction time, the default behavior is to request the * message bus to launch an owner for the name. This behavior can be - * disabled using the %G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START - * flag. It's also worth noting that this only works if the name of + * disabled using the `G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_DO_NOT_AUTO_START` + * flag. It’s also worth noting that this only works if the name of * interest is activatable in the first place. E.g. in some cases it * is not possible to launch an owner for the requested name. In this - * case, #GDBusObjectManagerClient object construction still succeeds but + * case, `GDBusObjectManagerClient` object construction still succeeds but * there will be no object proxies - * (e.g. g_dbus_object_manager_get_objects() returns the empty list) and - * the #GDBusObjectManagerClient:name-owner property is %NULL. + * (e.g. [method@Gio.DBusObjectManager.get_objects] returns the empty list) and + * the [property@Gio.DBusObjectManagerClient:name-owner] property is `NULL`. * * The owner of the requested name can come and go (for example - * consider a system service being restarted) – #GDBusObjectManagerClient - * handles this case too; simply connect to the #GObject::notify - * signal to watch for changes on the #GDBusObjectManagerClient:name-owner - * property. When the name owner vanishes, the behavior is that - * #GDBusObjectManagerClient:name-owner is set to %NULL (this includes - * emission of the #GObject::notify signal) and then - * #GDBusObjectManager::object-removed signals are synthesized + * consider a system service being restarted) – `GDBusObjectManagerClient` + * handles this case too; simply connect to the [signal@GObject.Object::notify] + * signal to watch for changes on the + * [property@Gio.DBusObjectManagerClient:name-owner] property. When the name + * owner vanishes, the behavior is that + * [property@Gio.DBusObjectManagerClient:name-owner] is set to `NULL` (this + * includes emission of the [signal@GObject.Object::notify] signal) and then + * [signal@Gio.DBusObjectManager::object-removed] signals are synthesized * for all currently existing object proxies. Since - * #GDBusObjectManagerClient:name-owner is %NULL when this happens, you can - * use this information to disambiguate a synthesized signal from a - * genuine signal caused by object removal on the remote - * #GDBusObjectManager. Similarly, when a new name owner appears, - * #GDBusObjectManager::object-added signals are synthesized - * while #GDBusObjectManagerClient:name-owner is still %NULL. Only when all - * object proxies have been added, the #GDBusObjectManagerClient:name-owner - * is set to the new name owner (this includes emission of the - * #GObject::notify signal). Furthermore, you are guaranteed that - * #GDBusObjectManagerClient:name-owner will alternate between a name owner - * (e.g. `:1.42`) and %NULL even in the case where + * [property@Gio.DBusObjectManagerClient:name-owner] is `NULL` when this + * happens, you can use this information to disambiguate a synthesized signal + * from a genuine signal caused by object removal on the remote + * [iface@Gio.DBusObjectManager]. Similarly, when a new name owner appears, + * [signal@Gio.DBusObjectManager::object-added] signals are synthesized + * while [property@Gio.DBusObjectManagerClient:name-owner] is still `NULL`. Only + * when all object proxies have been added, the + * [property@Gio.DBusObjectManagerClient:name-owner] is set to the new name + * owner (this includes emission of the [signal@GObject.Object::notify] signal). + * Furthermore, you are guaranteed that + * [property@Gio.DBusObjectManagerClient:name-owner] will alternate between a + * name owner (e.g. `:1.42`) and `NULL` even in the case where * the name of interest is atomically replaced * - * Ultimately, #GDBusObjectManagerClient is used to obtain #GDBusProxy - * instances. All signals (including the - * org.freedesktop.DBus.Properties::PropertiesChanged signal) - * delivered to #GDBusProxy instances are guaranteed to originate + * Ultimately, `GDBusObjectManagerClient` is used to obtain + * [class@Gio.DBusProxy] instances. All signals (including the + * `org.freedesktop.DBus.Properties::PropertiesChanged` signal) + * delivered to [class@Gio.DBusProxy] instances are guaranteed to originate * from the name owner. This guarantee along with the behavior * described above, means that certain race conditions including the - * "half the proxy is from the old owner and the other half is from - * the new owner" problem cannot happen. + * “half the proxy is from the old owner and the other half is from + * the new owner” problem cannot happen. * * To avoid having the application connect to signals on the returned - * #GDBusObjectProxy and #GDBusProxy objects, the - * #GDBusObject::interface-added, - * #GDBusObject::interface-removed, - * #GDBusProxy::g-properties-changed and - * #GDBusProxy::g-signal signals - * are also emitted on the #GDBusObjectManagerClient instance managing these + * [class@Gio.DBusObjectProxy] and [class@Gio.DBusProxy] objects, the + * [signal@Gio.DBusObject::interface-added], + * [signal@Gio.DBusObject::interface-removed], + * [signal@Gio.DBusProxy::g-properties-changed] and + * [signal@Gio.DBusProxy::g-signal] signals + * are also emitted on the `GDBusObjectManagerClient` instance managing these * objects. The signals emitted are - * #GDBusObjectManager::interface-added, - * #GDBusObjectManager::interface-removed, - * #GDBusObjectManagerClient::interface-proxy-properties-changed and - * #GDBusObjectManagerClient::interface-proxy-signal. + * [signal@Gio.DBusObjectManager::interface-added], + * [signal@Gio.DBusObjectManager::interface-removed], + * [signal@Gio.DBusObjectManagerClient::interface-proxy-properties-changed] and + * [signal@Gio.DBusObjectManagerClient::interface-proxy-signal]. * * Note that all callbacks and signals are emitted in the - * [thread-default main context][g-main-context-push-thread-default] - * that the #GDBusObjectManagerClient object was constructed - * in. Additionally, the #GDBusObjectProxy and #GDBusProxy objects - * originating from the #GDBusObjectManagerClient object will be created in + * thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) that the + * `GDBusObjectManagerClient` object was constructed in. Additionally, the + * [class@Gio.DBusObjectProxy] and [class@Gio.DBusProxy] objects + * originating from the `GDBusObjectManagerClient` object will be created in * the same context and, consequently, will deliver signals in the * same main loop. + * + * Since: 2.30 */ struct _GDBusObjectManagerClientPrivate @@ -360,9 +363,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_CONNECTION, - g_param_spec_object ("connection", - "Connection", - "The connection to use", + g_param_spec_object ("connection", NULL, NULL, G_TYPE_DBUS_CONNECTION, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -381,9 +382,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_BUS_TYPE, - g_param_spec_enum ("bus-type", - "Bus Type", - "The bus to connect to, if any", + g_param_spec_enum ("bus-type", NULL, NULL, G_TYPE_BUS_TYPE, G_BUS_TYPE_NONE, G_PARAM_WRITABLE | @@ -401,9 +400,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", - "Flags", - "Flags for the proxy manager", + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_DBUS_OBJECT_MANAGER_CLIENT_FLAGS, G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE, G_PARAM_READABLE | @@ -422,9 +419,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_OBJECT_PATH, - g_param_spec_string ("object-path", - "Object Path", - "The object path of the control object", + g_param_spec_string ("object-path", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -440,9 +435,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_NAME, - g_param_spec_string ("name", - "Name", - "Name that the manager is for", + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -460,9 +453,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_NAME_OWNER, - g_param_spec_string ("name-owner", - "Name Owner", - "The owner of the name we are watching", + g_param_spec_string ("name-owner", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -477,9 +468,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_GET_PROXY_TYPE_FUNC, - g_param_spec_pointer ("get-proxy-type-func", - "GDBusProxyTypeFunc Function Pointer", - "The GDBusProxyTypeFunc pointer to use", + g_param_spec_pointer ("get-proxy-type-func", NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -494,9 +483,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_GET_PROXY_TYPE_USER_DATA, - g_param_spec_pointer ("get-proxy-type-user-data", - "GDBusProxyTypeFunc User Data", - "The GDBusProxyTypeFunc user_data", + g_param_spec_pointer ("get-proxy-type-user-data", NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -511,9 +498,7 @@ g_dbus_object_manager_client_class_init (GDBusObjectManagerClientClass *klass) */ g_object_class_install_property (gobject_class, PROP_GET_PROXY_TYPE_DESTROY_NOTIFY, - g_param_spec_pointer ("get-proxy-type-destroy-notify", - "GDBusProxyTypeFunc user data free function", - "The GDBusProxyTypeFunc user data free function", + g_param_spec_pointer ("get-proxy-type-destroy-notify", NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gdbusobjectmanagerclient.h b/gio/gdbusobjectmanagerclient.h index 2ebeedc..f02c693 100644 --- a/gio/gdbusobjectmanagerclient.h +++ b/gio/gdbusobjectmanagerclient.h @@ -37,14 +37,6 @@ G_BEGIN_DECLS typedef struct _GDBusObjectManagerClientClass GDBusObjectManagerClientClass; typedef struct _GDBusObjectManagerClientPrivate GDBusObjectManagerClientPrivate; -/** - * GDBusObjectManagerClient: - * - * The #GDBusObjectManagerClient structure contains private data and should - * only be accessed using the provided API. - * - * Since: 2.30 - */ struct _GDBusObjectManagerClient { /*< private >*/ diff --git a/gio/gdbusobjectmanagerserver.c b/gio/gdbusobjectmanagerserver.c index 68539ea..bbc390f 100644 --- a/gio/gdbusobjectmanagerserver.c +++ b/gio/gdbusobjectmanagerserver.c @@ -37,13 +37,11 @@ #include "glibintl.h" /** - * SECTION:gdbusobjectmanagerserver - * @short_description: Service-side object manager - * @include: gio/gio.h + * GDBusObjectManagerServer: * - * #GDBusObjectManagerServer is used to export #GDBusObject instances using - * the standardized - * [org.freedesktop.DBus.ObjectManager](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager) + * `GDBusObjectManagerServer` is used to export [iface@Gio.DBusObject] instances + * using the standardized + * [`org.freedesktop.DBus.ObjectManager`](http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager) * interface. For example, remote D-Bus clients can get all objects * and properties in a single call. Additionally, any change in the * object hierarchy is broadcast using signals. This means that D-Bus @@ -59,10 +57,11 @@ * It is supported, but not recommended, to export an object manager at the root * path, `/`. * - * See #GDBusObjectManagerClient for the client-side code that is - * intended to be used with #GDBusObjectManagerServer or any D-Bus - * object implementing the org.freedesktop.DBus.ObjectManager - * interface. + * See [class@Gio.DBusObjectManagerClient] for the client-side code that is + * intended to be used with `GDBusObjectManagerServer` or any D-Bus + * object implementing the `org.freedesktop.DBus.ObjectManager` interface. + * + * Since: 2.30 */ typedef struct @@ -210,9 +209,7 @@ g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_CONNECTION, - g_param_spec_object ("connection", - "Connection", - "The connection to export objects on", + g_param_spec_object ("connection", NULL, NULL, G_TYPE_DBUS_CONNECTION, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -227,9 +224,7 @@ g_dbus_object_manager_server_class_init (GDBusObjectManagerServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_OBJECT_PATH, - g_param_spec_string ("object-path", - "Object Path", - "The object path to register the manager object at", + g_param_spec_string ("object-path", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gdbusobjectmanagerserver.h b/gio/gdbusobjectmanagerserver.h index 92543dd..a4b7418 100644 --- a/gio/gdbusobjectmanagerserver.h +++ b/gio/gdbusobjectmanagerserver.h @@ -37,14 +37,6 @@ G_BEGIN_DECLS typedef struct _GDBusObjectManagerServerClass GDBusObjectManagerServerClass; typedef struct _GDBusObjectManagerServerPrivate GDBusObjectManagerServerPrivate; -/** - * GDBusObjectManagerServer: - * - * The #GDBusObjectManagerServer structure contains private data and should - * only be accessed using the provided API. - * - * Since: 2.30 - */ struct _GDBusObjectManagerServer { /*< private >*/ diff --git a/gio/gdbusobjectproxy.c b/gio/gdbusobjectproxy.c index ac5e448..dcdfe5b 100644 --- a/gio/gdbusobjectproxy.c +++ b/gio/gdbusobjectproxy.c @@ -32,13 +32,11 @@ #include "glibintl.h" /** - * SECTION:gdbusobjectproxy - * @short_description: Client-side D-Bus object - * @include: gio/gio.h + * GDBusObjectProxy: * - * A #GDBusObjectProxy is an object used to represent a remote object - * with one or more D-Bus interfaces. Normally, you don't instantiate - * a #GDBusObjectProxy yourself - typically #GDBusObjectManagerClient + * A `GDBusObjectProxy` is an object used to represent a remote object + * with one or more D-Bus interfaces. Normally, you don’t instantiate + * a `GDBusObjectProxy` yourself — typically [class@Gio.DBusObjectManagerClient] * is used to obtain it. * * Since: 2.30 @@ -154,9 +152,7 @@ g_dbus_object_proxy_class_init (GDBusObjectProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_OBJECT_PATH, - g_param_spec_string ("g-object-path", - "Object Path", - "The object path of the proxy", + g_param_spec_string ("g-object-path", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -171,9 +167,7 @@ g_dbus_object_proxy_class_init (GDBusObjectProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_CONNECTION, - g_param_spec_object ("g-connection", - "Connection", - "The connection of the proxy", + g_param_spec_object ("g-connection", NULL, NULL, G_TYPE_DBUS_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gdbusobjectproxy.h b/gio/gdbusobjectproxy.h index ea5af0f..8397dba 100644 --- a/gio/gdbusobjectproxy.h +++ b/gio/gdbusobjectproxy.h @@ -37,14 +37,6 @@ G_BEGIN_DECLS typedef struct _GDBusObjectProxyClass GDBusObjectProxyClass; typedef struct _GDBusObjectProxyPrivate GDBusObjectProxyPrivate; -/** - * GDBusObjectProxy: - * - * The #GDBusObjectProxy structure contains private data and should - * only be accessed using the provided API. - * - * Since: 2.30 - */ struct _GDBusObjectProxy { /*< private >*/ diff --git a/gio/gdbusobjectskeleton.c b/gio/gdbusobjectskeleton.c index 0b857ba..f137675 100644 --- a/gio/gdbusobjectskeleton.c +++ b/gio/gdbusobjectskeleton.c @@ -34,15 +34,15 @@ #include "glibintl.h" /** - * SECTION:gdbusobjectskeleton - * @short_description: Service-side D-Bus object - * @include: gio/gio.h + * GDBusObjectSkeleton: * - * A #GDBusObjectSkeleton instance is essentially a group of D-Bus + * A `GDBusObjectSkeleton` instance is essentially a group of D-Bus * interfaces. The set of exported interfaces on the object may be * dynamic and change at runtime. * - * This type is intended to be used with #GDBusObjectManager. + * This type is intended to be used with [iface@Gio.DBusObjectManager]. + * + * Since: 2.30 */ struct _GDBusObjectSkeletonPrivate @@ -157,9 +157,7 @@ g_dbus_object_skeleton_class_init (GDBusObjectSkeletonClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_OBJECT_PATH, - g_param_spec_string ("g-object-path", - "Object Path", - "The object path where the object is exported", + g_param_spec_string ("g-object-path", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gdbusobjectskeleton.h b/gio/gdbusobjectskeleton.h index b15a288..f902d54 100644 --- a/gio/gdbusobjectskeleton.h +++ b/gio/gdbusobjectskeleton.h @@ -37,14 +37,6 @@ G_BEGIN_DECLS typedef struct _GDBusObjectSkeletonClass GDBusObjectSkeletonClass; typedef struct _GDBusObjectSkeletonPrivate GDBusObjectSkeletonPrivate; -/** - * GDBusObjectSkeleton: - * - * The #GDBusObjectSkeleton structure contains private data and should only be - * accessed using the provided API. - * - * Since: 2.30 - */ struct _GDBusObjectSkeleton { /*< private >*/ diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c index 2c9238c..28083e4 100644 --- a/gio/gdbusprivate.c +++ b/gio/gdbusprivate.c @@ -294,10 +294,9 @@ gdbus_shared_thread_func (gpointer user_data) static SharedThreadData * _g_dbus_shared_thread_ref (void) { - static gsize shared_thread_data = 0; - SharedThreadData *ret; + static SharedThreadData *shared_thread_data = 0; - if (g_once_init_enter (&shared_thread_data)) + if (g_once_init_enter_pointer (&shared_thread_data)) { SharedThreadData *data; @@ -310,12 +309,11 @@ _g_dbus_shared_thread_ref (void) gdbus_shared_thread_func, data); /* We can cast between gsize and gpointer safely */ - g_once_init_leave (&shared_thread_data, (gsize) data); + g_once_init_leave_pointer (&shared_thread_data, data); } - ret = (SharedThreadData*) shared_thread_data; - g_atomic_int_inc (&ret->refcount); - return ret; + g_atomic_int_inc (&shared_thread_data->refcount); + return shared_thread_data; } static void @@ -1032,10 +1030,12 @@ write_message_continue_writing (MessageToWriteData *data) if (!(data->worker->capabilities & G_DBUS_CAPABILITY_FLAGS_UNIX_FD_PASSING)) { GTask *task = g_steal_pointer (&data->task); - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_FAILED, - "Tried sending a file descriptor but remote peer does not support this capability"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_FAILED, + "Tried sending a file descriptor " + "but remote peer does not support " + "this capability"); g_clear_object (&task); goto out; } @@ -2028,10 +2028,10 @@ _g_dbus_compute_complete_signature (GDBusArgInfo **args) #ifdef G_OS_WIN32 -#define DBUS_DAEMON_ADDRESS_INFO "DBusDaemonAddressInfo" -#define DBUS_DAEMON_MUTEX "DBusDaemonMutex" -#define UNIQUE_DBUS_INIT_MUTEX "UniqueDBusInitMutex" -#define DBUS_AUTOLAUNCH_MUTEX "DBusAutolaunchMutex" +#define DBUS_DAEMON_ADDRESS_INFO L"DBusDaemonAddressInfo" +#define DBUS_DAEMON_MUTEX L"DBusDaemonMutex" +#define UNIQUE_DBUS_INIT_MUTEX L"UniqueDBusInitMutex" +#define DBUS_AUTOLAUNCH_MUTEX L"DBusAutolaunchMutex" static void release_mutex (HANDLE mutex) @@ -2041,12 +2041,12 @@ release_mutex (HANDLE mutex) } static HANDLE -acquire_mutex (const char *mutexname) +acquire_mutex (const wchar_t *mutexname) { HANDLE mutex; DWORD res; - mutex = CreateMutexA (NULL, FALSE, mutexname); + mutex = CreateMutex (NULL, FALSE, mutexname); if (!mutex) return 0; @@ -2065,12 +2065,12 @@ acquire_mutex (const char *mutexname) } static gboolean -is_mutex_owned (const char *mutexname) +is_mutex_owned (const wchar_t *mutexname) { HANDLE mutex; gboolean res = FALSE; - mutex = CreateMutexA (NULL, FALSE, mutexname); + mutex = CreateMutex (NULL, FALSE, mutexname); if (WaitForSingleObject (mutex, 10) == WAIT_TIMEOUT) res = TRUE; else @@ -2081,7 +2081,7 @@ is_mutex_owned (const char *mutexname) } static char * -read_shm (const char *shm_name) +read_shm (const wchar_t *shm_name) { HANDLE shared_mem; char *shared_data; @@ -2092,7 +2092,7 @@ read_shm (const char *shm_name) for (i = 0; i < 20; i++) { - shared_mem = OpenFileMappingA (FILE_MAP_READ, FALSE, shm_name); + shared_mem = OpenFileMapping (FILE_MAP_READ, FALSE, shm_name); if (shared_mem != 0) break; Sleep (100); @@ -2122,13 +2122,13 @@ read_shm (const char *shm_name) } static HANDLE -set_shm (const char *shm_name, const char *value) +set_shm (const wchar_t *shm_name, const char *value) { HANDLE shared_mem; char *shared_data; - shared_mem = CreateFileMappingA (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, - 0, strlen (value) + 1, shm_name); + shared_mem = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, + 0, strlen (value) + 1, shm_name); if (shared_mem == 0) return 0; @@ -2154,7 +2154,7 @@ publish_session_bus (const char *address) init_mutex = acquire_mutex (UNIQUE_DBUS_INIT_MUTEX); - published_daemon_mutex = CreateMutexA (NULL, FALSE, DBUS_DAEMON_MUTEX); + published_daemon_mutex = CreateMutex (NULL, FALSE, DBUS_DAEMON_MUTEX); if (WaitForSingleObject (published_daemon_mutex, 10 ) != WAIT_OBJECT_0) { release_mutex (init_mutex); @@ -2397,11 +2397,11 @@ gchar * _g_dbus_get_machine_id (GError **error) { #ifdef G_OS_WIN32 - HW_PROFILE_INFOA info; - char *src, *dest, *res; + HW_PROFILE_INFO info; + char *guid, *src, *dest, *res; int i; - if (!GetCurrentHwProfileA (&info)) + if (!GetCurrentHwProfile (&info)) { char *message = g_win32_error_message (GetLastError ()); g_set_error (error, @@ -2412,8 +2412,11 @@ _g_dbus_get_machine_id (GError **error) return NULL; } - /* Form: {12340001-4980-1920-6788-123456789012} */ - src = &info.szHwProfileGuid[0]; + if (!(guid = g_utf16_to_utf8 (info.szHwProfileGuid, -1, NULL, NULL, NULL))) + return NULL; + + /* Guid is of the form: {12340001-4980-1920-6788-123456789012} */ + src = guid; res = g_malloc (32+1); dest = res; @@ -2435,6 +2438,8 @@ _g_dbus_get_machine_id (GError **error) *dest++ = *src++; *dest = 0; + g_free (guid); + return res; #else gchar *ret = NULL; diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c index afc6fe9..5d9a637 100644 --- a/gio/gdbusproxy.c +++ b/gio/gdbusproxy.c @@ -47,54 +47,56 @@ #include "gmarshal-internal.h" /** - * SECTION:gdbusproxy - * @short_description: Client-side D-Bus interface proxy - * @include: gio/gio.h + * GDBusProxy: * - * #GDBusProxy is a base class used for proxies to access a D-Bus - * interface on a remote object. A #GDBusProxy can be constructed for + * `GDBusProxy` is a base class used for proxies to access a D-Bus + * interface on a remote object. A `GDBusProxy` can be constructed for * both well-known and unique names. * - * By default, #GDBusProxy will cache all properties (and listen to + * By default, `GDBusProxy` will cache all properties (and listen to * changes) of the remote object, and proxy all signals that get * emitted. This behaviour can be changed by passing suitable - * #GDBusProxyFlags when the proxy is created. If the proxy is for a + * [flags@Gio.DBusProxyFlags] when the proxy is created. If the proxy is for a * well-known name, the property cache is flushed when the name owner * vanishes and reloaded when a name owner appears. * - * The unique name owner of the proxy's name is tracked and can be read from - * #GDBusProxy:g-name-owner. Connect to the #GObject::notify signal to - * get notified of changes. Additionally, only signals and property - * changes emitted from the current name owner are considered and - * calls are always sent to the current name owner. This avoids a - * number of race conditions when the name is lost by one owner and - * claimed by another. However, if no name owner currently exists, + * The unique name owner of the proxy’s name is tracked and can be read from + * [property@Gio.DBusProxy:g-name-owner]. Connect to the + * [signal@GObject.Object::notify] signal to get notified of changes. + * Additionally, only signals and property changes emitted from the current name + * owner are considered and calls are always sent to the current name owner. + * This avoids a number of race conditions when the name is lost by one owner + * and claimed by another. However, if no name owner currently exists, * then calls will be sent to the well-known name which may result in * the message bus launching an owner (unless - * %G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START is set). + * `G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START` is set). * * If the proxy is for a stateless D-Bus service, where the name owner may - * be started and stopped between calls, the #GDBusProxy:g-name-owner tracking - * of #GDBusProxy will cause the proxy to drop signal and property changes from - * the service after it has restarted for the first time. When interacting - * with a stateless D-Bus service, do not use #GDBusProxy — use direct D-Bus - * method calls and signal connections. + * be started and stopped between calls, the + * [property@Gio.DBusProxy:g-name-owner] tracking of `GDBusProxy` will cause the + * proxy to drop signal and property changes from the service after it has + * restarted for the first time. When interacting with a stateless D-Bus + * service, do not use `GDBusProxy` — use direct D-Bus method calls and signal + * connections. * - * The generic #GDBusProxy::g-properties-changed and - * #GDBusProxy::g-signal signals are not very convenient to work with. - * Therefore, the recommended way of working with proxies is to subclass - * #GDBusProxy, and have more natural properties and signals in your derived - * class. This [example][gdbus-example-gdbus-codegen] shows how this can - * easily be done using the [gdbus-codegen][gdbus-codegen] tool. + * The generic [signal@Gio.DBusProxy::g-properties-changed] and + * [signal@Gio.DBusProxy::g-signal] signals are not very convenient to work + * with. Therefore, the recommended way of working with proxies is to subclass + * `GDBusProxy`, and have more natural properties and signals in your derived + * class. This [example](migrating-gdbus.html#using-gdbus-codegen) shows how + * this can easily be done using the [`gdbus-codegen`](gdbus-codegen.html) tool. * - * A #GDBusProxy instance can be used from multiple threads but note - * that all signals (e.g. #GDBusProxy::g-signal, #GDBusProxy::g-properties-changed - * and #GObject::notify) are emitted in the - * [thread-default main context][g-main-context-push-thread-default] - * of the thread where the instance was constructed. + * A `GDBusProxy` instance can be used from multiple threads but note + * that all signals (e.g. [signal@Gio.DBusProxy::g-signal], + * [signal@Gio.DBusProxy::g-properties-changed] and + * [signal@GObject.Object::notify]) are emitted in the thread-default main + * context (see [method@GLib.MainContext.push_thread_default]) of the thread + * where the instance was constructed. * * An example using a proxy for a well-known name can be found in - * [gdbus-example-watch-proxy.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-proxy.c) + * [`gdbus-example-watch-proxy.c`](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-watch-proxy.c). + * + * Since: 2.26 */ /* lock protecting the mutable properties: name_owner, timeout_msec, @@ -367,9 +369,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_INTERFACE_INFO, - g_param_spec_boxed ("g-interface-info", - P_("Interface Information"), - P_("Interface Information"), + g_param_spec_boxed ("g-interface-info", NULL, NULL, G_TYPE_DBUS_INTERFACE_INFO, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -386,9 +386,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_CONNECTION, - g_param_spec_object ("g-connection", - P_("g-connection"), - P_("The connection the proxy is for"), + g_param_spec_object ("g-connection", NULL, NULL, G_TYPE_DBUS_CONNECTION, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -409,9 +407,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_BUS_TYPE, - g_param_spec_enum ("g-bus-type", - P_("Bus Type"), - P_("The bus to connect to, if any"), + g_param_spec_enum ("g-bus-type", NULL, NULL, G_TYPE_BUS_TYPE, G_BUS_TYPE_NONE, G_PARAM_WRITABLE | @@ -429,9 +425,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_FLAGS, - g_param_spec_flags ("g-flags", - P_("g-flags"), - P_("Flags for the proxy"), + g_param_spec_flags ("g-flags", NULL, NULL, G_TYPE_DBUS_PROXY_FLAGS, G_DBUS_PROXY_FLAGS_NONE, G_PARAM_READABLE | @@ -450,9 +444,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_NAME, - g_param_spec_string ("g-name", - P_("g-name"), - P_("The well-known or unique name that the proxy is for"), + g_param_spec_string ("g-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -472,9 +464,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_NAME_OWNER, - g_param_spec_string ("g-name-owner", - P_("g-name-owner"), - P_("The unique name for the owner"), + g_param_spec_string ("g-name-owner", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -490,9 +480,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_OBJECT_PATH, - g_param_spec_string ("g-object-path", - P_("g-object-path"), - P_("The object path the proxy is for"), + g_param_spec_string ("g-object-path", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -510,9 +498,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_INTERFACE_NAME, - g_param_spec_string ("g-interface-name", - P_("g-interface-name"), - P_("The D-Bus interface name the proxy is for"), + g_param_spec_string ("g-interface-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -537,9 +523,7 @@ g_dbus_proxy_class_init (GDBusProxyClass *klass) */ g_object_class_install_property (gobject_class, PROP_G_DEFAULT_TIMEOUT, - g_param_spec_int ("g-default-timeout", - P_("Default Timeout"), - P_("Timeout for remote method invocation"), + g_param_spec_int ("g-default-timeout", NULL, NULL, -1, G_MAXINT, -1, diff --git a/gio/gdbusproxy.h b/gio/gdbusproxy.h index 7483156..d74cf75 100644 --- a/gio/gdbusproxy.h +++ b/gio/gdbusproxy.h @@ -42,14 +42,6 @@ G_BEGIN_DECLS typedef struct _GDBusProxyClass GDBusProxyClass; typedef struct _GDBusProxyPrivate GDBusProxyPrivate; -/** - * GDBusProxy: - * - * The #GDBusProxy structure contains only private data and - * should only be accessed using the provided API. - * - * Since: 2.26 - */ struct _GDBusProxy { /*< private >*/ diff --git a/gio/gdbusserver.c b/gio/gdbusserver.c index db0c9ab..4e23e52 100644 --- a/gio/gdbusserver.c +++ b/gio/gdbusserver.c @@ -63,35 +63,28 @@ G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER) /** - * SECTION:gdbusserver - * @short_description: Helper for accepting connections - * @include: gio/gio.h + * GDBusServer: * - * #GDBusServer is a helper for listening to and accepting D-Bus + * `GDBusServer` is a helper for listening to and accepting D-Bus * connections. This can be used to create a new D-Bus server, allowing two * peers to use the D-Bus protocol for their own specialized communication. * A server instance provided in this way will not perform message routing or - * implement the org.freedesktop.DBus interface. + * implement the + * [`org.freedesktop.DBus` interface](https://dbus.freedesktop.org/doc/dbus-specification.html#message-bus-messages). * * To just export an object on a well-known name on a message bus, such as the - * session or system bus, you should instead use g_bus_own_name(). + * session or system bus, you should instead use [func@Gio.bus_own_name]. * * An example of peer-to-peer communication with GDBus can be found * in [gdbus-example-peer.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/tests/gdbus-example-peer.c). * - * Note that a minimal #GDBusServer will accept connections from any - * peer. In many use-cases it will be necessary to add a #GDBusAuthObserver - * that only accepts connections that have successfully authenticated - * as the same user that is running the #GDBusServer. Since GLib 2.68 this can - * be achieved more simply by passing the - * %G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER flag to the server. - */ - -/** - * GDBusServer: - * - * The #GDBusServer structure contains only private data and - * should only be accessed using the provided API. + * Note that a minimal `GDBusServer` will accept connections from any + * peer. In many use-cases it will be necessary to add a + * [class@Gio.DBusAuthObserver] that only accepts connections that have + * successfully authenticated as the same user that is running the + * `GDBusServer`. Since GLib 2.68 this can be achieved more simply by passing + * the `G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER` flag to the + * server. * * Since: 2.26 */ @@ -305,9 +298,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("Flags"), - P_("Flags for the server"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_DBUS_SERVER_FLAGS, G_DBUS_SERVER_FLAGS_NONE, G_PARAM_READABLE | @@ -328,9 +319,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_GUID, - g_param_spec_string ("guid", - P_("GUID"), - P_("The guid of the server"), + g_param_spec_string ("guid", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -348,9 +337,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_ADDRESS, - g_param_spec_string ("address", - P_("Address"), - P_("The address to listen on"), + g_param_spec_string ("address", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | @@ -368,9 +355,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_CLIENT_ADDRESS, - g_param_spec_string ("client-address", - P_("Client Address"), - P_("The address clients can use"), + g_param_spec_string ("client-address", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -386,9 +371,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_ACTIVE, - g_param_spec_boolean ("active", - P_("Active"), - P_("Whether the server is currently active"), + g_param_spec_boolean ("active", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_NAME | @@ -404,9 +387,7 @@ g_dbus_server_class_init (GDBusServerClass *klass) */ g_object_class_install_property (gobject_class, PROP_AUTHENTICATION_OBSERVER, - g_param_spec_object ("authentication-observer", - P_("Authentication Observer"), - P_("Object used to assist in the authentication process"), + g_param_spec_object ("authentication-observer", NULL, NULL, G_TYPE_DBUS_AUTH_OBSERVER, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gdbusutils.c b/gio/gdbusutils.c index 4b4b7e1..a76e9ac 100644 --- a/gio/gdbusutils.c +++ b/gio/gdbusutils.c @@ -29,15 +29,6 @@ #include "glibintl.h" -/** - * SECTION:gdbusutils - * @title: D-Bus Utilities - * @short_description: Various utilities related to D-Bus - * @include: gio/gio.h - * - * Various utility routines related to D-Bus. - */ - static gboolean is_valid_bus_name_character (gint c, gboolean allow_hyphen) diff --git a/gio/gdebugcontroller.c b/gio/gdebugcontroller.c index 159a699..ab72f09 100644 --- a/gio/gdebugcontroller.c +++ b/gio/gdebugcontroller.c @@ -29,25 +29,23 @@ #include "giomodule-priv.h" /** - * SECTION:gdebugcontroller - * @title: GDebugController - * @short_description: Debugging controller - * @include: gio/gio.h + * GDebugController: * - * #GDebugController is an interface to expose control of debugging features and + * `GDebugController` is an interface to expose control of debugging features and * debug output. * - * It is implemented on Linux using #GDebugControllerDBus, which exposes a D-Bus - * interface to allow authenticated peers to control debug features in this - * process. + * It is implemented on Linux using [class@Gio.DebugControllerDBus], which + * exposes a D-Bus interface to allow authenticated peers to control debug + * features in this process. * * Whether debug output is enabled is exposed as - * #GDebugController:debug-enabled. This controls g_log_set_debug_enabled() by - * default. Application code may connect to the #GObject::notify signal for it + * [property@Gio.DebugController:debug-enabled]. This controls + * [func@GLib.log_set_debug_enabled] by default. Application code may + * connect to the [signal@GObject.Object::notify] signal for it * to control other parts of its debug infrastructure as necessary. * * If your application or service is using the default GLib log writer function, - * creating one of the built-in implementations of #GDebugController should be + * creating one of the built-in implementations of `GDebugController` should be * all that’s needed to dynamically enable or disable debug output. * * Since: 2.72 @@ -68,9 +66,7 @@ g_debug_controller_default_init (GDebugControllerInterface *iface) * Since: 2.72 */ g_object_interface_install_property (iface, - g_param_spec_boolean ("debug-enabled", - "Debug Enabled", - "Whether to expose debug output", + g_param_spec_boolean ("debug-enabled", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | diff --git a/gio/gdebugcontroller.h b/gio/gdebugcontroller.h index e59cd34..b89ce06 100644 --- a/gio/gdebugcontroller.h +++ b/gio/gdebugcontroller.h @@ -41,14 +41,6 @@ G_BEGIN_DECLS */ #define G_DEBUG_CONTROLLER_EXTENSION_POINT_NAME "gio-debug-controller" -/** - * GDebugController: - * - * #GDebugController is an interface to expose control of debugging features and - * debug output. - * - * Since: 2.72 - */ #define G_TYPE_DEBUG_CONTROLLER (g_debug_controller_get_type ()) GIO_AVAILABLE_IN_2_72 G_DECLARE_INTERFACE(GDebugController, g_debug_controller, g, debug_controller, GObject) diff --git a/gio/gdebugcontrollerdbus.c b/gio/gdebugcontrollerdbus.c index ce0f703..03dd1be 100644 --- a/gio/gdebugcontrollerdbus.c +++ b/gio/gdebugcontrollerdbus.c @@ -31,35 +31,34 @@ #include "gio/gmarshal-internal.h" /** - * SECTION:gdebugcontrollerdbus - * @title: GDebugControllerDBus - * @short_description: Debugging controller D-Bus implementation - * @include: gio/gio.h + * GDebugControllerDBus: * - * #GDebugControllerDBus is an implementation of #GDebugController which exposes - * debug settings as a D-Bus object. + * `GDebugControllerDBus` is an implementation of [iface@Gio.DebugController] + * which exposes debug settings as a D-Bus object. * - * It is a #GInitable object, and will register an object at + * It is a [iface@Gio.Initable] object, and will register an object at * `/org/gtk/Debugging` on the bus given as - * #GDebugControllerDBus:connection once it’s initialized. The object will be - * unregistered when the last reference to the #GDebugControllerDBus is dropped. + * [property@Gio.DebugControllerDBus:connection] once it’s initialized. The + * object will be unregistered when the last reference to the + * `GDebugControllerDBus` is dropped. * * This D-Bus object can be used by remote processes to enable or disable debug * output in this process. Remote processes calling * `org.gtk.Debugging.SetDebugEnabled()` will affect the value of - * #GDebugController:debug-enabled and, by default, g_log_get_debug_enabled(). - * default. + * [property@Gio.DebugController:debug-enabled] and, by default, + * [func@GLib.log_get_debug_enabled]. * * By default, no processes are allowed to call `SetDebugEnabled()` unless a - * #GDebugControllerDBus::authorize signal handler is installed. This is because - * the process may be privileged, or might expose sensitive information in its - * debug output. You may want to restrict the ability to enable debug output to - * privileged users or processes. + * [signal@Gio.DebugControllerDBus::authorize] signal handler is installed. This + * is because the process may be privileged, or might expose sensitive + * information in its debug output. You may want to restrict the ability to + * enable debug output to privileged users or processes. * * One option is to install a D-Bus security policy which restricts access to * `SetDebugEnabled()`, installing something like the following in * `$datadir/dbus-1/system.d/`: - * |[ + * + * ```xml * * @@ -71,7 +70,7 @@ * * * - * ]| + * ``` * * This will prevent the `SetDebugEnabled()` method from being called by all * except root. It will not prevent the `DebugEnabled` property from being read, @@ -79,9 +78,10 @@ * * Another option is to use polkit to allow or deny requests on a case-by-case * basis, allowing for the possibility of dynamic authorisation. To do this, - * connect to the #GDebugControllerDBus::authorize signal and query polkit in - * it: - * |[ + * connect to the [signal@Gio.DebugControllerDBus::authorize] signal and query + * polkit in it: + * + * ```c * g_autoptr(GError) child_error = NULL; * g_autoptr(GDBusConnection) connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, NULL); * gulong debug_controller_authorize_id = 0; @@ -142,7 +142,7 @@ * * return polkit_authorization_result_get_is_authorized (auth_result); * } - * ]| + * ``` * * Since: 2.72 */ @@ -561,8 +561,7 @@ g_debug_controller_dbus_class_init (GDebugControllerDBusClass *klass) * Since: 2.72 */ props[PROP_CONNECTION] = - g_param_spec_object ("connection", "D-Bus Connection", - "The D-Bus connection to expose the debugging interface on.", + g_param_spec_object ("connection", NULL, NULL, G_TYPE_DBUS_CONNECTION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gdebugcontrollerdbus.h b/gio/gdebugcontrollerdbus.h index c6e6c70..17e3658 100644 --- a/gio/gdebugcontrollerdbus.h +++ b/gio/gdebugcontrollerdbus.h @@ -28,13 +28,6 @@ G_BEGIN_DECLS -/** - * GDebugControllerDBus: - * - * #GDebugControllerDBus is an implementation of #GDebugController over D-Bus. - * - * Since: 2.72 - */ #define G_TYPE_DEBUG_CONTROLLER_DBUS (g_debug_controller_dbus_get_type ()) GIO_AVAILABLE_IN_2_72 G_DECLARE_DERIVABLE_TYPE (GDebugControllerDBus, g_debug_controller_dbus, G, DEBUG_CONTROLLER_DBUS, GObject) diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 1f16132..87db7a9 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -63,17 +63,14 @@ #endif /** - * SECTION:gdesktopappinfo - * @title: GDesktopAppInfo - * @short_description: Application information from desktop files - * @include: gio/gdesktopappinfo.h + * GDesktopAppInfo: * - * #GDesktopAppInfo is an implementation of #GAppInfo based on + * `GDesktopAppInfo` is an implementation of [iface@Gio.AppInfo] based on * desktop files. * * Note that `` belongs to the UNIX-specific * GIO interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config - * file when using it. + * file or the `GioUnix-2.0` GIR namespace when using it. */ #define DEFAULT_APPLICATIONS_GROUP "Default Applications" @@ -95,11 +92,6 @@ static gboolean g_desktop_app_info_ensure_saved (GDesktopAppInfo *info, GError **error); static gboolean g_desktop_app_info_load_file (GDesktopAppInfo *self); -/** - * GDesktopAppInfo: - * - * Information about an installed application from a desktop file. - */ struct _GDesktopAppInfo { GObject parent_instance; @@ -365,7 +357,7 @@ get_lowercase_current_desktops (void) { static gchar **result; - if (g_once_init_enter (&result)) + if (g_once_init_enter_pointer (&result)) { char **tmp = get_valid_current_desktops (NULL); gsize i, j; @@ -377,7 +369,7 @@ get_lowercase_current_desktops (void) tmp[i][j] = g_ascii_tolower (tmp[i][j]); } - g_once_init_leave (&result, tmp); + g_once_init_leave_pointer (&result, tmp); } return (const gchar **) result; @@ -388,11 +380,11 @@ get_current_desktops (const gchar *value) { static gchar **result; - if (g_once_init_enter (&result)) + if (g_once_init_enter_pointer (&result)) { char **tmp = get_valid_current_desktops (value); - g_once_init_leave (&result, tmp); + g_once_init_leave_pointer (&result, tmp); } return (const gchar **) result; @@ -432,7 +424,6 @@ add_to_table_if_appropriate (GHashTable *apps, enum { - DESKTOP_KEY_Comment, DESKTOP_KEY_Exec, DESKTOP_KEY_GenericName, DESKTOP_KEY_Keywords, @@ -452,13 +443,14 @@ const gchar desktop_key_match_category[N_DESKTOP_KEYS] = { [DESKTOP_KEY_Exec] = 2, [DESKTOP_KEY_Keywords] = 3, [DESKTOP_KEY_GenericName] = 4, - [DESKTOP_KEY_X_GNOME_FullName] = 5, - [DESKTOP_KEY_Comment] = 6 + [DESKTOP_KEY_X_GNOME_FullName] = 5 }; typedef enum { /* Lower numbers have higher priority. - * Prefix match should put before substring match. + * Prefix match should put before substring match, independently of + * category relevance, i.e. a prefix match in 'Keyword' category will + * come before a substring match in a more relevant category like 'Name'. */ MATCH_TYPE_PREFIX = 1, MATCH_TYPE_SUBSTRING = 2 @@ -485,8 +477,6 @@ desktop_key_get_name (guint key_id) { switch (key_id) { - case DESKTOP_KEY_Comment: - return "Comment"; case DESKTOP_KEY_Exec: return "Exec"; case DESKTOP_KEY_GenericName: @@ -576,7 +566,10 @@ compare_results (gconstpointer a, } else { - if (ra->category == rb->category) + /* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword' + * category is better than a substring match in a more relevance category like 'Name'. + */ + if (ra->match_type != rb->match_type) return ra->match_type - rb->match_type; return ra->category - rb->category; @@ -590,10 +583,10 @@ compare_categories (gconstpointer a, const struct search_result *ra = a; const struct search_result *rb = b; - /* Also compare match types so we can put prefix match in a group while - * substring match in another group. + /* We prioritize prefix matches over category relevance e.g. a prefix match in 'Keyword' + * category is better than a substring match in a more relevance category like 'Name'. */ - if (ra->category == rb->category) + if (ra->match_type != rb->match_type) return ra->match_type - rb->match_type; return ra->category - rb->category; @@ -1788,7 +1781,7 @@ g_desktop_app_info_class_init (GDesktopAppInfoClass *klass) */ g_object_class_install_property (gobject_class, PROP_FILENAME, - g_param_spec_string ("filename", "Filename", "", NULL, + g_param_spec_string ("filename", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); } @@ -3011,7 +3004,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info, g_free (program); } - if (g_once_init_enter (&gio_launch_desktop_path)) + if (g_once_init_enter_pointer (&gio_launch_desktop_path)) { const gchar *tmp = NULL; gboolean is_setuid = GLIB_PRIVATE_CALL (g_check_setuid) (); @@ -3027,7 +3020,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info, /* Fall back on usual searching in $PATH */ if (tmp == NULL) tmp = "gio-launch-desktop"; - g_once_init_leave (&gio_launch_desktop_path, tmp); + g_once_init_leave_pointer (&gio_launch_desktop_path, tmp); } wrapped_argv = g_new (char *, argc + 2); diff --git a/gio/gdrive.c b/gio/gdrive.c index 4e33d23..fbb86e5 100644 --- a/gio/gdrive.c +++ b/gio/gdrive.c @@ -31,36 +31,34 @@ /** - * SECTION:gdrive - * @short_description: Drive management - * @include: gio/gio.h + * GDrive: * - * #GDrive - this represent a piece of hardware connected to the machine. - * It's generally only created for removable hardware or hardware with + * `GDrive` represents a piece of hardware connected to the machine. + * It’s generally only created for removable hardware or hardware with * removable media. * - * #GDrive is a container class for #GVolume objects that stem from - * the same piece of media. As such, #GDrive abstracts a drive with + * `GDrive` is a container class for [iface@Gio.Volume] objects that stem from + * the same piece of media. As such, `GDrive` abstracts a drive with * (or without) removable media and provides operations for querying * whether media is available, determining whether media change is * automatically detected and ejecting the media. * - * If the #GDrive reports that media isn't automatically detected, one + * If the `GDrive` reports that media isn’t automatically detected, one * can poll for media; typically one should not do this periodically * as a poll for media operation is potentially expensive and may * spin up the drive creating noise. * - * #GDrive supports starting and stopping drives with authentication + * `GDrive` supports starting and stopping drives with authentication * support for the former. This can be used to support a diverse set * of use cases including connecting/disconnecting iSCSI devices, * powering down external disk enclosures and starting/stopping * multi-disk devices such as RAID devices. Note that the actual - * semantics and side-effects of starting/stopping a #GDrive may vary + * semantics and side-effects of starting/stopping a `GDrive` may vary * according to implementation. To choose the correct verbs in e.g. a - * file manager, use g_drive_get_start_stop_type(). + * file manager, use [method@Gio.Drive.get_start_stop_type]. * - * For porting from GnomeVFS note that there is no equivalent of - * #GDrive in that API. + * For [porting from GnomeVFS](migrating-gnome-vfs.html) note that there is no + * equivalent of `GDrive` in that API. **/ typedef GDriveIface GDriveInterface; diff --git a/gio/gdtlsclientconnection.c b/gio/gdtlsclientconnection.c index 507823c..d19105a 100644 --- a/gio/gdtlsclientconnection.c +++ b/gio/gdtlsclientconnection.c @@ -31,26 +31,14 @@ #include "gtlscertificate.h" #include "glibintl.h" -/** - * SECTION:gdtlsclientconnection - * @short_description: DTLS client-side connection - * @include: gio/gio.h - * - * #GDtlsClientConnection is the client-side subclass of - * #GDtlsConnection, representing a client-side DTLS connection. - * - * Since: 2.48 - */ - /** * GDtlsClientConnection: * - * Abstract base class for the backend-specific client connection - * type. + * `GDtlsClientConnection` is the client-side subclass of + * [iface@Gio.DtlsConnection], representing a client-side DTLS connection. * * Since: 2.48 */ - G_DEFINE_INTERFACE (GDtlsClientConnection, g_dtls_client_connection, G_TYPE_DTLS_CONNECTION) @@ -82,9 +70,7 @@ g_dtls_client_connection_default_init (GDtlsClientConnectionInterface *iface) * Deprecated: 2.74: Do not attempt to ignore validation errors. */ g_object_interface_install_property (iface, - g_param_spec_flags ("validation-flags", - P_("Validation flags"), - P_("What certificate validation to perform"), + g_param_spec_flags ("validation-flags", NULL, NULL, G_TYPE_TLS_CERTIFICATE_FLAGS, G_TLS_CERTIFICATE_VALIDATE_ALL, G_PARAM_READWRITE | @@ -112,9 +98,7 @@ g_dtls_client_connection_default_init (GDtlsClientConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("server-identity", - P_("Server identity"), - P_("GSocketConnectable identifying the server"), + g_param_spec_object ("server-identity", NULL, NULL, G_TYPE_SOCKET_CONNECTABLE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -134,9 +118,7 @@ g_dtls_client_connection_default_init (GDtlsClientConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_pointer ("accepted-cas", - P_("Accepted CAs"), - P_("Distinguished names of the CAs the server accepts certificates from"), + g_param_spec_pointer ("accepted-cas", NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gdtlsconnection.c b/gio/gdtlsconnection.c index ef96106..bca4d66 100644 --- a/gio/gdtlsconnection.c +++ b/gio/gdtlsconnection.c @@ -35,43 +35,33 @@ #include "glibintl.h" #include "gmarshal-internal.h" -/** - * SECTION:gdtlsconnection - * @short_description: DTLS connection type - * @include: gio/gio.h - * - * #GDtlsConnection is the base DTLS connection class type, which wraps - * a #GDatagramBased and provides DTLS encryption on top of it. Its - * subclasses, #GDtlsClientConnection and #GDtlsServerConnection, - * implement client-side and server-side DTLS, respectively. - * - * For TLS support, see #GTlsConnection. - * - * As DTLS is datagram based, #GDtlsConnection implements #GDatagramBased, - * presenting a datagram-socket-like API for the encrypted connection. This - * operates over a base datagram connection, which is also a #GDatagramBased - * (#GDtlsConnection:base-socket). - * - * To close a DTLS connection, use g_dtls_connection_close(). - * - * Neither #GDtlsServerConnection or #GDtlsClientConnection set the peer address - * on their base #GDatagramBased if it is a #GSocket — it is up to the caller to - * do that if they wish. If they do not, and g_socket_close() is called on the - * base socket, the #GDtlsConnection will not raise a %G_IO_ERROR_NOT_CONNECTED - * error on further I/O. - * - * Since: 2.48 - */ - /** * GDtlsConnection: * - * Abstract base class for the backend-specific #GDtlsClientConnection - * and #GDtlsServerConnection types. + * `GDtlsConnection` is the base DTLS connection class type, which wraps + * a [iface@Gio.DatagramBased] and provides DTLS encryption on top of it. Its + * subclasses, [iface@Gio.DtlsClientConnection] and + * [iface@Gio.DtlsServerConnection], implement client-side and server-side DTLS, + * respectively. + * + * For TLS support, see [class@Gio.TlsConnection]. + * + * As DTLS is datagram based, `GDtlsConnection` implements + * [iface@Gio.DatagramBased], presenting a datagram-socket-like API for the + * encrypted connection. This operates over a base datagram connection, which is + * also a `GDatagramBased` ([property@Gio.DtlsConnection:base-socket]). + * + * To close a DTLS connection, use [method@Gio.DtlsConnection.close]. + * + * Neither [iface@Gio.DtlsServerConnection] or [iface@Gio.DtlsClientConnection] + * set the peer address on their base [iface@Gio.DatagramBased] if it is a + * [class@Gio.Socket] — it is up to the caller to do that if they wish. If they + * do not, and [method@Gio.Socket.close] is called on the base socket, the + * `GDtlsConnection` will not raise a `G_IO_ERROR_NOT_CONNECTED` error on + * further I/O. * * Since: 2.48 */ - G_DEFINE_INTERFACE (GDtlsConnection, g_dtls_connection, G_TYPE_DATAGRAM_BASED) enum { @@ -106,9 +96,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("base-socket", - P_("Base Socket"), - P_("The GDatagramBased that the connection wraps"), + g_param_spec_object ("base-socket", NULL, NULL, G_TYPE_DATAGRAM_BASED, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -136,9 +124,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("database", - P_("Database"), - P_("Certificate database to use for looking up or verifying certificates"), + g_param_spec_object ("database", NULL, NULL, G_TYPE_TLS_DATABASE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -152,9 +138,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("interaction", - P_("Interaction"), - P_("Optional object for user interaction"), + g_param_spec_object ("interaction", NULL, NULL, G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -167,9 +151,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_boolean ("require-close-notify", - P_("Require close notify"), - P_("Whether to require proper TLS close notification"), + g_param_spec_boolean ("require-close-notify", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -185,9 +167,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Deprecated: 2.60: The rehandshake mode is ignored. */ g_object_interface_install_property (iface, - g_param_spec_enum ("rehandshake-mode", - P_("Rehandshake mode"), - P_("When to allow rehandshaking"), + g_param_spec_enum ("rehandshake-mode", NULL, NULL, G_TYPE_TLS_REHANDSHAKE_MODE, G_TLS_REHANDSHAKE_NEVER, G_PARAM_READWRITE | @@ -203,9 +183,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("certificate", - P_("Certificate"), - P_("The connection’s certificate"), + g_param_spec_object ("certificate", NULL, NULL, G_TYPE_TLS_CERTIFICATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -222,9 +200,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_object ("peer-certificate", - P_("Peer Certificate"), - P_("The connection’s peer’s certificate"), + g_param_spec_object ("peer-certificate", NULL, NULL, G_TYPE_TLS_CERTIFICATE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -249,9 +225,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_flags ("peer-certificate-errors", - P_("Peer Certificate Errors"), - P_("Errors found with the peer’s certificate"), + g_param_spec_flags ("peer-certificate-errors", NULL, NULL, G_TYPE_TLS_CERTIFICATE_FLAGS, 0, G_PARAM_READABLE | @@ -266,9 +240,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.60 */ g_object_interface_install_property (iface, - g_param_spec_boxed ("advertised-protocols", - P_("Advertised Protocols"), - P_("Application-layer protocols available on this connection"), + g_param_spec_boxed ("advertised-protocols", NULL, NULL, G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -281,9 +253,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.60 */ g_object_interface_install_property (iface, - g_param_spec_string ("negotiated-protocol", - P_("Negotiated Protocol"), - P_("Application-layer protocol negotiated for this connection"), + g_param_spec_string ("negotiated-protocol", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -296,9 +266,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.70 */ g_object_interface_install_property (iface, - g_param_spec_enum ("protocol-version", - P_("Protocol Version"), - P_("DTLS protocol version negotiated for this connection"), + g_param_spec_enum ("protocol-version", NULL, NULL, G_TYPE_TLS_PROTOCOL_VERSION, G_TLS_PROTOCOL_VERSION_UNKNOWN, G_PARAM_READABLE | @@ -312,9 +280,7 @@ g_dtls_connection_default_init (GDtlsConnectionInterface *iface) * Since: 2.70 */ g_object_interface_install_property (iface, - g_param_spec_string ("ciphersuite-name", - P_("Ciphersuite Name"), - P_("Name of ciphersuite negotiated for this connection"), + g_param_spec_string ("ciphersuite-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gdtlsserverconnection.c b/gio/gdtlsserverconnection.c index a524121..e123439 100644 --- a/gio/gdtlsserverconnection.c +++ b/gio/gdtlsserverconnection.c @@ -31,16 +31,13 @@ #include "glibintl.h" /** - * SECTION:gdtlsserverconnection - * @short_description: DTLS server-side connection - * @include: gio/gio.h + * GDtlsServerConnection: * - * #GDtlsServerConnection is the server-side subclass of #GDtlsConnection, - * representing a server-side DTLS connection. + * `GDtlsServerConnection` is the server-side subclass of + * [iface@Gio.DtlsConnection], representing a server-side DTLS connection. * * Since: 2.48 */ - G_DEFINE_INTERFACE (GDtlsServerConnection, g_dtls_server_connection, G_TYPE_DTLS_CONNECTION) @@ -57,9 +54,7 @@ g_dtls_server_connection_default_init (GDtlsServerConnectionInterface *iface) * Since: 2.48 */ g_object_interface_install_property (iface, - g_param_spec_enum ("authentication-mode", - P_("Authentication Mode"), - P_("The client authentication mode"), + g_param_spec_enum ("authentication-mode", NULL, NULL, G_TYPE_TLS_AUTHENTICATION_MODE, G_TLS_AUTHENTICATION_NONE, G_PARAM_READWRITE | diff --git a/gio/gdtlsserverconnection.h b/gio/gdtlsserverconnection.h index d463660..3832818 100644 --- a/gio/gdtlsserverconnection.h +++ b/gio/gdtlsserverconnection.h @@ -35,14 +35,6 @@ G_BEGIN_DECLS #define G_IS_DTLS_SERVER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_DTLS_SERVER_CONNECTION)) #define G_DTLS_SERVER_CONNECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_DTLS_SERVER_CONNECTION, GDtlsServerConnectionInterface)) -/** - * GDtlsServerConnection: - * - * DTLS server-side connection. This is the server-side implementation - * of a #GDtlsConnection. - * - * Since: 2.48 - */ typedef struct _GDtlsServerConnectionInterface GDtlsServerConnectionInterface; /** diff --git a/gio/gdummytlsbackend.c b/gio/gdummytlsbackend.c index 1ec00c9..4c69f1d 100644 --- a/gio/gdummytlsbackend.c +++ b/gio/gdummytlsbackend.c @@ -93,12 +93,12 @@ g_dummy_tls_backend_get_default_database (GTlsBackend *backend) { GDummyTlsBackend *dummy = G_DUMMY_TLS_BACKEND (backend); - if (g_once_init_enter (&dummy->database)) + if (g_once_init_enter_pointer (&dummy->database)) { GTlsDatabase *tlsdb; tlsdb = g_object_new (_g_dummy_tls_database_get_type (), NULL); - g_once_init_leave (&dummy->database, tlsdb); + g_once_init_leave_pointer (&dummy->database, tlsdb); } return g_object_ref (dummy->database); diff --git a/gio/gemblem.c b/gio/gemblem.c index af1ba00..dc03267 100644 --- a/gio/gemblem.c +++ b/gio/gemblem.c @@ -31,14 +31,11 @@ /** - * SECTION:gemblem - * @short_description: An object for emblems - * @include: gio/gio.h - * @see_also: #GIcon, #GEmblemedIcon, #GLoadableIcon, #GThemedIcon + * GEmblem: * - * #GEmblem is an implementation of #GIcon that supports + * `GEmblem` is an implementation of [iface@Gio.Icon] that supports * having an emblem, which is an icon with additional properties. - * It can than be added to a #GEmblemedIcon. + * It can than be added to a [class@Gio.EmblemedIcon]. * * Currently, only metainformation about the emblem's origin is * supported. More may be added in the future. @@ -137,20 +134,30 @@ g_emblem_class_init (GEmblemClass *klass) gobject_class->set_property = g_emblem_set_property; gobject_class->get_property = g_emblem_get_property; + /** + * GEmblem:origin: + * + * The origin the emblem is derived from. + * + * Since: 2.18 + */ g_object_class_install_property (gobject_class, PROP_ORIGIN, - g_param_spec_enum ("origin", - P_("GEmblem’s origin"), - P_("Tells which origin the emblem is derived from"), + g_param_spec_enum ("origin", NULL, NULL, G_TYPE_EMBLEM_ORIGIN, G_EMBLEM_ORIGIN_UNKNOWN, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GEmblem:icon: + * + * The actual icon of the emblem. + * + * Since: 2.18 + */ g_object_class_install_property (gobject_class, PROP_ICON, - g_param_spec_object ("icon", - P_("The icon of the emblem"), - P_("The actual icon of the emblem"), + g_param_spec_object ("icon", NULL, NULL, G_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gemblem.h b/gio/gemblem.h index eb00c3b..3fa6b61 100644 --- a/gio/gemblem.h +++ b/gio/gemblem.h @@ -37,11 +37,6 @@ G_BEGIN_DECLS #define G_IS_EMBLEM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_EMBLEM)) #define G_EMBLEM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_EMBLEM, GEmblemClass)) -/** - * GEmblem: - * - * An object for Emblems - */ typedef struct _GEmblem GEmblem; typedef struct _GEmblemClass GEmblemClass; diff --git a/gio/gemblemedicon.c b/gio/gemblemedicon.c index 8b72f12..9415c0b 100644 --- a/gio/gemblemedicon.c +++ b/gio/gemblemedicon.c @@ -33,17 +33,14 @@ /** - * SECTION:gemblemedicon - * @short_description: Icon with emblems - * @include: gio/gio.h - * @see_also: #GIcon, #GLoadableIcon, #GThemedIcon, #GEmblem + * GEmblemedIcon: * - * #GEmblemedIcon is an implementation of #GIcon that supports + * `GEmblemedIcon` is an implementation of [iface@Gio.Icon] that supports * adding an emblem to an icon. Adding multiple emblems to an - * icon is ensured via g_emblemed_icon_add_emblem(). + * icon is ensured via [method@Gio.EmblemedIcon.add_emblem]. * - * Note that #GEmblemedIcon allows no control over the position - * of the emblems. See also #GEmblem for more information. + * Note that `GEmblemedIcon` allows no control over the position + * of the emblems. See also [class@Gio.Emblem] for more information. **/ enum { @@ -126,10 +123,15 @@ g_emblemed_icon_class_init (GEmblemedIconClass *klass) gobject_class->set_property = g_emblemed_icon_set_property; gobject_class->get_property = g_emblemed_icon_get_property; + /** + * GEmblemedIcon:gicon: + * + * The [iface@Gio.Icon] to attach emblems to. + * + * Since: 2.18 + */ properties[PROP_GICON] = - g_param_spec_object ("gicon", - P_("The base GIcon"), - P_("The GIcon to attach emblems to"), + g_param_spec_object ("gicon", NULL, NULL, G_TYPE_ICON, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); diff --git a/gio/gemblemedicon.h b/gio/gemblemedicon.h index 1702b7b..7145efd 100644 --- a/gio/gemblemedicon.h +++ b/gio/gemblemedicon.h @@ -40,11 +40,6 @@ G_BEGIN_DECLS #define G_IS_EMBLEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_EMBLEMED_ICON)) #define G_EMBLEMED_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_EMBLEMED_ICON, GEmblemedIconClass)) -/** - * GEmblemedIcon: - * - * An implementation of #GIcon for icons with emblems. - **/ typedef struct _GEmblemedIcon GEmblemedIcon; typedef struct _GEmblemedIconClass GEmblemedIconClass; typedef struct _GEmblemedIconPrivate GEmblemedIconPrivate; diff --git a/gio/gfile.c b/gio/gfile.c index c7658ca..d52262f 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -86,94 +86,99 @@ typedef off_t loff_t; /** - * SECTION:gfile - * @short_description: File and Directory Handling - * @include: gio/gio.h - * @see_also: #GFileInfo, #GFileEnumerator + * GFile: * - * #GFile is a high level abstraction for manipulating files on a - * virtual file system. #GFiles are lightweight, immutable objects + * `GFile` is a high level abstraction for manipulating files on a + * virtual file system. `GFile`s are lightweight, immutable objects * that do no I/O upon creation. It is necessary to understand that - * #GFile objects do not represent files, merely an identifier for a + * `GFile` objects do not represent files, merely an identifier for a * file. All file content I/O is implemented as streaming operations - * (see #GInputStream and #GOutputStream). + * (see [class@Gio.InputStream] and [class@Gio.OutputStream]). * - * To construct a #GFile, you can use: - * - g_file_new_for_path() if you have a path. - * - g_file_new_for_uri() if you have a URI. - * - g_file_new_for_commandline_arg() for a command line argument. - * - g_file_new_tmp() to create a temporary file from a template. - * - g_file_new_tmp_async() to asynchronously create a temporary file. - * - g_file_new_tmp_dir_async() to asynchronously create a temporary directory. - * - g_file_parse_name() from a UTF-8 string gotten from g_file_get_parse_name(). - * - g_file_new_build_filename() or g_file_new_build_filenamev() to create a file from path elements. + * To construct a `GFile`, you can use: * - * One way to think of a #GFile is as an abstraction of a pathname. For + * - [func@Gio.File.new_for_path] if you have a path. + * - [func@Gio.File.new_for_uri] if you have a URI. + * - [func@Gio.File.new_for_commandline_arg] or + * [func@Gio.File.new_for_commandline_arg_and_cwd] for a command line + * argument. + * - [func@Gio.File.new_tmp] to create a temporary file from a template. + * - [func@Gio.File.new_tmp_async] to asynchronously create a temporary file. + * - [func@Gio.File.new_tmp_dir_async] to asynchronously create a temporary + * directory. + * - [func@Gio.File.parse_name] from a UTF-8 string gotten from + * [method@Gio.File.get_parse_name]. + * - [func@Gio.File.new_build_filename] or [func@Gio.File.new_build_filenamev] + * to create a file from path elements. + * + * One way to think of a `GFile` is as an abstraction of a pathname. For * normal files the system pathname is what is stored internally, but as - * #GFiles are extensible it could also be something else that corresponds + * `GFile`s are extensible it could also be something else that corresponds * to a pathname in a userspace implementation of a filesystem. * - * #GFiles make up hierarchies of directories and files that correspond to + * `GFile`s make up hierarchies of directories and files that correspond to * the files on a filesystem. You can move through the file system with - * #GFile using g_file_get_parent() to get an identifier for the parent - * directory, g_file_get_child() to get a child within a directory, - * g_file_resolve_relative_path() to resolve a relative path between two - * #GFiles. There can be multiple hierarchies, so you may not end up at - * the same root if you repeatedly call g_file_get_parent() on two different - * files. + * `GFile` using [method@Gio.File.get_parent] to get an identifier for the + * parent directory, [method@Gio.File.get_child] to get a child within a + * directory, and [method@Gio.File.resolve_relative_path] to resolve a relative + * path between two `GFile`s. There can be multiple hierarchies, so you may not + * end up at the same root if you repeatedly call [method@Gio.File.get_parent] + * on two different files. * - * All #GFiles have a basename (get with g_file_get_basename()). These names - * are byte strings that are used to identify the file on the filesystem + * All `GFile`s have a basename (get with [method@Gio.File.get_basename]). These + * names are byte strings that are used to identify the file on the filesystem * (relative to its parent directory) and there is no guarantees that they * have any particular charset encoding or even make any sense at all. If * you want to use filenames in a user interface you should use the display * name that you can get by requesting the - * %G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME attribute with g_file_query_info(). - * This is guaranteed to be in UTF-8 and can be used in a user interface. - * But always store the real basename or the #GFile to use to actually - * access the file, because there is no way to go from a display name to - * the actual name. + * `G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME` attribute with + * [method@Gio.File.query_info]. This is guaranteed to be in UTF-8 and can be + * used in a user interface. But always store the real basename or the `GFile` + * to use to actually access the file, because there is no way to go from a + * display name to the actual name. * - * Using #GFile as an identifier has the same weaknesses as using a path + * Using `GFile` as an identifier has the same weaknesses as using a path * in that there may be multiple aliases for the same file. For instance, - * hard or soft links may cause two different #GFiles to refer to the same + * hard or soft links may cause two different `GFile`s to refer to the same * file. Other possible causes for aliases are: case insensitive filesystems, * short and long names on FAT/NTFS, or bind mounts in Linux. If you want to - * check if two #GFiles point to the same file you can query for the - * %G_FILE_ATTRIBUTE_ID_FILE attribute. Note that #GFile does some trivial + * check if two `GFile`s point to the same file you can query for the + * `G_FILE_ATTRIBUTE_ID_FILE` attribute. Note that `GFile` does some trivial * canonicalization of pathnames passed in, so that trivial differences in * the path string used at creation (duplicated slashes, slash at end of - * path, "." or ".." path segments, etc) does not create different #GFiles. + * path, `.` or `..` path segments, etc) does not create different `GFile`s. * - * Many #GFile operations have both synchronous and asynchronous versions + * Many `GFile` operations have both synchronous and asynchronous versions * to suit your application. Asynchronous versions of synchronous functions - * simply have _async() appended to their function names. The asynchronous - * I/O functions call a #GAsyncReadyCallback which is then used to finalize - * the operation, producing a GAsyncResult which is then passed to the - * function's matching _finish() operation. + * simply have `_async()` appended to their function names. The asynchronous + * I/O functions call a [callback@Gio.AsyncReadyCallback] which is then used to + * finalize the operation, producing a [iface@Gio.AsyncResult] which is then + * passed to the function’s matching `_finish()` operation. * * It is highly recommended to use asynchronous calls when running within a * shared main loop, such as in the main thread of an application. This avoids * I/O operations blocking other sources on the main loop from being dispatched. * Synchronous I/O operations should be performed from worker threads. See the - * [introduction to asynchronous programming section][async-programming] for - * more. + * [introduction to asynchronous programming section](overview.html#asynchronous-programming) + * for more. * - * Some #GFile operations almost always take a noticeable amount of time, and + * Some `GFile` operations almost always take a noticeable amount of time, and * so do not have synchronous analogs. Notable cases include: - * - g_file_mount_mountable() to mount a mountable file. - * - g_file_unmount_mountable_with_operation() to unmount a mountable file. - * - g_file_eject_mountable_with_operation() to eject a mountable file. * - * ## Entity Tags # {#gfile-etag} + * - [method@Gio.File.mount_mountable] to mount a mountable file. + * - [method@Gio.File.unmount_mountable_with_operation] to unmount a mountable + * file. + * - [method@Gio.File.eject_mountable_with_operation] to eject a mountable file. * - * One notable feature of #GFiles are entity tags, or "etags" for + * ## Entity Tags + * + * One notable feature of `GFile`s are entity tags, or ‘etags’ for * short. Entity tags are somewhat like a more abstract version of the * traditional mtime, and can be used to quickly determine if the file * has been modified from the version on the file system. See the * HTTP 1.1 * [specification](http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) - * for HTTP Etag headers, which are a very similar concept. + * for HTTP `ETag` headers, which are a very similar concept. */ static void g_file_real_query_info_async (GFile *file, @@ -747,14 +752,13 @@ g_file_dup (GFile *file) } /** - * g_file_hash: + * g_file_hash: (virtual hash) * @file: (type GFile): #gconstpointer to a #GFile * * Creates a hash value for a #GFile. * * This call does no blocking I/O. * - * Virtual: hash * Returns: 0 if @file is not a valid #GFile, otherwise an * integer that can be used as hash value for the #GFile. * This function is intended for easily hashing a #GFile to @@ -939,7 +943,7 @@ g_file_get_child_for_display_name (GFile *file, } /** - * g_file_has_prefix: + * g_file_has_prefix: (virtual prefix_matches) * @file: input #GFile * @prefix: input #GFile * @@ -958,7 +962,6 @@ g_file_get_child_for_display_name (GFile *file, * filesystem point of view), because the prefix of @file is an alias * of @prefix. * - * Virtual: prefix_matches * Returns: %TRUE if the @file's parent, grandparent, etc is @prefix, * %FALSE otherwise. */ @@ -1674,7 +1677,7 @@ g_file_find_enclosing_mount_finish (GFile *file, /** - * g_file_read: + * g_file_read: (virtual read_fn) * @file: #GFile to read * @cancellable: (nullable): a #GCancellable * @error: a #GError, or %NULL @@ -1691,7 +1694,6 @@ g_file_find_enclosing_mount_finish (GFile *file, * error will be returned. Other errors are possible too, and depend * on what kind of filesystem the file is on. * - * Virtual: read_fn * Returns: (transfer full): #GFileInputStream or %NULL on error. * Free the returned object with g_object_unref(). */ @@ -1836,7 +1838,7 @@ g_file_create (GFile *file, /** * g_file_replace: * @file: input #GFile - * @etag: (nullable): an optional [entity tag][gfile-etag] + * @etag: (nullable): an optional [entity tag](#entity-tags) * for the current #GFile, or #NULL to ignore * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags @@ -2041,7 +2043,7 @@ g_file_create_readwrite (GFile *file, /** * g_file_replace_readwrite: * @file: a #GFile - * @etag: (nullable): an optional [entity tag][gfile-etag] + * @etag: (nullable): an optional [entity tag](#entity-tags) * for the current #GFile, or #NULL to ignore * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags @@ -2305,7 +2307,7 @@ g_file_create_finish (GFile *file, /** * g_file_replace_async: * @file: input #GFile - * @etag: (nullable): an [entity tag][gfile-etag] for the current #GFile, + * @etag: (nullable): an [entity tag](#entity-tags) for the current #GFile, * or %NULL to ignore * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags @@ -2529,7 +2531,7 @@ g_file_create_readwrite_finish (GFile *file, /** * g_file_replace_readwrite_async: * @file: input #GFile - * @etag: (nullable): an [entity tag][gfile-etag] for the current #GFile, + * @etag: (nullable): an [entity tag](#entity-tags) for the current #GFile, * or %NULL to ignore * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags @@ -2743,10 +2745,12 @@ open_source_for_copy (GFile *source, static gboolean should_copy (GFileAttributeInfo *info, gboolean copy_all_attributes, - gboolean skip_perms) + gboolean skip_perms, + gboolean skip_modified_time) { - if (skip_perms && strcmp(info->name, "unix::mode") == 0) - return FALSE; + if ((skip_perms && strcmp(info->name, "unix::mode") == 0) || + (skip_modified_time && strncmp(info->name, "time::modified", 14) == 0)) + return FALSE; if (copy_all_attributes) return info->flags & G_FILE_ATTRIBUTE_INFO_COPY_WHEN_MOVED; @@ -2789,6 +2793,7 @@ g_file_build_attribute_list_for_copy (GFile *file, int i; gboolean copy_all_attributes; gboolean skip_perms; + gboolean skip_modified_time; g_return_val_if_fail (G_IS_FILE (file), NULL); g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); @@ -2796,6 +2801,7 @@ g_file_build_attribute_list_for_copy (GFile *file, copy_all_attributes = flags & G_FILE_COPY_ALL_METADATA; skip_perms = (flags & G_FILE_COPY_TARGET_DEFAULT_PERMS) != 0; + skip_modified_time = (flags & G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME) != 0; /* Ignore errors here, if the target supports no attributes there is * nothing to copy. We still honor the cancellable though. @@ -2823,7 +2829,7 @@ g_file_build_attribute_list_for_copy (GFile *file, { for (i = 0; i < attributes->n_infos; i++) { - if (should_copy (&attributes->infos[i], copy_all_attributes, skip_perms)) + if (should_copy (&attributes->infos[i], copy_all_attributes, skip_perms, skip_modified_time)) { if (first) first = FALSE; @@ -2839,7 +2845,7 @@ g_file_build_attribute_list_for_copy (GFile *file, { for (i = 0; i < namespaces->n_infos; i++) { - if (should_copy (&namespaces->infos[i], copy_all_attributes, FALSE)) + if (should_copy (&namespaces->infos[i], copy_all_attributes, FALSE, FALSE)) { if (first) first = FALSE; @@ -3372,10 +3378,24 @@ file_copy_fallback (GFile *source, if (!info) goto out; + if (!g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_TYPE)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Cannot retrieve attribute %s"), G_FILE_ATTRIBUTE_STANDARD_TYPE); + goto out; + } + /* Maybe copy the symlink? */ if ((flags & G_FILE_COPY_NOFOLLOW_SYMLINKS) && g_file_info_get_file_type (info) == G_FILE_TYPE_SYMBOLIC_LINK) { + if (!g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + _("Cannot retrieve attribute %s"), G_FILE_ATTRIBUTE_STANDARD_SYMLINK_TARGET); + goto out; + } + target = g_file_info_get_symlink_target (info); if (target) { @@ -4093,7 +4113,7 @@ g_file_make_directory (GFile *file, } /** - * g_file_make_directory_async: + * g_file_make_directory_async: (virtual make_directory_async) * @file: input #GFile * @io_priority: the [I/O priority][io-priority] of the request * @cancellable: (nullable): optional #GCancellable object, @@ -4104,7 +4124,6 @@ g_file_make_directory (GFile *file, * * Asynchronously creates a directory. * - * Virtual: make_directory_async * Since: 2.38 */ void @@ -4127,7 +4146,7 @@ g_file_make_directory_async (GFile *file, } /** - * g_file_make_directory_finish: + * g_file_make_directory_finish: (virtual make_directory_finish) * @file: input #GFile * @result: a #GAsyncResult * @error: a #GError, or %NULL @@ -4135,7 +4154,6 @@ g_file_make_directory_async (GFile *file, * Finishes an asynchronous directory creation, started with * g_file_make_directory_async(). * - * Virtual: make_directory_finish * Returns: %TRUE on successful directory creation, %FALSE otherwise. * Since: 2.38 */ @@ -4367,7 +4385,7 @@ g_file_real_make_symbolic_link_async (GFile *file, } /** - * g_file_make_symbolic_link_async: + * g_file_make_symbolic_link_async: (virtual make_symbolic_link_async) * @file: a #GFile with the name of the symlink to create * @symlink_value: (type filename): a string with the path for the target * of the new symlink @@ -4381,7 +4399,6 @@ g_file_real_make_symbolic_link_async (GFile *file, * Asynchronously creates a symbolic link named @file which contains the * string @symlink_value. * - * Virtual: make_symbolic_link_async * Since: 2.74 */ void @@ -4418,7 +4435,7 @@ g_file_real_make_symbolic_link_finish (GFile *file, } /** - * g_file_make_symbolic_link_finish: + * g_file_make_symbolic_link_finish: (virtual make_symbolic_link_finish) * @file: input #GFile * @result: a #GAsyncResult * @error: a #GError, or %NULL @@ -4426,7 +4443,6 @@ g_file_real_make_symbolic_link_finish (GFile *file, * Finishes an asynchronous symbolic link creation, started with * g_file_make_symbolic_link_async(). * - * Virtual: make_symbolic_link_finish * Returns: %TRUE on successful directory creation, %FALSE otherwise. * Since: 2.74 */ @@ -4448,7 +4464,7 @@ g_file_make_symbolic_link_finish (GFile *file, } /** - * g_file_delete: + * g_file_delete: (virtual delete_file) * @file: input #GFile * @cancellable: (nullable): optional #GCancellable object, * %NULL to ignore @@ -4476,7 +4492,6 @@ g_file_make_symbolic_link_finish (GFile *file, * triggering the cancellable object from another thread. If the operation * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. * - * Virtual: delete_file * Returns: %TRUE if the file was deleted. %FALSE otherwise. */ gboolean @@ -4505,7 +4520,7 @@ g_file_delete (GFile *file, } /** - * g_file_delete_async: + * g_file_delete_async: (virtual delete_file_async) * @file: input #GFile * @io_priority: the [I/O priority][io-priority] of the request * @cancellable: (nullable): optional #GCancellable object, @@ -4518,7 +4533,6 @@ g_file_delete (GFile *file, * only be deleted if it is empty. This has the same semantics as * g_unlink(). * - * Virtual: delete_file_async * Since: 2.34 */ void @@ -4541,14 +4555,13 @@ g_file_delete_async (GFile *file, } /** - * g_file_delete_finish: + * g_file_delete_finish: (virtual delete_file_finish) * @file: input #GFile * @result: a #GAsyncResult * @error: a #GError, or %NULL * * Finishes deleting a file started with g_file_delete_async(). * - * Virtual: delete_file_finish * Returns: %TRUE if the file was deleted. %FALSE otherwise. * Since: 2.34 **/ @@ -4570,7 +4583,7 @@ g_file_delete_finish (GFile *file, } /** - * g_file_trash: + * g_file_trash: (virtual trash) * @file: #GFile to send to trash * @cancellable: (nullable): optional #GCancellable object, * %NULL to ignore @@ -4587,7 +4600,6 @@ g_file_delete_finish (GFile *file, * triggering the cancellable object from another thread. If the operation * was cancelled, the error %G_IO_ERROR_CANCELLED will be returned. * - * Virtual: trash * Returns: %TRUE on successful trash, %FALSE otherwise. */ gboolean @@ -4616,7 +4628,7 @@ g_file_trash (GFile *file, } /** - * g_file_trash_async: + * g_file_trash_async: (virtual trash_async) * @file: input #GFile * @io_priority: the [I/O priority][io-priority] of the request * @cancellable: (nullable): optional #GCancellable object, @@ -4627,7 +4639,6 @@ g_file_trash (GFile *file, * * Asynchronously sends @file to the Trash location, if possible. * - * Virtual: trash_async * Since: 2.38 */ void @@ -4650,7 +4661,7 @@ g_file_trash_async (GFile *file, } /** - * g_file_trash_finish: + * g_file_trash_finish: (virtual trash_finish) * @file: input #GFile * @result: a #GAsyncResult * @error: a #GError, or %NULL @@ -4658,7 +4669,6 @@ g_file_trash_async (GFile *file, * Finishes an asynchronous file trashing operation, started with * g_file_trash_async(). * - * Virtual: trash_finish * Returns: %TRUE on successful trash, %FALSE otherwise. * Since: 2.38 */ @@ -5794,7 +5804,7 @@ g_file_eject_mountable_with_operation_finish (GFile *file, } /** - * g_file_monitor_directory: + * g_file_monitor_directory: (virtual monitor_dir) * @file: input #GFile * @flags: a set of #GFileMonitorFlags * @cancellable: (nullable): optional #GCancellable object, @@ -5814,10 +5824,8 @@ g_file_eject_mountable_with_operation_finish (GFile *file, * directory for changes made via hard links; if you want to do this then * you must register individual watches with g_file_monitor(). * - * Virtual: monitor_dir * Returns: (transfer full): a #GFileMonitor for the given @file, - * or %NULL on error. - * Free the returned object with g_object_unref(). + * or %NULL on error. Free the returned object with g_object_unref(). */ GFileMonitor * g_file_monitor_directory (GFile *file, @@ -7727,9 +7735,9 @@ query_default_handler_query_app_info_for_type_cb (GObject *object, } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) { - g_task_return_new_error (task, - G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, - "%s", error->message); + g_task_return_new_error_literal (task, + G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, + error->message); } else { @@ -7780,10 +7788,10 @@ query_default_handler_query_info_cb (GObject *object, } else { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_NOT_SUPPORTED, - _("No application is registered as handling this file")); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_NOT_SUPPORTED, + _("No application is registered as handling this file")); } g_object_unref (info); @@ -8320,11 +8328,11 @@ g_file_load_contents_finish (GFile *file, * @file: input #GFile * @contents: (element-type guint8) (array length=length): a string containing the new contents for @file * @length: the length of @contents in bytes - * @etag: (nullable): the old [entity-tag][gfile-etag] for the document, + * @etag: (nullable): the old [entity-tag](#entity-tags) for the document, * or %NULL * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags - * @new_etag: (out) (optional) (nullable): a location to a new [entity tag][gfile-etag] + * @new_etag: (out) (optional) (nullable): a location to a new [entity tag](#entity-tags) * for the document. This should be freed with g_free() when no longer * needed, or %NULL * @cancellable: optional #GCancellable object, %NULL to ignore @@ -8527,7 +8535,7 @@ replace_contents_open_callback (GObject *obj, * @file: input #GFile * @contents: (element-type guint8) (array length=length): string of contents to replace the file with * @length: the length of @contents in bytes - * @etag: (nullable): a new [entity tag][gfile-etag] for the @file, or %NULL + * @etag: (nullable): a new [entity tag](#entity-tags) for the @file, or %NULL * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags * @cancellable: optional #GCancellable object, %NULL to ignore @@ -8577,7 +8585,7 @@ g_file_replace_contents_async (GFile *file, * g_file_replace_contents_bytes_async: * @file: input #GFile * @contents: a #GBytes - * @etag: (nullable): a new [entity tag][gfile-etag] for the @file, or %NULL + * @etag: (nullable): a new [entity tag](#entity-tags) for the @file, or %NULL * @make_backup: %TRUE if a backup should be created * @flags: a set of #GFileCreateFlags * @cancellable: optional #GCancellable object, %NULL to ignore @@ -8632,7 +8640,7 @@ g_file_replace_contents_bytes_async (GFile *file, * g_file_replace_contents_finish: * @file: input #GFile * @res: a #GAsyncResult - * @new_etag: (out) (optional) (nullable): a location of a new [entity tag][gfile-etag] + * @new_etag: (out) (optional) (nullable): a location of a new [entity tag](#entity-tags) * for the document. This should be freed with g_free() when it is no * longer needed, or %NULL * @error: a #GError, or %NULL @@ -8831,7 +8839,7 @@ g_file_real_measure_disk_usage_finish (GFile *file, * @file: a #GFile * @flags: #GFileMeasureFlags * @cancellable: (nullable): optional #GCancellable - * @progress_callback: (nullable): a #GFileMeasureProgressCallback + * @progress_callback: (nullable) (scope call): a #GFileMeasureProgressCallback * @progress_data: user_data for @progress_callback * @disk_usage: (out) (optional): the number of bytes of disk space used * @num_dirs: (out) (optional): the number of directories encountered diff --git a/gio/gfile.h b/gio/gfile.h index 7c43fe0..b45689e 100644 --- a/gio/gfile.h +++ b/gio/gfile.h @@ -36,16 +36,6 @@ G_BEGIN_DECLS #define G_IS_FILE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_FILE)) #define G_FILE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_FILE, GFileIface)) -#if 0 -/** - * GFile: - * - * A handle to an object implementing the #GFileIface interface. - * Generally stores a location within the file system. Handles do not - * necessarily represent files or directories that currently exist. - **/ -typedef struct _GFile GFile; /* Dummy typedef */ -#endif typedef struct _GFileIface GFileIface; diff --git a/gio/gfileattribute-priv.h b/gio/gfileattribute-priv.h index de5e038..59a0ed5 100644 --- a/gio/gfileattribute-priv.h +++ b/gio/gfileattribute-priv.h @@ -29,8 +29,8 @@ #define G_FILE_ATTRIBUTE_VALUE_INIT {0} typedef struct { - GFileAttributeType type : 8; - GFileAttributeStatus status : 8; + guint type : 8; /* GFileAttributeType */ + guint status : 8; /* GFileAttributeStatus */ union { gboolean boolean; gint32 int32; diff --git a/gio/gfileattribute.c b/gio/gfileattribute.c index 124eb4d..c6fde60 100644 --- a/gio/gfileattribute.c +++ b/gio/gfileattribute.c @@ -30,113 +30,6 @@ #include "glibintl.h" -/** - * SECTION:gfileattribute - * @short_description: Key-Value Paired File Attributes - * @include: gio/gio.h - * @see_also: #GFile, #GFileInfo - * - * File attributes in GIO consist of a list of key-value pairs. - * - * Keys are strings that contain a key namespace and a key name, separated - * by a colon, e.g. "namespace::keyname". Namespaces are included to sort - * key-value pairs by namespaces for relevance. Keys can be retrieved - * using wildcards, e.g. "standard::*" will return all of the keys in the - * "standard" namespace. - * - * The list of possible attributes for a filesystem (pointed to by a #GFile) is - * available as a #GFileAttributeInfoList. This list is queryable by key names - * as indicated earlier. - * - * Information is stored within the list in #GFileAttributeInfo structures. - * The info structure can store different types, listed in the enum - * #GFileAttributeType. Upon creation of a #GFileAttributeInfo, the type will - * be set to %G_FILE_ATTRIBUTE_TYPE_INVALID. - * - * Classes that implement #GFileIface will create a #GFileAttributeInfoList and - * install default keys and values for their given file system, architecture, - * and other possible implementation details (e.g., on a UNIX system, a file - * attribute key will be registered for the user id for a given file). - * - * ## Default Namespaces - * - * - `"standard"`: The "Standard" namespace. General file information that - * any application may need should be put in this namespace. Examples - * include the file's name, type, and size. - * - `"etag`: The [Entity Tag][gfile-etag] namespace. Currently, the only key - * in this namespace is "value", which contains the value of the current - * entity tag. - * - `"id"`: The "Identification" namespace. This namespace is used by file - * managers and applications that list directories to check for loops and - * to uniquely identify files. - * - `"access"`: The "Access" namespace. Used to check if a user has the - * proper privileges to access files and perform file operations. Keys in - * this namespace are made to be generic and easily understood, e.g. the - * "can_read" key is %TRUE if the current user has permission to read the - * file. UNIX permissions and NTFS ACLs in Windows should be mapped to - * these values. - * - `"mountable"`: The "Mountable" namespace. Includes simple boolean keys - * for checking if a file or path supports mount operations, e.g. mount, - * unmount, eject. These are used for files of type %G_FILE_TYPE_MOUNTABLE. - * - `"time"`: The "Time" namespace. Includes file access, changed, created - * times. - * - `"unix"`: The "Unix" namespace. Includes UNIX-specific information and - * may not be available for all files. Examples include the UNIX "UID", - * "GID", etc. - * - `"dos"`: The "DOS" namespace. Includes DOS-specific information and may - * not be available for all files. Examples include "is_system" for checking - * if a file is marked as a system file, and "is_archive" for checking if a - * file is marked as an archive file. - * - `"owner"`: The "Owner" namespace. Includes information about who owns a - * file. May not be available for all file systems. Examples include "user" - * for getting the user name of the file owner. This information is often - * mapped from some backend specific data such as a UNIX UID. - * - `"thumbnail"`: The "Thumbnail" namespace. Includes information about file - * thumbnails and their location within the file system. Examples of keys in - * this namespace include "path" to get the location of a thumbnail, "failed" - * to check if thumbnailing of the file failed, and "is-valid" to check if - * the thumbnail is outdated. - * - `"filesystem"`: The "Filesystem" namespace. Gets information about the - * file system where a file is located, such as its type, how much space is - * left available, and the overall size of the file system. - * - `"gvfs"`: The "GVFS" namespace. Keys in this namespace contain information - * about the current GVFS backend in use. - * - `"xattr"`: The "xattr" namespace. Gets information about extended - * user attributes. See attr(5). The "user." prefix of the extended user - * attribute name is stripped away when constructing keys in this namespace, - * e.g. "xattr::mime_type" for the extended attribute with the name - * "user.mime_type". Note that this information is only available if - * GLib has been built with extended attribute support. - * - `"xattr-sys"`: The "xattr-sys" namespace. Gets information about - * extended attributes which are not user-specific. See attr(5). Note - * that this information is only available if GLib has been built with - * extended attribute support. - * - `"selinux"`: The "SELinux" namespace. Includes information about the - * SELinux context of files. Note that this information is only available - * if GLib has been built with SELinux support. - * - * Please note that these are not all of the possible namespaces. - * More namespaces can be added from GIO modules or by individual applications. - * For more information about writing GIO modules, see #GIOModule. - * - * - * - * ## Default Keys - * - * For a list of the built-in keys and their types, see the - * [GFileInfo][GFileInfo] documentation. - * - * Note that there are no predefined keys in the "xattr" and "xattr-sys" - * namespaces. Keys for the "xattr" namespace are constructed by stripping - * away the "user." prefix from the extended user attribute, and prepending - * "xattr::". Keys for the "xattr-sys" namespace are constructed by - * concatenating "xattr-sys::" with the extended attribute name. All extended - * attribute values are returned as hex-encoded strings in which bytes outside - * the ASCII range are encoded as escape sequences of the form \x`nn` - * where `nn` is a 2-digit hexadecimal number. - */ - /** * _g_file_attribute_value_free: * @attr: a #GFileAttributeValue. diff --git a/gio/gfiledescriptorbased.c b/gio/gfiledescriptorbased.c index 53f55fe..8a09632 100644 --- a/gio/gfiledescriptorbased.c +++ b/gio/gfiledescriptorbased.c @@ -26,20 +26,18 @@ /** - * SECTION:gfiledescriptorbased - * @short_description: Interface for file descriptor based IO - * @include: gio/gfiledescriptorbased.h - * @see_also: #GInputStream, #GOutputStream + * GFileDescriptorBased: * - * #GFileDescriptorBased is implemented by streams (implementations of - * #GInputStream or #GOutputStream) that are based on file descriptors. + * `GFileDescriptorBased` is an interface for file descriptor based IO. + * + * It is implemented by streams (implementations of [class@Gio.InputStream] or + * [class@Gio.OutputStream]) that are based on file descriptors. * * Note that `` belongs to the UNIX-specific * GIO interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config - * file when using it. + * file or the `GioUnix-2.0` GIR namespace when using it. * * Since: 2.24 - * **/ typedef GFileDescriptorBasedIface GFileDescriptorBasedInterface; @@ -65,7 +63,7 @@ g_file_descriptor_based_get_fd (GFileDescriptorBased *fd_based) { GFileDescriptorBasedIface *iface; - g_return_val_if_fail (G_IS_FILE_DESCRIPTOR_BASED (fd_based), 0); + g_return_val_if_fail (G_IS_FILE_DESCRIPTOR_BASED (fd_based), -1); iface = G_FILE_DESCRIPTOR_BASED_GET_IFACE (fd_based); diff --git a/gio/gfiledescriptorbased.h b/gio/gfiledescriptorbased.h index 46fdbf5..7c7c78a 100644 --- a/gio/gfiledescriptorbased.h +++ b/gio/gfiledescriptorbased.h @@ -27,19 +27,15 @@ G_BEGIN_DECLS +typedef struct _GFileDescriptorBased GFileDescriptorBased; +typedef struct _GFileDescriptorBasedIface GFileDescriptorBasedIface; + #define G_TYPE_FILE_DESCRIPTOR_BASED (g_file_descriptor_based_get_type ()) #define G_FILE_DESCRIPTOR_BASED(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_FILE_DESCRIPTOR_BASED, GFileDescriptorBased)) #define G_IS_FILE_DESCRIPTOR_BASED(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_FILE_DESCRIPTOR_BASED)) #define G_FILE_DESCRIPTOR_BASED_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_FILE_DESCRIPTOR_BASED, GFileDescriptorBasedIface)) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GFileDescriptorBased, g_object_unref) -/** - * GFileDescriptorBased: - * - * An interface for file descriptor based io objects. - **/ -typedef struct _GFileDescriptorBasedIface GFileDescriptorBasedIface; - /** * GFileDescriptorBasedIface: * @g_iface: The parent interface. diff --git a/gio/gfileenumerator.c b/gio/gfileenumerator.c index ee0f563..7225379 100644 --- a/gio/gfileenumerator.c +++ b/gio/gfileenumerator.c @@ -39,23 +39,21 @@ struct _GFileEnumeratorPrivate { }; /** - * SECTION:gfileenumerator - * @short_description: Enumerated Files Routines - * @include: gio/gio.h + * GFileEnumerator: * - * #GFileEnumerator allows you to operate on a set of #GFiles, - * returning a #GFileInfo structure for each file enumerated (e.g. - * g_file_enumerate_children() will return a #GFileEnumerator for each + * `GFileEnumerator` allows you to operate on a set of [iface@Gio.File] objects, + * returning a [class@Gio.FileInfo] structure for each file enumerated (e.g. + * [method@Gio.File.enumerate_children] will return a `GFileEnumerator` for each * of the children within a directory). * - * To get the next file's information from a #GFileEnumerator, use - * g_file_enumerator_next_file() or its asynchronous version, - * g_file_enumerator_next_files_async(). Note that the asynchronous - * version will return a list of #GFileInfos, whereas the + * To get the next file's information from a `GFileEnumerator`, use + * [method@Gio.FileEnumerator.next_file] or its asynchronous version, + * [method@Gio.FileEnumerator.next_files_async]. Note that the asynchronous + * version will return a list of [class@Gio.FileInfo] objects, whereas the * synchronous will only return the next file in the enumerator. * * The ordering of returned files is unspecified for non-Unix - * platforms; for more information, see g_dir_read_name(). On Unix, + * platforms; for more information, see [method@GLib.Dir.read_name]. On Unix, * when operating on local files, returned files will be sorted by * inode number. Effectively you can assume that the ordering of * returned files will be stable between successive calls (and @@ -65,10 +63,10 @@ struct _GFileEnumeratorPrivate { * modification time, you will have to implement that in your * application code. * - * To close a #GFileEnumerator, use g_file_enumerator_close(), or - * its asynchronous version, g_file_enumerator_close_async(). Once - * a #GFileEnumerator is closed, no further actions may be performed - * on it, and it should be freed with g_object_unref(). + * To close a `GFileEnumerator`, use [method@Gio.FileEnumerator.close], or + * its asynchronous version, [method@Gio.FileEnumerator.close_async]. Once + * a `GFileEnumerator` is closed, no further actions may be performed + * on it, and it should be freed with [method@GObject.Object.unref]. * **/ @@ -159,10 +157,14 @@ g_file_enumerator_class_init (GFileEnumeratorClass *klass) klass->close_async = g_file_enumerator_real_close_async; klass->close_finish = g_file_enumerator_real_close_finish; + /** + * GFileEnumerator:container: + * + * The container that is being enumerated. + */ g_object_class_install_property (gobject_class, PROP_CONTAINER, - g_param_spec_object ("container", P_("Container"), - P_("The container that is being enumerated"), + g_param_spec_object ("container", NULL, NULL, G_TYPE_FILE, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gfileenumerator.h b/gio/gfileenumerator.h index eddb580..274d8ed 100644 --- a/gio/gfileenumerator.h +++ b/gio/gfileenumerator.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_ENUMERATOR)) #define G_FILE_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_ENUMERATOR, GFileEnumeratorClass)) -/** - * GFileEnumerator: - * - * A per matched file iterator. - **/ typedef struct _GFileEnumeratorClass GFileEnumeratorClass; typedef struct _GFileEnumeratorPrivate GFileEnumeratorPrivate; diff --git a/gio/gfileicon.c b/gio/gfileicon.c index bd727cd..d796ed4 100644 --- a/gio/gfileicon.c +++ b/gio/gfileicon.c @@ -33,15 +33,13 @@ /** - * SECTION:gfileicon - * @short_description: Icons pointing to an image file - * @include: gio/gio.h - * @see_also: #GIcon, #GLoadableIcon + * GFileIcon: * - * #GFileIcon specifies an icon by pointing to an image file + * `GFileIcon` specifies an icon by pointing to an image file * to be used as icon. * - **/ + * It implements [iface@Gio.LoadableIcon]. + */ static void g_file_icon_icon_iface_init (GIconIface *iface); static void g_file_icon_loadable_icon_iface_init (GLoadableIconIface *iface); @@ -155,9 +153,7 @@ g_file_icon_class_init (GFileIconClass *klass) * The file containing the icon. */ g_object_class_install_property (gobject_class, PROP_FILE, - g_param_spec_object ("file", - P_("file"), - P_("The file containing the icon"), + g_param_spec_object ("file", NULL, NULL, G_TYPE_FILE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); } diff --git a/gio/gfileicon.h b/gio/gfileicon.h index 230acdf..971cf0c 100644 --- a/gio/gfileicon.h +++ b/gio/gfileicon.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_ICON)) #define G_FILE_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_ICON, GFileIconClass)) -/** - * GFileIcon: - * - * Gets an icon for a #GFile. Implements #GLoadableIcon. - **/ typedef struct _GFileIconClass GFileIconClass; GIO_AVAILABLE_IN_ALL diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c index af7828e..d2bab92 100644 --- a/gio/gfileinfo.c +++ b/gio/gfileinfo.c @@ -21,45 +21,44 @@ */ /** - * SECTION:gfileinfo - * @short_description: File Information and Attributes - * @include: gio/gio.h - * @see_also: #GFile, [GFileAttribute][gio-GFileAttribute] + * GFileInfo: * - * Functionality for manipulating basic metadata for files. #GFileInfo + * Stores information about a file system object referenced by a [iface@Gio.File]. + * + * Functionality for manipulating basic metadata for files. `GFileInfo` * implements methods for getting information that all files should * contain, and allows for manipulation of extended attributes. * - * See [GFileAttribute][gio-GFileAttribute] for more information on how - * GIO handles file attributes. + * See [file-attributes.html](file attributes) for more information on how GIO + * handles file attributes. * - * To obtain a #GFileInfo for a #GFile, use g_file_query_info() (or its - * async variant). To obtain a #GFileInfo for a file input or output - * stream, use g_file_input_stream_query_info() or - * g_file_output_stream_query_info() (or their async variants). + * To obtain a `GFileInfo` for a [iface@Gio.File], use + * [method@Gio.File.query_info] (or its async variant). To obtain a `GFileInfo` + * for a file input or output stream, use [method@Gio.FileInputStream.query_info] + * or [method@Gio.FileOutputStream.query_info] (or their async variants). * * To change the actual attributes of a file, you should then set the - * attribute in the #GFileInfo and call g_file_set_attributes_from_info() - * or g_file_set_attributes_async() on a GFile. + * attribute in the `GFileInfo` and call [method@Gio.File.set_attributes_from_info] + * or [method@Gio.File.set_attributes_async] on a `GFile`. * * However, not all attributes can be changed in the file. For instance, - * the actual size of a file cannot be changed via g_file_info_set_size(). - * You may call g_file_query_settable_attributes() and - * g_file_query_writable_namespaces() to discover the settable attributes + * the actual size of a file cannot be changed via [method@Gio.FileInfo.set_size]. + * You may call [method@Gio.File.query_settable_attributes] and + * [method@Gio.File.query_writable_namespaces] to discover the settable attributes * of a particular file at runtime. * - * The direct accessors, such as g_file_info_get_name(), are slightly more + * The direct accessors, such as [method@Gio.FileInfo.get_name], are slightly more * optimized than the generic attribute accessors, such as - * g_file_info_get_attribute_byte_string().This optimization will matter + * [method@Gio.FileInfo.get_attribute_byte_string].This optimization will matter * only if calling the API in a tight loop. * * It is an error to call these accessors without specifying their required file - * attributes when creating the #GFileInfo. Use g_file_info_has_attribute() or - * g_file_info_list_attributes() to check what attributes are specified for a - * #GFileInfo. + * attributes when creating the `GFileInfo`. Use + * [method@Gio.FileInfo.has_attribute] or [method@Gio.FileInfo.list_attributes] + * to check what attributes are specified for a `GFileInfo`. * - * #GFileAttributeMatcher allows for searching through a #GFileInfo for - * attributes. + * [struct@Gio.FileAttributeMatcher] allows for searching through a `GFileInfo` + * for attributes. **/ #include "config.h" @@ -763,7 +762,7 @@ g_file_info_remove_attribute (GFileInfo *info, * * Gets the attribute type, value and status for an attribute key. * - * Returns: (transfer none): %TRUE if @info has an attribute named @attribute, + * Returns: %TRUE if @info has an attribute named @attribute, * %FALSE otherwise. */ gboolean @@ -2067,7 +2066,7 @@ g_file_info_get_symlink_target (GFileInfo *info) * g_file_info_get_etag: * @info: a #GFileInfo. * - * Gets the [entity tag][gfile-etag] for a given + * Gets the [entity tag](iface.File.html#entity-tags) for a given * #GFileInfo. See %G_FILE_ATTRIBUTE_ETAG_VALUE. * * It is an error to call this if the #GFileInfo does not contain diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h index 95207b8..6e4f02d 100644 --- a/gio/gfileinfo.h +++ b/gio/gfileinfo.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_INFO_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_INFO)) #define G_FILE_INFO_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_INFO, GFileInfoClass)) -/** - * GFileInfo: - * - * Stores information about a file system object referenced by a #GFile. - **/ typedef struct _GFileInfoClass GFileInfoClass; diff --git a/gio/gfileinputstream.c b/gio/gfileinputstream.c index a78db7e..f71beb5 100644 --- a/gio/gfileinputstream.c +++ b/gio/gfileinputstream.c @@ -33,20 +33,17 @@ /** - * SECTION:gfileinputstream - * @short_description: File input streaming operations - * @include: gio/gio.h - * @see_also: #GInputStream, #GDataInputStream, #GSeekable + * GFileInputStream: * - * GFileInputStream provides input streams that take their + * `GFileInputStream` provides input streams that take their * content from a file. * - * GFileInputStream implements #GSeekable, which allows the input + * `GFileInputStream` implements [iface@Gio.Seekable], which allows the input * stream to jump to arbitrary positions in the file, provided the * filesystem of the file allows it. To find the position of a file - * input stream, use g_seekable_tell(). To find out if a file input - * stream supports seeking, use g_seekable_can_seek(). - * To position a file input stream, use g_seekable_seek(). + * input stream, use [method@Gio.Seekable.tell]. To find out if a file input + * stream supports seeking, use [vfunc@Gio.Seekable.can_seek]. + * To position a file input stream, use [vfunc@Gio.Seekable.seek]. **/ static void g_file_input_stream_seekable_iface_init (GSeekableIface *iface); diff --git a/gio/gfileinputstream.h b/gio/gfileinputstream.h index 5462695..a122765 100644 --- a/gio/gfileinputstream.h +++ b/gio/gfileinputstream.h @@ -38,14 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_INPUT_STREAM)) #define G_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_INPUT_STREAM, GFileInputStreamClass)) -/** - * GFileInputStream: - * - * A subclass of GInputStream for opened files. This adds - * a few file-specific operations and seeking. - * - * #GFileInputStream implements #GSeekable. - **/ typedef struct _GFileInputStreamClass GFileInputStreamClass; typedef struct _GFileInputStreamPrivate GFileInputStreamPrivate; diff --git a/gio/gfileiostream.c b/gio/gfileiostream.c index ecfbf64..4a030c0 100644 --- a/gio/gfileiostream.c +++ b/gio/gfileiostream.c @@ -34,31 +34,28 @@ /** - * SECTION:gfileiostream - * @short_description: File read and write streaming operations - * @include: gio/gio.h - * @see_also: #GIOStream, #GFileInputStream, #GFileOutputStream, #GSeekable + * GFileIOStream: * - * GFileIOStream provides io streams that both read and write to the same + * `GFileIOStream` provides I/O streams that both read and write to the same * file handle. * - * GFileIOStream implements #GSeekable, which allows the io + * `GFileIOStream` implements [iface@Gio.Seekable], which allows the I/O * stream to jump to arbitrary positions in the file and to truncate * the file, provided the filesystem of the file supports these * operations. * - * To find the position of a file io stream, use - * g_seekable_tell(). + * To find the position of a file I/O stream, use [method@Gio.Seekable.tell]. * - * To find out if a file io stream supports seeking, use g_seekable_can_seek(). - * To position a file io stream, use g_seekable_seek(). - * To find out if a file io stream supports truncating, use - * g_seekable_can_truncate(). To truncate a file io - * stream, use g_seekable_truncate(). + * To find out if a file I/O stream supports seeking, use + * [method@Gio.Seekable.can_seek]. To position a file I/O stream, use + * [method@Gio.Seekable.seek]. To find out if a file I/O stream supports + * truncating, use [method@Gio.Seekable.can_truncate]. To truncate a file I/O + * stream, use [method@Gio.Seekable.truncate]. + * + * The default implementation of all the `GFileIOStream` operations + * and the implementation of [iface@Gio.Seekable] just call into the same + * operations on the output stream. * - * The default implementation of all the #GFileIOStream operations - * and the implementation of #GSeekable just call into the same operations - * on the output stream. * Since: 2.22 **/ @@ -193,7 +190,8 @@ async_ready_callback_wrapper (GObject *source_object, * g_file_io_stream_query_info_async: * @stream: a #GFileIOStream. * @attributes: a file attribute query string. - * @io_priority: the [I/O priority][gio-GIOScheduler] of the request + * @io_priority: the [I/O priority](iface.AsyncResult.html#io-priority) of the + * request * @cancellable: (nullable): optional #GCancellable object, %NULL to ignore. * @callback: (scope async): a #GAsyncReadyCallback * to call when the request is satisfied diff --git a/gio/gfileiostream.h b/gio/gfileiostream.h index c1c70c5..c516fb2 100644 --- a/gio/gfileiostream.h +++ b/gio/gfileiostream.h @@ -38,14 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_IO_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_IO_STREAM)) #define G_FILE_IO_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_IO_STREAM, GFileIOStreamClass)) -/** - * GFileIOStream: - * - * A subclass of GIOStream for opened files. This adds - * a few file-specific operations and seeking and truncating. - * - * #GFileIOStream implements GSeekable. - **/ typedef struct _GFileIOStreamClass GFileIOStreamClass; typedef struct _GFileIOStreamPrivate GFileIOStreamPrivate; diff --git a/gio/gfilemonitor.c b/gio/gfilemonitor.c index 89c2ff6..6e26c8d 100644 --- a/gio/gfilemonitor.c +++ b/gio/gfilemonitor.c @@ -31,23 +31,20 @@ #include "glibintl.h" /** - * SECTION:gfilemonitor - * @short_description: File Monitor - * @include: gio/gio.h + * GFileMonitor: * * Monitors a file or directory for changes. * - * To obtain a #GFileMonitor for a file or directory, use - * g_file_monitor(), g_file_monitor_file(), or - * g_file_monitor_directory(). + * To obtain a `GFileMonitor` for a file or directory, use + * [method@Gio.File.monitor], [method@Gio.File.monitor_file], or + * [method@Gio.File.monitor_directory]. * * To get informed about changes to the file or directory you are - * monitoring, connect to the #GFileMonitor::changed signal. The - * signal will be emitted in the - * [thread-default main context][g-main-context-push-thread-default] - * of the thread that the monitor was created in - * (though if the global default main context is blocked, this may - * cause notifications to be blocked even if the thread-default + * monitoring, connect to the [signal@Gio.FileMonitor::changed] signal. The + * signal will be emitted in the thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) of the thread that the monitor + * was created in (though if the global default main context is blocked, this + * may cause notifications to be blocked even if the thread-default * context is still running). **/ @@ -191,17 +188,23 @@ g_file_monitor_class_init (GFileMonitorClass *klass) G_TYPE_FROM_CLASS (klass), _g_cclosure_marshal_VOID__OBJECT_OBJECT_ENUMv); + /** + * GFileMonitor:rate-limit: + * + * The limit of the monitor to watch for changes, in milliseconds. + */ g_object_class_install_property (object_class, PROP_RATE_LIMIT, - g_param_spec_int ("rate-limit", - P_("Rate limit"), - P_("The limit of the monitor to watch for changes, in milliseconds"), + g_param_spec_int ("rate-limit", NULL, NULL, 0, G_MAXINT, DEFAULT_RATE_LIMIT_MSECS, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); + /** + * GFileMonitor:cancelled: + * + * Whether the monitor has been cancelled. + */ g_object_class_install_property (object_class, PROP_CANCELLED, - g_param_spec_boolean ("cancelled", - P_("Cancelled"), - P_("Whether the monitor has been cancelled"), + g_param_spec_boolean ("cancelled", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gfilemonitor.h b/gio/gfilemonitor.h index b677efc..63ab1e0 100644 --- a/gio/gfilemonitor.h +++ b/gio/gfilemonitor.h @@ -41,11 +41,6 @@ G_BEGIN_DECLS typedef struct _GFileMonitorClass GFileMonitorClass; typedef struct _GFileMonitorPrivate GFileMonitorPrivate; -/** - * GFileMonitor: - * - * Watches for changes to a file. - **/ struct _GFileMonitor { GObject parent_instance; diff --git a/gio/gfilenamecompleter.c b/gio/gfilenamecompleter.c index 4665be3..aca4249 100644 --- a/gio/gfilenamecompleter.c +++ b/gio/gfilenamecompleter.c @@ -32,15 +32,12 @@ /** - * SECTION:gfilenamecompleter - * @short_description: Filename Completer - * @include: gio/gio.h + * GFilenameCompleter: * * Completes partial file and directory names given a partial string by * looking in the file system for clues. Can return a list of possible * completion strings for widget implementations. - * - **/ + */ enum { GOT_COMPLETION_DATA, diff --git a/gio/gfilenamecompleter.h b/gio/gfilenamecompleter.h index b105e49..d835af8 100644 --- a/gio/gfilenamecompleter.h +++ b/gio/gfilenamecompleter.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILENAME_COMPLETER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILENAME_COMPLETER)) #define G_IS_FILENAME_COMPLETER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILENAME_COMPLETER)) -/** - * GFilenameCompleter: - * - * Completes filenames based on files that exist within the file system. - **/ typedef struct _GFilenameCompleterClass GFilenameCompleterClass; struct _GFilenameCompleterClass diff --git a/gio/gfileoutputstream.c b/gio/gfileoutputstream.c index d767c53..786d037 100644 --- a/gio/gfileoutputstream.c +++ b/gio/gfileoutputstream.c @@ -33,25 +33,22 @@ /** - * SECTION:gfileoutputstream - * @short_description: File output streaming operations - * @include: gio/gio.h - * @see_also: #GOutputStream, #GDataOutputStream, #GSeekable + * GFileOutputStream: * - * GFileOutputStream provides output streams that write their + * `GFileOutputStream` provides output streams that write their * content to a file. * - * GFileOutputStream implements #GSeekable, which allows the output + * `GFileOutputStream` implements [iface@Gio.Seekable], which allows the output * stream to jump to arbitrary positions in the file and to truncate * the file, provided the filesystem of the file supports these * operations. * - * To find the position of a file output stream, use g_seekable_tell(). + * To find the position of a file output stream, use [method@Gio.Seekable.tell]. * To find out if a file output stream supports seeking, use - * g_seekable_can_seek().To position a file output stream, use - * g_seekable_seek(). To find out if a file output stream supports - * truncating, use g_seekable_can_truncate(). To truncate a file output - * stream, use g_seekable_truncate(). + * [method@Gio.Seekable.can_seek].To position a file output stream, use + * [method@Gio.Seekable.seek]. To find out if a file output stream supports + * truncating, use [method@Gio.Seekable.can_truncate]. To truncate a file output + * stream, use [method@Gio.Seekable.truncate]. **/ static void g_file_output_stream_seekable_iface_init (GSeekableIface *iface); @@ -190,7 +187,8 @@ async_ready_callback_wrapper (GObject *source_object, * g_file_output_stream_query_info_async: * @stream: a #GFileOutputStream. * @attributes: a file attribute query string. - * @io_priority: the [I/O priority][gio-GIOScheduler] of the request + * @io_priority: the [I/O priority](iface.AsyncResult.html#io-priority) of the + * request * @cancellable: optional #GCancellable object, %NULL to ignore. * @callback: callback to call when the request is satisfied * @user_data: the data to pass to callback function diff --git a/gio/gfileoutputstream.h b/gio/gfileoutputstream.h index 576b21f..edc9b10 100644 --- a/gio/gfileoutputstream.h +++ b/gio/gfileoutputstream.h @@ -38,14 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_OUTPUT_STREAM)) #define G_FILE_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStreamClass)) -/** - * GFileOutputStream: - * - * A subclass of GOutputStream for opened files. This adds - * a few file-specific operations and seeking and truncating. - * - * #GFileOutputStream implements GSeekable. - **/ typedef struct _GFileOutputStreamClass GFileOutputStreamClass; typedef struct _GFileOutputStreamPrivate GFileOutputStreamPrivate; diff --git a/gio/gfilterinputstream.c b/gio/gfilterinputstream.c index 46cb0ef..04ec541 100644 --- a/gio/gfilterinputstream.c +++ b/gio/gfilterinputstream.c @@ -27,9 +27,7 @@ /** - * SECTION:gfilterinputstream - * @short_description: Filter Input Stream - * @include: gio/gio.h + * GFilterInputStream: * * Base class for input stream implementations that perform some * kind of filtering operation on a base stream. Typical examples @@ -91,20 +89,26 @@ g_filter_input_stream_class_init (GFilterInputStreamClass *klass) istream_class->skip = g_filter_input_stream_skip; istream_class->close_fn = g_filter_input_stream_close; + /** + * GFilterInputStream:base-stream: + * + * The underlying base stream on which the I/O ops will be done. + */ g_object_class_install_property (object_class, PROP_BASE_STREAM, - g_param_spec_object ("base-stream", - P_("The Filter Base Stream"), - P_("The underlying base stream on which the io ops will be done."), + g_param_spec_object ("base-stream", NULL, NULL, G_TYPE_INPUT_STREAM, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + /** + * GFilterInputStream:close-base-stream: + * + * Whether the base stream should be closed when the filter stream is closed. + */ g_object_class_install_property (object_class, PROP_CLOSE_BASE, - g_param_spec_boolean ("close-base-stream", - P_("Close Base Stream"), - P_("If the base stream should be closed when the filter stream is closed."), + g_param_spec_boolean ("close-base-stream", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); } diff --git a/gio/gfilterinputstream.h b/gio/gfilterinputstream.h index df6032c..6009eea 100644 --- a/gio/gfilterinputstream.h +++ b/gio/gfilterinputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILTER_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILTER_INPUT_STREAM)) #define G_FILTER_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILTER_INPUT_STREAM, GFilterInputStreamClass)) -/** - * GFilterInputStream: - * - * A base class for all input streams that work on an underlying stream. - **/ typedef struct _GFilterInputStreamClass GFilterInputStreamClass; struct _GFilterInputStream diff --git a/gio/gfilteroutputstream.c b/gio/gfilteroutputstream.c index 637f448..074b8ce 100644 --- a/gio/gfilteroutputstream.c +++ b/gio/gfilteroutputstream.c @@ -27,9 +27,7 @@ /** - * SECTION:gfilteroutputstream - * @short_description: Filter Output Stream - * @include: gio/gio.h + * GFilterOutputStream: * * Base class for output stream implementations that perform some * kind of filtering operation on a base stream. Typical examples @@ -90,20 +88,26 @@ g_filter_output_stream_class_init (GFilterOutputStreamClass *klass) ostream_class->flush = g_filter_output_stream_flush; ostream_class->close_fn = g_filter_output_stream_close; + /** + * GFilterOutputStream:close-base-stream: + * + * The underlying base stream on which the I/O ops will be done. + */ g_object_class_install_property (object_class, PROP_BASE_STREAM, - g_param_spec_object ("base-stream", - P_("The Filter Base Stream"), - P_("The underlying base stream on which the io ops will be done."), + g_param_spec_object ("base-stream", NULL, NULL, G_TYPE_OUTPUT_STREAM, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); + /** + * GFilterOutputStream:close-base-stream: + * + * Whether the base stream should be closed when the filter stream is closed. + */ g_object_class_install_property (object_class, PROP_CLOSE_BASE, - g_param_spec_boolean ("close-base-stream", - P_("Close Base Stream"), - P_("If the base stream should be closed when the filter stream is closed."), + g_param_spec_boolean ("close-base-stream", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); } diff --git a/gio/gfilteroutputstream.h b/gio/gfilteroutputstream.h index 472f9d8..160e80d 100644 --- a/gio/gfilteroutputstream.h +++ b/gio/gfilteroutputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_FILTER_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILTER_OUTPUT_STREAM)) #define G_FILTER_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILTER_OUTPUT_STREAM, GFilterOutputStreamClass)) -/** - * GFilterOutputStream: - * - * A base class for all output streams that work on an underlying stream. - **/ typedef struct _GFilterOutputStreamClass GFilterOutputStreamClass; struct _GFilterOutputStream diff --git a/gio/gicon.c b/gio/gicon.c index cd69922..cf8f12d 100644 --- a/gio/gicon.c +++ b/gio/gicon.c @@ -41,38 +41,38 @@ #define G_ICON_SERIALIZATION_MAGIC0 ". " /** - * SECTION:gicon - * @short_description: Interface for icons - * @include: gio/gio.h + * GIcon: * - * #GIcon is a very minimal interface for icons. It provides functions + * `GIcon` is a very minimal interface for icons. It provides functions * for checking the equality of two icons, hashing of icons and * serializing an icon to and from strings. * - * #GIcon does not provide the actual pixmap for the icon as this is out - * of GIO's scope, however implementations of #GIcon may contain the name - * of an icon (see #GThemedIcon), or the path to an icon (see #GLoadableIcon). + * `GIcon` does not provide the actual pixmap for the icon as this is out + * of GIO's scope, however implementations of `GIcon` may contain the name + * of an icon (see [class@Gio.ThemedIcon]), or the path to an icon + * (see [iface@Gio.LoadableIcon]). * - * To obtain a hash of a #GIcon, see g_icon_hash(). + * To obtain a hash of a `GIcon`, see [method@Gio.Icon.hash]. * - * To check if two #GIcons are equal, see g_icon_equal(). + * To check if two `GIcon`s are equal, see [method@Gio.Icon.equal]. * - * For serializing a #GIcon, use g_icon_serialize() and - * g_icon_deserialize(). + * For serializing a `GIcon`, use [method@Gio.Icon.serialize] and + * [func@Gio.Icon.deserialize]. * - * If you want to consume #GIcon (for example, in a toolkit) you must + * If you want to consume `GIcon` (for example, in a toolkit) you must * be prepared to handle at least the three following cases: - * #GLoadableIcon, #GThemedIcon and #GEmblemedIcon. It may also make - * sense to have fast-paths for other cases (like handling #GdkPixbuf - * directly, for example) but all compliant #GIcon implementations - * outside of GIO must implement #GLoadableIcon. + * [iface@Gio.LoadableIcon], [class@Gio.ThemedIcon] and [class@Gio.EmblemedIcon]. + * It may also make sense to have fast-paths for other cases (like handling + * [`GdkPixbuf`](https://docs.gtk.org/gdk-pixbuf/class.Pixbuf.html) directly, + * for example) but all compliant `GIcon` implementations outside of GIO must + * implement [iface@Gio.LoadableIcon]. * - * If your application or library provides one or more #GIcon + * If your application or library provides one or more `GIcon` * implementations you need to ensure that your new implementation also - * implements #GLoadableIcon. Additionally, you must provide an - * implementation of g_icon_serialize() that gives a result that is - * understood by g_icon_deserialize(), yielding one of the built-in icon - * types. + * implements [iface@Gio.LoadableIcon]. Additionally, you must provide an + * implementation of [method@Gio.Icon.serialize] that gives a result that is + * understood by [func@Gio.Icon.deserialize], yielding one of the built-in + * icon types. **/ typedef GIconIface GIconInterface; @@ -84,14 +84,13 @@ g_icon_default_init (GIconInterface *iface) } /** - * g_icon_hash: + * g_icon_hash: (virtual hash) * @icon: (not nullable) (type Gio.Icon): #gconstpointer to an icon object. * * Gets a hash for an icon. * - * Virtual: hash * Returns: a #guint containing a hash for the @icon, suitable for - * use in a #GHashTable or similar data structure. + * use in a #GHashTable or similar data structure. **/ guint g_icon_hash (gconstpointer icon) diff --git a/gio/gicon.h b/gio/gicon.h index c971cb0..d6dd5fe 100644 --- a/gio/gicon.h +++ b/gio/gicon.h @@ -36,11 +36,6 @@ G_BEGIN_DECLS #define G_IS_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_ICON)) #define G_ICON_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_ICON, GIconIface)) -/** - * GIcon: - * - * An abstract type that specifies an icon. - **/ typedef struct _GIconIface GIconIface; /** diff --git a/gio/ginetaddress.c b/gio/ginetaddress.c index 66d8897..c0ba250 100644 --- a/gio/ginetaddress.c +++ b/gio/ginetaddress.c @@ -44,27 +44,19 @@ struct _GInetAddressPrivate } addr; }; -/** - * SECTION:ginetaddress - * @short_description: An IPv4/IPv6 address - * @include: gio/gio.h - * - * #GInetAddress represents an IPv4 or IPv6 internet address. Use - * g_resolver_lookup_by_name() or g_resolver_lookup_by_name_async() to - * look up the #GInetAddress for a hostname. Use - * g_resolver_lookup_by_address() or - * g_resolver_lookup_by_address_async() to look up the hostname for a - * #GInetAddress. - * - * To actually connect to a remote host, you will need a - * #GInetSocketAddress (which includes a #GInetAddress as well as a - * port number). - */ - /** * GInetAddress: * - * An IPv4 or IPv6 internet address. + * `GInetAddress` represents an IPv4 or IPv6 internet address. Use + * [method@Gio.Resolver.lookup_by_name] or + * [method@Gio.Resolver.lookup_by_name_async] to look up the `GInetAddress` for + * a hostname. Use [method@Gio.Resolver.lookup_by_address] or + * [method@Gio.Resolver.lookup_by_address_async] to look up the hostname for a + * `GInetAddress`. + * + * To actually connect to a remote host, you will need a + * [class@Gio.InetSocketAddress] (which includes a `GInetAddress` as well as a + * port number). */ G_DEFINE_TYPE_WITH_CODE (GInetAddress, g_inet_address, G_TYPE_OBJECT, @@ -193,20 +185,30 @@ g_inet_address_class_init (GInetAddressClass *klass) gobject_class->set_property = g_inet_address_set_property; gobject_class->get_property = g_inet_address_get_property; + /** + * GInetAddress:family: + * + * The address family (IPv4 or IPv6). + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_FAMILY, - g_param_spec_enum ("family", - P_("Address family"), - P_("The address family (IPv4 or IPv6)"), + g_param_spec_enum ("family", NULL, NULL, G_TYPE_SOCKET_FAMILY, G_SOCKET_FAMILY_INVALID, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GInetAddress:bytes: + * + * The raw address data. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_BYTES, - g_param_spec_pointer ("bytes", - P_("Bytes"), - P_("The raw address data"), + g_param_spec_pointer ("bytes", NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -220,9 +222,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_ANY, - g_param_spec_boolean ("is-any", - P_("Is any"), - P_("Whether this is the \"any\" address for its family"), + g_param_spec_boolean ("is-any", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -236,9 +236,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_LINK_LOCAL, - g_param_spec_boolean ("is-link-local", - P_("Is link-local"), - P_("Whether this is a link-local address"), + g_param_spec_boolean ("is-link-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -252,9 +250,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_LOOPBACK, - g_param_spec_boolean ("is-loopback", - P_("Is loopback"), - P_("Whether this is the loopback address for its family"), + g_param_spec_boolean ("is-loopback", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -268,9 +264,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_SITE_LOCAL, - g_param_spec_boolean ("is-site-local", - P_("Is site-local"), - P_("Whether this is a site-local address"), + g_param_spec_boolean ("is-site-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -284,9 +278,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MULTICAST, - g_param_spec_boolean ("is-multicast", - P_("Is multicast"), - P_("Whether this is a multicast address"), + g_param_spec_boolean ("is-multicast", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -300,9 +292,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MC_GLOBAL, - g_param_spec_boolean ("is-mc-global", - P_("Is multicast global"), - P_("Whether this is a global multicast address"), + g_param_spec_boolean ("is-mc-global", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -317,9 +307,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MC_LINK_LOCAL, - g_param_spec_boolean ("is-mc-link-local", - P_("Is multicast link-local"), - P_("Whether this is a link-local multicast address"), + g_param_spec_boolean ("is-mc-link-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -333,9 +321,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MC_NODE_LOCAL, - g_param_spec_boolean ("is-mc-node-local", - P_("Is multicast node-local"), - P_("Whether this is a node-local multicast address"), + g_param_spec_boolean ("is-mc-node-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -349,9 +335,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MC_ORG_LOCAL, - g_param_spec_boolean ("is-mc-org-local", - P_("Is multicast org-local"), - P_("Whether this is an organization-local multicast address"), + g_param_spec_boolean ("is-mc-org-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -365,9 +349,7 @@ g_inet_address_class_init (GInetAddressClass *klass) * Since: 2.22 */ g_object_class_install_property (gobject_class, PROP_IS_MC_SITE_LOCAL, - g_param_spec_boolean ("is-mc-site-local", - P_("Is multicast site-local"), - P_("Whether this is a site-local multicast address"), + g_param_spec_boolean ("is-mc-site-local", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/ginetaddressmask.c b/gio/ginetaddressmask.c index c0704db..1431b94 100644 --- a/gio/ginetaddressmask.c +++ b/gio/ginetaddressmask.c @@ -30,22 +30,13 @@ #include "gioenumtypes.h" #include "glibintl.h" -/** - * SECTION:ginetaddressmask - * @short_description: An IPv4/IPv6 address mask - * @include: gio/gio.h - * - * #GInetAddressMask represents a range of IPv4 or IPv6 addresses - * described by a base address and a length indicating how many bits - * of the base address are relevant for matching purposes. These are - * often given in string form. Eg, "10.0.0.0/8", or "fe80::/10". - */ - /** * GInetAddressMask: * - * A combination of an IPv4 or IPv6 base address and a length, - * representing a range of IP addresses. + * `GInetAddressMask` represents a range of IPv4 or IPv6 addresses + * described by a base address and a length indicating how many bits + * of the base address are relevant for matching purposes. These are + * often given in string form. For example, `10.0.0.0/8`, or `fe80::/10`. * * Since: 2.32 */ @@ -144,25 +135,42 @@ g_inet_address_mask_class_init (GInetAddressMaskClass *klass) gobject_class->get_property = g_inet_address_mask_get_property; gobject_class->dispose = g_inet_address_mask_dispose; + /** + * GInetAddressMask:family: + * + * The address family (IPv4 or IPv6). + * + * Since: 2.32 + */ g_object_class_install_property (gobject_class, PROP_FAMILY, - g_param_spec_enum ("family", - P_("Address family"), - P_("The address family (IPv4 or IPv6)"), + g_param_spec_enum ("family", NULL, NULL, G_TYPE_SOCKET_FAMILY, G_SOCKET_FAMILY_INVALID, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddressMask:address: + * + * The base address. + * + * Since: 2.32 + */ g_object_class_install_property (gobject_class, PROP_ADDRESS, - g_param_spec_object ("address", - P_("Address"), - P_("The base address"), + g_param_spec_object ("address", NULL, NULL, G_TYPE_INET_ADDRESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + /** + * GInetAddressMask:length: + * + * The prefix length, in bytes. + * + * Since: 2.32 + */ g_object_class_install_property (gobject_class, PROP_LENGTH, - g_param_spec_uint ("length", - P_("Length"), - P_("The prefix length"), + g_param_spec_uint ("length", NULL, NULL, 0, 128, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/ginetsocketaddress.c b/gio/ginetsocketaddress.c index 7693035..c17bd14 100644 --- a/gio/ginetsocketaddress.c +++ b/gio/ginetsocketaddress.c @@ -33,20 +33,14 @@ #include "glibintl.h" -/** - * SECTION:ginetsocketaddress - * @short_description: Internet GSocketAddress - * @include: gio/gio.h - * - * An IPv4 or IPv6 socket address; that is, the combination of a - * #GInetAddress and a port number. - */ - /** * GInetSocketAddress: * - * An IPv4 or IPv6 socket address, corresponding to a struct - * sockaddr_in or struct sockaddr_in6. + * An IPv4 or IPv6 socket address. That is, the combination of a + * [class@Gio.InetAddress] and a port number. + * + * In UNIX terms, `GInetSocketAddress` corresponds to a + * [`struct sockaddr_in` or `struct sockaddr_in6`](man:sockaddr(3type)). */ struct _GInetSocketAddressPrivate @@ -253,19 +247,29 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass) gsocketaddress_class->to_native = g_inet_socket_address_to_native; gsocketaddress_class->get_native_size = g_inet_socket_address_get_native_size; + /** + * GInetSocketAddress:address: + * + * The address. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_ADDRESS, - g_param_spec_object ("address", - P_("Address"), - P_("The address"), + g_param_spec_object ("address", NULL, NULL, G_TYPE_INET_ADDRESS, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GInetSocketAddress:port: + * + * The port. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PORT, - g_param_spec_uint ("port", - P_("Port"), - P_("The port"), + g_param_spec_uint ("port", NULL, NULL, 0, 65535, 0, @@ -281,9 +285,7 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass) * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_FLOWINFO, - g_param_spec_uint ("flowinfo", - P_("Flow info"), - P_("IPv6 flow info"), + g_param_spec_uint ("flowinfo", NULL, NULL, 0, G_MAXUINT32, 0, @@ -292,16 +294,14 @@ g_inet_socket_address_class_init (GInetSocketAddressClass *klass) G_PARAM_STATIC_STRINGS)); /** - * GInetSocketAddress:scope_id: + * GInetSocketAddress:scope-id: * * The `sin6_scope_id` field, for IPv6 addresses. * * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_SCOPE_ID, - g_param_spec_uint ("scope-id", - P_("Scope ID"), - P_("IPv6 scope ID"), + g_param_spec_uint ("scope-id", NULL, NULL, 0, G_MAXUINT32, 0, @@ -421,13 +421,13 @@ g_inet_socket_address_new_from_string (const char *address, * it will handle parsing a scope_id as well. */ - if (G_UNLIKELY (g_once_init_enter (&hints))) + if (G_UNLIKELY (g_once_init_enter_pointer (&hints))) { hints_struct.ai_family = AF_UNSPEC; hints_struct.ai_socktype = SOCK_STREAM; hints_struct.ai_protocol = 0; hints_struct.ai_flags = AI_NUMERICHOST; - g_once_init_leave (&hints, &hints_struct); + g_once_init_leave_pointer (&hints, &hints_struct); } status = getaddrinfo (address, NULL, hints, &res); diff --git a/gio/ginitable.c b/gio/ginitable.c index ef836e4..6dd09a9 100644 --- a/gio/ginitable.c +++ b/gio/ginitable.c @@ -26,35 +26,34 @@ /** - * SECTION:ginitable - * @short_description: Failable object initialization interface - * @include: gio/gio.h - * @see_also: #GAsyncInitable + * GInitable: * - * #GInitable is implemented by objects that can fail during + * `GInitable` is implemented by objects that can fail during * initialization. If an object implements this interface then * it must be initialized as the first thing after construction, - * either via g_initable_init() or g_async_initable_init_async() - * (the latter is only available if it also implements #GAsyncInitable). + * either via [method@Gio.Initable.init] or [method@Gio.AsyncInitable.init_async] + * (the latter is only available if it also implements [iface@Gio.AsyncInitable]). * * If the object is not initialized, or initialization returns with an - * error, then all operations on the object except g_object_ref() and - * g_object_unref() are considered to be invalid, and have undefined - * behaviour. They will often fail with g_critical() or g_warning(), but - * this must not be relied on. + * error, then all operations on the object except `g_object_ref()` and + * `g_object_unref()` are considered to be invalid, and have undefined + * behaviour. They will often fail with [func@GLib.critical] or + * [func@GLib.warning], but this must not be relied on. * * Users of objects implementing this are not intended to use * the interface method directly, instead it will be used automatically * in various ways. For C applications you generally just call - * g_initable_new() directly, or indirectly via a foo_thing_new() wrapper. - * This will call g_initable_init() under the cover, returning %NULL and - * setting a #GError on failure (at which point the instance is + * [func@Gio.Initable.new] directly, or indirectly via a `foo_thing_new()` wrapper. + * This will call [method@Gio.Initable.init] under the cover, returning `NULL` + * and setting a `GError` on failure (at which point the instance is * unreferenced). * * For bindings in languages where the native constructor supports - * exceptions the binding could check for objects implementing %GInitable + * exceptions the binding could check for objects implementing `GInitable` * during normal construction and automatically initialize them, throwing * an exception on failure. + * + * Since: 2.22 */ typedef GInitableIface GInitableInterface; diff --git a/gio/ginitable.h b/gio/ginitable.h index 9eb995c..5eee369 100644 --- a/gio/ginitable.h +++ b/gio/ginitable.h @@ -37,13 +37,6 @@ G_BEGIN_DECLS #define G_INITABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_INITABLE, GInitableIface)) #define G_TYPE_IS_INITABLE(type) (g_type_is_a ((type), G_TYPE_INITABLE)) -/** - * GInitable: - * - * Interface for initializable objects. - * - * Since: 2.22 - **/ typedef struct _GInitableIface GInitableIface; /** diff --git a/gio/ginputstream.c b/gio/ginputstream.c index e1da5fa..1f27bcf 100644 --- a/gio/ginputstream.c +++ b/gio/ginputstream.c @@ -33,19 +33,19 @@ #include "gpollableinputstream.h" /** - * SECTION:ginputstream - * @short_description: Base class for implementing streaming input - * @include: gio/gio.h + * GInputStream: * - * #GInputStream has functions to read from a stream (g_input_stream_read()), - * to close a stream (g_input_stream_close()) and to skip some content - * (g_input_stream_skip()). + * `GInputStream` is a base class for implementing streaming input. + * + * It has functions to read from a stream ([method@Gio.InputStream.read]), + * to close a stream ([method@Gio.InputStream.close]) and to skip some content + * ([method@Gio.InputStream.skip]). * * To copy the content of an input stream to an output stream without - * manually handling the reads and writes, use g_output_stream_splice(). + * manually handling the reads and writes, use [method@Gio.OutputStream.splice]. * - * See the documentation for #GIOStream for details of thread safety of - * streaming APIs. + * See the documentation for [class@Gio.IOStream] for details of thread safety + * of streaming APIs. * * All of these functions have async variants too. **/ diff --git a/gio/ginputstream.h b/gio/ginputstream.h index a7be768..f5cce17 100644 --- a/gio/ginputstream.h +++ b/gio/ginputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_INPUT_STREAM)) #define G_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_INPUT_STREAM, GInputStreamClass)) -/** - * GInputStream: - * - * Base class for streaming input operations. - **/ typedef struct _GInputStreamClass GInputStreamClass; typedef struct _GInputStreamPrivate GInputStreamPrivate; diff --git a/gio/gio-autocleanups.h b/gio/gio-autocleanups.h index 15e37d1..315288e 100644 --- a/gio/gio-autocleanups.h +++ b/gio/gio-autocleanups.h @@ -23,6 +23,8 @@ #error "Only can be included directly." #endif +#ifndef __GI_SCANNER__ + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAction, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GActionMap, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GAppInfo, g_object_unref) @@ -153,3 +155,5 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVolume, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVolumeMonitor, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GZlibCompressor, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GZlibDecompressor, g_object_unref) + +#endif /* __GI_SCANNER__ */ diff --git a/gio/gio-tool-copy.c b/gio/gio-tool-copy.c index 4a1dc43..1b7ab48 100644 --- a/gio/gio-tool-copy.c +++ b/gio/gio-tool-copy.c @@ -40,6 +40,7 @@ static gboolean preserve = FALSE; static gboolean backup = FALSE; static gboolean no_dereference = FALSE; static gboolean default_permissions = FALSE; +static gboolean default_modified_time = FALSE; static const GOptionEntry entries[] = { { "no-target-directory", 'T', 0, G_OPTION_ARG_NONE, &no_target_directory, N_("No target directory"), NULL }, @@ -49,6 +50,7 @@ static const GOptionEntry entries[] = { { "backup", 'b', 0, G_OPTION_ARG_NONE, &backup, N_("Backup existing destination files"), NULL }, { "no-dereference", 'P', 0, G_OPTION_ARG_NONE, &no_dereference, N_("Never follow symbolic links"), NULL }, { "default-permissions", 0, 0, G_OPTION_ARG_NONE, &default_permissions, N_("Use default permissions for the destination"), NULL }, + { "default-modified-time", 0, 0, G_OPTION_ARG_NONE, &default_modified_time, N_("Use default file modification timestamps for the destination"), NULL }, G_OPTION_ENTRY_NULL }; @@ -181,6 +183,8 @@ handle_copy (int argc, char *argv[], gboolean do_help) flags |= G_FILE_COPY_ALL_METADATA; if (default_permissions) flags |= G_FILE_COPY_TARGET_DEFAULT_PERMS; + if (default_modified_time) + flags |= G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME; error = NULL; start_time = g_get_monotonic_time (); diff --git a/gio/gio-tool-info.c b/gio/gio-tool-info.c index dbdc6b6..a773d8d 100644 --- a/gio/gio-tool-info.c +++ b/gio/gio-tool-info.c @@ -177,7 +177,8 @@ show_info (GFile *file, GFileInfo *info) g_free (flatten); } - name = g_file_info_get_name (info); + name = g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_NAME) ? + g_file_info_get_name (info) : NULL; if (name) { escaped = escape_string (name); diff --git a/gio/gio-tool.c b/gio/gio-tool.c index a970109..6315b48 100644 --- a/gio/gio-tool.c +++ b/gio/gio-tool.c @@ -219,35 +219,67 @@ handle_version (int argc, char *argv[], gboolean do_help) return 0; } -static void -usage (void) +typedef int (*HandleSubcommand) (int argc, char *argv[], gboolean do_help); + +static const struct { - g_printerr ("%s\n", _("Usage:")); - g_printerr (" gio %s %s\n", _("COMMAND"), _("[ARGS…]")); - g_printerr ("\n"); - g_printerr ("%s\n", _("Commands:")); - g_printerr (" help %s\n", _("Print help")); - g_printerr (" version %s\n", _("Print version")); - g_printerr (" cat %s\n", _("Concatenate files to standard output")); - g_printerr (" copy %s\n", _("Copy one or more files")); - g_printerr (" info %s\n", _("Show information about locations")); - g_printerr (" launch %s\n", _("Launch an application from a desktop file")); - g_printerr (" list %s\n", _("List the contents of locations")); - g_printerr (" mime %s\n", _("Get or set the handler for a mimetype")); - g_printerr (" mkdir %s\n", _("Create directories")); - g_printerr (" monitor %s\n", _("Monitor files and directories for changes")); - g_printerr (" mount %s\n", _("Mount or unmount the locations")); - g_printerr (" move %s\n", _("Move one or more files")); - g_printerr (" open %s\n", _("Open files with the default application")); - g_printerr (" rename %s\n", _("Rename a file")); - g_printerr (" remove %s\n", _("Delete one or more files")); - g_printerr (" save %s\n", _("Read from standard input and save")); - g_printerr (" set %s\n", _("Set a file attribute")); - g_printerr (" trash %s\n", _("Move files or directories to the trash")); - g_printerr (" tree %s\n", _("Lists the contents of locations in a tree")); - g_printerr ("\n"); - g_printerr (_("Use %s to get detailed help.\n"), "“gio help COMMAND”"); - exit (1); + const char *name; /* as used on the command line */ + HandleSubcommand handle_func; /* (nullable) for "help" only */ + const char *description; /* translatable */ +} gio_subcommands[] = { + { "help", NULL, N_("Print help") }, + { "version", handle_version, N_("Print version") }, + { "cat", handle_cat, N_("Concatenate files to standard output") }, + { "copy", handle_copy, N_("Copy one or more files") }, + { "info", handle_info, N_("Show information about locations") }, + { "launch", handle_launch, N_("Launch an application from a desktop file") }, + { "list", handle_list, N_("List the contents of locations") }, + { "mime", handle_mime, N_("Get or set the handler for a mimetype") }, + { "mkdir", handle_mkdir, N_("Create directories") }, + { "monitor", handle_monitor, N_("Monitor files and directories for changes") }, + { "mount", handle_mount, N_("Mount or unmount the locations") }, + { "move", handle_move, N_("Move one or more files") }, + { "open", handle_open, N_("Open files with the default application") }, + { "rename", handle_rename, N_("Rename a file") }, + { "remove", handle_remove, N_("Delete one or more files") }, + { "save", handle_save, N_("Read from standard input and save") }, + { "set", handle_set, N_("Set a file attribute") }, + { "trash", handle_trash, N_("Move files or directories to the trash") }, + { "tree", handle_tree, N_("Lists the contents of locations in a tree") }, +}; + +static void +usage (gboolean is_error) +{ + GString *out = NULL; + size_t name_width = 0; + + out = g_string_new (""); + g_string_append_printf (out, "%s\n", _("Usage:")); + g_string_append_printf (out, " gio %s %s\n", _("COMMAND"), _("[ARGS…]")); + g_string_append_c (out, '\n'); + g_string_append_printf (out, "%s\n", _("Commands:")); + + /* Work out the maximum name length for column alignment. */ + for (size_t i = 0; i < G_N_ELEMENTS (gio_subcommands); i++) + name_width = MAX (name_width, strlen (gio_subcommands[i].name)); + + for (size_t i = 0; i < G_N_ELEMENTS (gio_subcommands); i++) + { + g_string_append_printf (out, " %-*s %s\n", + (int) name_width, gio_subcommands[i].name, + _(gio_subcommands[i].description)); + } + + g_string_append_c (out, '\n'); + g_string_append_printf (out, _("Use %s to get detailed help.\n"), "“gio help COMMAND”"); + + if (is_error) + g_printerr ("%s", out->str); + else + g_print ("%s", out->str); + + g_string_free (out, TRUE); } int @@ -277,7 +309,7 @@ main (int argc, char **argv) if (argc < 2) { - usage (); + usage (TRUE); return 1; } @@ -290,7 +322,7 @@ main (int argc, char **argv) { if (argc == 1) { - usage (); + usage (FALSE); return 0; } else @@ -301,50 +333,24 @@ main (int argc, char **argv) } else if (g_str_equal (command, "--help")) { - usage (); + usage (FALSE); return 0; } else if (g_str_equal (command, "--version")) command = "version"; - if (g_str_equal (command, "version")) - return handle_version (argc, argv, do_help); - else if (g_str_equal (command, "cat")) - return handle_cat (argc, argv, do_help); - else if (g_str_equal (command, "copy")) - return handle_copy (argc, argv, do_help); - else if (g_str_equal (command, "info")) - return handle_info (argc, argv, do_help); - else if (g_str_equal (command, "launch")) - return handle_launch (argc, argv, do_help); - else if (g_str_equal (command, "list")) - return handle_list (argc, argv, do_help); - else if (g_str_equal (command, "mime")) - return handle_mime (argc, argv, do_help); - else if (g_str_equal (command, "mkdir")) - return handle_mkdir (argc, argv, do_help); - else if (g_str_equal (command, "monitor")) - return handle_monitor (argc, argv, do_help); - else if (g_str_equal (command, "mount")) - return handle_mount (argc, argv, do_help); - else if (g_str_equal (command, "move")) - return handle_move (argc, argv, do_help); - else if (g_str_equal (command, "open")) - return handle_open (argc, argv, do_help); - else if (g_str_equal (command, "rename")) - return handle_rename (argc, argv, do_help); - else if (g_str_equal (command, "remove")) - return handle_remove (argc, argv, do_help); - else if (g_str_equal (command, "save")) - return handle_save (argc, argv, do_help); - else if (g_str_equal (command, "set")) - return handle_set (argc, argv, do_help); - else if (g_str_equal (command, "trash")) - return handle_trash (argc, argv, do_help); - else if (g_str_equal (command, "tree")) - return handle_tree (argc, argv, do_help); - else - usage (); + /* Work out which subcommand it is. */ + for (size_t i = 0; i < G_N_ELEMENTS (gio_subcommands); i++) + { + if (g_str_equal (command, gio_subcommands[i].name)) + { + g_assert (gio_subcommands[i].handle_func != NULL); + return gio_subcommands[i].handle_func (argc, argv, do_help); + } + } + + /* Unknown subcommand. */ + usage (TRUE); return 1; } diff --git a/gio/gioenums.h b/gio/gioenums.h index c820cd3..4223253 100644 --- a/gio/gioenums.h +++ b/gio/gioenums.h @@ -314,6 +314,8 @@ typedef enum { * @G_FILE_COPY_ALL_METADATA: Copy all file metadata instead of just default set used for copy (see #GFileInfo). * @G_FILE_COPY_NO_FALLBACK_FOR_MOVE: Don't use copy and delete fallback if native move not supported. * @G_FILE_COPY_TARGET_DEFAULT_PERMS: Leaves target file with default perms, instead of setting the source file perms. + * @G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME: Use default modification + * timestamps instead of copying them from the source file. Since 2.80 * * Flags used when copying or moving files. */ @@ -324,7 +326,8 @@ typedef enum { G_FILE_COPY_NOFOLLOW_SYMLINKS = (1 << 2), G_FILE_COPY_ALL_METADATA = (1 << 3), G_FILE_COPY_NO_FALLBACK_FOR_MOVE = (1 << 4), - G_FILE_COPY_TARGET_DEFAULT_PERMS = (1 << 5) + G_FILE_COPY_TARGET_DEFAULT_PERMS = (1 << 5), + G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME GIO_AVAILABLE_ENUMERATOR_IN_2_80 = (1 << 6), } GFileCopyFlags; @@ -514,6 +517,7 @@ typedef enum { * @G_IO_ERROR_NOT_CONNECTED: Transport endpoint is not connected. Since 2.44 * @G_IO_ERROR_MESSAGE_TOO_LARGE: Message too large. Since 2.48. * @G_IO_ERROR_NO_SUCH_DEVICE: No such device found. Since 2.74 + * @G_IO_ERROR_DESTINATION_UNSET: Destination address unset. Since 2.80 * * Error codes returned by GIO functions. * @@ -584,6 +588,7 @@ typedef enum { G_IO_ERROR_NOT_CONNECTED, G_IO_ERROR_MESSAGE_TOO_LARGE, G_IO_ERROR_NO_SUCH_DEVICE GIO_AVAILABLE_ENUMERATOR_IN_2_74, + G_IO_ERROR_DESTINATION_UNSET GIO_AVAILABLE_ENUMERATOR_IN_2_80, } GIOErrorEnum; diff --git a/gio/gioenumtypes.c.template b/gio/gioenumtypes.c.template index 5e119a3..3176ead 100644 --- a/gio/gioenumtypes.c.template +++ b/gio/gioenumtypes.c.template @@ -38,9 +38,9 @@ GType @enum_name@_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { static const G@Type@Value values[] = { /*** END value-header ***/ @@ -54,7 +54,7 @@ GType }; GType g_define_type_id = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; diff --git a/gio/gioerror.c b/gio/gioerror.c index b4c0e70..1b64dfd 100644 --- a/gio/gioerror.c +++ b/gio/gioerror.c @@ -30,14 +30,6 @@ #include #endif -/** - * SECTION:gioerror - * @short_description: Error helper functions - * @include: gio/gio.h - * - * Contains helper functions for reporting errors to the user. - **/ - /** * g_io_error_quark: * @@ -51,15 +43,18 @@ G_DEFINE_QUARK (g-io-error-quark, g_io_error) * g_io_error_from_errno: * @err_no: Error number as defined in errno.h. * - * Converts errno.h error codes into GIO error codes. The fallback - * value %G_IO_ERROR_FAILED is returned for error codes not currently - * handled (but note that future GLib releases may return a more + * Converts `errno.h` error codes into GIO error codes. + * + * The fallback value %G_IO_ERROR_FAILED is returned for error codes not + * currently handled (but note that future GLib releases may return a more * specific value instead). * - * As %errno is global and may be modified by intermediate function - * calls, you should save its value as soon as the call which sets it - * returns: - * |[ + * As `errno` is global and may be modified by intermediate function + * calls, you should save its value immediately after the call returns, + * and use the saved value instead of `errno`: + * + * + * |[ * int saved_errno; * * ret = read (blah); @@ -68,8 +63,8 @@ G_DEFINE_QUARK (g-io-error-quark, g_io_error) * g_io_error_from_errno (saved_errno); * ]| * - * Returns: #GIOErrorEnum value for the given errno.h error number. - **/ + * Returns: #GIOErrorEnum value for the given `errno.h` error number + */ GIOErrorEnum g_io_error_from_errno (gint err_no) { @@ -225,6 +220,12 @@ g_io_error_from_errno (gint err_no) break; #endif +#ifdef EDESTADDRREQ + case EDESTADDRREQ: + return G_IO_ERROR_DESTINATION_UNSET; + break; +#endif + #ifdef EMSGSIZE case EMSGSIZE: return G_IO_ERROR_MESSAGE_TOO_LARGE; diff --git a/gio/giomodule.c b/gio/giomodule.c index 17fabe6..1e14955 100644 --- a/gio/giomodule.c +++ b/gio/giomodule.c @@ -77,53 +77,47 @@ #undef __GLIB_H_INSIDE__ /** - * SECTION:giomodule - * @short_description: Loadable GIO Modules - * @include: gio/gio.h + * GIOModule: * * Provides an interface and default functions for loading and unloading * modules. This is used internally to make GIO extensible, but can also * be used by others to implement module loading. - * - **/ + */ /** - * SECTION:extensionpoints - * @short_description: Extension Points - * @include: gio.h - * @see_also: [Extending GIO][extending-gio] + * GIOExtensionPoint: * - * #GIOExtensionPoint provides a mechanism for modules to extend the + * `GIOExtensionPoint` provides a mechanism for modules to extend the * functionality of the library or application that loaded it in an - * organized fashion. + * organized fashion. * * An extension point is identified by a name, and it may optionally * require that any implementation must be of a certain type (or derived - * thereof). Use g_io_extension_point_register() to register an - * extension point, and g_io_extension_point_set_required_type() to + * thereof). Use [func@Gio.IOExtensionPoint.register] to register an + * extension point, and [method@Gio.IOExtensionPoint.set_required_type] to * set a required type. * - * A module can implement an extension point by specifying the #GType - * that implements the functionality. Additionally, each implementation - * of an extension point has a name, and a priority. Use - * g_io_extension_point_implement() to implement an extension point. + * A module can implement an extension point by specifying the + * [type@GObject.Type] that implements the functionality. Additionally, each + * implementation of an extension point has a name, and a priority. Use + * [func@Gio.IOExtensionPoint.implement] to implement an extension point. * - * |[ - * GIOExtensionPoint *ep; + * ```c + * GIOExtensionPoint *ep; * - * // Register an extension point - * ep = g_io_extension_point_register ("my-extension-point"); - * g_io_extension_point_set_required_type (ep, MY_TYPE_EXAMPLE); - * ]| + * // Register an extension point + * ep = g_io_extension_point_register ("my-extension-point"); + * g_io_extension_point_set_required_type (ep, MY_TYPE_EXAMPLE); + * ``` * - * |[ - * // Implement an extension point - * G_DEFINE_TYPE (MyExampleImpl, my_example_impl, MY_TYPE_EXAMPLE) - * g_io_extension_point_implement ("my-extension-point", - * my_example_impl_get_type (), - * "my-example", - * 10); - * ]| + * ```c + * // Implement an extension point + * G_DEFINE_TYPE (MyExampleImpl, my_example_impl, MY_TYPE_EXAMPLE) + * g_io_extension_point_implement ("my-extension-point", + * my_example_impl_get_type (), + * "my-example", + * 10); + * ``` * * It is up to the code that registered the extension point how * it uses the implementations that have been associated with it. @@ -133,7 +127,7 @@ * * To avoid opening all modules just to find out what extension * points they implement, GIO makes use of a caching mechanism, - * see [gio-querymodules][gio-querymodules]. + * see [gio-querymodules](gio-querymodules.html). * You are expected to run this command after installing a * GIO module. * @@ -267,12 +261,6 @@ struct _GIOExtension { gint priority; }; -/** - * GIOExtensionPoint: - * - * #GIOExtensionPoint is an opaque data structure and can only be accessed - * using the following functions. - */ struct _GIOExtensionPoint { GType required_type; char *name; @@ -1175,10 +1163,10 @@ void * _g_io_win32_get_module (void) { if (!gio_dll) - GetModuleHandleExA (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | - GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - (const char *) _g_io_win32_get_module, - &gio_dll); + GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | + GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + (LPCWSTR) _g_io_win32_get_module, + &gio_dll); return gio_dll; } diff --git a/gio/giomodule.h b/gio/giomodule.h index 2fe7e1d..f1460de 100644 --- a/gio/giomodule.h +++ b/gio/giomodule.h @@ -49,11 +49,6 @@ void g_io_module_scope_block (GIOModuleScope *scope, #define G_IO_IS_MODULE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_IO_TYPE_MODULE)) #define G_IO_MODULE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_IO_TYPE_MODULE, GIOModuleClass)) -/** - * GIOModule: - * - * Opaque module base class for extending GIO. - **/ typedef struct _GIOModuleClass GIOModuleClass; GIO_AVAILABLE_IN_ALL diff --git a/gio/gioscheduler.c b/gio/gioscheduler.c index b2059e4..4363e23 100644 --- a/gio/gioscheduler.c +++ b/gio/gioscheduler.c @@ -26,18 +26,6 @@ #include "gcancellable.h" #include "gtask.h" -/** - * SECTION:gioscheduler - * @short_description: I/O Scheduler - * @include: gio/gio.h - * - * As of GLib 2.36, #GIOScheduler is deprecated in favor of - * #GThreadPool and #GTask. - * - * Schedules asynchronous I/O operations. #GIOScheduler integrates - * into the main event loop (#GMainLoop) and uses threads. - */ - struct _GIOSchedulerJob { GList *active_link; GTask *task; @@ -110,7 +98,7 @@ io_job_thread (GTask *task, * by calling g_cancellable_cancel() or by calling * g_io_scheduler_cancel_all_jobs(). * - * Deprecated: use #GThreadPool or g_task_run_in_thread() + * Deprecated: 2.36: use #GThreadPool or g_task_run_in_thread() **/ void g_io_scheduler_push_job (GIOSchedulerJobFunc job_func, @@ -157,7 +145,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS * A job is cancellable if a #GCancellable was passed into * g_io_scheduler_push_job(). * - * Deprecated: You should never call this function, since you don't + * Deprecated: 2.36: You should never call this function, since you don't * know how other libraries in your program might be making use of * gioscheduler. **/ @@ -236,7 +224,7 @@ mainloop_proxy_free (MainLoopProxy *proxy) * * Returns: The return value of @func * - * Deprecated: Use g_main_context_invoke(). + * Deprecated: 2.36: Use g_main_context_invoke(). **/ gboolean g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, @@ -295,7 +283,7 @@ g_io_scheduler_job_send_to_mainloop (GIOSchedulerJob *job, * @func is called, either by passing %NULL as @notify to * g_io_scheduler_push_job() or by using refcounting for @user_data. * - * Deprecated: Use g_main_context_invoke(). + * Deprecated: 2.36: Use g_main_context_invoke(). **/ void g_io_scheduler_job_send_to_mainloop_async (GIOSchedulerJob *job, diff --git a/gio/giostream.c b/gio/giostream.c index 194ba49..d9398fe 100644 --- a/gio/giostream.c +++ b/gio/giostream.c @@ -32,57 +32,56 @@ #include "gtask.h" /** - * SECTION:giostream - * @short_description: Base class for implementing read/write streams - * @include: gio/gio.h - * @see_also: #GInputStream, #GOutputStream + * GIOStream: * - * GIOStream represents an object that has both read and write streams. + * `GIOStream` represents an object that has both read and write streams. * Generally the two streams act as separate input and output streams, * but they share some common resources and state. For instance, for * seekable streams, both streams may use the same position. * - * Examples of #GIOStream objects are #GSocketConnection, which represents - * a two-way network connection; and #GFileIOStream, which represents a + * Examples of `GIOStream` objects are [class@Gio.SocketConnection], which represents + * a two-way network connection; and [class@Gio.FileIOStream], which represents a * file handle opened in read-write mode. * * To do the actual reading and writing you need to get the substreams - * with g_io_stream_get_input_stream() and g_io_stream_get_output_stream(). + * with [method@Gio.IOStream.get_input_stream] and + * [method@Gio.IOStream.get_output_stream]. * - * The #GIOStream object owns the input and the output streams, not the other - * way around, so keeping the substreams alive will not keep the #GIOStream - * object alive. If the #GIOStream object is freed it will be closed, thus + * The `GIOStream` object owns the input and the output streams, not the other + * way around, so keeping the substreams alive will not keep the `GIOStream` + * object alive. If the `GIOStream` object is freed it will be closed, thus * closing the substreams, so even if the substreams stay alive they will - * always return %G_IO_ERROR_CLOSED for all operations. + * always return `G_IO_ERROR_CLOSED` for all operations. * - * To close a stream use g_io_stream_close() which will close the common + * To close a stream use [method@Gio.IOStream.close] which will close the common * stream object and also the individual substreams. You can also close * the substreams themselves. In most cases this only marks the * substream as closed, so further I/O on it fails but common state in the - * #GIOStream may still be open. However, some streams may support - * "half-closed" states where one direction of the stream is actually shut down. + * `GIOStream` may still be open. However, some streams may support + * ‘half-closed’ states where one direction of the stream is actually shut down. * - * Operations on #GIOStreams cannot be started while another operation on the - * #GIOStream or its substreams is in progress. Specifically, an application can - * read from the #GInputStream and write to the #GOutputStream simultaneously - * (either in separate threads, or as asynchronous operations in the same - * thread), but an application cannot start any #GIOStream operation while there - * is a #GIOStream, #GInputStream or #GOutputStream operation in progress, and - * an application can’t start any #GInputStream or #GOutputStream operation - * while there is a #GIOStream operation in progress. + * Operations on `GIOStream`s cannot be started while another operation on the + * `GIOStream` or its substreams is in progress. Specifically, an application can + * read from the [class@Gio.InputStream] and write to the + * [class@Gio.OutputStream] simultaneously (either in separate threads, or as + * asynchronous operations in the same thread), but an application cannot start + * any `GIOStream` operation while there is a `GIOStream`, `GInputStream` or + * `GOutputStream` operation in progress, and an application can’t start any + * `GInputStream` or `GOutputStream` operation while there is a `GIOStream` + * operation in progress. * * This is a product of individual stream operations being associated with a - * given #GMainContext (the thread-default context at the time the operation was - * started), rather than entire streams being associated with a single - * #GMainContext. + * given [type@GLib.MainContext] (the thread-default context at the time the + * operation was started), rather than entire streams being associated with a + * single `GMainContext`. * - * GIO may run operations on #GIOStreams from other (worker) threads, and this + * GIO may run operations on `GIOStream`s from other (worker) threads, and this * may be exposed to application code in the behaviour of wrapper streams, such - * as #GBufferedInputStream or #GTlsConnection. With such wrapper APIs, - * application code may only run operations on the base (wrapped) stream when - * the wrapper stream is idle. Note that the semantics of such operations may - * not be well-defined due to the state the wrapper stream leaves the base - * stream in (though they are guaranteed not to crash). + * as [class@Gio.BufferedInputStream] or [class@Gio.TlsConnection]. With such + * wrapper APIs, application code may only run operations on the base (wrapped) + * stream when the wrapper stream is idle. Note that the semantics of such + * operations may not be well-defined due to the state the wrapper stream leaves + * the base stream in (though they are guaranteed not to crash). * * Since: 2.22 */ @@ -172,23 +171,39 @@ g_io_stream_class_init (GIOStreamClass *klass) klass->close_async = g_io_stream_real_close_async; klass->close_finish = g_io_stream_real_close_finish; + /** + * GIOStream:closed: + * + * Whether the stream is closed. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_CLOSED, - g_param_spec_boolean ("closed", - P_("Closed"), - P_("Is the stream closed"), + g_param_spec_boolean ("closed", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GIOStream:input-stream: + * + * The [class@Gio.InputStream] to read from. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_INPUT_STREAM, - g_param_spec_object ("input-stream", - P_("Input stream"), - P_("The GInputStream to read from"), + g_param_spec_object ("input-stream", NULL, NULL, G_TYPE_INPUT_STREAM, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + + /** + * GIOStream:output-stream: + * + * The [class@Gio.OutputStream] to write to. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_OUTPUT_STREAM, - g_param_spec_object ("output-stream", - P_("Output stream"), - P_("The GOutputStream to write to"), + g_param_spec_object ("output-stream", NULL, NULL, G_TYPE_OUTPUT_STREAM, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/giostream.h b/gio/giostream.h index 52881c7..f8a958b 100644 --- a/gio/giostream.h +++ b/gio/giostream.h @@ -40,11 +40,6 @@ G_BEGIN_DECLS typedef struct _GIOStreamPrivate GIOStreamPrivate; typedef struct _GIOStreamClass GIOStreamClass; -/** - * GIOStream: - * - * Base class for read-write streams. - **/ struct _GIOStream { GObject parent_instance; diff --git a/gio/giotypes.h b/gio/giotypes.h index 82e091b..98143ba 100644 --- a/gio/giotypes.h +++ b/gio/giotypes.h @@ -65,24 +65,12 @@ typedef struct _GPermission GPermission; typedef struct _GMenuModel GMenuModel; typedef struct _GNotification GNotification; -/** - * GDrive: - * - * Opaque drive object. - **/ typedef struct _GDrive GDrive; /* Dummy typedef */ typedef struct _GFileEnumerator GFileEnumerator; typedef struct _GFileMonitor GFileMonitor; typedef struct _GFilterInputStream GFilterInputStream; typedef struct _GFilterOutputStream GFilterOutputStream; -/** - * GFile: - * - * A handle to an object implementing the #GFileIface interface. - * Generally stores a location within the file system. Handles do not - * necessarily represent files or directories that currently exist. - **/ typedef struct _GFile GFile; /* Dummy typedef */ typedef struct _GFileInfo GFileInfo; @@ -94,7 +82,6 @@ typedef struct _GFileInfo GFileInfo; typedef struct _GFileAttributeMatcher GFileAttributeMatcher; typedef struct _GFileAttributeInfo GFileAttributeInfo; typedef struct _GFileAttributeInfoList GFileAttributeInfoList; -typedef struct _GFileDescriptorBased GFileDescriptorBased; typedef struct _GFileInputStream GFileInputStream; typedef struct _GFileOutputStream GFileOutputStream; typedef struct _GFileIOStream GFileIOStream; @@ -117,6 +104,9 @@ typedef struct _GIOExtension GIOExtension; * GIOSchedulerJob: * * Opaque class for defining and scheduling IO jobs. + * + * Deprecated: 2.36: Use [struct@GLib.ThreadPool] or + * [method@Gio.Task.run_in_thread] **/ typedef struct _GIOSchedulerJob GIOSchedulerJob; typedef struct _GIOStreamAdapter GIOStreamAdapter; @@ -125,11 +115,6 @@ typedef struct _GBytesIcon GBytesIcon; typedef struct _GMemoryInputStream GMemoryInputStream; typedef struct _GMemoryOutputStream GMemoryOutputStream; -/** - * GMount: - * - * A handle to an object implementing the #GMountIface interface. - **/ typedef struct _GMount GMount; /* Dummy typedef */ typedef struct _GMountOperation GMountOperation; typedef struct _GNetworkAddress GNetworkAddress; @@ -142,88 +127,24 @@ typedef struct _GPollableInputStream GPollableInputStream; /* Dummy typ typedef struct _GPollableOutputStream GPollableOutputStream; /* Dummy typedef */ typedef struct _GResolver GResolver; -/** - * GResource: - * - * A resource bundle. - * - * Since: 2.32 - */ typedef struct _GResource GResource; typedef struct _GSeekable GSeekable; typedef struct _GSimpleAsyncResult GSimpleAsyncResult; -/** - * GSocket: - * - * A lowlevel network socket object. - * - * Since: 2.22 - **/ typedef struct _GSocket GSocket; -/** - * GSocketControlMessage: - * - * Base class for socket-type specific control messages that can be sent and - * received over #GSocket. - **/ typedef struct _GSocketControlMessage GSocketControlMessage; -/** - * GSocketClient: - * - * A helper class for network clients to make connections. - * - * Since: 2.22 - **/ typedef struct _GSocketClient GSocketClient; -/** - * GSocketConnection: - * - * A socket connection GIOStream object for connection-oriented sockets. - * - * Since: 2.22 - **/ typedef struct _GSocketConnection GSocketConnection; -/** - * GSocketListener: - * - * A helper class for network servers to listen for and accept connections. - * - * Since: 2.22 - **/ typedef struct _GSocketListener GSocketListener; -/** - * GSocketService: - * - * A helper class for handling accepting incoming connections in the - * glib mainloop. - * - * Since: 2.22 - **/ typedef struct _GSocketService GSocketService; typedef struct _GSocketAddress GSocketAddress; typedef struct _GSocketAddressEnumerator GSocketAddressEnumerator; typedef struct _GSocketConnectable GSocketConnectable; typedef struct _GSrvTarget GSrvTarget; typedef struct _GTask GTask; -/** - * GTcpConnection: - * - * A #GSocketConnection for TCP/IP connections. - * - * Since: 2.22 - **/ typedef struct _GTcpConnection GTcpConnection; typedef struct _GTcpWrapperConnection GTcpWrapperConnection; -/** - * GThreadedSocketService: - * - * A helper class for handling accepting incoming connections in the - * glib mainloop and handling them in a thread. - * - * Since: 2.22 - **/ typedef struct _GThreadedSocketService GThreadedSocketService; typedef struct _GDtlsConnection GDtlsConnection; typedef struct _GDtlsClientConnection GDtlsClientConnection; /* Dummy typedef */ @@ -239,23 +160,11 @@ typedef struct _GTlsPassword GTlsPassword; typedef struct _GTlsServerConnection GTlsServerConnection; /* Dummy typedef */ typedef struct _GVfs GVfs; /* Dummy typedef */ -/** - * GProxyResolver: - * - * A helper class to enumerate proxies base on URI. - * - * Since: 2.26 - **/ typedef struct _GProxyResolver GProxyResolver; typedef struct _GProxy GProxy; typedef struct _GProxyAddress GProxyAddress; typedef struct _GProxyAddressEnumerator GProxyAddressEnumerator; -/** - * GVolume: - * - * Opaque mountable volume object. - **/ typedef struct _GVolume GVolume; /* Dummy typedef */ typedef struct _GVolumeMonitor GVolumeMonitor; @@ -370,6 +279,8 @@ typedef void (* GFileMeasureProgressCallback) (gboolean reporting, * * Returns: %TRUE if this function should be called again to * complete the job, %FALSE if the job is complete (or cancelled) + * Deprecated: 2.36: Use [struct@GLib.ThreadPool] or + * [method@Gio.Task.run_in_thread] **/ typedef gboolean (*GIOSchedulerJobFunc) (GIOSchedulerJob *job, GCancellable *cancellable, @@ -638,21 +549,7 @@ typedef GType (*GDBusProxyTypeFunc) (GDBusObjectManagerClient *manager, typedef struct _GTestDBus GTestDBus; -/** - * GSubprocess: - * - * A child process. - * - * Since: 2.40 - */ typedef struct _GSubprocess GSubprocess; -/** - * GSubprocessLauncher: - * - * Options for launching a child process. - * - * Since: 2.40 - */ typedef struct _GSubprocessLauncher GSubprocessLauncher; G_END_DECLS diff --git a/gio/gkeyfilesettingsbackend.c b/gio/gkeyfilesettingsbackend.c index 79a0266..a86c4d9 100644 --- a/gio/gkeyfilesettingsbackend.c +++ b/gio/gkeyfilesettingsbackend.c @@ -898,9 +898,7 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) */ g_object_class_install_property (object_class, PROP_FILENAME, - g_param_spec_string ("filename", - P_("Filename"), - P_("The filename"), + g_param_spec_string ("filename", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -916,9 +914,7 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) */ g_object_class_install_property (object_class, PROP_ROOT_PATH, - g_param_spec_string ("root-path", - P_("Root path"), - P_("The root path"), + g_param_spec_string ("root-path", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -933,9 +929,7 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) */ g_object_class_install_property (object_class, PROP_ROOT_GROUP, - g_param_spec_string ("root-group", - P_("Root group"), - P_("The root group"), + g_param_spec_string ("root-group", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -949,9 +943,7 @@ g_keyfile_settings_backend_class_init (GKeyfileSettingsBackendClass *class) */ g_object_class_install_property (object_class, PROP_DEFAULTS_DIR, - g_param_spec_string ("defaults-dir", - P_("Default dir"), - P_("Defaults dir"), + g_param_spec_string ("defaults-dir", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); diff --git a/gio/glib-compile-resources.c b/gio/glib-compile-resources.c index 46eec19..36f64a4 100644 --- a/gio/glib-compile-resources.c +++ b/gio/glib-compile-resources.c @@ -830,8 +830,8 @@ main (int argc, char **argv) { "manual-register", 0, 0, G_OPTION_ARG_NONE, &manual_register, N_("Don’t automatically create and register resource"), NULL }, { "internal", 0, 0, G_OPTION_ARG_NONE, &internal, N_("Don’t export functions; declare them G_GNUC_INTERNAL"), NULL }, { "external-data", 0, 0, G_OPTION_ARG_NONE, &external_data, N_("Don’t embed resource data in the C file; assume it's linked externally instead"), NULL }, - { "c-name", 0, 0, G_OPTION_ARG_STRING, &c_name, N_("C identifier name used for the generated source code"), NULL }, - { "compiler", 'C', 0, G_OPTION_ARG_STRING, &compiler, N_("The target C compiler (default: the CC environment variable)"), NULL }, + { "c-name", 0, 0, G_OPTION_ARG_STRING, &c_name, N_("C identifier name used for the generated source code"), N_("IDENTIFIER") }, + { "compiler", 'C', 0, G_OPTION_ARG_STRING, &compiler, N_("The target C compiler (default: the CC environment variable)"), N_("COMMAND") }, G_OPTION_ENTRY_NULL }; @@ -1196,7 +1196,7 @@ main (int argc, char **argv) "#include \n" "\n" "#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))\n" - "# define SECTION __attribute__ ((section (\".gresource.%s\"), aligned (8)))\n" + "# define SECTION __attribute__ ((section (\".gresource.%s\"), aligned (sizeof(void *) > 8 ? sizeof(void *) : 8)))\n" "#else\n" "# define SECTION\n" "#endif\n" diff --git a/gio/glistmodel.c b/gio/glistmodel.c index 349b08b..35a66e9 100644 --- a/gio/glistmodel.c +++ b/gio/glistmodel.c @@ -31,74 +31,72 @@ G_DEFINE_INTERFACE (GListModel, g_list_model, G_TYPE_OBJECT) /** - * SECTION:glistmodel - * @title: GListModel - * @short_description: An interface describing a dynamic list of objects - * @include: gio/gio.h - * @see_also: #GListStore + * GListModel: * - * #GListModel is an interface that represents a mutable list of - * #GObjects. Its main intention is as a model for various widgets in - * user interfaces, such as list views, but it can also be used as a + * `GListModel` is an interface that represents a mutable list of + * [class@GObject.Object]. Its main intention is as a model for various widgets + * in user interfaces, such as list views, but it can also be used as a * convenient method of returning lists of data, with support for * updates. * * Each object in the list may also report changes in itself via some - * mechanism (normally the #GObject::notify signal). Taken together - * with the #GListModel::items-changed signal, this provides for a list - * that can change its membership, and in which the members can change - * their individual properties. + * mechanism (normally the [signal@GObject.Object::notify] signal). Taken + * together with the [signal@Gio.ListModel::items-changed] signal, this provides + * for a list that can change its membership, and in which the members can + * change their individual properties. * * A good example would be the list of visible wireless network access * points, where each access point can report dynamic properties such as * signal strength. * - * It is important to note that the #GListModel itself does not report + * It is important to note that the `GListModel` itself does not report * changes to the individual items. It only reports changes to the list * membership. If you want to observe changes to the objects themselves * then you need to connect signals to the objects that you are * interested in. * - * All items in a #GListModel are of (or derived from) the same type. - * g_list_model_get_item_type() returns that type. The type may be an + * All items in a `GListModel` are of (or derived from) the same type. + * [method@Gio.ListModel.get_item_type] returns that type. The type may be an * interface, in which case all objects in the list must implement it. * * The semantics are close to that of an array: - * g_list_model_get_n_items() returns the number of items in the list and - * g_list_model_get_item() returns an item at a (0-based) position. In - * order to allow implementations to calculate the list length lazily, + * [method@Gio.ListModel.get_n_items] returns the number of items in the list + * and [method@Gio.ListModel.get_item] returns an item at a (0-based) position. + * In order to allow implementations to calculate the list length lazily, * you can also iterate over items: starting from 0, repeatedly call - * g_list_model_get_item() until it returns %NULL. + * [method@Gio.ListModel.get_item] until it returns `NULL`. * * An implementation may create objects lazily, but must take care to * return the same object for a given position until all references to * it are gone. * * On the other side, a consumer is expected only to hold references on - * objects that are currently "user visible", in order to facilitate the + * objects that are currently ‘user visible’, in order to facilitate the * maximum level of laziness in the implementation of the list and to * reduce the required number of signal connections at a given time. * * This interface is intended only to be used from a single thread. The * thread in which it is appropriate to use it depends on the particular * implementation, but typically it will be from the thread that owns - * the [thread-default main context][g-main-context-push-thread-default] - * in effect at the time that the model was created. + * the thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) in effect at the time that the + * model was created. * - * Over time, it has established itself as good practice for listmodel + * Over time, it has established itself as good practice for list model * implementations to provide properties `item-type` and `n-items` to * ease working with them. While it is not required, it is recommended * that implementations provide these two properties. They should return - * the values of g_list_model_get_item_type() and g_list_model_get_n_items() - * respectively and be defined as such: - * |[ + * the values of [method@Gio.ListModel.get_item_type] and + * [method@Gio.ListModel.get_n_items] respectively and be defined as such: + * + * ```c * properties[PROP_ITEM_TYPE] = - * g_param_spec_gtype ("item-type", "", "", G_TYPE_OBJECT, + * g_param_spec_gtype ("item-type", NULL, NULL, G_TYPE_OBJECT, * G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); * properties[PROP_N_ITEMS] = - * g_param_spec_uint ("n-items", "", "", 0, G_MAXUINT, 0, + * g_param_spec_uint ("n-items", NULL, NULL, 0, G_MAXUINT, 0, * G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); - * ]| + * ``` */ /** @@ -131,13 +129,6 @@ G_DEFINE_INTERFACE (GListModel, g_list_model, G_TYPE_OBJECT) * Since: 2.44 */ -/** - * GListModel: - * - * #GListModel is an opaque data structure and can only be accessed - * using the following functions. - **/ - static guint g_list_model_changed_signal; static void diff --git a/gio/gliststore.c b/gio/gliststore.c index 497dfb5..41450f6 100644 --- a/gio/gliststore.c +++ b/gio/gliststore.c @@ -28,25 +28,15 @@ #include "glistmodel.h" /** - * SECTION:gliststore - * @title: GListStore - * @short_description: A simple implementation of #GListModel - * @include: gio/gio.h + * GListStore: * - * #GListStore is a simple implementation of #GListModel that stores all - * items in memory. + * `GListStore` is a simple implementation of [iface@Gio.ListModel] that stores + * all items in memory. * * It provides insertions, deletions, and lookups in logarithmic time * with a fast path for the common case of iterating the list linearly. */ -/** - * GListStore: - * - * #GListStore is an opaque data structure and can only be accessed - * using the following functions. - **/ - struct _GListStore { GObject parent_instance; @@ -165,7 +155,7 @@ g_list_store_class_init (GListStoreClass *klass) * Since: 2.44 **/ properties[PROP_ITEM_TYPE] = - g_param_spec_gtype ("item-type", "", "", G_TYPE_OBJECT, + g_param_spec_gtype ("item-type", NULL, NULL, G_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); /** @@ -176,7 +166,7 @@ g_list_store_class_init (GListStoreClass *klass) * Since: 2.74 **/ properties[PROP_N_ITEMS] = - g_param_spec_uint ("n-items", "", "", 0, G_MAXUINT, 0, + g_param_spec_uint ("n-items", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPERTIES, properties); diff --git a/gio/gloadableicon.c b/gio/gloadableicon.c index 1d3460d..13012ba 100644 --- a/gio/gloadableicon.c +++ b/gio/gloadableicon.c @@ -29,13 +29,10 @@ /** - * SECTION:gloadableicon - * @short_description: Loadable Icons - * @include: gio/gio.h - * @see_also: #GIcon, #GThemedIcon + * GLoadableIcon: * - * Extends the #GIcon interface and adds the ability to - * load icons from streams. + * `GLoadableIcon` extends the [iface@Gio.Icon] interface and adds the ability + * to load icons from streams. **/ static void g_loadable_icon_real_load_async (GLoadableIcon *icon, diff --git a/gio/gloadableicon.h b/gio/gloadableicon.h index 7a576ef..bde104b 100644 --- a/gio/gloadableicon.h +++ b/gio/gloadableicon.h @@ -36,12 +36,6 @@ G_BEGIN_DECLS #define G_IS_LOADABLE_ICON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_LOADABLE_ICON)) #define G_LOADABLE_ICON_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_LOADABLE_ICON, GLoadableIconIface)) -/** - * GLoadableIcon: - * - * Generic type for all kinds of icons that can be loaded - * as a stream. - **/ typedef struct _GLoadableIconIface GLoadableIconIface; /** diff --git a/gio/glocalfile.c b/gio/glocalfile.c index dbb5690..ceb888a 100644 --- a/gio/glocalfile.c +++ b/gio/glocalfile.c @@ -105,7 +105,7 @@ static void g_local_file_file_iface_init (GFileIface *iface); static GFileAttributeInfoList *local_writable_attributes = NULL; -static /* GFileAttributeInfoList * */ gsize local_writable_namespaces = 0; +static GFileAttributeInfoList *local_writable_namespaces = NULL; struct _GLocalFile { @@ -1089,6 +1089,8 @@ g_local_file_query_filesystem_info (GFile *file, fstype = statfs_buffer.f_fstypename; #elif defined(HAVE_STRUCT_STATVFS_F_BASETYPE) fstype = statfs_buffer.f_basetype; +#elif defined(HAVE_STRUCT_STATVFS_F_TYPE) + fstype = get_fs_type (statfs_buffer.f_type); #else fstype = NULL; #endif @@ -1274,7 +1276,7 @@ g_local_file_query_writable_namespaces (GFile *file, GVfsClass *class; GVfs *vfs; - if (g_once_init_enter (&local_writable_namespaces)) + if (g_once_init_enter_pointer (&local_writable_namespaces)) { /* Writable namespaces: */ @@ -1297,7 +1299,7 @@ g_local_file_query_writable_namespaces (GFile *file, if (class->add_writable_namespaces) class->add_writable_namespaces (vfs, list); - g_once_init_leave (&local_writable_namespaces, (gsize)list); + g_once_init_leave_pointer (&local_writable_namespaces, list); } list = (GFileAttributeInfoList *)local_writable_namespaces; diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index 4f51427..2df7c91 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -1345,7 +1345,11 @@ get_content_type (const char *basename, #if !defined(G_OS_WIN32) && !defined(__APPLE__) if (!fast && result_uncertain && path != NULL) { - guchar sniff_buffer[4096]; + /* Sniff the first 16KiB of the file (sometimes less, if xdgmime + * says it doesn’t need so much). Most files need less than 4KiB of + * sniffing, but some disk images need more (see + * https://gitlab.gnome.org/GNOME/glib/-/issues/3186). */ + guchar sniff_buffer[16384]; gsize sniff_length; #ifdef O_NOATIME int errsv; @@ -1353,8 +1357,8 @@ get_content_type (const char *basename, int fd; sniff_length = _g_unix_content_type_get_sniff_len (); - if (sniff_length == 0 || sniff_length > 4096) - sniff_length = 4096; + if (sniff_length == 0 || sniff_length > sizeof (sniff_buffer)) + sniff_length = sizeof (sniff_buffer); #ifdef O_NOATIME fd = g_open (path, O_RDONLY | O_NOATIME | O_CLOEXEC, 0); diff --git a/gio/glocalvfs.c b/gio/glocalvfs.c index 00fec8e..7266ee0 100644 --- a/gio/glocalvfs.c +++ b/gio/glocalvfs.c @@ -94,32 +94,9 @@ g_local_vfs_get_file_for_uri (GVfs *vfs, { char *path; GFile *file; - char *stripped_uri, *hash, *question_mark; - /* As per https://url.spec.whatwg.org/#file-state, file: URIs can contain - * query and fragment sections. We ignore them in order to get only the file - * path. Compliance to this part of the WhatWG spec doesn’t necessarily mean - * we comply with the entire spec. */ - if (strchr (uri, '#') != NULL) - { - stripped_uri = g_strdup (uri); - hash = strchr (stripped_uri, '#'); - *hash = 0; - } - else if (strchr (uri, '?') != NULL) - { - stripped_uri = g_strdup (uri); - question_mark = strchr (stripped_uri, '?'); - *question_mark = 0; - } - else - stripped_uri = (char *)uri; - - path = g_filename_from_uri (stripped_uri, NULL, NULL); + path = g_filename_from_uri (uri, NULL, NULL); - if (stripped_uri != uri) - g_free (stripped_uri); - if (path != NULL) file = _g_local_file_new (path); else diff --git a/gio/gmemoryinputstream.c b/gio/gmemoryinputstream.c index 80f77d1..de16454 100644 --- a/gio/gmemoryinputstream.c +++ b/gio/gmemoryinputstream.c @@ -32,16 +32,13 @@ /** - * SECTION:gmemoryinputstream - * @short_description: Streaming input operations on memory chunks - * @include: gio/gio.h - * @see_also: #GMemoryOutputStream + * GMemoryInputStream: * - * #GMemoryInputStream is a class for using arbitrary + * `GMemoryInputStream` is a class for using arbitrary * memory chunks as input for GIO streaming input operations. * - * As of GLib 2.34, #GMemoryInputStream implements - * #GPollableInputStream. + * As of GLib 2.34, `GMemoryInputStream` implements + * [iface@Gio.PollableInputStream]. */ struct _GMemoryInputStreamPrivate { diff --git a/gio/gmemoryinputstream.h b/gio/gmemoryinputstream.h index fb72f23..b346567 100644 --- a/gio/gmemoryinputstream.h +++ b/gio/gmemoryinputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_MEMORY_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MEMORY_INPUT_STREAM)) #define G_MEMORY_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MEMORY_INPUT_STREAM, GMemoryInputStreamClass)) -/** - * GMemoryInputStream: - * - * Implements #GInputStream for arbitrary memory chunks. - **/ typedef struct _GMemoryInputStreamClass GMemoryInputStreamClass; typedef struct _GMemoryInputStreamPrivate GMemoryInputStreamPrivate; diff --git a/gio/gmemorymonitor.c b/gio/gmemorymonitor.c index fe555c8..148ada6 100644 --- a/gio/gmemorymonitor.c +++ b/gio/gmemorymonitor.c @@ -31,14 +31,12 @@ #include "gtask.h" /** - * SECTION:gmemorymonitor - * @title: GMemoryMonitor - * @short_description: Memory usage monitor - * @include: gio/gio.h + * GMemoryMonitor: * - * #GMemoryMonitor will monitor system memory and suggest to the application + * `GMemoryMonitor` will monitor system memory and suggest to the application * when to free memory so as to leave more room for other applications. - * It is implemented on Linux using the [Low Memory Monitor](https://gitlab.freedesktop.org/hadess/low-memory-monitor/) + * It is implemented on Linux using the + * [Low Memory Monitor](https://gitlab.freedesktop.org/hadess/low-memory-monitor/) * ([API documentation](https://hadess.pages.freedesktop.org/low-memory-monitor/)). * * There is also an implementation for use inside Flatpak sandboxes. @@ -46,11 +44,11 @@ * Possible actions to take when the signal is received are: * * - Free caches - * - Save files that haven't been looked at in a while to disk, ready to be reopened when needed + * - Save files that haven’t been looked at in a while to disk, ready to be reopened when needed * - Run a garbage collection cycle * - Try and compress fragmented allocations * - Exit on idle if the process has no reason to stay around - * - Call [`malloc_trim(3)`](man:malloc_trim) to return cached heap pages to + * - Call [`malloc_trim(3)`](man:malloc_trim(3)) to return cached heap pages to * the kernel (if supported by your libc) * * Note that some actions may not always improve system performance, and so @@ -58,9 +56,10 @@ * make future heap allocations slower (due to releasing cached heap pages back * to the kernel). * - * See #GMemoryMonitorWarningLevel for details on the various warning levels. + * See [type@Gio.MemoryMonitorWarningLevel] for details on the various warning + * levels. * - * |[ + * ```c * static void * warning_cb (GMemoryMonitor *m, GMemoryMonitorWarningLevel level) * { @@ -78,19 +77,10 @@ * G_CALLBACK (warning_cb), NULL); * return m; * } - * ]| + * ``` * - * Don't forget to disconnect the #GMemoryMonitor::low-memory-warning - * signal, and unref the #GMemoryMonitor itself when exiting. - * - * Since: 2.64 - */ - -/** - * GMemoryMonitor: - * - * #GMemoryMonitor monitors system memory and indicates when - * the system is low on memory. + * Don’t forget to disconnect the [signal@Gio.MemoryMonitor::low-memory-warning] + * signal, and unref the `GMemoryMonitor` itself when exiting. * * Since: 2.64 */ diff --git a/gio/gmemoryoutputstream.c b/gio/gmemoryoutputstream.c index 0339a7a..bf08085 100644 --- a/gio/gmemoryoutputstream.c +++ b/gio/gmemoryoutputstream.c @@ -35,16 +35,13 @@ /** - * SECTION:gmemoryoutputstream - * @short_description: Streaming output operations on memory chunks - * @include: gio/gio.h - * @see_also: #GMemoryInputStream + * GMemoryOutputStream: * - * #GMemoryOutputStream is a class for using arbitrary + * `GMemoryOutputStream` is a class for using arbitrary * memory chunks as output for GIO streaming output operations. * - * As of GLib 2.34, #GMemoryOutputStream trivially implements - * #GPollableOutputStream: it always polls as ready. + * As of GLib 2.34, `GMemoryOutputStream` trivially implements + * [iface@Gio.PollableOutputStream]: it always polls as ready. */ #define MIN_ARRAY_SIZE 16 @@ -154,9 +151,7 @@ g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) **/ g_object_class_install_property (gobject_class, PROP_DATA, - g_param_spec_pointer ("data", - P_("Data Buffer"), - P_("Pointer to buffer where data will be written."), + g_param_spec_pointer ("data", NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -169,9 +164,7 @@ g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) **/ g_object_class_install_property (gobject_class, PROP_SIZE, - g_param_spec_ulong ("size", - P_("Data Buffer Size"), - P_("Current size of the data buffer."), + g_param_spec_ulong ("size", NULL, NULL, 0, G_MAXULONG, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -185,9 +178,7 @@ g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) **/ g_object_class_install_property (gobject_class, PROP_DATA_SIZE, - g_param_spec_ulong ("data-size", - P_("Data Size"), - P_("Size of data written to the buffer."), + g_param_spec_ulong ("data-size", NULL, NULL, 0, G_MAXULONG, 0, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -201,9 +192,7 @@ g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) **/ g_object_class_install_property (gobject_class, PROP_REALLOC_FUNCTION, - g_param_spec_pointer ("realloc-function", - P_("Memory Reallocation Function"), - P_("Function with realloc semantics called to enlarge the buffer."), + g_param_spec_pointer ("realloc-function", NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); @@ -216,9 +205,7 @@ g_memory_output_stream_class_init (GMemoryOutputStreamClass *klass) **/ g_object_class_install_property (gobject_class, PROP_DESTROY_FUNCTION, - g_param_spec_pointer ("destroy-function", - P_("Destroy Notification Function"), - P_("Function called with the buffer as argument when the stream is destroyed."), + g_param_spec_pointer ("destroy-function", NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gmemoryoutputstream.h b/gio/gmemoryoutputstream.h index 08f5dcf..6fb077b 100644 --- a/gio/gmemoryoutputstream.h +++ b/gio/gmemoryoutputstream.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_MEMORY_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MEMORY_OUTPUT_STREAM)) #define G_MEMORY_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MEMORY_OUTPUT_STREAM, GMemoryOutputStreamClass)) -/** - * GMemoryOutputStream: - * - * Implements #GOutputStream for arbitrary memory chunks. - **/ typedef struct _GMemoryOutputStreamClass GMemoryOutputStreamClass; typedef struct _GMemoryOutputStreamPrivate GMemoryOutputStreamPrivate; diff --git a/gio/gmenu.c b/gio/gmenu.c index adef4cc..dd4daee 100644 --- a/gio/gmenu.c +++ b/gio/gmenu.c @@ -28,27 +28,17 @@ #include "gicon.h" -/** - * SECTION:gmenu - * @title: GMenu - * @short_description: A simple implementation of GMenuModel - * @include: gio/gio.h - * - * #GMenu is a simple implementation of #GMenuModel. - * You populate a #GMenu by adding #GMenuItem instances to it. - * - * There are some convenience functions to allow you to directly - * add items (avoiding #GMenuItem) for the common cases. To add - * a regular item, use g_menu_insert(). To add a section, use - * g_menu_insert_section(). To add a submenu, use - * g_menu_insert_submenu(). - */ - /** * GMenu: * - * #GMenu is an opaque structure type. You must access it using the - * functions below. + * `GMenu` is a simple implementation of [class@Gio.MenuModel]. + * You populate a `GMenu` by adding [class@Gio.MenuItem] instances to it. + * + * There are some convenience functions to allow you to directly + * add items (avoiding [class@Gio.MenuItem]) for the common cases. To add + * a regular item, use [method@Gio.Menu.insert]. To add a section, use + * [method@Gio.Menu.insert_section]. To add a submenu, use + * [method@Gio.Menu.insert_submenu]. * * Since: 2.32 */ diff --git a/gio/gmenuexporter.c b/gio/gmenuexporter.c index 67aac19..909780c 100644 --- a/gio/gmenuexporter.c +++ b/gio/gmenuexporter.c @@ -28,21 +28,6 @@ #include "gdbusnamewatching.h" #include "gdbuserror.h" -/** - * SECTION:gmenuexporter - * @title: GMenuModel exporter - * @short_description: Export GMenuModels on D-Bus - * @include: gio/gio.h - * @see_also: #GMenuModel, #GDBusMenuModel - * - * These functions support exporting a #GMenuModel on D-Bus. - * The D-Bus interface that is used is a private implementation - * detail. - * - * To access an exported #GMenuModel remotely, use - * g_dbus_menu_model_get() to obtain a #GDBusMenuModel. - */ - /* {{{1 D-Bus Interface description */ /* For documentation of this interface, see diff --git a/gio/gmenumodel.c b/gio/gmenumodel.c index a8c0cfd..77c4dad 100644 --- a/gio/gmenumodel.c +++ b/gio/gmenumodel.c @@ -27,13 +27,9 @@ #include "gmarshal-internal.h" /** - * SECTION:gmenumodel - * @title: GMenuModel - * @short_description: An abstract class representing the contents of a menu - * @include: gio/gio.h - * @see_also: #GActionGroup + * GMenuModel: * - * #GMenuModel represents the contents of a menu -- an ordered list of + * `GMenuModel` represents the contents of a menu — an ordered list of * menu items. The items are associated with actions, which can be * activated through them. Items can be grouped in sections, and may * have submenus associated with them. Both items and sections usually @@ -41,20 +37,20 @@ * the associated action (ie whether it is stateful, and what kind of * state it has) can influence the representation of the item. * - * The conceptual model of menus in #GMenuModel is hierarchical: - * sections and submenus are again represented by #GMenuModels. + * The conceptual model of menus in `GMenuModel` is hierarchical: + * sections and submenus are again represented by `GMenuModel`s. * Menus themselves do not define their own roles. Rather, the role - * of a particular #GMenuModel is defined by the item that references - * it (or, in the case of the 'root' menu, is defined by the context + * of a particular `GMenuModel` is defined by the item that references + * it (or, in the case of the ‘root’ menu, is defined by the context * in which it is used). * * As an example, consider the visible portions of this menu: * - * ## An example menu # {#menu-example} + * ## An example menu * * ![](menu-example.png) * - * There are 8 "menus" visible in the screenshot: one menubar, two + * There are 8 ‘menus’ visible in the screenshot: one menubar, two * submenus and 5 sections: * * - the toplevel menubar (containing 4 items) @@ -66,17 +62,17 @@ * - the Sources section (containing 2 items) * - the Markup section (containing 2 items) * - * The [example][menu-model] illustrates the conceptual connection between + * The [example](#a-menu-example) illustrates the conceptual connection between * these 8 menus. Each large block in the figure represents a menu and the * smaller blocks within the large block represent items in that menu. Some * items contain references to other menus. * - * ## A menu example # {#menu-model} + * ## A menu example * * ![](menu-model.png) * - * Notice that the separators visible in the [example][menu-example] - * appear nowhere in the [menu model][menu-model]. This is because + * Notice that the separators visible in the [example](#an-example-menu) + * appear nowhere in the [menu model](#a-menu-example). This is because * separators are not explicitly represented in the menu model. Instead, * a separator is inserted between any two non-empty sections of a menu. * Section items can have labels just like any other item. In that case, @@ -85,32 +81,33 @@ * The motivation for this abstract model of application controls is * that modern user interfaces tend to make these controls available * outside the application. Examples include global menus, jumplists, - * dash boards, etc. To support such uses, it is necessary to 'export' + * dash boards, etc. To support such uses, it is necessary to ‘export’ * information about actions and their representation in menus, which - * is exactly what the [GActionGroup exporter][gio-GActionGroup-exporter] - * and the [GMenuModel exporter][gio-GMenuModel-exporter] do for - * #GActionGroup and #GMenuModel. The client-side counterparts to - * make use of the exported information are #GDBusActionGroup and - * #GDBusMenuModel. + * is exactly what the action group exporter and the menu model exporter do for + * [iface@Gio.ActionGroup] and [class@Gio.MenuModel]. The client-side + * counterparts to make use of the exported information are + * [class@Gio.DBusActionGroup] and [class@Gio.DBusMenuModel]. * - * The API of #GMenuModel is very generic, with iterators for the - * attributes and links of an item, see g_menu_model_iterate_item_attributes() - * and g_menu_model_iterate_item_links(). The 'standard' attributes and - * link types have predefined names: %G_MENU_ATTRIBUTE_LABEL, - * %G_MENU_ATTRIBUTE_ACTION, %G_MENU_ATTRIBUTE_TARGET, %G_MENU_LINK_SECTION - * and %G_MENU_LINK_SUBMENU. + * The API of `GMenuModel` is very generic, with iterators for the + * attributes and links of an item, see + * [method@Gio.MenuModel.iterate_item_attributes] and + * [method@Gio.MenuModel.iterate_item_links]. The ‘standard’ attributes and + * link types have predefined names: `G_MENU_ATTRIBUTE_LABEL`, + * `G_MENU_ATTRIBUTE_ACTION`, `G_MENU_ATTRIBUTE_TARGET`, `G_MENU_LINK_SECTION` + * and `G_MENU_LINK_SUBMENU`. * - * Items in a #GMenuModel represent active controls if they refer to + * Items in a `GMenuModel` represent active controls if they refer to * an action that can get activated when the user interacts with the - * menu item. The reference to the action is encoded by the string id - * in the %G_MENU_ATTRIBUTE_ACTION attribute. An action id uniquely + * menu item. The reference to the action is encoded by the string ID + * in the `G_MENU_ATTRIBUTE_ACTION` attribute. An action ID uniquely * identifies an action in an action group. Which action group(s) provide * actions depends on the context in which the menu model is used. * E.g. when the model is exported as the application menu of a - * #GtkApplication, actions can be application-wide or window-specific - * (and thus come from two different action groups). By convention, the - * application-wide actions have names that start with "app.", while the - * names of window-specific actions start with "win.". + * [`GtkApplication`](https://docs.gtk.org/gtk4/class.Application.html), + * actions can be application-wide or window-specific (and thus come from + * two different action groups). By convention, the application-wide actions + * have names that start with `app.`, while the names of window-specific + * actions start with `win.`. * * While a wide variety of stateful actions is possible, the following * is the minimum that is expected to be supported by all users of exported @@ -119,7 +116,7 @@ * - an action with no parameter type and boolean state * - an action with string parameter type and string state * - * ## Stateless + * ## Stateless * * A stateless action typically corresponds to an ordinary menu item. * @@ -127,12 +124,12 @@ * * ## Boolean State * - * An action with a boolean state will most typically be used with a "toggle" - * or "switch" menu item. The state can be set directly, but activating the + * An action with a boolean state will most typically be used with a ‘toggle’ + * or ‘switch’ menu item. The state can be set directly, but activating the * action (with no parameter) results in the state being toggled. * * Selecting a toggle menu item will activate the action. The menu item should - * be rendered as "checked" when the state is true. + * be rendered as ‘checked’ when the state is true. * * ## String Parameter and State * @@ -144,15 +141,8 @@ * Radio menu items, in addition to being associated with the action, will * have a target value. Selecting that menu item will result in activation * of the action with the target value as the parameter. The menu item should - * be rendered as "selected" when the state of the action is equal to the + * be rendered as ‘selected’ when the state of the action is equal to the * target value of the menu item. - */ - -/** - * GMenuModel: - * - * #GMenuModel is an opaque structure type. You must access it using the - * functions below. * * Since: 2.32 */ diff --git a/gio/gmount.c b/gio/gmount.c index 75d2ce6..9bd8a7d 100644 --- a/gio/gmount.c +++ b/gio/gmount.c @@ -37,30 +37,29 @@ /** - * SECTION:gmount - * @short_description: Mount management - * @include: gio/gio.h - * @see_also: GVolume, GUnixMountEntry, GUnixMountPoint + * GMount: * - * The #GMount interface represents user-visible mounts. Note, when - * porting from GnomeVFS, #GMount is the moral equivalent of #GnomeVFSVolume. + * The `GMount` interface represents user-visible mounts. Note, when + * [porting from GnomeVFS](migrating-gnome-vfs.html), `GMount` is the moral + * equivalent of `GnomeVFSVolume`. * - * #GMount is a "mounted" filesystem that you can access. Mounted is in - * quotes because it's not the same as a unix mount, it might be a gvfs + * `GMount` is a ‘mounted’ filesystem that you can access. Mounted is in + * quotes because it’s not the same as a UNIX mount, it might be a GVFS * mount, but you can still access the files on it if you use GIO. Might or * might not be related to a volume object. * - * Unmounting a #GMount instance is an asynchronous operation. For - * more information about asynchronous operations, see #GAsyncResult - * and #GTask. To unmount a #GMount instance, first call - * g_mount_unmount_with_operation() with (at least) the #GMount instance and a - * #GAsyncReadyCallback. The callback will be fired when the - * operation has resolved (either with success or failure), and a - * #GAsyncResult structure will be passed to the callback. That - * callback should then call g_mount_unmount_with_operation_finish() with the #GMount - * and the #GAsyncResult data to see if the operation was completed - * successfully. If an @error is present when g_mount_unmount_with_operation_finish() - * is called, then it will be filled with any error information. + * Unmounting a `GMount` instance is an asynchronous operation. For + * more information about asynchronous operations, see [iface@Gio.AsyncResult] + * and [class@Gio.Task]. To unmount a `GMount` instance, first call + * [method@Gio.Mount.unmount_with_operation] with (at least) the `GMount` + * instance and a [type@Gio.AsyncReadyCallback]. The callback will be fired + * when the operation has resolved (either with success or failure), and a + * [iface@Gio.AsyncResult] structure will be passed to the callback. That + * callback should then call [method@Gio.Mount.unmount_with_operation_finish] + * with the `GMount` and the [iface@Gio.AsyncResult] data to see if the + * operation was completed successfully. If an `error` is present when + * [method@Gio.Mount.unmount_with_operation_finish] is called, then it will be + * filled with any error information. **/ typedef GMountIface GMountInterface; diff --git a/gio/gmountoperation.c b/gio/gmountoperation.c index d8f5449..1fd84af 100644 --- a/gio/gmountoperation.c +++ b/gio/gmountoperation.c @@ -31,27 +31,26 @@ /** - * SECTION:gmountoperation - * @short_description: Object used for authentication and user interaction - * @include: gio/gio.h + * GMountOperation: * - * #GMountOperation provides a mechanism for interacting with the user. + * `GMountOperation` provides a mechanism for interacting with the user. * It can be used for authenticating mountable operations, such as loop * mounting files, hard drive partitions or server locations. It can * also be used to ask the user questions or show a list of applications * preventing unmount or eject operations from completing. * - * Note that #GMountOperation is used for more than just #GMount - * objects – for example it is also used in g_drive_start() and - * g_drive_stop(). + * Note that `GMountOperation` is used for more than just [iface@Gio.Mount] + * objects – for example it is also used in [method@Gio.Drive.start] and + * [method@Gio.Drive.stop]. * * Users should instantiate a subclass of this that implements all the * various callbacks to show the required dialogs, such as - * #GtkMountOperation. If no user interaction is desired (for example - * when automounting filesystems at login time), usually %NULL can be - * passed, see each method taking a #GMountOperation for details. + * [`GtkMountOperation`](https://docs.gtk.org/gtk4/class.MountOperation.html). + * If no user interaction is desired (for example when automounting + * filesystems at login time), usually `NULL` can be passed, see each method + * taking a `GMountOperation` for details. * - * The term ‘TCRYPT’ is used to mean ‘compatible with TrueCrypt and VeraCrypt’. + * Throughout the API, the term ‘TCRYPT’ is used to mean ‘compatible with TrueCrypt and VeraCrypt’. * [TrueCrypt](https://en.wikipedia.org/wiki/TrueCrypt) is a discontinued system for * encrypting file containers, partitions or whole disks, typically used with Windows. * [VeraCrypt](https://www.veracrypt.fr/) is a maintained fork of TrueCrypt with various @@ -480,9 +479,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_USERNAME, - g_param_spec_string ("username", - P_("Username"), - P_("The user name"), + g_param_spec_string ("username", NULL, NULL, NULL, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -495,9 +492,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_PASSWORD, - g_param_spec_string ("password", - P_("Password"), - P_("The password"), + g_param_spec_string ("password", NULL, NULL, NULL, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -509,9 +504,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_ANONYMOUS, - g_param_spec_boolean ("anonymous", - P_("Anonymous"), - P_("Whether to use an anonymous user"), + g_param_spec_boolean ("anonymous", NULL, NULL, FALSE, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -523,9 +516,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_DOMAIN, - g_param_spec_string ("domain", - P_("Domain"), - P_("The domain of the mount operation"), + g_param_spec_string ("domain", NULL, NULL, NULL, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -537,9 +528,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_PASSWORD_SAVE, - g_param_spec_enum ("password-save", - P_("Password save"), - P_("How passwords should be saved"), + g_param_spec_enum ("password-save", NULL, NULL, G_TYPE_PASSWORD_SAVE, G_PASSWORD_SAVE_NEVER, G_PARAM_READWRITE| @@ -553,9 +542,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_CHOICE, - g_param_spec_int ("choice", - P_("Choice"), - P_("The users choice"), + g_param_spec_int ("choice", NULL, NULL, 0, G_MAXINT, 0, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -570,9 +557,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_IS_TCRYPT_HIDDEN_VOLUME, - g_param_spec_boolean ("is-tcrypt-hidden-volume", - P_("TCRYPT Hidden Volume"), - P_("Whether to unlock a TCRYPT hidden volume. See https://www.veracrypt.fr/en/Hidden%20Volume.html."), + g_param_spec_boolean ("is-tcrypt-hidden-volume", NULL, NULL, FALSE, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -590,9 +575,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_IS_TCRYPT_SYSTEM_VOLUME, - g_param_spec_boolean ("is-tcrypt-system-volume", - P_("TCRYPT System Volume"), - P_("Whether to unlock a TCRYPT system volume. Only supported for unlocking Windows system volumes. See https://www.veracrypt.fr/en/System%20Encryption.html."), + g_param_spec_boolean ("is-tcrypt-system-volume", NULL, NULL, FALSE, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); @@ -607,9 +590,7 @@ g_mount_operation_class_init (GMountOperationClass *klass) */ g_object_class_install_property (object_class, PROP_PIM, - g_param_spec_uint ("pim", - P_("PIM"), - P_("The VeraCrypt PIM value"), + g_param_spec_uint ("pim", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READWRITE| G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB)); diff --git a/gio/gmountoperation.h b/gio/gmountoperation.h index b763f0d..3302ec5 100644 --- a/gio/gmountoperation.h +++ b/gio/gmountoperation.h @@ -38,12 +38,6 @@ G_BEGIN_DECLS #define G_IS_MOUNT_OPERATION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_MOUNT_OPERATION)) #define G_MOUNT_OPERATION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_MOUNT_OPERATION, GMountOperationClass)) -/** - * GMountOperation: - * - * Class for providing authentication methods for mounting operations, - * such as mounting a file locally, or authenticating with a server. - **/ typedef struct _GMountOperationClass GMountOperationClass; typedef struct _GMountOperationPrivate GMountOperationPrivate; diff --git a/gio/gnativesocketaddress.c b/gio/gnativesocketaddress.c index 28b90a8..c2c47a1 100644 --- a/gio/gnativesocketaddress.c +++ b/gio/gnativesocketaddress.c @@ -31,19 +31,15 @@ #include "glibintl.h" -/** - * SECTION:gnativesocketaddress - * @short_description: Native GSocketAddress - * @include: gio/gio.h - * - * A socket address of some unknown native type. - */ - /** * GNativeSocketAddress: * - * A socket address, corresponding to a general struct - * sockadd address of a type not otherwise handled by glib. + * A socket address of some unknown native type. + * + * This corresponds to a general `struct sockaddr` of a type not otherwise + * handled by GLib. + * + * Since: 2.46 */ struct _GNativeSocketAddressPrivate diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c index a4ee538..adff705 100644 --- a/gio/gnetworkaddress.c +++ b/gio/gnetworkaddress.c @@ -46,11 +46,9 @@ #define HAPPY_EYEBALLS_RESOLUTION_DELAY_MS 50 /** - * SECTION:gnetworkaddress - * @short_description: A GSocketConnectable for resolving hostnames - * @include: gio/gio.h + * GNetworkAddress: * - * #GNetworkAddress provides an easy way to resolve a hostname and + * `GNetworkAddress` provides an easy way to resolve a hostname and * then attempt to connect to that host, handling the possibility of * multiple IP addresses and multiple address families. * @@ -58,17 +56,10 @@ * as this object is kept alive which may have unexpected results if * alive for too long. * - * See #GSocketConnectable for an example of using the connectable + * See [iface@Gio.SocketConnectable] for an example of using the connectable * interface. */ -/** - * GNetworkAddress: - * - * A #GSocketConnectable for resolving a hostname and connecting to - * that host. - */ - struct _GNetworkAddressPrivate { gchar *hostname; guint16 port; @@ -125,27 +116,43 @@ g_network_address_class_init (GNetworkAddressClass *klass) gobject_class->get_property = g_network_address_get_property; gobject_class->finalize = g_network_address_finalize; + /** + * GNetworkAddress:hostname: + * + * Hostname to resolve. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_HOSTNAME, - g_param_spec_string ("hostname", - P_("Hostname"), - P_("Hostname to resolve"), + g_param_spec_string ("hostname", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GNetworkAddress:port: + * + * Network port. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PORT, - g_param_spec_uint ("port", - P_("Port"), - P_("Network port"), + g_param_spec_uint ("port", NULL, NULL, 0, 65535, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GNetworkAddress:scheme: + * + * URI scheme. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_SCHEME, - g_param_spec_string ("scheme", - P_("Scheme"), - P_("URI Scheme"), + g_param_spec_string ("scheme", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gnetworking.c b/gio/gnetworking.c index d0c00c9..08346cd 100644 --- a/gio/gnetworking.c +++ b/gio/gnetworking.c @@ -25,31 +25,6 @@ #include "gnetworking.h" #include "gnetworkingprivate.h" -/** - * SECTION:gnetworking - * @title: gnetworking.h - * @short_description: System networking includes - * @include: gio/gnetworking.h - * - * The `` header can be included to get - * various low-level networking-related system headers, automatically - * taking care of certain portability issues for you. - * - * This can be used, for example, if you want to call setsockopt() - * on a #GSocket. - * - * Note that while WinSock has many of the same APIs as the - * traditional UNIX socket API, most of them behave at least slightly - * differently (particularly with respect to error handling). If you - * want your code to work under both UNIX and Windows, you will need - * to take these differences into account. - * - * Also, under GNU libc, certain non-portable functions are only visible - * in the headers if you define %_GNU_SOURCE before including them. Note - * that this symbol must be defined before including any headers, or it - * may not take effect. - */ - /** * g_networking_init: * diff --git a/gio/gnetworking.h.in b/gio/gnetworking.h.in index 3561239..3dddd90 100644 --- a/gio/gnetworking.h.in +++ b/gio/gnetworking.h.in @@ -49,6 +49,8 @@ #include @NAMESER_COMPAT_INCLUDE@ +#ifndef __GI_SCANNER__ + #ifndef T_SRV #define T_SRV 33 #endif @@ -71,6 +73,8 @@ #endif #endif +#endif /* !__GI_SCANNER__ */ + G_BEGIN_DECLS GIO_AVAILABLE_IN_2_36 diff --git a/gio/gnetworkmonitor.c b/gio/gnetworkmonitor.c index 37f2faa..5065041 100644 --- a/gio/gnetworkmonitor.c +++ b/gio/gnetworkmonitor.c @@ -31,24 +31,14 @@ #include "gtask.h" /** - * SECTION:gnetworkmonitor - * @title: GNetworkMonitor - * @short_description: Network status monitor - * @include: gio/gio.h + * GNetworkMonitor: * - * #GNetworkMonitor provides an easy-to-use cross-platform API + * `GNetworkMonitor` provides an easy-to-use cross-platform API * for monitoring network connectivity. On Linux, the available * implementations are based on the kernel's netlink interface and * on NetworkManager. * * There is also an implementation for use inside Flatpak sandboxes. - */ - -/** - * GNetworkMonitor: - * - * #GNetworkMonitor monitors the status of network connections and - * indicates when a possibly-user-visible change has occurred. * * Since: 2.32 */ @@ -94,7 +84,7 @@ static GNetworkMonitor *network_monitor_default_singleton = NULL; /* (owned) (a GNetworkMonitor * g_network_monitor_get_default (void) { - if (g_once_init_enter (&network_monitor_default_singleton)) + if (g_once_init_enter_pointer (&network_monitor_default_singleton)) { GNetworkMonitor *singleton; @@ -102,7 +92,7 @@ g_network_monitor_get_default (void) "GIO_USE_NETWORK_MONITOR", NULL); - g_once_init_leave (&network_monitor_default_singleton, singleton); + g_once_init_leave_pointer (&network_monitor_default_singleton, singleton); } return network_monitor_default_singleton; @@ -362,9 +352,7 @@ g_network_monitor_default_init (GNetworkMonitorInterface *iface) * Since: 2.32 */ g_object_interface_install_property (iface, - g_param_spec_boolean ("network-available", - P_("Network available"), - P_("Whether the network is available"), + g_param_spec_boolean ("network-available", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -397,9 +385,7 @@ g_network_monitor_default_init (GNetworkMonitorInterface *iface) * Since: 2.46 */ g_object_interface_install_property (iface, - g_param_spec_boolean ("network-metered", - P_("Network metered"), - P_("Whether the network is metered"), + g_param_spec_boolean ("network-metered", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -414,9 +400,7 @@ g_network_monitor_default_init (GNetworkMonitorInterface *iface) * Since: 2.44 */ g_object_interface_install_property (iface, - g_param_spec_enum ("connectivity", - P_("Network connectivity"), - P_("Level of network connectivity"), + g_param_spec_enum ("connectivity", NULL, NULL, G_TYPE_NETWORK_CONNECTIVITY, G_NETWORK_CONNECTIVITY_FULL, G_PARAM_READABLE | diff --git a/gio/gnetworkmonitorbase.c b/gio/gnetworkmonitorbase.c index 4654d22..78e2634 100644 --- a/gio/gnetworkmonitorbase.c +++ b/gio/gnetworkmonitorbase.c @@ -285,8 +285,9 @@ can_reach_async_got_address (GObject *object, else { /* Resolved all addresses, none matched */ - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE, - _("Host unreachable")); + g_task_return_new_error_literal (task, G_IO_ERROR, + G_IO_ERROR_HOST_UNREACHABLE, + _("Host unreachable")); g_object_unref (task); return; } @@ -321,8 +322,8 @@ g_network_monitor_base_can_reach_async (GNetworkMonitor *monitor, if (g_hash_table_size (G_NETWORK_MONITOR_BASE (monitor)->priv->networks) == 0) { - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_NETWORK_UNREACHABLE, - _("Network unreachable")); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_NETWORK_UNREACHABLE, + _("Network unreachable")); g_object_unref (task); return; } diff --git a/gio/gnetworkmonitorportal.c b/gio/gnetworkmonitorportal.c index bc51178..f48d3e6 100644 --- a/gio/gnetworkmonitorportal.c +++ b/gio/gnetworkmonitorportal.c @@ -561,9 +561,9 @@ can_reach_done (GObject *source, if (reachable) g_task_return_boolean (task, TRUE); else - g_task_return_new_error (task, - G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE, - "Can't reach host"); + g_task_return_new_error_literal (task, + G_IO_ERROR, G_IO_ERROR_HOST_UNREACHABLE, + "Can't reach host"); g_object_unref (task); } diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c index dac0814..39c9df1 100644 --- a/gio/gnetworkservice.c +++ b/gio/gnetworkservice.c @@ -43,28 +43,19 @@ /** - * SECTION:gnetworkservice - * @short_description: A GSocketConnectable for resolving SRV records - * @include: gio/gio.h + * GNetworkService: * - * Like #GNetworkAddress does with hostnames, #GNetworkService + * Like [class@Gio.NetworkAddress] does with hostnames, `GNetworkService` * provides an easy way to resolve a SRV record, and then attempt to * connect to one of the hosts that implements that service, handling * service priority/weighting, multiple IP addresses, and multiple * address families. * - * See #GSrvTarget for more information about SRV records, and see - * #GSocketConnectable for an example of using the connectable + * See [struct@Gio.SrvTarget] for more information about SRV records, and see + * [iface@Gio.SocketConnectable] for an example of using the connectable * interface. */ -/** - * GNetworkService: - * - * A #GSocketConnectable for resolving a SRV record and connecting to - * that service. - */ - struct _GNetworkServicePrivate { gchar *service, *protocol, *domain, *scheme; @@ -123,34 +114,57 @@ g_network_service_class_init (GNetworkServiceClass *klass) gobject_class->get_property = g_network_service_get_property; gobject_class->finalize = g_network_service_finalize; + /** + * GNetworkService:service: + * + * Service name, for example `ldap`. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_SERVICE, - g_param_spec_string ("service", - P_("Service"), - P_("Service name, eg \"ldap\""), + g_param_spec_string ("service", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GNetworkService:protocol: + * + * Network protocol, for example `tcp`. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PROTOCOL, - g_param_spec_string ("protocol", - P_("Protocol"), - P_("Network protocol, eg \"tcp\""), + g_param_spec_string ("protocol", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GNetworkService:domain: + * + * Network domain, for example `example.com`. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_DOMAIN, - g_param_spec_string ("domain", - P_("Domain"), - P_("Network domain, eg, \"example.com\""), + g_param_spec_string ("domain", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GNetworkService:scheme: + * + * Network scheme (default is to use service). + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_DOMAIN, - g_param_spec_string ("scheme", - P_("Scheme"), - P_("Network scheme (default is to use service)"), + g_param_spec_string ("scheme", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gnotification.c b/gio/gnotification.c index abe68a2..0e48ef0 100644 --- a/gio/gnotification.c +++ b/gio/gnotification.c @@ -28,63 +28,53 @@ #include "gioenumtypes.h" /** - * SECTION:gnotification - * @short_description: User Notifications (pop up messages) - * @include: gio/gio.h + * GNotification: * - * #GNotification is a mechanism for creating a notification to be shown - * to the user -- typically as a pop-up notification presented by the + * `GNotification` is a mechanism for creating a notification to be shown + * to the user — typically as a pop-up notification presented by the * desktop environment shell. * - * The key difference between #GNotification and other similar APIs is + * The key difference between `GNotification` and other similar APIs is * that, if supported by the desktop environment, notifications sent - * with #GNotification will persist after the application has exited, + * with `GNotification` will persist after the application has exited, * and even across system reboots. * * Since the user may click on a notification while the application is - * not running, applications using #GNotification should be able to be - * started as a D-Bus service, using #GApplication. + * not running, applications using `GNotification` should be able to be + * started as a D-Bus service, using [class@Gio.Application]. * - * In order for #GNotification to work, the application must have installed + * In order for `GNotification` to work, the application must have installed * a `.desktop` file. For example: - * |[ - * [Desktop Entry] - * Name=Test Application - * Comment=Description of what Test Application does - * Exec=gnome-test-application - * Icon=org.gnome.TestApplication - * Terminal=false - * Type=Application - * Categories=GNOME;GTK;TestApplication Category; - * StartupNotify=true - * DBusActivatable=true - * X-GNOME-UsesNotifications=true - * ]| + * ``` + * [Desktop Entry] + * Name=Test Application + * Comment=Description of what Test Application does + * Exec=gnome-test-application + * Icon=org.gnome.TestApplication + * Terminal=false + * Type=Application + * Categories=GNOME;GTK;TestApplication Category; + * StartupNotify=true + * DBusActivatable=true + * X-GNOME-UsesNotifications=true + * ``` * * The `X-GNOME-UsesNotifications` key indicates to GNOME Control Center * that this application uses notifications, so it can be listed in the * Control Center’s ‘Notifications’ panel. * * The `.desktop` file must be named as `org.gnome.TestApplication.desktop`, - * where `org.gnome.TestApplication` is the ID passed to g_application_new(). + * where `org.gnome.TestApplication` is the ID passed to + * [ctor@Gio.Application.new]. * * User interaction with a notification (either the default action, or * buttons) must be associated with actions on the application (ie: - * "app." actions). It is not possible to route user interaction + * `app.` actions). It is not possible to route user interaction * through the notification itself, because the object will not exist if * the application is autostarted as a result of a notification being * clicked. * - * A notification can be sent with g_application_send_notification(). - * - * Since: 2.40 - **/ - -/** - * GNotification: - * - * This structure type is private and should only be accessed using the - * public APIs. + * A notification can be sent with [method@Gio.Application.send_notification]. * * Since: 2.40 **/ diff --git a/gio/gopenuriportal.c b/gio/gopenuriportal.c index c0f44a9..083d271 100644 --- a/gio/gopenuriportal.c +++ b/gio/gopenuriportal.c @@ -182,11 +182,11 @@ response_received (GDBusConnection *connection, g_task_return_boolean (task, TRUE); break; case XDG_DESKTOP_PORTAL_CANCELLED: - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, "Launch cancelled"); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_CANCELLED, "Launch cancelled"); break; case XDG_DESKTOP_PORTAL_FAILED: default: - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "Launch failed"); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_FAILED, "Launch failed"); break; } diff --git a/gio/gosxappinfo.m b/gio/gosxappinfo.m index 60b0886..50b08e0 100644 --- a/gio/gosxappinfo.m +++ b/gio/gosxappinfo.m @@ -33,12 +33,10 @@ #import /** - * SECTION:gosxappinfo - * @title: GOsxAppInfo - * @short_description: Application information from NSBundles - * @include: gio/gosxappinfo.h + * GOsxAppInfo: * - * #GOsxAppInfo is an implementation of #GAppInfo based on NSBundle information. + * `GOsxAppInfo` is an implementation of [iface@Gio.AppInfo] based on `NSBundle` + * information. * * Note that `` is unique to OSX. */ @@ -46,11 +44,6 @@ static void g_osx_app_info_iface_init (GAppInfoIface *iface); static const char *g_osx_app_info_get_id (GAppInfo *appinfo); -/** - * GOsxAppInfo: - * - * Information about an installed application from a NSBundle. - */ struct _GOsxAppInfo { GObject parent_instance; diff --git a/gio/goutputstream.c b/gio/goutputstream.c index 3674a92..1348208 100644 --- a/gio/goutputstream.c +++ b/gio/goutputstream.c @@ -33,21 +33,25 @@ #include "gpollableoutputstream.h" /** - * SECTION:goutputstream - * @short_description: Base class for implementing streaming output - * @include: gio/gio.h + * GOutputStream: * - * #GOutputStream has functions to write to a stream (g_output_stream_write()), - * to close a stream (g_output_stream_close()) and to flush pending writes - * (g_output_stream_flush()). + * `GOutputStream` is a base class for implementing streaming output. + * + * It has functions to write to a stream ([method@Gio.OutputStream.write]), + * to close a stream ([method@Gio.OutputStream.close]) and to flush pending + * writes ([method@Gio.OutputStream.flush]). * * To copy the content of an input stream to an output stream without - * manually handling the reads and writes, use g_output_stream_splice(). + * manually handling the reads and writes, use [method@Gio.OutputStream.splice]. * - * See the documentation for #GIOStream for details of thread safety of - * streaming APIs. + * See the documentation for [class@Gio.IOStream] for details of thread safety + * of streaming APIs. * * All of these functions have async variants too. + * + * All classes derived from `GOutputStream` *should* implement synchronous + * writing, splicing, flushing and closing streams, but *may* implement + * asynchronous versions. **/ struct _GOutputStreamPrivate { @@ -171,7 +175,7 @@ g_output_stream_init (GOutputStream *stream) } /** - * g_output_stream_write: + * g_output_stream_write: (virtual write_fn) * @stream: a #GOutputStream. * @buffer: (array length=count) (element-type guint8): the buffer containing the data to write. * @count: the number of bytes to write @@ -199,8 +203,6 @@ g_output_stream_init (GOutputStream *stream) * * On error -1 is returned and @error is set accordingly. * - * Virtual: write_fn - * * Returns: Number of bytes written, or -1 on error **/ gssize @@ -320,7 +322,7 @@ g_output_stream_write_all (GOutputStream *stream, } /** - * g_output_stream_writev: + * g_output_stream_writev: (virtual writev_fn) * @stream: a #GOutputStream. * @vectors: (array length=n_vectors): the buffer containing the #GOutputVectors to write. * @n_vectors: the number of vectors to write @@ -353,8 +355,6 @@ g_output_stream_write_all (GOutputStream *stream, * are exceeded. For example, when writing to a local file on UNIX platforms, * the aggregate buffer size must not exceed %G_MAXSSIZE bytes. * - * Virtual: writev_fn - * * Returns: %TRUE on success, %FALSE if there was an error * * Since: 2.60 @@ -1764,9 +1764,9 @@ g_output_stream_splice_async (GOutputStream *stream, if (g_input_stream_is_closed (source)) { - g_task_return_new_error (task, - G_IO_ERROR, G_IO_ERROR_CLOSED, - _("Source stream is already closed")); + g_task_return_new_error_literal (task, + G_IO_ERROR, G_IO_ERROR_CLOSED, + _("Source stream is already closed")); g_object_unref (task); return; } diff --git a/gio/goutputstream.h b/gio/goutputstream.h index b5fafe9..2ee1cbb 100644 --- a/gio/goutputstream.h +++ b/gio/goutputstream.h @@ -38,15 +38,6 @@ G_BEGIN_DECLS #define G_IS_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_OUTPUT_STREAM)) #define G_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_OUTPUT_STREAM, GOutputStreamClass)) -/** - * GOutputStream: - * - * Base class for writing output. - * - * All classes derived from GOutputStream should implement synchronous - * writing, splicing, flushing and closing streams, but may implement - * asynchronous versions. - **/ typedef struct _GOutputStreamClass GOutputStreamClass; typedef struct _GOutputStreamPrivate GOutputStreamPrivate; diff --git a/gio/gpermission.c b/gio/gpermission.c index 957e57f..da82d4b 100644 --- a/gio/gpermission.c +++ b/gio/gpermission.c @@ -31,13 +31,9 @@ /** - * SECTION:gpermission - * @title: GPermission - * @short_description: An object representing the permission - * to perform a certain action - * @include: gio/gio.h + * GPermission: * - * A #GPermission represents the status of the caller's permission to + * A `GPermission` represents the status of the caller’s permission to * perform a certain action. * * You can query if the action is currently allowed and if it is @@ -47,20 +43,13 @@ * There is also an API to actually acquire the permission and one to * release it. * - * As an example, a #GPermission might represent the ability for the - * user to write to a #GSettings object. This #GPermission object could - * then be used to decide if it is appropriate to show a "Click here to - * unlock" button in a dialog and to provide the mechanism to invoke + * As an example, a `GPermission` might represent the ability for the + * user to write to a [class@Gio.Settings] object. This `GPermission` object + * could then be used to decide if it is appropriate to show a “Click here to + * unlock” button in a dialog and to provide the mechanism to invoke * when that button is clicked. **/ -/** - * GPermission: - * - * #GPermission is an opaque data structure and can only be accessed - * using the following functions. - **/ - struct _GPermissionPrivate { gboolean allowed; @@ -444,9 +433,7 @@ g_permission_class_init (GPermissionClass *class) * @permission represents the permission to perform. */ g_object_class_install_property (object_class, PROP_ALLOWED, - g_param_spec_boolean ("allowed", - P_("Is allowed"), - P_("If the caller is allowed to perform the action"), + g_param_spec_boolean ("allowed", NULL, NULL, FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); @@ -457,9 +444,7 @@ g_permission_class_init (GPermissionClass *class) * g_permission_acquire(). */ g_object_class_install_property (object_class, PROP_CAN_ACQUIRE, - g_param_spec_boolean ("can-acquire", - P_("Can acquire"), - P_("If calling g_permission_acquire() makes sense"), + g_param_spec_boolean ("can-acquire", NULL, NULL, FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); @@ -470,9 +455,7 @@ g_permission_class_init (GPermissionClass *class) * g_permission_release(). */ g_object_class_install_property (object_class, PROP_CAN_RELEASE, - g_param_spec_boolean ("can-release", - P_("Can release"), - P_("If calling g_permission_release() makes sense"), + g_param_spec_boolean ("can-release", NULL, NULL, FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE)); } diff --git a/gio/gpollableinputstream.c b/gio/gpollableinputstream.c index 3f76cb6..a57d5ab 100644 --- a/gio/gpollableinputstream.c +++ b/gio/gpollableinputstream.c @@ -27,19 +27,16 @@ #include "glibintl.h" /** - * SECTION:gpollableinputstream - * @short_description: Interface for pollable input streams - * @include: gio/gio.h - * @see_also: #GInputStream, #GPollableOutputStream, #GFileDescriptorBased + * GPollableInputStream: * - * #GPollableInputStream is implemented by #GInputStreams that + * `GPollableInputStream` is implemented by [class@Gio.InputStream]s that * can be polled for readiness to read. This can be used when * interfacing with a non-GIO API that expects * UNIX-file-descriptor-style asynchronous I/O rather than GIO-style. * - * Some classes may implement #GPollableInputStream but have only certain - * instances of that class be pollable. If g_pollable_input_stream_can_poll() - * returns %FALSE, then the behavior of other #GPollableInputStream methods is + * Some classes may implement `GPollableInputStream` but have only certain + * instances of that class be pollable. If [method@Gio.PollableInputStream.can_poll] + * returns false, then the behavior of other `GPollableInputStream` methods is * undefined. * * Since: 2.28 @@ -170,7 +167,7 @@ g_pollable_input_stream_default_read_nonblocking (GPollableInputStream *stream, } /** - * g_pollable_input_stream_read_nonblocking: + * g_pollable_input_stream_read_nonblocking: (virtual read_nonblocking) * @stream: a #GPollableInputStream * @buffer: (array length=count) (element-type guint8) (out caller-allocates): a * buffer to read data into (which should be at least @count bytes long). @@ -193,7 +190,6 @@ g_pollable_input_stream_default_read_nonblocking (GPollableInputStream *stream, * The behaviour of this method is undefined if * g_pollable_input_stream_can_poll() returns %FALSE for @stream. * - * Virtual: read_nonblocking * Returns: the number of bytes read, or -1 on error (including * %G_IO_ERROR_WOULD_BLOCK). */ diff --git a/gio/gpollableinputstream.h b/gio/gpollableinputstream.h index 7b65947..924b52e 100644 --- a/gio/gpollableinputstream.h +++ b/gio/gpollableinputstream.h @@ -34,13 +34,6 @@ G_BEGIN_DECLS #define G_IS_POLLABLE_INPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_POLLABLE_INPUT_STREAM)) #define G_POLLABLE_INPUT_STREAM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_POLLABLE_INPUT_STREAM, GPollableInputStreamInterface)) -/** - * GPollableInputStream: - * - * An interface for a #GInputStream that can be polled for readability. - * - * Since: 2.28 - */ typedef struct _GPollableInputStreamInterface GPollableInputStreamInterface; /** diff --git a/gio/gpollableoutputstream.c b/gio/gpollableoutputstream.c index f33267a..f36ac13 100644 --- a/gio/gpollableoutputstream.c +++ b/gio/gpollableoutputstream.c @@ -28,19 +28,16 @@ #include "glibintl.h" /** - * SECTION:gpollableoutputstream - * @short_description: Interface for pollable output streams - * @include: gio/gio.h - * @see_also: #GOutputStream, #GFileDescriptorBased, #GPollableInputStream + * GPollableOutputStream: * - * #GPollableOutputStream is implemented by #GOutputStreams that + * `GPollableOutputStream` is implemented by [class@Gio.OutputStream]s that * can be polled for readiness to write. This can be used when * interfacing with a non-GIO API that expects * UNIX-file-descriptor-style asynchronous I/O rather than GIO-style. * - * Some classes may implement #GPollableOutputStream but have only certain - * instances of that class be pollable. If g_pollable_output_stream_can_poll() - * returns %FALSE, then the behavior of other #GPollableOutputStream methods is + * Some classes may implement `GPollableOutputStream` but have only certain + * instances of that class be pollable. If [method@Gio.PollableOutputStream.can_poll] + * returns false, then the behavior of other `GPollableOutputStream` methods is * undefined. * * Since: 2.28 @@ -238,7 +235,7 @@ g_pollable_output_stream_default_writev_nonblocking (GPollableOutputStream *str } /** - * g_pollable_output_stream_write_nonblocking: + * g_pollable_output_stream_write_nonblocking: (virtual write_nonblocking) * @stream: a #GPollableOutputStream * @buffer: (array length=count) (element-type guint8): a buffer to write * data from @@ -265,7 +262,6 @@ g_pollable_output_stream_default_writev_nonblocking (GPollableOutputStream *str * The behaviour of this method is undefined if * g_pollable_output_stream_can_poll() returns %FALSE for @stream. * - * Virtual: write_nonblocking * Returns: the number of bytes written, or -1 on error (including * %G_IO_ERROR_WOULD_BLOCK). */ @@ -307,7 +303,7 @@ g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream, } /** - * g_pollable_output_stream_writev_nonblocking: + * g_pollable_output_stream_writev_nonblocking: (virtual writev_nonblocking) * @stream: a #GPollableOutputStream * @vectors: (array length=n_vectors): the buffer containing the #GOutputVectors to write. * @n_vectors: the number of vectors to write @@ -336,8 +332,6 @@ g_pollable_output_stream_write_nonblocking (GPollableOutputStream *stream, * The behaviour of this method is undefined if * g_pollable_output_stream_can_poll() returns %FALSE for @stream. * - * Virtual: writev_nonblocking - * * Returns: %@G_POLLABLE_RETURN_OK on success, %G_POLLABLE_RETURN_WOULD_BLOCK * if the stream is not currently writable (and @error is *not* set), or * %G_POLLABLE_RETURN_FAILED if there was an error in which case @error will diff --git a/gio/gpollableoutputstream.h b/gio/gpollableoutputstream.h index a98bfa2..e20c2f3 100644 --- a/gio/gpollableoutputstream.h +++ b/gio/gpollableoutputstream.h @@ -34,13 +34,6 @@ G_BEGIN_DECLS #define G_IS_POLLABLE_OUTPUT_STREAM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_POLLABLE_OUTPUT_STREAM)) #define G_POLLABLE_OUTPUT_STREAM_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_POLLABLE_OUTPUT_STREAM, GPollableOutputStreamInterface)) -/** - * GPollableOutputStream: - * - * An interface for a #GOutputStream that can be polled for writeability. - * - * Since: 2.28 - */ typedef struct _GPollableOutputStreamInterface GPollableOutputStreamInterface; /** diff --git a/gio/gpollableutils.c b/gio/gpollableutils.c index 376a1cf..214b437 100644 --- a/gio/gpollableutils.c +++ b/gio/gpollableutils.c @@ -26,15 +26,6 @@ #include "gasynchelper.h" #include "glibintl.h" -/** - * SECTION:gpollableutils - * @short_description: Utilities for pollable streams - * @include: gio/gio.h - * - * Utility functions for #GPollableInputStream and - * #GPollableOutputStream implementations. - */ - typedef struct { GSource source; diff --git a/gio/gportalsupport.c b/gio/gportalsupport.c index 7e1da22..b002e93 100644 --- a/gio/gportalsupport.c +++ b/gio/gportalsupport.c @@ -125,7 +125,7 @@ sandbox_info_read (void) { const char *var; - var = g_getenv ("GTK_USE_PORTAL"); + var = g_getenv ("GIO_USE_PORTALS"); if (var && var[0] == '1') use_portal = TRUE; network_available = TRUE; diff --git a/gio/gpowerprofilemonitor.c b/gio/gpowerprofilemonitor.c index 9c22411..12f7dd6 100644 --- a/gio/gpowerprofilemonitor.c +++ b/gio/gpowerprofilemonitor.c @@ -32,15 +32,12 @@ #include "gtask.h" /** - * SECTION:gpowerprofilemonitor - * @title: GPowerProfileMonitor - * @short_description: Power profile monitor - * @include: gio/gio.h + * GPowerProfileMonitor: * - * #GPowerProfileMonitor makes it possible for applications as well as OS components - * to monitor system power profiles and act upon them. It currently only exports - * whether the system is in “Power Saver” mode (known as “Low Power” mode on - * some systems). + * `GPowerProfileMonitor` makes it possible for applications as well as OS + * components to monitor system power profiles and act upon them. It currently + * only exports whether the system is in “Power Saver” mode (known as + * “Low Power” mode on some systems). * * When in “Low Power” mode, it is recommended that applications: * - disable automatic downloads; @@ -57,17 +54,9 @@ * or activity at all), `sysprof` to inspect CPU usage, and `intel_gpu_time` to * profile GPU usage. * - * Don't forget to disconnect the #GPowerProfileMonitor::notify::power-saver-enabled - * signal, and unref the #GPowerProfileMonitor itself when exiting. - * - * Since: 2.70 - */ - -/** - * GPowerProfileMonitor: - * - * #GPowerProfileMonitor monitors system power profile and notifies on - * changes. + * Don’t forget to disconnect the [signal@GObject.Object::notify] signal for + * [property@Gio.PowerProfileMonitor:power-saver-enabled], and unref the + * `GPowerProfileMonitor` itself when exiting. * * Since: 2.70 */ @@ -135,9 +124,7 @@ g_power_profile_monitor_default_init (GPowerProfileMonitorInterface *iface) * Since: 2.70 */ g_object_interface_install_property (iface, - g_param_spec_boolean ("power-saver-enabled", - "power-saver-enabled", - "Power Saver Enabled", + g_param_spec_boolean ("power-saver-enabled", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY)); } diff --git a/gio/gpropertyaction.c b/gio/gpropertyaction.c index 52eae84..6b671f5 100644 --- a/gio/gpropertyaction.c +++ b/gio/gpropertyaction.c @@ -28,17 +28,14 @@ #include "glibintl.h" /** - * SECTION:gpropertyaction - * @title: GPropertyAction - * @short_description: A GAction reflecting a GObject property - * @include: gio/gio.h + * GPropertyAction: * - * A #GPropertyAction is a way to get a #GAction with a state value - * reflecting and controlling the value of a #GObject property. + * A `GPropertyAction` is a way to get a [iface@Gio.Action] with a state value + * reflecting and controlling the value of a [class@GObject.Object] property. * * The state of the action will correspond to the value of the property. * Changing it will change the property (assuming the requested value - * matches the requirements as specified in the #GParamSpec). + * matches the requirements as specified in the [type@GObject.ParamSpec]). * * Only the most common types are presently supported. Booleans are * mapped to booleans, strings to strings, signed/unsigned integers to @@ -46,16 +43,16 @@ * * If the property is an enum then the state will be string-typed and * conversion will automatically be performed between the enum value and - * "nick" string as per the #GEnumValue table. + * ‘nick’ string as per the [type@GObject.EnumValue] table. * * Flags types are not currently supported. * * Properties of object types, boxed types and pointer types are not * supported and probably never will be. * - * Properties of #GVariant types are not currently supported. + * Properties of [type@GLib.Variant] types are not currently supported. * - * If the property is boolean-valued then the action will have a NULL + * If the property is boolean-valued then the action will have a `NULL` * parameter type, and activating the action (with no parameter) will * toggle the value of the property. * @@ -64,26 +61,27 @@ * * The general idea here is to reduce the number of locations where a * particular piece of state is kept (and therefore has to be synchronised - * between). #GPropertyAction does not have a separate state that is kept - * in sync with the property value -- its state is the property value. + * between). `GPropertyAction` does not have a separate state that is kept + * in sync with the property value — its state is the property value. * - * For example, it might be useful to create a #GAction corresponding to - * the "visible-child-name" property of a #GtkStack so that the current - * page can be switched from a menu. The active radio indication in the - * menu is then directly determined from the active page of the - * #GtkStack. + * For example, it might be useful to create a [iface@Gio.Action] corresponding + * to the `visible-child-name` property of a [`GtkStack`](https://docs.gtk.org/gtk4/class.Stack.html) + * so that the current page can be switched from a menu. The active radio + * indication in the menu is then directly determined from the active page of + * the `GtkStack`. * - * An anti-example would be binding the "active-id" property on a - * #GtkComboBox. This is because the state of the combobox itself is - * probably uninteresting and is actually being used to control - * something else. + * An anti-example would be binding the `active-id` property on a + * [`GtkComboBox`](https://docs.gtk.org/gtk4/class.ComboBox.html). This is + * because the state of the combo box itself is probably uninteresting and is + * actually being used to control something else. * - * Another anti-example would be to bind to the "visible-child-name" - * property of a #GtkStack if this value is actually stored in - * #GSettings. In that case, the real source of the value is - * #GSettings. If you want a #GAction to control a setting stored in - * #GSettings, see g_settings_create_action() instead, and possibly - * combine its use with g_settings_bind(). + * Another anti-example would be to bind to the `visible-child-name` + * property of a [`GtkStack`](https://docs.gtk.org/gtk4/class.Stack.html) if + * this value is actually stored in [class@Gio.Settings]. In that case, the + * real source of the value is* [class@Gio.Settings]. If you want + * a [iface@Gio.Action] to control a setting stored in [class@Gio.Settings], + * see [method@Gio.Settings.create_action] instead, and possibly combine its + * use with [method@Gio.Settings.bind]. * * Since: 2.38 **/ @@ -98,14 +96,6 @@ struct _GPropertyAction gboolean invert_boolean; }; -/** - * GPropertyAction: - * - * This type is opaque. - * - * Since: 2.38 - **/ - typedef GObjectClass GPropertyActionClass; static void g_property_action_iface_init (GActionInterface *iface); @@ -478,9 +468,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_NAME, - g_param_spec_string ("name", - P_("Action Name"), - P_("The name used to invoke the action"), + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -495,9 +483,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_PARAMETER_TYPE, - g_param_spec_boxed ("parameter-type", - P_("Parameter Type"), - P_("The type of GVariant passed to activate()"), + g_param_spec_boxed ("parameter-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -513,9 +499,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_ENABLED, - g_param_spec_boolean ("enabled", - P_("Enabled"), - P_("If the action can be activated"), + g_param_spec_boolean ("enabled", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -529,9 +513,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_STATE_TYPE, - g_param_spec_boxed ("state-type", - P_("State Type"), - P_("The type of the state kept by the action"), + g_param_spec_boxed ("state-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -544,9 +526,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_STATE, - g_param_spec_variant ("state", - P_("State"), - P_("The state the action is in"), + g_param_spec_variant ("state", NULL, NULL, G_VARIANT_TYPE_ANY, NULL, G_PARAM_READABLE | @@ -562,9 +542,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_OBJECT, - g_param_spec_object ("object", - P_("Object"), - P_("The object with the property to wrap"), + g_param_spec_object ("object", NULL, NULL, G_TYPE_OBJECT, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -581,9 +559,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.38 **/ g_object_class_install_property (object_class, PROP_PROPERTY_NAME, - g_param_spec_string ("property-name", - P_("Property name"), - P_("The name of the property to wrap"), + g_param_spec_string ("property-name", NULL, NULL, NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -598,9 +574,7 @@ g_property_action_class_init (GPropertyActionClass *class) * Since: 2.46 */ g_object_class_install_property (object_class, PROP_INVERT_BOOLEAN, - g_param_spec_boolean ("invert-boolean", - P_("Invert boolean"), - P_("Whether to invert the value of a boolean property"), + g_param_spec_boolean ("invert-boolean", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gproxy.c b/gio/gproxy.c index 40ba78f..31d3224 100644 --- a/gio/gproxy.c +++ b/gio/gproxy.c @@ -29,16 +29,14 @@ #include "glibintl.h" /** - * SECTION:gproxy - * @short_description: Interface for proxy handling - * @include: gio/gio.h + * GProxy: * - * A #GProxy handles connecting to a remote host via a given type of - * proxy server. It is implemented by the 'gio-proxy' extension point. + * A `GProxy` handles connecting to a remote host via a given type of + * proxy server. It is implemented by the `gio-proxy` extension point. * The extensions are named after their proxy protocol name. As an * example, a SOCKS5 proxy implementation can be retrieved with the - * name 'socks5' using the function - * g_io_extension_point_get_extension_by_name(). + * name `socks5` using the function + * [method@Gio.IOExtensionPoint.get_extension_by_name]. * * Since: 2.26 **/ diff --git a/gio/gproxy.h b/gio/gproxy.h index de82410..9fcf7cc 100644 --- a/gio/gproxy.h +++ b/gio/gproxy.h @@ -48,13 +48,6 @@ G_BEGIN_DECLS */ #define G_PROXY_EXTENSION_POINT_NAME "gio-proxy" -/** - * GProxy: - * - * Interface that handles proxy connection and payload. - * - * Since: 2.26 - */ typedef struct _GProxyInterface GProxyInterface; /** diff --git a/gio/gproxyaddress.c b/gio/gproxyaddress.c index 764e6f5..690dc7b 100644 --- a/gio/gproxyaddress.c +++ b/gio/gproxyaddress.c @@ -29,21 +29,13 @@ #include "gproxyaddress.h" #include "glibintl.h" -/** - * SECTION:gproxyaddress - * @short_description: An internet address with proxy information - * @include: gio/gio.h - * - * Support for proxied #GInetSocketAddress. - */ - /** * GProxyAddress: * - * A #GInetSocketAddress representing a connection via a proxy server + * A [class@Gio.InetSocketAddress] representing a connection via a proxy server. * * Since: 2.26 - **/ + */ /** * GProxyAddressClass: @@ -194,31 +186,46 @@ g_proxy_address_class_init (GProxyAddressClass *klass) gobject_class->set_property = g_proxy_address_set_property; gobject_class->get_property = g_proxy_address_get_property; + /** + * GProxyAddress:protocol: + * + * The proxy protocol. + * + * Since: 2.26 + */ g_object_class_install_property (gobject_class, PROP_PROTOCOL, - g_param_spec_string ("protocol", - P_("Protocol"), - P_("The proxy protocol"), + g_param_spec_string ("protocol", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GProxyAddress:username: + * + * The proxy username. + * + * Since: 2.26 + */ g_object_class_install_property (gobject_class, PROP_USERNAME, - g_param_spec_string ("username", - P_("Username"), - P_("The proxy username"), + g_param_spec_string ("username", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GProxyAddress:password: + * + * The proxy password. + * + * Since: 2.26 + */ g_object_class_install_property (gobject_class, PROP_PASSWORD, - g_param_spec_string ("password", - P_("Password"), - P_("The proxy password"), + g_param_spec_string ("password", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -234,29 +241,37 @@ g_proxy_address_class_init (GProxyAddressClass *klass) */ g_object_class_install_property (gobject_class, PROP_DESTINATION_PROTOCOL, - g_param_spec_string ("destination-protocol", - P_("Destination Protocol"), - P_("The proxy destination protocol"), + g_param_spec_string ("destination-protocol", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GProxyAddress:destination-hostname: + * + * The proxy destination hostname. + * + * Since: 2.26 + */ g_object_class_install_property (gobject_class, PROP_DESTINATION_HOSTNAME, - g_param_spec_string ("destination-hostname", - P_("Destination Hostname"), - P_("The proxy destination hostname"), + g_param_spec_string ("destination-hostname", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GProxyAddress:destination-port: + * + * The proxy destination port. + * + * Since: 2.26 + */ g_object_class_install_property (gobject_class, PROP_DESTINATION_PORT, - g_param_spec_uint ("destination-port", - P_("Destination Port"), - P_("The proxy destination port"), + g_param_spec_uint ("destination-port", NULL, NULL, 0, 65535, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -272,9 +287,7 @@ g_proxy_address_class_init (GProxyAddressClass *klass) */ g_object_class_install_property (gobject_class, PROP_URI, - g_param_spec_string ("uri", - P_("URI"), - P_("The proxy’s URI"), + g_param_spec_string ("uri", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | diff --git a/gio/gproxyaddressenumerator.c b/gio/gproxyaddressenumerator.c index 98987f2..0d1539a 100644 --- a/gio/gproxyaddressenumerator.c +++ b/gio/gproxyaddressenumerator.c @@ -42,19 +42,18 @@ #include "gsocketconnectable.h" /** - * SECTION:gproxyaddressenumerator - * @short_description: Proxy wrapper enumerator for socket addresses - * @include: gio/gio.h + * GProxyAddressEnumerator: * - * #GProxyAddressEnumerator is a wrapper around #GSocketAddressEnumerator which - * takes the #GSocketAddress instances returned by the #GSocketAddressEnumerator - * and wraps them in #GProxyAddress instances, using the given - * #GProxyAddressEnumerator:proxy-resolver. + * `GProxyAddressEnumerator` is a wrapper around + * [class@Gio.SocketAddressEnumerator] which takes the [class@Gio.SocketAddress] + * instances returned by the [class@Gio.SocketAddressEnumerator] + * and wraps them in [class@Gio.ProxyAddress] instances, using the given + * [property@Gio.ProxyAddressEnumerator:proxy-resolver]. * * This enumerator will be returned (for example, by - * g_socket_connectable_enumerate()) as appropriate when a proxy is configured; - * there should be no need to manually wrap a #GSocketAddressEnumerator instance - * with one. + * [method@Gio.SocketConnectable.enumerate]) as appropriate when a proxy is + * configured; there should be no need to manually wrap a + * [class@Gio.SocketAddressEnumerator] instance with one. */ #define GET_PRIVATE(o) (G_PROXY_ADDRESS_ENUMERATOR (o)->priv) @@ -344,9 +343,14 @@ complete_async (GTask *task) priv->last_error = NULL; } else if (!priv->ever_enumerated) - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, _("Unspecified proxy lookup failure")); + { + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_FAILED, + _("Unspecified proxy lookup failure")); + } else - g_task_return_pointer (task, NULL, NULL); + { + g_task_return_pointer (task, NULL, NULL); + } priv->ever_enumerated = TRUE; @@ -751,11 +755,14 @@ g_proxy_address_enumerator_class_init (GProxyAddressEnumeratorClass *proxy_enume enumerator_class->next_async = g_proxy_address_enumerator_next_async; enumerator_class->next_finish = g_proxy_address_enumerator_next_finish; + /** + * GProxyAddressEnumerator:uri: + * + * The destination URI. Use `none://` for a generic socket. + */ g_object_class_install_property (object_class, PROP_URI, - g_param_spec_string ("uri", - P_("URI"), - P_("The destination URI, use none:// for generic socket"), + g_param_spec_string ("uri", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -771,19 +778,20 @@ g_proxy_address_enumerator_class_init (GProxyAddressEnumeratorClass *proxy_enume */ g_object_class_install_property (object_class, PROP_DEFAULT_PORT, - g_param_spec_uint ("default-port", - P_("Default port"), - P_("The default port to use if uri does not specify one"), + g_param_spec_uint ("default-port", NULL, NULL, 0, 65535, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** + * GProxyAddressEnumerator:connectable: + * + * The connectable being enumerated. + */ g_object_class_install_property (object_class, PROP_CONNECTABLE, - g_param_spec_object ("connectable", - P_("Connectable"), - P_("The connectable being enumerated."), + g_param_spec_object ("connectable", NULL, NULL, G_TYPE_SOCKET_CONNECTABLE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -798,9 +806,7 @@ g_proxy_address_enumerator_class_init (GProxyAddressEnumeratorClass *proxy_enume */ g_object_class_install_property (object_class, PROP_PROXY_RESOLVER, - g_param_spec_object ("proxy-resolver", - P_("Proxy resolver"), - P_("The proxy resolver to use."), + g_param_spec_object ("proxy-resolver", NULL, NULL, G_TYPE_PROXY_RESOLVER, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | diff --git a/gio/gproxyaddressenumerator.h b/gio/gproxyaddressenumerator.h index b8d36a6..7d36ef0 100644 --- a/gio/gproxyaddressenumerator.h +++ b/gio/gproxyaddressenumerator.h @@ -38,14 +38,6 @@ G_BEGIN_DECLS #define G_IS_PROXY_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_PROXY_ADDRESS_ENUMERATOR)) #define G_PROXY_ADDRESS_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_PROXY_ADDRESS_ENUMERATOR, GProxyAddressEnumeratorClass)) -/** - * GProxyAddressEnumerator: - * - * A subclass of #GSocketAddressEnumerator that takes another address - * enumerator and wraps each of its results in a #GProxyAddress as - * directed by the default #GProxyResolver. - */ - typedef struct _GProxyAddressEnumeratorClass GProxyAddressEnumeratorClass; typedef struct _GProxyAddressEnumeratorPrivate GProxyAddressEnumeratorPrivate; diff --git a/gio/gproxyresolver.c b/gio/gproxyresolver.c index 4a4855a..27908bb 100644 --- a/gio/gproxyresolver.c +++ b/gio/gproxyresolver.c @@ -36,17 +36,18 @@ #include "gnetworkingprivate.h" /** - * SECTION:gproxyresolver - * @short_description: Asynchronous and cancellable network proxy resolver - * @include: gio/gio.h + * GProxyResolver: * - * #GProxyResolver provides synchronous and asynchronous network proxy - * resolution. #GProxyResolver is used within #GSocketClient through - * the method g_socket_connectable_proxy_enumerate(). + * `GProxyResolver` provides synchronous and asynchronous network proxy + * resolution. `GProxyResolver` is used within [class@Gio.SocketClient] through + * the method [method@Gio.SocketConnectable.proxy_enumerate]. * - * Implementations of #GProxyResolver based on libproxy and GNOME settings can - * be found in glib-networking. GIO comes with an implementation for use inside - * Flatpak portals. + * Implementations of `GProxyResolver` based on + * [libproxy](https://github.com/libproxy/libproxy) and GNOME settings can be + * found in [glib-networking](https://gitlab.gnome.org/GNOME/glib-networking). + * GIO comes with an implementation for use inside Flatpak portals. + * + * Since: 2.26 */ /** @@ -84,7 +85,7 @@ static GProxyResolver *proxy_resolver_default_singleton = NULL; /* (owned) (ato GProxyResolver * g_proxy_resolver_get_default (void) { - if (g_once_init_enter (&proxy_resolver_default_singleton)) + if (g_once_init_enter_pointer (&proxy_resolver_default_singleton)) { GProxyResolver *singleton; @@ -92,7 +93,7 @@ g_proxy_resolver_get_default (void) "GIO_USE_PROXY_RESOLVER", (GIOModuleVerifyFunc) g_proxy_resolver_is_supported); - g_once_init_leave (&proxy_resolver_default_singleton, singleton); + g_once_init_leave_pointer (&proxy_resolver_default_singleton, singleton); } return proxy_resolver_default_singleton; diff --git a/gio/gregistrysettingsbackend.c b/gio/gregistrysettingsbackend.c index 88ae913..3ed384f 100644 --- a/gio/gregistrysettingsbackend.c +++ b/gio/gregistrysettingsbackend.c @@ -443,7 +443,7 @@ typedef struct gint32 ref_count : 9; - gint32 readable : 1; + guint32 readable : 1; RegistryValue value; } RegistryCacheItem; diff --git a/gio/gremoteactiongroup.c b/gio/gremoteactiongroup.c index 81971d0..079f6fc 100644 --- a/gio/gremoteactiongroup.c +++ b/gio/gremoteactiongroup.c @@ -27,43 +27,33 @@ #include "gaction.h" /** - * SECTION:gremoteactiongroup - * @title: GRemoteActionGroup - * @short_description: A GActionGroup that interacts with other processes - * @include: gio/gio.h + * GRemoteActionGroup: * - * The GRemoteActionGroup interface is implemented by #GActionGroup + * The `GRemoteActionGroup` interface is implemented by [iface@Gio.ActionGroup] * instances that either transmit action invocations to other processes * or receive action invocations in the local process from other * processes. * * The interface has `_full` variants of the two - * methods on #GActionGroup used to activate actions: - * g_action_group_activate_action() and - * g_action_group_change_action_state(). These variants allow a - * "platform data" #GVariant to be specified: a dictionary providing + * methods on [iface@Gio.ActionGroup] used to activate actions: + * [method@Gio.ActionGroup.activate_action] and + * [method@Gio.ActionGroup.change_action_state]. These variants allow a + * ‘platform data’ [struct@GLib.Variant] to be specified: a dictionary providing * context for the action invocation (for example: timestamps, startup * notification IDs, etc). * - * #GDBusActionGroup implements #GRemoteActionGroup. This provides a + * [class@Gio.DBusActionGroup] implements `GRemoteActionGroup`. This provides a * mechanism to send platform data for action invocations over D-Bus. * - * Additionally, g_dbus_connection_export_action_group() will check if - * the exported #GActionGroup implements #GRemoteActionGroup and use the - * `_full` variants of the calls if available. This + * Additionally, [method@Gio.DBusConnection.export_action_group] will check if + * the exported [iface@Gio.ActionGroup] implements `GRemoteActionGroup` and use + * the `_full` variants of the calls if available. This * provides a mechanism by which to receive platform data for action * invocations that arrive by way of D-Bus. * * Since: 2.32 **/ -/** - * GRemoteActionGroup: - * - * #GRemoteActionGroup is an opaque data structure and can only be accessed - * using the following functions. - **/ - /** * GRemoteActionGroupInterface: * @activate_action_full: the virtual function pointer for g_remote_action_group_activate_action_full() diff --git a/gio/gresolver.c b/gio/gresolver.c index 4c29d58..60fbb4b 100644 --- a/gio/gresolver.c +++ b/gio/gresolver.c @@ -43,22 +43,27 @@ /** - * SECTION:gresolver - * @short_description: Asynchronous and cancellable DNS resolver - * @include: gio/gio.h + * GResolver: * - * #GResolver provides cancellable synchronous and asynchronous DNS - * resolution, for hostnames (g_resolver_lookup_by_address(), - * g_resolver_lookup_by_name() and their async variants) and SRV - * (service) records (g_resolver_lookup_service()). + * The object that handles DNS resolution. Use [func@Gio.Resolver.get_default] + * to get the default resolver. * - * #GNetworkAddress and #GNetworkService provide wrappers around - * #GResolver functionality that also implement #GSocketConnectable, - * making it easy to connect to a remote host/service. + * `GResolver` provides cancellable synchronous and asynchronous DNS + * resolution, for hostnames ([method@Gio.Resolver.lookup_by_address], + * [method@Gio.Resolver.lookup_by_name] and their async variants) and SRV + * (service) records ([method@Gio.Resolver.lookup_service]). * - * The default resolver (see g_resolver_get_default()) has a timeout of 30s set - * on it since GLib 2.78. Earlier versions of GLib did not support resolver - * timeouts. + * [class@Gio.NetworkAddress] and [class@Gio.NetworkService] provide wrappers + * around `GResolver` functionality that also implement + * [iface@Gio.SocketConnectable], making it easy to connect to a remote + * host/service. + * + * The default resolver (see [func@Gio.Resolver.get_default]) has a timeout of + * 30s set on it since GLib 2.78. Earlier versions of GLib did not support + * resolver timeouts. + * + * This is an abstract type; subclasses of it implement different resolvers for + * different platforms and situations. */ typedef enum { @@ -83,15 +88,6 @@ struct _GResolverPrivate { #endif }; -/** - * GResolver: - * - * The object that handles DNS resolution. Use g_resolver_get_default() - * to get the default resolver. - * - * This is an abstract type; subclasses of it implement different resolvers for - * different platforms and situations. - */ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GResolver, g_resolver, G_TYPE_OBJECT, G_ADD_PRIVATE (GResolver) g_networking_init ();) @@ -240,9 +236,7 @@ g_resolver_class_init (GResolverClass *resolver_class) * Since: 2.78 */ props[PROP_TIMEOUT] = - g_param_spec_uint ("timeout", - P_("Timeout"), - P_("Timeout (ms) applied to all resolver lookups"), + g_param_spec_uint ("timeout", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_EXPLICIT_NOTIFY); diff --git a/gio/gresource-tool.c b/gio/gresource-tool.c index fa7bded..44b1f3f 100644 --- a/gio/gresource-tool.c +++ b/gio/gresource-tool.c @@ -165,6 +165,7 @@ get_elf (const gchar *file, if (elf_kind (elf) != ELF_K_ELF) { + elf_end (elf); g_close (*fd, NULL); *fd = -1; return NULL; diff --git a/gio/gresource.c b/gio/gresource.c index a67df11..8ce00d4 100644 --- a/gio/gresource.c +++ b/gio/gresource.c @@ -48,69 +48,73 @@ static void register_lazy_static_resources (void); G_DEFINE_BOXED_TYPE (GResource, g_resource, g_resource_ref, g_resource_unref) /** - * SECTION:gresource - * @short_description: Resource framework - * @include: gio/gio.h + * GResource: * * Applications and libraries often contain binary or textual data that is * really part of the application, rather than user data. For instance - * #GtkBuilder .ui files, splashscreen images, GMenu markup XML, CSS files, - * icons, etc. These are often shipped as files in `$datadir/appname`, or - * manually included as literal strings in the code. + * [`GtkBuilder`](https://docs.gtk.org/gtk4/class.Builder.html) `.ui` files, + * splashscreen images, [class@Gio.Menu] markup XML, CSS files, icons, etc. + * These are often shipped as files in `$datadir/appname`, or manually + * included as literal strings in the code. * - * The #GResource API and the [glib-compile-resources][glib-compile-resources] program - * provide a convenient and efficient alternative to this which has some nice properties. You - * maintain the files as normal files, so its easy to edit them, but during the build the files - * are combined into a binary bundle that is linked into the executable. This means that loading - * the resource files are efficient (as they are already in memory, shared with other instances) and - * simple (no need to check for things like I/O errors or locate the files in the filesystem). It + * The `GResource` API and the + * [`glib-compile-resources`](glib-compile-resources.html) program provide a + * convenient and efficient alternative to this which has some nice properties. + * You maintain the files as normal files, so it’s easy to edit them, but during + * the build the files are combined into a binary bundle that is linked into the + * executable. This means that loading the resource files are efficient (as they + * are already in memory, shared with other instances) and simple (no need to + * check for things like I/O errors or locate the files in the filesystem). It * also makes it easier to create relocatable applications. * - * Resource files can also be marked as compressed. Such files will be included in the resource bundle - * in a compressed form, but will be automatically uncompressed when the resource is used. This - * is very useful e.g. for larger text files that are parsed once (or rarely) and then thrown away. + * Resource files can also be marked as compressed. Such files will be included + * in the resource bundle in a compressed form, but will be automatically + * uncompressed when the resource is used. This is very useful e.g. for larger + * text files that are parsed once (or rarely) and then thrown away. * * Resource files can also be marked to be preprocessed, by setting the value of the * `preprocess` attribute to a comma-separated list of preprocessing options. * The only options currently supported are: * - * `xml-stripblanks` which will use the xmllint command - * to strip ignorable whitespace from the XML file. For this to work, - * the `XMLLINT` environment variable must be set to the full path to - * the xmllint executable, or xmllint must be in the `PATH`; otherwise - * the preprocessing step is skipped. + * - `xml-stripblanks` which will use the [`xmllint`](man:xmllint(1)) command + * to strip ignorable whitespace from the XML file. For this to work, + * the `XMLLINT` environment variable must be set to the full path to + * the xmllint executable, or xmllint must be in the `PATH`; otherwise + * the preprocessing step is skipped. * - * `to-pixdata` (deprecated since gdk-pixbuf 2.32) which will use the - * `gdk-pixbuf-pixdata` command to convert images to the #GdkPixdata format, - * which allows you to create pixbufs directly using the data inside the - * resource file, rather than an (uncompressed) copy of it. For this, the - * `gdk-pixbuf-pixdata` program must be in the `PATH`, or the - * `GDK_PIXBUF_PIXDATA` environment variable must be set to the full path to the - * `gdk-pixbuf-pixdata` executable; otherwise the resource compiler will abort. - * `to-pixdata` has been deprecated since gdk-pixbuf 2.32, as #GResource - * supports embedding modern image formats just as well. Instead of using it, - * embed a PNG or SVG file in your #GResource. + * - `to-pixdata` (deprecated since gdk-pixbuf 2.32) which will use the + * `gdk-pixbuf-pixdata` command to convert images to the [`GdkPixdata`](https://docs.gtk.org/gdk-pixbuf/class.Pixdata.html) + * format, which allows you to create pixbufs directly using the data inside + * the resource file, rather than an (uncompressed) copy of it. For this, the + * `gdk-pixbuf-pixdata` program must be in the `PATH`, or the + * `GDK_PIXBUF_PIXDATA` environment variable must be set to the full path to + * the `gdk-pixbuf-pixdata` executable; otherwise the resource compiler will + * abort. `to-pixdata` has been deprecated since gdk-pixbuf 2.32, as + * `GResource` supports embedding modern image formats just as well. Instead + * of using it, embed a PNG or SVG file in your `GResource`. * - * `json-stripblanks` which will use the `json-glib-format` command to strip - * ignorable whitespace from the JSON file. For this to work, the - * `JSON_GLIB_FORMAT` environment variable must be set to the full path to the - * `json-glib-format` executable, or it must be in the `PATH`; - * otherwise the preprocessing step is skipped. In addition, at least version - * 1.6 of `json-glib-format` is required. + * - `json-stripblanks` which will use the + * [`json-glib-format`](man:json-glib-format(1)) command to strip ignorable + * whitespace from the JSON file. For this to work, the `JSON_GLIB_FORMAT` + * environment variable must be set to the full path to the + * `json-glib-format` executable, or it must be in the `PATH`; otherwise the + * preprocessing step is skipped. In addition, at least version 1.6 of + * `json-glib-format` is required. * - * Resource files will be exported in the GResource namespace using the + * Resource files will be exported in the `GResource` namespace using the * combination of the given `prefix` and the filename from the `file` element. * The `alias` attribute can be used to alter the filename to expose them at a * different location in the resource namespace. Typically, this is used to * include files from a different source directory without exposing the source * directory in the resource namespace, as in the example below. * - * Resource bundles are created by the [glib-compile-resources][glib-compile-resources] program - * which takes an XML file that describes the bundle, and a set of files that the XML references. These - * are combined into a binary resource bundle. + * Resource bundles are created by the + * [`glib-compile-resources`](glib-compile-resources.html) program + * which takes an XML file that describes the bundle, and a set of files that + * the XML references. These are combined into a binary resource bundle. * * An example resource description: - * |[ + * ```xml * * * @@ -120,74 +124,93 @@ G_DEFINE_BOXED_TYPE (GResource, g_resource, g_resource_ref, g_resource_unref) * data/example.css * * - * ]| + * ``` * * This will create a resource bundle with the following files: - * |[ + * ``` * /org/gtk/Example/data/splashscreen.png * /org/gtk/Example/dialog.ui * /org/gtk/Example/menumarkup.xml * /org/gtk/Example/example.css - * ]| + * ``` * - * Note that all resources in the process share the same namespace, so use Java-style - * path prefixes (like in the above example) to avoid conflicts. + * Note that all resources in the process share the same namespace, so use + * Java-style path prefixes (like in the above example) to avoid conflicts. * - * You can then use [glib-compile-resources][glib-compile-resources] to compile the XML to a - * binary bundle that you can load with g_resource_load(). However, its more common to use the --generate-source and - * --generate-header arguments to create a source file and header to link directly into your application. + * You can then use [`glib-compile-resources`](glib-compile-resources.html) to + * compile the XML to a binary bundle that you can load with + * [func@Gio.Resource.load]. However, it’s more common to use the + * `--generate-source` and `--generate-header` arguments to create a source file + * and header to link directly into your application. * This will generate `get_resource()`, `register_resource()` and * `unregister_resource()` functions, prefixed by the `--c-name` argument passed - * to [glib-compile-resources][glib-compile-resources]. `get_resource()` returns - * the generated #GResource object. The register and unregister functions - * register the resource so its files can be accessed using - * g_resources_lookup_data(). + * to [`glib-compile-resources`](glib-compile-resources.html). `get_resource()` + * returns the generated `GResource` object. The register and unregister + * functions register the resource so its files can be accessed using + * [func@Gio.resources_lookup_data]. * - * Once a #GResource has been created and registered all the data in it can be accessed globally in the process by - * using API calls like g_resources_open_stream() to stream the data or g_resources_lookup_data() to get a direct pointer - * to the data. You can also use URIs like "resource:///org/gtk/Example/data/splashscreen.png" with #GFile to access - * the resource data. + * Once a `GResource` has been created and registered all the data in it can be + * accessed globally in the process by using API calls like + * [func@Gio.resources_open_stream] to stream the data or + * [func@Gio.resources_lookup_data] to get a direct pointer to the data. You can + * also use URIs like `resource:///org/gtk/Example/data/splashscreen.png` with + * [iface@Gio.File] to access the resource data. * - * Some higher-level APIs, such as #GtkApplication, will automatically load - * resources from certain well-known paths in the resource namespace as a - * convenience. See the documentation for those APIs for details. + * Some higher-level APIs, such as [`GtkApplication`](https://docs.gtk.org/gtk4/class.Application.html), + * will automatically load resources from certain well-known paths in the + * resource namespace as a convenience. See the documentation for those APIs + * for details. * - * There are two forms of the generated source, the default version uses the compiler support for constructor - * and destructor functions (where available) to automatically create and register the #GResource on startup - * or library load time. If you pass `--manual-register`, two functions to register/unregister the resource are created - * instead. This requires an explicit initialization call in your application/library, but it works on all platforms, - * even on the minor ones where constructors are not supported. (Constructor support is available for at least Win32, Mac OS and Linux.) + * There are two forms of the generated source, the default version uses the + * compiler support for constructor and destructor functions (where available) + * to automatically create and register the `GResource` on startup or library + * load time. If you pass `--manual-register`, two functions to + * register/unregister the resource are created instead. This requires an + * explicit initialization call in your application/library, but it works on all + * platforms, even on the minor ones where constructors are not supported. + * (Constructor support is available for at least Win32, Mac OS and Linux.) * - * Note that resource data can point directly into the data segment of e.g. a library, so if you are unloading libraries - * during runtime you need to be very careful with keeping around pointers to data from a resource, as this goes away - * when the library is unloaded. However, in practice this is not generally a problem, since most resource accesses - * are for your own resources, and resource data is often used once, during parsing, and then released. + * Note that resource data can point directly into the data segment of e.g. a + * library, so if you are unloading libraries during runtime you need to be very + * careful with keeping around pointers to data from a resource, as this goes + * away when the library is unloaded. However, in practice this is not generally + * a problem, since most resource accesses are for your own resources, and + * resource data is often used once, during parsing, and then released. * - * When debugging a program or testing a change to an installed version, it is often useful to be able to - * replace resources in the program or library, without recompiling, for debugging or quick hacking and testing - * purposes. Since GLib 2.50, it is possible to use the `G_RESOURCE_OVERLAYS` environment variable to selectively overlay - * resources with replacements from the filesystem. It is a %G_SEARCHPATH_SEPARATOR-separated list of substitutions to perform - * during resource lookups. It is ignored when running in a setuid process. + * # Overlays + * + * When debugging a program or testing a change to an installed version, it is + * often useful to be able to replace resources in the program or library, + * without recompiling, for debugging or quick hacking and testing purposes. + * Since GLib 2.50, it is possible to use the `G_RESOURCE_OVERLAYS` environment + * variable to selectively overlay resources with replacements from the + * filesystem. It is a `G_SEARCHPATH_SEPARATOR`-separated list of substitutions + * to perform during resource lookups. It is ignored when running in a setuid + * process. * * A substitution has the form * - * |[ - * /org/gtk/libgtk=/home/desrt/gtk-overlay - * ]| + * ``` + * /org/gtk/libgtk=/home/desrt/gtk-overlay + * ``` * - * The part before the `=` is the resource subpath for which the overlay applies. The part after is a - * filesystem path which contains files and subdirectories as you would like to be loaded as resources with the + * The part before the `=` is the resource subpath for which the overlay + * applies. The part after is a filesystem path which contains files and + * subdirectories as you would like to be loaded as resources with the * equivalent names. * - * In the example above, if an application tried to load a resource with the resource path - * `/org/gtk/libgtk/ui/gtkdialog.ui` then GResource would check the filesystem path - * `/home/desrt/gtk-overlay/ui/gtkdialog.ui`. If a file was found there, it would be used instead. This is an - * overlay, not an outright replacement, which means that if a file is not found at that path, the built-in - * version will be used instead. Whiteouts are not currently supported. + * In the example above, if an application tried to load a resource with the + * resource path `/org/gtk/libgtk/ui/gtkdialog.ui` then `GResource` would check + * the filesystem path `/home/desrt/gtk-overlay/ui/gtkdialog.ui`. If a file was + * found there, it would be used instead. This is an overlay, not an outright + * replacement, which means that if a file is not found at that path, the + * built-in version will be used instead. Whiteouts are not currently + * supported. * - * Substitutions must start with a slash, and must not contain a trailing slash before the '='. The path after - * the slash should ideally be absolute, but this is not strictly required. It is possible to overlay the - * location of a single resource with an individual file. + * Substitutions must start with a slash, and must not contain a trailing slash + * before the `=`. The path after the slash should ideally be absolute, but + * this is not strictly required. It is possible to overlay the location of a + * single resource with an individual file. * * Since: 2.32 */ @@ -336,7 +359,7 @@ g_resource_find_overlay (const gchar *path, * we can take a bit more time... */ - if (g_once_init_enter (&overlay_dirs)) + if (g_once_init_enter_pointer (&overlay_dirs)) { gboolean is_setuid = GLIB_PRIVATE_CALL (g_check_setuid) (); const gchar * const *result; @@ -420,7 +443,7 @@ g_resource_find_overlay (const gchar *path, result = empty_strv; } - g_once_init_leave (&overlay_dirs, result); + g_once_init_leave_pointer (&overlay_dirs, result); } for (i = 0; overlay_dirs[i]; i++) diff --git a/gio/gseekable.c b/gio/gseekable.c index 805e0a0..0b0ec27 100644 --- a/gio/gseekable.c +++ b/gio/gseekable.c @@ -26,25 +26,22 @@ /** - * SECTION:gseekable - * @short_description: Stream seeking interface - * @include: gio/gio.h - * @see_also: #GInputStream, #GOutputStream + * GSeekable: * - * #GSeekable is implemented by streams (implementations of - * #GInputStream or #GOutputStream) that support seeking. + * `GSeekable` is implemented by streams (implementations of + * [class@Gio.InputStream] or [class@Gio.OutputStream]) that support seeking. * * Seekable streams largely fall into two categories: resizable and * fixed-size. * - * #GSeekable on fixed-sized streams is approximately the same as POSIX - * lseek() on a block device (for example: attempting to seek past the - * end of the device is an error). Fixed streams typically cannot be + * `GSeekable` on fixed-sized streams is approximately the same as POSIX + * [`lseek()`](man:lseek(2)) on a block device (for example: attempting to seek + * past the end of the device is an error). Fixed streams typically cannot be * truncated. * - * #GSeekable on resizable streams is approximately the same as POSIX - * lseek() on a normal file. Seeking past the end and writing data will - * usually cause the stream to resize by introducing zero bytes. + * `GSeekable` on resizable streams is approximately the same as POSIX + * [`lseek()`](man:lseek(2)) on a normal file. Seeking past the end and writing + * data will usually cause the stream to resize by introducing zero bytes. **/ typedef GSeekableIface GSeekableInterface; diff --git a/gio/gseekable.h b/gio/gseekable.h index 34510de..e997801 100644 --- a/gio/gseekable.h +++ b/gio/gseekable.h @@ -36,11 +36,6 @@ G_BEGIN_DECLS #define G_IS_SEEKABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_SEEKABLE)) #define G_SEEKABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_SEEKABLE, GSeekableIface)) -/** - * GSeekable: - * - * Seek object for streaming operations. - **/ typedef struct _GSeekableIface GSeekableIface; /** diff --git a/gio/gsettings.c b/gio/gsettings.c index a2c3dd0..a14ba80 100644 --- a/gio/gsettings.c +++ b/gio/gsettings.c @@ -37,116 +37,115 @@ #include "strinfo.c" /** - * SECTION:gsettings - * @short_description: High-level API for application settings - * @include: gio/gio.h + * GSettings: * - * The #GSettings class provides a convenient API for storing and retrieving + * The `GSettings` class provides a convenient API for storing and retrieving * application settings. * * Reads and writes can be considered to be non-blocking. Reading - * settings with #GSettings is typically extremely fast: on + * settings with `GSettings` is typically extremely fast: on * approximately the same order of magnitude (but slower than) a - * #GHashTable lookup. Writing settings is also extremely fast in terms - * of time to return to your application, but can be extremely expensive + * [struct@GLib.HashTable] lookup. Writing settings is also extremely fast in + * terms of time to return to your application, but can be extremely expensive * for other threads and other processes. Many settings backends * (including dconf) have lazy initialisation which means in the common * case of the user using their computer without modifying any settings - * a lot of work can be avoided. For dconf, the D-Bus service doesn't + * a lot of work can be avoided. For dconf, the D-Bus service doesn’t * even need to be started in this case. For this reason, you should - * only ever modify #GSettings keys in response to explicit user action. + * only ever modify `GSettings` keys in response to explicit user action. * Particular care should be paid to ensure that modifications are not - * made during startup -- for example, when setting the initial value - * of preferences widgets. The built-in g_settings_bind() functionality - * is careful not to write settings in response to notify signals as a - * result of modifications that it makes to widgets. + * made during startup — for example, when setting the initial value + * of preferences widgets. The built-in [method@Gio.Settings.bind] + * functionality is careful not to write settings in response to notify signals + * as a result of modifications that it makes to widgets. * - * When creating a GSettings instance, you have to specify a schema + * When creating a `GSettings` instance, you have to specify a schema * that describes the keys in your settings and their types and default * values, as well as some other information. * * Normally, a schema has a fixed path that determines where the settings * are stored in the conceptual global tree of settings. However, schemas - * can also be '[relocatable][gsettings-relocatable]', i.e. not equipped with + * can also be ‘[relocatable](#relocatable-schemas)’, i.e. not equipped with * a fixed path. This is - * useful e.g. when the schema describes an 'account', and you want to be + * useful e.g. when the schema describes an ‘account’, and you want to be * able to store a arbitrary number of accounts. * - * Paths must start with and end with a forward slash character ('/') + * Paths must start with and end with a forward slash character (`/`) * and must not contain two sequential slash characters. Paths should * be chosen based on a domain name associated with the program or * library to which the settings belong. Examples of paths are - * "/org/gtk/settings/file-chooser/" and "/ca/desrt/dconf-editor/". - * Paths should not start with "/apps/", "/desktop/" or "/system/" as + * `/org/gtk/settings/file-chooser/` and `/ca/desrt/dconf-editor/`. + * Paths should not start with `/apps/`, `/desktop/` or `/system/` as * they often did in GConf. * * Unlike other configuration systems (like GConf), GSettings does not * restrict keys to basic types like strings and numbers. GSettings stores - * values as #GVariant, and allows any #GVariantType for keys. Key names - * are restricted to lowercase characters, numbers and '-'. Furthermore, - * the names must begin with a lowercase character, must not end - * with a '-', and must not contain consecutive dashes. + * values as [struct@GLib.Variant], and allows any [type@GLib.VariantType] for + * keys. Key names are restricted to lowercase characters, numbers and `-`. + * Furthermore, the names must begin with a lowercase character, must not end + * with a `-`, and must not contain consecutive dashes. * * Similar to GConf, the default values in GSettings schemas can be * localized, but the localized values are stored in gettext catalogs * and looked up with the domain that is specified in the - * `gettext-domain` attribute of the or + * `gettext-domain` attribute of the `` or `` * elements and the category that is specified in the `l10n` attribute of - * the element. The string which is translated includes all text in - * the element, including any surrounding quotation marks. + * the `` element. The string which is translated includes all text in + * the `` element, including any surrounding quotation marks. * * The `l10n` attribute must be set to `messages` or `time`, and sets the * [locale category for * translation](https://www.gnu.org/software/gettext/manual/html_node/Aspects.html#index-locale-categories-1). * The `messages` category should be used by default; use `time` for * translatable date or time formats. A translation comment can be added as an - * XML comment immediately above the element — it is recommended to + * XML comment immediately above the `` element — it is recommended to * add these comments to aid translators understand the meaning and * implications of the default value. An optional translation `context` - * attribute can be set on the element to disambiguate multiple + * attribute can be set on the `` element to disambiguate multiple * defaults which use the same string. * * For example: - * |[ + * ```xml * * ['bad', 'words'] - * ]| + * ``` * * Translations of default values must remain syntactically valid serialized - * #GVariants (e.g. retaining any surrounding quotation marks) or runtime - * errors will occur. + * [struct@GLib.Variant]s (e.g. retaining any surrounding quotation marks) or + * runtime errors will occur. * * GSettings uses schemas in a compact binary form that is created - * by the [glib-compile-schemas][glib-compile-schemas] + * by the [`glib-compile-schemas`](glib-compile-schemas.html) * utility. The input is a schema description in an XML format. * * A DTD for the gschema XML format can be found here: * [gschema.dtd](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/gio/gschema.dtd) * - * The [glib-compile-schemas][glib-compile-schemas] tool expects schema + * The [`glib-compile-schemas`](glib-compile-schemas.html) tool expects schema * files to have the extension `.gschema.xml`. * - * At runtime, schemas are identified by their id (as specified in the - * id attribute of the element). The convention for schema - * ids is to use a dotted name, similar in style to a D-Bus bus name, - * e.g. "org.gnome.SessionManager". In particular, if the settings are + * At runtime, schemas are identified by their ID (as specified in the + * `id` attribute of the `` element). The convention for schema + * IDs is to use a dotted name, similar in style to a D-Bus bus name, + * e.g. `org.gnome.SessionManager`. In particular, if the settings are * for a specific service that owns a D-Bus bus name, the D-Bus bus name - * and schema id should match. For schemas which deal with settings not - * associated with one named application, the id should not use - * StudlyCaps, e.g. "org.gnome.font-rendering". + * and schema ID should match. For schemas which deal with settings not + * associated with one named application, the ID should not use + * StudlyCaps, e.g. `org.gnome.font-rendering`. * - * In addition to #GVariant types, keys can have types that have - * enumerated types. These can be described by a , - * or element, as seen in the - * [example][schema-enumerated]. The underlying type of such a key - * is string, but you can use g_settings_get_enum(), g_settings_set_enum(), - * g_settings_get_flags(), g_settings_set_flags() access the numeric values - * corresponding to the string value of enum and flags keys. + * In addition to [struct@GLib.Variant] types, keys can have types that have + * enumerated types. These can be described by a ``, + * `` or `` element, as seen in the + * second example below. The underlying type of such a key + * is string, but you can use [method@Gio.Settings.get_enum], + * [method@Gio.Settings.set_enum], [method@Gio.Settings.get_flags], + * [method@Gio.Settings.set_flags] access the numeric values corresponding to + * the string value of enum and flags keys. * * An example for default value: - * |[ + * ```xml * * * @@ -169,10 +168,10 @@ * * * - * ]| + * ``` * * An example for ranges, choices and enumerated types: - * |[ + * ```xml * * * @@ -215,7 +214,7 @@ * * * - * ]| + * ``` * * ## Vendor overrides * @@ -223,41 +222,42 @@ * an application. Sometimes, it is necessary for a vendor or distributor * to adjust these defaults. Since patching the XML source for the schema * is inconvenient and error-prone, - * [glib-compile-schemas][glib-compile-schemas] reads so-called vendor - * override' files. These are keyfiles in the same directory as the XML - * schema sources which can override default values. The schema id serves + * [`glib-compile-schemas`](glib-compile-schemas.html) reads so-called ‘vendor + * override’ files. These are keyfiles in the same directory as the XML + * schema sources which can override default values. The schema ID serves * as the group name in the key file, and the values are expected in - * serialized GVariant form, as in the following example: - * |[ - * [org.gtk.Example] - * key1='string' - * key2=1.5 - * ]| + * serialized [struct@GLib.Variant] form, as in the following example: + * ``` + * [org.gtk.Example] + * key1='string' + * key2=1.5 + * ``` * - * glib-compile-schemas expects schema files to have the extension + * `glib-compile-schemas` expects schema files to have the extension * `.gschema.override`. * * ## Binding * - * A very convenient feature of GSettings lets you bind #GObject properties - * directly to settings, using g_settings_bind(). Once a GObject property - * has been bound to a setting, changes on either side are automatically - * propagated to the other side. GSettings handles details like mapping - * between GObject and GVariant types, and preventing infinite cycles. + * A very convenient feature of GSettings lets you bind [class@GObject.Object] + * properties directly to settings, using [method@Gio.Settings.bind]. Once a + * [class@GObject.Object] property has been bound to a setting, changes on + * either side are automatically propagated to the other side. GSettings handles + * details like mapping between [class@GObject.Object] and [struct@GLib.Variant] + * types, and preventing infinite cycles. * * This makes it very easy to hook up a preferences dialog to the * underlying settings. To make this even more convenient, GSettings - * looks for a boolean property with the name "sensitivity" and + * looks for a boolean property with the name `sensitivity` and * automatically binds it to the writability of the bound setting. - * If this 'magic' gets in the way, it can be suppressed with the - * %G_SETTINGS_BIND_NO_SENSITIVITY flag. + * If this ‘magic’ gets in the way, it can be suppressed with the + * `G_SETTINGS_BIND_NO_SENSITIVITY` flag. * - * ## Relocatable schemas # {#gsettings-relocatable} + * ## Relocatable schemas * * A relocatable schema is one with no `path` attribute specified on its - * element. By using g_settings_new_with_path(), a #GSettings object - * can be instantiated for a relocatable schema, assigning a path to the - * instance. Paths passed to g_settings_new_with_path() will typically be + * `` element. By using [ctor@Gio.Settings.new_with_path], a `GSettings` + * object can be instantiated for a relocatable schema, assigning a path to the + * instance. Paths passed to [ctor@Gio.Settings.new_with_path] will typically be * constructed dynamically from a constant prefix plus some form of instance * identifier; but they must still be valid GSettings paths. Paths could also * be constant and used with a globally installed schema originating from a @@ -268,59 +268,59 @@ * `org.foo.MyApp.Window`, it could be instantiated for paths * `/org/foo/MyApp/main/`, `/org/foo/MyApp/document-1/`, * `/org/foo/MyApp/document-2/`, etc. If any of the paths are well-known - * they can be specified as elements in the parent schema, e.g.: - * |[ + * they can be specified as `` elements in the parent schema, e.g.: + * ```xml * * * - * ]| + * ``` * - * ## Build system integration # {#gsettings-build-system} + * ## Build system integration * * GSettings comes with autotools integration to simplify compiling and * installing schemas. To add GSettings support to an application, add the * following to your `configure.ac`: - * |[ + * ``` * GLIB_GSETTINGS - * ]| + * ``` * * In the appropriate `Makefile.am`, use the following snippet to compile and * install the named schema: - * |[ + * ``` * gsettings_SCHEMAS = org.foo.MyApp.gschema.xml * EXTRA_DIST = $(gsettings_SCHEMAS) * * @GSETTINGS_RULES@ - * ]| + * ``` * * No changes are needed to the build system to mark a schema XML file for * translation. Assuming it sets the `gettext-domain` attribute, a schema may * be marked for translation by adding it to `POTFILES.in`, assuming gettext * 0.19 is in use (the preferred method for translation): - * |[ + * ``` * data/org.foo.MyApp.gschema.xml - * ]| + * ``` * * Alternatively, if intltool 0.50.1 is in use: - * |[ + * ``` * [type: gettext/gsettings]data/org.foo.MyApp.gschema.xml - * ]| + * ``` * - * GSettings will use gettext to look up translations for the and - * elements, and also any elements which have a `l10n` - * attribute set. Translations must not be included in the `.gschema.xml` file - * by the build system, for example by using intltool XML rules with a + * GSettings will use gettext to look up translations for the `` and + * `` elements, and also any `` elements which have a + * `l10n` attribute set. Translations must not be included in the `.gschema.xml` + * file by the build system, for example by using intltool XML rules with a * `.gschema.xml.in` template. * * If an enumerated type defined in a C header file is to be used in a GSettings - * schema, it can either be defined manually using an element in the + * schema, it can either be defined manually using an `` element in the * schema XML, or it can be extracted automatically from the C header. This * approach is preferred, as it ensures the two representations are always * synchronised. To do so, add the following to the relevant `Makefile.am`: - * |[ + * ``` * gsettings_ENUM_NAMESPACE = org.foo.MyApp * gsettings_ENUM_FILES = my-app-enums.h my-app-misc.h - * ]| + * ``` * * `gsettings_ENUM_NAMESPACE` specifies the schema namespace for the enum files, * which are specified in `gsettings_ENUM_FILES`. This will generate a @@ -330,13 +330,6 @@ * `EXTRA_DIST`. */ -/** - * GSettings: - * - * #GSettings is an opaque data structure and can only be accessed - * using the following functions. - **/ - struct _GSettingsPrivate { /* where the signals go... */ @@ -848,9 +841,7 @@ g_settings_class_init (GSettingsClass *class) * The name of the context that the settings are stored in. */ g_object_class_install_property (object_class, PROP_BACKEND, - g_param_spec_object ("backend", - P_("GSettingsBackend"), - P_("The GSettingsBackend for this settings object"), + g_param_spec_object ("backend", NULL, NULL, G_TYPE_SETTINGS_BACKEND, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -866,9 +857,7 @@ g_settings_class_init (GSettingsClass *class) * than the schema itself. Take care. */ g_object_class_install_property (object_class, PROP_SCHEMA, - g_param_spec_boxed ("settings-schema", - P_("schema"), - P_("The GSettingsSchema for this settings object"), + g_param_spec_boxed ("settings-schema", NULL, NULL, G_TYPE_SETTINGS_SCHEMA, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -890,9 +879,7 @@ g_settings_class_init (GSettingsClass *class) * version, this property may instead refer to a #GSettingsSchema. */ g_object_class_install_property (object_class, PROP_SCHEMA_ID, - g_param_spec_string ("schema", - P_("Schema name"), - P_("The name of the schema for this settings object"), + g_param_spec_string ("schema", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_DEPRECATED | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -904,9 +891,7 @@ g_settings_class_init (GSettingsClass *class) * for this #GSettings object. */ g_object_class_install_property (object_class, PROP_SCHEMA_ID, - g_param_spec_string ("schema-id", - P_("Schema name"), - P_("The name of the schema for this settings object"), + g_param_spec_string ("schema-id", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -917,9 +902,7 @@ g_settings_class_init (GSettingsClass *class) * The path within the backend where the settings are stored. */ g_object_class_install_property (object_class, PROP_PATH, - g_param_spec_string ("path", - P_("Base path"), - P_("The path within the backend where the settings are"), + g_param_spec_string ("path", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -931,9 +914,7 @@ g_settings_class_init (GSettingsClass *class) * changes that will be applied when g_settings_apply() is called. */ g_object_class_install_property (object_class, PROP_HAS_UNAPPLIED, - g_param_spec_boolean ("has-unapplied", - P_("Has unapplied changes"), - P_("TRUE if there are outstanding changes to apply()"), + g_param_spec_boolean ("has-unapplied", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -946,9 +927,7 @@ g_settings_class_init (GSettingsClass *class) * Since: 2.28 */ g_object_class_install_property (object_class, PROP_DELAY_APPLY, - g_param_spec_boolean ("delay-apply", - P_("Delay-apply mode"), - P_("Whether this settings object is in “delay-apply” mode"), + g_param_spec_boolean ("delay-apply", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gsettingsbackend.c b/gio/gsettingsbackend.c index 2db6c58..d11d1fd 100644 --- a/gio/gsettingsbackend.c +++ b/gio/gsettingsbackend.c @@ -52,17 +52,13 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GSettingsBackend, g_settings_backend, G_TYP static gboolean g_settings_has_backend; /** - * SECTION:gsettingsbackend - * @title: GSettingsBackend - * @short_description: Interface for settings backend implementations - * @include: gio/gsettingsbackend.h - * @see_also: #GSettings, #GIOExtensionPoint + * GSettingsBackend: * - * The #GSettingsBackend interface defines a generic interface for + * The `GSettingsBackend` interface defines a generic interface for * non-strictly-typed data that is stored in a hierarchy. To implement - * an alternative storage backend for #GSettings, you need to implement - * the #GSettingsBackend interface and then make it implement the - * extension point %G_SETTINGS_BACKEND_EXTENSION_POINT_NAME. + * an alternative storage backend for [class@Gio.Settings], you need to + * implement the `GSettingsBackend` interface and then make it implement the + * extension point `G_SETTINGS_BACKEND_EXTENSION_POINT_NAME`. * * The interface defines methods for reading and writing values, a * method for determining if writing of certain values will fail @@ -72,15 +68,14 @@ static gboolean g_settings_has_backend; * implementations must carefully adhere to the expectations of * callers that are documented on each of the interface methods. * - * Some of the #GSettingsBackend functions accept or return a #GTree. - * These trees always have strings as keys and #GVariant as values. - * g_settings_backend_create_tree() is a convenience function to create - * suitable trees. + * Some of the `GSettingsBackend` functions accept or return a + * [struct@GLib.Tree]. These trees always have strings as keys and + * [struct@GLib.Variant] as values. * - * The #GSettingsBackend API is exported to allow third-party + * The `GSettingsBackend` API is exported to allow third-party * implementations, but does not carry the same stability guarantees * as the public GIO API. For this reason, you have to define the - * C preprocessor symbol %G_SETTINGS_ENABLE_BACKEND before including + * C preprocessor symbol `G_SETTINGS_ENABLE_BACKEND` before including * `gio/gsettingsbackend.h`. **/ @@ -1018,7 +1013,7 @@ static GSettingsBackend *settings_backend_default_singleton = NULL; /* (owned) GSettingsBackend * g_settings_backend_get_default (void) { - if (g_once_init_enter (&settings_backend_default_singleton)) + if (g_once_init_enter_pointer (&settings_backend_default_singleton)) { GSettingsBackend *singleton; @@ -1026,7 +1021,7 @@ g_settings_backend_get_default (void) "GSETTINGS_BACKEND", g_settings_backend_verify); - g_once_init_leave (&settings_backend_default_singleton, singleton); + g_once_init_leave_pointer (&settings_backend_default_singleton, singleton); } return g_object_ref (settings_backend_default_singleton); diff --git a/gio/gsettingsbackend.h b/gio/gsettingsbackend.h index f579bf6..2649605 100644 --- a/gio/gsettingsbackend.h +++ b/gio/gsettingsbackend.h @@ -53,11 +53,6 @@ G_BEGIN_DECLS **/ #define G_SETTINGS_BACKEND_EXTENSION_POINT_NAME "gsettings-backend" -/** - * GSettingsBackend: - * - * An implementation of a settings storage repository. - **/ typedef struct _GSettingsBackendPrivate GSettingsBackendPrivate; typedef struct _GSettingsBackendClass GSettingsBackendClass; diff --git a/gio/gsettingsschema.c b/gio/gsettingsschema.c index b3ac2f1..b191865 100644 --- a/gio/gsettingsschema.c +++ b/gio/gsettingsschema.c @@ -38,12 +38,9 @@ #endif /** - * SECTION:gsettingsschema - * @short_description: Introspecting and controlling the loading - * of GSettings schemas - * @include: gio/gio.h + * GSettingsSchema: * - * The #GSettingsSchemaSource and #GSettingsSchema APIs provide a + * The [struct@Gio.SettingsSchemaSource] and `GSettingsSchema` APIs provide a * mechanism for advanced control over the loading of schemas and a * mechanism for introspecting their content. * @@ -53,20 +50,20 @@ * the schema along with itself and it won't be installed into the * standard system directories for schemas. * - * #GSettingsSchemaSource provides a mechanism for dealing with this by - * allowing the creation of a new 'schema source' from which schemas can + * [struct@Gio.SettingsSchemaSource] provides a mechanism for dealing with this + * by allowing the creation of a new ‘schema source’ from which schemas can * be acquired. This schema source can then become part of the metadata * associated with the plugin and queried whenever the plugin requires * access to some settings. * * Consider the following example: * - * |[ + * ```c * typedef struct * { - * ... + * … * GSettingsSchemaSource *schema_source; - * ... + * … * } Plugin; * * Plugin * @@ -74,18 +71,18 @@ * { * Plugin *plugin; * - * ... + * … * * plugin->schema_source = * g_settings_schema_source_new_from_directory (dir, * g_settings_schema_source_get_default (), FALSE, NULL); * - * ... + * … * * return plugin; * } * - * ... + * … * * GSettings * * plugin_get_settings (Plugin *plugin, @@ -101,12 +98,12 @@ * * if (schema == NULL) * { - * ... disable the plugin or abort, etc ... + * … disable the plugin or abort, etc … * } * * return g_settings_new_full (schema, NULL, NULL); * } - * ]| + * ``` * * The code above shows how hooks should be added to the code that * initialises (or enables) the plugin to create the schema source and @@ -118,19 +115,19 @@ * ships a gschemas.compiled file as part of itself, and then simply do * the following: * - * |[ + * ```c * { * GSettings *settings; * gint some_value; * * settings = plugin_get_settings (self, NULL); * some_value = g_settings_get_int (settings, "some-value"); - * ... + * … * } - * ]| + * ``` * * It's also possible that the plugin system expects the schema source - * files (ie: .gschema.xml files) instead of a gschemas.compiled file. + * files (ie: `.gschema.xml` files) instead of a `gschemas.compiled` file. * In that case, the plugin loading system must compile the schemas for * itself before attempting to create the settings source. * @@ -144,13 +141,6 @@ * using the following functions. **/ -/** - * GSettingsSchema: - * - * This is an opaque structure type. You may not access it directly. - * - * Since: 2.32 - **/ struct _GSettingsSchema { GSettingsSchemaSource *source; @@ -580,7 +570,7 @@ normalise_whitespace (const gchar *orig) gchar *result; gint i; - if (g_once_init_enter (&splitter)) + if (g_once_init_enter_pointer (&splitter)) { GRegex *s; @@ -593,7 +583,7 @@ normalise_whitespace (const gchar *orig) s = g_regex_new ("\\n\\s*\\n+", G_REGEX_DEFAULT, G_REGEX_MATCH_DEFAULT, NULL); - g_once_init_leave (&splitter, s); + g_once_init_leave_pointer (&splitter, s); } lines = g_regex_split (splitter, orig, 0); @@ -744,7 +734,7 @@ parse_into_text_tables (const gchar *directory, static GHashTable ** g_settings_schema_source_get_text_tables (GSettingsSchemaSource *source) { - if (g_once_init_enter (&source->text_tables)) + if (g_once_init_enter_pointer (&source->text_tables)) { GHashTable **text_tables; @@ -755,7 +745,7 @@ g_settings_schema_source_get_text_tables (GSettingsSchemaSource *source) if (source->directory) parse_into_text_tables (source->directory, text_tables[0], text_tables[1]); - g_once_init_leave (&source->text_tables, text_tables); + g_once_init_leave_pointer (&source->text_tables, text_tables); } return source->text_tables; @@ -1496,7 +1486,7 @@ g_settings_schema_key_get_per_desktop_default (GSettingsSchemaKey *key) if (!key->desktop_overrides) return NULL; - if (g_once_init_enter (¤t_desktops)) + if (g_once_init_enter_pointer (¤t_desktops)) { const gchar *xdg_current_desktop = g_getenv ("XDG_CURRENT_DESKTOP"); gchar **tmp; @@ -1506,7 +1496,7 @@ g_settings_schema_key_get_per_desktop_default (GSettingsSchemaKey *key) else tmp = g_new0 (gchar *, 0 + 1); - g_once_init_leave (¤t_desktops, (const gchar **) tmp); + g_once_init_leave_pointer (¤t_desktops, (const gchar **) tmp); } for (i = 0; value == NULL && current_desktops[i] != NULL; i++) diff --git a/gio/gsimpleaction.c b/gio/gsimpleaction.c index 4e7e5b5..6e3080b 100644 --- a/gio/gsimpleaction.c +++ b/gio/gsimpleaction.c @@ -26,25 +26,13 @@ #include "gaction.h" #include "glibintl.h" -/** - * SECTION:gsimpleaction - * @title: GSimpleAction - * @short_description: A simple GAction implementation - * @include: gio/gio.h - * - * A #GSimpleAction is the obvious simple implementation of the #GAction - * interface. This is the easiest way to create an action for purposes of - * adding it to a #GSimpleActionGroup. - * - * See also #GtkAction. - */ - /** * GSimpleAction: * - * #GSimpleAction is an opaque data structure and can only be accessed - * using the following functions. - **/ + * A `GSimpleAction` is the obvious simple implementation of the + * [iface@Gio.Action] interface. This is the easiest way to create an action for + * purposes of adding it to a [class@Gio.SimpleActionGroup]. + */ struct _GSimpleAction { @@ -460,9 +448,7 @@ g_simple_action_class_init (GSimpleActionClass *class) * Since: 2.28 **/ g_object_class_install_property (object_class, PROP_NAME, - g_param_spec_string ("name", - P_("Action Name"), - P_("The name used to invoke the action"), + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -477,9 +463,7 @@ g_simple_action_class_init (GSimpleActionClass *class) * Since: 2.28 **/ g_object_class_install_property (object_class, PROP_PARAMETER_TYPE, - g_param_spec_boxed ("parameter-type", - P_("Parameter Type"), - P_("The type of GVariant passed to activate()"), + g_param_spec_boxed ("parameter-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -496,9 +480,7 @@ g_simple_action_class_init (GSimpleActionClass *class) * Since: 2.28 **/ g_object_class_install_property (object_class, PROP_ENABLED, - g_param_spec_boolean ("enabled", - P_("Enabled"), - P_("If the action can be activated"), + g_param_spec_boolean ("enabled", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -512,9 +494,7 @@ g_simple_action_class_init (GSimpleActionClass *class) * Since: 2.28 **/ g_object_class_install_property (object_class, PROP_STATE_TYPE, - g_param_spec_boxed ("state-type", - P_("State Type"), - P_("The type of the state kept by the action"), + g_param_spec_boxed ("state-type", NULL, NULL, G_TYPE_VARIANT_TYPE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -527,9 +507,7 @@ g_simple_action_class_init (GSimpleActionClass *class) * Since: 2.28 **/ g_object_class_install_property (object_class, PROP_STATE, - g_param_spec_variant ("state", - P_("State"), - P_("The state the action is in"), + g_param_spec_variant ("state", NULL, NULL, G_VARIANT_TYPE_ANY, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | diff --git a/gio/gsimpleactiongroup.c b/gio/gsimpleactiongroup.c index 28ca21a..cd768a0 100644 --- a/gio/gsimpleactiongroup.c +++ b/gio/gsimpleactiongroup.c @@ -28,13 +28,13 @@ #include "gaction.h" /** - * SECTION:gsimpleactiongroup - * @title: GSimpleActionGroup - * @short_description: A simple GActionGroup implementation - * @include: gio/gio.h + * GSimpleActionGroup: * - * #GSimpleActionGroup is a hash table filled with #GAction objects, - * implementing the #GActionGroup and #GActionMap interfaces. + * `GSimpleActionGroup` is a hash table filled with [iface@Gio.Action] objects, + * implementing the [iface@Gio.ActionGroup] and [iface@Gio.ActionMap] + * interfaces. + * + * Since: 2.28 **/ struct _GSimpleActionGroupPrivate diff --git a/gio/gsimpleactiongroup.h b/gio/gsimpleactiongroup.h index 99282ba..48f669d 100644 --- a/gio/gsimpleactiongroup.h +++ b/gio/gsimpleactiongroup.h @@ -46,13 +46,6 @@ G_BEGIN_DECLS typedef struct _GSimpleActionGroupPrivate GSimpleActionGroupPrivate; typedef struct _GSimpleActionGroupClass GSimpleActionGroupClass; -/** - * GSimpleActionGroup: - * - * The #GSimpleActionGroup structure contains private data and should only be accessed using the provided API. - * - * Since: 2.28 - */ struct _GSimpleActionGroup { /*< private >*/ diff --git a/gio/gsimpleasyncresult.c b/gio/gsimpleasyncresult.c index 43a063a..ef5492f 100644 --- a/gio/gsimpleasyncresult.c +++ b/gio/gsimpleasyncresult.c @@ -33,83 +33,81 @@ /** - * SECTION:gsimpleasyncresult - * @short_description: Simple asynchronous results implementation - * @include: gio/gio.h - * @see_also: #GAsyncResult, #GTask + * GSimpleAsyncResult: * - * As of GLib 2.46, #GSimpleAsyncResult is deprecated in favor of - * #GTask, which provides a simpler API. + * As of GLib 2.46, `GSimpleAsyncResult` is deprecated in favor of + * [class@Gio.Task], which provides a simpler API. * - * #GSimpleAsyncResult implements #GAsyncResult. + * `GSimpleAsyncResult` implements [iface@Gio.AsyncResult]. * - * GSimpleAsyncResult handles #GAsyncReadyCallbacks, error + * `GSimpleAsyncResult` handles [type@Gio.AsyncReadyCallback]s, error * reporting, operation cancellation and the final state of an operation, * completely transparent to the application. Results can be returned * as a pointer e.g. for functions that return data that is collected * asynchronously, a boolean value for checking the success or failure - * of an operation, or a #gssize for operations which return the number + * of an operation, or a `gssize` for operations which return the number * of bytes modified by the operation; all of the simple return cases * are covered. * * Most of the time, an application will not need to know of the details * of this API; it is handled transparently, and any necessary operations - * are handled by #GAsyncResult's interface. However, if implementing a - * new GIO module, for writing language bindings, or for complex + * are handled by [iface@Gio.AsyncResult]’s interface. However, if implementing + * a new GIO module, for writing language bindings, or for complex * applications that need better control of how asynchronous operations * are completed, it is important to understand this functionality. * - * GSimpleAsyncResults are tagged with the calling function to ensure + * `GSimpleAsyncResult`s are tagged with the calling function to ensure * that asynchronous functions and their finishing functions are used * together correctly. * - * To create a new #GSimpleAsyncResult, call g_simple_async_result_new(). - * If the result needs to be created for a #GError, use - * g_simple_async_result_new_from_error() or - * g_simple_async_result_new_take_error(). If a #GError is not available - * (e.g. the asynchronous operation's doesn't take a #GError argument), + * To create a new `GSimpleAsyncResult`, call [ctor@Gio.SimpleAsyncResult.new]. + * If the result needs to be created for a `GError`, use + * [ctor@Gio.SimpleAsyncResult.new_from_error] or + * [ctor@Gio.SimpleAsyncResult.new_take_error]. If a `GError` is not available + * (e.g. the asynchronous operation doesn’t take a `GError` argument), * but the result still needs to be created for an error condition, use - * g_simple_async_result_new_error() (or g_simple_async_result_set_error_va() - * if your application or binding requires passing a variable argument list - * directly), and the error can then be propagated through the use of - * g_simple_async_result_propagate_error(). + * [ctor@Gio.SimpleAsyncResult.new_error] (or + * [method@Gio.SimpleAsyncResult.set_error_va] if your application or binding + * requires passing a variable argument list directly), and the error can then + * be propagated through the use of + * [method@Gio.SimpleAsyncResult.propagate_error]. * * An asynchronous operation can be made to ignore a cancellation event by - * calling g_simple_async_result_set_handle_cancellation() with a - * #GSimpleAsyncResult for the operation and %FALSE. This is useful for + * calling [method@Gio.SimpleAsyncResult.set_handle_cancellation] with a + * `GSimpleAsyncResult` for the operation and `FALSE`. This is useful for * operations that are dangerous to cancel, such as close (which would * cause a leak if cancelled before being run). * - * GSimpleAsyncResult can integrate into GLib's event loop, #GMainLoop, - * or it can use #GThreads. - * g_simple_async_result_complete() will finish an I/O task directly - * from the point where it is called. g_simple_async_result_complete_in_idle() - * will finish it from an idle handler in the - * [thread-default main context][g-main-context-push-thread-default] - * where the #GSimpleAsyncResult was created. - * g_simple_async_result_run_in_thread() will run the job in a - * separate thread and then use - * g_simple_async_result_complete_in_idle() to deliver the result. + * `GSimpleAsyncResult` can integrate into GLib’s event loop, + * [type@GLib.MainLoop], or it can use [type@GLib.Thread]s. + * [method@Gio.SimpleAsyncResult.complete] will finish an I/O task directly + * from the point where it is called. + * [method@Gio.SimpleAsyncResult.complete_in_idle] will finish it from an idle + * handler in the thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) where the `GSimpleAsyncResult` + * was created. [method@Gio.SimpleAsyncResult.run_in_thread] will run the job in + * a separate thread and then use + * [method@Gio.SimpleAsyncResult.complete_in_idle] to deliver the result. * * To set the results of an asynchronous function, - * g_simple_async_result_set_op_res_gpointer(), - * g_simple_async_result_set_op_res_gboolean(), and - * g_simple_async_result_set_op_res_gssize() - * are provided, setting the operation's result to a gpointer, gboolean, or - * gssize, respectively. + * [method@Gio.SimpleAsyncResult.set_op_res_gpointer], + * [method@Gio.SimpleAsyncResult.set_op_res_gboolean], and + * [method@Gio.SimpleAsyncResult.set_op_res_gssize] + * are provided, setting the operation's result to a `gpointer`, `gboolean`, or + * `gssize`, respectively. * * Likewise, to get the result of an asynchronous function, - * g_simple_async_result_get_op_res_gpointer(), - * g_simple_async_result_get_op_res_gboolean(), and - * g_simple_async_result_get_op_res_gssize() are - * provided, getting the operation's result as a gpointer, gboolean, and - * gssize, respectively. + * [method@Gio.SimpleAsyncResult.get_op_res_gpointer], + * [method@Gio.SimpleAsyncResult.get_op_res_gboolean], and + * [method@Gio.SimpleAsyncResult.get_op_res_gssize] are + * provided, getting the operation’s result as a `gpointer`, `gboolean`, and + * `gssize`, respectively. * * For the details of the requirements implementations must respect, see - * #GAsyncResult. A typical implementation of an asynchronous operation - * using GSimpleAsyncResult looks something like this: + * [iface@Gio.AsyncResult]. A typical implementation of an asynchronous + * operation using `GSimpleAsyncResult` looks something like this: * - * |[ + * ```c * static void * baked_cb (Cake *cake, * gpointer user_data) @@ -202,7 +200,7 @@ * cake = CAKE (g_simple_async_result_get_op_res_gpointer (simple)); * return g_object_ref (cake); * } - * ]| + * ``` */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS diff --git a/gio/gsimpleasyncresult.h b/gio/gsimpleasyncresult.h index 12efb9c..94ad355 100644 --- a/gio/gsimpleasyncresult.h +++ b/gio/gsimpleasyncresult.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_SIMPLE_ASYNC_RESULT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SIMPLE_ASYNC_RESULT)) #define G_SIMPLE_ASYNC_RESULT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SIMPLE_ASYNC_RESULT, GSimpleAsyncResultClass)) -/** - * GSimpleAsyncResult: - * - * A simple implementation of #GAsyncResult. - **/ typedef struct _GSimpleAsyncResultClass GSimpleAsyncResultClass; diff --git a/gio/gsimpleiostream.c b/gio/gsimpleiostream.c index da6df24..1b13fa2 100644 --- a/gio/gsimpleiostream.c +++ b/gio/gsimpleiostream.c @@ -27,28 +27,19 @@ #include "gsimpleiostream.h" #include "gtask.h" -/** - * SECTION:gsimpleiostream - * @short_description: A wrapper around an input and an output stream. - * @include: gio/gio.h - * @see_also: #GIOStream - * - * GSimpleIOStream creates a #GIOStream from an arbitrary #GInputStream and - * #GOutputStream. This allows any pair of input and output streams to be used - * with #GIOStream methods. - * - * This is useful when you obtained a #GInputStream and a #GOutputStream - * by other means, for instance creating them with platform specific methods as - * g_unix_input_stream_new() or g_win32_input_stream_new(), and you want - * to take advantage of the methods provided by #GIOStream. - * - * Since: 2.44 - */ - /** * GSimpleIOStream: * - * A wrapper around a #GInputStream and a #GOutputStream. + * `GSimpleIOStream` creates a [class@Gio.IOStream] from an arbitrary + * [class@Gio.InputStream] and [class@Gio.OutputStream]. This allows any pair of + * input and output streams to be used with [class@Gio.IOStream] methods. + * + * This is useful when you obtained a [class@Gio.InputStream] and a + * [class@Gio.OutputStream] by other means, for instance creating them with + * platform specific methods as + * [`g_unix_input_stream_new()`](../gio-unix/ctor.UnixInputStream.new.html) + * (from `gio-unix-2.0.pc` / `GioUnix-2.0`), and you want to + * take advantage of the methods provided by [class@Gio.IOStream]. * * Since: 2.44 */ @@ -170,12 +161,12 @@ g_simple_io_stream_class_init (GSimpleIOStreamClass *class) /** * GSimpleIOStream:input-stream: * + * The [class@Gio.InputStream] to read from. + * * Since: 2.44 */ g_object_class_install_property (gobject_class, PROP_INPUT_STREAM, - g_param_spec_object ("input-stream", - P_("Input stream"), - P_("The GInputStream to read from"), + g_param_spec_object ("input-stream", NULL, NULL, G_TYPE_INPUT_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | @@ -184,12 +175,12 @@ g_simple_io_stream_class_init (GSimpleIOStreamClass *class) /** * GSimpleIOStream:output-stream: * + * The [class@Gio.OutputStream] to write to. + * * Since: 2.44 */ g_object_class_install_property (gobject_class, PROP_OUTPUT_STREAM, - g_param_spec_object ("output-stream", - P_("Output stream"), - P_("The GOutputStream to write to"), + g_param_spec_object ("output-stream", NULL, NULL, G_TYPE_OUTPUT_STREAM, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | diff --git a/gio/gsimplepermission.c b/gio/gsimplepermission.c index 36358eb..3165509 100644 --- a/gio/gsimplepermission.c +++ b/gio/gsimplepermission.c @@ -25,24 +25,15 @@ #include "gpermission.h" -/** - * SECTION:gsimplepermission - * @title: GSimplePermission - * @short_description: A GPermission that doesn't change value - * @include: gio/gio.h - * - * #GSimplePermission is a trivial implementation of #GPermission that - * represents a permission that is either always or never allowed. The - * value is given at construction and doesn't change. - * - * Calling request or release will result in errors. - **/ - /** * GSimplePermission: * - * #GSimplePermission is an opaque data structure. There are no methods - * except for those defined by #GPermission. + * `GSimplePermission` is a trivial implementation of [class@Gio.Permission] + * that represents a permission that is either always or never allowed. The + * value is given at construction and doesn’t change. + * + * Calling [method@Gio.Permission.acquire] or [method@Gio.Permission.release] + * on a `GSimplePermission` will result in errors. **/ typedef GPermissionClass GSimplePermissionClass; diff --git a/gio/gsimpleproxyresolver.c b/gio/gsimpleproxyresolver.c index 8de26cb..4113652 100644 --- a/gio/gsimpleproxyresolver.c +++ b/gio/gsimpleproxyresolver.c @@ -33,19 +33,16 @@ #include "glibintl.h" /** - * SECTION:gsimpleproxyresolver - * @short_description: Simple proxy resolver implementation - * @include: gio/gio.h - * @see_also: g_socket_client_set_proxy_resolver() + * GSimpleProxyResolver: * - * #GSimpleProxyResolver is a simple #GProxyResolver implementation + * `GSimpleProxyResolver` is a simple [iface@Gio.ProxyResolver] implementation * that handles a single default proxy, multiple URI-scheme-specific * proxies, and a list of hosts that proxies should not be used for. * - * #GSimpleProxyResolver is never the default proxy resolver, but it + * `GSimpleProxyResolver` is never the default proxy resolver, but it * can be used as the base class for another proxy resolver * implementation, or it can be created and used manually, such as - * with g_socket_client_set_proxy_resolver(). + * with [method@Gio.SocketClient.set_proxy_resolver]. * * Since: 2.36 */ @@ -417,7 +414,7 @@ g_simple_proxy_resolver_class_init (GSimpleProxyResolverClass *resolver_class) object_class->finalize = g_simple_proxy_resolver_finalize; /** - * GSimpleProxyResolver:default-proxy: (nullable) + * GSimpleProxyResolver:default-proxy: * * The default proxy URI that will be used for any URI that doesn't * match #GSimpleProxyResolver:ignore-hosts, and doesn't match any @@ -428,9 +425,7 @@ g_simple_proxy_resolver_class_init (GSimpleProxyResolverClass *resolver_class) * to all three of the socks5, socks4a, and socks4 proxy types. */ g_object_class_install_property (object_class, PROP_DEFAULT_PROXY, - g_param_spec_string ("default-proxy", - P_("Default proxy"), - P_("The default proxy URI"), + g_param_spec_string ("default-proxy", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -474,9 +469,7 @@ g_simple_proxy_resolver_class_init (GSimpleProxyResolverClass *resolver_class) * commonly used by other applications. */ g_object_class_install_property (object_class, PROP_IGNORE_HOSTS, - g_param_spec_boxed ("ignore-hosts", - P_("Ignore hosts"), - P_("Hosts that will not use the proxy"), + g_param_spec_boxed ("ignore-hosts", NULL, NULL, G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -503,7 +496,7 @@ g_simple_proxy_resolver_iface_init (GProxyResolverInterface *iface) * #GSimpleProxyResolver:ignore-hosts for more details on how the * arguments are interpreted. * - * Returns: (transfer full) a new #GSimpleProxyResolver + * Returns: (transfer full): a new #GSimpleProxyResolver * * Since: 2.36 */ diff --git a/gio/gsimpleproxyresolver.h b/gio/gsimpleproxyresolver.h index 2e5f4b2..113b491 100644 --- a/gio/gsimpleproxyresolver.h +++ b/gio/gsimpleproxyresolver.h @@ -36,11 +36,6 @@ G_BEGIN_DECLS #define G_IS_SIMPLE_PROXY_RESOLVER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SIMPLE_PROXY_RESOLVER)) #define G_SIMPLE_PROXY_RESOLVER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SIMPLE_PROXY_RESOLVER, GSimpleProxyResolverClass)) -/** - * GSimpleProxyResolver: - * - * A #GProxyResolver implementation for using a fixed set of proxies. - **/ typedef struct _GSimpleProxyResolver GSimpleProxyResolver; typedef struct _GSimpleProxyResolverPrivate GSimpleProxyResolverPrivate; typedef struct _GSimpleProxyResolverClass GSimpleProxyResolverClass; diff --git a/gio/gsocket.c b/gio/gsocket.c index a4b57d9..c2ddade 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -83,46 +83,44 @@ #endif /** - * SECTION:gsocket - * @short_description: Low-level socket object - * @include: gio/gio.h - * @see_also: #GInitable, [][gio-gnetworking.h] + * GSocket: * - * A #GSocket is a low-level networking primitive. It is a more or less + * A `GSocket` is a low-level networking primitive. It is a more or less * direct mapping of the BSD socket API in a portable GObject based API. * It supports both the UNIX socket implementations and winsock2 on Windows. * - * #GSocket is the platform independent base upon which the higher level + * `GSocket` is the platform independent base upon which the higher level * network primitives are based. Applications are not typically meant to - * use it directly, but rather through classes like #GSocketClient, - * #GSocketService and #GSocketConnection. However there may be cases where - * direct use of #GSocket is useful. + * use it directly, but rather through classes like [class@Gio.SocketClient], + * [class@Gio.SocketService] and [class@Gio.SocketConnection]. However there may + * be cases where direct use of `GSocket` is useful. * - * #GSocket implements the #GInitable interface, so if it is manually constructed - * by e.g. g_object_new() you must call g_initable_init() and check the - * results before using the object. This is done automatically in - * g_socket_new() and g_socket_new_from_fd(), so these functions can return - * %NULL. + * `GSocket` implements the [iface@Gio.Initable] interface, so if it is manually + * constructed by e.g. [ctor@GObject.Object.new] you must call + * [method@Gio.Initable.init] and check the results before using the object. + * This is done automatically in [ctor@Gio.Socket.new] and + * [ctor@Gio.Socket.new_from_fd], so these functions can return `NULL`. * * Sockets operate in two general modes, blocking or non-blocking. When * in blocking mode all operations (which don’t take an explicit blocking * parameter) block until the requested operation * is finished or there is an error. In non-blocking mode all calls that - * would block return immediately with a %G_IO_ERROR_WOULD_BLOCK error. - * To know when a call would successfully run you can call g_socket_condition_check(), - * or g_socket_condition_wait(). You can also use g_socket_create_source() and - * attach it to a #GMainContext to get callbacks when I/O is possible. + * would block return immediately with a `G_IO_ERROR_WOULD_BLOCK` error. + * To know when a call would successfully run you can call + * [method@Gio.Socket.condition_check], or [method@Gio.Socket.condition_wait]. + * You can also use [method@Gio.Socket.create_source] and attach it to a + * [type@GLib.MainContext] to get callbacks when I/O is possible. * Note that all sockets are always set to non blocking mode in the system, and - * blocking mode is emulated in GSocket. + * blocking mode is emulated in `GSocket`. * * When working in non-blocking mode applications should always be able to - * handle getting a %G_IO_ERROR_WOULD_BLOCK error even when some other + * handle getting a `G_IO_ERROR_WOULD_BLOCK` error even when some other * function said that I/O was possible. This can easily happen in case * of a race condition in the application, but it can also happen for other * reasons. For instance, on Windows a socket is always seen as writable - * until a write returns %G_IO_ERROR_WOULD_BLOCK. + * until a write returns `G_IO_ERROR_WOULD_BLOCK`. * - * #GSockets can be either connection oriented or datagram based. + * `GSocket`s can be either connection oriented or datagram based. * For connection oriented types you must first establish a connection by * either connecting to an address or accepting a connection from another * address. For connectionless socket types the target/source address is @@ -130,16 +128,34 @@ * * All socket file descriptors are set to be close-on-exec. * - * Note that creating a #GSocket causes the signal %SIGPIPE to be + * Note that creating a `GSocket` causes the signal `SIGPIPE` to be * ignored for the remainder of the program. If you are writing a - * command-line utility that uses #GSocket, you may need to take into + * command-line utility that uses `GSocket`, you may need to take into * account the fact that your program will not automatically be killed - * if it tries to write to %stdout after it has been closed. + * if it tries to write to `stdout` after it has been closed. * - * Like most other APIs in GLib, #GSocket is not inherently thread safe. To use - * a #GSocket concurrently from multiple threads, you must implement your own + * Like most other APIs in GLib, `GSocket` is not inherently thread safe. To use + * a `GSocket` concurrently from multiple threads, you must implement your own * locking. * + * ## Nagle’s algorithm + * + * Since GLib 2.80, `GSocket` will automatically set the `TCP_NODELAY` option on + * all `G_SOCKET_TYPE_STREAM` sockets. This disables + * [Nagle’s algorithm](https://en.wikipedia.org/wiki/Nagle%27s_algorithm) as it + * typically does more harm than good on modern networks. + * + * If your application needs Nagle’s algorithm enabled, call + * [method@Gio.Socket.set_option] after constructing a `GSocket` to enable it: + * ```c + * socket = g_socket_new (…, G_SOCKET_TYPE_STREAM, …); + * if (socket != NULL) + * { + * g_socket_set_option (socket, IPPROTO_TCP, TCP_NODELAY, FALSE, &local_error); + * // handle error if needed + * } + * ``` + * * Since: 2.22 */ @@ -751,6 +767,8 @@ g_socket_constructed (GObject *object) /* See note about SIGPIPE below. */ g_socket_set_option (socket, SOL_SOCKET, SO_NOSIGPIPE, TRUE, NULL); #endif + if (socket->priv->type == G_SOCKET_TYPE_STREAM) + g_socket_set_option (socket, IPPROTO_TCP, TCP_NODELAY, TRUE, NULL); } } @@ -954,40 +972,60 @@ g_socket_class_init (GSocketClass *klass) gobject_class->set_property = g_socket_set_property; gobject_class->get_property = g_socket_get_property; + /** + * GSocket:family: + * + * The socket’s address family. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_FAMILY, - g_param_spec_enum ("family", - P_("Socket family"), - P_("The sockets address family"), + g_param_spec_enum ("family", NULL, NULL, G_TYPE_SOCKET_FAMILY, G_SOCKET_FAMILY_INVALID, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:type: + * + * The socket’s type. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_TYPE, - g_param_spec_enum ("type", - P_("Socket type"), - P_("The sockets type"), + g_param_spec_enum ("type", NULL, NULL, G_TYPE_SOCKET_TYPE, G_SOCKET_TYPE_STREAM, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:protocol: + * + * The ID of the protocol to use, or `-1` for unknown. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PROTOCOL, - g_param_spec_enum ("protocol", - P_("Socket protocol"), - P_("The id of the protocol to use, or -1 for unknown"), + g_param_spec_enum ("protocol", NULL, NULL, G_TYPE_SOCKET_PROTOCOL, G_SOCKET_PROTOCOL_UNKNOWN, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:fd: + * + * The socket’s file descriptor. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_FD, - g_param_spec_int ("fd", - P_("File descriptor"), - P_("The sockets file descriptor"), + g_param_spec_int ("fd", NULL, NULL, G_MININT, G_MAXINT, -1, @@ -995,44 +1033,69 @@ g_socket_class_init (GSocketClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:blocking: + * + * Whether I/O on this socket is blocking. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_BLOCKING, - g_param_spec_boolean ("blocking", - P_("blocking"), - P_("Whether or not I/O on this socket is blocking"), + g_param_spec_boolean ("blocking", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:listen-backlog: + * + * The number of outstanding connections in the listen queue. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_LISTEN_BACKLOG, - g_param_spec_int ("listen-backlog", - P_("Listen backlog"), - P_("Outstanding connections in the listen queue"), + g_param_spec_int ("listen-backlog", NULL, NULL, 0, SOMAXCONN, 10, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:keepalive: + * + * Whether to keep the connection alive by sending periodic pings. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_KEEPALIVE, - g_param_spec_boolean ("keepalive", - P_("Keep connection alive"), - P_("Keep connection alive by sending periodic pings"), + g_param_spec_boolean ("keepalive", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:local-address: + * + * The local address the socket is bound to. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS, - g_param_spec_object ("local-address", - P_("Local address"), - P_("The local address the socket is bound to"), + g_param_spec_object ("local-address", NULL, NULL, G_TYPE_SOCKET_ADDRESS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); + /** + * GSocket:remote-address: + * + * The remote address the socket is connected to. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_REMOTE_ADDRESS, - g_param_spec_object ("remote-address", - P_("Remote address"), - P_("The remote address the socket is connected to"), + g_param_spec_object ("remote-address", NULL, NULL, G_TYPE_SOCKET_ADDRESS, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -1045,9 +1108,7 @@ g_socket_class_init (GSocketClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_TIMEOUT, - g_param_spec_uint ("timeout", - P_("Timeout"), - P_("The timeout in seconds on socket I/O"), + g_param_spec_uint ("timeout", NULL, NULL, 0, G_MAXUINT, 0, @@ -1062,9 +1123,7 @@ g_socket_class_init (GSocketClass *klass) * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_BROADCAST, - g_param_spec_boolean ("broadcast", - P_("Broadcast"), - P_("Whether to allow sending to broadcast addresses"), + g_param_spec_boolean ("broadcast", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -1077,9 +1136,7 @@ g_socket_class_init (GSocketClass *klass) * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_TTL, - g_param_spec_uint ("ttl", - P_("TTL"), - P_("Time-to-live of outgoing unicast packets"), + g_param_spec_uint ("ttl", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -1092,9 +1149,7 @@ g_socket_class_init (GSocketClass *klass) * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_MULTICAST_LOOPBACK, - g_param_spec_boolean ("multicast-loopback", - P_("Multicast loopback"), - P_("Whether outgoing multicast packets loop back to the local host"), + g_param_spec_boolean ("multicast-loopback", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -1107,9 +1162,7 @@ g_socket_class_init (GSocketClass *klass) * Since: 2.32 */ g_object_class_install_property (gobject_class, PROP_MULTICAST_TTL, - g_param_spec_uint ("multicast-ttl", - P_("Multicast TTL"), - P_("Time-to-live of outgoing multicast packets"), + g_param_spec_uint ("multicast-ttl", NULL, NULL, 0, G_MAXUINT, 1, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -3179,8 +3232,8 @@ g_socket_get_available_bytes (GSocket *socket) #else if (socket->priv->type == G_SOCKET_TYPE_DATAGRAM) { - if (G_UNLIKELY (g_once_init_enter (&buf))) - g_once_init_leave (&buf, g_malloc (bufsize)); + if (G_UNLIKELY (g_once_init_enter_pointer (&buf))) + g_once_init_leave_pointer (&buf, g_malloc (bufsize)); /* On datagram sockets, FIONREAD ioctl is not reliable because many * systems add internal header size to the reported size, making it @@ -3312,6 +3365,69 @@ g_socket_receive_with_timeout (GSocket *socket, return ret; } +/** + * g_socket_receive_bytes: + * @socket: a #GSocket + * @size: the number of bytes you want to read from the socket + * @timeout_us: the timeout to wait for, in microseconds, or `-1` to block + * indefinitely + * @cancellable: (nullable): a %GCancellable, or `NULL` + * @error: return location for a #GError, or `NULL` + * + * Receives data (up to @size bytes) from a socket. + * + * This function is a variant of [method@Gio.Socket.receive] which returns a + * [struct@GLib.Bytes] rather than a plain buffer. + * + * Pass `-1` to @timeout_us to block indefinitely until data is received (or + * the connection is closed, or there is an error). Pass `0` to use the default + * timeout from [property@Gio.Socket:timeout], or pass a positive number to wait + * for that many microseconds for data before returning `G_IO_ERROR_TIMED_OUT`. + * + * Returns: (transfer full): a bytes buffer containing the + * received bytes, or `NULL` on error + * Since: 2.80 + */ +GBytes * +g_socket_receive_bytes (GSocket *socket, + gsize size, + gint64 timeout_us, + GCancellable *cancellable, + GError **error) +{ + guint8 *data; + gssize res; + GBytes *buf; + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + data = g_new0 (guint8, size); + res = g_socket_receive_with_timeout (socket, data, size, timeout_us, cancellable, error); + if (res < 0) + { + g_free (data); + return NULL; + } + + if ((gsize) res == size) + { + buf = g_bytes_new_take (g_steal_pointer (&data), (gsize) res); + } + else + { + GBytes *sub_buf; + + buf = g_bytes_new_take (g_steal_pointer (&data), size); + sub_buf = g_bytes_new_from_bytes (buf, 0, (gsize) res); + g_bytes_unref (buf); + buf = g_steal_pointer (&sub_buf); + } + + return g_steal_pointer (&buf); +} + /** * g_socket_receive: * @socket: a #GSocket @@ -3393,6 +3509,85 @@ g_socket_receive_with_blocking (GSocket *socket, blocking ? -1 : 0, cancellable, error); } +/** + * g_socket_receive_bytes_from: + * @socket: a #GSocket + * @address: (out) (optional): return location for a #GSocketAddress + * @size: the number of bytes you want to read from the socket + * @timeout_us: the timeout to wait for, in microseconds, or `-1` to block + * indefinitely + * @cancellable: (nullable): a #GCancellable, or `NULL` + * @error: return location for a #GError, or `NULL` + * + * Receive data (up to @size bytes) from a socket. + * + * This function is a variant of [method@Gio.Socket.receive_from] which returns + * a [struct@GLib.Bytes] rather than a plain buffer. + * + * If @address is non-%NULL then @address will be set equal to the + * source address of the received packet. + * + * The @address is owned by the caller. + * + * Pass `-1` to @timeout_us to block indefinitely until data is received (or + * the connection is closed, or there is an error). Pass `0` to use the default + * timeout from [property@Gio.Socket:timeout], or pass a positive number to wait + * for that many microseconds for data before returning `G_IO_ERROR_TIMED_OUT`. + * + * Returns: (transfer full): a bytes buffer containing the + * received bytes, or `NULL` on error + * Since: 2.80 + */ +GBytes * +g_socket_receive_bytes_from (GSocket *socket, + GSocketAddress **address, + gsize size, + gint64 timeout_us, + GCancellable *cancellable, + GError **error) +{ + GInputVector v; + gssize res; + GBytes *buf; + + g_return_val_if_fail (G_IS_SOCKET (socket), NULL); + g_return_val_if_fail (address == NULL || *address == NULL, NULL); + g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + v.buffer = g_new0 (guint8, size); + v.size = size; + + res = g_socket_receive_message_with_timeout (socket, + address, + &v, 1, + NULL, 0, NULL, + timeout_us, + cancellable, + error); + if (res < 0) + { + g_free (v.buffer); + return NULL; + } + + if ((gsize) res == size) + { + buf = g_bytes_new_take (g_steal_pointer (&v.buffer), (gsize) res); + } + else + { + GBytes *sub_buf; + + buf = g_bytes_new_take (g_steal_pointer (&v.buffer), size); + sub_buf = g_bytes_new_from_bytes (buf, 0, (gsize) res); + g_bytes_unref (buf); + buf = g_steal_pointer (&sub_buf); + } + + return g_steal_pointer (&buf); +} + /** * g_socket_receive_from: * @socket: a #GSocket @@ -4062,7 +4257,7 @@ socket_source_dispatch (GSource *source, #endif timeout = g_source_get_ready_time (source); - if (timeout >= 0 && timeout < g_source_get_time (source) && + if (timeout >= 0 && timeout <= g_source_get_time (source) && !g_socket_is_closed (socket_source->socket)) { socket->priv->timed_out = TRUE; diff --git a/gio/gsocket.h b/gio/gsocket.h index 0f0624b..341e23e 100644 --- a/gio/gsocket.h +++ b/gio/gsocket.h @@ -210,6 +210,12 @@ gssize g_socket_receive (GSocket gsize size, GCancellable *cancellable, GError **error); +GIO_AVAILABLE_IN_2_80 +GBytes * g_socket_receive_bytes (GSocket *socket, + gsize size, + gint64 timeout_us, + GCancellable *cancellable, + GError **error); GIO_AVAILABLE_IN_ALL gssize g_socket_receive_from (GSocket *socket, GSocketAddress **address, @@ -217,6 +223,13 @@ gssize g_socket_receive_from (GSocket gsize size, GCancellable *cancellable, GError **error); +GIO_AVAILABLE_IN_2_80 +GBytes * g_socket_receive_bytes_from (GSocket *socket, + GSocketAddress **address, + gsize size, + gint64 timeout_us, + GCancellable *cancellable, + GError **error); GIO_AVAILABLE_IN_ALL gssize g_socket_send (GSocket *socket, const gchar *buffer, diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c index 994037c..09cb9ab 100644 --- a/gio/gsocketaddress.c +++ b/gio/gsocketaddress.c @@ -44,22 +44,13 @@ #endif -/** - * SECTION:gsocketaddress - * @short_description: Abstract base class representing endpoints - * for socket communication - * @include: gio/gio.h - * - * #GSocketAddress is the equivalent of struct sockaddr in the BSD - * sockets API. This is an abstract class; use #GInetSocketAddress - * for internet sockets, or #GUnixSocketAddress for UNIX domain sockets. - */ - /** * GSocketAddress: * - * A socket endpoint address, corresponding to struct sockaddr - * or one of its subtypes. + * `GSocketAddress` is the equivalent of + * [`struct sockaddr`](man:sockaddr(3type)) and its subtypes in the BSD sockets + * API. This is an abstract class; use [class@Gio.InetSocketAddress] for + * internet sockets, or [class@Gio.UnixSocketAddress] for UNIX domain sockets. */ enum @@ -118,10 +109,15 @@ g_socket_address_class_init (GSocketAddressClass *klass) gobject_class->get_property = g_socket_address_get_property; + /** + * GSocketAddress:family: + * + * The family of the socket address. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_FAMILY, - g_param_spec_enum ("family", - P_("Address family"), - P_("The family of the socket address"), + g_param_spec_enum ("family", NULL, NULL, G_TYPE_SOCKET_FAMILY, G_SOCKET_FAMILY_INVALID, G_PARAM_READABLE | diff --git a/gio/gsocketaddressenumerator.c b/gio/gsocketaddressenumerator.c index 5a0e937..8b99d50 100644 --- a/gio/gsocketaddressenumerator.c +++ b/gio/gsocketaddressenumerator.c @@ -25,23 +25,22 @@ #include "gtask.h" /** - * SECTION:gsocketaddressenumerator - * @short_description: Enumerator for socket addresses - * @include: gio/gio.h + * GSocketAddressEnumerator: * - * #GSocketAddressEnumerator is an enumerator type for #GSocketAddress - * instances. It is returned by enumeration functions such as - * g_socket_connectable_enumerate(), which returns a #GSocketAddressEnumerator - * to list each #GSocketAddress which could be used to connect to that - * #GSocketConnectable. + * `GSocketAddressEnumerator` is an enumerator type for + * [class@Gio.SocketAddress] instances. It is returned by enumeration functions + * such as [method@Gio.SocketConnectable.enumerate], which returns a + * `GSocketAddressEnumerator` to list each [class@Gio.SocketAddress] which could + * be used to connect to that [iface@Gio.SocketConnectable]. * * Enumeration is typically a blocking operation, so the asynchronous methods - * g_socket_address_enumerator_next_async() and - * g_socket_address_enumerator_next_finish() should be used where possible. + * [method@Gio.SocketAddressEnumerator.next_async] and + * [method@Gio.SocketAddressEnumerator.next_finish] should be used where + * possible. * - * Each #GSocketAddressEnumerator can only be enumerated once. Once - * g_socket_address_enumerator_next() has returned %NULL, further - * enumeration with that #GSocketAddressEnumerator is not possible, and it can + * Each `GSocketAddressEnumerator` can only be enumerated once. Once + * [method@Gio.SocketAddressEnumerator.next] has returned `NULL`, further + * enumeration with that `GSocketAddressEnumerator` is not possible, and it can * be unreffed. */ diff --git a/gio/gsocketaddressenumerator.h b/gio/gsocketaddressenumerator.h index ceee6a3..b3ff71c 100644 --- a/gio/gsocketaddressenumerator.h +++ b/gio/gsocketaddressenumerator.h @@ -36,12 +36,6 @@ G_BEGIN_DECLS #define G_IS_SOCKET_ADDRESS_ENUMERATOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_SOCKET_ADDRESS_ENUMERATOR)) #define G_SOCKET_ADDRESS_ENUMERATOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_SOCKET_ADDRESS_ENUMERATOR, GSocketAddressEnumeratorClass)) -/** - * GSocketAddressEnumerator: - * - * Enumerator type for objects that contain or generate - * #GSocketAddress instances. - */ typedef struct _GSocketAddressEnumeratorClass GSocketAddressEnumeratorClass; struct _GSocketAddressEnumerator diff --git a/gio/gsocketclient.c b/gio/gsocketclient.c index 6eb4126..d423159 100644 --- a/gio/gsocketclient.c +++ b/gio/gsocketclient.c @@ -60,27 +60,26 @@ /* As recommended by RFC 8305 this is the time it waits * on a connection before starting another concurrent attempt. + * + * See https://datatracker.ietf.org/doc/html/rfc8305#section-8 */ -#define HAPPY_EYEBALLS_CONNECTION_ATTEMPT_TIMEOUT_MS 250 +#define HAPPY_EYEBALLS_CONNECTION_ATTEMPT_DELAY_MS 250 /** - * SECTION:gsocketclient - * @short_description: Helper for connecting to a network service - * @include: gio/gio.h - * @see_also: #GSocketConnection, #GSocketListener + * GSocketClient: * - * #GSocketClient is a lightweight high-level utility class for connecting to + * `GSocketClient` is a lightweight high-level utility class for connecting to * a network host using a connection oriented socket type. * - * You create a #GSocketClient object, set any options you want, and then - * call a sync or async connect operation, which returns a #GSocketConnection - * subclass on success. + * You create a `GSocketClient` object, set any options you want, and then + * call a sync or async connect operation, which returns a + * [class@Gio.SocketConnection] subclass on success. * - * The type of the #GSocketConnection object returned depends on the type of - * the underlying socket that is in use. For instance, for a TCP/IP connection - * it will be a #GTcpConnection. + * The type of the [class@Gio.SocketConnection] object returned depends on the + * type of the underlying socket that is in use. For instance, for a TCP/IP + * connection it will be a [class@Gio.TcpConnection]. * - * As #GSocketClient is a lightweight object, you don't need to cache it. You + * As `GSocketClient` is a lightweight object, you don't need to cache it. You * can just create a new one any time you need one. * * Since: 2.22 @@ -869,67 +868,102 @@ g_socket_client_class_init (GSocketClientClass *class) G_TYPE_FROM_CLASS (class), _g_cclosure_marshal_VOID__ENUM_OBJECT_OBJECTv); + /** + * GSocketClient:family: + * + * The address family to use for socket construction. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_FAMILY, - g_param_spec_enum ("family", - P_("Socket family"), - P_("The sockets address family to use for socket construction"), + g_param_spec_enum ("family", NULL, NULL, G_TYPE_SOCKET_FAMILY, G_SOCKET_FAMILY_INVALID, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:type: + * + * The type to use for socket construction. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_TYPE, - g_param_spec_enum ("type", - P_("Socket type"), - P_("The sockets type to use for socket construction"), + g_param_spec_enum ("type", NULL, NULL, G_TYPE_SOCKET_TYPE, G_SOCKET_TYPE_STREAM, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:protocol: + * + * The protocol to use for socket construction, or `0` for default. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PROTOCOL, - g_param_spec_enum ("protocol", - P_("Socket protocol"), - P_("The protocol to use for socket construction, or 0 for default"), + g_param_spec_enum ("protocol", NULL, NULL, G_TYPE_SOCKET_PROTOCOL, G_SOCKET_PROTOCOL_DEFAULT, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:local-address: + * + * The local address constructed sockets will be bound to. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_LOCAL_ADDRESS, - g_param_spec_object ("local-address", - P_("Local address"), - P_("The local address constructed sockets will be bound to"), + g_param_spec_object ("local-address", NULL, NULL, G_TYPE_SOCKET_ADDRESS, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:timeout: + * + * The I/O timeout for sockets, in seconds, or `0` for none. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_TIMEOUT, - g_param_spec_uint ("timeout", - P_("Socket timeout"), - P_("The I/O timeout for sockets, or 0 for none"), + g_param_spec_uint ("timeout", NULL, NULL, 0, G_MAXUINT, 0, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:enable-proxy: + * + * Enable proxy support. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_ENABLE_PROXY, - g_param_spec_boolean ("enable-proxy", - P_("Enable proxy"), - P_("Enable proxy support"), + g_param_spec_boolean ("enable-proxy", NULL, NULL, TRUE, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GSocketClient:tls: + * + * Whether to create TLS connections. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_TLS, - g_param_spec_boolean ("tls", - P_("TLS"), - P_("Whether to create TLS connections"), + g_param_spec_boolean ("tls", NULL, NULL, FALSE, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | @@ -958,9 +992,7 @@ g_socket_client_class_init (GSocketClientClass *class) * Deprecated: 2.72: Do not attempt to ignore validation errors. */ g_object_class_install_property (gobject_class, PROP_TLS_VALIDATION_FLAGS, - g_param_spec_flags ("tls-validation-flags", - P_("TLS validation flags"), - P_("TLS validation flags to use"), + g_param_spec_flags ("tls-validation-flags", NULL, NULL, G_TYPE_TLS_CERTIFICATE_FLAGS, G_TLS_CERTIFICATE_VALIDATE_ALL, G_PARAM_CONSTRUCT | @@ -976,9 +1008,7 @@ g_socket_client_class_init (GSocketClientClass *class) * Since: 2.36 */ g_object_class_install_property (gobject_class, PROP_PROXY_RESOLVER, - g_param_spec_object ("proxy-resolver", - P_("Proxy resolver"), - P_("The proxy resolver to use"), + g_param_spec_object ("proxy-resolver", NULL, NULL, G_TYPE_PROXY_RESOLVER, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | @@ -1473,7 +1503,10 @@ typedef struct GSList *successful_connections; SocketClientErrorInfo *error_info; - gboolean enumerated_at_least_once; + /* Number of times g_socket_address_enumerator_next_async() has successfully + * returned an address. */ + guint n_addresses_enumerated; + gboolean enumeration_completed; gboolean connection_in_progress; gboolean completed; @@ -1508,7 +1541,8 @@ typedef struct GIOStream *connection; GProxyAddress *proxy_addr; GSocketClientAsyncConnectData *data; /* unowned */ - GSource *timeout_source; + GSource *delay_timeout_source; /* (owned) */ + gboolean delay_reached; GCancellable *cancellable; GCancellable *task_cancellable; /* (owned); this is equal to g_task_get_cancellable (ConnectionAttempt.data->task), but with a longer lifetime */ gulong cancelled_id; @@ -1544,10 +1578,10 @@ connection_attempt_unref (gpointer pointer) attempt->cancelled_id = 0; g_clear_object (&attempt->cancellable); g_clear_object (&attempt->proxy_addr); - if (attempt->timeout_source) + if (attempt->delay_timeout_source) { - g_source_destroy (attempt->timeout_source); - g_source_unref (attempt->timeout_source); + g_source_destroy (attempt->delay_timeout_source); + g_source_unref (attempt->delay_timeout_source); } g_free (attempt); } @@ -1556,8 +1590,12 @@ connection_attempt_unref (gpointer pointer) static void connection_attempt_remove (ConnectionAttempt *attempt) { - attempt->data->connection_attempts = g_slist_remove (attempt->data->connection_attempts, attempt); - connection_attempt_unref (attempt); + GSList *attempt_link = g_slist_find (attempt->data->connection_attempts, attempt); + if (attempt_link != NULL) + { + attempt->data->connection_attempts = g_slist_delete_link (attempt->data->connection_attempts, attempt_link); + connection_attempt_unref (attempt); + } } static void @@ -1632,7 +1670,7 @@ enumerator_next_async (GSocketClientAsyncConnectData *data, if (add_task_ref) g_object_ref (data->task); - if (!data->enumerated_at_least_once) + if (data->n_addresses_enumerated == 0) g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_RESOLVING, data->connectable, NULL); g_debug ("GSocketClient: Starting new address enumeration"); g_socket_address_enumerator_next_async (data->enumerator, @@ -1696,6 +1734,10 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS data->client->priv->tls_validation_flags); G_GNUC_END_IGNORE_DEPRECATIONS g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_TLS_HANDSHAKING, data->connectable, G_IO_STREAM (tlsconn)); + + /* This operation will time out if the underlying #GSocket times out on + * any part of the TLS handshake. It does not have a higher-level + * timeout. */ g_tls_connection_handshake_async (G_TLS_CONNECTION (tlsconn), G_PRIORITY_DEFAULT, g_task_get_cancellable (data->task), @@ -1768,6 +1810,8 @@ task_completed_or_cancelled (GSocketClientAsyncConnectData *data) return FALSE; } +/* Returns %TRUE if it’s popped a connection of data->successful_connections and + * successfully started the next ongoing async operation for that connection. */ static gboolean try_next_successful_connection (GSocketClientAsyncConnectData *data) { @@ -1821,6 +1865,12 @@ try_next_successful_connection (GSocketClientAsyncConnectData *data) g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_PROXY_NEGOTIATING, data->connectable, attempt->connection); g_debug ("GSocketClient: Starting proxy connection"); + + /* FIXME: The #GProxy implementations do not have well-defined timeout + * behaviour, so this operation may theoretically never complete or time + * out. In practice, all #GProxy implementations use a #GSocket and a + * default timeout on that will eventually be hit. But there is no + * higher-level timeout. */ g_proxy_connect_async (proxy, connection, proxy_addr, @@ -1853,13 +1903,15 @@ try_next_connection_or_finish (GSocketClientAsyncConnectData *data, if (data->connection_in_progress) return; - /* Keep trying successful connections until one works, each iteration pops one */ + /* Try to pop and make progress on the next successful_connection. */ while (data->successful_connections) { if (try_next_successful_connection (data)) return; } + /* If there are no more successful_connections which we can make progress on, + * try the next address enumeration. */ if (!data->enumeration_completed) { enumerator_next_async (data, FALSE); @@ -1879,15 +1931,16 @@ g_socket_client_connected_callback (GObject *source, if (task_completed_or_cancelled (data) || g_cancellable_is_cancelled (attempt->cancellable)) { - g_object_unref (data->task); + connection_attempt_remove (attempt); connection_attempt_unref (attempt); + g_object_unref (data->task); return; } - if (attempt->timeout_source) + if (attempt->delay_timeout_source) { - g_source_destroy (attempt->timeout_source); - g_clear_pointer (&attempt->timeout_source, g_source_unref); + g_source_destroy (attempt->delay_timeout_source); + g_clear_pointer (&attempt->delay_timeout_source, g_source_unref); } if (!g_socket_connection_connect_finish (G_SOCKET_CONNECTION (source), @@ -1930,17 +1983,20 @@ g_socket_client_connected_callback (GObject *source, } static gboolean -on_connection_attempt_timeout (gpointer data) +on_connection_attempt_delay_reached (gpointer data) { ConnectionAttempt *attempt = data; + g_assert (!attempt->delay_reached); + attempt->delay_reached = TRUE; + if (!attempt->data->enumeration_completed) { - g_debug ("GSocketClient: Timeout reached, trying another enumeration"); + g_debug ("GSocketClient: Connection attempt delay reached, trying another enumeration"); enumerator_next_async (attempt->data, TRUE); } - g_clear_pointer (&attempt->timeout_source, g_source_unref); + g_clear_pointer (&attempt->delay_timeout_source, g_source_unref); return G_SOURCE_REMOVE; } @@ -1987,8 +2043,8 @@ g_socket_client_enumerator_callback (GObject *object, If this fails and nothing is in progress then we will complete task here. */ - if ((data->enumerated_at_least_once && !data->connection_attempts && !data->connection_in_progress) || - !data->enumerated_at_least_once) + if ((data->n_addresses_enumerated > 0 && !data->connection_attempts && !data->connection_in_progress) || + data->n_addresses_enumerated == 0) { g_debug ("GSocketClient: Address enumeration failed: %s", data->error_info->tmp_error ? data->error_info->tmp_error->message : NULL); @@ -2003,12 +2059,11 @@ g_socket_client_enumerator_callback (GObject *object, } g_debug ("GSocketClient: Address enumeration succeeded"); - if (!data->enumerated_at_least_once) - { - g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_RESOLVED, - data->connectable, NULL); - data->enumerated_at_least_once = TRUE; - } + if (data->n_addresses_enumerated == 0) + g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_RESOLVED, + data->connectable, NULL); + + data->n_addresses_enumerated++; socket = create_socket (data->client, address, &data->error_info->tmp_error); if (socket == NULL) @@ -2025,13 +2080,16 @@ g_socket_client_enumerator_callback (GObject *object, attempt->address = address; attempt->cancellable = g_cancellable_new (); attempt->connection = (GIOStream *)g_socket_connection_factory_create_connection (socket); - attempt->timeout_source = g_timeout_source_new (HAPPY_EYEBALLS_CONNECTION_ATTEMPT_TIMEOUT_MS); + attempt->delay_timeout_source = g_timeout_source_new (HAPPY_EYEBALLS_CONNECTION_ATTEMPT_DELAY_MS); + + g_debug ("%s: starting connection attempt %p for GSocketClientAsyncConnectData %p", + G_STRFUNC, attempt, data); if (G_IS_PROXY_ADDRESS (address) && data->client->priv->enable_proxy) attempt->proxy_addr = g_object_ref (G_PROXY_ADDRESS (address)); - g_source_set_callback (attempt->timeout_source, on_connection_attempt_timeout, attempt, NULL); - g_source_attach (attempt->timeout_source, g_task_get_context (data->task)); + g_source_set_callback (attempt->delay_timeout_source, on_connection_attempt_delay_reached, attempt, NULL); + g_source_attach (attempt->delay_timeout_source, g_task_get_context (data->task)); data->connection_attempts = g_slist_append (data->connection_attempts, connection_attempt_ref (attempt)); if (g_task_get_cancellable (data->task)) @@ -2045,6 +2103,10 @@ g_socket_client_enumerator_callback (GObject *object, g_socket_connection_set_cached_remote_address ((GSocketConnection *)attempt->connection, address); g_debug ("GSocketClient: Starting TCP connection attempt"); g_socket_client_emit_event (data->client, G_SOCKET_CLIENT_CONNECTING, data->connectable, attempt->connection); + + /* If client->priv->timeout is set, this async operation will time out after + * then. Otherwise it will continue until the kernel timeouts for a + * non-blocking connect() call (if any) are hit. */ g_socket_connection_connect_async (G_SOCKET_CONNECTION (attempt->connection), address, attempt->cancellable, @@ -2123,7 +2185,7 @@ g_socket_client_connect_async (GSocketClient *client, - Each connection is independent and kept in a ConnectionAttempt object. - They each hold a ref on the main task and have their own cancellable. - Multiple attempts may happen in parallel as per Happy Eyeballs. - - Upon failure or timeouts more connection attempts are made. + - Upon failure or attempt delays being reached more connection attempts are made. - If no connections succeed the task errors. - Upon success they are kept in a list of successful connections. @@ -2152,6 +2214,10 @@ g_socket_client_connect_async (GSocketClient *client, g_object_ref (data->enumeration_cancellable), g_object_unref); } + g_debug ("%s: starting new g_socket_client_connect_async() with GTask %p " + "and GSocketClientAsyncConnectData %p", + G_STRFUNC, data->task, data); + enumerator_next_async (data, FALSE); } diff --git a/gio/gsocketconnectable.c b/gio/gsocketconnectable.c index 1efde65..728992b 100644 --- a/gio/gsocketconnectable.c +++ b/gio/gsocketconnectable.c @@ -24,17 +24,15 @@ /** - * SECTION:gsocketconnectable - * @short_description: Interface for potential socket endpoints - * @include: gio/gio.h + * GSocketConnectable: * * Objects that describe one or more potential socket endpoints - * implement #GSocketConnectable. Callers can then use - * g_socket_connectable_enumerate() to get a #GSocketAddressEnumerator - * to try out each socket address in turn until one succeeds, as shown - * in the sample code below. + * implement `GSocketConnectable`. Callers can then use + * [method@Gio.SocketConnectable.enumerate] to get a + * [class@Gio.SocketAddressEnumerator] to try out each socket address in turn + * until one succeeds, as shown in the sample code below. * - * |[ + * ```c * MyConnectionType * * connect_to_host (const char *hostname, * guint16 port, @@ -84,7 +82,7 @@ * return NULL; * } * } - * ]| + * ``` */ diff --git a/gio/gsocketconnectable.h b/gio/gsocketconnectable.h index ed2cad9..bedef56 100644 --- a/gio/gsocketconnectable.h +++ b/gio/gsocketconnectable.h @@ -34,11 +34,6 @@ G_BEGIN_DECLS #define G_IS_SOCKET_CONNECTABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_SOCKET_CONNECTABLE)) #define G_SOCKET_CONNECTABLE_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), G_TYPE_SOCKET_CONNECTABLE, GSocketConnectableIface)) -/** - * GSocketConnectable: - * - * Interface for objects that contain or generate a #GSocketAddress. - */ typedef struct _GSocketConnectableIface GSocketConnectableIface; /** diff --git a/gio/gsocketconnection.c b/gio/gsocketconnection.c index 67e8f3d..c535438 100644 --- a/gio/gsocketconnection.c +++ b/gio/gsocketconnection.c @@ -40,27 +40,24 @@ /** - * SECTION:gsocketconnection - * @short_description: A socket connection - * @include: gio/gio.h - * @see_also: #GIOStream, #GSocketClient, #GSocketListener + * GSocketConnection: * - * #GSocketConnection is a #GIOStream for a connected socket. They - * can be created either by #GSocketClient when connecting to a host, - * or by #GSocketListener when accepting a new client. + * `GSocketConnection` is a [class@Gio.IOStream] for a connected socket. They + * can be created either by [class@Gio.SocketClient] when connecting to a host, + * or by [class@Gio.SocketListener] when accepting a new client. * - * The type of the #GSocketConnection object returned from these calls + * The type of the `GSocketConnection` object returned from these calls * depends on the type of the underlying socket that is in use. For - * instance, for a TCP/IP connection it will be a #GTcpConnection. + * instance, for a TCP/IP connection it will be a [class@Gio.TcpConnection]. * * Choosing what type of object to construct is done with the socket - * connection factory, and it is possible for 3rd parties to register + * connection factory, and it is possible for third parties to register * custom socket connection types for specific combination of socket - * family/type/protocol using g_socket_connection_factory_register_type(). + * family/type/protocol using [func@Gio.SocketConnection.factory_register_type]. * - * To close a #GSocketConnection, use g_io_stream_close(). Closing both - * substreams of the #GIOStream separately will not close the underlying - * #GSocket. + * To close a `GSocketConnection`, use [method@Gio.IOStream.close]. Closing both + * substreams of the [class@Gio.IOStream] separately will not close the + * underlying [class@Gio.Socket]. * * Since: 2.22 */ @@ -180,6 +177,10 @@ static gboolean g_socket_connection_connect_callback (GSocket *socket, * This clears the #GSocket:blocking flag on @connection's underlying * socket if it is currently set. * + * If #GSocket:timeout is set, the operation will time out and return + * %G_IO_ERROR_TIMED_OUT after that period. Otherwise, it will continue + * indefinitely until operating system timeouts (if any) are hit. + * * Use g_socket_connection_connect_finish() to retrieve the result. * * Since: 2.32 @@ -448,11 +449,16 @@ g_socket_connection_class_init (GSocketConnectionClass *klass) stream_class->close_async = g_socket_connection_close_async; stream_class->close_finish = g_socket_connection_close_finish; + /** + * GSocketConnection:socket: + * + * The underlying [class@Gio.Socket]. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_SOCKET, - g_param_spec_object ("socket", - P_("Socket"), - P_("The underlying GSocket"), + g_param_spec_object ("socket", NULL, NULL, G_TYPE_SOCKET, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | diff --git a/gio/gsocketcontrolmessage.c b/gio/gsocketcontrolmessage.c index 398e04e..d79bd74 100644 --- a/gio/gsocketcontrolmessage.c +++ b/gio/gsocketcontrolmessage.c @@ -15,32 +15,28 @@ */ /** - * SECTION:gsocketcontrolmessage - * @title: GSocketControlMessage - * @short_description: A GSocket control message - * @include: gio/gio.h - * @see_also: #GSocket. + * GSocketControlMessage: * - * A #GSocketControlMessage is a special-purpose utility message that - * can be sent to or received from a #GSocket. These types of - * messages are often called "ancillary data". + * A `GSocketControlMessage` is a special-purpose utility message that + * can be sent to or received from a [class@Gio.Socket]. These types of + * messages are often called ‘ancillary data’. * * The message can represent some sort of special instruction to or * information from the socket or can represent a special kind of * transfer to the peer (for example, sending a file descriptor over * a UNIX socket). * - * These messages are sent with g_socket_send_message() and received - * with g_socket_receive_message(). + * These messages are sent with [method@Gio.Socket.send_message] and received + * with [method@Gio.Socket.receive_message]. * * To extend the set of control message that can be sent, subclass this - * class and override the get_size, get_level, get_type and serialize + * class and override the `get_size`, `get_level`, `get_type` and `serialize` * methods. * * To extend the set of control messages that can be received, subclass - * this class and implement the deserialize method. Also, make sure your - * class is registered with the GType typesystem before calling - * g_socket_receive_message() to read such a message. + * this class and implement the `deserialize` method. Also, make sure your + * class is registered with the [type@GObject.Type] type system before calling + * [method@Gio.Socket.receive_message] to read such a message. * * Since: 2.22 */ diff --git a/gio/gsocketinputstream.c b/gio/gsocketinputstream.c index 5307fcd..7a15f51 100644 --- a/gio/gsocketinputstream.c +++ b/gio/gsocketinputstream.c @@ -191,9 +191,7 @@ g_socket_input_stream_class_init (GSocketInputStreamClass *klass) ginputstream_class->read_fn = g_socket_input_stream_read; g_object_class_install_property (gobject_class, PROP_SOCKET, - g_param_spec_object ("socket", - P_("socket"), - P_("The socket that this stream wraps"), + g_param_spec_object ("socket", NULL, NULL, G_TYPE_SOCKET, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gsocketlistener.c b/gio/gsocketlistener.c index 392f9ec..8a296a5 100644 --- a/gio/gsocketlistener.c +++ b/gio/gsocketlistener.c @@ -42,26 +42,23 @@ /** - * SECTION:gsocketlistener - * @title: GSocketListener - * @short_description: Helper for accepting network client connections - * @include: gio/gio.h - * @see_also: #GThreadedSocketService, #GSocketService. + * GSocketListener: * - * A #GSocketListener is an object that keeps track of a set + * A `GSocketListener` is an object that keeps track of a set * of server sockets and helps you accept sockets from any of the * socket, either sync or async. * - * Add addresses and ports to listen on using g_socket_listener_add_address() - * and g_socket_listener_add_inet_port(). These will be listened on until - * g_socket_listener_close() is called. Dropping your final reference to the - * #GSocketListener will not cause g_socket_listener_close() to be called - * implicitly, as some references to the #GSocketListener may be held + * Add addresses and ports to listen on using + * [method@Gio.SocketListener.add_address] and + * [method@Gio.SocketListener.add_inet_port]. These will be listened on until + * [method@Gio.SocketListener.close] is called. Dropping your final reference to + * the `GSocketListener` will not cause [method@Gio.SocketListener.close] to be + * called implicitly, as some references to the `GSocketListener` may be held * internally. * - * If you want to implement a network server, also look at #GSocketService - * and #GThreadedSocketService which are subclasses of #GSocketListener - * that make this even easier. + * If you want to implement a network server, also look at + * [class@Gio.SocketService] and [class@Gio.ThreadedSocketService] which are + * subclasses of `GSocketListener` that make this even easier. * * Since: 2.22 */ @@ -157,10 +154,16 @@ g_socket_listener_class_init (GSocketListenerClass *klass) gobject_class->finalize = g_socket_listener_finalize; gobject_class->set_property = g_socket_listener_set_property; gobject_class->get_property = g_socket_listener_get_property; + + /** + * GSocketListener:listen-backlog: + * + * The number of outstanding connections in the listen queue. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_LISTEN_BACKLOG, - g_param_spec_int ("listen-backlog", - P_("Listen backlog"), - P_("outstanding connections in the listen queue"), + g_param_spec_int ("listen-backlog", NULL, NULL, 0, 2000, 10, diff --git a/gio/gsocketoutputstream.c b/gio/gsocketoutputstream.c index d380c52..a5b4c35 100644 --- a/gio/gsocketoutputstream.c +++ b/gio/gsocketoutputstream.c @@ -247,9 +247,7 @@ g_socket_output_stream_class_init (GSocketOutputStreamClass *klass) goutputstream_class->writev_fn = g_socket_output_stream_writev; g_object_class_install_property (gobject_class, PROP_SOCKET, - g_param_spec_object ("socket", - P_("socket"), - P_("The socket that this stream wraps"), + g_param_spec_object ("socket", NULL, NULL, G_TYPE_SOCKET, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gsocketservice.c b/gio/gsocketservice.c index 42e18d0..324e6ef 100644 --- a/gio/gsocketservice.c +++ b/gio/gsocketservice.c @@ -23,37 +23,33 @@ */ /** - * SECTION:gsocketservice - * @title: GSocketService - * @short_description: Make it easy to implement a network service - * @include: gio/gio.h - * @see_also: #GThreadedSocketService, #GSocketListener. + * GSocketService: * - * A #GSocketService is an object that represents a service that + * A `GSocketService` is an object that represents a service that * is provided to the network or over local sockets. When a new - * connection is made to the service the #GSocketService::incoming + * connection is made to the service the [signal@Gio.SocketService::incoming] * signal is emitted. * - * A #GSocketService is a subclass of #GSocketListener and you need + * A `GSocketService` is a subclass of [class@Gio.SocketListener] and you need * to add the addresses you want to accept connections on with the - * #GSocketListener APIs. + * [class@Gio.SocketListener] APIs. * * There are two options for implementing a network service based on - * #GSocketService. The first is to create the service using - * g_socket_service_new() and to connect to the #GSocketService::incoming - * signal. The second is to subclass #GSocketService and override the - * default signal handler implementation. + * `GSocketService`. The first is to create the service using + * [ctor@Gio.SocketService.new] and to connect to the + * [signal@Gio.SocketService::incoming] signal. The second is to subclass + * `GSocketService` and override the default signal handler implementation. * * In either case, the handler must immediately return, or else it * will block additional incoming connections from being serviced. * If you are interested in writing connection handlers that contain - * blocking code then see #GThreadedSocketService. + * blocking code then see [class@Gio.ThreadedSocketService]. * * The socket service runs on the main loop of the - * [thread-default context][g-main-context-push-thread-default-context] - * of the thread it is created in, and is not - * threadsafe in general. However, the calls to start and stop the - * service are thread-safe so these can be used from threads that + * thread-default context (see + * [method@GLib.MainContext.push_thread_default]) of the thread it is + * created in, and is not threadsafe in general. However, the calls to start and + * stop the service are thread-safe so these can be used from threads that * handle incoming clients. * * Since: 2.22 @@ -364,9 +360,7 @@ g_socket_service_class_init (GSocketServiceClass *class) * Since: 2.46 */ g_object_class_install_property (gobject_class, PROP_ACTIVE, - g_param_spec_boolean ("active", - P_("Active"), - P_("Whether the service is currently accepting connections"), + g_param_spec_boolean ("active", NULL, NULL, TRUE, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gsocks5proxy.c b/gio/gsocks5proxy.c index 6f25672..71ac107 100644 --- a/gio/gsocks5proxy.c +++ b/gio/gsocks5proxy.c @@ -724,10 +724,10 @@ nego_reply_read_cb (GObject *source, if (read == 0) { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CONNECTION_CLOSED, - "Connection to SOCKSv5 proxy server lost"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection to SOCKSv5 proxy server lost"); g_object_unref (task); return; } @@ -837,10 +837,10 @@ auth_reply_read_cb (GObject *source, if (read == 0) { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CONNECTION_CLOSED, - "Connection to SOCKSv5 proxy server lost"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection to SOCKSv5 proxy server lost"); g_object_unref (task); return; } @@ -949,10 +949,10 @@ connect_reply_read_cb (GObject *source, if (read == 0) { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CONNECTION_CLOSED, - "Connection to SOCKSv5 proxy server lost"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection to SOCKSv5 proxy server lost"); g_object_unref (task); return; } @@ -1019,10 +1019,10 @@ connect_addr_len_read_cb (GObject *source, if (read == 0) { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CONNECTION_CLOSED, - "Connection to SOCKSv5 proxy server lost"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection to SOCKSv5 proxy server lost"); g_object_unref (task); return; } @@ -1055,10 +1055,10 @@ connect_addr_read_cb (GObject *source, if (read == 0) { - g_task_return_new_error (task, - G_IO_ERROR, - G_IO_ERROR_CONNECTION_CLOSED, - "Connection to SOCKSv5 proxy server lost"); + g_task_return_new_error_literal (task, + G_IO_ERROR, + G_IO_ERROR_CONNECTION_CLOSED, + "Connection to SOCKSv5 proxy server lost"); g_object_unref (task); return; } diff --git a/gio/gsrvtarget.c b/gio/gsrvtarget.c index cecd4eb..f5f17ef 100644 --- a/gio/gsrvtarget.c +++ b/gio/gsrvtarget.c @@ -31,24 +31,24 @@ /** - * SECTION:gsrvtarget - * @short_description: DNS SRV record target - * @include: gio/gio.h + * GSrvTarget: + * + * A single target host/port that a network service is running on. * * SRV (service) records are used by some network protocols to provide * service-specific aliasing and load-balancing. For example, XMPP * (Jabber) uses SRV records to locate the XMPP server for a domain; - * rather than connecting directly to "example.com" or assuming a - * specific server hostname like "xmpp.example.com", an XMPP client - * would look up the "xmpp-client" SRV record for "example.com", and + * rather than connecting directly to ‘example.com’ or assuming a + * specific server hostname like ‘xmpp.example.com’, an XMPP client + * would look up the `xmpp-client` SRV record for ‘example.com’, and * then connect to whatever host was pointed to by that record. * - * You can use g_resolver_lookup_service() or - * g_resolver_lookup_service_async() to find the #GSrvTargets + * You can use [method@Gio.Resolver.lookup_service] or + * [method@Gio.Resolver.lookup_service_async] to find the `GSrvTarget`s * for a given service. However, if you are simply planning to connect - * to the remote service, you can use #GNetworkService's - * #GSocketConnectable interface and not need to worry about - * #GSrvTarget at all. + * to the remote service, you can use [class@Gio.NetworkService]’s + * [iface@Gio.SocketConnectable] interface and not need to worry about + * `GSrvTarget` at all. */ struct _GSrvTarget { @@ -59,12 +59,6 @@ struct _GSrvTarget { guint16 weight; }; -/** - * GSrvTarget: - * - * A single target host/port that a network service is running on. - */ - G_DEFINE_BOXED_TYPE (GSrvTarget, g_srv_target, g_srv_target_copy, g_srv_target_free) diff --git a/gio/gsubprocess.c b/gio/gsubprocess.c index c4747a1..6af94db 100644 --- a/gio/gsubprocess.c +++ b/gio/gsubprocess.c @@ -17,18 +17,14 @@ */ /** - * SECTION:gsubprocess - * @title: GSubprocess - * @short_description: Child processes - * @include: gio/gio.h - * @see_also: #GSubprocessLauncher + * GSubprocess: * - * #GSubprocess allows the creation of and interaction with child + * `GSubprocess` allows the creation of and interaction with child * processes. * * Processes can be communicated with using standard GIO-style APIs (ie: - * #GInputStream, #GOutputStream). There are GIO-style APIs to wait for - * process termination (ie: cancellable and with an asynchronous + * [class@Gio.InputStream], [class@Gio.OutputStream]). There are GIO-style APIs + * to wait for process termination (ie: cancellable and with an asynchronous * variant). * * There is an API to force a process to terminate, as well as a @@ -36,50 +32,50 @@ * * One major advantage that GIO brings over the core GLib library is * comprehensive API for asynchronous I/O, such - * g_output_stream_splice_async(). This makes GSubprocess + * [method@Gio.OutputStream.splice_async]. This makes `GSubprocess` * significantly more powerful and flexible than equivalent APIs in * some other languages such as the `subprocess.py` - * included with Python. For example, using #GSubprocess one could + * included with Python. For example, using `GSubprocess` one could * create two child processes, reading standard output from the first, * processing it, and writing to the input stream of the second, all * without blocking the main loop. * - * A powerful g_subprocess_communicate() API is provided similar to the + * A powerful [method@Gio.Subprocess.communicate] API is provided similar to the * `communicate()` method of `subprocess.py`. This enables very easy * interaction with a subprocess that has been opened with pipes. * - * #GSubprocess defaults to tight control over the file descriptors open - * in the child process, avoiding dangling-fd issues that are caused by - * a simple fork()/exec(). The only open file descriptors in the + * `GSubprocess` defaults to tight control over the file descriptors open + * in the child process, avoiding dangling-FD issues that are caused by + * a simple `fork()`/`exec()`. The only open file descriptors in the * spawned process are ones that were explicitly specified by the - * #GSubprocess API (unless %G_SUBPROCESS_FLAGS_INHERIT_FDS was + * `GSubprocess` API (unless `G_SUBPROCESS_FLAGS_INHERIT_FDS` was * specified). * - * #GSubprocess will quickly reap all child processes as they exit, - * avoiding "zombie processes" remaining around for long periods of - * time. g_subprocess_wait() can be used to wait for this to happen, + * `GSubprocess` will quickly reap all child processes as they exit, + * avoiding ‘zombie processes’ remaining around for long periods of + * time. [method@Gio.Subprocess.wait] can be used to wait for this to happen, * but it will happen even without the call being explicitly made. * - * As a matter of principle, #GSubprocess has no API that accepts + * As a matter of principle, `GSubprocess` has no API that accepts * shell-style space-separated strings. It will, however, match the - * typical shell behaviour of searching the PATH for executables that do + * typical shell behaviour of searching the `PATH` for executables that do * not contain a directory separator in their name. By default, the `PATH` * of the current process is used. You can specify - * %G_SUBPROCESS_FLAGS_SEARCH_PATH_FROM_ENVP to use the `PATH` of the + * `G_SUBPROCESS_FLAGS_SEARCH_PATH_FROM_ENVP` to use the `PATH` of the * launcher environment instead. * - * #GSubprocess attempts to have a very simple API for most uses (ie: + * `GSubprocess` attempts to have a very simple API for most uses (ie: * spawning a subprocess with arguments and support for most typical - * kinds of input and output redirection). See g_subprocess_new(). The - * #GSubprocessLauncher API is provided for more complicated cases + * kinds of input and output redirection). See [ctor@Gio.Subprocess.new]. The + * [class@Gio.SubprocessLauncher] API is provided for more complicated cases * (advanced types of redirection, environment variable manipulation, * change of working directory, child setup functions, etc). * - * A typical use of #GSubprocess will involve calling - * g_subprocess_new(), followed by g_subprocess_wait_async() or - * g_subprocess_wait(). After the process exits, the status can be - * checked using functions such as g_subprocess_get_if_exited() (which - * are similar to the familiar WIFEXITED-style POSIX macros). + * A typical use of `GSubprocess` will involve calling + * [ctor@Gio.Subprocess.new], followed by [method@Gio.Subprocess.wait_async] or + * [method@Gio.Subprocess.wait]. After the process exits, the status can be + * checked using functions such as [method@Gio.Subprocess.get_if_exited] (which + * are similar to the familiar `WIFEXITED`-style POSIX macros). * * Since: 2.40 **/ @@ -500,12 +496,27 @@ g_subprocess_class_init (GSubprocessClass *class) gobject_class->finalize = g_subprocess_finalize; gobject_class->set_property = g_subprocess_set_property; + /** + * GSubprocess:flags: + * + * Subprocess flags. + * + * Since: 2.40 + */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", P_("Flags"), P_("Subprocess flags"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_SUBPROCESS_FLAGS, 0, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GSubprocess:argv: + * + * Argument vector. + * + * Since: 2.40 + */ g_object_class_install_property (gobject_class, PROP_ARGV, - g_param_spec_boxed ("argv", P_("Arguments"), P_("Argument vector"), + g_param_spec_boxed ("argv", NULL, NULL, G_TYPE_STRV, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gsubprocesslauncher.c b/gio/gsubprocesslauncher.c index 759ddf0..d5ec01e 100644 --- a/gio/gsubprocesslauncher.c +++ b/gio/gsubprocesslauncher.c @@ -17,16 +17,13 @@ */ /** - * SECTION:gsubprocesslauncher - * @title: GSubprocess Launcher - * @short_description: Environment options for launching a child process - * @include: gio/gio.h + * GSubprocessLauncher: * * This class contains a set of options for launching child processes, * such as where its standard input and output will be directed, the * argument list, the environment, and more. * - * While the #GSubprocess class has high level functions covering + * While the [class@Gio.Subprocess] class has high level functions covering * popular cases, use of this class allows access to more advanced * options. It can also be used to launch multiple subprocesses with * a similar configuration. @@ -179,8 +176,15 @@ g_subprocess_launcher_class_init (GSubprocessLauncherClass *class) gobject_class->set_property = g_subprocess_launcher_set_property; gobject_class->dispose = g_subprocess_launcher_dispose; + /** + * GSubprocessLauncher:flags: + * + * [flags@Gio.SubprocessFlags] for launched processes. + * + * Since: 2.40 + */ g_object_class_install_property (gobject_class, 1, - g_param_spec_flags ("flags", "Flags", "GSubprocessFlags for launched processes", + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_SUBPROCESS_FLAGS, 0, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY)); } @@ -403,7 +407,7 @@ assign_fd (gint *fd_ptr, gint fd) /** * g_subprocess_launcher_set_stdin_file_path: * @self: a #GSubprocessLauncher - * @path: (type filename) (nullable: a filename or %NULL + * @path: (type filename) (nullable): a filename or %NULL * * Sets the file path to use as the stdin for spawned processes. * diff --git a/gio/gtask.c b/gio/gtask.c index 1272700..e6815e2 100644 --- a/gio/gtask.c +++ b/gio/gtask.c @@ -33,520 +33,518 @@ #include /** - * SECTION:gtask - * @short_description: Cancellable synchronous or asynchronous task - * and result - * @include: gio/gio.h - * @see_also: #GAsyncResult + * GTask: * - * A #GTask represents and manages a cancellable "task". + * A `GTask` represents and manages a cancellable ‘task’. * * ## Asynchronous operations * - * The most common usage of #GTask is as a #GAsyncResult, to + * The most common usage of `GTask` is as a [iface@Gio.AsyncResult], to * manage data during an asynchronous operation. You call - * g_task_new() in the "start" method, followed by - * g_task_set_task_data() and the like if you need to keep some + * [ctor@Gio.Task.new] in the ‘start’ method, followed by + * [method@Gio.Task.set_task_data] and the like if you need to keep some * additional data associated with the task, and then pass the * task object around through your asynchronous operation. * Eventually, you will call a method such as - * g_task_return_pointer() or g_task_return_error(), which will - * save the value you give it and then invoke the task's callback - * function in the - * [thread-default main context][g-main-context-push-thread-default] + * [method@Gio.Task.return_pointer] or [method@Gio.Task.return_error], which + * will save the value you give it and then invoke the task’s callback + * function in the thread-default main context (see + * [method@GLib.MainContext.push_thread_default]) * where it was created (waiting until the next iteration of the main - * loop first, if necessary). The caller will pass the #GTask back to - * the operation's finish function (as a #GAsyncResult), and you can - * use g_task_propagate_pointer() or the like to extract the + * loop first, if necessary). The caller will pass the `GTask` back to + * the operation’s finish function (as a [iface@Gio.AsyncResult]), and you can + * use [method@Gio.Task.propagate_pointer] or the like to extract the * return value. * - * Using #GTask requires the thread-default #GMainContext from when the - * #GTask was constructed to be running at least until the task has completed - * and its data has been freed. + * Using `GTask` requires the thread-default [struct@GLib.MainContext] from when + * the `GTask` was constructed to be running at least until the task has + * completed and its data has been freed. * - * If a #GTask has been constructed and its callback set, it is an error to + * If a `GTask` has been constructed and its callback set, it is an error to * not call `g_task_return_*()` on it. GLib will warn at runtime if this happens * (since 2.76). * - * Here is an example for using GTask as a GAsyncResult: - * |[ - * typedef struct { - * CakeFrostingType frosting; - * char *message; - * } DecorationData; + * Here is an example for using `GTask` as a [iface@Gio.AsyncResult]: + * ```c + * typedef struct { + * CakeFrostingType frosting; + * char *message; + * } DecorationData; * - * static void - * decoration_data_free (DecorationData *decoration) + * static void + * decoration_data_free (DecorationData *decoration) + * { + * g_free (decoration->message); + * g_slice_free (DecorationData, decoration); + * } + * + * static void + * baked_cb (Cake *cake, + * gpointer user_data) + * { + * GTask *task = user_data; + * DecorationData *decoration = g_task_get_task_data (task); + * GError *error = NULL; + * + * if (cake == NULL) * { - * g_free (decoration->message); - * g_slice_free (DecorationData, decoration); + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, + * "Go to the supermarket"); + * g_object_unref (task); + * return; * } * - * static void - * baked_cb (Cake *cake, - * gpointer user_data) + * if (!cake_decorate (cake, decoration->frosting, decoration->message, &error)) * { - * GTask *task = user_data; - * DecorationData *decoration = g_task_get_task_data (task); - * GError *error = NULL; + * g_object_unref (cake); + * // g_task_return_error() takes ownership of error + * g_task_return_error (task, error); + * g_object_unref (task); + * return; + * } * - * if (cake == NULL) - * { - * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, - * "Go to the supermarket"); - * g_object_unref (task); - * return; - * } + * g_task_return_pointer (task, cake, g_object_unref); + * g_object_unref (task); + * } * - * if (!cake_decorate (cake, decoration->frosting, decoration->message, &error)) - * { - * g_object_unref (cake); - * // g_task_return_error() takes ownership of error - * g_task_return_error (task, error); - * g_object_unref (task); - * return; - * } + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * GTask *task; + * DecorationData *decoration; + * Cake *cake; * + * task = g_task_new (self, cancellable, callback, user_data); + * if (radius < 3) + * { + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_TOO_SMALL, + * "%ucm radius cakes are silly", + * radius); + * g_object_unref (task); + * return; + * } + * + * cake = _baker_get_cached_cake (self, radius, flavor, frosting, message); + * if (cake != NULL) + * { + * // _baker_get_cached_cake() returns a reffed cake * g_task_return_pointer (task, cake, g_object_unref); * g_object_unref (task); + * return; * } * - * void - * baker_bake_cake_async (Baker *self, - * guint radius, - * CakeFlavor flavor, - * CakeFrostingType frosting, - * const char *message, - * GCancellable *cancellable, - * GAsyncReadyCallback callback, - * gpointer user_data) - * { - * GTask *task; - * DecorationData *decoration; - * Cake *cake; + * decoration = g_slice_new (DecorationData); + * decoration->frosting = frosting; + * decoration->message = g_strdup (message); + * g_task_set_task_data (task, decoration, (GDestroyNotify) decoration_data_free); * - * task = g_task_new (self, cancellable, callback, user_data); - * if (radius < 3) - * { - * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_TOO_SMALL, - * "%ucm radius cakes are silly", - * radius); - * g_object_unref (task); - * return; - * } + * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); + * } * - * cake = _baker_get_cached_cake (self, radius, flavor, frosting, message); - * if (cake != NULL) - * { - * // _baker_get_cached_cake() returns a reffed cake - * g_task_return_pointer (task, cake, g_object_unref); - * g_object_unref (task); - * return; - * } + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); * - * decoration = g_slice_new (DecorationData); - * decoration->frosting = frosting; - * decoration->message = g_strdup (message); - * g_task_set_task_data (task, decoration, (GDestroyNotify) decoration_data_free); - * - * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); - * } - * - * Cake * - * baker_bake_cake_finish (Baker *self, - * GAsyncResult *result, - * GError **error) - * { - * g_return_val_if_fail (g_task_is_valid (result, self), NULL); - * - * return g_task_propagate_pointer (G_TASK (result), error); - * } - * ]| + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * ``` * * ## Chained asynchronous operations * - * #GTask also tries to simplify asynchronous operations that + * `GTask` also tries to simplify asynchronous operations that * internally chain together several smaller asynchronous - * operations. g_task_get_cancellable(), g_task_get_context(), - * and g_task_get_priority() allow you to get back the task's - * #GCancellable, #GMainContext, and [I/O priority][io-priority] - * when starting a new subtask, so you don't have to keep track - * of them yourself. g_task_attach_source() simplifies the case + * operations. [method@Gio.Task.get_cancellable], [method@Gio.Task.get_context], + * and [method@Gio.Task.get_priority] allow you to get back the task’s + * [class@Gio.Cancellable], [struct@GLib.MainContext], and + * [I/O priority](iface.AsyncResult.html#io-priority) + * when starting a new subtask, so you don’t have to keep track + * of them yourself. [method@Gio.Task.attach_source] simplifies the case * of waiting for a source to fire (automatically using the correct - * #GMainContext and priority). + * [struct@GLib.MainContext] and priority). * * Here is an example for chained asynchronous operations: - * |[ - * typedef struct { - * Cake *cake; - * CakeFrostingType frosting; - * char *message; - * } BakingData; + * ```c + * typedef struct { + * Cake *cake; + * CakeFrostingType frosting; + * char *message; + * } BakingData; * - * static void - * decoration_data_free (BakingData *bd) + * static void + * decoration_data_free (BakingData *bd) + * { + * if (bd->cake) + * g_object_unref (bd->cake); + * g_free (bd->message); + * g_slice_free (BakingData, bd); + * } + * + * static void + * decorated_cb (Cake *cake, + * GAsyncResult *result, + * gpointer user_data) + * { + * GTask *task = user_data; + * GError *error = NULL; + * + * if (!cake_decorate_finish (cake, result, &error)) * { - * if (bd->cake) - * g_object_unref (bd->cake); - * g_free (bd->message); - * g_slice_free (BakingData, bd); - * } - * - * static void - * decorated_cb (Cake *cake, - * GAsyncResult *result, - * gpointer user_data) - * { - * GTask *task = user_data; - * GError *error = NULL; - * - * if (!cake_decorate_finish (cake, result, &error)) - * { - * g_object_unref (cake); - * g_task_return_error (task, error); - * g_object_unref (task); - * return; - * } - * - * // baking_data_free() will drop its ref on the cake, so we have to - * // take another here to give to the caller. - * g_task_return_pointer (task, g_object_ref (cake), g_object_unref); + * g_object_unref (cake); + * g_task_return_error (task, error); * g_object_unref (task); + * return; * } * - * static gboolean - * decorator_ready (gpointer user_data) + * // baking_data_free() will drop its ref on the cake, so we have to + * // take another here to give to the caller. + * g_task_return_pointer (task, g_object_ref (cake), g_object_unref); + * g_object_unref (task); + * } + * + * static gboolean + * decorator_ready (gpointer user_data) + * { + * GTask *task = user_data; + * BakingData *bd = g_task_get_task_data (task); + * + * cake_decorate_async (bd->cake, bd->frosting, bd->message, + * g_task_get_cancellable (task), + * decorated_cb, task); + * + * return G_SOURCE_REMOVE; + * } + * + * static void + * baked_cb (Cake *cake, + * gpointer user_data) + * { + * GTask *task = user_data; + * BakingData *bd = g_task_get_task_data (task); + * GError *error = NULL; + * + * if (cake == NULL) * { - * GTask *task = user_data; - * BakingData *bd = g_task_get_task_data (task); - * - * cake_decorate_async (bd->cake, bd->frosting, bd->message, - * g_task_get_cancellable (task), - * decorated_cb, task); - * - * return G_SOURCE_REMOVE; + * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, + * "Go to the supermarket"); + * g_object_unref (task); + * return; * } * - * static void - * baked_cb (Cake *cake, - * gpointer user_data) + * bd->cake = cake; + * + * // Bail out now if the user has already cancelled + * if (g_task_return_error_if_cancelled (task)) * { - * GTask *task = user_data; - * BakingData *bd = g_task_get_task_data (task); - * GError *error = NULL; - * - * if (cake == NULL) - * { - * g_task_return_new_error (task, BAKER_ERROR, BAKER_ERROR_NO_FLOUR, - * "Go to the supermarket"); - * g_object_unref (task); - * return; - * } - * - * bd->cake = cake; - * - * // Bail out now if the user has already cancelled - * if (g_task_return_error_if_cancelled (task)) - * { - * g_object_unref (task); - * return; - * } - * - * if (cake_decorator_available (cake)) - * decorator_ready (task); - * else - * { - * GSource *source; - * - * source = cake_decorator_wait_source_new (cake); - * // Attach @source to @task's GMainContext and have it call - * // decorator_ready() when it is ready. - * g_task_attach_source (task, source, decorator_ready); - * g_source_unref (source); - * } + * g_object_unref (task); + * return; * } * - * void - * baker_bake_cake_async (Baker *self, - * guint radius, - * CakeFlavor flavor, - * CakeFrostingType frosting, - * const char *message, - * gint priority, - * GCancellable *cancellable, - * GAsyncReadyCallback callback, - * gpointer user_data) + * if (cake_decorator_available (cake)) + * decorator_ready (task); + * else * { - * GTask *task; - * BakingData *bd; + * GSource *source; * - * task = g_task_new (self, cancellable, callback, user_data); - * g_task_set_priority (task, priority); - * - * bd = g_slice_new0 (BakingData); - * bd->frosting = frosting; - * bd->message = g_strdup (message); - * g_task_set_task_data (task, bd, (GDestroyNotify) baking_data_free); - * - * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); + * source = cake_decorator_wait_source_new (cake); + * // Attach @source to @task’s GMainContext and have it call + * // decorator_ready() when it is ready. + * g_task_attach_source (task, source, decorator_ready); + * g_source_unref (source); * } + * } * - * Cake * - * baker_bake_cake_finish (Baker *self, - * GAsyncResult *result, - * GError **error) - * { - * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * gint priority, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * GTask *task; + * BakingData *bd; * - * return g_task_propagate_pointer (G_TASK (result), error); - * } - * ]| + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_priority (task, priority); + * + * bd = g_slice_new0 (BakingData); + * bd->frosting = frosting; + * bd->message = g_strdup (message); + * g_task_set_task_data (task, bd, (GDestroyNotify) baking_data_free); + * + * _baker_begin_cake (self, radius, flavor, cancellable, baked_cb, task); + * } + * + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * ``` * * ## Asynchronous operations from synchronous ones * - * You can use g_task_run_in_thread() to turn a synchronous + * You can use [method@Gio.Task.run_in_thread] to turn a synchronous * operation into an asynchronous one, by running it in a thread. - * When it completes, the result will be dispatched to the - * [thread-default main context][g-main-context-push-thread-default] - * where the #GTask was created. + * When it completes, the result will be dispatched to the thread-default main + * context (see [method@GLib.MainContext.push_thread_default]) where the `GTask` + * was created. * * Running a task in a thread: - * |[ - * typedef struct { - * guint radius; - * CakeFlavor flavor; - * CakeFrostingType frosting; - * char *message; - * } CakeData; + * ```c + * typedef struct { + * guint radius; + * CakeFlavor flavor; + * CakeFrostingType frosting; + * char *message; + * } CakeData; * - * static void - * cake_data_free (CakeData *cake_data) - * { - * g_free (cake_data->message); - * g_slice_free (CakeData, cake_data); - * } + * static void + * cake_data_free (CakeData *cake_data) + * { + * g_free (cake_data->message); + * g_slice_free (CakeData, cake_data); + * } * - * static void - * bake_cake_thread (GTask *task, - * gpointer source_object, - * gpointer task_data, - * GCancellable *cancellable) - * { - * Baker *self = source_object; - * CakeData *cake_data = task_data; - * Cake *cake; - * GError *error = NULL; + * static void + * bake_cake_thread (GTask *task, + * gpointer source_object, + * gpointer task_data, + * GCancellable *cancellable) + * { + * Baker *self = source_object; + * CakeData *cake_data = task_data; + * Cake *cake; + * GError *error = NULL; * - * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, - * cake_data->frosting, cake_data->message, - * cancellable, &error); - * if (cake) - * g_task_return_pointer (task, cake, g_object_unref); - * else - * g_task_return_error (task, error); - * } + * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, + * cake_data->frosting, cake_data->message, + * cancellable, &error); + * if (cake) + * g_task_return_pointer (task, cake, g_object_unref); + * else + * g_task_return_error (task, error); + * } * - * void - * baker_bake_cake_async (Baker *self, - * guint radius, - * CakeFlavor flavor, - * CakeFrostingType frosting, - * const char *message, - * GCancellable *cancellable, - * GAsyncReadyCallback callback, - * gpointer user_data) - * { - * CakeData *cake_data; - * GTask *task; + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * CakeData *cake_data; + * GTask *task; * - * cake_data = g_slice_new (CakeData); - * cake_data->radius = radius; - * cake_data->flavor = flavor; - * cake_data->frosting = frosting; - * cake_data->message = g_strdup (message); - * task = g_task_new (self, cancellable, callback, user_data); - * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); - * g_task_run_in_thread (task, bake_cake_thread); - * g_object_unref (task); - * } + * cake_data = g_slice_new (CakeData); + * cake_data->radius = radius; + * cake_data->flavor = flavor; + * cake_data->frosting = frosting; + * cake_data->message = g_strdup (message); + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_run_in_thread (task, bake_cake_thread); + * g_object_unref (task); + * } * - * Cake * - * baker_bake_cake_finish (Baker *self, - * GAsyncResult *result, - * GError **error) - * { - * g_return_val_if_fail (g_task_is_valid (result, self), NULL); + * Cake * + * baker_bake_cake_finish (Baker *self, + * GAsyncResult *result, + * GError **error) + * { + * g_return_val_if_fail (g_task_is_valid (result, self), NULL); * - * return g_task_propagate_pointer (G_TASK (result), error); - * } - * ]| + * return g_task_propagate_pointer (G_TASK (result), error); + * } + * ``` * * ## Adding cancellability to uncancellable tasks * - * Finally, g_task_run_in_thread() and g_task_run_in_thread_sync() - * can be used to turn an uncancellable operation into a - * cancellable one. If you call g_task_set_return_on_cancel(), - * passing %TRUE, then if the task's #GCancellable is cancelled, - * it will return control back to the caller immediately, while - * allowing the task thread to continue running in the background - * (and simply discarding its result when it finally does finish). + * Finally, [method@Gio.Task.run_in_thread] and + * [method@Gio.Task.run_in_thread_sync] can be used to turn an uncancellable + * operation into a cancellable one. If you call + * [method@Gio.Task.set_return_on_cancel], passing `TRUE`, then if the task’s + * [class@Gio.Cancellable] is cancelled, it will return control back to the + * caller immediately, while allowing the task thread to continue running in the + * background (and simply discarding its result when it finally does finish). * Provided that the task thread is careful about how it uses * locks and other externally-visible resources, this allows you - * to make "GLib-friendly" asynchronous and cancellable + * to make ‘GLib-friendly’ asynchronous and cancellable * synchronous variants of blocking APIs. * * Cancelling a task: - * |[ - * static void - * bake_cake_thread (GTask *task, - * gpointer source_object, - * gpointer task_data, - * GCancellable *cancellable) + * ```c + * static void + * bake_cake_thread (GTask *task, + * gpointer source_object, + * gpointer task_data, + * GCancellable *cancellable) + * { + * Baker *self = source_object; + * CakeData *cake_data = task_data; + * Cake *cake; + * GError *error = NULL; + * + * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, + * cake_data->frosting, cake_data->message, + * &error); + * if (error) * { - * Baker *self = source_object; - * CakeData *cake_data = task_data; - * Cake *cake; - * GError *error = NULL; - * - * cake = bake_cake (baker, cake_data->radius, cake_data->flavor, - * cake_data->frosting, cake_data->message, - * &error); - * if (error) - * { - * g_task_return_error (task, error); - * return; - * } - * - * // If the task has already been cancelled, then we don't want to add - * // the cake to the cake cache. Likewise, we don't want to have the - * // task get cancelled in the middle of updating the cache. - * // g_task_set_return_on_cancel() will return %TRUE here if it managed - * // to disable return-on-cancel, or %FALSE if the task was cancelled - * // before it could. - * if (g_task_set_return_on_cancel (task, FALSE)) - * { - * // If the caller cancels at this point, their - * // GAsyncReadyCallback won't be invoked until we return, - * // so we don't have to worry that this code will run at - * // the same time as that code does. But if there were - * // other functions that might look at the cake cache, - * // then we'd probably need a GMutex here as well. - * baker_add_cake_to_cache (baker, cake); - * g_task_return_pointer (task, cake, g_object_unref); - * } + * g_task_return_error (task, error); + * return; * } * - * void - * baker_bake_cake_async (Baker *self, - * guint radius, - * CakeFlavor flavor, - * CakeFrostingType frosting, - * const char *message, - * GCancellable *cancellable, - * GAsyncReadyCallback callback, - * gpointer user_data) + * // If the task has already been cancelled, then we don’t want to add + * // the cake to the cake cache. Likewise, we don’t want to have the + * // task get cancelled in the middle of updating the cache. + * // g_task_set_return_on_cancel() will return %TRUE here if it managed + * // to disable return-on-cancel, or %FALSE if the task was cancelled + * // before it could. + * if (g_task_set_return_on_cancel (task, FALSE)) * { - * CakeData *cake_data; - * GTask *task; - * - * cake_data = g_slice_new (CakeData); - * - * ... - * - * task = g_task_new (self, cancellable, callback, user_data); - * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); - * g_task_set_return_on_cancel (task, TRUE); - * g_task_run_in_thread (task, bake_cake_thread); + * // If the caller cancels at this point, their + * // GAsyncReadyCallback won’t be invoked until we return, + * // so we don’t have to worry that this code will run at + * // the same time as that code does. But if there were + * // other functions that might look at the cake cache, + * // then we’d probably need a GMutex here as well. + * baker_add_cake_to_cache (baker, cake); + * g_task_return_pointer (task, cake, g_object_unref); * } + * } * - * Cake * - * baker_bake_cake_sync (Baker *self, - * guint radius, - * CakeFlavor flavor, - * CakeFrostingType frosting, - * const char *message, - * GCancellable *cancellable, - * GError **error) - * { - * CakeData *cake_data; - * GTask *task; - * Cake *cake; + * void + * baker_bake_cake_async (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GAsyncReadyCallback callback, + * gpointer user_data) + * { + * CakeData *cake_data; + * GTask *task; * - * cake_data = g_slice_new (CakeData); + * cake_data = g_slice_new (CakeData); * - * ... + * ... * - * task = g_task_new (self, cancellable, NULL, NULL); - * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); - * g_task_set_return_on_cancel (task, TRUE); - * g_task_run_in_thread_sync (task, bake_cake_thread); + * task = g_task_new (self, cancellable, callback, user_data); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_set_return_on_cancel (task, TRUE); + * g_task_run_in_thread (task, bake_cake_thread); + * } * - * cake = g_task_propagate_pointer (task, error); - * g_object_unref (task); - * return cake; - * } - * ]| + * Cake * + * baker_bake_cake_sync (Baker *self, + * guint radius, + * CakeFlavor flavor, + * CakeFrostingType frosting, + * const char *message, + * GCancellable *cancellable, + * GError **error) + * { + * CakeData *cake_data; + * GTask *task; + * Cake *cake; * - * ## Porting from GSimpleAsyncResult + * cake_data = g_slice_new (CakeData); + * + * ... + * + * task = g_task_new (self, cancellable, NULL, NULL); + * g_task_set_task_data (task, cake_data, (GDestroyNotify) cake_data_free); + * g_task_set_return_on_cancel (task, TRUE); + * g_task_run_in_thread_sync (task, bake_cake_thread); + * + * cake = g_task_propagate_pointer (task, error); + * g_object_unref (task); + * return cake; + * } + * ``` + * + * ## Porting from [class@Gio.SimpleAsyncResult] * - * #GTask's API attempts to be simpler than #GSimpleAsyncResult's + * `GTask`’s API attempts to be simpler than [class@Gio.SimpleAsyncResult]’s * in several ways: - * - You can save task-specific data with g_task_set_task_data(), and - * retrieve it later with g_task_get_task_data(). This replaces the - * abuse of g_simple_async_result_set_op_res_gpointer() for the same - * purpose with #GSimpleAsyncResult. - * - In addition to the task data, #GTask also keeps track of the - * [priority][io-priority], #GCancellable, and - * #GMainContext associated with the task, so tasks that consist of - * a chain of simpler asynchronous operations will have easy access + * + * - You can save task-specific data with [method@Gio.Task.set_task_data], and + * retrieve it later with [method@Gio.Task.get_task_data]. This replaces the + * abuse of [method@Gio.SimpleAsyncResult.set_op_res_gpointer] for the same + * purpose with [class@Gio.SimpleAsyncResult]. + * - In addition to the task data, `GTask` also keeps track of the + * [priority](iface.AsyncResult.html#io-priority), [class@Gio.Cancellable], + * and [struct@GLib.MainContext] associated with the task, so tasks that + * consist of a chain of simpler asynchronous operations will have easy access * to those values when starting each sub-task. - * - g_task_return_error_if_cancelled() provides simplified + * - [method@Gio.Task.return_error_if_cancelled] provides simplified * handling for cancellation. In addition, cancellation - * overrides any other #GTask return value by default, like - * #GSimpleAsyncResult does when - * g_simple_async_result_set_check_cancellable() is called. - * (You can use g_task_set_check_cancellable() to turn off that - * behavior.) On the other hand, g_task_run_in_thread() + * overrides any other `GTask` return value by default, like + * [class@Gio.SimpleAsyncResult] does when + * [method@Gio.SimpleAsyncResult.set_check_cancellable] is called. + * (You can use [method@Gio.Task.set_check_cancellable] to turn off that + * behavior.) On the other hand, [method@Gio.Task.run_in_thread] * guarantees that it will always run your - * `task_func`, even if the task's #GCancellable + * `task_func`, even if the task’s [class@Gio.Cancellable] * is already cancelled before the task gets a chance to run; * you can start your `task_func` with a - * g_task_return_error_if_cancelled() check if you need the + * [method@Gio.Task.return_error_if_cancelled] check if you need the * old behavior. - * - The "return" methods (eg, g_task_return_pointer()) - * automatically cause the task to be "completed" as well, and - * there is no need to worry about the "complete" vs "complete - * in idle" distinction. (#GTask automatically figures out - * whether the task's callback can be invoked directly, or - * if it needs to be sent to another #GMainContext, or delayed - * until the next iteration of the current #GMainContext.) - * - The "finish" functions for #GTask based operations are generally - * much simpler than #GSimpleAsyncResult ones, normally consisting - * of only a single call to g_task_propagate_pointer() or the like. - * Since g_task_propagate_pointer() "steals" the return value from - * the #GTask, it is not necessary to juggle pointers around to + * - The ‘return’ methods (eg, [method@Gio.Task.return_pointer]) + * automatically cause the task to be ‘completed’ as well, and + * there is no need to worry about the ‘complete’ vs ‘complete in idle’ + * distinction. (`GTask` automatically figures out + * whether the task’s callback can be invoked directly, or + * if it needs to be sent to another [struct@GLib.MainContext], or delayed + * until the next iteration of the current [struct@GLib.MainContext].) + * - The ‘finish’ functions for `GTask` based operations are generally + * much simpler than [class@Gio.SimpleAsyncResult] ones, normally consisting + * of only a single call to [method@Gio.Task.propagate_pointer] or the like. + * Since [method@Gio.Task.propagate_pointer] ‘steals’ the return value from + * the `GTask`, it is not necessary to juggle pointers around to * prevent it from being freed twice. - * - With #GSimpleAsyncResult, it was common to call - * g_simple_async_result_propagate_error() from the + * - With [class@Gio.SimpleAsyncResult], it was common to call + * [method@Gio.SimpleAsyncResult.propagate_error] from the * `_finish()` wrapper function, and have * virtual method implementations only deal with successful * returns. This behavior is deprecated, because it makes it - * difficult for a subclass to chain to a parent class's async + * difficult for a subclass to chain to a parent class’s async * methods. Instead, the wrapper function should just be a * simple wrapper, and the virtual method should call an * appropriate `g_task_propagate_` function. * Note that wrapper methods can now use - * g_async_result_legacy_propagate_error() to do old-style - * #GSimpleAsyncResult error-returning behavior, and - * g_async_result_is_tagged() to check if a result is tagged as + * [method@Gio.AsyncResult.legacy_propagate_error] to do old-style + * [class@Gio.SimpleAsyncResult] error-returning behavior, and + * [method@Gio.AsyncResult.is_tagged] to check if a result is tagged as * having come from the `_async()` wrapper - * function (for "short-circuit" results, such as when passing - * 0 to g_input_stream_read_async()). + * function (for ‘short-circuit’ results, such as when passing + * `0` to [method@Gio.InputStream.read_async]). * * ## Thread-safety considerations * * Due to some infelicities in the API design, there is a - * thread-safety concern that users of GTask have to be aware of: + * thread-safety concern that users of `GTask` have to be aware of: * * If the `main` thread drops its last reference to the source object * or the task data before the task is finalized, then the finalizers @@ -556,19 +554,11 @@ * can lead to hard-to-debug crashes. Possible workarounds include: * * - Clear task data in a signal handler for `notify::completed` - * * - Keep iterating a main context in the main thread and defer * dropping the reference to the source object to that main * context when the task is finalized */ -/** - * GTask: - * - * The opaque object representing a synchronous or asynchronous task - * and its result. - */ - struct _GTask { GObject parent_instance; @@ -962,7 +952,7 @@ g_task_set_task_data (GTask *task, /** * g_task_set_priority: * @task: the #GTask - * @priority: the [priority][io-priority] of the request + * @priority: the [priority](iface.AsyncResult.html#io-priority) of the request * * Sets @task's priority. If you do not call this, it will default to * %G_PRIORITY_DEFAULT. @@ -1787,8 +1777,9 @@ g_task_run_in_thread_sync (GTask *task, * * A utility function for dealing with async operations where you need * to wait for a #GSource to trigger. Attaches @source to @task's - * #GMainContext with @task's [priority][io-priority], and sets @source's - * callback to @callback, with @task as the callback's `user_data`. + * #GMainContext with @task's [priority](iface.AsyncResult.html#io-priority), + * and sets @source's callback to @callback, with @task as the callback's + * `user_data`. * * It will set the @source’s name to the task’s name (as set with * g_task_set_name()), if one has been set on the task and the source doesn’t @@ -2040,7 +2031,8 @@ g_task_propagate_boolean (GTask *task, * Call g_error_copy() on the error if you need to keep a local copy * as well. * - * See also g_task_return_new_error(). + * See also [method@Gio.Task.return_new_error], + * [method@Gio.Task.return_new_error_literal]. * * Since: 2.36 */ @@ -2057,6 +2049,54 @@ g_task_return_error (GTask *task, g_task_return (task, G_TASK_RETURN_ERROR); } +/** + * g_task_return_prefixed_error: + * @task: a #GTask. + * @error: (transfer full): the #GError result of a task function. + * @format: a string with format characters. + * @...: a list of values to insert into @format. + * + * Sets @task's result to @error (which @task assumes ownership of), with + * the message prefixed according to @format, and completes the task + * (see g_task_return_pointer() for more discussion of exactly what this + * means). + * + * Note that since the task takes ownership of @error, and since the + * task may be completed before returning from g_task_return_prefixed_error(), + * you cannot assume that @error is still valid after calling this. + * Call g_error_copy() on the error if you need to keep a local copy + * as well. + * + * See also g_task_return_error(), g_prefix_error(). + * + * Since: 2.80 + */ +void +g_task_return_prefixed_error (GTask *task, + GError *error, + const char *format, + ...) +{ + char *prefix; + va_list ap; + + g_return_if_fail (G_IS_TASK (task)); + g_return_if_fail (!task->ever_returned); + g_return_if_fail (error != NULL); + + task->error = error; + + va_start (ap, format); + prefix = g_strdup_vprintf (format, ap); + va_end (ap); + + g_prefix_error_literal (&task->error, prefix); + + g_free (prefix); + + g_task_return (task, G_TASK_RETURN_ERROR); +} + /** * g_task_return_new_error: * @task: a #GTask. @@ -2091,6 +2131,32 @@ g_task_return_new_error (GTask *task, g_task_return_error (task, error); } +/** + * g_task_return_new_error_literal: + * @task: a #GTask. + * @domain: a #GQuark. + * @code: an error code. + * @message: an error message + * + * Sets @task’s result to a new [type@GLib.Error] created from @domain, @code, + * @message and completes the task. + * + * See [method@Gio.Task.return_pointer] for more discussion of exactly what + * ‘completing the task’ means. + * + * See also [method@Gio.Task.return_new_error]. + * + * Since: 2.80 + */ +void +g_task_return_new_error_literal (GTask *task, + GQuark domain, + gint code, + const char *message) +{ + g_task_return_error (task, g_error_new_literal (domain, code, message)); +} + /** * g_task_return_error_if_cancelled: * @task: a #GTask @@ -2388,9 +2454,18 @@ g_task_class_init (GTaskClass *klass) * GTask:completed: * * Whether the task has completed, meaning its callback (if set) has been - * invoked. This can only happen after g_task_return_pointer(), + * invoked. + * + * This can only happen after g_task_return_pointer(), * g_task_return_error() or one of the other return functions have been called - * on the task. + * on the task. However, it is not guaranteed to happen immediately after + * those functions are called, as the task’s callback may need to be scheduled + * to run in a different thread. + * + * That means it is **not safe** to use this property to track whether a + * return function has been called on the #GTask. Callers must do that + * tracking themselves, typically by linking the lifetime of the #GTask to the + * control flow of their code. * * This property is guaranteed to change from %FALSE to %TRUE exactly once. * @@ -2400,9 +2475,7 @@ g_task_class_init (GTaskClass *klass) * Since: 2.44 */ g_object_class_install_property (gobject_class, PROP_COMPLETED, - g_param_spec_boolean ("completed", - P_("Task completed"), - P_("Whether the task has completed yet"), + g_param_spec_boolean ("completed", NULL, NULL, FALSE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); if (G_UNLIKELY (task_pool_max_counter == 0)) diff --git a/gio/gtask.h b/gio/gtask.h index 6d7fa82..9fabddc 100644 --- a/gio/gtask.h +++ b/gio/gtask.h @@ -163,12 +163,24 @@ void g_task_return_int (GTask *task, GIO_AVAILABLE_IN_2_36 void g_task_return_error (GTask *task, GError *error); +GIO_AVAILABLE_IN_2_80 +void g_task_return_prefixed_error (GTask *task, + GError *error, + const char *format, + ...) G_GNUC_PRINTF (3, 4); + GIO_AVAILABLE_IN_2_36 void g_task_return_new_error (GTask *task, GQuark domain, gint code, const char *format, ...) G_GNUC_PRINTF (4, 5); + +GIO_AVAILABLE_IN_2_80 +void g_task_return_new_error_literal (GTask *task, + GQuark domain, + gint code, + const char *message); GIO_AVAILABLE_IN_2_64 void g_task_return_value (GTask *task, GValue *result); diff --git a/gio/gtcpconnection.c b/gio/gtcpconnection.c index e0865d8..07747d1 100644 --- a/gio/gtcpconnection.c +++ b/gio/gtcpconnection.c @@ -13,13 +13,9 @@ */ /** - * SECTION:gtcpconnection - * @title: GTcpConnection - * @short_description: A TCP GSocketConnection - * @include: gio/gio.h - * @see_also: #GSocketConnection. + * GTcpConnection: * - * This is the subclass of #GSocketConnection that is created + * This is the subclass of [class@Gio.SocketConnection] that is created * for TCP/IP sockets. * * Since: 2.22 @@ -132,10 +128,15 @@ g_tcp_connection_class_init (GTcpConnectionClass *class) stream_class->close_fn = g_tcp_connection_close; stream_class->close_async = g_tcp_connection_close_async; + /** + * GTcpConnection:graceful-disconnect: + * + * Whether [method@Gio.IOStream.close] does a graceful disconnect. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_GRACEFUL_DISCONNECT, - g_param_spec_boolean ("graceful-disconnect", - P_("Graceful Disconnect"), - P_("Whether or not close does a graceful disconnect"), + g_param_spec_boolean ("graceful-disconnect", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gtcpwrapperconnection.c b/gio/gtcpwrapperconnection.c index 686aa42..b174e2b 100644 --- a/gio/gtcpwrapperconnection.c +++ b/gio/gtcpwrapperconnection.c @@ -21,29 +21,18 @@ */ /** - * SECTION:gtcpwrapperconnection - * @title: GTcpWrapperConnection - * @short_description: Wrapper for non-GSocketConnection-based, - * GSocket-based GIOStreams - * @include: gio/gio.h - * @see_also: #GSocketConnection. + * GTcpWrapperConnection: * - * A #GTcpWrapperConnection can be used to wrap a #GIOStream that is - * based on a #GSocket, but which is not actually a - * #GSocketConnection. This is used by #GSocketClient so that it can - * always return a #GSocketConnection, even when the connection it has - * actually created is not directly a #GSocketConnection. + * A `GTcpWrapperConnection` can be used to wrap a [class@Gio.IOStream] that is + * based on a [class@Gio.Socket], but which is not actually a + * [class@Gio.SocketConnection]. This is used by [class@Gio.SocketClient] so + * that it can always return a [class@Gio.SocketConnection], even when the + * connection it has actually created is not directly a + * [class@Gio.SocketConnection]. * * Since: 2.28 */ -/** - * GTcpWrapperConnection: - * - * #GTcpWrapperConnection is an opaque data structure and can only be accessed - * using the following functions. - **/ - #include "config.h" #include "gtcpwrapperconnection.h" @@ -142,11 +131,16 @@ g_tcp_wrapper_connection_class_init (GTcpWrapperConnectionClass *klass) stream_class->get_input_stream = g_tcp_wrapper_connection_get_input_stream; stream_class->get_output_stream = g_tcp_wrapper_connection_get_output_stream; + /** + * GTcpWrapperConnection:base-io-stream: + * + * The wrapped [class@Gio.IOStream]. + * + * Since: 2.28 + */ g_object_class_install_property (gobject_class, PROP_BASE_IO_STREAM, - g_param_spec_object ("base-io-stream", - P_("Base IO Stream"), - P_("The wrapped GIOStream"), + g_param_spec_object ("base-io-stream", NULL, NULL, G_TYPE_IO_STREAM, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | diff --git a/gio/gtestdbus.c b/gio/gtestdbus.c index d75b439..29727e2 100644 --- a/gio/gtestdbus.c +++ b/gio/gtestdbus.c @@ -121,25 +121,22 @@ _g_object_unref_and_wait_weak_notify (gpointer object) static void _g_test_watcher_add_pid (GPid pid) { - static gsize started = 0; - HANDLE job; + HANDLE job = NULL; - if (g_once_init_enter (&started)) + if (g_once_init_enter (&job)) { JOBOBJECT_EXTENDED_LIMIT_INFORMATION info; - job = CreateJobObjectW (NULL, NULL); + HANDLE tmp = CreateJobObjectW (NULL, NULL); memset (&info, 0, sizeof (info)); info.BasicLimitInformation.LimitFlags = 0x2000 /* JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE */; - if (!SetInformationJobObject(job, JobObjectExtendedLimitInformation, &info, sizeof (info))) - g_warning ("Can't enable JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: %s", g_win32_error_message (GetLastError())); + if (!SetInformationJobObject (tmp, JobObjectExtendedLimitInformation, &info, sizeof (info))) + g_warning ("Can't enable JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE: %s", g_win32_error_message (GetLastError())); - g_once_init_leave (&started,(gsize)job); + g_once_init_leave_pointer (&job, tmp); } - job = (HANDLE)started; - if (!AssignProcessToJobObject(job, pid)) g_warning ("Can't assign process to job: %s", g_win32_error_message (GetLastError())); } @@ -336,25 +333,23 @@ _g_test_watcher_remove_pid (GPid pid) /* GTestDBus object implementation */ /** - * SECTION:gtestdbus - * @short_description: D-Bus testing helper - * @include: gio/gio.h + * GTestDBus: * - * A helper class for testing code which uses D-Bus without touching the user's + * A helper class for testing code which uses D-Bus without touching the user’s * session bus. * - * Note that #GTestDBus modifies the user’s environment, calling setenv(). - * This is not thread-safe, so all #GTestDBus calls should be completed before - * threads are spawned, or should have appropriate locking to ensure no access - * conflicts to environment variables shared between #GTestDBus and other - * threads. + * Note that `GTestDBus` modifies the user’s environment, calling + * [`setenv()`](man:setenv(3)). This is not thread-safe, so all `GTestDBus` + * calls should be completed before threads are spawned, or should have + * appropriate locking to ensure no access conflicts to environment variables + * shared between `GTestDBus` and other threads. * - * ## Creating unit tests using GTestDBus + * ## Creating unit tests using `GTestDBus` * * Testing of D-Bus services can be tricky because normally we only ever run * D-Bus services over an existing instance of the D-Bus daemon thus we - * usually don't activate D-Bus services that are not yet installed into the - * target system. The #GTestDBus object makes this easier for us by taking care + * usually don’t activate D-Bus services that are not yet installed into the + * target system. The `GTestDBus` object makes this easier for us by taking care * of the lower level tasks such as running a private D-Bus daemon and looking * up uninstalled services in customizable locations, typically in your source * code tree. @@ -367,20 +362,24 @@ _g_test_watcher_remove_pid (GPid pid) * uninstalled service executable in your source tree. Using autotools we would * achieve this by adding a file such as `my-server.service.in` in the services * directory and have it processed by configure. - * |[ - * [D-BUS Service] - * Name=org.gtk.GDBus.Examples.ObjectManager - * Exec=@abs_top_builddir@/gio/tests/gdbus-example-objectmanager-server - * ]| + * + * ``` + * [D-BUS Service] + * Name=org.gtk.GDBus.Examples.ObjectManager + * Exec=@abs_top_builddir@/gio/tests/gdbus-example-objectmanager-server + * ``` + * * You will also need to indicate this service directory in your test * fixtures, so you will need to pass the path while compiling your * test cases. Typically this is done with autotools with an added * preprocessor flag specified to compile your tests such as: - * |[ - * -DTEST_SERVICES=\""$(abs_top_builddir)/tests/services"\" - * ]| - * Once you have a service definition file which is local to your source tree, - * you can proceed to set up a GTest fixture using the #GTestDBus scaffolding. + * + * ``` + * -DTEST_SERVICES=\""$(abs_top_builddir)/tests/services"\" + * ``` + * + * Once you have a service definition file which is local to your source tree, + * you can proceed to set up a GTest fixture using the `GTestDBus` scaffolding. * * An example of a test fixture for D-Bus services can be found * here: @@ -389,42 +388,39 @@ _g_test_watcher_remove_pid (GPid pid) * Note that these examples only deal with isolating the D-Bus aspect of your * service. To successfully run isolated unit tests on your service you may need * some additional modifications to your test case fixture. For example; if your - * service uses GSettings and installs a schema then it is important that your test service - * not load the schema in the ordinary installed location (chances are that your service - * and schema files are not yet installed, or worse; there is an older version of the - * schema file sitting in the install location). + * service uses [class@Gio.Settings] and installs a schema then it is important + * that your test service not load the schema in the ordinary installed location + * (chances are that your service and schema files are not yet installed, or + * worse; there is an older version of the schema file sitting in the install + * location). * * Most of the time we can work around these obstacles using the * environment. Since the environment is inherited by the D-Bus daemon - * created by #GTestDBus and then in turn inherited by any services the + * created by `GTestDBus` and then in turn inherited by any services the * D-Bus daemon activates, using the setup routine for your fixture is * a practical place to help sandbox your runtime environment. For the * rather typical GSettings case we can work around this by setting * `GSETTINGS_SCHEMA_DIR` to the in tree directory holding your schemas - * in the above fixture_setup() routine. + * in the above `fixture_setup()` routine. * - * The GSettings schemas need to be locally pre-compiled for this to work. This can be achieved - * by compiling the schemas locally as a step before running test cases, an autotools setup might - * do the following in the directory holding schemas: - * |[ + * The GSettings schemas need to be locally pre-compiled for this to work. This + * can be achieved by compiling the schemas locally as a step before running + * test cases, an autotools setup might do the following in the directory + * holding schemas: + * + * ``` * all-am: * $(GLIB_COMPILE_SCHEMAS) . * * CLEANFILES += gschemas.compiled - * ]| + * ``` + * + * Since: 2.34 */ typedef struct _GTestDBusClass GTestDBusClass; typedef struct _GTestDBusPrivate GTestDBusPrivate; -/** - * GTestDBus: - * - * The #GTestDBus structure contains only private data and - * should only be accessed using the provided API. - * - * Since: 2.34 - */ struct _GTestDBus { GObject parent; @@ -537,9 +533,7 @@ g_test_dbus_class_init (GTestDBusClass *klass) * Since: 2.34 */ g_object_class_install_property (object_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("D-Bus session flags"), - P_("Flags specifying the behaviour of the D-Bus session"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_TEST_DBUS_FLAGS, G_TEST_DBUS_NONE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gthemedicon.c b/gio/gthemedicon.c index 8551bd2..1d6aacd 100644 --- a/gio/gthemedicon.c +++ b/gio/gthemedicon.c @@ -31,16 +31,15 @@ /** - * SECTION:gthemedicon - * @short_description: Icon theming support - * @include: gio/gio.h - * @see_also: #GIcon, #GLoadableIcon + * GThemedIcon: * - * #GThemedIcon is an implementation of #GIcon that supports icon themes. - * #GThemedIcon contains a list of all of the icons present in an icon - * theme, so that icons can be looked up quickly. #GThemedIcon does + * `GThemedIcon` is an implementation of [iface@Gio.Icon] that supports icon + * themes. + * + * `GThemedIcon` contains a list of all of the icons present in an icon + * theme, so that icons can be looked up quickly. `GThemedIcon` does * not provide actual pixmaps for icons, just the icon names. - * Ideally something like gtk_icon_theme_choose_icon() should be used to + * Ideally something like [method@Gtk.IconTheme.choose_icon] should be used to * resolve the list of names so that fallback icons work nicely with * themes that inherit other themes. **/ @@ -180,9 +179,7 @@ g_themed_icon_class_init (GThemedIconClass *klass) * The icon name. */ g_object_class_install_property (gobject_class, PROP_NAME, - g_param_spec_string ("name", - P_("name"), - P_("The name of the icon"), + g_param_spec_string ("name", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); @@ -192,9 +189,7 @@ g_themed_icon_class_init (GThemedIconClass *klass) * A %NULL-terminated array of icon names. */ g_object_class_install_property (gobject_class, PROP_NAMES, - g_param_spec_boxed ("names", - P_("names"), - P_("An array containing the icon names"), + g_param_spec_boxed ("names", NULL, NULL, G_TYPE_STRV, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); @@ -218,9 +213,7 @@ g_themed_icon_class_init (GThemedIconClass *klass) * ]| */ g_object_class_install_property (gobject_class, PROP_USE_DEFAULT_FALLBACKS, - g_param_spec_boolean ("use-default-fallbacks", - P_("use default fallbacks"), - P_("Whether to use default fallbacks found by shortening the name at “-” characters. Ignores names after the first if multiple names are given."), + g_param_spec_boolean ("use-default-fallbacks", NULL, NULL, FALSE, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_BLURB | G_PARAM_STATIC_NICK)); } diff --git a/gio/gthemedicon.h b/gio/gthemedicon.h index 5ac36ce..432896d 100644 --- a/gio/gthemedicon.h +++ b/gio/gthemedicon.h @@ -38,11 +38,6 @@ G_BEGIN_DECLS #define G_IS_THEMED_ICON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_THEMED_ICON)) #define G_THEMED_ICON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_THEMED_ICON, GThemedIconClass)) -/** - * GThemedIcon: - * - * An implementation of #GIcon for themed icons. - **/ typedef struct _GThemedIconClass GThemedIconClass; GIO_AVAILABLE_IN_ALL diff --git a/gio/gthreadedresolver-private.h b/gio/gthreadedresolver-private.h new file mode 100644 index 0000000..b767267 --- /dev/null +++ b/gio/gthreadedresolver-private.h @@ -0,0 +1,46 @@ +/* GIO - GLib Input, Output and Streaming Library + * + * Copyright (C) 2008 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#ifndef __G_THREADED_RESOLVER_PRIVATE_H__ +#define __G_THREADED_RESOLVER_PRIVATE_H__ + +#include +#include + +G_BEGIN_DECLS + +/* Used for a private test API */ +#ifdef G_OS_UNIX +/*< private >*/ +GIO_AVAILABLE_IN_ALL +GList *g_resolver_records_from_res_query (const gchar *rrname, + gint rrtype, + const guint8 *answer, + gssize len, + gint herr, + GError **error); +/*< private >*/ +GIO_AVAILABLE_IN_ALL +gint g_resolver_record_type_to_rrtype (GResolverRecordType type); +#endif + +G_END_DECLS + +#endif /* __G_RESOLVER_PRIVATE_H__ */ diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c index c7a5675..b8588e7 100644 --- a/gio/gthreadedresolver.c +++ b/gio/gthreadedresolver.c @@ -30,6 +30,7 @@ #include "glib/glib-private.h" #include "gthreadedresolver.h" +#include "gthreadedresolver-private.h" #include "gnetworkingprivate.h" #include "gcancellable.h" @@ -1104,7 +1105,7 @@ g_resolver_records_from_res_query (const gchar *rrname, #elif defined(G_OS_WIN32) static GVariant * -parse_dns_srv (DNS_RECORD *rec) +parse_dns_srv (DNS_RECORDA *rec) { return g_variant_new ("(qqqs)", (guint16)rec->Data.SRV.wPriority, @@ -1114,7 +1115,7 @@ parse_dns_srv (DNS_RECORD *rec) } static GVariant * -parse_dns_soa (DNS_RECORD *rec) +parse_dns_soa (DNS_RECORDA *rec) { return g_variant_new ("(ssuuuuu)", rec->Data.SOA.pNamePrimaryServer, @@ -1127,13 +1128,13 @@ parse_dns_soa (DNS_RECORD *rec) } static GVariant * -parse_dns_ns (DNS_RECORD *rec) +parse_dns_ns (DNS_RECORDA *rec) { return g_variant_new ("(s)", rec->Data.NS.pNameHost); } static GVariant * -parse_dns_mx (DNS_RECORD *rec) +parse_dns_mx (DNS_RECORDA *rec) { return g_variant_new ("(qs)", (guint16)rec->Data.MX.wPreference, @@ -1141,7 +1142,7 @@ parse_dns_mx (DNS_RECORD *rec) } static GVariant * -parse_dns_txt (DNS_RECORD *rec) +parse_dns_txt (DNS_RECORDA *rec) { GVariant *record; GPtrArray *array; @@ -1179,10 +1180,10 @@ static GList * g_resolver_records_from_DnsQuery (const gchar *rrname, WORD dnstype, DNS_STATUS status, - DNS_RECORD *results, + DNS_RECORDA *results, GError **error) { - DNS_RECORD *rec; + DNS_RECORDA *rec; gpointer record; GList *records; @@ -1342,11 +1343,18 @@ do_lookup_records (const gchar *rrname, #else DNS_STATUS status; - DNS_RECORD *results = NULL; + DNS_RECORDA *results = NULL; WORD dnstype; + /* Work around differences in Windows SDK and mingw-w64 headers */ +#ifdef _MSC_VER + typedef DNS_RECORDW * PDNS_RECORD_UTF8_; +#else + typedef DNS_RECORDA * PDNS_RECORD_UTF8_; +#endif + dnstype = g_resolver_record_type_to_dnstype (record_type); - status = DnsQuery_A (rrname, dnstype, DNS_QUERY_STANDARD, NULL, &results, NULL); + status = DnsQuery_UTF8 (rrname, dnstype, DNS_QUERY_STANDARD, NULL, (PDNS_RECORD_UTF8_*)&results, NULL); records = g_resolver_records_from_DnsQuery (rrname, dnstype, status, results, error); if (results != NULL) DnsRecordListFree (results, DnsFreeRecordList); @@ -1441,8 +1449,10 @@ timeout_cb (gpointer user_data) g_mutex_unlock (&data->lock); if (should_return) - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_TIMED_OUT, - _("Socket I/O timed out")); + { + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_TIMED_OUT, + _("Socket I/O timed out")); + } /* Signal completion of the task. */ g_mutex_lock (&data->lock); @@ -1583,6 +1593,7 @@ threaded_resolver_worker_cb (gpointer task_data, } g_clear_pointer (&addresses, g_resolver_free_addresses); + g_clear_error (&local_error); } break; case LOOKUP_BY_ADDRESS: @@ -1604,6 +1615,7 @@ threaded_resolver_worker_cb (gpointer task_data, } g_clear_pointer (&name, g_free); + g_clear_error (&local_error); } break; case LOOKUP_RECORDS: @@ -1626,6 +1638,7 @@ threaded_resolver_worker_cb (gpointer task_data, } g_clear_pointer (&records, free_records); + g_clear_error (&local_error); } break; default: diff --git a/gio/gthreadedresolver.h b/gio/gthreadedresolver.h index 099df5b..5d84c5d 100644 --- a/gio/gthreadedresolver.h +++ b/gio/gthreadedresolver.h @@ -39,19 +39,6 @@ G_BEGIN_DECLS GIO_AVAILABLE_IN_ALL G_DECLARE_FINAL_TYPE (GThreadedResolver, g_threaded_resolver, G, THREADED_RESOLVER, GResolver) -/* Used for a private test API */ -#ifdef G_OS_UNIX -GIO_AVAILABLE_IN_ALL -GList *g_resolver_records_from_res_query (const gchar *rrname, - gint rrtype, - const guint8 *answer, - gssize len, - gint herr, - GError **error); -GIO_AVAILABLE_IN_ALL -gint g_resolver_record_type_to_rrtype (GResolverRecordType type); -#endif - G_END_DECLS #endif /* __G_RESOLVER_H__ */ diff --git a/gio/gthreadedsocketservice.c b/gio/gthreadedsocketservice.c index 63dc2a8..42e4fd2 100644 --- a/gio/gthreadedsocketservice.c +++ b/gio/gthreadedsocketservice.c @@ -23,27 +23,26 @@ */ /** - * SECTION:gthreadedsocketservice - * @title: GThreadedSocketService - * @short_description: A threaded GSocketService - * @include: gio/gio.h - * @see_also: #GSocketService. + * GThreadedSocketService: * - * A #GThreadedSocketService is a simple subclass of #GSocketService + * A `GThreadedSocketService` is a simple subclass of [class@Gio.SocketService] * that handles incoming connections by creating a worker thread and * dispatching the connection to it by emitting the - * #GThreadedSocketService::run signal in the new thread. + * [signal@Gio.ThreadedSocketService::run signal] in the new thread. * - * The signal handler may perform blocking IO and need not return + * The signal handler may perform blocking I/O and need not return * until the connection is closed. * * The service is implemented using a thread pool, so there is a * limited amount of threads available to serve incoming requests. - * The service automatically stops the #GSocketService from accepting + * The service automatically stops the [class@Gio.SocketService] from accepting * new connections when all threads are busy. * - * As with #GSocketService, you may connect to #GThreadedSocketService::run, - * or subclass and override the default handler. + * As with [class@Gio.SocketService], you may connect to + * [signal@Gio.ThreadedSocketService::run], or subclass and override the default + * handler. + * + * Since: 2.22 */ #include "config.h" @@ -248,10 +247,15 @@ g_threaded_socket_service_class_init (GThreadedSocketServiceClass *class) G_TYPE_FROM_CLASS (class), _g_cclosure_marshal_BOOLEAN__OBJECT_OBJECTv); + /** + * GThreadedSocketService:max-threads: + * + * The maximum number of threads handling clients for this service. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_MAX_THREADS, - g_param_spec_int ("max-threads", - P_("Max threads"), - P_("The max number of threads handling clients for this service"), + g_param_spec_int ("max-threads", NULL, NULL, -1, G_MAXINT, 10, diff --git a/gio/gtlsbackend.c b/gio/gtlsbackend.c index 227dd77..43bdbd4 100644 --- a/gio/gtlsbackend.c +++ b/gio/gtlsbackend.c @@ -28,53 +28,6 @@ #include "gioenumtypes.h" #include "giomodule-priv.h" -/** - * SECTION:gtls - * @title: TLS Overview - * @short_description: TLS (aka SSL) support for GSocketConnection - * @include: gio/gio.h - * - * #GTlsConnection and related classes provide TLS (Transport Layer - * Security, previously known as SSL, Secure Sockets Layer) support for - * gio-based network streams. - * - * #GDtlsConnection and related classes provide DTLS (Datagram TLS) support for - * GIO-based network sockets, using the #GDatagramBased interface. The TLS and - * DTLS APIs are almost identical, except TLS is stream-based and DTLS is - * datagram-based. They share certificate and backend infrastructure. - * - * In the simplest case, for a client TLS connection, you can just set the - * #GSocketClient:tls flag on a #GSocketClient, and then any - * connections created by that client will have TLS negotiated - * automatically, using appropriate default settings, and rejecting - * any invalid or self-signed certificates (unless you change that - * default by setting the #GSocketClient:tls-validation-flags - * property). The returned object will be a #GTcpWrapperConnection, - * which wraps the underlying #GTlsClientConnection. - * - * For greater control, you can create your own #GTlsClientConnection, - * wrapping a #GSocketConnection (or an arbitrary #GIOStream with - * pollable input and output streams) and then connect to its signals, - * such as #GTlsConnection::accept-certificate, before starting the - * handshake. - * - * Server-side TLS is similar, using #GTlsServerConnection. At the - * moment, there is no support for automatically wrapping server-side - * connections in the way #GSocketClient does for client-side - * connections. - */ - -/** - * SECTION:gtlsbackend - * @title: GTlsBackend - * @short_description: TLS backend implementation - * @include: gio/gio.h - * - * TLS (Transport Layer Security, aka SSL) and DTLS backend. - * - * Since: 2.28 - */ - /** * GTlsBackend: * @@ -110,7 +63,7 @@ static GTlsBackend *tls_backend_default_singleton = NULL; /* (owned) (atomic) * GTlsBackend * g_tls_backend_get_default (void) { - if (g_once_init_enter (&tls_backend_default_singleton)) + if (g_once_init_enter_pointer (&tls_backend_default_singleton)) { GTlsBackend *singleton; @@ -118,7 +71,7 @@ g_tls_backend_get_default (void) "GIO_USE_TLS", NULL); - g_once_init_leave (&tls_backend_default_singleton, singleton); + g_once_init_leave_pointer (&tls_backend_default_singleton, singleton); } return tls_backend_default_singleton; diff --git a/gio/gtlscertificate.c b/gio/gtlscertificate.c index 4862bc9..8720506 100644 --- a/gio/gtlscertificate.c +++ b/gio/gtlscertificate.c @@ -29,25 +29,13 @@ #include "glibintl.h" /** - * SECTION:gtlscertificate - * @title: GTlsCertificate - * @short_description: TLS certificate - * @include: gio/gio.h - * @see_also: #GTlsConnection + * GTlsCertificate: * * A certificate used for TLS authentication and encryption. * This can represent either a certificate only (eg, the certificate * received by a client from a server), or the combination of * a certificate and a private key (which is needed when acting as a - * #GTlsServerConnection). - * - * Since: 2.28 - */ - -/** - * GTlsCertificate: - * - * Abstract base class for TLS certificate types. + * [iface@Gio.TlsServerConnection]). * * Since: 2.28 */ @@ -147,9 +135,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.72 */ g_object_class_install_property (gobject_class, PROP_PKCS12_DATA, - g_param_spec_boxed ("pkcs12-data", - P_("PKCS #12 data"), - P_("The PKCS #12 data used for construction"), + g_param_spec_boxed ("pkcs12-data", NULL, NULL, G_TYPE_BYTE_ARRAY, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -163,9 +149,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.72 */ g_object_class_install_property (gobject_class, PROP_PASSWORD, - g_param_spec_string ("password", - P_("Password"), - P_("Password used when constructing from bytes"), + g_param_spec_string ("password", NULL, NULL, NULL, G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -180,9 +164,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_CERTIFICATE, - g_param_spec_boxed ("certificate", - P_("Certificate"), - P_("The DER representation of the certificate"), + g_param_spec_boxed ("certificate", NULL, NULL, G_TYPE_BYTE_ARRAY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -197,9 +179,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_CERTIFICATE_PEM, - g_param_spec_string ("certificate-pem", - P_("Certificate (PEM)"), - P_("The PEM representation of the certificate"), + g_param_spec_string ("certificate-pem", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -228,9 +208,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY, - g_param_spec_boxed ("private-key", - P_("Private key"), - P_("The DER representation of the certificate’s private key"), + g_param_spec_boxed ("private-key", NULL, NULL, G_TYPE_BYTE_ARRAY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -260,9 +238,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY_PEM, - g_param_spec_string ("private-key-pem", - P_("Private key (PEM)"), - P_("The PEM representation of the certificate’s private key"), + g_param_spec_string ("private-key-pem", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -290,9 +266,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_ISSUER, - g_param_spec_object ("issuer", - P_("Issuer"), - P_("The certificate for the issuing entity"), + g_param_spec_object ("issuer", NULL, NULL, G_TYPE_TLS_CERTIFICATE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -310,9 +284,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.68 */ g_object_class_install_property (gobject_class, PROP_PKCS11_URI, - g_param_spec_string ("pkcs11-uri", - P_("PKCS #11 URI"), - P_("The PKCS #11 URI"), + g_param_spec_string ("pkcs11-uri", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -327,9 +299,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.68 */ g_object_class_install_property (gobject_class, PROP_PRIVATE_KEY_PKCS11_URI, - g_param_spec_string ("private-key-pkcs11-uri", - P_("PKCS #11 URI"), - P_("The PKCS #11 URI for a private key"), + g_param_spec_string ("private-key-pkcs11-uri", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -344,9 +314,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_NOT_VALID_BEFORE, - g_param_spec_boxed ("not-valid-before", - P_("Not Valid Before"), - P_("Cert should not be considered valid before this time."), + g_param_spec_boxed ("not-valid-before", NULL, NULL, G_TYPE_DATE_TIME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -360,9 +328,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_NOT_VALID_AFTER, - g_param_spec_boxed ("not-valid-after", - P_("Not Valid after"), - P_("Cert should not be considered valid after this time."), + g_param_spec_boxed ("not-valid-after", NULL, NULL, G_TYPE_DATE_TIME, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -376,9 +342,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_SUBJECT_NAME, - g_param_spec_string ("subject-name", - P_("Subject Name"), - P_("The subject name from the certificate."), + g_param_spec_string ("subject-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -391,9 +355,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_ISSUER_NAME, - g_param_spec_string ("issuer-name", - P_("Issuer Name"), - P_("The issuer from the certificate."), + g_param_spec_string ("issuer-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -407,9 +369,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_DNS_NAMES, - g_param_spec_boxed ("dns-names", - P_("DNS Names"), - P_("DNS Names listed on the cert."), + g_param_spec_boxed ("dns-names", NULL, NULL, G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -423,9 +383,7 @@ g_tls_certificate_class_init (GTlsCertificateClass *class) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_IP_ADDRESSES, - g_param_spec_boxed ("ip-addresses", - P_("IP Addresses"), - P_("IP Addresses listed on the cert."), + g_param_spec_boxed ("ip-addresses", NULL, NULL, G_TYPE_PTR_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gtlsclientconnection.c b/gio/gtlsclientconnection.c index d64106e..2b511f3 100644 --- a/gio/gtlsclientconnection.c +++ b/gio/gtlsclientconnection.c @@ -30,20 +30,11 @@ #include "gtlscertificate.h" #include "glibintl.h" -/** - * SECTION:gtlsclientconnection - * @short_description: TLS client-side connection - * @include: gio/gio.h - * - * #GTlsClientConnection is the client-side subclass of - * #GTlsConnection, representing a client-side TLS connection. - */ - /** * GTlsClientConnection: * - * Abstract base class for the backend-specific client connection - * type. + * `GTlsClientConnection` is the client-side subclass of + * [class@Gio.TlsConnection], representing a client-side TLS connection. * * Since: 2.28 */ @@ -78,9 +69,7 @@ g_tls_client_connection_default_init (GTlsClientConnectionInterface *iface) * Deprecated: 2.72: Do not attempt to ignore validation errors. */ g_object_interface_install_property (iface, - g_param_spec_flags ("validation-flags", - P_("Validation flags"), - P_("What certificate validation to perform"), + g_param_spec_flags ("validation-flags", NULL, NULL, G_TYPE_TLS_CERTIFICATE_FLAGS, G_TLS_CERTIFICATE_VALIDATE_ALL, G_PARAM_READWRITE | @@ -109,9 +98,7 @@ g_tls_client_connection_default_init (GTlsClientConnectionInterface *iface) * Since: 2.28 */ g_object_interface_install_property (iface, - g_param_spec_object ("server-identity", - P_("Server identity"), - P_("GSocketConnectable identifying the server"), + g_param_spec_object ("server-identity", NULL, NULL, G_TYPE_SOCKET_CONNECTABLE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -128,9 +115,7 @@ g_tls_client_connection_default_init (GTlsClientConnectionInterface *iface) * Deprecated: 2.56: SSL 3.0 is insecure. */ g_object_interface_install_property (iface, - g_param_spec_boolean ("use-ssl3", - P_("Use fallback"), - P_("Use fallback version of SSL/TLS rather than most recent version"), + g_param_spec_boolean ("use-ssl3", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -151,9 +136,7 @@ g_tls_client_connection_default_init (GTlsClientConnectionInterface *iface) * Since: 2.28 */ g_object_interface_install_property (iface, - g_param_spec_pointer ("accepted-cas", - P_("Accepted CAs"), - P_("Distinguished names of the CAs the server accepts certificates from"), + g_param_spec_pointer ("accepted-cas", NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); } diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c index 95b4bc8..2e3f273 100644 --- a/gio/gtlsconnection.c +++ b/gio/gtlsconnection.c @@ -33,26 +33,16 @@ #include "glibintl.h" #include "gmarshal-internal.h" -/** - * SECTION:gtlsconnection - * @short_description: TLS connection type - * @include: gio/gio.h - * - * #GTlsConnection is the base TLS connection class type, which wraps - * a #GIOStream and provides TLS encryption on top of it. Its - * subclasses, #GTlsClientConnection and #GTlsServerConnection, - * implement client-side and server-side TLS, respectively. - * - * For DTLS (Datagram TLS) support, see #GDtlsConnection. - * - * Since: 2.28 - */ - /** * GTlsConnection: * - * Abstract base class for the backend-specific #GTlsClientConnection - * and #GTlsServerConnection types. + * `GTlsConnection` is the base TLS connection class type, which wraps + * a [class@Gio.IOStream] and provides TLS encryption on top of it. Its + * subclasses, [iface@Gio.TlsClientConnection] and + * [iface@Gio.TlsServerConnection], implement client-side and server-side TLS, + * respectively. + * + * For DTLS (Datagram TLS) support, see [iface@Gio.DtlsConnection]. * * Since: 2.28 */ @@ -113,9 +103,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_BASE_IO_STREAM, - g_param_spec_object ("base-io-stream", - P_("Base IOStream"), - P_("The GIOStream that the connection wraps"), + g_param_spec_object ("base-io-stream", NULL, NULL, G_TYPE_IO_STREAM, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -130,9 +118,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Deprecated: 2.30: Use GTlsConnection:database instead */ g_object_class_install_property (gobject_class, PROP_USE_SYSTEM_CERTDB, - g_param_spec_boolean ("use-system-certdb", - P_("Use system certificate database"), - P_("Whether to verify peer certificates against the system certificate database"), + g_param_spec_boolean ("use-system-certdb", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -161,9 +147,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.30 */ g_object_class_install_property (gobject_class, PROP_DATABASE, - g_param_spec_object ("database", - P_("Database"), - P_("Certificate database to use for looking up or verifying certificates"), + g_param_spec_object ("database", NULL, NULL, G_TYPE_TLS_DATABASE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -177,9 +161,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.30 */ g_object_class_install_property (gobject_class, PROP_INTERACTION, - g_param_spec_object ("interaction", - P_("Interaction"), - P_("Optional object for user interaction"), + g_param_spec_object ("interaction", NULL, NULL, G_TYPE_TLS_INTERACTION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -192,9 +174,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_REQUIRE_CLOSE_NOTIFY, - g_param_spec_boolean ("require-close-notify", - P_("Require close notify"), - P_("Whether to require proper TLS close notification"), + g_param_spec_boolean ("require-close-notify", NULL, NULL, TRUE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | @@ -210,9 +190,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Deprecated: 2.60: The rehandshake mode is ignored. */ g_object_class_install_property (gobject_class, PROP_REHANDSHAKE_MODE, - g_param_spec_enum ("rehandshake-mode", - P_("Rehandshake mode"), - P_("When to allow rehandshaking"), + g_param_spec_enum ("rehandshake-mode", NULL, NULL, G_TYPE_TLS_REHANDSHAKE_MODE, G_TLS_REHANDSHAKE_SAFELY, G_PARAM_READWRITE | @@ -228,9 +206,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_CERTIFICATE, - g_param_spec_object ("certificate", - P_("Certificate"), - P_("The connection’s certificate"), + g_param_spec_object ("certificate", NULL, NULL, G_TYPE_TLS_CERTIFICATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -247,9 +223,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_PEER_CERTIFICATE, - g_param_spec_object ("peer-certificate", - P_("Peer Certificate"), - P_("The connection’s peer’s certificate"), + g_param_spec_object ("peer-certificate", NULL, NULL, G_TYPE_TLS_CERTIFICATE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -274,9 +248,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.28 */ g_object_class_install_property (gobject_class, PROP_PEER_CERTIFICATE_ERRORS, - g_param_spec_flags ("peer-certificate-errors", - P_("Peer Certificate Errors"), - P_("Errors found with the peer’s certificate"), + g_param_spec_flags ("peer-certificate-errors", NULL, NULL, G_TYPE_TLS_CERTIFICATE_FLAGS, 0, G_PARAM_READABLE | @@ -291,9 +263,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.60 */ g_object_class_install_property (gobject_class, PROP_ADVERTISED_PROTOCOLS, - g_param_spec_boxed ("advertised-protocols", - P_("Advertised Protocols"), - P_("Application-layer protocols available on this connection"), + g_param_spec_boxed ("advertised-protocols", NULL, NULL, G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -306,9 +276,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.60 */ g_object_class_install_property (gobject_class, PROP_NEGOTIATED_PROTOCOL, - g_param_spec_string ("negotiated-protocol", - P_("Negotiated Protocol"), - P_("Application-layer protocol negotiated for this connection"), + g_param_spec_string ("negotiated-protocol", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); @@ -321,9 +289,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_PROTOCOL_VERSION, - g_param_spec_enum ("protocol-version", - P_("Protocol Version"), - P_("TLS protocol version negotiated for this connection"), + g_param_spec_enum ("protocol-version", NULL, NULL, G_TYPE_TLS_PROTOCOL_VERSION, G_TLS_PROTOCOL_VERSION_UNKNOWN, G_PARAM_READABLE | @@ -337,9 +303,7 @@ g_tls_connection_class_init (GTlsConnectionClass *klass) * Since: 2.70 */ g_object_class_install_property (gobject_class, PROP_CIPHERSUITE_NAME, - g_param_spec_string ("ciphersuite-name", - P_("Ciphersuite Name"), - P_("Name of ciphersuite negotiated for this connection"), + g_param_spec_string ("ciphersuite-name", NULL, NULL, NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gtlsdatabase.c b/gio/gtlsdatabase.c index 4966aad..d55d0fe 100644 --- a/gio/gtlsdatabase.c +++ b/gio/gtlsdatabase.c @@ -33,27 +33,17 @@ #include "gtlsinteraction.h" /** - * SECTION:gtlsdatabase - * @short_description: TLS database type - * @include: gio/gio.h + * GTlsDatabase: * - * #GTlsDatabase is used to look up certificates and other information + * `GTlsDatabase` is used to look up certificates and other information * from a certificate or key store. It is an abstract base class which * TLS library specific subtypes override. * - * A #GTlsDatabase may be accessed from multiple threads by the TLS backend. + * A `GTlsDatabase` may be accessed from multiple threads by the TLS backend. * All implementations are required to be fully thread-safe. * * Most common client applications will not directly interact with - * #GTlsDatabase. It is used internally by #GTlsConnection. - * - * Since: 2.30 - */ - -/** - * GTlsDatabase: - * - * Abstract base class for the backend-specific database types. + * `GTlsDatabase`. It is used internally by [class@Gio.TlsConnection]. * * Since: 2.30 */ diff --git a/gio/gtlsfiledatabase.c b/gio/gtlsfiledatabase.c index e32faf9..fe67131 100644 --- a/gio/gtlsfiledatabase.c +++ b/gio/gtlsfiledatabase.c @@ -30,25 +30,15 @@ #include "glibintl.h" /** - * SECTION:gtlsfiledatabase - * @short_description: TLS file based database type - * @include: gio/gio.h + * GTlsFileDatabase: * - * #GTlsFileDatabase is implemented by #GTlsDatabase objects which load - * their certificate information from a file. It is an interface which + * `GTlsFileDatabase` is implemented by [class@Gio.TlsDatabase] objects which + * load their certificate information from a file. It is an interface which * TLS library specific subtypes implement. * * Since: 2.30 */ -/** - * GTlsFileDatabase: - * - * Implemented by a #GTlsDatabase which allows you to load certificates - * from a file. - * - * Since: 2.30 - */ G_DEFINE_INTERFACE (GTlsFileDatabase, g_tls_file_database, G_TYPE_TLS_DATABASE) static void @@ -65,9 +55,7 @@ g_tls_file_database_default_init (GTlsFileDatabaseInterface *iface) * Since: 2.30 */ g_object_interface_install_property (iface, - g_param_spec_string ("anchors", - P_("Anchors"), - P_("The certificate authority anchor file"), + g_param_spec_string ("anchors", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | diff --git a/gio/gtlsinteraction.c b/gio/gtlsinteraction.c index 9b15fcc..acafd4f 100644 --- a/gio/gtlsinteraction.c +++ b/gio/gtlsinteraction.c @@ -36,37 +36,28 @@ /** - * SECTION:gtlsinteraction - * @short_description: Interaction with the user during TLS operations. - * @include: gio/gio.h + * GTlsInteraction: * - * #GTlsInteraction provides a mechanism for the TLS connection and database + * `GTlsInteraction` provides a mechanism for the TLS connection and database * code to interact with the user. It can be used to ask the user for passwords. * - * To use a #GTlsInteraction with a TLS connection use - * g_tls_connection_set_interaction(). + * To use a `GTlsInteraction` with a TLS connection use + * [method@Gio.TlsConnection.set_interaction]. * * Callers should instantiate a derived class that implements the various * interaction methods to show the required dialogs. * * Callers should use the 'invoke' functions like - * g_tls_interaction_invoke_ask_password() to run interaction methods. These - * functions make sure that the interaction is invoked in the main loop + * [method@Gio.TlsInteraction.invoke_ask_password] to run interaction methods. + * These functions make sure that the interaction is invoked in the main loop * and not in the current thread, if the current thread is not running the * main loop. * - * Derived classes can choose to implement whichever interactions methods they'd + * Derived classes can choose to implement whichever interactions methods they’d * like to support by overriding those virtual methods in their class * initialization function. Any interactions not implemented will return - * %G_TLS_INTERACTION_UNHANDLED. If a derived class implements an async method, + * `G_TLS_INTERACTION_UNHANDLED`. If a derived class implements an async method, * it must also implement the corresponding finish method. - */ - -/** - * GTlsInteraction: - * - * An object representing interaction that the TLS connection and database - * might have with the user. * * Since: 2.30 */ diff --git a/gio/gtlspassword.c b/gio/gtlspassword.c index 586d761..ff1fb26 100644 --- a/gio/gtlspassword.c +++ b/gio/gtlspassword.c @@ -29,15 +29,6 @@ #include -/** - * SECTION:gtlspassword - * @title: GTlsPassword - * @short_description: TLS Passwords for prompting - * @include: gio/gio.h - * - * Holds a password used in TLS. - */ - /** * GTlsPassword: * @@ -196,27 +187,42 @@ g_tls_password_class_init (GTlsPasswordClass *klass) gobject_class->set_property = g_tls_password_set_property; gobject_class->finalize = g_tls_password_finalize; + /** + * GTlsPassword:flags: + * + * Flags about the password. + * + * Since: 2.30 + */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("Flags"), - P_("Flags about the password"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_TLS_PASSWORD_FLAGS, G_TLS_PASSWORD_NONE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GTlsPassword:description: + * + * Description of what the password is for. + * + * Since: 2.30 + */ g_object_class_install_property (gobject_class, PROP_DESCRIPTION, - g_param_spec_string ("description", - P_("Description"), - P_("Description of what the password is for"), + g_param_spec_string ("description", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** + * GTlsPassword:warning: + * + * Warning about the password. + * + * Since: 2.30 + */ g_object_class_install_property (gobject_class, PROP_WARNING, - g_param_spec_string ("warning", - P_("Warning"), - P_("Warning about the password"), + g_param_spec_string ("warning", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); @@ -245,7 +251,7 @@ g_tls_password_new (GTlsPasswordFlags flags, /** * g_tls_password_get_value: (virtual get_value) * @password: a #GTlsPassword object - * @length: (optional): location to place the length of the password. + * @length: (optional) (out caller-allocates): location to place the length of the password. * * Get the password value. If @length is not %NULL then it will be * filled in with the length of the password value. (Note that the @@ -300,7 +306,7 @@ g_tls_password_set_value (GTlsPassword *password, } /** - * g_tls_password_set_value_full: + * g_tls_password_set_value_full: (virtual set_value) * @password: a #GTlsPassword object * @value: (array length=length): the value for the password * @length: the length of the password, or -1 @@ -316,7 +322,6 @@ g_tls_password_set_value (GTlsPassword *password, * calculated automatically. (Note that the terminating nul is not * considered part of the password in this case.) * - * Virtual: set_value * Since: 2.30 */ void diff --git a/gio/gtlsserverconnection.c b/gio/gtlsserverconnection.c index dc9db62..f68542b 100644 --- a/gio/gtlsserverconnection.c +++ b/gio/gtlsserverconnection.c @@ -30,12 +30,10 @@ #include "glibintl.h" /** - * SECTION:gtlsserverconnection - * @short_description: TLS server-side connection - * @include: gio/gio.h + * GTlsServerConnection: * - * #GTlsServerConnection is the server-side subclass of #GTlsConnection, - * representing a server-side TLS connection. + * `GTlsServerConnection` is the server-side subclass of + * [class@Gio.TlsConnection], representing a server-side TLS connection. * * Since: 2.28 */ @@ -55,9 +53,7 @@ g_tls_server_connection_default_init (GTlsServerConnectionInterface *iface) * Since: 2.28 */ g_object_interface_install_property (iface, - g_param_spec_enum ("authentication-mode", - P_("Authentication Mode"), - P_("The client authentication mode"), + g_param_spec_enum ("authentication-mode", NULL, NULL, G_TYPE_TLS_AUTHENTICATION_MODE, G_TLS_AUTHENTICATION_NONE, G_PARAM_READWRITE | diff --git a/gio/gtlsserverconnection.h b/gio/gtlsserverconnection.h index f84c25b..7c4e283 100644 --- a/gio/gtlsserverconnection.h +++ b/gio/gtlsserverconnection.h @@ -34,14 +34,6 @@ G_BEGIN_DECLS #define G_IS_TLS_SERVER_CONNECTION(inst) (G_TYPE_CHECK_INSTANCE_TYPE ((inst), G_TYPE_TLS_SERVER_CONNECTION)) #define G_TLS_SERVER_CONNECTION_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), G_TYPE_TLS_SERVER_CONNECTION, GTlsServerConnectionInterface)) -/** - * GTlsServerConnection: - * - * TLS server-side connection. This is the server-side implementation - * of a #GTlsConnection. - * - * Since: 2.28 - */ typedef struct _GTlsServerConnectionInterface GTlsServerConnectionInterface; /** diff --git a/gio/gtrashportal.c b/gio/gtrashportal.c index 0e1d109..82c1356 100644 --- a/gio/gtrashportal.c +++ b/gio/gtrashportal.c @@ -48,7 +48,7 @@ ensure_trash_portal (void) { static GXdpTrash *trash = NULL; - if (g_once_init_enter (&trash)) + if (g_once_init_enter_pointer (&trash)) { GDBusConnection *connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); GXdpTrash *proxy = NULL; @@ -62,7 +62,7 @@ ensure_trash_portal (void) g_object_unref (connection); } - g_once_init_leave (&trash, proxy); + g_once_init_leave_pointer (&trash, proxy); } return trash; diff --git a/gio/gunixconnection.c b/gio/gunixconnection.c index 9367366..94a92e3 100644 --- a/gio/gunixconnection.c +++ b/gio/gunixconnection.c @@ -31,19 +31,15 @@ #endif /** - * SECTION:gunixconnection - * @title: GUnixConnection - * @short_description: A UNIX domain GSocketConnection - * @include: gio/gunixconnection.h - * @see_also: #GSocketConnection. + * GUnixConnection: * - * This is the subclass of #GSocketConnection that is created + * This is the subclass of [class@Gio.SocketConnection] that is created * for UNIX domain sockets. * * It contains functions to do some of the UNIX socket specific * functionality like passing file descriptors. * - * Since GLib 2.72, #GUnixConnection is available on all platforms. It requires + * Since GLib 2.72, `GUnixConnection` is available on all platforms. It requires * underlying system support (such as Windows 10 with `AF_UNIX`) at run time. * * Before GLib 2.72, `` belonged to the UNIX-specific GIO @@ -53,13 +49,6 @@ * Since: 2.22 */ -/** - * GUnixConnection: - * - * #GUnixConnection is an opaque data structure and can only be accessed - * using the following functions. - **/ - G_DEFINE_TYPE_WITH_CODE (GUnixConnection, g_unix_connection, G_TYPE_SOCKET_CONNECTION, g_socket_connection_factory_register_type (g_define_type_id, diff --git a/gio/gunixcredentialsmessage.c b/gio/gunixcredentialsmessage.c index 212c4b0..f56665c 100644 --- a/gio/gunixcredentialsmessage.c +++ b/gio/gunixcredentialsmessage.c @@ -16,31 +16,29 @@ */ /** - * SECTION:gunixcredentialsmessage - * @title: GUnixCredentialsMessage - * @short_description: A GSocketControlMessage containing credentials - * @include: gio/gunixcredentialsmessage.h - * @see_also: #GUnixConnection, #GSocketControlMessage + * GUnixCredentialsMessage: * - * This #GSocketControlMessage contains a #GCredentials instance. It - * may be sent using g_socket_send_message() and received using - * g_socket_receive_message() over UNIX sockets (ie: sockets in the - * %G_SOCKET_FAMILY_UNIX family). + * This [class@Gio.SocketControlMessage] contains a [class@Gio.Credentials] + * instance. It may be sent using [method@Gio.Socket.send_message] and received + * using [method@Gio.Socket.receive_message] over UNIX sockets (ie: sockets in + * the `G_SOCKET_FAMILY_UNIX` family). * * For an easier way to send and receive credentials over * stream-oriented UNIX sockets, see - * g_unix_connection_send_credentials() and - * g_unix_connection_receive_credentials(). To receive credentials of + * [method@Gio.UnixConnection.send_credentials] and + * [method@Gio.UnixConnection.receive_credentials]. To receive credentials of * a foreign process connected to a socket, use - * g_socket_get_credentials(). + * [method@Gio.Socket.get_credentials]. * - * Since GLib 2.72, #GUnixCredentialMessage is available on all platforms. It + * Since GLib 2.72, `GUnixCredentialMessage` is available on all platforms. It * requires underlying system support (such as Windows 10 with `AF_UNIX`) at run * time. * * Before GLib 2.72, `` belonged to the UNIX-specific * GIO interfaces, thus you had to use the `gio-unix-2.0.pc` pkg-config file * when using it. This is no longer necessary since GLib 2.72. + * + * Since: 2.26 */ #include "config.h" @@ -266,9 +264,7 @@ g_unix_credentials_message_class_init (GUnixCredentialsMessageClass *class) */ g_object_class_install_property (gobject_class, PROP_CREDENTIALS, - g_param_spec_object ("credentials", - P_("Credentials"), - P_("The credentials stored in the message"), + g_param_spec_object ("credentials", NULL, NULL, G_TYPE_CREDENTIALS, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gunixcredentialsmessage.h b/gio/gunixcredentialsmessage.h index cd42d25..8f63bd2 100644 --- a/gio/gunixcredentialsmessage.h +++ b/gio/gunixcredentialsmessage.h @@ -58,14 +58,6 @@ struct _GUnixCredentialsMessageClass void (*_g_reserved2) (void); }; -/** - * GUnixCredentialsMessage: - * - * The #GUnixCredentialsMessage structure contains only private data - * and should only be accessed using the provided API. - * - * Since: 2.26 - */ struct _GUnixCredentialsMessage { GSocketControlMessage parent_instance; diff --git a/gio/gunixfdlist.c b/gio/gunixfdlist.c index e061714..88a5a5f 100644 --- a/gio/gunixfdlist.c +++ b/gio/gunixfdlist.c @@ -15,18 +15,16 @@ */ /** - * SECTION:gunixfdlist - * @title: GUnixFDList - * @short_description: An object containing a set of UNIX file descriptors - * @include: gio/gunixfdlist.h - * @see_also: #GUnixFDMessage + * GUnixFDList: * - * A #GUnixFDList contains a list of file descriptors. It owns the file + * A `GUnixFDList` contains a list of file descriptors. It owns the file * descriptors that it contains, closing them when finalized. * - * It may be wrapped in a #GUnixFDMessage and sent over a #GSocket in - * the %G_SOCKET_FAMILY_UNIX family by using g_socket_send_message() - * and received using g_socket_receive_message(). + * It may be wrapped in a + * [`GUnixFDMessage`](../gio-unix/class.UnixFDMessage.html) and sent over a + * [class@Gio.Socket] in the `G_SOCKET_FAMILY_UNIX` family by using + * [method@Gio.Socket.send_message] and received using + * [method@Gio.Socket.receive_message]. * * Before 2.74, `` belonged to the UNIX-specific GIO * interfaces, thus you had to use the `gio-unix-2.0.pc` pkg-config file when @@ -35,13 +33,6 @@ * Since 2.74, the API is available for Windows. */ -/** - * GUnixFDList: - * - * #GUnixFDList is an opaque data structure and can only be accessed - * using the following functions. - **/ - #include "config.h" #include diff --git a/gio/gunixfdmessage.c b/gio/gunixfdmessage.c index 889a0c9..f800e95 100644 --- a/gio/gunixfdmessage.c +++ b/gio/gunixfdmessage.c @@ -15,34 +15,23 @@ */ /** - * SECTION:gunixfdmessage - * @title: GUnixFDMessage - * @short_description: A GSocketControlMessage containing a GUnixFDList - * @include: gio/gunixfdmessage.h - * @see_also: #GUnixConnection, #GUnixFDList, #GSocketControlMessage + * GUnixFDMessage: * - * This #GSocketControlMessage contains a #GUnixFDList. - * It may be sent using g_socket_send_message() and received using - * g_socket_receive_message() over UNIX sockets (ie: sockets in the - * %G_SOCKET_FAMILY_UNIX family). The file descriptors are copied + * This [class@Gio.SocketControlMessage] contains a [class@Gio.UnixFDList]. + * It may be sent using [method@Gio.Socket.send_message] and received using + * [method@Gio.Socket.receive_message] over UNIX sockets (ie: sockets in the + * `G_SOCKET_FAMILY_UNIX` family). The file descriptors are copied * between processes by the kernel. * * For an easier way to send and receive file descriptors over - * stream-oriented UNIX sockets, see g_unix_connection_send_fd() and - * g_unix_connection_receive_fd(). + * stream-oriented UNIX sockets, see [method@Gio.UnixConnection.send_fd] and + * [method@Gio.UnixConnection.receive_fd]. * * Note that `` belongs to the UNIX-specific GIO * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config - * file when using it. + * file or the `GioUnix-2.0` GIR namespace when using it. */ -/** - * GUnixFDMessage: - * - * #GUnixFDMessage is an opaque data structure and can only be accessed - * using the following functions. - **/ - #include "config.h" #include @@ -224,9 +213,15 @@ g_unix_fd_message_class_init (GUnixFDMessageClass *class) object_class->set_property = g_unix_fd_message_set_property; object_class->get_property = g_unix_fd_message_get_property; + /** + * GUnixFDMessage:fd-list: + * + * The [class@Gio.UnixFDList] object to send with the message. + * + * Since: 2.22 + */ g_object_class_install_property (object_class, 1, - g_param_spec_object ("fd-list", "file descriptor list", - "The GUnixFDList object to send with the message", + g_param_spec_object ("fd-list", NULL, NULL, G_TYPE_UNIX_FD_LIST, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); } diff --git a/gio/gunixinputstream.c b/gio/gunixinputstream.c index 2180ce8..210decd 100644 --- a/gio/gunixinputstream.c +++ b/gio/gunixinputstream.c @@ -39,20 +39,17 @@ /** - * SECTION:gunixinputstream - * @short_description: Streaming input operations for UNIX file descriptors - * @include: gio/gunixinputstream.h - * @see_also: #GInputStream + * GUnixInputStream: * - * #GUnixInputStream implements #GInputStream for reading from a UNIX + * `GUnixInputStream` implements [class@Gio.InputStream] for reading from a UNIX * file descriptor, including asynchronous operations. (If the file - * descriptor refers to a socket or pipe, this will use poll() to do + * descriptor refers to a socket or pipe, this will use `poll()` to do * asynchronous I/O. If it refers to a regular file, it will fall back * to doing asynchronous I/O in another thread.) * * Note that `` belongs to the UNIX-specific GIO * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config - * file when using it. + * file or the `GioUnix-2.0` GIR namespace when using it. */ enum { @@ -136,9 +133,7 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass) */ g_object_class_install_property (gobject_class, PROP_FD, - g_param_spec_int ("fd", - P_("File descriptor"), - P_("The file descriptor to read from"), + g_param_spec_int ("fd", NULL, NULL, G_MININT, G_MAXINT, -1, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); @@ -151,9 +146,7 @@ g_unix_input_stream_class_init (GUnixInputStreamClass *klass) */ g_object_class_install_property (gobject_class, PROP_CLOSE_FD, - g_param_spec_boolean ("close-fd", - P_("Close file descriptor"), - P_("Whether to close the file descriptor when the stream is closed"), + g_param_spec_boolean ("close-fd", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); } diff --git a/gio/gunixinputstream.h b/gio/gunixinputstream.h index 78b2cbb..0c2af4f 100644 --- a/gio/gunixinputstream.h +++ b/gio/gunixinputstream.h @@ -34,11 +34,6 @@ G_BEGIN_DECLS #define G_IS_UNIX_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_INPUT_STREAM)) #define G_UNIX_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_INPUT_STREAM, GUnixInputStreamClass)) -/** - * GUnixInputStream: - * - * Implements #GInputStream for reading from selectable unix file descriptors - **/ typedef struct _GUnixInputStream GUnixInputStream; typedef struct _GUnixInputStreamClass GUnixInputStreamClass; typedef struct _GUnixInputStreamPrivate GUnixInputStreamPrivate; diff --git a/gio/gunixmount.c b/gio/gunixmount.c index 7055d8e..ec6c573 100644 --- a/gio/gunixmount.c +++ b/gio/gunixmount.c @@ -262,7 +262,7 @@ eject_unmount_done (GObject *source, { if (!g_subprocess_get_successful (subprocess)) /* ...but bad exit code */ - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "%s", stderr_str); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_FAILED, stderr_str); else /* ...and successful exit code */ g_task_return_boolean (task, TRUE); diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c index 1cfd25d..a7a9363 100644 --- a/gio/gunixmounts.c +++ b/gio/gunixmounts.c @@ -87,18 +87,6 @@ extern char* hasmntopt(const struct mntent* mnt, const char* opt); static const char *_resolve_dev_root (void); #endif -/** - * SECTION:gunixmounts - * @include: gio/gunixmounts.h - * @short_description: UNIX mounts - * - * Routines for managing mounted UNIX mount points and paths. - * - * Note that `` belongs to the UNIX-specific GIO - * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config - * file when using it. - */ - /** * GUnixMountType: * @G_UNIX_MOUNT_TYPE_UNKNOWN: Unknown UNIX mount type. @@ -213,6 +201,11 @@ static GSource *proc_mounts_watch_source; #define endmntent(f) fclose(f) #endif +#ifdef HAVE_LIBMOUNT +/* Protected by proc_mounts_source lock */ +static struct libmnt_monitor *proc_mounts_monitor = NULL; +#endif + static gboolean is_in (const char *value, const char *set[]) { @@ -1905,7 +1898,36 @@ proc_mounts_changed (GIOChannel *channel, GIOCondition cond, gpointer user_data) { + gboolean has_changed = FALSE; + +#ifdef HAVE_LIBMOUNT + if (cond & G_IO_IN) + { + G_LOCK (proc_mounts_source); + if (proc_mounts_monitor != NULL) + { + int ret; + + /* The mnt_monitor_next_change function needs to be used to avoid false-positives. */ + ret = mnt_monitor_next_change (proc_mounts_monitor, NULL, NULL); + if (ret == 0) + { + has_changed = TRUE; + ret = mnt_monitor_event_cleanup (proc_mounts_monitor); + } + + if (ret < 0) + g_debug ("mnt_monitor_next_change failed: %s", g_strerror (-ret)); + } + G_UNLOCK (proc_mounts_source); + } + +#else if (cond & G_IO_ERR) + has_changed = TRUE; +#endif + + if (has_changed) { G_LOCK (proc_mounts_source); mount_poller_time = (guint64) g_get_monotonic_time (); @@ -1970,6 +1992,10 @@ mount_monitor_stop (void) g_source_destroy (proc_mounts_watch_source); proc_mounts_watch_source = NULL; } + +#ifdef HAVE_LIBMOUNT + g_clear_pointer (&proc_mounts_monitor, mnt_unref_monitor); +#endif G_UNLOCK (proc_mounts_source); if (mtab_monitor) @@ -2011,9 +2037,43 @@ mount_monitor_start (void) */ if (g_str_has_prefix (mtab_path, "/proc/")) { - GIOChannel *proc_mounts_channel; + GIOChannel *proc_mounts_channel = NULL; GError *error = NULL; +#ifdef HAVE_LIBMOUNT + int ret; + + G_LOCK (proc_mounts_source); + + proc_mounts_monitor = mnt_new_monitor (); + ret = mnt_monitor_enable_kernel (proc_mounts_monitor, TRUE); + if (ret < 0) + g_warning ("mnt_monitor_enable_kernel failed: %s", g_strerror (-ret)); + + ret = mnt_monitor_enable_userspace (proc_mounts_monitor, TRUE, NULL); + if (ret < 0) + g_warning ("mnt_monitor_enable_userspace failed: %s", g_strerror (-ret)); + +#ifdef HAVE_MNT_MONITOR_VEIL_KERNEL + ret = mnt_monitor_veil_kernel (proc_mounts_monitor, TRUE); + if (ret < 0) + g_warning ("mnt_monitor_veil_kernel failed: %s", g_strerror (-ret)); +#endif + + ret = mnt_monitor_get_fd (proc_mounts_monitor); + if (ret >= 0) + { + proc_mounts_channel = g_io_channel_unix_new (ret); + } + else + { + g_set_error_literal (&error, G_IO_ERROR, g_io_error_from_errno (-ret), + g_strerror (-ret)); + } + + G_UNLOCK (proc_mounts_source); +#else proc_mounts_channel = g_io_channel_new_file (mtab_path, "r", &error); +#endif if (proc_mounts_channel == NULL) { g_warning ("Error creating IO channel for %s: %s (%s, %d)", mtab_path, @@ -2024,7 +2084,11 @@ mount_monitor_start (void) { G_LOCK (proc_mounts_source); +#ifdef HAVE_LIBMOUNT + proc_mounts_watch_source = g_io_create_watch (proc_mounts_channel, G_IO_IN); +#else proc_mounts_watch_source = g_io_create_watch (proc_mounts_channel, G_IO_ERR); +#endif mount_poller_time = (guint64) g_get_monotonic_time (); g_source_set_callback (proc_mounts_watch_source, (GSourceFunc) proc_mounts_changed, diff --git a/gio/gunixoutputstream.c b/gio/gunixoutputstream.c index 8a71c31..96d9e95 100644 --- a/gio/gunixoutputstream.c +++ b/gio/gunixoutputstream.c @@ -41,20 +41,17 @@ /** - * SECTION:gunixoutputstream - * @short_description: Streaming output operations for UNIX file descriptors - * @include: gio/gunixoutputstream.h - * @see_also: #GOutputStream + * GUnixOutputStream: * - * #GUnixOutputStream implements #GOutputStream for writing to a UNIX + * `GUnixOutputStream` implements [class@Gio.OutputStream] for writing to a UNIX * file descriptor, including asynchronous operations. (If the file - * descriptor refers to a socket or pipe, this will use poll() to do + * descriptor refers to a socket or pipe, this will use `poll()` to do * asynchronous I/O. If it refers to a regular file, it will fall back * to doing asynchronous I/O in another thread.) * * Note that `` belongs to the UNIX-specific GIO * interfaces, thus you have to use the `gio-unix-2.0.pc` pkg-config file - * when using it. + * file or the `GioUnix-2.0` GIR namespace when using it. */ enum { @@ -135,9 +132,7 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) */ g_object_class_install_property (gobject_class, PROP_FD, - g_param_spec_int ("fd", - P_("File descriptor"), - P_("The file descriptor to write to"), + g_param_spec_int ("fd", NULL, NULL, G_MININT, G_MAXINT, -1, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); @@ -150,9 +145,7 @@ g_unix_output_stream_class_init (GUnixOutputStreamClass *klass) */ g_object_class_install_property (gobject_class, PROP_CLOSE_FD, - g_param_spec_boolean ("close-fd", - P_("Close file descriptor"), - P_("Whether to close the file descriptor when the stream is closed"), + g_param_spec_boolean ("close-fd", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); } diff --git a/gio/gunixoutputstream.h b/gio/gunixoutputstream.h index 37aa225..55e33f6 100644 --- a/gio/gunixoutputstream.h +++ b/gio/gunixoutputstream.h @@ -34,11 +34,6 @@ G_BEGIN_DECLS #define G_IS_UNIX_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_UNIX_OUTPUT_STREAM)) #define G_UNIX_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_UNIX_OUTPUT_STREAM, GUnixOutputStreamClass)) -/** - * GUnixOutputStream: - * - * Implements #GOutputStream for outputting to selectable unix file descriptors - **/ typedef struct _GUnixOutputStream GUnixOutputStream; typedef struct _GUnixOutputStreamClass GUnixOutputStreamClass; typedef struct _GUnixOutputStreamPrivate GUnixOutputStreamPrivate; diff --git a/gio/gunixsocketaddress.c b/gio/gunixsocketaddress.c index 3ccb2cb..3d1a26e 100644 --- a/gio/gunixsocketaddress.c +++ b/gio/gunixsocketaddress.c @@ -35,22 +35,21 @@ #endif /** - * SECTION:gunixsocketaddress - * @short_description: UNIX GSocketAddress - * @include: gio/gunixsocketaddress.h + * GUnixSocketAddress: * - * Support for UNIX-domain (also known as local) sockets. + * Support for UNIX-domain (also known as local) sockets, corresponding to + * `struct sockaddr_un`. * * UNIX domain sockets are generally visible in the filesystem. * However, some systems support abstract socket names which are not * visible in the filesystem and not affected by the filesystem * permissions, visibility, etc. Currently this is only supported * under Linux. If you attempt to use abstract sockets on other - * systems, function calls may return %G_IO_ERROR_NOT_SUPPORTED - * errors. You can use g_unix_socket_address_abstract_names_supported() + * systems, function calls may return `G_IO_ERROR_NOT_SUPPORTED` + * errors. You can use [func@Gio.UnixSocketAddress.abstract_names_supported] * to see if abstract names are supported. * - * Since GLib 2.72, #GUnixSocketAddress is available on all platforms. It + * Since GLib 2.72, `GUnixSocketAddress` is available on all platforms. It * requires underlying system support (such as Windows 10 with `AF_UNIX`) at * run time. * @@ -59,13 +58,6 @@ * when using it. This is no longer necessary since GLib 2.72. */ -/** - * GUnixSocketAddress: - * - * A UNIX-domain (local) socket address, corresponding to a - * struct sockaddr_un. - */ - enum { PROP_0, @@ -275,23 +267,35 @@ g_unix_socket_address_class_init (GUnixSocketAddressClass *klass) gsocketaddress_class->to_native = g_unix_socket_address_to_native; gsocketaddress_class->get_native_size = g_unix_socket_address_get_native_size; + /** + * GUnixSocketAddress:path: + * + * Unix socket path. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PATH, - g_param_spec_string ("path", - P_("Path"), - P_("UNIX socket path"), + g_param_spec_string ("path", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GUnixSocketAddress:path-as-array: + * + * Unix socket path, as a byte array. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_PATH_AS_ARRAY, - g_param_spec_boxed ("path-as-array", - P_("Path array"), - P_("UNIX socket path, as byte array"), + g_param_spec_boxed ("path-as-array", NULL, NULL, G_TYPE_BYTE_ARRAY, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + /** * GUnixSocketAddress:abstract: * @@ -302,17 +306,21 @@ g_unix_socket_address_class_init (GUnixSocketAddressClass *klass) * abstract addresses. */ g_object_class_install_property (gobject_class, PROP_ABSTRACT, - g_param_spec_boolean ("abstract", - P_("Abstract"), - P_("Whether or not this is an abstract address"), + g_param_spec_boolean ("abstract", NULL, NULL, FALSE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GUnixSocketAddress:address-type: + * + * The type of Unix socket address. + * + * Since: 2.22 + */ g_object_class_install_property (gobject_class, PROP_ADDRESS_TYPE, - g_param_spec_enum ("address-type", - P_("Address type"), - P_("The type of UNIX socket address"), + g_param_spec_enum ("address-type", NULL, NULL, G_TYPE_UNIX_SOCKET_ADDRESS_TYPE, G_UNIX_SOCKET_ADDRESS_PATH, G_PARAM_READWRITE | diff --git a/gio/gunixvolume.c b/gio/gunixvolume.c index a0f00ff..6737457 100644 --- a/gio/gunixvolume.c +++ b/gio/gunixvolume.c @@ -287,7 +287,7 @@ eject_mount_done (GObject *source, { if (!g_subprocess_get_successful (subprocess)) /* ...but bad exit code */ - g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "%s", stderr_str); + g_task_return_new_error_literal (task, G_IO_ERROR, G_IO_ERROR_FAILED, stderr_str); else { /* ...and successful exit code */ diff --git a/gio/gvfs.c b/gio/gvfs.c index f73dcfe..1ff566b 100644 --- a/gio/gvfs.c +++ b/gio/gvfs.c @@ -31,12 +31,9 @@ /** - * SECTION:gvfs - * @short_description: Virtual File System - * @include: gio/gio.h + * GVfs: * * Entry point for using GIO functionality. - * */ static GRWLock additional_schemes_lock; @@ -355,7 +352,7 @@ g_vfs_get_default (void) if (GLIB_PRIVATE_CALL (g_check_setuid) ()) return g_vfs_get_local (); - if (g_once_init_enter (&vfs_default_singleton)) + if (g_once_init_enter_pointer (&vfs_default_singleton)) { GVfs *singleton; @@ -363,7 +360,7 @@ g_vfs_get_default (void) "GIO_USE_VFS", (GIOModuleVerifyFunc) g_vfs_is_active); - g_once_init_leave (&vfs_default_singleton, singleton); + g_once_init_leave_pointer (&vfs_default_singleton, singleton); } return vfs_default_singleton; @@ -379,12 +376,12 @@ g_vfs_get_default (void) GVfs * g_vfs_get_local (void) { - static gsize vfs = 0; + static GVfs *vfs = 0; - if (g_once_init_enter (&vfs)) - g_once_init_leave (&vfs, (gsize)_g_local_vfs_new ()); + if (g_once_init_enter_pointer (&vfs)) + g_once_init_leave_pointer (&vfs, _g_local_vfs_new ()); - return G_VFS (vfs); + return vfs; } /** diff --git a/gio/gvfs.h b/gio/gvfs.h index cbe9792..0fdce36 100644 --- a/gio/gvfs.h +++ b/gio/gvfs.h @@ -68,11 +68,6 @@ typedef GFile * (* GVfsFileLookupFunc) (GVfs *vfs, */ #define G_VFS_EXTENSION_POINT_NAME "gio-vfs" -/** - * GVfs: - * - * Virtual File System object. - **/ typedef struct _GVfsClass GVfsClass; struct _GVfs diff --git a/gio/gvolume.c b/gio/gvolume.c index ba94b17..6b809a6 100644 --- a/gio/gvolume.c +++ b/gio/gvolume.c @@ -32,51 +32,49 @@ /** - * SECTION:gvolume - * @short_description: Volume management - * @include: gio/gio.h + * GVolume: * - * The #GVolume interface represents user-visible objects that can be - * mounted. Note, when porting from GnomeVFS, #GVolume is the moral - * equivalent of #GnomeVFSDrive. + * The `GVolume` interface represents user-visible objects that can be + * mounted. Note, when [porting from GnomeVFS](migrating-gnome-vfs.html), + * `GVolume` is the moral equivalent of `GnomeVFSDrive`. * - * Mounting a #GVolume instance is an asynchronous operation. For more - * information about asynchronous operations, see #GAsyncResult and - * #GTask. To mount a #GVolume, first call g_volume_mount() with (at - * least) the #GVolume instance, optionally a #GMountOperation object - * and a #GAsyncReadyCallback. + * Mounting a `GVolume` instance is an asynchronous operation. For more + * information about asynchronous operations, see [iface@Gio.AsyncResult] and + * [class@Gio.Task]. To mount a `GVolume`, first call [method@Gio.Volume.mount] + * with (at least) the `GVolume` instance, optionally a + * [class@Gio.MountOperation] object and a [type@Gio.AsyncReadyCallback]. * - * Typically, one will only want to pass %NULL for the - * #GMountOperation if automounting all volumes when a desktop session - * starts since it's not desirable to put up a lot of dialogs asking + * Typically, one will only want to pass `NULL` for the + * [class@Gio.MountOperation] if automounting all volumes when a desktop session + * starts since it’s not desirable to put up a lot of dialogs asking * for credentials. * * The callback will be fired when the operation has resolved (either - * with success or failure), and a #GAsyncResult instance will be + * with success or failure), and a [iface@Gio.AsyncResult] instance will be * passed to the callback. That callback should then call - * g_volume_mount_finish() with the #GVolume instance and the - * #GAsyncResult data to see if the operation was completed - * successfully. If an @error is present when g_volume_mount_finish() - * is called, then it will be filled with any error information. + * [method@Gio.Volume.mount_finish] with the `GVolume` instance and the + * [iface@Gio.AsyncResult] data to see if the operation was completed + * successfully. If a [type@GLib.Error] is present when + * [method@Gio.Volume.mount_finish] is called, then it will be filled with any + * error information. * - * ## Volume Identifiers # {#volume-identifier} + * ## Volume Identifiers * * It is sometimes necessary to directly access the underlying * operating system object behind a volume (e.g. for passing a volume - * to an application via the commandline). For this purpose, GIO - * allows to obtain an 'identifier' for the volume. There can be + * to an application via the command line). For this purpose, GIO + * allows to obtain an ‘identifier’ for the volume. There can be * different kinds of identifiers, such as Hal UDIs, filesystem labels, * traditional Unix devices (e.g. `/dev/sda2`), UUIDs. GIO uses predefined * strings as names for the different kinds of identifiers: - * %G_VOLUME_IDENTIFIER_KIND_UUID, %G_VOLUME_IDENTIFIER_KIND_LABEL, etc. - * Use g_volume_get_identifier() to obtain an identifier for a volume. + * `G_VOLUME_IDENTIFIER_KIND_UUID`, `G_VOLUME_IDENTIFIER_KIND_LABEL`, etc. + * Use [method@Gio.Volume.get_identifier] to obtain an identifier for a volume. * - * - * Note that %G_VOLUME_IDENTIFIER_KIND_HAL_UDI will only be available - * when the gvfs hal volume monitor is in use. Other volume monitors - * will generally be able to provide the %G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE + * Note that `G_VOLUME_IDENTIFIER_KIND_HAL_UDI` will only be available + * when the GVFS hal volume monitor is in use. Other volume monitors + * will generally be able to provide the `G_VOLUME_IDENTIFIER_KIND_UNIX_DEVICE` * identifier, which can be used to obtain a hal device by means of - * libhal_manager_find_device_string_match(). + * `libhal_manager_find_device_string_match()`. */ typedef GVolumeIface GVolumeInterface; @@ -330,7 +328,7 @@ g_volume_should_automount (GVolume *volume) /** - * g_volume_mount: + * g_volume_mount: (virtual mount_fn) * @volume: a #GVolume * @flags: flags affecting the operation * @mount_operation: (nullable): a #GMountOperation or %NULL to avoid user interaction @@ -341,8 +339,6 @@ g_volume_should_automount (GVolume *volume) * Mounts a volume. This is an asynchronous operation, and is * finished by calling g_volume_mount_finish() with the @volume * and #GAsyncResult returned in the @callback. - * - * Virtual: mount_fn */ void g_volume_mount (GVolume *volume, @@ -565,7 +561,7 @@ g_volume_eject_with_operation_finish (GVolume *volume, * @kind: the kind of identifier to return * * Gets the identifier of the given kind for @volume. - * See the [introduction][volume-identifier] for more + * See the [introduction](#volume-identifiers) for more * information about volume identifiers. * * Returns: (nullable) (transfer full): a newly allocated string containing the @@ -593,7 +589,7 @@ g_volume_get_identifier (GVolume *volume, * g_volume_enumerate_identifiers: * @volume: a #GVolume * - * Gets the kinds of [identifiers][volume-identifier] that @volume has. + * Gets the kinds of [identifiers](#volume-identifiers) that @volume has. * Use g_volume_get_identifier() to obtain the identifiers themselves. * * Returns: (array zero-terminated=1) (transfer full): a %NULL-terminated array diff --git a/gio/gvolume.h b/gio/gvolume.h index 2d6e14e..7b5a81a 100644 --- a/gio/gvolume.h +++ b/gio/gvolume.h @@ -109,10 +109,10 @@ G_BEGIN_DECLS * @mount_finish: Finishes a mount operation. * @eject: Ejects a given #GVolume. * @eject_finish: Finishes an eject operation. - * @get_identifier: Returns the [identifier][volume-identifier] of the given kind, or %NULL if + * @get_identifier: Returns the [identifier](#volume-identifiers) of the given kind, or %NULL if * the #GVolume doesn't have one. * @enumerate_identifiers: Returns an array strings listing the kinds - * of [identifiers][volume-identifier] which the #GVolume has. + * of [identifiers](#volume-identifiers) which the #GVolume has. * @should_automount: Returns %TRUE if the #GVolume should be automatically mounted. * @get_activation_root: Returns the activation root for the #GVolume if it is known in advance or %NULL if * it is not known. diff --git a/gio/gvolumemonitor.c b/gio/gvolumemonitor.c index cc4f3e4..ed7288b 100644 --- a/gio/gvolumemonitor.c +++ b/gio/gvolumemonitor.c @@ -32,19 +32,16 @@ /** - * SECTION:gvolumemonitor - * @short_description: Volume Monitor - * @include: gio/gio.h - * @see_also: #GFileMonitor + * GVolumeMonitor: * - * #GVolumeMonitor is for listing the user interesting devices and volumes + * `GVolumeMonitor` is for listing the user interesting devices and volumes * on the computer. In other words, what a file selector or file manager - * would show in a sidebar. + * would show in a sidebar. * - * #GVolumeMonitor is not - * [thread-default-context aware][g-main-context-push-thread-default], - * and so should not be used other than from the main thread, with no - * thread-default-context active. + * `GVolumeMonitor` is not + * thread-default-context aware (see + * [method@GLib.MainContext.push_thread_default]), and so should not be used + * other than from the main thread, with no thread-default-context active. * * In order to receive updates about volumes and mounts monitored through GVFS, * a main loop must be running. diff --git a/gio/gvolumemonitor.h b/gio/gvolumemonitor.h index 11bd331..7ef917a 100644 --- a/gio/gvolumemonitor.h +++ b/gio/gvolumemonitor.h @@ -49,11 +49,6 @@ G_BEGIN_DECLS */ #define G_VOLUME_MONITOR_EXTENSION_POINT_NAME "gio-volume-monitor" -/** - * GVolumeMonitor: - * - * A Volume Monitor that watches for volume events. - **/ typedef struct _GVolumeMonitorClass GVolumeMonitorClass; struct _GVolumeMonitor diff --git a/gio/gwin32appinfo.c b/gio/gwin32appinfo.c index 49e76ca..f177878 100644 --- a/gio/gwin32appinfo.c +++ b/gio/gwin32appinfo.c @@ -4034,9 +4034,9 @@ gio_win32_appinfo_init (gboolean do_wait) /* Trigger initial tree build. Fake data pointer. */ g_thread_pool_push (gio_win32_appinfo_threadpool, (gpointer) keys_updated, NULL); /* Increment the DLL refcount */ - GetModuleHandleExA (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, - (const char *) gio_win32_appinfo_init, - &gio_dll_extra); + GetModuleHandleEx (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_PIN, + (LPCWSTR) gio_win32_appinfo_init, + &gio_dll_extra); /* gio DLL cannot be unloaded now */ g_once_init_leave (&initialized, TRUE); @@ -4253,7 +4253,7 @@ g_win32_app_info_get_name (GAppInfo *appinfo) else if (info->app && info->app->canonical_name_u8) return info->app->canonical_name_u8; else - return P_("Unnamed"); + return _("Unnamed"); } static const char * @@ -5213,11 +5213,11 @@ g_win32_app_info_launch_internal (GWin32AppInfo *info, { if (info->app->is_uwp || info->handler == NULL) g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - P_("The app ‘%s’ in the application object has no verbs"), + _("The app ‘%s’ in the application object has no verbs"), g_win32_appinfo_application_get_some_name (info->app)); else if (info->handler->verbs->len == 0) g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - P_("The app ‘%s’ and the handler ‘%s’ in the application object have no verbs"), + _("The app ‘%s’ and the handler ‘%s’ in the application object have no verbs"), g_win32_appinfo_application_get_some_name (info->app), info->handler->handler_id_folded); diff --git a/gio/gwin32inputstream.c b/gio/gwin32inputstream.c index 685d6f2..afb362a 100644 --- a/gio/gwin32inputstream.c +++ b/gio/gwin32inputstream.c @@ -36,12 +36,9 @@ #include "glibintl.h" /** - * SECTION:gwin32inputstream - * @short_description: Streaming input operations for Windows file handles - * @include: gio/gwin32inputstream.h - * @see_also: #GInputStream + * GWin32InputStream: * - * #GWin32InputStream implements #GInputStream for reading from a + * `GWin32InputStream` implements [class@Gio.InputStream] for reading from a * Windows file handle. * * Note that `` belongs to the Windows-specific GIO @@ -261,9 +258,7 @@ g_win32_input_stream_class_init (GWin32InputStreamClass *klass) * Since: 2.26 */ props[PROP_HANDLE] = - g_param_spec_pointer ("handle", - P_("File handle"), - P_("The file handle to read from"), + g_param_spec_pointer ("handle", NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -277,9 +272,7 @@ g_win32_input_stream_class_init (GWin32InputStreamClass *klass) * Since: 2.26 */ props[PROP_CLOSE_HANDLE] = - g_param_spec_boolean ("close-handle", - P_("Close file handle"), - P_("Whether to close the file handle when the stream is closed"), + g_param_spec_boolean ("close-handle", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gwin32inputstream.h b/gio/gwin32inputstream.h index 8dde9e8..53c7d78 100644 --- a/gio/gwin32inputstream.h +++ b/gio/gwin32inputstream.h @@ -35,11 +35,6 @@ G_BEGIN_DECLS #define G_IS_WIN32_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_INPUT_STREAM)) #define G_WIN32_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_INPUT_STREAM, GWin32InputStreamClass)) -/** - * GWin32InputStream: - * - * Implements #GInputStream for reading from selectable Windows file handles - **/ typedef struct _GWin32InputStream GWin32InputStream; typedef struct _GWin32InputStreamClass GWin32InputStreamClass; typedef struct _GWin32InputStreamPrivate GWin32InputStreamPrivate; diff --git a/gio/gwin32outputstream.c b/gio/gwin32outputstream.c index b88f05c..fdf1e98 100644 --- a/gio/gwin32outputstream.c +++ b/gio/gwin32outputstream.c @@ -37,12 +37,9 @@ #include "glibintl.h" /** - * SECTION:gwin32outputstream - * @short_description: Streaming output operations for Windows file handles - * @include: gio/gwin32outputstream.h - * @see_also: #GOutputStream + * GWin32OutputStream: * - * #GWin32OutputStream implements #GOutputStream for writing to a + * `GWin32OutputStream` implements [class@Gio.OutputStream] for writing to a * Windows file handle. * * Note that `` belongs to the Windows-specific GIO @@ -248,9 +245,7 @@ g_win32_output_stream_class_init (GWin32OutputStreamClass *klass) * Since: 2.26 */ props[PROP_HANDLE] = - g_param_spec_pointer ("handle", - P_("File handle"), - P_("The file handle to write to"), + g_param_spec_pointer ("handle", NULL, NULL, G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | @@ -264,9 +259,7 @@ g_win32_output_stream_class_init (GWin32OutputStreamClass *klass) * Since: 2.26 */ props[PROP_CLOSE_HANDLE] = - g_param_spec_boolean ("close-handle", - P_("Close file handle"), - P_("Whether to close the file handle when the stream is closed"), + g_param_spec_boolean ("close-handle", NULL, NULL, TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE | diff --git a/gio/gwin32outputstream.h b/gio/gwin32outputstream.h index d64fdc1..35942ca 100644 --- a/gio/gwin32outputstream.h +++ b/gio/gwin32outputstream.h @@ -35,11 +35,6 @@ G_BEGIN_DECLS #define G_IS_WIN32_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_WIN32_OUTPUT_STREAM)) #define G_WIN32_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_WIN32_OUTPUT_STREAM, GWin32OutputStreamClass)) -/** - * GWin32OutputStream: - * - * Implements #GOutputStream for outputting to Windows file handles - **/ typedef struct _GWin32OutputStream GWin32OutputStream; typedef struct _GWin32OutputStreamClass GWin32OutputStreamClass; typedef struct _GWin32OutputStreamPrivate GWin32OutputStreamPrivate; diff --git a/gio/gwin32registrykey.c b/gio/gwin32registrykey.c index df20db1..bd83b38 100644 --- a/gio/gwin32registrykey.c +++ b/gio/gwin32registrykey.c @@ -347,23 +347,21 @@ G_DEFINE_BOXED_TYPE (GWin32RegistryValueIter, g_win32_registry_value_iter, g_win32_registry_value_iter_free) /** - * SECTION:gwin32registrykey - * @title: GWin32RegistryKey - * @short_description: W32 registry access helper - * @include: gio/win32/gwin32registrykey.h + * GWin32RegistryKey: * - * #GWin32RegistryKey represents a single Windows Registry key. + * `GWin32RegistryKey` represents a single Windows Registry key. * - * #GWin32RegistryKey is used by a number of helper functions that read + * `GWin32RegistryKey` is used by a number of helper functions that read * Windows Registry. All keys are opened with read-only access, and at * the moment there is no API for writing into registry keys or creating * new ones. * - * #GWin32RegistryKey implements the #GInitable interface, so if it is manually - * constructed by e.g. g_object_new() you must call g_initable_init() and check - * the results before using the object. This is done automatically - * in g_win32_registry_key_new() and g_win32_registry_key_get_child(), so these - * functions can return %NULL. + * `GWin32RegistryKey` implements the [iface@Gio.Initable] interface, so if it + * is manually constructed by e.g. [ctor@GObject.Object.new] you must call + * [method@Gio.Initable.init] and check the results before using the object. + * This is done automatically in [ctor@Gio.Win32RegistryKey.new] and + * [method@Gio.Win32RegistryKey.get_child], so these functions can return + * `NULL`. * * To increase efficiency, a UTF-16 variant is available for all functions * that deal with key or value names in the registry. Use these to perform @@ -372,17 +370,17 @@ G_DEFINE_BOXED_TYPE (GWin32RegistryValueIter, g_win32_registry_value_iter, * of UTF-16 functions avoids the overhead of converting names to UTF-8 and * back. * - * All functions operate in current user's context (it is not possible to - * access registry tree of a different user). + * All functions operate in the current user’s context (it is not possible to + * access the registry tree of a different user). * - * Key paths must use '\\' as a separator, '/' is not supported. Key names - * must not include '\\', because it's used as a separator. Value names - * can include '\\'. + * Key paths must use `\\` as a separator, `/` is not supported. Key names + * must not include `\\`, because it’s used as a separator. Value names + * can include `\\`. * * Key and value names are not case sensitive. * - * Full key name (excluding the pre-defined ancestor's name) can't exceed - * 255 UTF-16 characters, give or take. Value name can't exceed 16383 UTF-16 + * A full key name (excluding the pre-defined ancestor’s name) can’t exceed + * 255 UTF-16 characters, give or take. A value name can’t exceed 16383 UTF-16 * characters. Tree depth is limited to 512 levels. **/ @@ -1747,7 +1745,7 @@ static void _g_win32_registry_key_reread (GWin32RegistryKey *key, GWin32RegistryKeyPrivate *buf) { - if (g_once_init_enter (&nt_query_key)) + if (g_once_init_enter_pointer (&nt_query_key)) { NtQueryKeyFunc func; HMODULE ntdll = GetModuleHandleW (L"ntdll.dll"); @@ -1757,7 +1755,7 @@ _g_win32_registry_key_reread (GWin32RegistryKey *key, else func = NULL; - g_once_init_leave (&nt_query_key, func); + g_once_init_leave_pointer (&nt_query_key, func); } /* Assume that predefined keys never get renamed. Also, their handles probably @@ -1875,7 +1873,7 @@ g_win32_registry_get_os_dirs_w (void) { static gunichar2 **mui_os_dirs = NULL; - if (g_once_init_enter (&mui_os_dirs)) + if (g_once_init_enter_pointer (&mui_os_dirs)) { gunichar2 **new_mui_os_dirs; gunichar2 *system32 = NULL; @@ -1915,7 +1913,7 @@ g_win32_registry_get_os_dirs_w (void) new_mui_os_dirs[array_index++] = NULL; - g_once_init_leave (&mui_os_dirs, new_mui_os_dirs); + g_once_init_leave_pointer (&mui_os_dirs, new_mui_os_dirs); } return (const gunichar2 * const *) mui_os_dirs; @@ -1936,7 +1934,7 @@ g_win32_registry_get_os_dirs (void) { static gchar **mui_os_dirs = NULL; - if (g_once_init_enter (&mui_os_dirs)) + if (g_once_init_enter_pointer (&mui_os_dirs)) { gchar **new_mui_os_dirs; gsize array_index; @@ -1960,7 +1958,7 @@ g_win32_registry_get_os_dirs (void) g_critical ("Failed to convert to a system directory #%zu to UTF-8", array_index); } - g_once_init_leave (&mui_os_dirs, new_mui_os_dirs); + g_once_init_leave_pointer (&mui_os_dirs, new_mui_os_dirs); } return (const gchar * const *) mui_os_dirs; @@ -2504,7 +2502,7 @@ g_win32_registry_key_watch (GWin32RegistryKey *key, return FALSE; } - if (g_once_init_enter (&nt_notify_change_multiple_keys)) + if (g_once_init_enter_pointer (&nt_notify_change_multiple_keys)) { NtNotifyChangeMultipleKeysFunc func; HMODULE ntdll = GetModuleHandleW (L"ntdll.dll"); @@ -2514,7 +2512,7 @@ g_win32_registry_key_watch (GWin32RegistryKey *key, else func = NULL; - g_once_init_leave (&nt_notify_change_multiple_keys, func); + g_once_init_leave_pointer (&nt_notify_change_multiple_keys, func); } if (nt_notify_change_multiple_keys== NULL) @@ -2697,9 +2695,7 @@ g_win32_registry_key_class_init (GWin32RegistryKeyClass *klass) */ g_object_class_install_property (gobject_class, PROP_PATH, - g_param_spec_string ("path", - "Path", - "Path to the key in the registry", + g_param_spec_string ("path", NULL, NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -2714,9 +2710,7 @@ g_win32_registry_key_class_init (GWin32RegistryKeyClass *klass) */ g_object_class_install_property (gobject_class, PROP_PATH_UTF16, - g_param_spec_pointer ("path-utf16", - "Path (UTF-16)", - "Path to the key in the registry, in UTF-16", + g_param_spec_pointer ("path-utf16", NULL, NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gwin32sid.c b/gio/gwin32sid.c index 5bab405..ddc888b 100644 --- a/gio/gwin32sid.c +++ b/gio/gwin32sid.c @@ -192,20 +192,20 @@ _g_win32_process_get_access_token_sid (DWORD process_id, gchar * _g_win32_sid_to_string (SID *sid, GError **error) { - gchar *tmp, *ret; + wchar_t *tmp = NULL; + char *ret; g_return_val_if_fail (sid != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); - if (!ConvertSidToStringSidA (sid, &tmp)) + if (!ConvertSidToStringSid (sid, &tmp)) { g_set_error_literal (error, G_IO_ERROR, g_io_error_from_errno (GetLastError ()), "Failed to ConvertSidToString"); - return NULL; } - ret = g_strdup (tmp); + ret = g_utf16_to_utf8 (tmp, -1, NULL, NULL, NULL); LocalFree (tmp); return ret; } diff --git a/gio/gzlibcompressor.c b/gio/gzlibcompressor.c index a1c018a..00bde8f 100644 --- a/gio/gzlibcompressor.c +++ b/gio/gzlibcompressor.c @@ -43,21 +43,14 @@ enum { }; /** - * SECTION:gzlibcompressor - * @short_description: Zlib compressor - * @include: gio/gio.h + * GZlibCompressor: * - * #GZlibCompressor is an implementation of #GConverter that + * `GZlibCompressor` is an implementation of [iface@Gio.Converter] that * compresses data using zlib. */ static void g_zlib_compressor_iface_init (GConverterIface *iface); -/** - * GZlibCompressor: - * - * Zlib decompression - */ struct _GZlibCompressor { GObject parent_instance; @@ -228,20 +221,32 @@ g_zlib_compressor_class_init (GZlibCompressorClass *klass) gobject_class->get_property = g_zlib_compressor_get_property; gobject_class->set_property = g_zlib_compressor_set_property; + /** + * GZlibCompressor:format: + * + * The format of the compressed data. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_FORMAT, - g_param_spec_enum ("format", - P_("compression format"), - P_("The format of the compressed data"), + g_param_spec_enum ("format", NULL, NULL, G_TYPE_ZLIB_COMPRESSOR_FORMAT, G_ZLIB_COMPRESSOR_FORMAT_ZLIB, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); + + /** + * GZlibCompressor:level: + * + * The level of compression from `0` (no compression) to `9` (most + * compression). `-1` for the default level. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_LEVEL, - g_param_spec_int ("level", - P_("compression level"), - P_("The level of compression from 0 (no compression) to 9 (most compression), -1 for the default level"), + g_param_spec_int ("level", NULL, NULL, -1, 9, -1, G_PARAM_READWRITE | @@ -259,9 +264,7 @@ g_zlib_compressor_class_init (GZlibCompressorClass *klass) */ g_object_class_install_property (gobject_class, PROP_FILE_INFO, - g_param_spec_object ("file-info", - P_("file info"), - P_("File info"), + g_param_spec_object ("file-info", NULL, NULL, G_TYPE_FILE_INFO, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/gzlibdecompressor.c b/gio/gzlibdecompressor.c index f704509..dbe126d 100644 --- a/gio/gzlibdecompressor.c +++ b/gio/gzlibdecompressor.c @@ -42,11 +42,9 @@ enum { }; /** - * SECTION:gzlibdecompressor - * @short_description: Zlib decompressor - * @include: gio/gio.h + * GZlibDecompressor: * - * #GZlibDecompressor is an implementation of #GConverter that + * `GZlibDecompressor` is an implementation of [iface@Gio.Converter] that * decompresses data compressed with zlib. */ @@ -58,11 +56,6 @@ typedef struct { GFileInfo *file_info; } HeaderData; -/** - * GZlibDecompressor: - * - * Zlib decompression - */ struct _GZlibDecompressor { GObject parent_instance; @@ -222,11 +215,16 @@ g_zlib_decompressor_class_init (GZlibDecompressorClass *klass) gobject_class->get_property = g_zlib_decompressor_get_property; gobject_class->set_property = g_zlib_decompressor_set_property; + /** + * GZlibDecompressor:format: + * + * The format of the compressed data. + * + * Since: 2.24 + */ g_object_class_install_property (gobject_class, PROP_FORMAT, - g_param_spec_enum ("format", - P_("compression format"), - P_("The format of the compressed data"), + g_param_spec_enum ("format", NULL, NULL, G_TYPE_ZLIB_COMPRESSOR_FORMAT, G_ZLIB_COMPRESSOR_FORMAT_ZLIB, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | @@ -244,9 +242,7 @@ g_zlib_decompressor_class_init (GZlibDecompressorClass *klass) */ g_object_class_install_property (gobject_class, PROP_FILE_INFO, - g_param_spec_object ("file-info", - P_("file info"), - P_("File info"), + g_param_spec_object ("file-info", NULL, NULL, G_TYPE_FILE_INFO, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); diff --git a/gio/inotify/inotify-kernel.c b/gio/inotify/inotify-kernel.c index 7733d39..f950a21 100644 --- a/gio/inotify/inotify-kernel.c +++ b/gio/inotify/inotify-kernel.c @@ -416,8 +416,8 @@ ik_source_new (gboolean (* callback) (ik_event_t *event)) gboolean _ik_startup (gboolean (*cb)(ik_event_t *event)) { - if (g_once_init_enter (&inotify_source)) - g_once_init_leave (&inotify_source, ik_source_new (cb)); + if (g_once_init_enter_pointer (&inotify_source)) + g_once_init_leave_pointer (&inotify_source, ik_source_new (cb)); return inotify_source->fd >= 0; } diff --git a/gio/meson.build b/gio/meson.build index f9fdf6e..59c2b0f 100644 --- a/gio/meson.build +++ b/gio/meson.build @@ -242,6 +242,7 @@ xdp_dbus_generated = custom_target('xdp-dbus', 'org.freedesktop.portal.Trash.xml'], output : ['xdp-dbus.h', 'xdp-dbus.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-prefix', 'org.freedesktop.portal.', '--output-directory', '@OUTDIR@', @@ -254,6 +255,7 @@ gdbus_daemon_generated = custom_target('gdbus-daemon-generated', input : ['dbus-daemon.xml'], output : ['gdbus-daemon-generated.h', 'gdbus-daemon-generated.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-prefix', 'org.', '--output-directory', '@OUTDIR@', @@ -339,7 +341,6 @@ local_sources = files( platform_deps = [] internal_deps = [] -appinfo_sources = [] contenttype_sources = [] portal_sources = [] unix_sources = [] @@ -392,7 +393,7 @@ if host_system != 'windows' if glib_have_cocoa settings_sources += files('gnextstepsettingsbackend.m') contenttype_sources += files('gosxcontenttype.m') - appinfo_sources += files('gosxappinfo.m') + unix_sources += files('gosxappinfo.m') framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit']) platform_deps += [framework_dep] if glib_have_os_x_9_or_later @@ -401,7 +402,7 @@ if host_system != 'windows' application_headers += files('gosxappinfo.h') else contenttype_sources += files('gcontenttype.c') - appinfo_sources += files('gdesktopappinfo.c') + unix_sources += files('gdesktopappinfo.c') gio_unix_include_headers += files('gdesktopappinfo.h') launch_desktop_sources = files('gio-launch-desktop.c') @@ -431,7 +432,7 @@ if host_system != 'windows' ) endif else - appinfo_sources += files('gwin32appinfo.c') + win32_sources += files('gwin32appinfo.c') contenttype_sources += files('gcontenttype-win32.c') platform_deps += [cc.find_library('shlwapi'), cc.find_library('dnsapi'), @@ -456,13 +457,15 @@ else 'gwin32sid.h', ) - gio_win_rc = configure_file( - input: 'gio.rc.in', - output: 'gio.rc', - configuration: glibconfig_conf, - ) - gio_win_res = windows.compile_resources(gio_win_rc) - win32_sources += [gio_win_res] + if glib_build_shared + gio_win_rc = configure_file( + input: 'gio.rc.in', + output: 'gio.rc', + configuration: glibconfig_conf, + ) + gio_win_res = windows.compile_resources(gio_win_rc) + win32_sources += [gio_win_res] + endif gio_win32_include_headers = files( 'gregistrysettingsbackend.h', @@ -472,7 +475,7 @@ else install_headers(gio_win32_include_headers, subdir : 'gio-win32-2.0/gio') endif -gio_sources = files( +gio_base_sources = files( 'gappinfo.c', 'gasynchelper.c', 'gasyncinitable.c', @@ -603,11 +606,12 @@ gio_sources = files( 'gliststore.c', ) +gio_sources = gio_base_sources + if glib_build_shared gio_sources += files ('../glib/gtrace.c') endif -gio_sources += appinfo_sources gio_sources += contenttype_sources gio_sources += gdbus_daemon_sources gio_sources += unix_sources @@ -879,10 +883,8 @@ libgio_dep = declare_dependency(link_with : libgio, pkg.generate(libgio, requires : ['glib-2.0', 'gobject-2.0'], variables : [ - 'datadir=' + '${prefix}' / get_option('datadir'), 'schemasdir=' + '${datadir}' / schemas_subdir, 'dtdsdir=' + '${datadir}' / dtds_subdir, - 'bindir=' + '${prefix}' / get_option('bindir'), 'giomoduledir=' + pkgconfig_giomodulesdir, 'gio=' + '${bindir}' / 'gio', 'gio_querymodules=' + pkgconfig_multiarch_bindir / 'gio-querymodules', @@ -983,7 +985,7 @@ gio_tool_sources = [ 'gio-tool-tree.c', ] -executable('gio', gio_tool_sources, +gio_tool = executable('gio', gio_tool_sources, install : true, install_tag : 'bin', c_args : gio_c_args, @@ -1084,20 +1086,11 @@ endif if multiarch_bindir != get_option('bindir') foreach exe : ['gio-querymodules', 'glib-compile-schemas'] - if meson.version().version_compare('>=0.61.0') - install_symlink( - exe, - install_dir : get_option('bindir'), - pointing_to : get_option('prefix') / multiarch_bindir / exe, - ) - else - warning( - 'Please use Meson >= 0.61.0 or create a symlink @1@ -> @2@ in packaging'.format( - get_option('prefix') / get_option('bindir') / exe, - get_option('prefix') / multiarch_bindir / exe, - ) - ) - endif + install_symlink( + exe, + install_dir : get_option('bindir'), + pointing_to : get_option('prefix') / multiarch_bindir / exe, + ) endforeach endif diff --git a/gio/tests/appinfo.c b/gio/tests/appinfo.c index 625b828..d9c53c8 100644 --- a/gio/tests/appinfo.c +++ b/gio/tests/appinfo.c @@ -6,6 +6,7 @@ #include #include +/* Should be called inside a #GTestDBus environment. */ static void test_launch_for_app_info (GAppInfo *appinfo) { @@ -51,15 +52,23 @@ test_launch_for_app_info (GAppInfo *appinfo) static void test_launch (void) { + GTestDBus *bus = NULL; GAppInfo *appinfo; const gchar *path; + /* Set up a test session bus to keep D-Bus traffic off the real session bus. */ + bus = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (bus); + path = g_test_get_filename (G_TEST_BUILT, "appinfo-test.desktop", NULL); appinfo = (GAppInfo*)g_desktop_app_info_new_from_filename (path); g_assert_true (G_IS_APP_INFO (appinfo)); test_launch_for_app_info (appinfo); g_object_unref (appinfo); + + g_test_dbus_down (bus); + g_clear_object (&bus); } static void @@ -83,6 +92,7 @@ test_launch_no_app_id (void) "Keywords=keyword1;test keyword;\n" "Categories=GNOME;GTK;\n"; + GTestDBus *bus = NULL; gchar *exec_line_variants[2]; gsize i; @@ -95,6 +105,10 @@ test_launch_no_app_id (void) g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=791337"); + /* Set up a test session bus to keep D-Bus traffic off the real session bus. */ + bus = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (bus); + for (i = 0; i < G_N_ELEMENTS (exec_line_variants); i++) { gchar *desktop_file_contents; @@ -125,6 +139,9 @@ test_launch_no_app_id (void) g_key_file_unref (fake_desktop_file); } + g_test_dbus_down (bus); + g_clear_object (&bus); + g_free (exec_line_variants[1]); g_free (exec_line_variants[0]); } @@ -332,12 +349,17 @@ launch_failed (GAppLaunchContext *context, static void test_launch_context_signals (void) { + GTestDBus *bus = NULL; GAppLaunchContext *context; GAppInfo *appinfo; GError *error = NULL; gboolean success; gchar *cmdline; + /* Set up a test session bus to keep D-Bus traffic off the real session bus. */ + bus = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (bus); + cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); context = g_app_launch_context_new (); @@ -358,6 +380,9 @@ test_launch_context_signals (void) g_object_unref (context); g_free (cmdline); + + g_test_dbus_down (bus); + g_clear_object (&bus); } static void @@ -384,6 +409,21 @@ test_associations (void) gboolean result; GList *list; gchar *cmdline; + gchar *update_desktop_database = NULL, *update_mime_database = NULL; + + update_desktop_database = g_find_program_in_path ("update-desktop-database"); + update_mime_database = g_find_program_in_path ("update-mime-database"); + + if (update_desktop_database == NULL || update_mime_database == NULL) + { + g_test_skip ("update-desktop-database and update-mime-database are needed to change file associations"); + g_free (update_desktop_database); + g_free (update_mime_database); + return; + } + + g_free (update_desktop_database); + g_free (update_mime_database); cmdline = g_strconcat (g_test_get_dir (G_TEST_BUILT), "/appinfo-test --option", NULL); appinfo = g_app_info_create_from_commandline (cmdline, diff --git a/gio/tests/application-command-line.c b/gio/tests/application-command-line.c index 185d49f..6104cb6 100644 --- a/gio/tests/application-command-line.c +++ b/gio/tests/application-command-line.c @@ -76,6 +76,15 @@ test_basic_properties (void) g_object_get (cl, "is-remote", &is_remote, NULL); g_assert_false (is_remote); + /* exit status */ + g_assert_cmpint (g_application_command_line_get_exit_status (cl), ==, 0); + g_application_command_line_set_exit_status (cl, 1); + g_assert_cmpint (g_application_command_line_get_exit_status (cl), ==, 1); + + g_application_command_line_done (cl); + g_application_command_line_set_exit_status (cl, 2); + g_assert_cmpint (g_application_command_line_get_exit_status (cl), ==, 1); + g_clear_object (&cl); } diff --git a/gio/tests/apps.c b/gio/tests/apps.c index 191edd4..d656b6c 100644 --- a/gio/tests/apps.c +++ b/gio/tests/apps.c @@ -33,8 +33,28 @@ main (int argc, char **argv) { setlocale (LC_ALL, ""); - if (argv[1] == NULL) - ; + if (argv[1] == NULL || g_str_equal (argv[1], "--help")) + g_print ("Usage:\n" + " apps --help\n" + " apps COMMAND [COMMAND_OPTIONS]\n" + "\n" + "COMMANDS:\n" + " list\n" + " search [--should-show-only] TEXT_TO_SEARCH\n" + " implementations INTERFACE_NAME\n" + " show-info DESKTOP_FILE\n" + " default-for-type MIME_TYPE\n" + " recommended-for-type MIME_TYPE\n" + " all-for-type MIME_TYPE\n" + " fallback-for-type MIME_TYPE\n" + " should-show DESKTOP_FILE\n" + " monitor\n" + "\n" + "Examples:\n" + " apps search --should-show-only ter\n" + " apps show-info org.gnome.Nautilus.desktop\n" + " apps default-for-type image/png\n" + "\n"); else if (g_str_equal (argv[1], "list")) { GList *all, *i; @@ -47,13 +67,31 @@ main (int argc, char **argv) else if (g_str_equal (argv[1], "search")) { gchar ***results; + gboolean should_show_only; gint i, j; - results = g_desktop_app_info_search (argv[2]); + should_show_only = argc > 3 && g_str_equal (argv[2], "--should-show-only"); + results = g_desktop_app_info_search (argv[ should_show_only ? 3 : 2 ]); for (i = 0; results[i]; i++) { for (j = 0; results[i][j]; j++) - g_print ("%s%s", j ? " " : "", results[i][j]); + { + if (should_show_only) + { + GDesktopAppInfo *info; + gboolean should_show; + + info = g_desktop_app_info_new (results[i][j]); + if (info) + { + should_show = g_app_info_should_show (G_APP_INFO (info)); + g_object_unref (info); + if (!should_show) + continue; + } + } + g_print ("%s%s", j ? " " : "", results[i][j]); + } g_print ("\n"); g_strfreev (results[i]); } diff --git a/gio/tests/codegen.py b/gio/tests/codegen.py index 9fd4321..a18dcb1 100644 --- a/gio/tests/codegen.py +++ b/gio/tests/codegen.py @@ -28,6 +28,7 @@ import shutil import subprocess import sys import tempfile +import textwrap import unittest import xml.etree.ElementTree as ET @@ -40,10 +41,6 @@ import taptestrunner Result = collections.namedtuple("Result", ("info", "out", "err", "subs")) -def on_win32(): - return sys.platform.find("win") != -1 - - class TestCodegen(unittest.TestCase): """Integration test for running gdbus-codegen. @@ -116,6 +113,7 @@ class TestCodegen(unittest.TestCase): env = os.environ.copy() env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" print("Environment:", env) # We want to ensure consistent line endings... @@ -147,6 +145,7 @@ class TestCodegen(unittest.TestCase): "#ifdef G_OS_UNIX\n" "# include \n" "#endif", + "interface_info_header_includes": "#include ", "private_gvalues_getters": """#ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_schar (v) @@ -353,10 +352,34 @@ class TestCodegen(unittest.TestCase): with self.assertRaises(subprocess.CalledProcessError): self.runCodegen() - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_empty_interface_header(self): """Test generating a header with an empty interface file.""" - result = self.runCodegenWithInterface("", "--output", "/dev/stdout", "--header") + result = self.runCodegenWithInterface("", "--output", "-", "--header") + self.assertEqual("", result.err) + self.assertEqual( + """{standard_top_comment} + +#ifndef __STDOUT__ +#define __STDOUT__ + +#include + +G_BEGIN_DECLS + + +G_END_DECLS + +#endif /* __STDOUT__ */""".format( + **result.subs + ), + result.out.strip(), + ) + + def test_empty_interface_info_header(self): + """Test generating a header with an empty interface file.""" + result = self.runCodegenWithInterface( + "", "--output", "-", "--interface-info-header" + ) self.assertEqual("", result.err) self.assertEqual( """{standard_top_comment} @@ -377,18 +400,15 @@ G_END_DECLS result.out.strip(), ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_empty_interface_body(self): """Test generating a body with an empty interface file.""" - result = self.runCodegenWithInterface("", "--output", "/dev/stdout", "--body") + result = self.runCodegenWithInterface("", "--output", "-", "--body") self.assertEqual("", result.err) self.assertEqual( """{standard_top_comment} {standard_config_h_include} -#include "stdout.h" - {standard_header_includes} {private_gvalues_getters} @@ -399,7 +419,23 @@ G_END_DECLS result.out.strip(), ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") + def test_empty_interface_info_body(self): + """Test generating a body with an empty interface file.""" + result = self.runCodegenWithInterface( + "", "--output", "-", "--interface-info-body" + ) + self.assertEqual("", result.err) + self.assertEqual( + """{standard_top_comment} + +{standard_config_h_include} + +{interface_info_header_includes}""".format( + **result.subs + ), + result.out.strip(), + ) + def test_reproducible(self): """Test builds are reproducible regardless of file ordering.""" xml_contents1 = """ @@ -442,7 +478,7 @@ G_END_DECLS xml_file1.name, xml_file2.name, "--output", - "/dev/stdout", + "-", header_or_body, ) self.assertEqual("", result1.err) @@ -451,7 +487,7 @@ G_END_DECLS xml_file2.name, xml_file1.name, "--output", - "/dev/stdout", + "-", header_or_body, ) self.assertEqual("", result2.err) @@ -477,7 +513,7 @@ G_END_DECLS self.assertEqual("", res.out) with open("test-org.project.Bar.Frobnicator.xml", "r") as f: xml_data = f.readlines() - self.assertTrue(len(xml_data) != 0) + self.assertNotEqual(len(xml_data), 0) def test_generate_md(self): """Test the basic functionality of the markdown generator.""" @@ -497,7 +533,7 @@ G_END_DECLS self.assertEqual("", res.out) with open("test-org.project.Bar.Frobnicator.md", "r") as f: rst = f.readlines() - self.assertTrue(len(rst) != 0) + self.assertNotEqual(len(rst), 0) def test_generate_rst(self): """Test the basic functionality of the rst generator.""" @@ -517,37 +553,166 @@ G_END_DECLS self.assertEqual("", res.out) with open("test-org.project.Bar.Frobnicator.rst", "r") as f: rst = f.readlines() - self.assertTrue(len(rst) != 0) + self.assertNotEqual(len(rst), 0) + + def test_generate_rst_method(self): + """Test generating a method documentation with the rst generator.""" + xml_contents = """ + + + + + + + """ + res = self.runCodegenWithInterface( + xml_contents, + "--generate-rst", + "test", + ) + self.assertEqual("", res.err) + self.assertEqual("", res.out) + with open("test-org.project.Bar.Frobnicator.rst", "r") as f: + rst = f.read() + self.assertIn( + textwrap.dedent( + """ + ------- + Methods + ------- + + .. _org.project.Bar.Frobnicator.RandomMethod: + + org.project.Bar.Frobnicator.RandomMethod + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + :: + + RandomMethod () + + + A random test method.""" + ), + rst, + ) + + def test_generate_rst_signal(self): + """Test generating a signal documentation with the rst generator.""" + xml_contents = """ + + + + + + + """ + res = self.runCodegenWithInterface( + xml_contents, + "--generate-rst", + "test", + ) + self.assertEqual("", res.err) + self.assertEqual("", res.out) + with open("test-org.project.Bar.Frobnicator.rst", "r") as f: + rst = f.read() + self.assertIn( + textwrap.dedent( + """ + ------- + Signals + ------- + + .. _org.project.Bar.Frobnicator::RandomSignal: + + org.project.Bar.Frobnicator::RandomSignal + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + :: + + RandomSignal () + + + A random test signal.""" + ), + rst, + ) + + def test_generate_rst_property(self): + """Test generating a property documentation with the rst generator.""" + xml_contents = """ + + + + + + + """ + res = self.runCodegenWithInterface( + xml_contents, + "--generate-rst", + "test", + ) + self.assertEqual("", res.err) + self.assertEqual("", res.out) + with open("test-org.project.Bar.Frobnicator.rst", "r") as f: + rst = f.read() + self.assertIn( + textwrap.dedent( + """ + ---------- + Properties + ---------- + + .. _org.project.Bar.Frobnicator:RandomProperty: + + org.project.Bar.Frobnicator:RandomProperty + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + :: + + RandomProperty readable s + + + A random test property.""" + ), + rst, + ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_min_required_invalid(self): """Test running with an invalid --glib-min-required.""" with self.assertRaises(subprocess.CalledProcessError): self.runCodegenWithInterface( "", "--output", - "/dev/stdout", + "-", "--body", "--glib-min-required", "hello mum", ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_min_required_too_low(self): """Test running with a --glib-min-required which is too low (and hence probably a typo).""" with self.assertRaises(subprocess.CalledProcessError): self.runCodegenWithInterface( - "", "--output", "/dev/stdout", "--body", "--glib-min-required", "2.6" + "", "--output", "-", "--body", "--glib-min-required", "2.6" ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_min_required_major_only(self): """Test running with a --glib-min-required which contains only a major version.""" result = self.runCodegenWithInterface( "", "--output", - "/dev/stdout", + "-", "--header", "--glib-min-required", "3", @@ -557,43 +722,38 @@ G_END_DECLS self.assertEqual("", result.err) self.assertNotEqual("", result.out.strip()) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_min_required_with_micro(self): """Test running with a --glib-min-required which contains a micro version.""" result = self.runCodegenWithInterface( - "", "--output", "/dev/stdout", "--header", "--glib-min-required", "2.46.2" + "", "--output", "-", "--header", "--glib-min-required", "2.46.2" ) self.assertEqual("", result.err) self.assertNotEqual("", result.out.strip()) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_max_allowed_too_low(self): """Test running with a --glib-max-allowed which is too low (and hence probably a typo).""" with self.assertRaises(subprocess.CalledProcessError): self.runCodegenWithInterface( - "", "--output", "/dev/stdout", "--body", "--glib-max-allowed", "2.6" + "", "--output", "-", "--body", "--glib-max-allowed", "2.6" ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_max_allowed_major_only(self): """Test running with a --glib-max-allowed which contains only a major version.""" result = self.runCodegenWithInterface( - "", "--output", "/dev/stdout", "--header", "--glib-max-allowed", "3" + "", "--output", "-", "--header", "--glib-max-allowed", "3" ) self.assertEqual("", result.err) self.assertNotEqual("", result.out.strip()) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_max_allowed_with_micro(self): """Test running with a --glib-max-allowed which contains a micro version.""" result = self.runCodegenWithInterface( - "", "--output", "/dev/stdout", "--header", "--glib-max-allowed", "2.46.2" + "", "--output", "-", "--header", "--glib-max-allowed", "2.46.2" ) self.assertEqual("", result.err) self.assertNotEqual("", result.out.strip()) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_max_allowed_unstable(self): """Test running with a --glib-max-allowed which is unstable. It should be rounded up to the next stable version number, and hence should not @@ -601,7 +761,7 @@ G_END_DECLS result = self.runCodegenWithInterface( "", "--output", - "/dev/stdout", + "-", "--header", "--glib-max-allowed", "2.63", @@ -611,7 +771,6 @@ G_END_DECLS self.assertEqual("", result.err) self.assertNotEqual("", result.out.strip()) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_glib_max_allowed_less_than_min_required(self): """Test running with a --glib-max-allowed which is less than --glib-min-required.""" @@ -619,7 +778,7 @@ G_END_DECLS self.runCodegenWithInterface( "", "--output", - "/dev/stdout", + "-", "--body", "--glib-max-allowed", "2.62", @@ -627,7 +786,6 @@ G_END_DECLS "2.64", ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_dbus_types(self): bad_types = [ "{vs}", # Bad dictionary key type @@ -663,9 +821,7 @@ G_END_DECLS """ with self.assertRaises(subprocess.CalledProcessError): - self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") good_types = [ "si{s{b(ybnqiuxtdh)}}{yv}{nv}{dv}", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" @@ -681,11 +837,10 @@ G_END_DECLS """ result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" + interface_xml, "--output", "-", "--body" ) self.assertEqual("", result.err) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_unix_fd_types_and_annotations(self): """Test an interface with `h` arguments, no annotation, and GLib < 2.64. @@ -713,7 +868,7 @@ G_END_DECLS # Try without specifying --glib-min-required. result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--header" + interface_xml, "--output", "-", "--header" ) self.assertEqual("", result.err) self.assertEqual(result.out.strip().count("GUnixFDList"), 6) @@ -722,7 +877,7 @@ G_END_DECLS result = self.runCodegenWithInterface( interface_xml, "--output", - "/dev/stdout", + "-", "--header", "--glib-min-required", "2.32", @@ -736,7 +891,7 @@ G_END_DECLS result = self.runCodegenWithInterface( interface_xml, "--output", - "/dev/stdout", + "-", "--header", "--glib-min-required", "2.64", @@ -744,7 +899,6 @@ G_END_DECLS self.assertEqual("", result.err) self.assertEqual(result.out.strip().count("GUnixFDList"), 18) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_call_flags_and_timeout_method_args(self): """Test that generated method call functions have @call_flags and @timeout_msec args if and only if GLib >= 2.64. @@ -758,7 +912,7 @@ G_END_DECLS # Try without specifying --glib-min-required. result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--header" + interface_xml, "--output", "-", "--header" ) self.assertEqual("", result.err) self.assertEqual(result.out.strip().count("GDBusCallFlags call_flags,"), 0) @@ -768,7 +922,7 @@ G_END_DECLS result = self.runCodegenWithInterface( interface_xml, "--output", - "/dev/stdout", + "-", "--header", "--glib-min-required", "2.32", @@ -782,7 +936,7 @@ G_END_DECLS result = self.runCodegenWithInterface( interface_xml, "--output", - "/dev/stdout", + "-", "--header", "--glib-min-required", "2.64", @@ -791,7 +945,6 @@ G_END_DECLS self.assertEqual(result.out.strip().count("GDBusCallFlags call_flags,"), 2) self.assertEqual(result.out.strip().count("gint timeout_msec,"), 2) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signal_id_simple_signal(self): """Test that signals IDs are used to emit signals""" interface_xml = """ @@ -804,9 +957,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_signal_emit_by_name ("), 0) @@ -823,7 +974,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signal_id_multiple_signals_types(self): """Test that signals IDs are used to emit signals for all types""" @@ -843,9 +993,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_signal_emit_by_name ("), 0) @@ -863,7 +1011,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signal_id_multiple_signal_args_types(self): """Test that signals IDs are used to emit signals for all types""" @@ -881,9 +1028,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_signal_emit_by_name ("), 0) @@ -902,7 +1047,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signals_marshaller_simple_signal(self): """Test that signals marshaller is generated for simple signal""" interface_xml = """ @@ -915,9 +1059,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -932,7 +1074,6 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name} ("), 1) self.assertIs(stripped_out.count("g_cclosure_marshal_VOID__VOID (closure"), 2) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signals_marshaller_single_typed_args(self): """Test that signals marshaller is generated for each known type""" for t, props in self.ARGUMENTS_TYPES.items(): @@ -948,7 +1089,7 @@ G_END_DECLS """ result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" + interface_xml, "--output", "-", "--body" ) stripped_out = result.out.strip() self.assertFalse(result.err) @@ -979,7 +1120,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_signals_marshallers_multiple_args(self): """Test that signals marshallers are generated""" generated_args = [ @@ -997,9 +1137,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -1023,7 +1161,6 @@ G_END_DECLS ) index += 1 - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshaller_simple_method(self): """Test that methods marshaller is generated for simple method""" interface_xml = """ @@ -1036,9 +1173,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -1068,7 +1203,6 @@ G_END_DECLS stripped_out.count("_g_dbus_codegen_marshal_BOOLEAN__OBJECT (closure"), 2 ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshaller_single_typed_in_args(self): """Test that methods marshallers are generated for each known type""" for t, props in self.ARGUMENTS_TYPES.items(): @@ -1083,7 +1217,7 @@ G_END_DECLS """ result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" + interface_xml, "--output", "-", "--body" ) stripped_out = result.out.strip() self.assertFalse(result.err) @@ -1107,7 +1241,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshaller_single_typed_out_args(self): """Test that methods marshallers are generated for each known type""" for t, props in self.ARGUMENTS_TYPES.items(): @@ -1122,7 +1255,7 @@ G_END_DECLS """ result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" + interface_xml, "--output", "-", "--body" ) stripped_out = result.out.strip() self.assertFalse(result.err) @@ -1141,7 +1274,6 @@ G_END_DECLS ) self.assertIs(stripped_out.count("(param_values + 2)"), 0) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshallers_multiple_in_args(self): """Test that methods marshallers are generated""" generated_args = [ @@ -1166,9 +1298,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -1210,7 +1340,6 @@ G_END_DECLS self.assertIs(stripped_out.count(f"{func_name},"), 1) self.assertIs(stripped_out.count(f"{func_name} ("), 1) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshallers_multiple_out_args(self): """Test that methods marshallers are generated""" generated_args = [ @@ -1227,9 +1356,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -1258,7 +1385,6 @@ G_END_DECLS 1, ) - @unittest.skipIf(on_win32(), "requires /dev/stdout") def test_generate_methods_marshallers_with_unix_fds(self): """Test an interface with `h` arguments""" interface_xml = """ @@ -1272,9 +1398,7 @@ G_END_DECLS """ - result = self.runCodegenWithInterface( - interface_xml, "--output", "/dev/stdout", "--body" - ) + result = self.runCodegenWithInterface(interface_xml, "--output", "-", "--body") stripped_out = result.out.strip() self.assertFalse(result.err) self.assertIs(stripped_out.count("g_cclosure_marshal_generic"), 0) @@ -1338,7 +1462,7 @@ G_END_DECLS self.assertEqual("", res.err) self.assertEqual("", res.out) with open("test-org.project.Bar.Frobnicator.xml", "r") as f: - self.assertTrue(ET.parse(f) is not None) + self.assertIsNotNone(ET.parse(f)) def test_indentation_preservation_in_comments(self): """Test if the parser preserves relative indentation in XML comments""" diff --git a/gio/tests/contenttype.c b/gio/tests/contenttype.c index 7fd97f4..8784374 100644 --- a/gio/tests/contenttype.c +++ b/gio/tests/contenttype.c @@ -360,6 +360,57 @@ test_tree (void) } } +static void +test_tree_invalid_encoding (void) +{ + gchar *path; + gchar *name; + GFile *tmpdir; + GFile *file; + gchar **types; + GError *error = NULL; + + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/3168"); + +#if defined(__APPLE__) || defined(G_OS_WIN32) + g_test_skip ("The OSX & Windows backends do not implement g_content_type_guess_for_tree()"); + return; +#endif + + path = g_dir_make_tmp ("gio-test-tree-invalid-encoding-XXXXXX", &error); + g_assert_no_error (error); + tmpdir = g_file_new_for_path (path); + g_free (path); + + name = g_strdup_printf ("\260"); + file = g_file_get_child (tmpdir, name); + g_free (name); + + g_file_replace_contents (file, "", 0, NULL, FALSE, 0, NULL, NULL, &error); + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT)) + { + g_test_skip ("Unable to create testing file with non-ASCII characters."); + + g_object_unref (tmpdir); + g_object_unref (file); + g_clear_error (&error); + + return; + } + g_assert_no_error (error); + + types = g_content_type_guess_for_tree (tmpdir); + g_strfreev (types); + + g_file_delete (file, NULL, &error); + g_assert_no_error (error); + g_object_unref (file); + + g_file_delete (tmpdir, NULL, &error); + g_assert_no_error (error); + g_object_unref (tmpdir); +} + static void test_type_is_a_special_case (void) { @@ -442,6 +493,8 @@ main (int argc, char *argv[]) g_test_add_func ("/contenttype/icon", test_icon); g_test_add_func ("/contenttype/symbolic-icon", test_symbolic_icon); g_test_add_func ("/contenttype/tree", test_tree); + g_test_add_func ("/contenttype/tree_invalid_encoding", + test_tree_invalid_encoding); g_test_add_func ("/contenttype/test_type_is_a_special_case", test_type_is_a_special_case); diff --git a/gio/tests/cxx.cpp b/gio/tests/cxx.cpp index 630eeab..7aba351 100644 --- a/gio/tests/cxx.cpp +++ b/gio/tests/cxx.cpp @@ -59,7 +59,7 @@ int main (int argc, char **argv) { #if G_CXX_STD_CHECK_VERSION (11) - g_test_init (&argc, &argv, NULL); + g_test_init (&argc, &argv, nullptr); #else g_test_init (&argc, &argv, static_cast(NULL)); #endif diff --git a/gio/tests/defaultvalue.c b/gio/tests/defaultvalue.c index f99f98b..bbc8b3e 100644 --- a/gio/tests/defaultvalue.c +++ b/gio/tests/defaultvalue.c @@ -17,9 +17,15 @@ * along with this library; if not, see . */ +#include "config.h" + #include #include +#ifdef HAVE_COCOA +#include +#endif + static void check_property (const char *output, GParamSpec *pspec, diff --git a/gio/tests/desktop-app-info.c b/gio/tests/desktop-app-info.c index 594ec94..e82e2dd 100644 --- a/gio/tests/desktop-app-info.c +++ b/gio/tests/desktop-app-info.c @@ -596,6 +596,7 @@ wait_for_file (const gchar *want_this, static void test_actions (void) { + GTestDBus *bus = NULL; const char *expected[] = { "frob", "tweak", "twiddle", "broken", NULL }; const gchar * const *actions; GDesktopAppInfo *appinfo; @@ -605,6 +606,10 @@ test_actions (void) gchar *tweak_path; gchar *twiddle_path; + /* Set up a test session bus to keep D-Bus traffic off the real session bus. */ + bus = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (bus); + appinfo = g_desktop_app_info_new_from_filename (g_test_get_filename (G_TEST_DIST, "appinfo-test-actions.desktop", NULL)); g_assert_nonnull (appinfo); @@ -651,6 +656,9 @@ test_actions (void) g_free (tweak_path); g_free (twiddle_path); g_object_unref (appinfo); + + g_test_dbus_down (bus); + g_clear_object (&bus); } static gchar * @@ -881,26 +889,24 @@ test_search (void) assert_search ("frobni", "frobnicator.desktop\n", TRUE, FALSE, NULL, NULL); /* Obvious multi-word search */ - assert_search ("gno hel", "yelp.desktop\n", TRUE, TRUE, NULL, NULL); + assert_search ("doc hel", "yelp.desktop\n", TRUE, TRUE, NULL, NULL); /* Repeated search terms should do nothing... */ - assert_search ("files file fil fi f", "nautilus.desktop\n" - "gedit.desktop\n", TRUE, TRUE, NULL, NULL); + assert_search ("files file fil fi f", "nautilus.desktop\n", TRUE, TRUE, NULL, NULL); /* "con" will match "connect" and "contacts" on name with prefix match in - * first group, then match "Dconf Editor" and "Desktop Icons" with substring - * match in next group. + * first group, then second group is a Keyword prefix match for "configuration" in dconf-editor.desktop + * and third group is a substring match for "Desktop Icons" in Name of nautilus-classic.desktop. */ assert_search ("con", "gnome-contacts.desktop nautilus-connect-server.desktop\n" - "dconf-editor.desktop nautilus-classic.desktop\n", TRUE, TRUE, NULL, NULL); + "dconf-editor.desktop\n" + "nautilus-classic.desktop\n", TRUE, TRUE, NULL, NULL); /* "gnome" will match "eye of gnome" from the user's directory, plus - * matching "GNOME Clocks" X-GNOME-FullName. It's only a comment on - * yelp and gnome-contacts, though. + * matching "GNOME Clocks" X-GNOME-FullName. */ assert_search ("gnome", "eog.desktop\n" - "org.gnome.clocks.desktop\n" - "yelp.desktop gnome-contacts.desktop\n", TRUE, TRUE, NULL, NULL); + "org.gnome.clocks.desktop\n", TRUE, TRUE, NULL, NULL); /* eog has exec name 'false' in usr only */ assert_search ("false", "eog.desktop\n", TRUE, FALSE, NULL, NULL); @@ -912,9 +918,9 @@ test_search (void) assert_search ("nonsearchable", "", TRUE, FALSE, NULL, NULL); /* "gnome con" will match only gnome contacts; via the name for - * "contacts" and the comment for "gnome" + * "contacts" and keywords for "friend" */ - assert_search ("gnome con", "gnome-contacts.desktop\n", TRUE, TRUE, NULL, NULL); + assert_search ("friend con", "gnome-contacts.desktop\n", TRUE, TRUE, NULL, NULL); /* make sure we get the correct kde4- prefix on the application IDs * from subdirectories @@ -937,8 +943,7 @@ test_search (void) /* make sure localised searching works properly */ assert_search ("foliumi", "nautilus.desktop\n" - "kde4-konqbrowser.desktop\n" - "eog.desktop\n", TRUE, FALSE, "en_US.UTF-8", "eo"); + "kde4-konqbrowser.desktop\n", TRUE, FALSE, "en_US.UTF-8", "eo"); /* the user's eog.desktop has no translations... */ assert_search ("foliumi", "nautilus.desktop\n" "kde4-konqbrowser.desktop\n", TRUE, TRUE, "en_US.UTF-8", "eo"); diff --git a/gio/tests/error.c b/gio/tests/error.c index dc79a4d..702c9c6 100644 --- a/gio/tests/error.c +++ b/gio/tests/error.c @@ -557,7 +557,7 @@ test_error_from_errno (void) #ifdef EDESTADDRREQ g_assert_cmpuint (g_io_error_from_errno (EDESTADDRREQ), ==, - G_IO_ERROR_FAILED); + G_IO_ERROR_DESTINATION_UNSET); #endif #ifdef EPROTOTYPE diff --git a/gio/tests/file.c b/gio/tests/file.c index 310981b..d32d955 100644 --- a/gio/tests/file.c +++ b/gio/tests/file.c @@ -2451,12 +2451,15 @@ test_copy_preserve_mode (void) { 0600, 0600, TRUE, G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS }, /* The same behaviour should hold if the destination file is not being * overwritten because it doesn’t already exist: */ + { 0600, 0600, FALSE, G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME | G_FILE_COPY_ALL_METADATA }, { 0600, 0600, FALSE, G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA }, { 0600, 0600, FALSE, G_FILE_COPY_NOFOLLOW_SYMLINKS }, /* Anything with %G_FILE_COPY_TARGET_DEFAULT_PERMS should use the current * umask for the destination file: */ { 0600, 0666 & ~current_umask, TRUE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA }, { 0600, 0666 & ~current_umask, TRUE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_OVERWRITE | G_FILE_COPY_NOFOLLOW_SYMLINKS }, + { 0600, 0666 & ~current_umask, FALSE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME | G_FILE_COPY_ALL_METADATA }, + { 0600, 0666 & ~current_umask, FALSE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME }, { 0600, 0666 & ~current_umask, FALSE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_NOFOLLOW_SYMLINKS | G_FILE_COPY_ALL_METADATA }, { 0600, 0666 & ~current_umask, FALSE, G_FILE_COPY_TARGET_DEFAULT_PERMS | G_FILE_COPY_NOFOLLOW_SYMLINKS }, }; @@ -3375,6 +3378,9 @@ test_build_attribute_list_for_copy (void) G_FILE_COPY_TARGET_DEFAULT_PERMS, G_FILE_COPY_ALL_METADATA, G_FILE_COPY_ALL_METADATA | G_FILE_COPY_TARGET_DEFAULT_PERMS, + G_FILE_COPY_ALL_METADATA | G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME, + G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME | G_FILE_COPY_TARGET_DEFAULT_PERMS, + G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME, }; gsize i; char *attrs; @@ -3416,8 +3422,16 @@ test_build_attribute_list_for_copy (void) } #endif #ifdef HAVE_UTIMES - g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); - g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC ",")); + if (flags & G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME) + { + g_assert_null (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); + g_assert_null (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC ",")); + } + else + { + g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); + g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC ",")); + } if (flags & G_FILE_COPY_ALL_METADATA) { g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_ACCESS ",")); @@ -3430,8 +3444,16 @@ test_build_attribute_list_for_copy (void) } #endif #ifdef HAVE_UTIMENSAT - g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); - g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_NSEC ",")); + if (flags & G_FILE_COPY_TARGET_DEFAULT_MODIFIED_TIME) + { + g_assert_null (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); + g_assert_null (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_NSEC ",")); + } + else + { + g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED ",")); + g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_MODIFIED_NSEC ",")); + } if (flags & G_FILE_COPY_ALL_METADATA) { g_assert_nonnull (g_strstr_len (attrs_with_commas, -1, "," G_FILE_ATTRIBUTE_TIME_ACCESS ",")); @@ -3936,35 +3958,42 @@ test_enumerator_cancellation (void) } static void -test_from_uri_ignores_fragment (void) +test_path_from_uri_helper (const gchar *uri, + const gchar *expected_path) { GFile *file; gchar *path; - file = g_file_new_for_uri ("file:///tmp/foo#bar"); - path = g_file_get_path (file); + gchar *expected_platform_path; + + expected_platform_path = g_strdup (expected_path); #ifdef G_OS_WIN32 - g_assert_cmpstr (path, ==, "\\tmp\\foo"); -#else - g_assert_cmpstr (path, ==, "/tmp/foo"); + for (gchar *p = expected_platform_path; *p; p++) + { + if (*p == '/') + *p = '\\'; + } #endif + + file = g_file_new_for_uri (uri); + path = g_file_get_path (file); + g_assert_cmpstr (path, ==, expected_platform_path); g_free (path); g_object_unref (file); + g_free (expected_platform_path); +} + +static void +test_from_uri_ignores_fragment (void) +{ + test_path_from_uri_helper ("file:///tmp/foo#bar", "/tmp/foo"); + test_path_from_uri_helper ("file:///tmp/foo#bar?baz", "/tmp/foo"); } static void test_from_uri_ignores_query_string (void) { - GFile *file; - gchar *path; - file = g_file_new_for_uri ("file:///tmp/foo?bar"); - path = g_file_get_path (file); -#ifdef G_OS_WIN32 - g_assert_cmpstr (path, ==, "\\tmp\\foo"); -#else - g_assert_cmpstr (path, ==, "/tmp/foo"); -#endif - g_free (path); - g_object_unref (file); + test_path_from_uri_helper ("file:///tmp/foo?bar", "/tmp/foo"); + test_path_from_uri_helper ("file:///tmp/foo?bar#baz", "/tmp/foo"); } int diff --git a/gio/tests/gapplication-example-cmdline.c b/gio/tests/gapplication-example-cmdline.c index 99380cd..cbec9a8 100644 --- a/gio/tests/gapplication-example-cmdline.c +++ b/gio/tests/gapplication-example-cmdline.c @@ -34,6 +34,7 @@ main (int argc, char **argv) G_APPLICATION_HANDLES_COMMAND_LINE); g_signal_connect (app, "command-line", G_CALLBACK (command_line), NULL); g_application_set_inactivity_timeout (app, 10000); + g_application_set_version (app, "2.3"); status = g_application_run (app, argc, argv); diff --git a/gio/tests/gapplication.c b/gio/tests/gapplication.c index b0584eb..8c1dac1 100644 --- a/gio/tests/gapplication.c +++ b/gio/tests/gapplication.c @@ -369,6 +369,7 @@ properties (void) GDBusConnection *c; GObject *app; gchar *id; + gchar *version; GApplicationFlags flags; gboolean registered; guint timeout; @@ -381,20 +382,25 @@ properties (void) app = g_object_new (G_TYPE_APPLICATION, "application-id", "org.gtk.TestApplication", + "version", "1.0", NULL); g_object_get (app, "application-id", &id, + "version", &version, "flags", &flags, "is-registered", ®istered, "inactivity-timeout", &timeout, NULL); g_assert_cmpstr (id, ==, "org.gtk.TestApplication"); + g_assert_cmpstr (version, ==, "1.0"); g_assert_cmpint (flags, ==, G_APPLICATION_DEFAULT_FLAGS); g_assert (!registered); g_assert_cmpint (timeout, ==, 0); + g_clear_pointer (&version, g_free); + ret = g_application_register (G_APPLICATION (app), NULL, &error); g_assert (ret); g_assert_no_error (error); @@ -832,6 +838,47 @@ test_help (void) g_test_trap_assert_stdout ("*Application options*"); } +static gint +command_line_done_callback (GApplication *app, + GApplicationCommandLine *command_line, + gpointer user_data) +{ + gboolean *called = user_data; + + *called = TRUE; + + g_application_command_line_set_exit_status (command_line, 42); + g_application_command_line_done (command_line); + + return 0; +} + +/* Test whether 'command-line' handler return value is ignored + * after g_application_command_line_done() + */ +static void +test_command_line_done (void) +{ + char *binpath = g_test_build_filename (G_TEST_BUILT, "unimportant", NULL); + const gchar *const argv[] = { binpath, "arg", NULL }; + GApplication *app; + gboolean called = FALSE; + int status; + gulong command_line_id; + + app = g_application_new ("org.gtk.TestApplication", G_APPLICATION_HANDLES_COMMAND_LINE); + command_line_id = g_signal_connect (app, "command-line", G_CALLBACK (command_line_done_callback), &called); + + status = g_application_run (app, G_N_ELEMENTS (argv) - 1, (gchar **) argv); + + g_signal_handler_disconnect (app, command_line_id); + g_object_unref (app); + g_free (binpath); + + g_assert_true (called); + g_assert_cmpint (status, ==, 42); +} + static void test_busy (void) { @@ -1044,6 +1091,37 @@ test_api (void) g_object_unref (app); } +static void +test_version (void) +{ + GApplication *app; + gchar *version = NULL; + gchar *version_orig = NULL; + + app = g_application_new ("org.gtk.TestApplication", 0); + + version_orig = "1.2"; + g_object_set (G_OBJECT (app), "version", version_orig, NULL); + g_object_get (app, "version", &version, NULL); + g_assert_cmpstr (version, ==, version_orig); + g_free (version); + + /* test attempting to set the same version again */ + version_orig = "1.2"; + g_object_set (G_OBJECT (app), "version", version_orig, NULL); + g_object_get (app, "version", &version, NULL); + g_assert_cmpstr (version, ==, version_orig); + g_free (version); + + version_orig = "2.4"; + g_object_set (G_OBJECT (app), "version", version_orig, NULL); + g_object_get (app, "version", &version, NULL); + g_assert_cmpstr (version, ==, version_orig); + g_free (version); + + g_object_unref (app); +} + /* Check that G_APPLICATION_ALLOW_REPLACEMENT works. To do so, we launch * a GApplication in this process that allows replacement, and then * launch a subprocess with --gapplication-replace. We have to do our @@ -1242,8 +1320,7 @@ dbus_startup_reply_cb (GObject *source_object, reply = g_dbus_connection_send_message_with_reply_finish (connection, result, &local_error); g_assert_no_error (local_error); - /* Nothing to check on the reply for now. */ - g_clear_object (&reply); + g_object_set_data_full (G_OBJECT (app), "dbus-command-line-reply", g_steal_pointer (&reply), g_object_unref); /* Release the app in an idle callback, so there’s time to process other * pending sources first. */ @@ -1563,6 +1640,80 @@ test_dbus_command_line (void) g_clear_object (&bus); } +static gint +dbus_command_line_done_cb (GApplication *app, + GApplicationCommandLine *command_line, + gpointer user_data) +{ + guint *n_command_lines = user_data; + + *n_command_lines = *n_command_lines + 1; + + if (*n_command_lines == 1) + return 0; + + g_object_set_data_full (G_OBJECT (app), "command-line", g_object_ref (command_line), g_object_unref); + + g_application_command_line_set_exit_status (command_line, 42); + g_application_command_line_done (command_line); + + return 1; /* ignored - after g_application_command_line_done () */ +} + +static void +test_dbus_command_line_done (void) +{ + GTestDBus *bus = NULL; + GVariantBuilder builder; + GDBusMessage *message = NULL; + GDBusMessage *reply = NULL; + GApplication *app = NULL; + guint n_command_lines = 0; + gint exit_status; + + g_test_summary ("Test that GDBusCommandLine.done() works"); + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("aay")); + g_variant_builder_add (&builder, "^ay", "test-program"); + g_variant_builder_add (&builder, "^ay", "/path/to/something"); + + message = g_dbus_message_new_method_call ("org.gtk.TestApplication.CommandLine", + "/org/gtk/TestApplication/CommandLine", + "org.gtk.Application", + "CommandLine"); + g_dbus_message_set_body (message, g_variant_new ("(oaaya{sv})", + "/my/org/gtk/private/CommandLine", + &builder, NULL)); + + bus = g_test_dbus_new (G_TEST_DBUS_NONE); + g_test_dbus_up (bus); + + app = g_application_new ("org.gtk.TestApplication.CommandLine", G_APPLICATION_HANDLES_COMMAND_LINE); + g_signal_connect (app, "activate", G_CALLBACK (dbus_activate_noop_cb), NULL); + g_signal_connect (app, "command-line", G_CALLBACK (dbus_command_line_done_cb), &n_command_lines); + g_signal_connect (app, "startup", G_CALLBACK (dbus_startup_cb), message); + + g_application_hold (app); + exit_status = g_application_run (app, 0, NULL); + + g_assert_cmpuint (n_command_lines, ==, 2); + g_assert_cmpint (exit_status, ==, 0); + + reply = g_object_get_data (G_OBJECT (app), "dbus-command-line-reply"); + g_variant_get (g_dbus_message_get_body (reply), "(i)", &exit_status); + g_assert_cmpint (exit_status, ==, 42); + + g_signal_handlers_disconnect_by_func (app, G_CALLBACK (dbus_activate_noop_cb), NULL); + g_signal_handlers_disconnect_by_func (app, G_CALLBACK (dbus_command_line_done_cb), &n_command_lines); + g_signal_handlers_disconnect_by_func (app, G_CALLBACK (dbus_startup_cb), message); + + g_clear_object (&app); + g_clear_object (&message); + + g_test_dbus_down (bus); + g_clear_object (&bus); +} + static void dbus_activate_action_cb (GSimpleAction *action, GVariant *parameter, @@ -1710,16 +1861,19 @@ main (int argc, char **argv) /* g_test_add_func ("/gapplication/remote-command-line", test_remote_command_line); */ g_test_add_func ("/gapplication/resource-path", test_resource_path); g_test_add_func ("/gapplication/test-help", test_help); + g_test_add_func ("/gapplication/command-line-done", test_command_line_done); g_test_add_func ("/gapplication/test-busy", test_busy); g_test_add_func ("/gapplication/test-handle-local-options1", test_handle_local_options_success); g_test_add_func ("/gapplication/test-handle-local-options2", test_handle_local_options_failure); g_test_add_func ("/gapplication/test-handle-local-options3", test_handle_local_options_passthrough); g_test_add_func ("/gapplication/api", test_api); + g_test_add_func ("/gapplication/version", test_version); g_test_add_data_func ("/gapplication/replace", GINT_TO_POINTER (TRUE), test_replace); g_test_add_data_func ("/gapplication/no-replace", GINT_TO_POINTER (FALSE), test_replace); g_test_add_func ("/gapplication/dbus/activate", test_dbus_activate); g_test_add_func ("/gapplication/dbus/open", test_dbus_open); g_test_add_func ("/gapplication/dbus/command-line", test_dbus_command_line); + g_test_add_func ("/gapplication/dbus/command-line-done", test_dbus_command_line_done); g_test_add_func ("/gapplication/dbus/activate-action", test_dbus_activate_action); return g_test_run (); diff --git a/gio/tests/gdbus-connection.c b/gio/tests/gdbus-connection.c index 05b1f12..1be1a2f 100644 --- a/gio/tests/gdbus-connection.c +++ b/gio/tests/gdbus-connection.c @@ -742,6 +742,7 @@ test_match_rule (GDBusConnection *connection, GDBusSignalFlags flags, gchar *arg0_rule, gchar *arg0, + const gchar *signal_type, gboolean should_match) { guint subscription_ids[2]; @@ -766,7 +767,7 @@ test_match_rule (GDBusConnection *connection, g_dbus_connection_emit_signal (connection, NULL, "/", "org.gtk.ExampleInterface", - "Foo", g_variant_new ("(s)", arg0), + "Foo", g_variant_new (signal_type, arg0), &error); g_assert_no_error (error); @@ -793,22 +794,28 @@ test_connection_signal_match_rules (void) session_bus_up (); con = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_NONE, "foo", "foo", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_NONE, "foo", "bar", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_NONE, "foo", "foo", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_NONE, "foo", "bar", "(s)", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk.Example", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk+", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "", "(s)", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org", "(s)", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk.Example", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_NAMESPACE, "org.gtk", "org.gtk+", "(s)", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/", "/", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/", "", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk/Example", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/", "/org/gtk/Example", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk/", TRUE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk", FALSE); - test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk+", "/org/gtk", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/", "/", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/", "", "(s)", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk/Example", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/", "/org/gtk/Example", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk/", "(s)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk", "(s)", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk+", "/org/gtk", "(s)", FALSE); + + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/", "/", "(o)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk/Example", "(o)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/", "/org/gtk/Example", "(o)", TRUE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk/Example", "/org/gtk", "(o)", FALSE); + test_match_rule (con, G_DBUS_SIGNAL_FLAGS_MATCH_ARG0_PATH, "/org/gtk+", "/org/gtk", "(o)", FALSE); g_object_unref (con); session_bus_down (); @@ -1208,6 +1215,70 @@ test_connection_serials (void) /* ---------------------------------------------------------------------------------------------------- */ +static void +get_connection_cb_expect_cancel (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *c; + GError *error; + + error = NULL; + c = g_bus_get_finish (res, &error); + + /* unref here to avoid timeouts when the test fails */ + if (c) + g_object_unref (c); + + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert_null (c); + + g_error_free (error); +} + +static void +get_connection_cb_expect_success (GObject *source_object, + GAsyncResult *res, + gpointer user_data) +{ + GDBusConnection *c; + GError *error; + + error = NULL; + c = g_bus_get_finish (res, &error); + g_assert_no_error (error); + g_assert_nonnull (c); + + g_main_loop_quit (loop); + + g_object_unref (c); +} + +static void +test_connection_cancel (void) +{ + GCancellable *cancellable, *cancellable2; + + g_test_summary ("Test that cancelling one of two racing g_bus_get() calls does not cancel the other one"); + + session_bus_up (); + + cancellable = g_cancellable_new (); + cancellable2 = g_cancellable_new (); + + g_bus_get (G_BUS_TYPE_SESSION, cancellable, get_connection_cb_expect_cancel, NULL); + g_bus_get (G_BUS_TYPE_SESSION, cancellable2, get_connection_cb_expect_success, NULL); + g_cancellable_cancel (cancellable); + g_main_loop_run (loop); + + g_object_unref (cancellable); + g_object_unref (cancellable2); + + session_bus_down (); +} + +/* ---------------------------------------------------------------------------------------------------- */ + static void test_connection_basic (void) { @@ -1294,6 +1365,7 @@ main (int argc, g_test_add_func ("/gdbus/connection/signal-match-rules", test_connection_signal_match_rules); g_test_add_func ("/gdbus/connection/filter", test_connection_filter); g_test_add_func ("/gdbus/connection/serials", test_connection_serials); + g_test_add_func ("/gdbus/connection/cancel", test_connection_cancel); ret = g_test_run(); g_main_loop_unref (loop); diff --git a/gio/tests/gdbus-object-manager-example/meson.build b/gio/tests/gdbus-object-manager-example/meson.build index df09992..83b4fc0 100644 --- a/gio/tests/gdbus-object-manager-example/meson.build +++ b/gio/tests/gdbus-object-manager-example/meson.build @@ -20,7 +20,10 @@ gdbus_example_objectmanager_generated = custom_target('objectmanager-gen', '--generate-docbook', 'objectmanager-gen', '--symbol-decorator', 'GDBUS_OBJECT_MANAGER_EXAMPLE_AVAILABLE_IN_ALL', '--symbol-decorator-header', 'gdbus-example-objectmanager-visibility.h', - '@INPUT@']) + '@INPUT@'], + depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, +) gdbus_example_objectmanager_rst_gen = custom_target('objectmanager-rst-gen', input: gdbus_example_objectmanager_xml, @@ -36,6 +39,8 @@ gdbus_example_objectmanager_rst_gen = custom_target('objectmanager-rst-gen', '--output-directory', '@OUTDIR@', '@INPUT@', ], + depend_files: gdbus_codegen_built_files, + depends: gdbus_codegen_built_targets, ) extra_c_args = [] diff --git a/gio/tests/gdbus-serialization.c b/gio/tests/gdbus-serialization.c index 9ad5409..16bf357 100644 --- a/gio/tests/gdbus-serialization.c +++ b/gio/tests/gdbus-serialization.c @@ -914,19 +914,106 @@ test_message_serialize_header_checks (void) g_object_unref (message); /* - * check that we can't serialize messages with SIGNATURE set to a non-signature-typed value + * check we can't serialize messages with an INVALID header */ message = g_dbus_message_new_signal ("/the/path", "The.Interface", "TheMember"); - g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE, g_variant_new_boolean (FALSE)); + g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_INVALID, g_variant_new_boolean (FALSE)); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Signature header found but is not of type signature"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: INVALID header field supplied"); g_assert_null (blob); g_clear_error (&error); g_clear_object (&message); + /* + * check that we can't serialize messages with various fields set to incorrectly typed values + */ + const struct + { + GDBusMessageHeaderField field; + const char *invalid_value; /* as a GVariant in text form */ + const char *expected_error_message; + } + field_type_tests[] = + { + { + G_DBUS_MESSAGE_HEADER_FIELD_PATH, + "'/correct/value/but/wrong/type'", + "Cannot serialize message: SIGNAL message: PATH header field is invalid; expected a value of type ‘o’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE, + "@u 5", + "Cannot serialize message: SIGNAL message: INTERFACE header field is invalid; expected a value of type ‘s’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE, + "'valid type, but not an interface name'", + "Cannot serialize message: SIGNAL message: INTERFACE header field does not contain a valid interface name" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, + "@u 5", + "Cannot serialize message: SIGNAL message: MEMBER header field is invalid; expected a value of type ‘s’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_MEMBER, + "'valid type, but not a member name'", + "Cannot serialize message: SIGNAL message: MEMBER header field does not contain a valid member name" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME, + "@u 5", + "Cannot serialize message: SIGNAL message: ERROR_NAME header field is invalid; expected a value of type ‘s’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME, + "'valid type, but not an error name'", + "Cannot serialize message: SIGNAL message: ERROR_NAME header field does not contain a valid error name" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, + "'oops'", + "Cannot serialize message: SIGNAL message: REPLY_SERIAL header field is invalid; expected a value of type ‘u’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION, + "@u 5", + "Cannot serialize message: SIGNAL message: DESTINATION header field is invalid; expected a value of type ‘s’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_SENDER, + "@u 5", + "Cannot serialize message: SIGNAL message: SENDER header field is invalid; expected a value of type ‘s’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE, + "false", + "Cannot serialize message: SIGNAL message: SIGNATURE header field is invalid; expected a value of type ‘g’" + }, + { + G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS, + "'five'", + "Cannot serialize message: SIGNAL message: NUM_UNIX_FDS header field is invalid; expected a value of type ‘u’" + }, + }; + + for (size_t i = 0; i < G_N_ELEMENTS (field_type_tests); i++) + { + message = g_dbus_message_new_signal ("/the/path", "The.Interface", "TheMember"); + g_dbus_message_set_header (message, field_type_tests[i].field, g_variant_new_parsed (field_type_tests[i].invalid_value)); + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); + + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); + g_assert_cmpstr (error->message, ==, field_type_tests[i].expected_error_message); + g_assert_null (blob); + + g_clear_error (&error); + g_clear_object (&message); + } + /* * check we can't serialize signal messages with INTERFACE, PATH or MEMBER unset / set to reserved value */ @@ -936,14 +1023,14 @@ test_message_serialize_header_checks (void) g_dbus_message_set_interface (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: INTERFACE header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* interface reserved value => error */ g_dbus_message_set_interface (message, "org.freedesktop.DBus.Local"); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: The INTERFACE header field is using the reserved value org.freedesktop.DBus.Local"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: INTERFACE header field is using the reserved value org.freedesktop.DBus.Local"); g_clear_error (&error); g_assert_null (blob); /* reset interface */ @@ -953,14 +1040,14 @@ test_message_serialize_header_checks (void) g_dbus_message_set_path (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* path reserved value => error */ g_dbus_message_set_path (message, "/org/freedesktop/DBus/Local"); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: The PATH header field is using the reserved value /org/freedesktop/DBus/Local"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH header field is using the reserved value /org/freedesktop/DBus/Local"); g_clear_error (&error); g_assert_null (blob); /* reset path */ @@ -970,7 +1057,7 @@ test_message_serialize_header_checks (void) g_dbus_message_set_member (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: SIGNAL message: MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset member */ @@ -988,7 +1075,7 @@ test_message_serialize_header_checks (void) g_dbus_message_set_path (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset path */ @@ -998,7 +1085,7 @@ test_message_serialize_header_checks (void) g_dbus_message_set_member (message, NULL); blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: PATH or MEMBER header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: METHOD_CALL message: MEMBER header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset member */ @@ -1029,7 +1116,7 @@ test_message_serialize_header_checks (void) g_dbus_message_set_error_name (reply, NULL); blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: ERROR_NAME header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); /* reset ERROR_NAME */ @@ -1038,13 +1125,77 @@ test_message_serialize_header_checks (void) g_dbus_message_set_header (reply, G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL, NULL); blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &error); g_assert_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT); - g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"); + g_assert_cmpstr (error->message, ==, "Cannot serialize message: ERROR message: REPLY_SERIAL header field is missing or invalid"); g_clear_error (&error); g_assert_null (blob); g_object_unref (reply); g_object_unref (message); } +static void +test_message_serialize_header_checks_valid (void) +{ + GDBusMessage *message = NULL, *reply = NULL; + GError *local_error = NULL; + guchar *blob; + gsize blob_size; + + g_test_summary ("Test that validation allows well-formed messages of all the different types"); + + /* Method call */ + message = g_dbus_message_new_method_call ("Some.Name", "/the/path", "org.some.Interface", "TheMethod"); + g_dbus_message_set_serial (message, 666); + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + + /* Method return */ + reply = g_dbus_message_new_method_reply (message); + blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + g_clear_object (&reply); + + /* Error */ + reply = g_dbus_message_new_method_error (message, "Error.Name", "Some error message"); + blob = g_dbus_message_to_blob (reply, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + + g_clear_object (&reply); + g_clear_object (&message); + + /* Signal */ + message = g_dbus_message_new_signal ("/the/path", "org.some.Interface", "SignalName"); + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + g_clear_object (&message); + + /* Also check that an unknown message type is allowed */ + message = g_dbus_message_new (); + g_dbus_message_set_message_type (message, 123); + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + g_clear_object (&message); + + /* Even one with a well-defined field on it */ + message = g_dbus_message_new (); + g_dbus_message_set_message_type (message, 123); + g_dbus_message_set_header (message, G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS, g_variant_new_uint32 (0)); + blob = g_dbus_message_to_blob (message, &blob_size, G_DBUS_CAPABILITY_FLAGS_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (blob); + g_free (blob); + g_clear_object (&message); +} + /* ---------------------------------------------------------------------------------------------------- */ static void @@ -1755,6 +1906,8 @@ main (int argc, test_message_serialize_invalid); g_test_add_func ("/gdbus/message-serialize/header-checks", test_message_serialize_header_checks); + g_test_add_func ("/gdbus/message-serialize/header-checks/valid", + test_message_serialize_header_checks_valid); g_test_add_func ("/gdbus/message-serialize/double-array", test_message_serialize_double_array); g_test_add_func ("/gdbus/message-serialize/empty-structure", diff --git a/gio/tests/gdbus-test-codegen.c b/gio/tests/gdbus-test-codegen.c index 31de7f1..9c84ea6 100644 --- a/gio/tests/gdbus-test-codegen.c +++ b/gio/tests/gdbus-test-codegen.c @@ -1395,8 +1395,8 @@ check_proxies_in_thread (gpointer user_data) "/bar", NULL, /* GCancellable* */ &error); - check_bar_proxy (bar_proxy, thread_loop); g_assert_no_error (error); + check_bar_proxy (bar_proxy, thread_loop); g_object_unref (bar_proxy); error = NULL; @@ -1406,8 +1406,8 @@ check_proxies_in_thread (gpointer user_data) "/bat", NULL, /* GCancellable* */ &error); - check_bat_proxy (bat_proxy, thread_loop); g_assert_no_error (error); + check_bat_proxy (bat_proxy, thread_loop); g_object_unref (bat_proxy); error = NULL; @@ -1417,8 +1417,8 @@ check_proxies_in_thread (gpointer user_data) "/authorize", NULL, /* GCancellable* */ &error); - check_authorize_proxy (authorize_proxy, thread_loop); g_assert_no_error (error); + check_authorize_proxy (authorize_proxy, thread_loop); g_object_unref (authorize_proxy); error = NULL; diff --git a/gio/tests/gio-tool.py b/gio/tests/gio-tool.py new file mode 100644 index 0000000..1a030df --- /dev/null +++ b/gio/tests/gio-tool.py @@ -0,0 +1,138 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- +# +# Copyright © 2018, 2019 Endless Mobile, Inc. +# Copyright © 2023 Philip Withnall +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# 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.1 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 + +"""Integration tests for the gio utility.""" + +import collections +import os +import shutil +import subprocess +import sys +import tempfile +import unittest + +import taptestrunner + + +Result = collections.namedtuple("Result", ("info", "out", "err")) + + +class TestGioTool(unittest.TestCase): + """Integration test for running the gio tool. + + This can be run when installed or uninstalled. When uninstalled, it + requires G_TEST_BUILDDIR and G_TEST_SRCDIR to be set. + + The idea with this test harness is to test the gio utility, its + handling of command line arguments, its exit statuses, and its actual + effects on the file system. + """ + + # Track the cwd, we want to back out to that to clean up our tempdir + cwd = "" + + def setUp(self): + self.timeout_seconds = 6 # seconds per test + self.tmpdir = tempfile.TemporaryDirectory() + self.cwd = os.getcwd() + os.chdir(self.tmpdir.name) + print("tmpdir:", self.tmpdir.name) + + ext = "" + if os.name == "nt": + ext = ".exe" + + if "G_TEST_BUILDDIR" in os.environ: + self.__gio = os.path.join( + os.environ["G_TEST_BUILDDIR"], + "..", + "gio" + ext, + ) + else: + self.__gio = shutil.which("gio" + ext) + print("gio:", self.__gio) + + def tearDown(self): + os.chdir(self.cwd) + self.tmpdir.cleanup() + + def runGio(self, *args): + argv = [self.__gio] + argv.extend(args) + print("Running:", argv) + + env = os.environ.copy() + env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" + print("Environment:", env) + + # We want to ensure consistent line endings... + info = subprocess.run( + argv, + timeout=self.timeout_seconds, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env, + universal_newlines=True, + ) + info.check_returncode() + out = info.stdout.strip() + err = info.stderr.strip() + + result = Result(info, out, err) + + print("Output:", result.out) + return result + + def test_help(self): + """Test the --help argument and help subcommand.""" + result = self.runGio("--help") + result2 = self.runGio("help") + + self.assertEqual(result.out, result2.out) + self.assertEqual(result.err, result2.err) + + self.assertIn("Usage:\n gio COMMAND", result.out) + self.assertIn("List the contents of locations", result.out) + + def test_no_args(self): + """Test running with no arguments at all.""" + with self.assertRaises(subprocess.CalledProcessError): + self.runGio() + + def test_info_non_default_attributes(self): + """Test running `gio info --attributes` with a non-default list.""" + with tempfile.NamedTemporaryFile(dir=self.tmpdir.name) as tmpfile: + result = self.runGio( + "info", "--attributes=standard::content-type", tmpfile.name + ) + if sys.platform == "darwin": + self.assertIn("standard::content-type: public.text", result.out) + else: + self.assertIn( + "standard::content-type: application/x-zerosize", result.out + ) + + +if __name__ == "__main__": + unittest.main(testRunner=taptestrunner.TAPTestRunner()) diff --git a/gio/tests/gsettings.c b/gio/tests/gsettings.c index aa30140..6995fee 100644 --- a/gio/tests/gsettings.c +++ b/gio/tests/gsettings.c @@ -1163,9 +1163,9 @@ test_object_set_property (GObject *object, static GType test_enum_get_type (void) { - static gsize define_type_id = 0; + static GType define_type_id = 0; - if (g_once_init_enter (&define_type_id)) + if (g_once_init_enter_pointer (&define_type_id)) { static const GEnumValue values[] = { { TEST_ENUM_FOO, "TEST_ENUM_FOO", "foo" }, @@ -1176,7 +1176,7 @@ test_enum_get_type (void) }; GType type_id = g_enum_register_static ("TestEnum", values); - g_once_init_leave (&define_type_id, type_id); + g_once_init_leave_pointer (&define_type_id, type_id); } return define_type_id; @@ -1185,9 +1185,9 @@ test_enum_get_type (void) static GType test_flags_get_type (void) { - static gsize define_type_id = 0; + static GType define_type_id = 0; - if (g_once_init_enter (&define_type_id)) + if (g_once_init_enter_pointer (&define_type_id)) { static const GFlagsValue values[] = { { TEST_FLAGS_NONE, "TEST_FLAGS_NONE", "none" }, @@ -1198,7 +1198,7 @@ test_flags_get_type (void) }; GType type_id = g_flags_register_static ("TestFlags", values); - g_once_init_leave (&define_type_id, type_id); + g_once_init_leave_pointer (&define_type_id, type_id); } return define_type_id; diff --git a/gio/tests/memory-monitor-dbus.py.in b/gio/tests/memory-monitor-dbus.py.in index bf32918..7aae01e 100755 --- a/gio/tests/memory-monitor-dbus.py.in +++ b/gio/tests/memory-monitor-dbus.py.in @@ -16,7 +16,6 @@ import sys import subprocess import fcntl import os -import time import taptestrunner @@ -57,53 +56,74 @@ try: fcntl.fcntl(self.p_mock.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK) self.last_warning = -1 self.dbusmock = dbus.Interface(self.obj_lmm, dbusmock.MOCK_IFACE) + + try: + self.wait_for_bus_object('org.freedesktop.LowMemoryMonitor', + '/org/freedesktop/LowMemoryMonitor', + system_bus=True) + except: + raise + self.memory_monitor = Gio.MemoryMonitor.dup_default() + assert("GMemoryMonitorDBus" in str(self.memory_monitor)) self.memory_monitor.connect("low-memory-warning", self.memory_warning_cb) self.mainloop = GLib.MainLoop() self.main_context = self.mainloop.get_context() + # The LowMemoryMonitor API is stateless: it doesn’t expose any + # properties, just a warning signal. Emit the signal in a loop until + # the GMemoryMonitor instance has initialised and synchronised to + # the right state. + def emit_warning(level): + self.dbusmock.EmitWarning(level) + return GLib.SOURCE_CONTINUE + + idle_id = GLib.idle_add(emit_warning, 0) + while self.last_warning != 0: + self.main_context.iteration(True) + GLib.source_remove(idle_id) + def tearDown(self): self.p_mock.terminate() self.p_mock.wait() - def assertEventually(self, condition, message=None, timeout=50): + def assertEventually(self, condition, message=None, timeout=5): '''Assert that condition function eventually returns True. - Timeout is in deciseconds, defaulting to 50 (5 seconds). message is + Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. ''' - while timeout >= 0: - context = GLib.MainContext.default() - while context.iteration(False): - pass - if condition(): - break - timeout -= 1 - time.sleep(0.1) - else: - self.fail(message or 'timed out waiting for ' + str(condition)) + if not message: + message = 'timed out waiting for ' + str(condition) + + def timed_out_cb(message): + self.fail(message) + return GLib.SOURCE_REMOVE + + timeout_source = GLib.timeout_source_new_seconds(timeout) + timeout_source.set_callback(timed_out_cb, message) + timeout_source.attach(self.main_context) + + while not condition(): + self.main_context.iteration(True) + + timeout_source.destroy() def memory_warning_cb(self, monitor, level): + print("Received memory warning signal, level", level) self.last_warning = level self.main_context.wakeup() def test_low_memory_warning_signal(self): '''LowMemoryWarning signal''' - # Wait 2 seconds - timeout = 2 - while timeout > 0: - time.sleep(0.5) - timeout -= 0.5 - self.main_context.iteration(False) - self.dbusmock.EmitWarning(100) # Wait 2 seconds or until warning - self.assertEventually(lambda: self.last_warning == 100, "'100' low-memory warning not received", 20) + self.assertEventually(lambda: self.last_warning == 100, "'100' low-memory warning not received", 2) self.dbusmock.EmitWarning(255) # Wait 2 seconds or until warning - self.assertEventually(lambda: self.last_warning == 255, "'255' low-memory warning not received", 20) + self.assertEventually(lambda: self.last_warning == 255, "'255' low-memory warning not received", 2) except ImportError as e: @unittest.skip("Cannot import %s" % e.name) diff --git a/gio/tests/memory-monitor-portal.py.in b/gio/tests/memory-monitor-portal.py.in index 748cee8..5bcc830 100755 --- a/gio/tests/memory-monitor-portal.py.in +++ b/gio/tests/memory-monitor-portal.py.in @@ -16,7 +16,6 @@ import sys import subprocess import fcntl import os -import time import taptestrunner @@ -73,33 +72,51 @@ try: raise # subprocess.Popen(['gdbus', 'monitor', '--session', '--dest', 'org.freedesktop.portal.Desktop']) - os.environ['GTK_USE_PORTAL'] = "1" + os.environ['GIO_USE_PORTALS'] = "1" self.memory_monitor = Gio.MemoryMonitor.dup_default() assert("GMemoryMonitorPortal" in str(self.memory_monitor)) self.memory_monitor.connect("low-memory-warning", self.portal_memory_warning_cb) self.mainloop = GLib.MainLoop() self.main_context = self.mainloop.get_context() + # The LowMemoryMonitor API is stateless: it doesn’t expose any + # properties, just a warning signal. Emit the signal in a loop until + # the GMemoryMonitor instance has initialised and synchronised to + # the right state. + def emit_warning(level): + self.dbusmock.EmitWarning(level) + return GLib.SOURCE_CONTINUE + + idle_id = GLib.idle_add(emit_warning, 0) + while self.last_warning != 0: + self.main_context.iteration(True) + GLib.source_remove(idle_id) + def tearDown(self): self.p_mock.terminate() self.p_mock.wait() - def assertEventually(self, condition, message=None, timeout=50): + def assertEventually(self, condition, message=None, timeout=5): '''Assert that condition function eventually returns True. - Timeout is in deciseconds, defaulting to 50 (5 seconds). message is + Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. ''' - while timeout >= 0: - context = GLib.MainContext.default() - while context.iteration(False): - pass - if condition(): - break - timeout -= 1 - time.sleep(0.1) - else: - self.fail(message or 'timed out waiting for ' + str(condition)) + if not message: + message = 'timed out waiting for ' + str(condition) + + def timed_out_cb(message): + self.fail(message) + return GLib.SOURCE_REMOVE + + timeout_source = GLib.timeout_source_new_seconds(timeout) + timeout_source.set_callback(timed_out_cb, message) + timeout_source.attach(self.main_context) + + while not condition(): + self.main_context.iteration(True) + + timeout_source.destroy() def portal_memory_warning_cb(self, monitor, level): self.last_warning = level @@ -108,20 +125,13 @@ try: def test_low_memory_warning_portal_signal(self): '''LowMemoryWarning signal''' - # Wait 2 seconds - timeout = 2 - while timeout > 0: - time.sleep(0.5) - timeout -= 0.5 - self.main_context.iteration(False) - self.dbusmock.EmitWarning(100) # Wait 2 seconds or until warning - self.assertEventually(lambda: self.last_warning == 100, "'100' low-memory warning not received", 20) + self.assertEventually(lambda: self.last_warning == 100, "'100' low-memory warning not received", 2) self.dbusmock.EmitWarning(255) # Wait 2 seconds or until warning - self.assertEventually(lambda: self.last_warning == 255, "'255' low-memory warning not received", 20) + self.assertEventually(lambda: self.last_warning == 255, "'255' low-memory warning not received", 2) except ImportError as e: @unittest.skip("Cannot import %s" % e.name) diff --git a/gio/tests/meson.build b/gio/tests/meson.build index 4ef3343..232ecca 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -51,7 +51,8 @@ gio_tests = { 'application-command-line': {}, 'appmonitor' : { # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 - 'can_fail' : host_system == 'darwin', + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system in ['darwin', 'gnu'], }, 'async-close-output-stream' : {}, 'async-splice-output-stream' : {}, @@ -63,7 +64,12 @@ gio_tests = { # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 / https://gitlab.gnome.org/GNOME/glib/-/issues/1251 'can_fail' : host_system == 'darwin', }, - 'converter-stream' : {}, + 'converter-stream' : { + # musl: charset tests fail due to missing collation support in musl libc + # From https://wiki.musl-libc.org/roadmap#Open_future_goals + # "LC_COLLATE support for collation orders other than simple codepoint order" + 'can_fail' : linux_libc == 'musl', + }, 'credentials' : {}, 'data-input-stream' : {}, 'data-output-stream' : {}, @@ -81,7 +87,8 @@ gio_tests = { 'g-file' : {}, 'g-file-info' : { # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3070 - 'can_fail' : host_system == 'darwin' or host_system == 'windows' and cc.get_id() != 'gcc', + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system in ['darwin', 'gnu'] or host_system == 'windows' and cc.get_id() != 'gcc', }, 'g-icon' : {}, 'gdbus-addresses' : {}, @@ -90,7 +97,8 @@ gio_tests = { 'dependencies' : [libgdbus_example_objectmanager_dep], 'install_rpath' : installed_tests_execdir, # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 - 'can_fail' : host_system in ['darwin', 'windows'], + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system in ['darwin', 'windows', 'gnu'], }, 'inet-address' : {}, 'io-stream' : {}, @@ -118,7 +126,8 @@ gio_tests = { 'sleepy-stream' : {}, 'socket' : { # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 - 'can_fail' : host_system == 'darwin', + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system in ['darwin', 'gnu'], }, 'socket-listener' : {}, 'socket-service' : {}, @@ -137,7 +146,8 @@ gio_tests = { 'gdbus-address-get-session' : { 'extra_programs': host_system != 'windows' ? ['dbus-launch'] : [], # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 - 'can_fail' : host_system == 'darwin', + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system in ['darwin', 'gnu'], }, 'win32-appinfo' : {}, } @@ -176,6 +186,10 @@ python_tests = { 'suite': ['gdbus-codegen', 'slow'], 'timeout': 90, }, + 'gio-tool.py' : { + 'depends' : gio_tool, + 'can_fail' : host_system == 'windows', + }, } test_env = environment() @@ -232,7 +246,10 @@ endif # Test programs buildable on UNIX only if host_machine.system() != 'windows' gio_tests += { - 'file' : {}, + 'file' : { + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', + }, 'gdbus-peer-object-manager' : {}, 'gdbus-sasl' : {}, 'live-g-file' : {}, @@ -277,7 +294,10 @@ if host_machine.system() != 'windows' }, 'resolver-parsing' : {'dependencies' : [network_libs]}, 'socket-address' : {}, - 'stream-rw_all' : {}, + 'stream-rw_all' : { + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', + }, 'unix-mounts' : {}, 'unix-streams' : {}, 'g-file-info-filesystem-readonly' : {}, @@ -324,6 +344,8 @@ if host_machine.system() != 'windows' 'install' : false, 'depends' : gio_launch_desktop, 'extra_programs' : ['apps', 'appinfo-test'], + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', }, } endif @@ -360,6 +382,7 @@ if host_machine.system() != 'windows' output : ['gdbus-test-codegen-generated.h', 'gdbus-test-codegen-generated.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-prefix', 'org.project.', '--output-directory', '@OUTDIR@', @@ -376,6 +399,7 @@ if host_machine.system() != 'windows' output : ['gdbus-test-codegen-generated-min-required-2-64.h', 'gdbus-test-codegen-generated-min-required-2-64.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--glib-min-required', '2.64', '--interface-prefix', 'org.project.', @@ -392,6 +416,7 @@ if host_machine.system() != 'windows' input : ['test-codegen.xml'], output : ['gdbus-test-codegen-generated-interface-info.h'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-info-header', annotate_args, @@ -401,6 +426,7 @@ if host_machine.system() != 'windows' input : ['test-codegen.xml'], output : ['gdbus-test-codegen-generated-interface-info.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-info-body', annotate_args, @@ -454,6 +480,8 @@ if host_machine.system() != 'windows' 'gdbus-proxy-threads' : { 'extra_sources' : extra_sources, 'dependencies' : [dbus1_dep], + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', }, 'gdbus-proxy-unique-name' : { 'extra_sources' : extra_sources, @@ -513,6 +541,7 @@ if host_machine.system() != 'windows' output : ['fake-document-portal-generated.h', 'fake-document-portal-generated.c'], depend_files : gdbus_codegen_built_files, + depends : gdbus_codegen_built_targets, command : [python, gdbus_codegen, '--interface-prefix', 'org.freedesktop.portal.', '--output-directory', '@OUTDIR@', @@ -556,6 +585,8 @@ if host_machine.system() != 'windows' '-DTEST_LOCALE_PATH="@0@"'.format(test_mo_dir)], 'install' : false, 'depends' : glib_compile_schemas, + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', }, } endif @@ -793,8 +824,12 @@ if not meson.is_cross_build() output : ['gresource-big-test.txt'], command : [python, '@INPUT0@', '@OUTPUT@']) + # referenced by test.gresource.xml + test_generated_txt = fs.copyfile('test1.txt', 'test-generated.txt') + test_gresource = custom_target('test.gresource', input : 'test.gresource.xml', + depends : test_generated_txt, output : 'test.gresource', command : [glib_compile_resources, compiler_type, @@ -872,12 +907,6 @@ if not meson.is_cross_build() '--manual-register', '@INPUT@']) - # referenced by test.gresource.xml - test_generated_txt = configure_file(input : 'test1.txt', - output : 'test-generated.txt', - copy : true, - ) - resources_extra_sources = [ test_gresource, test_resources_c, @@ -905,7 +934,19 @@ if not meson.is_cross_build() ld = find_program('ld', required : false) - if build_machine.system() == 'linux' and objcopy.found() and objcopy_supports_add_symbol and ld.found() + if build_machine.system() != 'linux' + why_no_external_data = 'only works on Linux' + elif not objcopy.found() + why_no_external_data = 'objcopy not found' + elif not objcopy_supports_add_symbol + why_no_external_data = 'objcopy does not support --add-symbol' + elif not ld.found() + why_no_external_data = 'ld not found' + elif build_machine.cpu_family() in ['mips', 'mips64'] + why_no_external_data = 'cc -r can produce a mismatched MIPS ABI family, see GNOME/glib!3640' + else + why_no_external_data = '' + test_gresource_binary = custom_target('test5.gresource', input : 'test5.gresource.xml', output : 'test5.gresource', @@ -963,10 +1004,19 @@ if not meson.is_cross_build() ] endif + resources_c_args = [] + + if why_no_external_data != '' + resources_c_args += '-DNO_EXTERNAL_DATA="@0@"'.format(why_no_external_data) + endif + gio_tests += { 'resources' : { + 'c_args' : resources_c_args, 'extra_sources' : resources_extra_sources, 'depends' : resource_plugin, + # FIXME: musl: https://gitlab.gnome.org/GNOME/glib/-/issues/3160 + 'can_fail' : linux_libc == 'musl', }, } endif @@ -1057,6 +1107,7 @@ endforeach foreach test_name, extra_args : python_tests depends = [extra_args.get('depends', [])] suite = ['gio', 'no-valgrind'] + extra_args.get('suite', []) + timeout = extra_args.get('timeout', test_timeout) if extra_args.get('can_fail', false) suite += 'failing' @@ -1073,7 +1124,7 @@ foreach test_name, extra_args : python_tests depends: depends, args: ['-B', files(test_name)], env: test_env, - timeout: extra_args.get('timeout'), + timeout: timeout, suite: suite, ) diff --git a/gio/tests/portal-support-env-var.c b/gio/tests/portal-support-env-var.c index b1d3fd3..50982bd 100644 --- a/gio/tests/portal-support-env-var.c +++ b/gio/tests/portal-support-env-var.c @@ -37,7 +37,7 @@ main (int argc, char **argv) { g_test_init (&argc, &argv, NULL); - g_setenv ("GTK_USE_PORTAL", "1", TRUE); + g_setenv ("GIO_USE_PORTALS", "1", TRUE); g_test_add_func ("/portal-support/env-var", test_portal_support_env_var); diff --git a/gio/tests/power-profile-monitor-dbus.py.in b/gio/tests/power-profile-monitor-dbus.py.in index 06e594f..f955afc 100755 --- a/gio/tests/power-profile-monitor-dbus.py.in +++ b/gio/tests/power-profile-monitor-dbus.py.in @@ -16,7 +16,6 @@ import sys import subprocess import fcntl import os -import time import taptestrunner @@ -58,6 +57,7 @@ try: self.power_saver_enabled = False self.dbus_props = dbus.Interface(self.obj_ppd, dbus.PROPERTIES_IFACE) self.power_profile_monitor = Gio.PowerProfileMonitor.dup_default() + assert("GPowerProfileMonitorDBus" in str(self.power_profile_monitor)) self.power_profile_monitor.connect("notify::power-saver-enabled", self.power_saver_enabled_cb) self.mainloop = GLib.MainLoop() self.main_context = self.mainloop.get_context() @@ -66,22 +66,27 @@ try: self.p_mock.terminate() self.p_mock.wait() - def assertEventually(self, condition, message=None, timeout=50): + def assertEventually(self, condition, message=None, timeout=5): '''Assert that condition function eventually returns True. - Timeout is in deciseconds, defaulting to 50 (5 seconds). message is + Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. ''' - while timeout >= 0: - context = GLib.MainContext.default() - while context.iteration(False): - pass - if condition(): - break - timeout -= 1 - time.sleep(0.1) - else: - self.fail(message or 'timed out waiting for ' + str(condition)) + if not message: + message = 'timed out waiting for ' + str(condition) + + def timed_out_cb(message): + self.fail(message) + return GLib.SOURCE_REMOVE + + timeout_source = GLib.timeout_source_new_seconds(timeout) + timeout_source.set_callback(timed_out_cb, message) + timeout_source.attach(self.main_context) + + while not condition(): + self.main_context.iteration(True) + + timeout_source.destroy() def power_saver_enabled_cb(self, spec, data): self.power_saver_enabled = self.power_profile_monitor.get_power_saver_enabled() @@ -92,10 +97,10 @@ try: self.assertEqual(self.power_profile_monitor.get_power_saver_enabled(), False) self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('power-saver', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 10) + self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 1) self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('balanced', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 10) + self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 1) except ImportError as e: @unittest.skip("Cannot import %s" % e.name) diff --git a/gio/tests/power-profile-monitor-portal.py.in b/gio/tests/power-profile-monitor-portal.py.in index 09e9a45..3bb0baf 100755 --- a/gio/tests/power-profile-monitor-portal.py.in +++ b/gio/tests/power-profile-monitor-portal.py.in @@ -16,7 +16,6 @@ import sys import subprocess import fcntl import os -import time import taptestrunner @@ -79,7 +78,7 @@ try: raise # subprocess.Popen(['gdbus', 'monitor', '--session', '--dest', 'org.freedesktop.portal.Desktop']) - os.environ['GTK_USE_PORTAL'] = "1" + os.environ['GIO_USE_PORTALS'] = "1" self.power_profile_monitor = Gio.PowerProfileMonitor.dup_default() assert("GPowerProfileMonitorPortal" in str(self.power_profile_monitor)) self.power_profile_monitor.connect("notify::power-saver-enabled", self.power_saver_enabled_cb) @@ -90,22 +89,27 @@ try: self.p_mock.terminate() self.p_mock.wait() - def assertEventually(self, condition, message=None, timeout=50): + def assertEventually(self, condition, message=None, timeout=5): '''Assert that condition function eventually returns True. - Timeout is in deciseconds, defaulting to 50 (5 seconds). message is + Timeout is in seconds, defaulting to 5 seconds. message is printed on failure. ''' - while timeout >= 0: - context = GLib.MainContext.default() - while context.iteration(False): - pass - if condition(): - break - timeout -= 1 - time.sleep(0.1) - else: - self.fail(message or 'timed out waiting for ' + str(condition)) + if not message: + message = 'timed out waiting for ' + str(condition) + + def timed_out_cb(message): + self.fail(message) + return GLib.SOURCE_REMOVE + + timeout_source = GLib.timeout_source_new_seconds(timeout) + timeout_source.set_callback(timed_out_cb, message) + timeout_source.attach(self.main_context) + + while not condition(): + self.main_context.iteration(True) + + timeout_source.destroy() def power_saver_enabled_cb(self, spec, data): self.power_saver_enabled = self.power_profile_monitor.get_power_saver_enabled() @@ -116,10 +120,10 @@ try: self.assertEqual(self.power_profile_monitor.get_power_saver_enabled(), False) self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('power-saver', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 10) + self.assertEventually(lambda: self.power_saver_enabled == True, "power-saver didn't become enabled", 1) self.dbus_props.Set('net.hadess.PowerProfiles', 'ActiveProfile', dbus.String('balanced', variant_level=1)) - self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 10) + self.assertEventually(lambda: self.power_saver_enabled == False, "power-saver didn't become disabled", 1) def test_power_profile_power_saver_enabled_portal_default(self): '''power-saver-enabled property default value''' diff --git a/gio/tests/proxy-test.c b/gio/tests/proxy-test.c index e040c63..ca3f4b3 100644 --- a/gio/tests/proxy-test.c +++ b/gio/tests/proxy-test.c @@ -797,9 +797,9 @@ g_fake_resolver_lookup_by_name_async (GResolver *resolver, } else { - g_task_return_new_error (task, - G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, - "Not found"); + g_task_return_new_error_literal (task, + G_RESOLVER_ERROR, G_RESOLVER_ERROR_NOT_FOUND, + "Not found"); } g_object_unref (task); } diff --git a/gio/tests/resolver-parsing.c b/gio/tests/resolver-parsing.c index 105dc69..488446f 100644 --- a/gio/tests/resolver-parsing.c +++ b/gio/tests/resolver-parsing.c @@ -26,6 +26,7 @@ #define GIO_COMPILATION #include "gthreadedresolver.h" +#include "gthreadedresolver-private.h" #undef GIO_COMPILATION #ifdef HAVE_DN_COMP diff --git a/gio/tests/resources.c b/gio/tests/resources.c index f567914..f7dc039 100644 --- a/gio/tests/resources.c +++ b/gio/tests/resources.c @@ -642,10 +642,10 @@ test_resource_manual2 (void) static void test_resource_binary_linked (void) { - #ifndef __linux__ - g_test_skip ("--external-data test only works on Linux"); + #ifdef NO_EXTERNAL_DATA + g_test_skip ("--external-data cannot be tested: " NO_EXTERNAL_DATA); return; - #else /* if __linux__ */ + #else /* !NO_EXTERNAL_DATA */ GError *error = NULL; gboolean found; gsize size; @@ -669,7 +669,7 @@ test_resource_binary_linked (void) g_assert_cmpint (size, ==, 6); g_assert_cmpstr (g_bytes_get_data (data, NULL), ==, "test1\n"); g_bytes_unref (data); - #endif /* if __linux__ */ + #endif /* !NO_EXTERNAL_DATA */ } /* Test resource whose xml file starts with more than one digit diff --git a/gio/tests/socket.c b/gio/tests/socket.c index c1c1bcf..7408ebe 100644 --- a/gio/tests/socket.c +++ b/gio/tests/socket.c @@ -43,14 +43,25 @@ static gboolean ipv6_supported; typedef struct { - GSocket *server; - GSocket *client; + GSocket *server; /* (owned) (not nullable) */ + GSocket *client; /* (owned) (nullable) */ GSocketFamily family; - GThread *thread; - GMainLoop *loop; - GCancellable *cancellable; /* to shut down dgram echo server thread */ + GThread *thread; /* (owned) (not nullable) */ + GMainLoop *loop; /* (owned) (nullable) */ + GCancellable *cancellable; /* to shut down dgram echo server thread; (owned) (nullable) */ } IPTestData; +static void +ip_test_data_free (IPTestData *data) +{ + g_clear_object (&data->server); + g_clear_object (&data->client); + g_clear_pointer (&data->loop, g_main_loop_unref); + g_clear_object (&data->cancellable); + + g_slice_free (IPTestData, data); +} + static gpointer echo_server_dgram_thread (gpointer user_data) { @@ -130,7 +141,7 @@ create_server_full (GSocketFamily family, GSocketAddress *addr; GInetAddress *iaddr; - data = g_slice_new (IPTestData); + data = g_slice_new0 (IPTestData); data->family = family; data->server = server = g_socket_new (family, @@ -144,7 +155,7 @@ create_server_full (GSocketFamily family, g_assert_cmpint (g_socket_get_socket_type (server), ==, socket_type); g_assert_cmpint (g_socket_get_protocol (server), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (server))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (server))); #endif g_socket_set_blocking (server, TRUE); @@ -198,8 +209,7 @@ create_server_full (GSocketFamily family, return data; error: - g_clear_object (&data->server); - g_slice_free (IPTestData, data); + ip_test_data_free (data); return NULL; } @@ -310,7 +320,7 @@ test_ip_async_connected (GSocket *client, */ g_assert_cmpint (cond, ==, G_IO_OUT); - g_assert (g_socket_is_connected (client)); + g_assert_true (g_socket_is_connected (client)); /* This adds 1 second to "make check", so let's just only do it once. */ if (data->family == G_SOCKET_FAMILY_IPV4) @@ -396,7 +406,7 @@ test_ip_async (GSocketFamily family) data->loop = g_main_loop_new (NULL, TRUE); g_main_loop_run (data->loop); - g_main_loop_unref (data->loop); + g_clear_pointer (&data->loop, g_main_loop_unref); g_socket_shutdown (client, FALSE, TRUE, &error); g_assert_no_error (error); @@ -426,10 +436,7 @@ test_ip_async (GSocketFamily family) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); - g_object_unref (client); - - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static void @@ -483,14 +490,14 @@ test_ip_sync (GSocketFamily family) g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_STREAM); g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); #endif g_socket_set_blocking (client, TRUE); g_socket_set_timeout (client, 1); g_socket_connect (client, addr, NULL, &error); g_assert_no_error (error); - g_assert (g_socket_is_connected (client)); + g_assert_true (g_socket_is_connected (client)); g_object_unref (addr); /* This adds 1 second to "make check", so let's just only do it once. */ @@ -567,10 +574,9 @@ test_ip_sync (GSocketFamily family) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); g_object_unref (client); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static void @@ -611,6 +617,7 @@ test_ip_sync_dgram (GSocketFamily family) } dest_addr = g_socket_get_local_address (data->server, &error); + g_assert_no_error (error); client = g_socket_new (family, G_SOCKET_TYPE_DATAGRAM, @@ -622,7 +629,7 @@ test_ip_sync_dgram (GSocketFamily family) g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_DATAGRAM); g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); #endif g_socket_set_blocking (client, TRUE); @@ -711,7 +718,7 @@ test_ip_sync_dgram (GSocketFamily family) g_assert_no_error (error); /* v[0].size + v[1].size + v[2].size + v[3].size + v[4].size + v[5].size */ g_assert_cmpint (len, ==, 17); - g_assert (memcmp (testbuf2, buf, 17) == 0); + g_assert_cmpmem (testbuf2, 17, buf, 17); memset (buf, 0, sizeof (buf)); len = g_socket_receive_from (client, NULL, buf, sizeof (buf), NULL, &error); @@ -777,7 +784,7 @@ test_ip_sync_dgram (GSocketFamily family) len = g_socket_send_messages (client, m, G_N_ELEMENTS (m), 0, NULL, &error); /* This error code may vary between platforms and over time; it is not guaranteed API: */ #ifndef G_OS_WIN32 - g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_DESTINATION_UNSET); #else g_assert_error (error, G_IO_ERROR, G_IO_ERROR_NOT_CONNECTED); #endif @@ -801,12 +808,10 @@ test_ip_sync_dgram (GSocketFamily family) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); - g_object_unref (data->cancellable); g_object_unref (client); g_object_unref (dest_addr); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static void @@ -862,7 +867,7 @@ test_ip_sync_dgram_timeouts (GSocketFamily family) g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_DATAGRAM); g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); #endif #ifdef G_OS_WIN32 @@ -1007,7 +1012,7 @@ test_close_graceful (void) g_assert_cmpint (g_socket_get_socket_type (client), ==, G_SOCKET_TYPE_STREAM); g_assert_cmpint (g_socket_get_protocol (client), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); #endif g_socket_set_blocking (client, TRUE); @@ -1015,7 +1020,7 @@ test_close_graceful (void) g_socket_connect (client, addr, NULL, &error); g_assert_no_error (error); - g_assert (g_socket_is_connected (client)); + g_assert_true (g_socket_is_connected (client)); g_object_unref (addr); server = g_thread_join (data->thread); @@ -1046,10 +1051,9 @@ test_close_graceful (void) g_assert_no_error (error); g_object_unref (server); - g_object_unref (data->server); g_object_unref (client); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } #if defined (IPPROTO_IPV6) && defined (IPV6_V6ONLY) @@ -1123,7 +1127,7 @@ test_ipv6_v4mapped (void) g_socket_connect (client, v4addr, NULL, &error); g_assert_no_error (error); - g_assert (g_socket_is_connected (client)); + g_assert_true (g_socket_is_connected (client)); g_thread_join (data->thread); @@ -1132,11 +1136,10 @@ test_ipv6_v4mapped (void) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); g_object_unref (client); g_object_unref (v4addr); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } #endif @@ -1198,10 +1201,9 @@ test_timed_wait (void) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); g_object_unref (client); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static int @@ -1265,7 +1267,7 @@ test_fd_reuse (void) g_socket_connect (client, addr, NULL, &error); g_assert_no_error (error); - g_assert (g_socket_is_connected (client)); + g_assert_true (g_socket_is_connected (client)); g_object_unref (addr); /* we have to dup otherwise the fd gets closed twice on unref */ @@ -1277,7 +1279,7 @@ test_fd_reuse (void) g_assert_cmpint (g_socket_get_socket_type (client2), ==, g_socket_get_socket_type (client)); g_assert_cmpint (g_socket_get_protocol (client2), ==, G_SOCKET_PROTOCOL_TCP); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (client))); #endif len = g_socket_send (client2, testbuf, strlen (testbuf) + 1, NULL, &error); @@ -1310,11 +1312,10 @@ test_fd_reuse (void) g_assert_cmpint (g_socket_get_fd (client2), ==, -1); g_assert_cmpint (g_socket_get_fd (data->server), ==, -1); - g_object_unref (data->server); g_object_unref (client); g_object_unref (client2); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static void @@ -1334,12 +1335,12 @@ test_sockaddr (void) sin6.sin6_flowinfo = 1729; saddr = g_socket_address_new_from_native (&sin6, sizeof (sin6)); - g_assert (G_IS_INET_SOCKET_ADDRESS (saddr)); + g_assert_true (G_IS_INET_SOCKET_ADDRESS (saddr)); isaddr = G_INET_SOCKET_ADDRESS (saddr); iaddr = g_inet_socket_address_get_address (isaddr); g_assert_cmpint (g_inet_address_get_family (iaddr), ==, G_SOCKET_FAMILY_IPV6); - g_assert (g_inet_address_get_is_loopback (iaddr)); + g_assert_true (g_inet_address_get_is_loopback (iaddr)); g_assert_cmpint (g_inet_socket_address_get_port (isaddr), ==, 42); g_assert_cmpint (g_inet_socket_address_get_scope_id (isaddr), ==, 17); @@ -1348,7 +1349,7 @@ test_sockaddr (void) g_socket_address_to_native (saddr, &gsin6, sizeof (gsin6), &error); g_assert_no_error (error); - g_assert (memcmp (&sin6.sin6_addr, &gsin6.sin6_addr, sizeof (struct in6_addr)) == 0); + g_assert_cmpmem (&sin6.sin6_addr, sizeof (struct in6_addr), &gsin6.sin6_addr, sizeof (struct in6_addr)); g_assert_cmpint (sin6.sin6_port, ==, gsin6.sin6_port); g_assert_cmpint (sin6.sin6_scope_id, ==, gsin6.sin6_scope_id); g_assert_cmpint (sin6.sin6_flowinfo, ==, gsin6.sin6_flowinfo); @@ -1399,7 +1400,7 @@ test_unix_from_fd (void) g_assert_cmpint (g_socket_get_socket_type (s), ==, G_SOCKET_TYPE_STREAM); g_assert_cmpint (g_socket_get_protocol (s), ==, G_SOCKET_PROTOCOL_DEFAULT); #ifdef G_OS_WIN32 - g_assert (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (s))); + g_assert_true (GLIB_PRIVATE_CALL (g_win32_handle_is_socket) ((HANDLE)(gintptr) g_socket_get_fd (s))); #endif g_object_unref (s); } @@ -1428,7 +1429,7 @@ test_unix_connection (void) s = g_socket_new_from_fd (fd, &error); g_assert_no_error (error); c = g_socket_connection_factory_create_connection (s); - g_assert (G_IS_UNIX_CONNECTION (c)); + g_assert_true (G_IS_UNIX_CONNECTION (c)); g_object_unref (c); g_object_unref (s); } @@ -1443,9 +1444,9 @@ create_connection_for_fd (int fd) socket = g_socket_new_from_fd (fd, &err); g_assert_no_error (err); - g_assert (G_IS_SOCKET (socket)); + g_assert_true (G_IS_SOCKET (socket)); connection = g_socket_connection_factory_create_connection (socket); - g_assert (G_IS_UNIX_CONNECTION (connection)); + g_assert_true (G_IS_UNIX_CONNECTION (connection)); g_object_unref (socket); return connection; } @@ -1525,7 +1526,7 @@ test_unix_connection_ancillary_data (void) g_assert_cmpstr (buffer, ==, TEST_DATA); waitpid (pid, &status, 0); - g_assert (WIFEXITED (status)); + g_assert_true (WIFEXITED (status)); g_assert_cmpint (WEXITSTATUS (status), ==, 0); } @@ -1612,8 +1613,8 @@ test_source_postmortem (void) /* Test that, after a socket is closed, its source callback should be called * exactly once. */ g_main_context_iteration (context, FALSE); - g_assert (callback_visited); - g_assert (!g_main_context_pending (context)); + g_assert_true (callback_visited); + g_assert_false (g_main_context_pending (context)); g_main_context_unref (context); } @@ -1713,14 +1714,14 @@ test_get_available (gconstpointer user_data) G_SOCKET_PROTOCOL_DEFAULT, &err); g_assert_no_error (err); - g_assert (G_IS_SOCKET (listener)); + g_assert_true (G_IS_SOCKET (listener)); client = g_socket_new (G_SOCKET_FAMILY_IPV4, socket_type, G_SOCKET_PROTOCOL_DEFAULT, &err); g_assert_no_error (err); - g_assert (G_IS_SOCKET (client)); + g_assert_true (G_IS_SOCKET (client)); if (socket_type == G_SOCKET_TYPE_STREAM) { @@ -1918,14 +1919,14 @@ test_read_write (gconstpointer user_data) G_SOCKET_PROTOCOL_DEFAULT, &err); g_assert_no_error (err); - g_assert (G_IS_SOCKET (listener)); + g_assert_true (G_IS_SOCKET (listener)); client = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_STREAM, G_SOCKET_PROTOCOL_DEFAULT, &err); g_assert_no_error (err); - g_assert (G_IS_SOCKET (client)); + g_assert_true (G_IS_SOCKET (client)); addr = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4); saddr = g_inet_socket_address_new (addr, 0); @@ -2071,10 +2072,9 @@ test_credentials_tcp_client (void) g_socket_close (data->server, &error); g_assert_no_error (error); - g_object_unref (data->server); g_object_unref (client); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } static void @@ -2144,10 +2144,8 @@ beach: g_clear_object (&iaddr); g_clear_pointer (&data->thread, g_thread_join); - g_clear_object (&data->server); - g_clear_object (&data->client); - g_slice_free (IPTestData, data); + ip_test_data_free (data); } } @@ -2201,6 +2199,7 @@ _g_win32_socketpair (gint domain, SOCKET client = INVALID_SOCKET; SOCKET server = INVALID_SOCKET; gchar *path = NULL; + wchar_t *path_utf16 = NULL; int tmpfd, rv = -1; u_long arg, br; @@ -2230,7 +2229,11 @@ _g_win32_socketpair (gint domain, if (listener == INVALID_SOCKET) goto out; - if (DeleteFile (path) == 0) + path_utf16 = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + if (!path_utf16) + goto out; + + if (DeleteFile (path_utf16) == 0) { if (GetLastError () != ERROR_FILE_NOT_FOUND) goto out; @@ -2285,7 +2288,10 @@ _g_win32_socketpair (gint domain, if (server != INVALID_SOCKET) closesocket (server); - DeleteFile (path); + if (path_utf16) + DeleteFile (path_utf16); + + g_free (path_utf16); g_free (path); return rv; } @@ -2337,6 +2343,206 @@ test_credentials_unix_socketpair (void) } #endif +static void +test_receive_bytes (void) +{ + const GSocketFamily family = G_SOCKET_FAMILY_IPV4; + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *addr; + gssize len; + GBytes *bytes = NULL; + gint64 time_start; + GCancellable *cancellable = NULL; + + g_test_summary ("Test basic functionality of g_socket_receive_bytes()"); + + data = create_server (family, echo_server_thread, FALSE, &error); + if (error != NULL) + { + g_test_skip_printf ("Failed to create server: %s", error->message); + g_clear_error (&error); + return; + } + + addr = g_socket_get_local_address (data->server, &error); + g_assert_no_error (error); + + client = g_socket_new (family, + G_SOCKET_TYPE_STREAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 10); + + g_socket_connect (client, addr, NULL, &error); + g_assert_no_error (error); + g_object_unref (addr); + + /* Send something. */ + len = g_socket_send (client, "hello", strlen ("hello"), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen ("hello")); + + /* And receive it back again. */ + bytes = g_socket_receive_bytes (client, 5, -1, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (bytes); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 5); + g_assert_cmpmem (g_bytes_get_data (bytes, NULL), 5, "hello", 5); + g_bytes_unref (bytes); + + /* Try again with a receive buffer which is bigger than the sent bytes, to + * test sub-buffer handling. */ + len = g_socket_send (client, "hello", strlen ("hello"), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen ("hello")); + + /* And receive it back again. */ + bytes = g_socket_receive_bytes (client, 500, -1, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (bytes); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 5); + g_assert_cmpmem (g_bytes_get_data (bytes, NULL), 5, "hello", 5); + g_bytes_unref (bytes); + + /* Try receiving when there’s nothing to receive, with a timeout. This should + * be the per-operation timeout, not the socket’s overall timeout */ + time_start = g_get_real_time (); + bytes = g_socket_receive_bytes (client, 500, 10, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_assert_null (bytes); + g_assert_cmpint (g_get_real_time () - time_start, <, g_socket_get_timeout (client) * G_USEC_PER_SEC); + g_clear_error (&error); + + /* And try receiving when already cancelled. */ + cancellable = g_cancellable_new (); + g_cancellable_cancel (cancellable); + bytes = g_socket_receive_bytes (client, 500, -1, cancellable, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert_null (bytes); + g_clear_error (&error); + g_clear_object (&cancellable); + + /* Tidy up. */ + g_socket_close (client, &error); + g_assert_no_error (error); + + g_cancellable_cancel (data->cancellable); + g_thread_join (data->thread); + + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (client); + + ip_test_data_free (data); +} + +static void +test_receive_bytes_from (void) +{ + const GSocketFamily family = G_SOCKET_FAMILY_IPV4; + IPTestData *data; + GError *error = NULL; + GSocket *client; + GSocketAddress *dest_addr = NULL, *sender_addr = NULL; + gssize len; + GBytes *bytes = NULL; + gint64 time_start; + GCancellable *cancellable = NULL; + + g_test_summary ("Test basic functionality of g_socket_receive_bytes_from()"); + + data = create_server_full (family, G_SOCKET_TYPE_DATAGRAM, + echo_server_dgram_thread, FALSE, &error); + if (error != NULL) + { + g_test_skip_printf ("Failed to create server: %s", error->message); + g_clear_error (&error); + return; + } + + dest_addr = g_socket_get_local_address (data->server, &error); + g_assert_no_error (error); + + client = g_socket_new (family, + G_SOCKET_TYPE_DATAGRAM, + G_SOCKET_PROTOCOL_DEFAULT, + &error); + g_assert_no_error (error); + + g_socket_set_blocking (client, TRUE); + g_socket_set_timeout (client, 10); + + /* Send something. */ + len = g_socket_send_to (client, dest_addr, "hello", strlen ("hello"), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen ("hello")); + + /* And receive it back again. */ + bytes = g_socket_receive_bytes_from (client, &sender_addr, 5, -1, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (bytes); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 5); + g_assert_cmpmem (g_bytes_get_data (bytes, NULL), 5, "hello", 5); + g_assert_nonnull (sender_addr); + g_clear_object (&sender_addr); + g_bytes_unref (bytes); + + /* Try again with a receive buffer which is bigger than the sent bytes, to + * test sub-buffer handling. */ + len = g_socket_send_to (client, dest_addr, "hello", strlen ("hello"), NULL, &error); + g_assert_no_error (error); + g_assert_cmpint (len, ==, strlen ("hello")); + + /* And receive it back again. */ + bytes = g_socket_receive_bytes_from (client, NULL, 500, -1, NULL, &error); + g_assert_no_error (error); + g_assert_nonnull (bytes); + g_assert_cmpuint (g_bytes_get_size (bytes), ==, 5); + g_assert_cmpmem (g_bytes_get_data (bytes, NULL), 5, "hello", 5); + g_bytes_unref (bytes); + + /* Try receiving when there’s nothing to receive, with a timeout. This should + * be the per-operation timeout, not the socket’s overall timeout */ + time_start = g_get_real_time (); + bytes = g_socket_receive_bytes_from (client, &sender_addr, 500, 10, NULL, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_TIMED_OUT); + g_assert_null (bytes); + g_assert_null (sender_addr); + g_assert_cmpint (g_get_real_time () - time_start, <, g_socket_get_timeout (client) * G_USEC_PER_SEC); + g_clear_error (&error); + + /* And try receiving when already cancelled. */ + cancellable = g_cancellable_new (); + g_cancellable_cancel (cancellable); + bytes = g_socket_receive_bytes_from (client, &sender_addr, 500, -1, cancellable, &error); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); + g_assert_null (bytes); + g_assert_null (sender_addr); + g_clear_error (&error); + g_clear_object (&cancellable); + + /* Tidy up. */ + g_socket_close (client, &error); + g_assert_no_error (error); + + g_cancellable_cancel (data->cancellable); + g_thread_join (data->thread); + + g_socket_close (data->server, &error); + g_assert_no_error (error); + + g_object_unref (dest_addr); + g_object_unref (client); + + ip_test_data_free (data); +} + int main (int argc, char *argv[]) @@ -2403,6 +2609,8 @@ main (int argc, g_test_add_func ("/socket/credentials/tcp_server", test_credentials_tcp_server); g_test_add_func ("/socket/credentials/unix_socketpair", test_credentials_unix_socketpair); #endif + g_test_add_func ("/socket/receive_bytes", test_receive_bytes); + g_test_add_func ("/socket/receive_bytes_from", test_receive_bytes_from); return g_test_run(); } diff --git a/gio/tests/stream-rw_all.c b/gio/tests/stream-rw_all.c index 7d8ceb2..4d90355 100644 --- a/gio/tests/stream-rw_all.c +++ b/gio/tests/stream-rw_all.c @@ -44,7 +44,7 @@ static void wait_for_read (gboolean success, gsize read) { - g_assert (!got_read_done); + g_assert_false (got_read_done); expected_read_success = success; expected_read = read; @@ -76,7 +76,7 @@ static void wait_for_write (gboolean success, gsize written) { - g_assert (!got_write_done); + g_assert_false (got_write_done); expected_write_success = success; expected_written = written; @@ -110,7 +110,7 @@ test_write_all_async_memory (void) g_output_stream_write_all_async (ms, "0123456789", 10, 0, NULL, write_done, NULL); wait_for_write (FALSE, 0); - g_assert (!memcmp (b, "012345678901234567890123", 24)); + g_assert_cmpint (memcmp (b, "012345678901234567890123", 24), ==, 0); g_object_unref (ms); } @@ -126,16 +126,16 @@ test_read_all_async_memory (void) g_input_stream_read_all_async (ms, buf, 10, 0, NULL, read_done, NULL); wait_for_read (TRUE, 10); - g_assert (!memcmp (buf, "0123456789", 10)); + g_assert_cmpint (memcmp (buf, "0123456789", 10), ==, 0); g_input_stream_read_all_async (ms, buf, 10, 0, NULL, read_done, NULL); wait_for_read (TRUE, 10); - g_assert (!memcmp (buf, "ABCDEFGHIJ", 10)); + g_assert_cmpint (memcmp (buf, "ABCDEFGHIJ", 10), ==, 0); /* partial read... */ g_input_stream_read_all_async (ms, buf, 10, 0, NULL, read_done, NULL); wait_for_read (TRUE, 4); - g_assert (!memcmp (buf, "!@#$", 4)); + g_assert_cmpint (memcmp (buf, "!@#$", 4), ==, 0); /* EOF */ g_input_stream_read_all_async (ms, buf, 10, 0, NULL, read_done, NULL); @@ -146,6 +146,7 @@ test_read_all_async_memory (void) #ifdef G_OS_UNIX #include +#include #include #include #include @@ -165,13 +166,12 @@ test_read_write_all_async_pipe (void) { gint sv[2]; - gint s; - s = socketpair (AF_UNIX, SOCK_STREAM, 0, sv); - g_assert (s == 0); + g_unix_open_pipe (sv, O_CLOEXEC | O_NONBLOCK, &error); + g_assert_no_error (error); - out = g_unix_output_stream_new (sv[0], TRUE); - in = g_unix_input_stream_new (sv[1], TRUE); + out = g_unix_output_stream_new (sv[1], TRUE); + in = g_unix_input_stream_new (sv[0], TRUE); } /* Try to fill up the buffer */ @@ -180,7 +180,7 @@ test_read_write_all_async_pipe (void) { s = g_output_stream_write (out, wbuf, sizeof wbuf, NULL, &error); g_assert_no_error (error); - g_assert (s > 0); + g_assert_cmpint (s, >, 0); in_flight += s; } @@ -189,7 +189,7 @@ test_read_write_all_async_pipe (void) g_output_stream_write_all_async (out, "0123456789", 10, 0, cancellable, write_done, NULL); while (g_main_context_iteration (NULL, FALSE)) ; - g_assert (!got_write_done); + g_assert_false (got_write_done); /* Cancel that to make sure it works */ g_cancellable_cancel (cancellable); @@ -200,7 +200,7 @@ test_read_write_all_async_pipe (void) g_output_stream_write_all_async (out, "0123456789", 10, 0, NULL, write_done, NULL); while (g_main_context_iteration (NULL, FALSE)) ; - g_assert (!got_write_done); + g_assert_false (got_write_done); /* Now drain as much as we originally put in the buffer to make it * block -- this will unblock the writer. @@ -209,7 +209,7 @@ test_read_write_all_async_pipe (void) { s = g_input_stream_read (in, rbuf, MIN (sizeof wbuf, in_flight), NULL, &error); g_assert_no_error (error); - g_assert (s > 0); + g_assert_cmpint (s, >, 0); in_flight -= s; } @@ -221,7 +221,7 @@ test_read_write_all_async_pipe (void) /* The write is surely finished by now */ wait_for_write (TRUE, 10); /* ...but the read will not yet be satisfied */ - g_assert (!got_read_done); + g_assert_false (got_read_done); /* Feed the read more than it asked for; this really should not block * since the buffer is so small... diff --git a/gio/tests/task.c b/gio/tests/task.c index 8dfc0e9..a7f2312 100644 --- a/gio/tests/task.c +++ b/gio/tests/task.c @@ -129,12 +129,19 @@ test_basic (void) /* test_error */ +typedef struct { + GQuark expected_domain; + int expected_code; + char *expected_message; + gssize int_result; +} TaskErrorResult; + static void error_callback (GObject *object, GAsyncResult *result, gpointer user_data) { - gssize *result_out = user_data; + TaskErrorResult *result_inout = user_data; GError *error = NULL; g_assert (object == NULL); @@ -143,13 +150,12 @@ error_callback (GObject *object, g_assert (g_task_had_error (G_TASK (result))); g_assert_false (g_task_get_completed (G_TASK (result))); - *result_out = g_task_propagate_int (G_TASK (result), &error); - g_assert_error (error, G_IO_ERROR, G_IO_ERROR_FAILED); + result_inout->int_result = g_task_propagate_int (G_TASK (result), &error); + g_assert_error (error, result_inout->expected_domain, result_inout->expected_code); + g_assert_cmpstr (error->message, ==, result_inout->expected_message); g_error_free (error); g_assert (g_task_had_error (G_TASK (result))); - - g_main_loop_quit (loop); } static gboolean @@ -159,7 +165,7 @@ error_return (gpointer user_data) g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, - "Failed"); + "Failed %p", task); g_object_unref (task); return FALSE; @@ -177,15 +183,17 @@ static void test_error (void) { GTask *task; - gssize result; + TaskErrorResult result; gboolean first_task_data_destroyed = FALSE; gboolean second_task_data_destroyed = FALSE; - gboolean notification_emitted = FALSE; task = g_task_new (NULL, NULL, error_callback, &result); + result = (TaskErrorResult){ + .expected_domain = G_IO_ERROR, + .expected_code = G_IO_ERROR_FAILED, + .expected_message = g_strdup_printf ("Failed %p", task), + }; g_object_add_weak_pointer (G_OBJECT (task), (gpointer *)&task); - g_signal_connect (task, "notify::completed", - (GCallback) completed_cb, ¬ification_emitted); g_assert (first_task_data_destroyed == FALSE); g_task_set_task_data (task, &first_task_data_destroyed, error_destroy_notify); @@ -197,12 +205,59 @@ test_error (void) g_assert (second_task_data_destroyed == FALSE); g_idle_add (error_return, task); - g_main_loop_run (loop); + wait_for_completed_notification (task); - g_assert_cmpint (result, ==, -1); + g_assert_cmpint (result.int_result, ==, -1); g_assert (second_task_data_destroyed == TRUE); - g_assert_true (notification_emitted); g_assert (task == NULL); + g_free (result.expected_message); +} + +static void +test_error_literal (void) +{ + GTask *task; + TaskErrorResult result; + + task = g_task_new (NULL, NULL, error_callback, &result); + result = (TaskErrorResult){ + .expected_domain = G_IO_ERROR, + .expected_code = G_IO_ERROR_FAILED, + .expected_message = "Literal Failure", + }; + + g_task_return_new_error_literal (task, + result.expected_domain, + result.expected_code, + "Literal Failure"); + + wait_for_completed_notification (task); + g_assert_cmpint (result.int_result, ==, -1); + + g_assert_finalize_object (task); +} + +static void +test_error_literal_from_variable (void) +{ + GTask *task; + TaskErrorResult result; + + task = g_task_new (NULL, NULL, error_callback, &result); + result = (TaskErrorResult){ + .expected_domain = G_IO_ERROR, + .expected_code = G_IO_ERROR_FAILED, + .expected_message = "Literal Failure", + }; + + g_task_return_new_error_literal (task, + result.expected_domain, + result.expected_code, + result.expected_message); + + wait_for_completed_notification (task); + g_assert_cmpint (result.int_result, ==, -1); + g_assert_finalize_object (task); } /* test_return_from_same_iteration: calling g_task_return_* from the @@ -2112,6 +2167,28 @@ test_return_value (void) g_assert_null (object); } +static void +test_return_prefixed_error (void) +{ + GTask *task; + GError *original_error = NULL; + GError *error = NULL; + + g_set_error (&original_error, G_IO_ERROR, G_IO_ERROR_UNKNOWN, "oh no!"); + + task = g_task_new (NULL, NULL, NULL, NULL); + g_task_return_prefixed_error (task, original_error, "task %s: ", "failed"); + + wait_for_completed_notification (task); + + g_assert_null (g_task_propagate_pointer (task, &error)); + g_assert_error (error, G_IO_ERROR, G_IO_ERROR_UNKNOWN); + g_assert_cmpstr (error->message, ==, "task failed: oh no!"); + + g_assert_finalize_object (task); + g_clear_error (&error); +} + /* test_object_keepalive: GTask takes a ref on its source object */ static GObject *keepalive_object; @@ -2502,6 +2579,8 @@ main (int argc, char **argv) g_test_add_func ("/gtask/basic", test_basic); g_test_add_func ("/gtask/error", test_error); + g_test_add_func ("/gtask/error-literal", test_error_literal); + g_test_add_func ("/gtask/error-literal-from-variable", test_error_literal_from_variable); g_test_add_func ("/gtask/return-from-same-iteration", test_return_from_same_iteration); g_test_add_func ("/gtask/return-from-toplevel", test_return_from_toplevel); g_test_add_func ("/gtask/return-from-anon-thread", test_return_from_anon_thread); @@ -2525,6 +2604,7 @@ main (int argc, char **argv) g_test_add_func ("/gtask/return-on-cancel-atomic", test_return_on_cancel_atomic); g_test_add_func ("/gtask/return-pointer", test_return_pointer); g_test_add_func ("/gtask/return-value", test_return_value); + g_test_add_func ("/gtask/return-prefixed-error", test_return_prefixed_error); g_test_add_func ("/gtask/object-keepalive", test_object_keepalive); g_test_add_func ("/gtask/legacy-error", test_legacy_error); g_test_add_func ("/gtask/return/in-idle/error-first", test_return_in_idle_error_first); diff --git a/gio/tests/tls-interaction.c b/gio/tests/tls-interaction.c index c0c58b5..a64181e 100644 --- a/gio/tests/tls-interaction.c +++ b/gio/tests/tls-interaction.c @@ -149,7 +149,7 @@ test_interaction_ask_password_async_failure (GTlsInteraction *interaction, task = g_task_new (self, cancellable, callback, user_data); - g_task_return_new_error (task, G_FILE_ERROR, G_FILE_ERROR_ACCES, "The message"); + g_task_return_new_error_literal (task, G_FILE_ERROR, G_FILE_ERROR_ACCES, "The message"); g_object_unref (task); } @@ -348,7 +348,7 @@ test_interaction_request_certificate_async_failure (GTlsInteraction *interact task = g_task_new (self, cancellable, callback, user_data); - g_task_return_new_error (task, G_FILE_ERROR, G_FILE_ERROR_NOENT, "Another message"); + g_task_return_new_error_literal (task, G_FILE_ERROR, G_FILE_ERROR_NOENT, "Another message"); g_object_unref (task); } diff --git a/gio/tests/win32-streams.c b/gio/tests/win32-streams.c index aea660d..222498a 100644 --- a/gio/tests/win32-streams.c +++ b/gio/tests/win32-streams.c @@ -340,17 +340,21 @@ test_pipe_io_overlap (void) PipeIOOverlapReader rs, rc; HANDLE server, client; gchar name[256]; + wchar_t *name_utf16; g_snprintf (name, sizeof (name), "\\\\.\\pipe\\gtest-io-overlap-%u", (guint) GetCurrentProcessId ()); - server = CreateNamedPipe (name, + name_utf16 = g_utf8_to_utf16 (name, -1, NULL, NULL, NULL); + g_assert_nonnull (name_utf16); + + server = CreateNamedPipe (name_utf16, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_READMODE_BYTE | PIPE_WAIT, 1, 0, 0, 0, NULL); g_assert (server != INVALID_HANDLE_VALUE); - client = CreateFile (name, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); + client = CreateFile (name_utf16, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); g_assert (client != INVALID_HANDLE_VALUE); out_server = g_win32_output_stream_new (server, TRUE); @@ -372,6 +376,8 @@ test_pipe_io_overlap (void) g_object_unref (rc.in); g_object_unref (out_server); g_object_unref (out_client); + + g_free (name_utf16); } static gpointer @@ -419,18 +425,22 @@ test_pipe_io_concurrent (void) PipeIOOverlapReader rc1, rc2; HANDLE server, client; gchar name[256], c; + wchar_t *name_utf16; g_snprintf (name, sizeof (name), "\\\\.\\pipe\\gtest-io-concurrent-%u", (guint) GetCurrentProcessId ()); - server = CreateNamedPipe (name, + name_utf16 = g_utf8_to_utf16 (name, -1, NULL, NULL, NULL); + g_assert_nonnull (name_utf16); + + server = CreateNamedPipe (name_utf16, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, PIPE_READMODE_BYTE | PIPE_WAIT, 1, 0, 0, 0, NULL); g_assert (server != INVALID_HANDLE_VALUE); g_assert (_pipe (writer_pipe, 10, _O_BINARY) == 0); - client = CreateFile (name, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + client = CreateFile (name_utf16, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); g_assert (client != INVALID_HANDLE_VALUE); rc1.in = g_win32_input_stream_new (client, TRUE); @@ -467,6 +477,8 @@ test_pipe_io_concurrent (void) close (writer_pipe[0]); close (writer_pipe[1]); + + g_free (name_utf16); } static void @@ -491,17 +503,21 @@ test_pipe_io_cancel (void) GOutputStream *out; HANDLE in_handle, out_handle; gchar name[256]; + wchar_t *name_utf16; g_snprintf (name, sizeof (name), "\\\\.\\pipe\\gtest-io-cancel-%u", (guint) GetCurrentProcessId ()); - in_handle = CreateNamedPipe (name, + name_utf16 = g_utf8_to_utf16 (name, -1, NULL, NULL, NULL); + g_assert_nonnull (name_utf16); + + in_handle = CreateNamedPipe (name_utf16, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED, PIPE_READMODE_BYTE | PIPE_WAIT, 1, 0, 0, 0, NULL); g_assert (in_handle != INVALID_HANDLE_VALUE); - out_handle = CreateFile (name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); + out_handle = CreateFile (name_utf16, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); g_assert (out_handle != INVALID_HANDLE_VALUE); in = g_win32_input_stream_new (in_handle, TRUE); @@ -521,6 +537,8 @@ test_pipe_io_cancel (void) g_object_unref (reader_cancel); g_object_unref (in); g_object_unref (out); + + g_free (name_utf16); } int diff --git a/gio/win32/gwinhttpfile.c b/gio/win32/gwinhttpfile.c index e73c876..605c284 100644 --- a/gio/win32/gwinhttpfile.c +++ b/gio/win32/gwinhttpfile.c @@ -477,6 +477,34 @@ g_winhttp_file_query_info (GFile *file, SYSTEMTIME last_modified; DWORD last_modified_len; + matcher = g_file_attribute_matcher_new (attributes); + info = g_file_info_new (); + g_file_info_set_attribute_mask (info, matcher); + + basename = g_winhttp_file_get_basename (file); + g_file_info_set_name (info, basename); + g_free (basename); + + if (_g_file_attribute_matcher_matches_id (matcher, + G_FILE_ATTRIBUTE_ID_STANDARD_DISPLAY_NAME)) + { + char *display_name = g_winhttp_file_get_display_name (file); + g_file_info_set_display_name (info, display_name); + g_free (display_name); + } + + if (_g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_STANDARD_TYPE)) + g_file_info_set_file_type (info, G_FILE_TYPE_REGULAR); + + if (!(_g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_STANDARD_SIZE) || + _g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_STANDARD_CONTENT_TYPE) || + _g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED) || + _g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED_NSEC) || + _g_file_attribute_matcher_matches_id (matcher, G_FILE_ATTRIBUTE_ID_TIME_MODIFIED_USEC))) + { + return info; + } + connection = G_WINHTTP_VFS_GET_CLASS (winhttp_file->vfs)->funcs->pWinHttpConnect (G_WINHTTP_VFS (winhttp_file->vfs)->session, winhttp_file->url.lpszHostName, @@ -521,22 +549,6 @@ g_winhttp_file_query_info (GFile *file, if (!_g_winhttp_response (winhttp_file->vfs, request, error, "HEAD request")) return NULL; - matcher = g_file_attribute_matcher_new (attributes); - info = g_file_info_new (); - g_file_info_set_attribute_mask (info, matcher); - - basename = g_winhttp_file_get_basename (file); - g_file_info_set_name (info, basename); - g_free (basename); - - if (_g_file_attribute_matcher_matches_id (matcher, - G_FILE_ATTRIBUTE_ID_STANDARD_DISPLAY_NAME)) - { - char *display_name = g_winhttp_file_get_display_name (file); - g_file_info_set_display_name (info, display_name); - g_free (display_name); - } - content_length = NULL; if (_g_winhttp_query_header (winhttp_file->vfs, request, diff --git a/girepository/cmph/README-CMPH-IMPORT.txt b/girepository/cmph/README-CMPH-IMPORT.txt new file mode 100644 index 0000000..a1c23c2 --- /dev/null +++ b/girepository/cmph/README-CMPH-IMPORT.txt @@ -0,0 +1,5 @@ +This import of CMPH was made from revision bfdcc3a3a18dfb9 of +git://cmph.git.sourceforge.net/gitroot/cmph/cmph + +Only the following files were taken, and everything else deleted: +COPYING src/*.[ch] diff --git a/girepository/cmph/bdz.c b/girepository/cmph/bdz.c new file mode 100644 index 0000000..e70f118 --- /dev/null +++ b/girepository/cmph/bdz.c @@ -0,0 +1,721 @@ +#include "bdz.h" +#include "cmph_structs.h" +#include "bdz_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include +//#define DEBUG +#include "debug.h" +#define UNASSIGNED 3U +#define NULL_EDGE 0xffffffff + +//cmph_uint32 ngrafos = 0; +//cmph_uint32 ngrafos_aciclicos = 0; +// table used for looking up the number of assigned vertices a 8-bit integer +const cmph_uint8 bdz_lookup_table[] = +{ +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +4, 4, 4, 3, 4, 4, 4, 3, 4, 4, 4, 3, 3, 3, 3, 2, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +3, 3, 3, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 1, +2, 2, 2, 1, 2, 2, 2, 1, 2, 2, 2, 1, 1, 1, 1, 0 +}; + +typedef struct +{ + cmph_uint32 vertices[3]; + cmph_uint32 next_edges[3]; +}bdz_edge_t; + +typedef cmph_uint32 * bdz_queue_t; + +static void bdz_alloc_queue(bdz_queue_t * queuep, cmph_uint32 nedges) +{ + (*queuep)=malloc(nedges*sizeof(cmph_uint32)); +}; +static void bdz_free_queue(bdz_queue_t * queue) +{ + free(*queue); +}; + +typedef struct +{ + cmph_uint32 nedges; + bdz_edge_t * edges; + cmph_uint32 * first_edge; + cmph_uint8 * vert_degree; +}bdz_graph3_t; + + +static void bdz_alloc_graph3(bdz_graph3_t * graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + graph3->edges=malloc(nedges*sizeof(bdz_edge_t)); + graph3->first_edge=malloc(nvertices*sizeof(cmph_uint32)); + graph3->vert_degree=malloc((size_t)nvertices); +}; +static void bdz_init_graph3(bdz_graph3_t * graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + memset(graph3->first_edge,0xff,nvertices*sizeof(cmph_uint32)); + memset(graph3->vert_degree,0,(size_t)nvertices); + graph3->nedges=0; +}; +static void bdz_free_graph3(bdz_graph3_t *graph3) +{ + free(graph3->edges); + free(graph3->first_edge); + free(graph3->vert_degree); +}; + +static void bdz_partial_free_graph3(bdz_graph3_t *graph3) +{ + free(graph3->first_edge); + free(graph3->vert_degree); + graph3->first_edge = NULL; + graph3->vert_degree = NULL; +}; + +static void bdz_add_edge(bdz_graph3_t * graph3, cmph_uint32 v0, cmph_uint32 v1, cmph_uint32 v2) +{ + graph3->edges[graph3->nedges].vertices[0]=v0; + graph3->edges[graph3->nedges].vertices[1]=v1; + graph3->edges[graph3->nedges].vertices[2]=v2; + graph3->edges[graph3->nedges].next_edges[0]=graph3->first_edge[v0]; + graph3->edges[graph3->nedges].next_edges[1]=graph3->first_edge[v1]; + graph3->edges[graph3->nedges].next_edges[2]=graph3->first_edge[v2]; + graph3->first_edge[v0]=graph3->first_edge[v1]=graph3->first_edge[v2]=graph3->nedges; + graph3->vert_degree[v0]++; + graph3->vert_degree[v1]++; + graph3->vert_degree[v2]++; + graph3->nedges++; +}; + +static void bdz_dump_graph(bdz_graph3_t* graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + cmph_uint32 i; + for(i=0;iedges[i].vertices[0], + graph3->edges[i].vertices[1],graph3->edges[i].vertices[2]); + printf(" nexts %d %d %d",graph3->edges[i].next_edges[0], + graph3->edges[i].next_edges[1],graph3->edges[i].next_edges[2]); + }; + + for(i=0;ifirst_edge[i]); + + }; +}; + +static void bdz_remove_edge(bdz_graph3_t * graph3, cmph_uint32 curr_edge) +{ + cmph_uint32 i,j=0,vert,edge1,edge2; + for(i=0;i<3;i++){ + vert=graph3->edges[curr_edge].vertices[i]; + edge1=graph3->first_edge[vert]; + edge2=NULL_EDGE; + while(edge1!=curr_edge&&edge1!=NULL_EDGE){ + edge2=edge1; + if(graph3->edges[edge1].vertices[0]==vert){ + j=0; + } else if(graph3->edges[edge1].vertices[1]==vert){ + j=1; + } else + j=2; + edge1=graph3->edges[edge1].next_edges[j]; + }; + if(edge1==NULL_EDGE){ + printf("\nerror remove edge %d dump graph",curr_edge); + bdz_dump_graph(graph3,graph3->nedges,graph3->nedges+graph3->nedges/4); + exit(-1); + }; + + if(edge2!=NULL_EDGE){ + graph3->edges[edge2].next_edges[j] = + graph3->edges[edge1].next_edges[i]; + } else + graph3->first_edge[vert]= + graph3->edges[edge1].next_edges[i]; + graph3->vert_degree[vert]--; + }; + +}; + +static int bdz_generate_queue(cmph_uint32 nedges, cmph_uint32 nvertices, bdz_queue_t queue, bdz_graph3_t* graph3) +{ + cmph_uint32 i,v0,v1,v2; + cmph_uint32 queue_head=0,queue_tail=0; + cmph_uint32 curr_edge; + cmph_uint32 tmp_edge; + cmph_uint8 * marked_edge =malloc((size_t)(nedges >> 3) + 1); + memset(marked_edge, 0, (size_t)(nedges >> 3) + 1); + + for(i=0;iedges[i].vertices[0]; + v1=graph3->edges[i].vertices[1]; + v2=graph3->edges[i].vertices[2]; + if(graph3->vert_degree[v0]==1 || + graph3->vert_degree[v1]==1 || + graph3->vert_degree[v2]==1){ + if(!GETBIT(marked_edge,i)) { + queue[queue_head++]=i; + SETBIT(marked_edge,i); + } + }; + }; + while(queue_tail!=queue_head){ + curr_edge=queue[queue_tail++]; + bdz_remove_edge(graph3,curr_edge); + v0=graph3->edges[curr_edge].vertices[0]; + v1=graph3->edges[curr_edge].vertices[1]; + v2=graph3->edges[curr_edge].vertices[2]; + if(graph3->vert_degree[v0]==1 ) { + tmp_edge=graph3->first_edge[v0]; + if(!GETBIT(marked_edge,tmp_edge)) { + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + + }; + if(graph3->vert_degree[v1]==1) { + tmp_edge=graph3->first_edge[v1]; + if(!GETBIT(marked_edge,tmp_edge)){ + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + + }; + if(graph3->vert_degree[v2]==1){ + tmp_edge=graph3->first_edge[v2]; + if(!GETBIT(marked_edge,tmp_edge)){ + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + }; + }; + free(marked_edge); + return (int)(queue_head-nedges);/* returns 0 if successful otherwies return negative number*/ +}; + +static int bdz_mapping(cmph_config_t *mph, bdz_graph3_t* graph3, bdz_queue_t queue); +static void assigning(bdz_config_data_t *bdz, bdz_graph3_t* graph3, bdz_queue_t queue); +static void ranking(bdz_config_data_t *bdz); +static cmph_uint32 rank(cmph_uint32 b, cmph_uint32 * ranktable, cmph_uint8 * g, cmph_uint32 vertex); + +bdz_config_data_t *bdz_config_new(void) +{ + bdz_config_data_t *bdz; + bdz = (bdz_config_data_t *)malloc(sizeof(bdz_config_data_t)); + assert(bdz); + memset(bdz, 0, sizeof(bdz_config_data_t)); + bdz->hashfunc = CMPH_HASH_JENKINS; + bdz->g = NULL; + bdz->hl = NULL; + bdz->k = 0; //kth index in ranktable, $k = log_2(n=3r)/\varepsilon$ + bdz->b = 7; // number of bits of k + bdz->ranktablesize = 0; //number of entries in ranktable, $n/k +1$ + bdz->ranktable = NULL; // rank table + return bdz; +} + +void bdz_config_destroy(cmph_config_t *mph) +{ + bdz_config_data_t *data = (bdz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bdz_config_set_b(cmph_config_t *mph, cmph_uint32 b) +{ + bdz_config_data_t *bdz = (bdz_config_data_t *)mph->data; + if (b <= 2 || b > 10) b = 7; // validating restrictions over parameter b. + bdz->b = (cmph_uint8)b; + DEBUGP("b: %u\n", b); + +} + +void bdz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bdz_config_data_t *bdz = (bdz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 1) break; //bdz only uses one linear hash function + bdz->hashfunc = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bdz_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + bdz_data_t *bdzf = NULL; + cmph_uint32 iterations; + bdz_queue_t edges; + bdz_graph3_t graph3; + bdz_config_data_t *bdz = (bdz_config_data_t *)mph->data; + #ifdef CMPH_TIMING + double construction_time_begin = 0.0; + double construction_time = 0.0; + ELAPSED_TIME_IN_SECONDS(&construction_time_begin); + #endif + + + if (c == 0) c = 1.23; // validating restrictions over parameter c. + DEBUGP("c: %f\n", c); + bdz->m = mph->key_source->nkeys; + bdz->r = (cmph_uint32)ceil((c * mph->key_source->nkeys)/3); + if ((bdz->r % 2) == 0) bdz->r+=1; + bdz->n = 3*bdz->r; + + bdz->k = (1U << bdz->b); + DEBUGP("b: %u -- k: %u\n", bdz->b, bdz->k); + + bdz->ranktablesize = (cmph_uint32)ceil(bdz->n/(double)bdz->k); + DEBUGP("ranktablesize: %u\n", bdz->ranktablesize); + + + bdz_alloc_graph3(&graph3, bdz->m, bdz->n); + bdz_alloc_queue(&edges,bdz->m); + DEBUGP("Created hypergraph\n"); + + DEBUGP("m (edges): %u n (vertices): %u r: %u c: %f \n", bdz->m, bdz->n, bdz->r, c); + + // Mapping step + iterations = 1000; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bdz->m, bdz->n); + } + while(1) + { + int ok; + DEBUGP("linear hash function \n"); + bdz->hl = hash_state_new(bdz->hashfunc, 15); + + ok = bdz_mapping(mph, &graph3, edges); + //ok = 0; + if (!ok) + { + --iterations; + hash_state_destroy(bdz->hl); + bdz->hl = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { + bdz_free_queue(&edges); + bdz_free_graph3(&graph3); + return NULL; + } + bdz_partial_free_graph3(&graph3); + // Assigning step + if (mph->verbosity) + { + fprintf(stderr, "Entering assigning step for mph creation of %u keys with graph sized %u\n", bdz->m, bdz->n); + } + assigning(bdz, &graph3, edges); + + bdz_free_queue(&edges); + bdz_free_graph3(&graph3); + if (mph->verbosity) + { + fprintf(stderr, "Entering ranking step for mph creation of %u keys with graph sized %u\n", bdz->m, bdz->n); + } + ranking(bdz); + #ifdef CMPH_TIMING + ELAPSED_TIME_IN_SECONDS(&construction_time); + #endif + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bdzf = (bdz_data_t *)malloc(sizeof(bdz_data_t)); + bdzf->g = bdz->g; + bdz->g = NULL; //transfer memory ownership + bdzf->hl = bdz->hl; + bdz->hl = NULL; //transfer memory ownership + bdzf->ranktable = bdz->ranktable; + bdz->ranktable = NULL; //transfer memory ownership + bdzf->ranktablesize = bdz->ranktablesize; + bdzf->k = bdz->k; + bdzf->b = bdz->b; + bdzf->n = bdz->n; + bdzf->m = bdz->m; + bdzf->r = bdz->r; + mphf->data = bdzf; + mphf->size = bdz->m; + + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + + + #ifdef CMPH_TIMING + register cmph_uint32 space_usage = bdz_packed_size(mphf)*8; + register cmph_uint32 keys_per_bucket = 1; + construction_time = construction_time - construction_time_begin; + fprintf(stdout, "%u\t%.2f\t%u\t%.4f\t%.4f\n", bdz->m, bdz->m/(double)bdz->n, keys_per_bucket, construction_time, space_usage/(double)bdz->m); + #endif + + return mphf; +} + + +static int bdz_mapping(cmph_config_t *mph, bdz_graph3_t* graph3, bdz_queue_t queue) +{ + cmph_uint32 e; + int cycles = 0; + cmph_uint32 hl[3]; + bdz_config_data_t *bdz = (bdz_config_data_t *)mph->data; + bdz_init_graph3(graph3, bdz->m, bdz->n); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h0, h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + hash_vector(bdz->hl, key, keylen,hl); + h0 = hl[0] % bdz->r; + h1 = hl[1] % bdz->r + bdz->r; + h2 = hl[2] % bdz->r + (bdz->r << 1); + mph->key_source->dispose(mph->key_source->data, key, keylen); + bdz_add_edge(graph3,h0,h1,h2); + } + cycles = bdz_generate_queue(bdz->m, bdz->n, queue, graph3); + return (cycles == 0); +} + +static void assigning(bdz_config_data_t *bdz, bdz_graph3_t* graph3, bdz_queue_t queue) +{ + cmph_uint32 i; + cmph_uint32 nedges=graph3->nedges; + cmph_uint32 curr_edge; + cmph_uint32 v0,v1,v2; + cmph_uint8 * marked_vertices =malloc((size_t)(bdz->n >> 3) + 1); + cmph_uint32 sizeg = (cmph_uint32)ceil(bdz->n/4.0); + bdz->g = (cmph_uint8 *)calloc((size_t)(sizeg), sizeof(cmph_uint8)); + memset(marked_vertices, 0, (size_t)(bdz->n >> 3) + 1); + memset(bdz->g, 0xff, (size_t)(sizeg)); + + for(i=nedges-1;i+1>0;i--){ + curr_edge=queue[i]; + v0=graph3->edges[curr_edge].vertices[0]; + v1=graph3->edges[curr_edge].vertices[1]; + v2=graph3->edges[curr_edge].vertices[2]; + DEBUGP("B:%u %u %u -- %u %u %u\n", v0, v1, v2, GETVALUE(bdz->g, v0), GETVALUE(bdz->g, v1), GETVALUE(bdz->g, v2)); + if(!GETBIT(marked_vertices, v0)){ + if(!GETBIT(marked_vertices,v1)) + { + SETVALUE1(bdz->g, v1, UNASSIGNED); + SETBIT(marked_vertices, v1); + } + if(!GETBIT(marked_vertices,v2)) + { + SETVALUE1(bdz->g, v2, UNASSIGNED); + SETBIT(marked_vertices, v2); + } + SETVALUE1(bdz->g, v0, (6-(GETVALUE(bdz->g, v1) + GETVALUE(bdz->g,v2)))%3); + SETBIT(marked_vertices, v0); + } else if(!GETBIT(marked_vertices, v1)) { + if(!GETBIT(marked_vertices, v2)) + { + SETVALUE1(bdz->g, v2, UNASSIGNED); + SETBIT(marked_vertices, v2); + } + SETVALUE1(bdz->g, v1, (7-(GETVALUE(bdz->g, v0)+GETVALUE(bdz->g, v2)))%3); + SETBIT(marked_vertices, v1); + }else { + SETVALUE1(bdz->g, v2, (8-(GETVALUE(bdz->g,v0)+GETVALUE(bdz->g, v1)))%3); + SETBIT(marked_vertices, v2); + } + DEBUGP("A:%u %u %u -- %u %u %u\n", v0, v1, v2, GETVALUE(bdz->g, v0), GETVALUE(bdz->g, v1), GETVALUE(bdz->g, v2)); + }; + free(marked_vertices); +} + + +static void ranking(bdz_config_data_t *bdz) +{ + cmph_uint32 i, j, offset = 0U, count = 0U, size = (bdz->k >> 2U), nbytes_total = (cmph_uint32)ceil(bdz->n/4.0), nbytes; + bdz->ranktable = (cmph_uint32 *)calloc((size_t)bdz->ranktablesize, sizeof(cmph_uint32)); + // ranktable computation + bdz->ranktable[0] = 0; + i = 1; + while(1) + { + if(i == bdz->ranktablesize) break; + nbytes = size < nbytes_total? size : nbytes_total; + for(j = 0; j < nbytes; j++) + { + count += bdz_lookup_table[*(bdz->g + offset + j)]; + } + bdz->ranktable[i] = count; + offset += nbytes; + nbytes_total -= size; + i++; + } +} + + +int bdz_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + bdz_data_t *data = (bdz_data_t *)mphf->data; + cmph_uint32 sizeg; +#ifdef DEBUG + cmph_uint32 i; +#endif + __cmph_dump(mphf, fd); + + hash_state_dump(data->hl, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->r), sizeof(cmph_uint32), (size_t)1, fd); + + sizeg = (cmph_uint32)ceil(data->n/4.0); + nbytes = fwrite(data->g, sizeof(cmph_uint8)*sizeg, (size_t)1, fd); + + nbytes = fwrite(&(data->k), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->b), sizeof(cmph_uint8), (size_t)1, fd); + nbytes = fwrite(&(data->ranktablesize), sizeof(cmph_uint32), (size_t)1, fd); + + nbytes = fwrite(data->ranktable, sizeof(cmph_uint32)*(data->ranktablesize), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", GETVALUE(data->g, i)); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bdz_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen, sizeg; + register size_t nbytes; + bdz_data_t *bdz = (bdz_data_t *)malloc(sizeof(bdz_data_t)); +#ifdef DEBUG + cmph_uint32 i = 0; +#endif + + DEBUGP("Loading bdz mphf\n"); + mphf->data = bdz; + + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + bdz->hl = hash_state_load(buf, buflen); + free(buf); + + + DEBUGP("Reading m and n\n"); + nbytes = fread(&(bdz->n), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bdz->m), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bdz->r), sizeof(cmph_uint32), (size_t)1, f); + sizeg = (cmph_uint32)ceil(bdz->n/4.0); + bdz->g = (cmph_uint8 *)calloc((size_t)(sizeg), sizeof(cmph_uint8)); + nbytes = fread(bdz->g, sizeg*sizeof(cmph_uint8), (size_t)1, f); + + nbytes = fread(&(bdz->k), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bdz->b), sizeof(cmph_uint8), (size_t)1, f); + nbytes = fread(&(bdz->ranktablesize), sizeof(cmph_uint32), (size_t)1, f); + + bdz->ranktable = (cmph_uint32 *)calloc((size_t)bdz->ranktablesize, sizeof(cmph_uint32)); + nbytes = fread(bdz->ranktable, sizeof(cmph_uint32)*(bdz->ranktablesize), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return; + } + + #ifdef DEBUG + i = 0; + fprintf(stderr, "G: "); + for (i = 0; i < bdz->n; ++i) fprintf(stderr, "%u ", GETVALUE(bdz->g,i)); + fprintf(stderr, "\n"); + #endif + return; +} + + +/* +static cmph_uint32 bdz_search_ph(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bdz_data_t *bdz = mphf->data; + cmph_uint32 hl[3]; + hash_vector(bdz->hl, key, keylen, hl); + cmph_uint32 vertex; + hl[0] = hl[0] % bdz->r; + hl[1] = hl[1] % bdz->r + bdz->r; + hl[2] = hl[2] % bdz->r + (bdz->r << 1); + vertex = hl[(GETVALUE(bdz->g, hl[0]) + GETVALUE(bdz->g, hl[1]) + GETVALUE(bdz->g, hl[2])) % 3]; + return vertex; +} +*/ + +static inline cmph_uint32 rank(cmph_uint32 b, cmph_uint32 * ranktable, cmph_uint8 * g, cmph_uint32 vertex) +{ + register cmph_uint32 index = vertex >> b; + register cmph_uint32 base_rank = ranktable[index]; + register cmph_uint32 beg_idx_v = index << b; + register cmph_uint32 beg_idx_b = beg_idx_v >> 2; + register cmph_uint32 end_idx_b = vertex >> 2; + while(beg_idx_b < end_idx_b) + { + base_rank += bdz_lookup_table[*(g + beg_idx_b++)]; + + } + beg_idx_v = beg_idx_b << 2; + while(beg_idx_v < vertex) + { + if(GETVALUE(g, beg_idx_v) != UNASSIGNED) base_rank++; + beg_idx_v++; + } + + return base_rank; +} + +cmph_uint32 bdz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint32 vertex; + register bdz_data_t *bdz = mphf->data; + cmph_uint32 hl[3]; + hash_vector(bdz->hl, key, keylen, hl); + hl[0] = hl[0] % bdz->r; + hl[1] = hl[1] % bdz->r + bdz->r; + hl[2] = hl[2] % bdz->r + (bdz->r << 1); + vertex = hl[(GETVALUE(bdz->g, hl[0]) + GETVALUE(bdz->g, hl[1]) + GETVALUE(bdz->g, hl[2])) % 3]; + return rank(bdz->b, bdz->ranktable, bdz->g, vertex); +} + + +void bdz_destroy(cmph_t *mphf) +{ + bdz_data_t *data = (bdz_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hl); + free(data->ranktable); + free(data); + free(mphf); +} + +/** \fn void bdz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bdz_pack(cmph_t *mphf, void *packed_mphf) +{ + bdz_data_t *data = (bdz_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + cmph_uint32 sizeg; + + // packing hl type + CMPH_HASH hl_type = hash_get_type(data->hl); + *((cmph_uint32 *) ptr) = hl_type; + ptr += sizeof(cmph_uint32); + + // packing hl + hash_state_pack(data->hl, ptr); + ptr += hash_state_packed_size(hl_type); + + // packing r + *((cmph_uint32 *) ptr) = data->r; + ptr += sizeof(data->r); + + // packing ranktablesize + *((cmph_uint32 *) ptr) = data->ranktablesize; + ptr += sizeof(data->ranktablesize); + + // packing ranktable + memcpy(ptr, data->ranktable, sizeof(cmph_uint32)*(data->ranktablesize)); + ptr += sizeof(cmph_uint32)*(data->ranktablesize); + + // packing b + *ptr++ = data->b; + + // packing g + sizeg = (cmph_uint32)ceil(data->n/4.0); + memcpy(ptr, data->g, sizeof(cmph_uint8)*sizeg); +} + +/** \fn cmph_uint32 bdz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bdz_packed_size(cmph_t *mphf) +{ + bdz_data_t *data = (bdz_data_t *)mphf->data; + + CMPH_HASH hl_type = hash_get_type(data->hl); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_packed_size(hl_type) + 3*sizeof(cmph_uint32) + sizeof(cmph_uint32)*(data->ranktablesize) + sizeof(cmph_uint8) + sizeof(cmph_uint8)* (cmph_uint32)(ceil(data->n/4.0))); +} + +/** cmph_uint32 bdz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bdz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + + register cmph_uint32 vertex; + register CMPH_HASH hl_type = *(cmph_uint32 *)packed_mphf; + register cmph_uint8 *hl_ptr = (cmph_uint8 *)(packed_mphf) + 4; + + register cmph_uint32 *ranktable = (cmph_uint32*)(hl_ptr + hash_state_packed_size(hl_type)); + + register cmph_uint32 r = *ranktable++; + register cmph_uint32 ranktablesize = *ranktable++; + register cmph_uint8 * g = (cmph_uint8 *)(ranktable + ranktablesize); + register cmph_uint8 b = *g++; + + cmph_uint32 hl[3]; + hash_vector_packed(hl_ptr, hl_type, key, keylen, hl); + hl[0] = hl[0] % r; + hl[1] = hl[1] % r + r; + hl[2] = hl[2] % r + (r << 1); + vertex = hl[(GETVALUE(g, hl[0]) + GETVALUE(g, hl[1]) + GETVALUE(g, hl[2])) % 3]; + return rank(b, ranktable, g, vertex); +} diff --git a/girepository/cmph/bdz.h b/girepository/cmph/bdz.h new file mode 100644 index 0000000..7116933 --- /dev/null +++ b/girepository/cmph/bdz.h @@ -0,0 +1,43 @@ +#ifndef __CMPH_BDZ_H__ +#define __CMPH_BDZ_H__ + +#include "cmph.h" + +typedef struct __bdz_data_t bdz_data_t; +typedef struct __bdz_config_data_t bdz_config_data_t; + +bdz_config_data_t *bdz_config_new(void); +void bdz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bdz_config_destroy(cmph_config_t *mph); +void bdz_config_set_b(cmph_config_t *mph, cmph_uint32 b); +cmph_t *bdz_new(cmph_config_t *mph, double c); + +void bdz_load(FILE *f, cmph_t *mphf); +int bdz_dump(cmph_t *mphf, FILE *f); +void bdz_destroy(cmph_t *mphf); +cmph_uint32 bdz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void bdz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bdz_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 bdz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bdz_packed_size(cmph_t *mphf); + +/** cmph_uint32 bdz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bdz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/bdz_gen_lookup_table.c b/girepository/cmph/bdz_gen_lookup_table.c new file mode 100644 index 0000000..b8f6606 --- /dev/null +++ b/girepository/cmph/bdz_gen_lookup_table.c @@ -0,0 +1,33 @@ +#include +#include +#include +void help(char * prname) +{ + fprintf(stderr, "USE: %s \n", prname); + exit(1); +} + +int main(int argc, char ** argv) +{ + if(argc != 3) help(argv[0]); + int n = atoi(argv[1]); + int wordsize = (atoi(argv[2]) >> 1); + int i, j, n_assigned; + for(i = 0; i < n; i++) + { + int num = i; + n_assigned = 0; + for(j = 0; j < wordsize; j++) + { + if ((num & 0x0003) != 3) + { + n_assigned++; + //fprintf(stderr, "num:%d\n", num); + } + num = num >> 2; + } + if(i%16 == 0) fprintf(stderr, "\n"); + fprintf(stderr, "%d, ", n_assigned); + } + fprintf(stderr, "\n"); +} diff --git a/girepository/cmph/bdz_ph.c b/girepository/cmph/bdz_ph.c new file mode 100644 index 0000000..2095f11 --- /dev/null +++ b/girepository/cmph/bdz_ph.c @@ -0,0 +1,633 @@ +#include "bdz_ph.h" +#include "cmph_structs.h" +#include "bdz_structs_ph.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include +//#define DEBUG +#include "debug.h" +#define UNASSIGNED 3 +#define NULL_EDGE 0xffffffff + + +static cmph_uint8 pow3_table[5] = {1,3,9,27,81}; +static cmph_uint8 lookup_table[5][256] = { + {0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0}, + {0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0, 1}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, + {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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, +}; + +typedef struct +{ + cmph_uint32 vertices[3]; + cmph_uint32 next_edges[3]; +}bdz_ph_edge_t; + +typedef cmph_uint32 * bdz_ph_queue_t; + +static void bdz_ph_alloc_queue(bdz_ph_queue_t * queuep, cmph_uint32 nedges) +{ + (*queuep)=malloc(nedges*sizeof(cmph_uint32)); +}; +static void bdz_ph_free_queue(bdz_ph_queue_t * queue) +{ + free(*queue); +}; + +typedef struct +{ + cmph_uint32 nedges; + bdz_ph_edge_t * edges; + cmph_uint32 * first_edge; + cmph_uint8 * vert_degree; +}bdz_ph_graph3_t; + + +static void bdz_ph_alloc_graph3(bdz_ph_graph3_t * graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + graph3->edges=malloc(nedges*sizeof(bdz_ph_edge_t)); + graph3->first_edge=malloc(nvertices*sizeof(cmph_uint32)); + graph3->vert_degree=malloc((size_t)nvertices); +}; +static void bdz_ph_init_graph3(bdz_ph_graph3_t * graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + memset(graph3->first_edge,0xff,nvertices*sizeof(cmph_uint32)); + memset(graph3->vert_degree,0,(size_t)nvertices); + graph3->nedges=0; +}; +static void bdz_ph_free_graph3(bdz_ph_graph3_t *graph3) +{ + free(graph3->edges); + free(graph3->first_edge); + free(graph3->vert_degree); +}; + +static void bdz_ph_partial_free_graph3(bdz_ph_graph3_t *graph3) +{ + free(graph3->first_edge); + free(graph3->vert_degree); + graph3->first_edge = NULL; + graph3->vert_degree = NULL; +}; + +static void bdz_ph_add_edge(bdz_ph_graph3_t * graph3, cmph_uint32 v0, cmph_uint32 v1, cmph_uint32 v2) +{ + graph3->edges[graph3->nedges].vertices[0]=v0; + graph3->edges[graph3->nedges].vertices[1]=v1; + graph3->edges[graph3->nedges].vertices[2]=v2; + graph3->edges[graph3->nedges].next_edges[0]=graph3->first_edge[v0]; + graph3->edges[graph3->nedges].next_edges[1]=graph3->first_edge[v1]; + graph3->edges[graph3->nedges].next_edges[2]=graph3->first_edge[v2]; + graph3->first_edge[v0]=graph3->first_edge[v1]=graph3->first_edge[v2]=graph3->nedges; + graph3->vert_degree[v0]++; + graph3->vert_degree[v1]++; + graph3->vert_degree[v2]++; + graph3->nedges++; +}; + +static void bdz_ph_dump_graph(bdz_ph_graph3_t* graph3, cmph_uint32 nedges, cmph_uint32 nvertices) +{ + cmph_uint32 i; + for(i=0;iedges[i].vertices[0], + graph3->edges[i].vertices[1],graph3->edges[i].vertices[2]); + printf(" nexts %d %d %d",graph3->edges[i].next_edges[0], + graph3->edges[i].next_edges[1],graph3->edges[i].next_edges[2]); + }; + + for(i=0;ifirst_edge[i]); + + }; +}; + +static void bdz_ph_remove_edge(bdz_ph_graph3_t * graph3, cmph_uint32 curr_edge) +{ + cmph_uint32 i,j=0,vert,edge1,edge2; + for(i=0;i<3;i++){ + vert=graph3->edges[curr_edge].vertices[i]; + edge1=graph3->first_edge[vert]; + edge2=NULL_EDGE; + while(edge1!=curr_edge&&edge1!=NULL_EDGE){ + edge2=edge1; + if(graph3->edges[edge1].vertices[0]==vert){ + j=0; + } else if(graph3->edges[edge1].vertices[1]==vert){ + j=1; + } else + j=2; + edge1=graph3->edges[edge1].next_edges[j]; + }; + if(edge1==NULL_EDGE){ + printf("\nerror remove edge %d dump graph",curr_edge); + bdz_ph_dump_graph(graph3,graph3->nedges,graph3->nedges+graph3->nedges/4); + exit(-1); + }; + + if(edge2!=NULL_EDGE){ + graph3->edges[edge2].next_edges[j] = + graph3->edges[edge1].next_edges[i]; + } else + graph3->first_edge[vert]= + graph3->edges[edge1].next_edges[i]; + graph3->vert_degree[vert]--; + }; + +}; + +static int bdz_ph_generate_queue(cmph_uint32 nedges, cmph_uint32 nvertices, bdz_ph_queue_t queue, bdz_ph_graph3_t* graph3) +{ + cmph_uint32 i,v0,v1,v2; + cmph_uint32 queue_head=0,queue_tail=0; + cmph_uint32 curr_edge; + cmph_uint32 tmp_edge; + cmph_uint8 * marked_edge =malloc((size_t)(nedges >> 3) + 1); + memset(marked_edge, 0, (size_t)(nedges >> 3) + 1); + + for(i=0;iedges[i].vertices[0]; + v1=graph3->edges[i].vertices[1]; + v2=graph3->edges[i].vertices[2]; + if(graph3->vert_degree[v0]==1 || + graph3->vert_degree[v1]==1 || + graph3->vert_degree[v2]==1){ + if(!GETBIT(marked_edge,i)) { + queue[queue_head++]=i; + SETBIT(marked_edge,i); + } + }; + }; + while(queue_tail!=queue_head){ + curr_edge=queue[queue_tail++]; + bdz_ph_remove_edge(graph3,curr_edge); + v0=graph3->edges[curr_edge].vertices[0]; + v1=graph3->edges[curr_edge].vertices[1]; + v2=graph3->edges[curr_edge].vertices[2]; + if(graph3->vert_degree[v0]==1 ) { + tmp_edge=graph3->first_edge[v0]; + if(!GETBIT(marked_edge,tmp_edge)) { + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + + }; + if(graph3->vert_degree[v1]==1) { + tmp_edge=graph3->first_edge[v1]; + if(!GETBIT(marked_edge,tmp_edge)){ + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + + }; + if(graph3->vert_degree[v2]==1){ + tmp_edge=graph3->first_edge[v2]; + if(!GETBIT(marked_edge,tmp_edge)){ + queue[queue_head++]=tmp_edge; + SETBIT(marked_edge,tmp_edge); + }; + }; + }; + free(marked_edge); + return (int)queue_head - (int)nedges;/* returns 0 if successful otherwies return negative number*/ +}; + +static int bdz_ph_mapping(cmph_config_t *mph, bdz_ph_graph3_t* graph3, bdz_ph_queue_t queue); +static void assigning(bdz_ph_config_data_t *bdz_ph, bdz_ph_graph3_t* graph3, bdz_ph_queue_t queue); +static void bdz_ph_optimization(bdz_ph_config_data_t *bdz_ph); + +bdz_ph_config_data_t *bdz_ph_config_new(void) +{ + bdz_ph_config_data_t *bdz_ph; + bdz_ph = (bdz_ph_config_data_t *)malloc(sizeof(bdz_ph_config_data_t)); + assert(bdz_ph); + memset(bdz_ph, 0, sizeof(bdz_ph_config_data_t)); + bdz_ph->hashfunc = CMPH_HASH_JENKINS; + bdz_ph->g = NULL; + bdz_ph->hl = NULL; + return bdz_ph; +} + +void bdz_ph_config_destroy(cmph_config_t *mph) +{ + bdz_ph_config_data_t *data = (bdz_ph_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bdz_ph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bdz_ph_config_data_t *bdz_ph = (bdz_ph_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 1) break; //bdz_ph only uses one linear hash function + bdz_ph->hashfunc = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bdz_ph_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + bdz_ph_data_t *bdz_phf = NULL; + cmph_uint32 iterations; + bdz_ph_queue_t edges; + bdz_ph_graph3_t graph3; + bdz_ph_config_data_t *bdz_ph = (bdz_ph_config_data_t *)mph->data; + #ifdef CMPH_TIMING + double construction_time_begin = 0.0; + double construction_time = 0.0; + ELAPSED_TIME_IN_SECONDS(&construction_time_begin); + #endif + + + if (c == 0) c = 1.23; // validating restrictions over parameter c. + DEBUGP("c: %f\n", c); + bdz_ph->m = mph->key_source->nkeys; + bdz_ph->r = (cmph_uint32)ceil((c * mph->key_source->nkeys)/3); + if ((bdz_ph->r % 2) == 0) bdz_ph->r += 1; + bdz_ph->n = 3*bdz_ph->r; + + + bdz_ph_alloc_graph3(&graph3, bdz_ph->m, bdz_ph->n); + bdz_ph_alloc_queue(&edges,bdz_ph->m); + DEBUGP("Created hypergraph\n"); + + DEBUGP("m (edges): %u n (vertices): %u r: %u c: %f \n", bdz_ph->m, bdz_ph->n, bdz_ph->r, c); + + // Mapping step + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bdz_ph->m, bdz_ph->n); + } + while(1) + { + int ok; + DEBUGP("linear hash function \n"); + bdz_ph->hl = hash_state_new(bdz_ph->hashfunc, 15); + + ok = bdz_ph_mapping(mph, &graph3, edges); + if (!ok) + { + --iterations; + hash_state_destroy(bdz_ph->hl); + bdz_ph->hl = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + + if (iterations == 0) + { +// free(bdz_ph->g); + bdz_ph_free_queue(&edges); + bdz_ph_free_graph3(&graph3); + return NULL; + } + bdz_ph_partial_free_graph3(&graph3); + // Assigning step + if (mph->verbosity) + { + fprintf(stderr, "Entering assigning step for mph creation of %u keys with graph sized %u\n", bdz_ph->m, bdz_ph->n); + } + assigning(bdz_ph, &graph3, edges); + + bdz_ph_free_queue(&edges); + bdz_ph_free_graph3(&graph3); + + if (mph->verbosity) + { + fprintf(stderr, "Starting optimization step\n"); + } + + bdz_ph_optimization(bdz_ph); + + #ifdef CMPH_TIMING + ELAPSED_TIME_IN_SECONDS(&construction_time); + #endif + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bdz_phf = (bdz_ph_data_t *)malloc(sizeof(bdz_ph_data_t)); + bdz_phf->g = bdz_ph->g; + bdz_ph->g = NULL; //transfer memory ownership + bdz_phf->hl = bdz_ph->hl; + bdz_ph->hl = NULL; //transfer memory ownership + bdz_phf->n = bdz_ph->n; + bdz_phf->m = bdz_ph->m; + bdz_phf->r = bdz_ph->r; + mphf->data = bdz_phf; + mphf->size = bdz_ph->n; + + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + + #ifdef CMPH_TIMING + register cmph_uint32 space_usage = bdz_ph_packed_size(mphf)*8; + register cmph_uint32 keys_per_bucket = 1; + construction_time = construction_time - construction_time_begin; + fprintf(stdout, "%u\t%.2f\t%u\t%.4f\t%.4f\n", bdz_ph->m, bdz_ph->m/(double)bdz_ph->n, keys_per_bucket, construction_time, space_usage/(double)bdz_ph->m); + #endif + + return mphf; +} + + +static int bdz_ph_mapping(cmph_config_t *mph, bdz_ph_graph3_t* graph3, bdz_ph_queue_t queue) +{ + cmph_uint32 e; + int cycles = 0; + cmph_uint32 hl[3]; + + bdz_ph_config_data_t *bdz_ph = (bdz_ph_config_data_t *)mph->data; + bdz_ph_init_graph3(graph3, bdz_ph->m, bdz_ph->n); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h0, h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + hash_vector(bdz_ph->hl, key, keylen, hl); + h0 = hl[0] % bdz_ph->r; + h1 = hl[1] % bdz_ph->r + bdz_ph->r; + h2 = hl[2] % bdz_ph->r + (bdz_ph->r << 1); + mph->key_source->dispose(mph->key_source->data, key, keylen); + bdz_ph_add_edge(graph3,h0,h1,h2); + } + cycles = bdz_ph_generate_queue(bdz_ph->m, bdz_ph->n, queue, graph3); + return (cycles == 0); +} + +static void assigning(bdz_ph_config_data_t *bdz_ph, bdz_ph_graph3_t* graph3, bdz_ph_queue_t queue) +{ + cmph_uint32 i; + cmph_uint32 nedges=graph3->nedges; + cmph_uint32 curr_edge; + cmph_uint32 v0,v1,v2; + cmph_uint8 * marked_vertices =malloc((size_t)(bdz_ph->n >> 3) + 1); + cmph_uint32 sizeg = (cmph_uint32)ceil(bdz_ph->n/4.0); + bdz_ph->g = (cmph_uint8 *)calloc((size_t)sizeg, sizeof(cmph_uint8)); + memset(marked_vertices, 0, (size_t)(bdz_ph->n >> 3) + 1); + //memset(bdz_ph->g, 0xff, sizeg); + + for(i=nedges-1;i+1>=1;i--){ + curr_edge=queue[i]; + v0=graph3->edges[curr_edge].vertices[0]; + v1=graph3->edges[curr_edge].vertices[1]; + v2=graph3->edges[curr_edge].vertices[2]; + DEBUGP("B:%u %u %u -- %u %u %u\n", v0, v1, v2, GETVALUE(bdz_ph->g, v0), GETVALUE(bdz_ph->g, v1), GETVALUE(bdz_ph->g, v2)); + if(!GETBIT(marked_vertices, v0)){ + if(!GETBIT(marked_vertices,v1)) + { + //SETVALUE(bdz_ph->g, v1, UNASSIGNED); + SETBIT(marked_vertices, v1); + } + if(!GETBIT(marked_vertices,v2)) + { + //SETVALUE(bdz_ph->g, v2, UNASSIGNED); + SETBIT(marked_vertices, v2); + } + SETVALUE0(bdz_ph->g, v0, (6-(GETVALUE(bdz_ph->g, v1) + GETVALUE(bdz_ph->g,v2)))%3); + SETBIT(marked_vertices, v0); + } else if(!GETBIT(marked_vertices, v1)) { + if(!GETBIT(marked_vertices, v2)) + { + //SETVALUE(bdz_ph->g, v2, UNASSIGNED); + SETBIT(marked_vertices, v2); + } + SETVALUE0(bdz_ph->g, v1, (7 - (GETVALUE(bdz_ph->g, v0)+GETVALUE(bdz_ph->g, v2)))%3); + SETBIT(marked_vertices, v1); + }else { + SETVALUE0(bdz_ph->g, v2, (8-(GETVALUE(bdz_ph->g,v0)+GETVALUE(bdz_ph->g, v1)))%3); + SETBIT(marked_vertices, v2); + } + DEBUGP("A:%u %u %u -- %u %u %u\n", v0, v1, v2, GETVALUE(bdz_ph->g, v0), GETVALUE(bdz_ph->g, v1), GETVALUE(bdz_ph->g, v2)); + }; + free(marked_vertices); +} + +static void bdz_ph_optimization(bdz_ph_config_data_t *bdz_ph) +{ + cmph_uint32 i; + cmph_uint8 byte = 0; + cmph_uint32 sizeg = (cmph_uint32)ceil(bdz_ph->n/5.0); + cmph_uint8 * new_g = (cmph_uint8 *)calloc((size_t)sizeg, sizeof(cmph_uint8)); + cmph_uint8 value; + cmph_uint32 idx; + for(i = 0; i < bdz_ph->n; i++) + { + idx = i/5; + byte = new_g[idx]; + value = GETVALUE(bdz_ph->g, i); + byte = (cmph_uint8) (byte + value*pow3_table[i%5U]); + new_g[idx] = byte; + } + free(bdz_ph->g); + bdz_ph->g = new_g; +} + + +int bdz_ph_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 sizeg = 0; + register size_t nbytes; + bdz_ph_data_t *data = (bdz_ph_data_t *)mphf->data; +#ifdef DEBUG + cmph_uint32 i; +#endif + + __cmph_dump(mphf, fd); + + hash_state_dump(data->hl, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->r), sizeof(cmph_uint32), (size_t)1, fd); + sizeg = (cmph_uint32)ceil(data->n/5.0); + nbytes = fwrite(data->g, sizeof(cmph_uint8)*sizeg, (size_t)1, fd); + + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", GETVALUE(data->g, i)); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bdz_ph_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 sizeg = 0; + register size_t nbytes; + bdz_ph_data_t *bdz_ph = (bdz_ph_data_t *)malloc(sizeof(bdz_ph_data_t)); + + DEBUGP("Loading bdz_ph mphf\n"); + mphf->data = bdz_ph; + + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + bdz_ph->hl = hash_state_load(buf, buflen); + free(buf); + + + DEBUGP("Reading m and n\n"); + nbytes = fread(&(bdz_ph->n), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bdz_ph->m), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bdz_ph->r), sizeof(cmph_uint32), (size_t)1, f); + sizeg = (cmph_uint32)ceil(bdz_ph->n/5.0); + bdz_ph->g = (cmph_uint8 *)calloc((size_t)sizeg, sizeof(cmph_uint8)); + nbytes = fread(bdz_ph->g, sizeg*sizeof(cmph_uint8), (size_t)1, f); + + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } + return; +} + + +cmph_uint32 bdz_ph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + register bdz_ph_data_t *bdz_ph = mphf->data; + cmph_uint32 hl[3]; + register cmph_uint8 byte0, byte1, byte2; + register cmph_uint32 vertex; + + hash_vector(bdz_ph->hl, key, keylen,hl); + hl[0] = hl[0] % bdz_ph->r; + hl[1] = hl[1] % bdz_ph->r + bdz_ph->r; + hl[2] = hl[2] % bdz_ph->r + (bdz_ph->r << 1); + + byte0 = bdz_ph->g[hl[0]/5]; + byte1 = bdz_ph->g[hl[1]/5]; + byte2 = bdz_ph->g[hl[2]/5]; + + byte0 = lookup_table[hl[0]%5U][byte0]; + byte1 = lookup_table[hl[1]%5U][byte1]; + byte2 = lookup_table[hl[2]%5U][byte2]; + vertex = hl[(byte0 + byte1 + byte2)%3]; + + return vertex; +} + + +void bdz_ph_destroy(cmph_t *mphf) +{ + bdz_ph_data_t *data = (bdz_ph_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hl); + free(data); + free(mphf); +} + +/** \fn void bdz_ph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bdz_ph_pack(cmph_t *mphf, void *packed_mphf) +{ + bdz_ph_data_t *data = (bdz_ph_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + cmph_uint32 sizeg; + + // packing hl type + CMPH_HASH hl_type = hash_get_type(data->hl); + *((cmph_uint32 *) ptr) = hl_type; + ptr += sizeof(cmph_uint32); + + // packing hl + hash_state_pack(data->hl, ptr); + ptr += hash_state_packed_size(hl_type); + + // packing r + *((cmph_uint32 *) ptr) = data->r; + ptr += sizeof(data->r); + + // packing g + sizeg = (cmph_uint32)ceil(data->n/5.0); + memcpy(ptr, data->g, sizeof(cmph_uint8)*sizeg); +} + +/** \fn cmph_uint32 bdz_ph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bdz_ph_packed_size(cmph_t *mphf) +{ + bdz_ph_data_t *data = (bdz_ph_data_t *)mphf->data; + CMPH_HASH hl_type = hash_get_type(data->hl); + cmph_uint32 sizeg = (cmph_uint32)ceil(data->n/5.0); + return (cmph_uint32) (sizeof(CMPH_ALGO) + hash_state_packed_size(hl_type) + 2*sizeof(cmph_uint32) + sizeof(cmph_uint8)*sizeg); +} + +/** cmph_uint32 bdz_ph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bdz_ph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + + register CMPH_HASH hl_type = *(cmph_uint32 *)packed_mphf; + register cmph_uint8 *hl_ptr = (cmph_uint8 *)(packed_mphf) + 4; + + register cmph_uint8 * ptr = hl_ptr + hash_state_packed_size(hl_type); + + register cmph_uint32 r = *((cmph_uint32*) ptr); + register cmph_uint8 * g = ptr + 4; + + cmph_uint32 hl[3]; + register cmph_uint8 byte0, byte1, byte2; + register cmph_uint32 vertex; + + hash_vector_packed(hl_ptr, hl_type, key, keylen, hl); + + hl[0] = hl[0] % r; + hl[1] = hl[1] % r + r; + hl[2] = hl[2] % r + (r << 1); + + byte0 = g[hl[0]/5]; + byte1 = g[hl[1]/5]; + byte2 = g[hl[2]/5]; + + byte0 = lookup_table[hl[0]%5][byte0]; + byte1 = lookup_table[hl[1]%5][byte1]; + byte2 = lookup_table[hl[2]%5][byte2]; + vertex = hl[(byte0 + byte1 + byte2)%3]; + + return vertex; +} diff --git a/girepository/cmph/bdz_ph.h b/girepository/cmph/bdz_ph.h new file mode 100644 index 0000000..67b1fac --- /dev/null +++ b/girepository/cmph/bdz_ph.h @@ -0,0 +1,42 @@ +#ifndef __CMPH_BDZ_PH_H__ +#define __CMPH_BDZ_PH_H__ + +#include "cmph.h" + +typedef struct __bdz_ph_data_t bdz_ph_data_t; +typedef struct __bdz_ph_config_data_t bdz_ph_config_data_t; + +bdz_ph_config_data_t *bdz_ph_config_new(void); +void bdz_ph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bdz_ph_config_destroy(cmph_config_t *mph); +cmph_t *bdz_ph_new(cmph_config_t *mph, double c); + +void bdz_ph_load(FILE *f, cmph_t *mphf); +int bdz_ph_dump(cmph_t *mphf, FILE *f); +void bdz_ph_destroy(cmph_t *mphf); +cmph_uint32 bdz_ph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void bdz_ph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bdz_ph_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 bdz_ph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bdz_ph_packed_size(cmph_t *mphf); + +/** cmph_uint32 bdz_ph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bdz_ph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/bdz_structs.h b/girepository/cmph/bdz_structs.h new file mode 100644 index 0000000..ba7dc3c --- /dev/null +++ b/girepository/cmph/bdz_structs.h @@ -0,0 +1,36 @@ +#ifndef __CMPH_BDZ_STRUCTS_H__ +#define __CMPH_BDZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __bdz_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 r; //partition vertex count + cmph_uint8 *g; + hash_state_t *hl; // linear hashing + + cmph_uint32 k; //kth index in ranktable, $k = log_2(n=3r)/\varepsilon$ + cmph_uint8 b; // number of bits of k + cmph_uint32 ranktablesize; //number of entries in ranktable, $n/k +1$ + cmph_uint32 *ranktable; // rank table +}; + + +struct __bdz_config_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 r; //partition vertex count + cmph_uint8 *g; + hash_state_t *hl; // linear hashing + + cmph_uint32 k; //kth index in ranktable, $k = log_2(n=3r)/\varepsilon$ + cmph_uint8 b; // number of bits of k + cmph_uint32 ranktablesize; //number of entries in ranktable, $n/k +1$ + cmph_uint32 *ranktable; // rank table + CMPH_HASH hashfunc; +}; + +#endif diff --git a/girepository/cmph/bdz_structs_ph.h b/girepository/cmph/bdz_structs_ph.h new file mode 100644 index 0000000..5874a26 --- /dev/null +++ b/girepository/cmph/bdz_structs_ph.h @@ -0,0 +1,26 @@ +#ifndef __CMPH_BDZ_STRUCTS_PH_H__ +#define __CMPH_BDZ_STRUCTS_PH_H__ + +#include "hash_state.h" + +struct __bdz_ph_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 r; //partition vertex count + cmph_uint8 *g; + hash_state_t *hl; // linear hashing +}; + + +struct __bdz_ph_config_data_t +{ + CMPH_HASH hashfunc; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 r; //partition vertex count + cmph_uint8 *g; + hash_state_t *hl; // linear hashing +}; + +#endif diff --git a/girepository/cmph/bitbool.h b/girepository/cmph/bitbool.h new file mode 100644 index 0000000..a3286c3 --- /dev/null +++ b/girepository/cmph/bitbool.h @@ -0,0 +1,179 @@ +#ifndef _CMPH_BITBOOL_H__ +#define _CMPH_BITBOOL_H__ +#include "cmph_types.h" + +static const cmph_uint8 bitmask[] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; + +static const cmph_uint32 bitmask32[] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7, + 1 << 8, 1 << 9, 1 << 10, 1 << 11, 1 << 12, 1 << 13, 1 << 14, 1 << 15, + 1 << 16, 1 << 17, 1 << 18, 1 << 19, 1 << 20, 1 << 21, 1 << 22, 1 << 23, + 1 << 24, 1 << 25, 1 << 26, 1 << 27, 1 << 28, 1 << 29, 1 << 30, 1U << 31 + }; + +static const cmph_uint8 valuemask[] = { 0xfc, 0xf3, 0xcf, 0x3f}; + + +/** \def GETBIT(array, i) + * \brief get the value of an 1-bit integer stored in an array. + * \param array to get 1-bit integer values from + * \param i is the index in array to get the 1-bit integer value from + * + * GETBIT(array, i) is a macro that gets the value of an 1-bit integer stored in array. + */ +#define GETBIT(array, i) ((array[i >> 3] & bitmask[i & 0x00000007]) >> (i & 0x00000007)) + +/** \def SETBIT(array, i) + * \brief set 1 to an 1-bit integer stored in an array. + * \param array to store 1-bit integer values + * \param i is the index in array to set the the bit to 1 + * + * SETBIT(array, i) is a macro that sets 1 to an 1-bit integer stored in an array. + */ +#define SETBIT(array, i) (array[i >> 3] |= bitmask[i & 0x00000007]) + +/** \def UNSETBIT(array, i) + * \brief set 0 to an 1-bit integer stored in an array. + * \param array to store 1-bit integer values + * \param i is the index in array to set the the bit to 0 + * + * UNSETBIT(array, i) is a macro that sets 0 to an 1-bit integer stored in an array. + */ +#define UNSETBIT(array, i) (array[i >> 3] ^= ((bitmask[i & 0x00000007]))) + +//#define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) +//#define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) +//#define UNSETBIT(array, i) (array[(i) / 8] ^= ((bitmask[(i) % 8]))) + + +/** \def SETVALUE1(array, i, v) + * \brief set a value for a 2-bit integer stored in an array initialized with 1s. + * \param array to store 2-bit integer values + * \param i is the index in array to set the value v + * \param v is the value to be set + * + * SETVALUE1(array, i, v) is a macro that set a value for a 2-bit integer stored in an array. + * The array should be initialized with all bits set to 1. For example: + * memset(array, 0xff, arraySize); + */ +#define SETVALUE1(array, i, v) (array[i >> 2] &= (cmph_uint8)((v << ((i & 0x00000003) << 1)) | valuemask[i & 0x00000003])) + +/** \def SETVALUE0(array, i, v) + * \brief set a value for a 2-bit integer stored in an array initialized with 0s. + * \param array to store 2-bit integer values + * \param i is the index in array to set the value v + * \param v is the value to be set + * + * SETVALUE0(array, i, v) is a macro that set a value for a 2-bit integer stored in an array. + * The array should be initialized with all bits set to 0. For example: + * memset(array, 0, arraySize); + */ +#define SETVALUE0(array, i, v) (array[i >> 2] |= (cmph_uint8)(v << ((i & 0x00000003) << 1))) + + +/** \def GETVALUE(array, i) + * \brief get a value for a 2-bit integer stored in an array. + * \param array to get 2-bit integer values from + * \param i is the index in array to get the value from + * + * GETVALUE(array, i) is a macro that get a value for a 2-bit integer stored in an array. + */ +#define GETVALUE(array, i) ((cmph_uint8)((array[i >> 2] >> ((i & 0x00000003U) << 1U)) & 0x00000003U)) + + + +/** \def SETBIT32(array, i) + * \brief set 1 to an 1-bit integer stored in an array of 32-bit words. + * \param array to store 1-bit integer values. The entries are 32-bit words. + * \param i is the index in array to set the the bit to 1 + * + * SETBIT32(array, i) is a macro that sets 1 to an 1-bit integer stored in an array of 32-bit words. + */ +#define SETBIT32(array, i) (array[i >> 5] |= bitmask32[i & 0x0000001f]) + +/** \def GETBIT32(array, i) + * \brief get the value of an 1-bit integer stored in an array of 32-bit words. + * \param array to get 1-bit integer values from. The entries are 32-bit words. + * \param i is the index in array to get the 1-bit integer value from + * + * GETBIT32(array, i) is a macro that gets the value of an 1-bit integer stored in an array of 32-bit words. + */ +#define GETBIT32(array, i) (array[i >> 5] & bitmask32[i & 0x0000001f]) + +/** \def UNSETBIT32(array, i) + * \brief set 0 to an 1-bit integer stored in an array of 32-bit words. + * \param array to store 1-bit integer values. The entries ar 32-bit words + * \param i is the index in array to set the the bit to 0 + * + * UNSETBIT32(array, i) is a macro that sets 0 to an 1-bit integer stored in an array of 32-bit words. + */ +#define UNSETBIT32(array, i) (array[i >> 5] ^= ((bitmask32[i & 0x0000001f]))) + +#define BITS_TABLE_SIZE(n, bits_length) ((n * bits_length + 31) >> 5) + +static inline void set_bits_value(cmph_uint32 * bits_table, cmph_uint32 index, cmph_uint32 bits_string, + cmph_uint32 string_length, cmph_uint32 string_mask) +{ + register cmph_uint32 bit_idx = index * string_length; + register cmph_uint32 word_idx = bit_idx >> 5; + register cmph_uint32 shift1 = bit_idx & 0x0000001f; + register cmph_uint32 shift2 = 32 - shift1; + + bits_table[word_idx] &= ~((string_mask) << shift1); + bits_table[word_idx] |= bits_string << shift1; + + if(shift2 < string_length) + { + bits_table[word_idx+1] &= ~((string_mask) >> shift2); + bits_table[word_idx+1] |= bits_string >> shift2; + }; +}; + +static inline cmph_uint32 get_bits_value(cmph_uint32 * bits_table,cmph_uint32 index, cmph_uint32 string_length, cmph_uint32 string_mask) +{ + register cmph_uint32 bit_idx = index * string_length; + register cmph_uint32 word_idx = bit_idx >> 5; + register cmph_uint32 shift1 = bit_idx & 0x0000001f; + register cmph_uint32 shift2 = 32-shift1; + register cmph_uint32 bits_string; + + bits_string = (bits_table[word_idx] >> shift1) & string_mask; + + if(shift2 < string_length) + bits_string |= (bits_table[word_idx+1] << shift2) & string_mask; + + return bits_string; +}; + +static inline void set_bits_at_pos(cmph_uint32 * bits_table, cmph_uint32 pos, cmph_uint32 bits_string, cmph_uint32 string_length) +{ + register cmph_uint32 word_idx = pos >> 5; + register cmph_uint32 shift1 = pos & 0x0000001f; + register cmph_uint32 shift2 = 32-shift1; + register cmph_uint32 string_mask = (1U << string_length) - 1; + + bits_table[word_idx] &= ~((string_mask) << shift1); + bits_table[word_idx] |= bits_string << shift1; + if(shift2 < string_length) + { + bits_table[word_idx+1] &= ~((string_mask) >> shift2); + bits_table[word_idx+1] |= bits_string >> shift2; + } +}; + +static inline cmph_uint32 get_bits_at_pos(cmph_uint32 * bits_table,cmph_uint32 pos,cmph_uint32 string_length) +{ + register cmph_uint32 word_idx = pos >> 5; + register cmph_uint32 shift1 = pos & 0x0000001f; + register cmph_uint32 shift2 = 32 - shift1; + register cmph_uint32 string_mask = (1U << string_length) - 1; + register cmph_uint32 bits_string; + + bits_string = (bits_table[word_idx] >> shift1) & string_mask; + + if(shift2 < string_length) + bits_string |= (bits_table[word_idx+1] << shift2) & string_mask; + return bits_string; +} + + +#endif diff --git a/girepository/cmph/bmz.c b/girepository/cmph/bmz.c new file mode 100644 index 0000000..9573825 --- /dev/null +++ b/girepository/cmph/bmz.c @@ -0,0 +1,638 @@ +#include "graph.h" +#include "bmz.h" +#include "cmph_structs.h" +#include "bmz_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz_config_data_t *bmz_config_new(void) +{ + bmz_config_data_t *bmz = NULL; + bmz = (bmz_config_data_t *)malloc(sizeof(bmz_config_data_t)); + assert(bmz); + memset(bmz, 0, sizeof(bmz_config_data_t)); + bmz->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz->g = NULL; + bmz->graph = NULL; + bmz->hashes = NULL; + return bmz; +} + +void bmz_config_destroy(cmph_config_t *mph) +{ + bmz_config_data_t *data = (bmz_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz only uses two hash functions + bmz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + bmz_data_t *bmzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations; + cmph_uint32 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + if (c == 0) c = 1.15; // validating restrictions over parameter c. + DEBUGP("c: %f\n", c); + bmz->m = mph->key_source->nkeys; + bmz->n = (cmph_uint32)ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz->m, bmz->n, c); + bmz->graph = graph_new(bmz->n, bmz->m); + DEBUGP("Created graph\n"); + + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint32 biggest_g_value = 0; + cmph_uint32 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz->m, bmz->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz->hashes[0] = hash_state_new(bmz->hashfuncs[0], bmz->n); + DEBUGP("hash function 2\n"); + bmz->hashes[1] = hash_state_new(bmz->hashfuncs[1], bmz->n); + DEBUGP("Generating edges\n"); + ok = bmz_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz->hashes[0]); + bmz->hashes[0] = NULL; + hash_state_destroy(bmz->hashes[1]); + bmz->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz->graph); + return NULL; + } + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + graph_obtain_critical_nodes(bmz->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (cmph_uint8 *)malloc((size_t)bmz->n/8 + 1); + memset(visited, 0, (size_t)bmz->n/8 + 1); + used_edges = (cmph_uint8 *)malloc((size_t)bmz->m/8 + 1); + memset(used_edges, 0, (size_t)bmz->m/8 + 1); + free(bmz->g); + bmz->g = (cmph_uint32 *)calloc((size_t)bmz->n, sizeof(cmph_uint32)); + assert(bmz->g); + for (i = 0; i < bmz->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz_traverse_critical_nodes(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz_traverse_critical_nodes_heuristic(bmz, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz_traverse_non_critical_nodes(bmz, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + free(used_edges); + free(visited); + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz->graph); + bmz->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmzf = (bmz_data_t *)malloc(sizeof(bmz_data_t)); + bmzf->g = bmz->g; + bmz->g = NULL; //transfer memory ownership + bmzf->hashes = bmz->hashes; + bmz->hashes = NULL; //transfer memory ownership + bmzf->n = bmz->n; + bmzf->m = bmz->m; + mphf->data = bmzf; + mphf->size = bmz->m; + + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz_traverse_critical_nodes(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz->graph)) + 1); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = *biggest_g_value + 1; + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, (next_g + bmz->g[lav]))) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,(next_g + bmz->g[lav])); + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz_traverse_critical_nodes_heuristic(bmz_config_data_t *bmz, cmph_uint32 v, cmph_uint32 * biggest_g_value, cmph_uint32 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint32 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + cmph_uint32 * unused_g_values = NULL; + cmph_uint32 unused_g_values_capacity = 0; + cmph_uint32 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(0.5*graph_ncritical_nodes(bmz->graph))+1); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz->g[v] = (cmph_uint32)ceil ((double)(*biggest_edge_value)/2) - 1; + SETBIT(visited, v); + next_g = (cmph_uint32)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz->graph, v); + while ((u = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint32 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = *biggest_g_value + 1; + next_g_index = UINT_MAX; + } + it1 = graph_neighbors_it(bmz->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz->g[lav] >= bmz->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, (next_g + bmz->g[lav]))) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = (cmph_uint32 *)realloc(unused_g_values, (unused_g_values_capacity + BUFSIZ)*sizeof(cmph_uint32)); + unused_g_values_capacity += BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz->graph, u); + while((lav = graph_next_neighbor(bmz->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,(next_g + bmz->g[lav])); + if(next_g + bmz->g[lav] > *biggest_edge_value) *biggest_edge_value = next_g + bmz->g[lav]; + } + } + bmz->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint32 next_unused_edge(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return unused_edge_index; +} + +static void bmz_traverse(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint32 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + //DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz, used_edges, *unused_edge_index); + bmz->g[neighbor] = *unused_edge_index - bmz->g[v]; + //if (bmz->g[neighbor] >= bmz->m) bmz->g[neighbor] += bmz->m; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz_traverse(bmz, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz_traverse_non_critical_nodes(bmz_config_data_t *bmz, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint32 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz->m; i++) + { + v1 = graph_vertex_id(bmz->graph, i, 0); + v2 = graph_vertex_id(bmz->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz_traverse(bmz, used_edges, v1, &unused_edge_index, visited); + else bmz_traverse(bmz, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz->g[i] = 0; + SETBIT(visited, i); + bmz_traverse(bmz, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + bmz_config_data_t *bmz = (bmz_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz->n); + graph_clear_edges(bmz->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + if (h1 == h2) if (++h2 >= bmz->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + bmz_data_t *data = (bmz_data_t *)mphf->data; + register size_t nbytes; +#ifdef DEBUG + cmph_uint32 i; +#endif + + __cmph_dump(mphf, fd); + + nbytes = fwrite(&two, sizeof(cmph_uint32), (size_t)1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + + nbytes = fwrite(data->g, sizeof(cmph_uint32)*(data->n), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void bmz_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + bmz_data_t *bmz = (bmz_data_t *)malloc(sizeof(bmz_data_t)); + register size_t nbytes; + DEBUGP("Loading bmz mphf\n"); + mphf->data = bmz; + nbytes = fread(&nhashes, sizeof(cmph_uint32), (size_t)1, f); + bmz->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + bmz->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + state = hash_state_load(buf, buflen); + bmz->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + nbytes = fread(&(bmz->n), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(bmz->m), sizeof(cmph_uint32), (size_t)1, f); + + bmz->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*bmz->n); + nbytes = fread(bmz->g, bmz->n*sizeof(cmph_uint32), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return; + } + + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz->n; ++i) fprintf(stderr, "%u ", bmz->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz_data_t *bmz = mphf->data; + cmph_uint32 h1 = hash(bmz->hashes[0], key, keylen) % bmz->n; + cmph_uint32 h2 = hash(bmz->hashes[1], key, keylen) % bmz->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz->g[h1], bmz->g[h2], bmz->m); + return bmz->g[h1] + bmz->g[h2]; +} +void bmz_destroy(cmph_t *mphf) +{ + bmz_data_t *data = (bmz_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} + +/** \fn void bmz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bmz_pack(cmph_t *mphf, void *packed_mphf) +{ + + bmz_data_t *data = (bmz_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + CMPH_HASH h2_type; + + // packing h1 type + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + *((cmph_uint32 *) ptr) = h1_type; + ptr += sizeof(cmph_uint32); + + // packing h1 + hash_state_pack(data->hashes[0], ptr); + ptr += hash_state_packed_size(h1_type); + + // packing h2 type + h2_type = hash_get_type(data->hashes[1]); + *((cmph_uint32 *) ptr) = h2_type; + ptr += sizeof(cmph_uint32); + + // packing h2 + hash_state_pack(data->hashes[1], ptr); + ptr += hash_state_packed_size(h2_type); + + // packing n + *((cmph_uint32 *) ptr) = data->n; + ptr += sizeof(data->n); + + // packing g + memcpy(ptr, data->g, sizeof(cmph_uint32)*data->n); +} + +/** \fn cmph_uint32 bmz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bmz_packed_size(cmph_t *mphf) +{ + bmz_data_t *data = (bmz_data_t *)mphf->data; + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + CMPH_HASH h2_type = hash_get_type(data->hashes[1]); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_packed_size(h1_type) + hash_state_packed_size(h2_type) + + 3*sizeof(cmph_uint32) + sizeof(cmph_uint32)*data->n); +} + +/** cmph_uint32 bmz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bmz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint8 *h1_ptr = packed_mphf; + register CMPH_HASH h1_type = *((cmph_uint32 *)h1_ptr); + register cmph_uint8 *h2_ptr; + register CMPH_HASH h2_type; + register cmph_uint32 *g_ptr, n, h1, h2; + + h1_ptr += 4; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + h2_type = *((cmph_uint32 *)h2_ptr); + h2_ptr += 4; + + g_ptr = (cmph_uint32 *)(h2_ptr + hash_state_packed_size(h2_type)); + + n = *g_ptr++; + + h1 = hash_packed(h1_ptr, h1_type, key, keylen) % n; + h2 = hash_packed(h2_ptr, h2_type, key, keylen) % n; + if (h1 == h2 && ++h2 > n) h2 = 0; + return (g_ptr[h1] + g_ptr[h2]); +} diff --git a/girepository/cmph/bmz.h b/girepository/cmph/bmz.h new file mode 100644 index 0000000..9821aa8 --- /dev/null +++ b/girepository/cmph/bmz.h @@ -0,0 +1,42 @@ +#ifndef __CMPH_BMZ_H__ +#define __CMPH_BMZ_H__ + +#include "cmph.h" + +typedef struct __bmz_data_t bmz_data_t; +typedef struct __bmz_config_data_t bmz_config_data_t; + +bmz_config_data_t *bmz_config_new(void); +void bmz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz_config_destroy(cmph_config_t *mph); +cmph_t *bmz_new(cmph_config_t *mph, double c); + +void bmz_load(FILE *f, cmph_t *mphf); +int bmz_dump(cmph_t *mphf, FILE *f); +void bmz_destroy(cmph_t *mphf); +cmph_uint32 bmz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void bmz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bmz_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 bmz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bmz_packed_size(cmph_t *mphf); + +/** cmph_uint32 bmz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 bmz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/bmz8.c b/girepository/cmph/bmz8.c new file mode 100644 index 0000000..15853c0 --- /dev/null +++ b/girepository/cmph/bmz8.c @@ -0,0 +1,647 @@ +#include "graph.h" +#include "bmz8.h" +#include "cmph_structs.h" +#include "bmz8_structs.h" +#include "hash.h" +#include "vqueue.h" +#include "bitbool.h" +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int bmz8_gen_edges(cmph_config_t *mph); +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint32 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint32 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited); +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited); + +bmz8_config_data_t *bmz8_config_new(void) +{ + bmz8_config_data_t *bmz8; + bmz8 = (bmz8_config_data_t *)malloc(sizeof(bmz8_config_data_t)); + assert(bmz8); + memset(bmz8, 0, sizeof(bmz8_config_data_t)); + bmz8->hashfuncs[0] = CMPH_HASH_JENKINS; + bmz8->hashfuncs[1] = CMPH_HASH_JENKINS; + bmz8->g = NULL; + bmz8->graph = NULL; + bmz8->hashes = NULL; + return bmz8; +} + +void bmz8_config_destroy(cmph_config_t *mph) +{ + bmz8_config_data_t *data = (bmz8_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint8 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //bmz8 only uses two hash functions + bmz8->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *bmz8_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + bmz8_data_t *bmz8f = NULL; + cmph_uint8 i; + cmph_uint8 iterations; + cmph_uint8 iterations_map = 20; + cmph_uint8 *used_edges = NULL; + cmph_uint8 restart_mapping = 0; + cmph_uint8 * visited = NULL; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + + if (mph->key_source->nkeys >= 256) + { + if (mph->verbosity) fprintf(stderr, "The number of keys in BMZ8 must be lower than 256.\n"); + return NULL; + } + if (c == 0) c = 1.15; // validating restrictions over parameter c. + DEBUGP("c: %f\n", c); + bmz8->m = (cmph_uint8) mph->key_source->nkeys; + bmz8->n = (cmph_uint8) ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", bmz8->m, bmz8->n, c); + bmz8->graph = graph_new(bmz8->n, bmz8->m); + DEBUGP("Created graph\n"); + + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) bmz8->hashes[i] = NULL; + + do + { + // Mapping step + cmph_uint8 biggest_g_value = 0; + cmph_uint8 biggest_edge_value = 1; + iterations = 100; + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", bmz8->m, bmz8->n); + } + while(1) + { + int ok; + DEBUGP("hash function 1\n"); + bmz8->hashes[0] = hash_state_new(bmz8->hashfuncs[0], bmz8->n); + DEBUGP("hash function 2\n"); + bmz8->hashes[1] = hash_state_new(bmz8->hashfuncs[1], bmz8->n); + DEBUGP("Generating edges\n"); + ok = bmz8_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(bmz8->hashes[0]); + bmz8->hashes[0] = NULL; + hash_state_destroy(bmz8->hashes[1]); + bmz8->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "simple graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(bmz8->graph); + return NULL; + } + + // Ordering step + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + + graph_obtain_critical_nodes(bmz8->graph); + + // Searching step + if (mph->verbosity) + { + fprintf(stderr, "Starting Searching step.\n"); + fprintf(stderr, "\tTraversing critical vertices.\n"); + } + DEBUGP("Searching step\n"); + visited = (cmph_uint8 *)malloc((size_t)bmz8->n/8 + 1); + memset(visited, 0, (size_t)bmz8->n/8 + 1); + used_edges = (cmph_uint8 *)malloc((size_t)bmz8->m/8 + 1); + memset(used_edges, 0, (size_t)bmz8->m/8 + 1); + free(bmz8->g); + bmz8->g = (cmph_uint8 *)calloc((size_t)bmz8->n, sizeof(cmph_uint8)); + assert(bmz8->g); + for (i = 0; i < bmz8->n; ++i) // critical nodes + { + if (graph_node_is_critical(bmz8->graph, i) && (!GETBIT(visited,i))) + { + if(c > 1.14) restart_mapping = bmz8_traverse_critical_nodes(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + else restart_mapping = bmz8_traverse_critical_nodes_heuristic(bmz8, i, &biggest_g_value, &biggest_edge_value, used_edges, visited); + if(restart_mapping) break; + } + } + if(!restart_mapping) + { + if (mph->verbosity) + { + fprintf(stderr, "\tTraversing non critical vertices.\n"); + } + bmz8_traverse_non_critical_nodes(bmz8, used_edges, visited); // non_critical_nodes + } + else + { + iterations_map--; + if (mph->verbosity) fprintf(stderr, "Restarting mapping step. %u iterations remaining.\n", iterations_map); + } + + free(used_edges); + free(visited); + + }while(restart_mapping && iterations_map > 0); + graph_destroy(bmz8->graph); + bmz8->graph = NULL; + if (iterations_map == 0) + { + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + bmz8f = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + bmz8f->g = bmz8->g; + bmz8->g = NULL; //transfer memory ownership + bmz8f->hashes = bmz8->hashes; + bmz8->hashes = NULL; //transfer memory ownership + bmz8f->n = bmz8->n; + bmz8f->m = bmz8->m; + mphf->data = bmz8f; + mphf->size = bmz8->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static cmph_uint8 bmz8_traverse_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint32 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; /* Auxiliary vertex */ + cmph_uint32 lav; /* lookahead vertex */ + cmph_uint8 collision; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)(ceil ((double)(*biggest_edge_value)/2) - 1); + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); /* next_g is incremented in the do..while statement*/ + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + collision = 1; + while(collision) // lookahead to resolve collisions + { + next_g = (cmph_uint8)(*biggest_g_value + 1); + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, (next_g + bmz8->g[lav]))) + { + collision = 1; + break; + } + } + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,(next_g + bmz8->g[lav])); + + if(next_g + bmz8->g[lav] > *biggest_edge_value) + *biggest_edge_value = (cmph_uint8)(next_g + bmz8->g[lav]); + } + } + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited,u); + vqueue_insert(q, u); + } + } + + } + vqueue_destroy(q); + return 0; +} + +static cmph_uint8 bmz8_traverse_critical_nodes_heuristic(bmz8_config_data_t *bmz8, cmph_uint32 v, cmph_uint8 * biggest_g_value, cmph_uint8 * biggest_edge_value, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + cmph_uint8 next_g; + cmph_uint32 u; + cmph_uint32 lav; + cmph_uint8 collision; + cmph_uint8 * unused_g_values = NULL; + cmph_uint8 unused_g_values_capacity = 0; + cmph_uint8 nunused_g_values = 0; + vqueue_t * q = vqueue_new((cmph_uint32)(graph_ncritical_nodes(bmz8->graph))); + graph_iterator_t it, it1; + + DEBUGP("Labelling critical vertices\n"); + bmz8->g[v] = (cmph_uint8)(ceil ((double)(*biggest_edge_value)/2) - 1); + SETBIT(visited, v); + next_g = (cmph_uint8)floor((double)(*biggest_edge_value/2)); + vqueue_insert(q, v); + while(!vqueue_is_empty(q)) + { + v = vqueue_remove(q); + it = graph_neighbors_it(bmz8->graph, v); + while ((u = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, u) && (!GETBIT(visited,u))) + { + cmph_uint8 next_g_index = 0; + collision = 1; + while(collision) // lookahead to resolve collisions + { + if (next_g_index < nunused_g_values) + { + next_g = unused_g_values[next_g_index++]; + } + else + { + next_g = (cmph_uint8)(*biggest_g_value + 1); + next_g_index = 255;//UINT_MAX; + } + it1 = graph_neighbors_it(bmz8->graph, u); + collision = 0; + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited,lav)) + { + if(next_g + bmz8->g[lav] >= bmz8->m) + { + vqueue_destroy(q); + free(unused_g_values); + return 1; // restart mapping step. + } + if (GETBIT(used_edges, (next_g + bmz8->g[lav]))) + { + collision = 1; + break; + } + } + } + if(collision && (next_g > *biggest_g_value)) // saving the current g value stored in next_g. + { + if(nunused_g_values == unused_g_values_capacity) + { + unused_g_values = (cmph_uint8*)realloc(unused_g_values, ((size_t)(unused_g_values_capacity + BUFSIZ))*sizeof(cmph_uint8)); + unused_g_values_capacity += (cmph_uint8)BUFSIZ; + } + unused_g_values[nunused_g_values++] = next_g; + + } + if (next_g > *biggest_g_value) *biggest_g_value = next_g; + } + + next_g_index--; + if (next_g_index < nunused_g_values) unused_g_values[next_g_index] = unused_g_values[--nunused_g_values]; + + // Marking used edges... + it1 = graph_neighbors_it(bmz8->graph, u); + while((lav = graph_next_neighbor(bmz8->graph, &it1)) != GRAPH_NO_NEIGHBOR) + { + if (graph_node_is_critical(bmz8->graph, lav) && GETBIT(visited, lav)) + { + SETBIT(used_edges,(next_g + bmz8->g[lav])); + if(next_g + bmz8->g[lav] > *biggest_edge_value) + *biggest_edge_value = (cmph_uint8)(next_g + bmz8->g[lav]); + } + } + + bmz8->g[u] = next_g; // Labelling vertex u. + SETBIT(visited, u); + vqueue_insert(q, u); + + } + } + + } + vqueue_destroy(q); + free(unused_g_values); + return 0; +} + +static cmph_uint8 next_unused_edge(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint32 unused_edge_index) +{ + while(1) + { + assert(unused_edge_index < bmz8->m); + if(GETBIT(used_edges, unused_edge_index)) unused_edge_index ++; + else break; + } + return (cmph_uint8)unused_edge_index; +} + +static void bmz8_traverse(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint32 v, cmph_uint8 * unused_edge_index, cmph_uint8 * visited) +{ + graph_iterator_t it = graph_neighbors_it(bmz8->graph, v); + cmph_uint32 neighbor = 0; + while((neighbor = graph_next_neighbor(bmz8->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + if(GETBIT(visited,neighbor)) continue; + //DEBUGP("Visiting neighbor %u\n", neighbor); + *unused_edge_index = next_unused_edge(bmz8, used_edges, *unused_edge_index); + bmz8->g[neighbor] = (cmph_uint8)(*unused_edge_index - bmz8->g[v]); + //if (bmz8->g[neighbor] >= bmz8->m) bmz8->g[neighbor] += bmz8->m; + SETBIT(visited, neighbor); + (*unused_edge_index)++; + bmz8_traverse(bmz8, used_edges, neighbor, unused_edge_index, visited); + + } +} + +static void bmz8_traverse_non_critical_nodes(bmz8_config_data_t *bmz8, cmph_uint8 * used_edges, cmph_uint8 * visited) +{ + + cmph_uint8 i, v1, v2, unused_edge_index = 0; + DEBUGP("Labelling non critical vertices\n"); + for(i = 0; i < bmz8->m; i++) + { + v1 = (cmph_uint8)graph_vertex_id(bmz8->graph, i, 0); + v2 = (cmph_uint8)graph_vertex_id(bmz8->graph, i, 1); + if((GETBIT(visited,v1) && GETBIT(visited,v2)) || (!GETBIT(visited,v1) && !GETBIT(visited,v2))) continue; + if(GETBIT(visited,v1)) bmz8_traverse(bmz8, used_edges, v1, &unused_edge_index, visited); + else bmz8_traverse(bmz8, used_edges, v2, &unused_edge_index, visited); + + } + + for(i = 0; i < bmz8->n; i++) + { + if(!GETBIT(visited,i)) + { + bmz8->g[i] = 0; + SETBIT(visited, i); + bmz8_traverse(bmz8, used_edges, i, &unused_edge_index, visited); + } + } + +} + +static int bmz8_gen_edges(cmph_config_t *mph) +{ + cmph_uint8 e; + bmz8_config_data_t *bmz8 = (bmz8_config_data_t *)mph->data; + cmph_uint8 multiple_edges = 0; + DEBUGP("Generating edges for %u vertices\n", bmz8->n); + graph_clear_edges(bmz8->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint8 h1, h2; + cmph_uint32 keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + +// if (key == NULL)fprintf(stderr, "key = %s -- read BMZ\n", key); + h1 = (cmph_uint8)(hash(bmz8->hashes[0], key, keylen) % bmz8->n); + h2 = (cmph_uint8)(hash(bmz8->hashes[1], key, keylen) % bmz8->n); + if (h1 == h2) if (++h2 >= bmz8->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + //DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); +// fprintf(stderr, "key = %s -- dispose BMZ\n", key); + multiple_edges = graph_contains_edge(bmz8->graph, h1, h2); + if (mph->verbosity && multiple_edges) fprintf(stderr, "A non simple graph was generated\n"); + if (multiple_edges) return 0; // checking multiple edge restriction. + graph_add_edge(bmz8->graph, h1, h2); + } + return !multiple_edges; +} + +int bmz8_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 two = 2; //number of hash functions + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + register size_t nbytes; + __cmph_dump(mphf, fd); + + nbytes = fwrite(&two, sizeof(cmph_uint8), (size_t)1, fd); + + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->n), sizeof(cmph_uint8), (size_t)1, fd); + nbytes = fwrite(&(data->m), sizeof(cmph_uint8), (size_t)1, fd); + + nbytes = fwrite(data->g, sizeof(cmph_uint8)*(data->n), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } +/* #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif*/ + return 1; +} + +void bmz8_load(FILE *f, cmph_t *mphf) +{ + cmph_uint8 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint8 i; + register size_t nbytes; + bmz8_data_t *bmz8 = (bmz8_data_t *)malloc(sizeof(bmz8_data_t)); + + DEBUGP("Loading bmz8 mphf\n"); + mphf->data = bmz8; + nbytes = fread(&nhashes, sizeof(cmph_uint8), (size_t)1, f); + bmz8->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(size_t)(nhashes + 1)); + bmz8->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + state = hash_state_load(buf, buflen); + bmz8->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + nbytes = fread(&(bmz8->n), sizeof(cmph_uint8), (size_t)1, f); + nbytes = fread(&(bmz8->m), sizeof(cmph_uint8), (size_t)1, f); + + bmz8->g = (cmph_uint8 *)malloc(sizeof(cmph_uint8)*bmz8->n); + nbytes = fread(bmz8->g, bmz8->n*sizeof(cmph_uint8), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return; + } + + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < bmz8->n; ++i) fprintf(stderr, "%u ", bmz8->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + bmz8_data_t *bmz8 = mphf->data; + cmph_uint8 h1 = (cmph_uint8)(hash(bmz8->hashes[0], key, keylen) % bmz8->n); + cmph_uint8 h2 = (cmph_uint8)(hash(bmz8->hashes[1], key, keylen) % bmz8->n); + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > bmz8->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, bmz8->g[h1], bmz8->g[h2], bmz8->m); + return (cmph_uint8)(bmz8->g[h1] + bmz8->g[h2]); +} +void bmz8_destroy(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} + +/** \fn void bmz8_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bmz8_pack(cmph_t *mphf, void *packed_mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + CMPH_HASH h2_type; + + // packing h1 type + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + *((cmph_uint32 *) ptr) = h1_type; + ptr += sizeof(cmph_uint32); + + // packing h1 + hash_state_pack(data->hashes[0], ptr); + ptr += hash_state_packed_size(h1_type); + + // packing h2 type + h2_type = hash_get_type(data->hashes[1]); + *((cmph_uint32 *) ptr) = h2_type; + ptr += sizeof(cmph_uint32); + + // packing h2 + hash_state_pack(data->hashes[1], ptr); + ptr += hash_state_packed_size(h2_type); + + // packing n + *ptr++ = data->n; + + // packing g + memcpy(ptr, data->g, sizeof(cmph_uint8)*data->n); +} + +/** \fn cmph_uint32 bmz8_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bmz8_packed_size(cmph_t *mphf) +{ + bmz8_data_t *data = (bmz8_data_t *)mphf->data; + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + CMPH_HASH h2_type = hash_get_type(data->hashes[1]); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_packed_size(h1_type) + hash_state_packed_size(h2_type) + + 2*sizeof(cmph_uint32) + sizeof(cmph_uint8) + sizeof(cmph_uint8)*data->n); +} + +/** cmph_uint8 bmz8_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint8 bmz8_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint8 *h1_ptr = packed_mphf; + register CMPH_HASH h1_type = *((cmph_uint32 *)h1_ptr); + register cmph_uint8 *h2_ptr; + register CMPH_HASH h2_type; + register cmph_uint8 *g_ptr, n, h1, h2; + + h1_ptr += 4; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + h2_type = *((cmph_uint32 *)h2_ptr); + h2_ptr += 4; + + g_ptr = h2_ptr + hash_state_packed_size(h2_type); + + n = *g_ptr++; + + h1 = (cmph_uint8)(hash_packed(h1_ptr, h1_type, key, keylen) % n); + h2 = (cmph_uint8)(hash_packed(h2_ptr, h2_type, key, keylen) % n); + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 > n) h2 = 0; + return (cmph_uint8)(g_ptr[h1] + g_ptr[h2]); +} diff --git a/girepository/cmph/bmz8.h b/girepository/cmph/bmz8.h new file mode 100644 index 0000000..99f7e30 --- /dev/null +++ b/girepository/cmph/bmz8.h @@ -0,0 +1,42 @@ +#ifndef __CMPH_BMZ8_H__ +#define __CMPH_BMZ8_H__ + +#include "cmph.h" + +typedef struct __bmz8_data_t bmz8_data_t; +typedef struct __bmz8_config_data_t bmz8_config_data_t; + +bmz8_config_data_t *bmz8_config_new(void); +void bmz8_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void bmz8_config_destroy(cmph_config_t *mph); +cmph_t *bmz8_new(cmph_config_t *mph, double c); + +void bmz8_load(FILE *f, cmph_t *mphf); +int bmz8_dump(cmph_t *mphf, FILE *f); +void bmz8_destroy(cmph_t *mphf); +cmph_uint8 bmz8_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void bmz8_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void bmz8_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 bmz8_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 bmz8_packed_size(cmph_t *mphf); + +/** cmph_uint8 bmz8_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint8 bmz8_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/bmz8_structs.h b/girepository/cmph/bmz8_structs.h new file mode 100644 index 0000000..408b529 --- /dev/null +++ b/girepository/cmph/bmz8_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ8_STRUCTS_H__ +#define __CMPH_BMZ8_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz8_data_t +{ + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + cmph_uint8 *g; + hash_state_t **hashes; +}; + + +struct __bmz8_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint8 m; //edges (words) count + cmph_uint8 n; //vertex count + graph_t *graph; + cmph_uint8 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/girepository/cmph/bmz_structs.h b/girepository/cmph/bmz_structs.h new file mode 100644 index 0000000..67065a0 --- /dev/null +++ b/girepository/cmph/bmz_structs.h @@ -0,0 +1,25 @@ +#ifndef __CMPH_BMZ_STRUCTS_H__ +#define __CMPH_BMZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __bmz_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + hash_state_t **hashes; +}; + + +struct __bmz_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + graph_t *graph; + cmph_uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/girepository/cmph/brz.c b/girepository/cmph/brz.c new file mode 100644 index 0000000..bd01789 --- /dev/null +++ b/girepository/cmph/brz.c @@ -0,0 +1,1005 @@ +#include "graph.h" +#include "fch.h" +#include "fch_structs.h" +#include "bmz8.h" +#include "bmz8_structs.h" +#include "brz.h" +#include "cmph_structs.h" +#include "brz_structs.h" +#include "buffer_manager.h" +#include "cmph.h" +#include "hash.h" +#include "bitbool.h" +#include +#include +#include +#include +#include +#include +#include +#define MAX_BUCKET_SIZE 255 +//#define DEBUG +#include "debug.h" + + +static int brz_gen_mphf(cmph_config_t *mph); +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n); +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint32 nkeys); +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen); +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen); +brz_config_data_t *brz_config_new(void) +{ + brz_config_data_t *brz = NULL; + brz = (brz_config_data_t *)malloc(sizeof(brz_config_data_t)); + brz->algo = CMPH_FCH; + brz->b = 128; + brz->hashfuncs[0] = CMPH_HASH_JENKINS; + brz->hashfuncs[1] = CMPH_HASH_JENKINS; + brz->hashfuncs[2] = CMPH_HASH_JENKINS; + brz->size = NULL; + brz->offset = NULL; + brz->g = NULL; + brz->h1 = NULL; + brz->h2 = NULL; + brz->h0 = NULL; + brz->memory_availability = 1024*1024; + brz->tmp_dir = (cmph_uint8 *)calloc((size_t)10, sizeof(cmph_uint8)); + brz->mphf_fd = NULL; + strcpy((char *)(brz->tmp_dir), "/var/tmp/"); + assert(brz); + return brz; +} + +void brz_config_destroy(cmph_config_t *mph) +{ + brz_config_data_t *data = (brz_config_data_t *)mph->data; + free(data->tmp_dir); + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //brz only uses three hash functions + brz->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(memory_availability > 0) brz->memory_availability = memory_availability*1024*1024; +} + +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(tmp_dir) + { + size_t len = strlen((char *)tmp_dir); + free(brz->tmp_dir); + if(tmp_dir[len-1] != '/') + { + brz->tmp_dir = (cmph_uint8 *)calloc((size_t)len+2, sizeof(cmph_uint8)); + sprintf((char *)(brz->tmp_dir), "%s/", (char *)tmp_dir); + } + else + { + brz->tmp_dir = (cmph_uint8 *)calloc((size_t)len+1, sizeof(cmph_uint8)); + sprintf((char *)(brz->tmp_dir), "%s", (char *)tmp_dir); + } + + } +} + +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->mphf_fd = mphf_fd; + assert(brz->mphf_fd); +} + +void brz_config_set_b(cmph_config_t *mph, cmph_uint32 b) +{ + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + if(b <= 64 || b >= 175) + { + b = 128; + } + brz->b = (cmph_uint8)b; +} + +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo == CMPH_BMZ8 || algo == CMPH_FCH) // supported algorithms + { + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + brz->algo = algo; + } +} + +cmph_t *brz_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + brz_data_t *brzf = NULL; + cmph_uint32 i; + cmph_uint32 iterations = 20; + brz_config_data_t *brz; + + DEBUGP("c: %f\n", c); + brz = (brz_config_data_t *)mph->data; + switch(brz->algo) // validating restrictions over parameter c. + { + case CMPH_BMZ8: + if (c == 0 || c >= 2.0) c = 1; + break; + case CMPH_FCH: + if (c <= 2.0) c = 2.6; + break; + default: + assert(0); + } + brz->c = c; + brz->m = mph->key_source->nkeys; + DEBUGP("m: %u\n", brz->m); + brz->k = (cmph_uint32)ceil(brz->m/((double)brz->b)); + DEBUGP("k: %u\n", brz->k); + brz->size = (cmph_uint8 *) calloc((size_t)brz->k, sizeof(cmph_uint8)); + + // Clustering the keys by graph id. + if (mph->verbosity) + { + fprintf(stderr, "Partitioning the set of keys.\n"); + } + + while(1) + { + int ok; + DEBUGP("hash function 3\n"); + brz->h0 = hash_state_new(brz->hashfuncs[2], brz->k); + DEBUGP("Generating graphs\n"); + ok = brz_gen_mphf(mph); + if (!ok) + { + --iterations; + hash_state_destroy(brz->h0); + brz->h0 = NULL; + DEBUGP("%u iterations remaining to create the graphs in a external file\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Failure: A graph with more than 255 keys was created - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + DEBUGP("Graphs with more than 255 keys were created in all 20 iterations\n"); + free(brz->size); + return NULL; + } + DEBUGP("Graphs generated\n"); + + brz->offset = (cmph_uint32 *)calloc((size_t)brz->k, sizeof(cmph_uint32)); + for (i = 1; i < brz->k; ++i) + { + brz->offset[i] = brz->size[i-1] + brz->offset[i-1]; + } + // Generating a mphf + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + brzf = (brz_data_t *)malloc(sizeof(brz_data_t)); + brzf->g = brz->g; + brz->g = NULL; //transfer memory ownership + brzf->h1 = brz->h1; + brz->h1 = NULL; //transfer memory ownership + brzf->h2 = brz->h2; + brz->h2 = NULL; //transfer memory ownership + brzf->h0 = brz->h0; + brz->h0 = NULL; //transfer memory ownership + brzf->size = brz->size; + brz->size = NULL; //transfer memory ownership + brzf->offset = brz->offset; + brz->offset = NULL; //transfer memory ownership + brzf->k = brz->k; + brzf->c = brz->c; + brzf->m = brz->m; + brzf->algo = brz->algo; + mphf->data = brzf; + mphf->size = brz->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static int brz_gen_mphf(cmph_config_t *mph) +{ + cmph_uint32 i, e, error; + brz_config_data_t *brz = (brz_config_data_t *)mph->data; + cmph_uint32 memory_usage = 0; + cmph_uint32 nkeys_in_buffer = 0; + cmph_uint8 *buffer = (cmph_uint8 *)malloc((size_t)brz->memory_availability); + cmph_uint32 *buckets_size = (cmph_uint32 *)calloc((size_t)brz->k, sizeof(cmph_uint32)); + cmph_uint32 *keys_index = NULL; + cmph_uint8 **buffer_merge = NULL; + cmph_uint32 *buffer_h0 = NULL; + cmph_uint32 nflushes = 0; + cmph_uint32 h0; + register size_t nbytes; + FILE * tmp_fd = NULL; + buffer_manager_t * buff_manager = NULL; + char *filename = NULL; + char *key = NULL; + cmph_uint32 keylen; + cmph_uint32 cur_bucket = 0; + cmph_uint8 nkeys_vd = 0; + cmph_uint8 ** keys_vd = NULL; + + mph->key_source->rewind(mph->key_source->data); + DEBUGP("Generating graphs from %u keys\n", brz->m); + // Partitioning + for (e = 0; e < brz->m; ++e) + { + mph->key_source->read(mph->key_source->data, &key, &keylen); + + /* Buffers management */ + if (memory_usage + keylen + sizeof(keylen) > brz->memory_availability) // flush buffers + { + cmph_uint32 value, sum, keylen1; + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } + value = buckets_size[0]; + sum = 0; + keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc((size_t)nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; + memory_usage += keylen1 + (cmph_uint32)sizeof(keylen1); + } + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); + tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; + for(i = 0; i < nkeys_in_buffer; i++) + { + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + nbytes = fwrite(buffer + keys_index[i], (size_t)1, keylen1 + sizeof(keylen1), tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + } + memcpy(buffer + memory_usage, &keylen, sizeof(keylen)); + memcpy(buffer + memory_usage + sizeof(keylen), key, (size_t)keylen); + memory_usage += keylen + (cmph_uint32)sizeof(keylen); + h0 = hash(brz->h0, key, keylen) % brz->k; + + if ((brz->size[h0] == MAX_BUCKET_SIZE) || (brz->algo == CMPH_BMZ8 && ((brz->c >= 1.0) && (cmph_uint8)(brz->c * brz->size[h0]) < brz->size[h0]))) + { + free(buffer); + free(buckets_size); + return 0; + } + brz->size[h0] = (cmph_uint8)(brz->size[h0] + 1U); + buckets_size[h0] ++; + nkeys_in_buffer++; + mph->key_source->dispose(mph->key_source->data, key, keylen); + } + if (memory_usage != 0) // flush buffers + { + cmph_uint32 value; + cmph_uint32 sum, keylen1; + if(mph->verbosity) + { + fprintf(stderr, "Flushing %u\n", nkeys_in_buffer); + } + value = buckets_size[0]; + sum = 0; + keylen1 = 0; + buckets_size[0] = 0; + for(i = 1; i < brz->k; i++) + { + if(buckets_size[i] == 0) continue; + sum += value; + value = buckets_size[i]; + buckets_size[i] = sum; + } + memory_usage = 0; + keys_index = (cmph_uint32 *)calloc((size_t)nkeys_in_buffer, sizeof(cmph_uint32)); + for(i = 0; i < nkeys_in_buffer; i++) + { + memcpy(&keylen1, buffer + memory_usage, sizeof(keylen1)); + h0 = hash(brz->h0, (char *)(buffer + memory_usage + sizeof(keylen1)), keylen1) % brz->k; + keys_index[buckets_size[h0]] = memory_usage; + buckets_size[h0]++; + memory_usage += keylen1 + (cmph_uint32)sizeof(keylen1); + } + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, nflushes); + tmp_fd = fopen(filename, "wb"); + free(filename); + filename = NULL; + for(i = 0; i < nkeys_in_buffer; i++) + { + memcpy(&keylen1, buffer + keys_index[i], sizeof(keylen1)); + nbytes = fwrite(buffer + keys_index[i], (size_t)1, keylen1 + sizeof(keylen1), tmp_fd); + } + nkeys_in_buffer = 0; + memory_usage = 0; + memset((void *)buckets_size, 0, brz->k*sizeof(cmph_uint32)); + nflushes++; + free(keys_index); + fclose(tmp_fd); + } + + free(buffer); + free(buckets_size); + if(nflushes > 1024) return 0; // Too many files generated. + // mphf generation + if(mph->verbosity) + { + fprintf(stderr, "\nMPHF generation \n"); + } + /* Starting to dump to disk the resultant MPHF: __cmph_dump function */ + nbytes = fwrite(cmph_names[CMPH_BRZ], (size_t)(strlen(cmph_names[CMPH_BRZ]) + 1), (size_t)1, brz->mphf_fd); + nbytes = fwrite(&(brz->m), sizeof(brz->m), (size_t)1, brz->mphf_fd); + nbytes = fwrite(&(brz->c), sizeof(double), (size_t)1, brz->mphf_fd); + nbytes = fwrite(&(brz->algo), sizeof(brz->algo), (size_t)1, brz->mphf_fd); + nbytes = fwrite(&(brz->k), sizeof(cmph_uint32), (size_t)1, brz->mphf_fd); // number of MPHFs + nbytes = fwrite(brz->size, sizeof(cmph_uint8)*(brz->k), (size_t)1, brz->mphf_fd); + if (nbytes == 0 && ferror(brz->mphf_fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + + //tmp_fds = (FILE **)calloc(nflushes, sizeof(FILE *)); + buff_manager = buffer_manager_new(brz->memory_availability, nflushes); + buffer_merge = (cmph_uint8 **)calloc((size_t)nflushes, sizeof(cmph_uint8 *)); + buffer_h0 = (cmph_uint32 *)calloc((size_t)nflushes, sizeof(cmph_uint32)); + + memory_usage = 0; + for(i = 0; i < nflushes; i++) + { + filename = (char *)calloc(strlen((char *)(brz->tmp_dir)) + 11, sizeof(char)); + sprintf(filename, "%s%u.cmph",brz->tmp_dir, i); + buffer_manager_open(buff_manager, i, filename); + free(filename); + filename = NULL; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + buffer_h0[i] = h0; + buffer_merge[i] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership + } + e = 0; + keys_vd = (cmph_uint8 **)calloc((size_t)MAX_BUCKET_SIZE, sizeof(cmph_uint8 *)); + nkeys_vd = 0; + error = 0; + while(e < brz->m) + { + i = brz_min_index(buffer_h0, nflushes); + cur_bucket = buffer_h0[i]; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + if(key) + { + while(key) + { + //keylen = strlen(key); + h0 = hash(brz->h0, key+sizeof(keylen), keylen) % brz->k; + if (h0 != buffer_h0[i]) break; + keys_vd[nkeys_vd++] = (cmph_uint8 *)key; + key = NULL; //transfer memory ownership + e++; + key = (char *)buffer_manager_read_key(buff_manager, i, &keylen); + } + if (key) + { + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership + e++; + buffer_h0[i] = h0; + buffer_merge[i] = (cmph_uint8 *)key; + } + } + if(!key) + { + assert(nkeys_vd < brz->size[cur_bucket]); + keys_vd[nkeys_vd++] = buffer_merge[i]; + buffer_merge[i] = NULL; //transfer memory ownership + e++; + buffer_h0[i] = UINT_MAX; + } + + if(nkeys_vd == brz->size[cur_bucket]) // Generating mphf for each bucket. + { + cmph_io_adapter_t *source = NULL; + cmph_config_t *config = NULL; + cmph_t *mphf_tmp = NULL; + char *bufmphf = NULL; + cmph_uint32 buflenmphf = 0; + // Source of keys + source = cmph_io_byte_vector_adapter(keys_vd, (cmph_uint32)nkeys_vd); + config = cmph_config_new(source); + cmph_config_set_algo(config, brz->algo); + //cmph_config_set_algo(config, CMPH_BMZ8); + cmph_config_set_graphsize(config, brz->c); + mphf_tmp = cmph_new(config); + if (mphf_tmp == NULL) + { + if(mph->verbosity) fprintf(stderr, "ERROR: Can't generate MPHF for bucket %u out of %u\n", cur_bucket + 1, brz->k); + error = 1; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_io_byte_vector_adapter_destroy(source); + break; + } + if(mph->verbosity) + { + if (cur_bucket % 1000 == 0) + { + fprintf(stderr, "MPHF for bucket %u out of %u was generated.\n", cur_bucket + 1, brz->k); + } + } + switch(brz->algo) + { + case CMPH_FCH: + { + fch_data_t * fchf = NULL; + fchf = (fch_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_fch_mphf(brz, fchf, cur_bucket, &buflenmphf); + } + break; + case CMPH_BMZ8: + { + bmz8_data_t * bmzf = NULL; + bmzf = (bmz8_data_t *)mphf_tmp->data; + bufmphf = brz_copy_partial_bmz8_mphf(brz, bmzf, cur_bucket, &buflenmphf); + } + break; + default: assert(0); + } + nbytes = fwrite(bufmphf, (size_t)buflenmphf, (size_t)1, brz->mphf_fd); + free(bufmphf); + bufmphf = NULL; + cmph_config_destroy(config); + brz_destroy_keys_vd(keys_vd, nkeys_vd); + cmph_destroy(mphf_tmp); + cmph_io_byte_vector_adapter_destroy(source); + nkeys_vd = 0; + } + } + buffer_manager_destroy(buff_manager); + free(keys_vd); + free(buffer_merge); + free(buffer_h0); + if (error) return 0; + return 1; +} + +static cmph_uint32 brz_min_index(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, min_index = 0; + for(i = 1; i < n; i++) + { + if(vector[i] < vector[min_index]) min_index = i; + } + return min_index; +} + +static void brz_destroy_keys_vd(cmph_uint8 ** keys_vd, cmph_uint32 nkeys) +{ + cmph_uint8 i; + for(i = 0; i < nkeys; i++) { free(keys_vd[i]); keys_vd[i] = NULL;} +} + +static char * brz_copy_partial_fch_mphf(brz_config_data_t *brz, fch_data_t * fchf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 i = 0; + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = fchf->b;//brz->size[index]; + hash_state_dump(fchf->h1, &bufh1, &buflenh1); + hash_state_dump(fchf->h2, &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2U * (cmph_uint32)sizeof(cmph_uint32); + buf = (char *)malloc((size_t)(*buflen)); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, (size_t)buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, (size_t)buflenh2); + for (i = 0; i < n; i++) memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2+i,(fchf->g + i), (size_t)1); + free(bufh1); + free(bufh2); + return buf; +} +static char * brz_copy_partial_bmz8_mphf(brz_config_data_t *brz, bmz8_data_t * bmzf, cmph_uint32 index, cmph_uint32 *buflen) +{ + cmph_uint32 buflenh1 = 0; + cmph_uint32 buflenh2 = 0; + char * bufh1 = NULL; + char * bufh2 = NULL; + char * buf = NULL; + cmph_uint32 n = (cmph_uint32)ceil(brz->c * brz->size[index]); + hash_state_dump(bmzf->hashes[0], &bufh1, &buflenh1); + hash_state_dump(bmzf->hashes[1], &bufh2, &buflenh2); + *buflen = buflenh1 + buflenh2 + n + 2U * (cmph_uint32)sizeof(cmph_uint32); + buf = (char *)malloc((size_t)(*buflen)); + memcpy(buf, &buflenh1, sizeof(cmph_uint32)); + memcpy(buf+sizeof(cmph_uint32), bufh1, (size_t)buflenh1); + memcpy(buf+sizeof(cmph_uint32)+buflenh1, &buflenh2, sizeof(cmph_uint32)); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1, bufh2, (size_t)buflenh2); + memcpy(buf+2*sizeof(cmph_uint32)+buflenh1+buflenh2,bmzf->g, (size_t)n); + free(bufh1); + free(bufh2); + return buf; +} + + +int brz_dump(cmph_t *mphf, FILE *fd) +{ + brz_data_t *data = (brz_data_t *)mphf->data; + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + DEBUGP("Dumping brzf\n"); + // The initial part of the MPHF have already been dumped to disk during construction + // Dumping h0 + hash_state_dump(data->h0, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + // Dumping m and the vector offset. + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(data->offset, sizeof(cmph_uint32)*(data->k), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + return 1; +} + +void brz_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + cmph_uint32 i, n; + brz_data_t *brz = (brz_data_t *)malloc(sizeof(brz_data_t)); + + DEBUGP("Loading brz mphf\n"); + mphf->data = brz; + nbytes = fread(&(brz->c), sizeof(double), (size_t)1, f); + nbytes = fread(&(brz->algo), sizeof(brz->algo), (size_t)1, f); // Reading algo. + nbytes = fread(&(brz->k), sizeof(cmph_uint32), (size_t)1, f); + brz->size = (cmph_uint8 *) malloc(sizeof(cmph_uint8)*brz->k); + nbytes = fread(brz->size, sizeof(cmph_uint8)*(brz->k), (size_t)1, f); + brz->h1 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->h2 = (hash_state_t **)malloc(sizeof(hash_state_t *)*brz->k); + brz->g = (cmph_uint8 **) calloc((size_t)brz->k, sizeof(cmph_uint8 *)); + DEBUGP("Reading c = %f k = %u algo = %u \n", brz->c, brz->k, brz->algo); + //loading h_i1, h_i2 and g_i. + for(i = 0; i < brz->k; i++) + { + // h1 + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state 1 has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + brz->h1[i] = hash_state_load(buf, buflen); + free(buf); + //h2 + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state 2 has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + brz->h2[i] = hash_state_load(buf, buflen); + free(buf); + switch(brz->algo) + { + case CMPH_FCH: + n = fch_calc_b(brz->c, brz->size[i]); + break; + case CMPH_BMZ8: + n = (cmph_uint32)ceil(brz->c * brz->size[i]); + break; + default: assert(0); + } + DEBUGP("g_i has %u bytes\n", n); + brz->g[i] = (cmph_uint8 *)calloc((size_t)n, sizeof(cmph_uint8)); + nbytes = fread(brz->g[i], sizeof(cmph_uint8)*n, (size_t)1, f); + } + //loading h0 + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + brz->h0 = hash_state_load(buf, buflen); + free(buf); + + //loading c, m, and the vector offset. + nbytes = fread(&(brz->m), sizeof(cmph_uint32), (size_t)1, f); + brz->offset = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*brz->k); + nbytes = fread(brz->offset, sizeof(cmph_uint32)*(brz->k), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } + + return; +} + +static cmph_uint32 brz_bmz8_search(brz_data_t *brz, const char *key, cmph_uint32 keylen, cmph_uint32 * fingerprint) +{ + register cmph_uint32 h0; + register cmph_uint32 m, n, h1, h2; + register cmph_uint8 mphf_bucket; + + hash_vector(brz->h0, key, keylen, fingerprint); + h0 = fingerprint[2] % brz->k; + + m = brz->size[h0]; + n = (cmph_uint32)ceil(brz->c * m); + h1 = hash(brz->h1[h0], key, keylen) % n; + h2 = hash(brz->h2[h0], key, keylen) % n; + + if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = (cmph_uint8)(brz->g[h0][h1] + brz->g[h0][h2]); + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("key: %s g[h1]: %u g[h2]: %u offset[h0]: %u edges: %u\n", key, brz->g[h0][h1], brz->g[h0][h2], brz->offset[h0], brz->m); + DEBUGP("Address: %u\n", mphf_bucket + brz->offset[h0]); + return (mphf_bucket + brz->offset[h0]); +} + +static cmph_uint32 brz_fch_search(brz_data_t *brz, const char *key, cmph_uint32 keylen, cmph_uint32 * fingerprint) +{ + register cmph_uint32 h0; + register cmph_uint32 m, b, h1, h2; + register double p1, p2; + register cmph_uint8 mphf_bucket; + + hash_vector(brz->h0, key, keylen, fingerprint); + h0 = fingerprint[2] % brz->k; + + m = brz->size[h0]; + b = fch_calc_b(brz->c, m); + p1 = fch_calc_p1(m); + p2 = fch_calc_p2(b); + h1 = hash(brz->h1[h0], key, keylen) % m; + h2 = hash(brz->h2[h0], key, keylen) % m; + mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (cmph_uint8)((h2 + brz->g[h0][h1]) % m); + return (mphf_bucket + brz->offset[h0]); +} + +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + brz_data_t *brz = mphf->data; + cmph_uint32 fingerprint[3]; + switch(brz->algo) + { + case CMPH_FCH: + return brz_fch_search(brz, key, keylen, fingerprint); + case CMPH_BMZ8: + return brz_bmz8_search(brz, key, keylen, fingerprint); + default: assert(0); + } + return 0; +} +void brz_destroy(cmph_t *mphf) +{ + cmph_uint32 i; + brz_data_t *data = (brz_data_t *)mphf->data; + if(data->g) + { + for(i = 0; i < data->k; i++) + { + free(data->g[i]); + hash_state_destroy(data->h1[i]); + hash_state_destroy(data->h2[i]); + } + free(data->g); + free(data->h1); + free(data->h2); + } + hash_state_destroy(data->h0); + free(data->size); + free(data->offset); + free(data); + free(mphf); +} + +/** \fn void brz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void brz_pack(cmph_t *mphf, void *packed_mphf) +{ + brz_data_t *data = (brz_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + cmph_uint32 i,n; + CMPH_HASH h0_type, h1_type, h2_type; + uintptr_t *g_is_ptr; + cmph_uint8 * g_i; + + // packing internal algo type + memcpy(ptr, &(data->algo), sizeof(data->algo)); + ptr += sizeof(data->algo); + + // packing h0 type + h0_type = hash_get_type(data->h0); + memcpy(ptr, &h0_type, sizeof(h0_type)); + ptr += sizeof(h0_type); + + // packing h0 + hash_state_pack(data->h0, ptr); + ptr += hash_state_packed_size(h0_type); + + // packing k + memcpy(ptr, &(data->k), sizeof(data->k)); + ptr += sizeof(data->k); + + // packing c + *((cmph_uint64 *)ptr) = (cmph_uint64)data->c; + ptr += sizeof(data->c); + + // packing h1 type + h1_type = hash_get_type(data->h1[0]); + memcpy(ptr, &h1_type, sizeof(h1_type)); + ptr += sizeof(h1_type); + + // packing h2 type + h2_type = hash_get_type(data->h2[0]); + memcpy(ptr, &h2_type, sizeof(h2_type)); + ptr += sizeof(h2_type); + + // packing size + memcpy(ptr, data->size, sizeof(cmph_uint8)*data->k); + ptr += data->k; + + // packing offset + memcpy(ptr, data->offset, sizeof(cmph_uint32)*data->k); + ptr += sizeof(cmph_uint32)*data->k; + + g_is_ptr = (uintptr_t *)ptr; + + g_i = (cmph_uint8 *) (g_is_ptr + data->k); + + for(i = 0; i < data->k; i++) + { + *g_is_ptr++ = (uintptr_t)g_i; + // packing h1[i] + hash_state_pack(data->h1[i], g_i); + g_i += hash_state_packed_size(h1_type); + + // packing h2[i] + hash_state_pack(data->h2[i], g_i); + g_i += hash_state_packed_size(h2_type); + + // packing g_i + switch(data->algo) + { + case CMPH_FCH: + n = fch_calc_b(data->c, data->size[i]); + break; + case CMPH_BMZ8: + n = (cmph_uint32)ceil(data->c * data->size[i]); + break; + default: assert(0); + } + memcpy(g_i, data->g[i], sizeof(cmph_uint8)*n); + g_i += n; + + } + +} + +/** \fn cmph_uint32 brz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 brz_packed_size(cmph_t *mphf) +{ + cmph_uint32 i; + cmph_uint32 size = 0; + brz_data_t *data = (brz_data_t *)mphf->data; + CMPH_HASH h0_type = hash_get_type(data->h0); + CMPH_HASH h1_type = hash_get_type(data->h1[0]); + CMPH_HASH h2_type = hash_get_type(data->h2[0]); + cmph_uint32 n; + size = (cmph_uint32)(2*sizeof(CMPH_ALGO) + 3*sizeof(CMPH_HASH) + hash_state_packed_size(h0_type) + sizeof(cmph_uint32) + + sizeof(double) + sizeof(cmph_uint8)*data->k + sizeof(cmph_uint32)*data->k); + // pointers to g_is + size += (cmph_uint32) sizeof(uintptr_t) * data->k; + size += hash_state_packed_size(h1_type) * data->k; + size += hash_state_packed_size(h2_type) * data->k; + + n = 0; + for(i = 0; i < data->k; i++) + { + switch(data->algo) + { + case CMPH_FCH: + n = fch_calc_b(data->c, data->size[i]); + break; + case CMPH_BMZ8: + n = (cmph_uint32)ceil(data->c * data->size[i]); + break; + default: assert(0); + } + size += n; + } + return size; +} + + + +static cmph_uint32 brz_bmz8_search_packed(cmph_uint32 *packed_mphf, const char *key, cmph_uint32 keylen, cmph_uint32 * fingerprint) +{ + register CMPH_HASH h0_type = *packed_mphf++; + register cmph_uint32 *h0_ptr = packed_mphf; + register cmph_uint32 k, h0, m, n, h1, h2; + register cmph_uint32 *offset; + register double c; + register CMPH_HASH h1_type, h2_type; + register cmph_uint8 * size; + register uintptr_t *g_is_ptr; + register cmph_uint8 *h1_ptr, *h2_ptr, *g; + register cmph_uint8 mphf_bucket; + + packed_mphf = (cmph_uint32 *)(((cmph_uint8 *)packed_mphf) + hash_state_packed_size(h0_type)); + + k = *packed_mphf++; + + c = (double)(*((cmph_uint64*)packed_mphf)); + packed_mphf += 2; + + h1_type = *packed_mphf++; + + h2_type = *packed_mphf++; + + size = (cmph_uint8 *) packed_mphf; + packed_mphf = (cmph_uint32 *)(size + k); + + offset = packed_mphf; + packed_mphf += k; + + + hash_vector_packed(h0_ptr, h0_type, key, keylen, fingerprint); + h0 = fingerprint[2] % k; + + m = size[h0]; + n = (cmph_uint32)ceil(c * m); + + g_is_ptr = (uintptr_t *)packed_mphf; + + h1_ptr = (cmph_uint8 *) g_is_ptr[h0]; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + + g = h2_ptr + hash_state_packed_size(h2_type); + + h1 = hash_packed(h1_ptr, h1_type, key, keylen) % n; + h2 = hash_packed(h2_ptr, h2_type, key, keylen) % n; + + if (h1 == h2 && ++h2 >= n) h2 = 0; + mphf_bucket = (cmph_uint8)(g[h1] + g[h2]); + DEBUGP("key: %s h1: %u h2: %u h0: %u\n", key, h1, h2, h0); + DEBUGP("Address: %u\n", mphf_bucket + offset[h0]); + return (mphf_bucket + offset[h0]); +} + +static cmph_uint32 brz_fch_search_packed(cmph_uint32 *packed_mphf, const char *key, cmph_uint32 keylen, cmph_uint32 * fingerprint) +{ + register CMPH_HASH h0_type = *packed_mphf++; + + register cmph_uint32 *h0_ptr = packed_mphf; + register cmph_uint32 k, h0, m, b, h1, h2; + register double c, p1, p2; + register CMPH_HASH h1_type, h2_type; + register cmph_uint8 *size, *h1_ptr, *h2_ptr, *g; + register cmph_uint32 *offset; + register uintptr_t *g_is_ptr; + register cmph_uint8 mphf_bucket; + + packed_mphf = (cmph_uint32 *)(((cmph_uint8 *)packed_mphf) + hash_state_packed_size(h0_type)); + + k = *packed_mphf++; + + c = (double)(*((cmph_uint64*)packed_mphf)); + packed_mphf += 2; + + h1_type = *packed_mphf++; + + h2_type = *packed_mphf++; + + size = (cmph_uint8 *) packed_mphf; + packed_mphf = (cmph_uint32 *)(size + k); + + offset = packed_mphf; + packed_mphf += k; + + hash_vector_packed(h0_ptr, h0_type, key, keylen, fingerprint); + h0 = fingerprint[2] % k; + + m = size[h0]; + b = fch_calc_b(c, m); + p1 = fch_calc_p1(m); + p2 = fch_calc_p2(b); + + g_is_ptr = (uintptr_t *)packed_mphf; + + h1_ptr = (cmph_uint8 *) g_is_ptr[h0]; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + + g = h2_ptr + hash_state_packed_size(h2_type); + + h1 = hash_packed(h1_ptr, h1_type, key, keylen) % m; + h2 = hash_packed(h2_ptr, h2_type, key, keylen) % m; + + mphf_bucket = 0; + h1 = mixh10h11h12(b, p1, p2, h1); + mphf_bucket = (cmph_uint8)((h2 + g[h1]) % m); + return (mphf_bucket + offset[h0]); +} + +/** cmph_uint32 brz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 brz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint32 *ptr = (cmph_uint32 *)packed_mphf; + register CMPH_ALGO algo = *ptr++; + cmph_uint32 fingerprint[3]; + switch(algo) + { + case CMPH_FCH: + return brz_fch_search_packed(ptr, key, keylen, fingerprint); + case CMPH_BMZ8: + return brz_bmz8_search_packed(ptr, key, keylen, fingerprint); + default: + assert(0); + return 0; /* To avoid warnings that value must be returned */ + } +} + diff --git a/girepository/cmph/brz.h b/girepository/cmph/brz.h new file mode 100644 index 0000000..648f174 --- /dev/null +++ b/girepository/cmph/brz.h @@ -0,0 +1,47 @@ +#ifndef __CMPH_BRZ_H__ +#define __CMPH_BRZ_H__ + +#include "cmph.h" + +typedef struct __brz_data_t brz_data_t; +typedef struct __brz_config_data_t brz_config_data_t; + +brz_config_data_t *brz_config_new(void); +void brz_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void brz_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void brz_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void brz_config_set_b(cmph_config_t *mph, cmph_uint32 b); +void brz_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void brz_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); +void brz_config_destroy(cmph_config_t *mph); +cmph_t *brz_new(cmph_config_t *mph, double c); + +void brz_load(FILE *f, cmph_t *mphf); +int brz_dump(cmph_t *mphf, FILE *f); +void brz_destroy(cmph_t *mphf); +cmph_uint32 brz_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void brz_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void brz_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 brz_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 brz_packed_size(cmph_t *mphf); + +/** cmph_uint32 brz_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 brz_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/brz_structs.h b/girepository/cmph/brz_structs.h new file mode 100644 index 0000000..b781107 --- /dev/null +++ b/girepository/cmph/brz_structs.h @@ -0,0 +1,39 @@ +#ifndef __CMPH_BRZ_STRUCTS_H__ +#define __CMPH_BRZ_STRUCTS_H__ + +#include "hash_state.h" + +struct __brz_data_t +{ + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) + cmph_uint32 m; // edges (words) count + double c; // constant c + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h0; +}; + +struct __brz_config_data_t +{ + CMPH_HASH hashfuncs[3]; + CMPH_ALGO algo; // CMPH algo for generating the MPHFs for the buckets (Just CMPH_FCH and CMPH_BMZ8) + double c; // constant c + cmph_uint32 m; // edges (words) count + cmph_uint8 *size; // size[i] stores the number of edges represented by g[i][...]. + cmph_uint32 *offset; // offset[i] stores the sum: size[0] + size[1] + ... size[i-1]. + cmph_uint8 **g; // g function. + cmph_uint8 b; // parameter b. + cmph_uint32 k; // number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t * h0; + cmph_uint32 memory_availability; + cmph_uint8 * tmp_dir; // temporary directory + FILE * mphf_fd; // mphf file +}; + +#endif diff --git a/girepository/cmph/buffer_entry.c b/girepository/cmph/buffer_entry.c new file mode 100644 index 0000000..5dcc4d5 --- /dev/null +++ b/girepository/cmph/buffer_entry.c @@ -0,0 +1,103 @@ +#include "buffer_entry.h" +#include +#include +#include +#include + +struct __buffer_entry_t +{ + FILE *fd; + cmph_uint8 * buff; + cmph_uint32 capacity, // buffer entry capacity + nbytes, // buffer entry used bytes + pos; // current read position in buffer entry + cmph_uint8 eof; // flag to indicate end of file +}; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity) +{ + buffer_entry_t *buff_entry = (buffer_entry_t *)malloc(sizeof(buffer_entry_t)); + assert(buff_entry); + buff_entry->fd = NULL; + buff_entry->buff = NULL; + buff_entry->capacity = capacity; + buff_entry->nbytes = capacity; + buff_entry->pos = capacity; + buff_entry->eof = 0; + return buff_entry; +} + +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename) +{ + buffer_entry->fd = fopen(filename, "rb"); +} + +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity) +{ + buffer_entry->capacity = capacity; +} + + +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry) +{ + return buffer_entry->capacity; +} + +static void buffer_entry_load(buffer_entry_t * buffer_entry) +{ + free(buffer_entry->buff); + buffer_entry->buff = (cmph_uint8 *)calloc((size_t)buffer_entry->capacity, sizeof(cmph_uint8)); + buffer_entry->nbytes = (cmph_uint32)fread(buffer_entry->buff, (size_t)1, (size_t)buffer_entry->capacity, buffer_entry->fd); + if (buffer_entry->nbytes != buffer_entry->capacity) buffer_entry->eof = 1; + buffer_entry->pos = 0; +} + +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen) +{ + cmph_uint8 * buf = NULL; + cmph_uint32 lacked_bytes = sizeof(*keylen); + cmph_uint32 copied_bytes = 0; + if(buffer_entry->eof && (buffer_entry->pos == buffer_entry->nbytes)) // end + { + free(buf); + return NULL; + } + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) + { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) memcpy(keylen, buffer_entry->buff + buffer_entry->pos, (size_t)copied_bytes); + buffer_entry_load(buffer_entry); + } + memcpy(keylen + copied_bytes, buffer_entry->buff + buffer_entry->pos, (size_t)lacked_bytes); + buffer_entry->pos += lacked_bytes; + + lacked_bytes = *keylen; + copied_bytes = 0; + buf = (cmph_uint8 *)malloc(*keylen + sizeof(*keylen)); + memcpy(buf, keylen, sizeof(*keylen)); + if((buffer_entry->pos + lacked_bytes) > buffer_entry->nbytes) { + copied_bytes = buffer_entry->nbytes - buffer_entry->pos; + lacked_bytes = (buffer_entry->pos + lacked_bytes) - buffer_entry->nbytes; + if (copied_bytes != 0) { + memcpy(buf + sizeof(*keylen), buffer_entry->buff + buffer_entry->pos, (size_t)copied_bytes); + } + buffer_entry_load(buffer_entry); + } + memcpy(buf+sizeof(*keylen)+copied_bytes, buffer_entry->buff + buffer_entry->pos, (size_t)lacked_bytes); + buffer_entry->pos += lacked_bytes; + return buf; +} + +void buffer_entry_destroy(buffer_entry_t * buffer_entry) +{ + fclose(buffer_entry->fd); + buffer_entry->fd = NULL; + free(buffer_entry->buff); + buffer_entry->buff = NULL; + buffer_entry->capacity = 0; + buffer_entry->nbytes = 0; + buffer_entry->pos = 0; + buffer_entry->eof = 0; + free(buffer_entry); +} diff --git a/girepository/cmph/buffer_entry.h b/girepository/cmph/buffer_entry.h new file mode 100644 index 0000000..62102ba --- /dev/null +++ b/girepository/cmph/buffer_entry.h @@ -0,0 +1,14 @@ +#ifndef __CMPH_BUFFER_ENTRY_H__ +#define __CMPH_BUFFER_ENTRY_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_entry_t buffer_entry_t; + +buffer_entry_t * buffer_entry_new(cmph_uint32 capacity); +void buffer_entry_set_capacity(buffer_entry_t * buffer_entry, cmph_uint32 capacity); +cmph_uint32 buffer_entry_get_capacity(buffer_entry_t * buffer_entry); +void buffer_entry_open(buffer_entry_t * buffer_entry, char * filename); +cmph_uint8 * buffer_entry_read_key(buffer_entry_t * buffer_entry, cmph_uint32 * keylen); +void buffer_entry_destroy(buffer_entry_t * buffer_entry); +#endif diff --git a/girepository/cmph/buffer_manage.c b/girepository/cmph/buffer_manage.c new file mode 100644 index 0000000..fdefc62 --- /dev/null +++ b/girepository/cmph/buffer_manage.c @@ -0,0 +1,66 @@ +#include "buffer_manage.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manage_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manage_t *buff_manage = (buffer_manage_t *)malloc(sizeof(buffer_manage_t)); + assert(buff_manage); + buff_manage->memory_avail = memory_avail; + buff_manage->buffer_entries = (buffer_entry_t **)calloc((size_t)nentries, sizeof(buffer_entry_t *)); + buff_manage->memory_avail_list = (cmph_uint32 *)calloc((size_t)nentries, sizeof(cmph_uint32)); + buff_manage->pos_avail_list = -1; + buff_manage->nentries = nentries; + memory_avail_entry = buff_manage->memory_avail/buff_manage->nentries + 1; + for(i = 0; i < buff_manage->nentries; i++) + { + buff_manage->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manage; +} + +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manage->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index) +{ + cmph_uint8 * key = NULL; + if (buffer_manage->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]) + buffer_manage->memory_avail_list[(buffer_manage->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manage->buffer_entries[index], new_capacity); + //fprintf(stderr, "recovering memory\n"); + } + key = buffer_entry_read_key(buffer_manage->buffer_entries[index]); + if (key == NULL) // storing memory to be recovered + { + buffer_manage->memory_avail_list[++(buffer_manage->pos_avail_list)] = buffer_entry_get_capacity(buffer_manage->buffer_entries[index]); + //fprintf(stderr, "storing memory to be recovered\n"); + } + return key; +} + +void buffer_manage_destroy(buffer_manage_t * buffer_manage) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manage->nentries; i++) + { + buffer_entry_destroy(buffer_manage->buffer_entries[i]); + } + free(buffer_manage->memory_avail_list); + free(buffer_manage->buffer_entries); + free(buffer_manage); +} diff --git a/girepository/cmph/buffer_manage.h b/girepository/cmph/buffer_manage.h new file mode 100644 index 0000000..8c66cff --- /dev/null +++ b/girepository/cmph/buffer_manage.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manage_t buffer_manage_t; + +buffer_manage_t * buffer_manage_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manage_open(buffer_manage_t * buffer_manage, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manage_read_key(buffer_manage_t * buffer_manage, cmph_uint32 index); +void buffer_manage_destroy(buffer_manage_t * buffer_manage); +#endif diff --git a/girepository/cmph/buffer_manager.c b/girepository/cmph/buffer_manager.c new file mode 100644 index 0000000..5a051e2 --- /dev/null +++ b/girepository/cmph/buffer_manager.c @@ -0,0 +1,64 @@ +#include "buffer_manager.h" +#include "buffer_entry.h" +#include +#include +#include +struct __buffer_manager_t +{ + cmph_uint32 memory_avail; // memory available + buffer_entry_t ** buffer_entries; // buffer entries to be managed + cmph_uint32 nentries; // number of entries to be managed + cmph_uint32 *memory_avail_list; // memory available list + int pos_avail_list; // current position in memory available list +}; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries) +{ + cmph_uint32 memory_avail_entry, i; + buffer_manager_t *buff_manager = (buffer_manager_t *)malloc(sizeof(buffer_manager_t)); + assert(buff_manager); + buff_manager->memory_avail = memory_avail; + buff_manager->buffer_entries = (buffer_entry_t **)calloc((size_t)nentries, sizeof(buffer_entry_t *)); + buff_manager->memory_avail_list = (cmph_uint32 *)calloc((size_t)nentries, sizeof(cmph_uint32)); + buff_manager->pos_avail_list = -1; + buff_manager->nentries = nentries; + memory_avail_entry = buff_manager->memory_avail/buff_manager->nentries + 1; + for(i = 0; i < buff_manager->nentries; i++) + { + buff_manager->buffer_entries[i] = buffer_entry_new(memory_avail_entry); + } + return buff_manager; +} + +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename) +{ + buffer_entry_open(buffer_manager->buffer_entries[index], filename); +} + +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen) +{ + cmph_uint8 * key = NULL; + if (buffer_manager->pos_avail_list >= 0 ) // recovering memory + { + cmph_uint32 new_capacity = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]) + buffer_manager->memory_avail_list[(buffer_manager->pos_avail_list)--]; + buffer_entry_set_capacity(buffer_manager->buffer_entries[index], new_capacity); + } + key = buffer_entry_read_key(buffer_manager->buffer_entries[index], keylen); + if (key == NULL) // storing memory to be recovered + { + buffer_manager->memory_avail_list[++(buffer_manager->pos_avail_list)] = buffer_entry_get_capacity(buffer_manager->buffer_entries[index]); + } + return key; +} + +void buffer_manager_destroy(buffer_manager_t * buffer_manager) +{ + cmph_uint32 i; + for(i = 0; i < buffer_manager->nentries; i++) + { + buffer_entry_destroy(buffer_manager->buffer_entries[i]); + } + free(buffer_manager->memory_avail_list); + free(buffer_manager->buffer_entries); + free(buffer_manager); +} diff --git a/girepository/cmph/buffer_manager.h b/girepository/cmph/buffer_manager.h new file mode 100644 index 0000000..af99c20 --- /dev/null +++ b/girepository/cmph/buffer_manager.h @@ -0,0 +1,12 @@ +#ifndef __CMPH_BUFFER_MANAGE_H__ +#define __CMPH_BUFFER_MANAGE_H__ + +#include "cmph_types.h" +#include +typedef struct __buffer_manager_t buffer_manager_t; + +buffer_manager_t * buffer_manager_new(cmph_uint32 memory_avail, cmph_uint32 nentries); +void buffer_manager_open(buffer_manager_t * buffer_manager, cmph_uint32 index, char * filename); +cmph_uint8 * buffer_manager_read_key(buffer_manager_t * buffer_manager, cmph_uint32 index, cmph_uint32 * keylen); +void buffer_manager_destroy(buffer_manager_t * buffer_manager); +#endif diff --git a/girepository/cmph/chd.c b/girepository/cmph/chd.c new file mode 100644 index 0000000..46aec52 --- /dev/null +++ b/girepository/cmph/chd.c @@ -0,0 +1,280 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cmph_structs.h" +#include "chd_structs.h" +#include "chd.h" +#include "bitbool.h" +//#define DEBUG +#include "debug.h" + +chd_config_data_t *chd_config_new(cmph_config_t *mph) +{ + cmph_io_adapter_t *key_source = mph->key_source; + chd_config_data_t *chd; + chd = (chd_config_data_t *)malloc(sizeof(chd_config_data_t)); + assert(chd); + memset(chd, 0, sizeof(chd_config_data_t)); + + chd->chd_ph = cmph_config_new(key_source); + cmph_config_set_algo(chd->chd_ph, CMPH_CHD_PH); + + return chd; +} + +void chd_config_destroy(cmph_config_t *mph) +{ + chd_config_data_t *data = (chd_config_data_t *) mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + if(data->chd_ph) + { + cmph_config_destroy(data->chd_ph); + data->chd_ph = NULL; + } + free(data); +} + + +void chd_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chd_config_data_t *data = (chd_config_data_t *) mph->data; + cmph_config_set_hashfuncs(data->chd_ph, hashfuncs); +} + + +void chd_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket) +{ + chd_config_data_t *data = (chd_config_data_t *) mph->data; + cmph_config_set_b(data->chd_ph, keys_per_bucket); +} + + +void chd_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin) +{ + chd_config_data_t *data = (chd_config_data_t *) mph->data; + cmph_config_set_keys_per_bin(data->chd_ph, keys_per_bin); +} + + +cmph_t *chd_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + chd_data_t *chdf = NULL; + chd_config_data_t *chd = (chd_config_data_t *)mph->data; + chd_ph_config_data_t * chd_ph = (chd_ph_config_data_t *)chd->chd_ph->data; + compressed_rank_t cr; + + register cmph_t * chd_phf = NULL; + register cmph_uint32 packed_chd_phf_size = 0; + cmph_uint8 * packed_chd_phf = NULL; + + register cmph_uint32 packed_cr_size = 0; + cmph_uint8 * packed_cr = NULL; + + register cmph_uint32 i, idx, nkeys, nvals, nbins; + cmph_uint32 * vals_table = NULL; + register cmph_uint32 * occup_table = NULL; + #ifdef CMPH_TIMING + double construction_time_begin = 0.0; + double construction_time = 0.0; + ELAPSED_TIME_IN_SECONDS(&construction_time_begin); + #endif + + cmph_config_set_verbosity(chd->chd_ph, mph->verbosity); + cmph_config_set_graphsize(chd->chd_ph, c); + + if (mph->verbosity) + { + fprintf(stderr, "Generating a CHD_PH perfect hash function with a load factor equal to %.3f\n", c); + } + + chd_phf = cmph_new(chd->chd_ph); + + if(chd_phf == NULL) + { + return NULL; + } + + packed_chd_phf_size = cmph_packed_size(chd_phf); + DEBUGP("packed_chd_phf_size = %u\n", packed_chd_phf_size); + + /* Make sure that we have enough space to pack the mphf. */ + packed_chd_phf = calloc((size_t)packed_chd_phf_size,(size_t)1); + + /* Pack the mphf. */ + cmph_pack(chd_phf, packed_chd_phf); + + cmph_destroy(chd_phf); + + + if (mph->verbosity) + { + fprintf(stderr, "Compressing the range of the resulting CHD_PH perfect hash function\n"); + } + + compressed_rank_init(&cr); + nbins = chd_ph->n; + nkeys = chd_ph->m; + nvals = nbins - nkeys; + + vals_table = (cmph_uint32 *)calloc(nvals, sizeof(cmph_uint32)); + occup_table = (cmph_uint32 *)chd_ph->occup_table; + + for(i = 0, idx = 0; i < nbins; i++) + { + if(!GETBIT32(occup_table, i)) + { + vals_table[idx++] = i; + } + } + + compressed_rank_generate(&cr, vals_table, nvals); + free(vals_table); + + packed_cr_size = compressed_rank_packed_size(&cr); + packed_cr = (cmph_uint8 *) calloc(packed_cr_size, sizeof(cmph_uint8)); + compressed_rank_pack(&cr, packed_cr); + compressed_rank_destroy(&cr); + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chdf = (chd_data_t *)malloc(sizeof(chd_data_t)); + + chdf->packed_cr = packed_cr; + packed_cr = NULL; //transfer memory ownership + + chdf->packed_chd_phf = packed_chd_phf; + packed_chd_phf = NULL; //transfer memory ownership + + chdf->packed_chd_phf_size = packed_chd_phf_size; + chdf->packed_cr_size = packed_cr_size; + + mphf->data = chdf; + mphf->size = nkeys; + + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + #ifdef CMPH_TIMING + ELAPSED_TIME_IN_SECONDS(&construction_time); + register cmph_uint32 space_usage = chd_packed_size(mphf)*8; + construction_time = construction_time - construction_time_begin; + fprintf(stdout, "%u\t%.2f\t%u\t%.4f\t%.4f\n", nkeys, c, chd_ph->keys_per_bucket, construction_time, space_usage/(double)nkeys); + #endif + + return mphf; +} + +void chd_load(FILE *fd, cmph_t *mphf) +{ + register size_t nbytes; + chd_data_t *chd = (chd_data_t *)malloc(sizeof(chd_data_t)); + + DEBUGP("Loading chd mphf\n"); + mphf->data = chd; + + nbytes = fread(&chd->packed_chd_phf_size, sizeof(cmph_uint32), (size_t)1, fd); + DEBUGP("Loading CHD_PH perfect hash function with %u bytes to disk\n", chd->packed_chd_phf_size); + chd->packed_chd_phf = (cmph_uint8 *) calloc((size_t)chd->packed_chd_phf_size,(size_t)1); + nbytes = fread(chd->packed_chd_phf, chd->packed_chd_phf_size, (size_t)1, fd); + + nbytes = fread(&chd->packed_cr_size, sizeof(cmph_uint32), (size_t)1, fd); + DEBUGP("Loading Compressed rank structure, which has %u bytes\n", chd->packed_cr_size); + chd->packed_cr = (cmph_uint8 *) calloc((size_t)chd->packed_cr_size, (size_t)1); + nbytes = fread(chd->packed_cr, chd->packed_cr_size, (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } + +} + +int chd_dump(cmph_t *mphf, FILE *fd) +{ + register size_t nbytes; + chd_data_t *data = (chd_data_t *)mphf->data; + + __cmph_dump(mphf, fd); + // Dumping CHD_PH perfect hash function + + DEBUGP("Dumping CHD_PH perfect hash function with %u bytes to disk\n", data->packed_chd_phf_size); + nbytes = fwrite(&data->packed_chd_phf_size, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(data->packed_chd_phf, data->packed_chd_phf_size, (size_t)1, fd); + + DEBUGP("Dumping compressed rank structure with %u bytes to disk\n", data->packed_cr_size); + nbytes = fwrite(&data->packed_cr_size, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(data->packed_cr, data->packed_cr_size, (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + + return 1; +} + +void chd_destroy(cmph_t *mphf) +{ + chd_data_t *data = (chd_data_t *)mphf->data; + free(data->packed_chd_phf); + free(data->packed_cr); + free(data); + free(mphf); +} + +static inline cmph_uint32 _chd_search(void * packed_chd_phf, void * packed_cr, const char *key, cmph_uint32 keylen) +{ + register cmph_uint32 bin_idx = cmph_search_packed(packed_chd_phf, key, keylen); + register cmph_uint32 rank = compressed_rank_query_packed(packed_cr, bin_idx); + return bin_idx - rank; +} + +cmph_uint32 chd_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + register chd_data_t * chd = mphf->data; + return _chd_search(chd->packed_chd_phf, chd->packed_cr, key, keylen); +} + +void chd_pack(cmph_t *mphf, void *packed_mphf) +{ + chd_data_t *data = (chd_data_t *)mphf->data; + cmph_uint32 * ptr = packed_mphf; + cmph_uint8 * ptr8; + + // packing packed_cr_size and packed_cr + *ptr = data->packed_cr_size; + ptr8 = (cmph_uint8 *) (ptr + 1); + + memcpy(ptr8, data->packed_cr, data->packed_cr_size); + ptr8 += data->packed_cr_size; + + ptr = (cmph_uint32 *) ptr8; + *ptr = data->packed_chd_phf_size; + + ptr8 = (cmph_uint8 *) (ptr + 1); + memcpy(ptr8, data->packed_chd_phf, data->packed_chd_phf_size); +} + +cmph_uint32 chd_packed_size(cmph_t *mphf) +{ + register chd_data_t *data = (chd_data_t *)mphf->data; + return (cmph_uint32)(sizeof(CMPH_ALGO) + 2*sizeof(cmph_uint32) + data->packed_cr_size + data->packed_chd_phf_size); + +} + +cmph_uint32 chd_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + + register cmph_uint32 * ptr = packed_mphf; + register cmph_uint32 packed_cr_size = *ptr++; + register cmph_uint8 * packed_chd_phf = ((cmph_uint8 *) ptr) + packed_cr_size + sizeof(cmph_uint32); + return _chd_search(packed_chd_phf, ptr, key, keylen); +} + + diff --git a/girepository/cmph/chd.h b/girepository/cmph/chd.h new file mode 100644 index 0000000..e829df8 --- /dev/null +++ b/girepository/cmph/chd.h @@ -0,0 +1,59 @@ +#ifndef _CMPH_CHD_H__ +#define _CMPH_CHD_H__ + +#include "cmph.h" + +typedef struct __chd_data_t chd_data_t; +typedef struct __chd_config_data_t chd_config_data_t; + +/* Config API */ +chd_config_data_t *chd_config_new(cmph_config_t * mph); +void chd_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); + +/** \fn void chd_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + * \brief Allows to set the number of keys per bin. + * \param mph pointer to the configuration structure + * \param keys_per_bin value for the number of keys per bin + */ +void chd_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + +/** \fn void chd_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); + * \brief Allows to set the number of keys per bucket. + * \param mph pointer to the configuration structure + * \param keys_per_bucket value for the number of keys per bucket + */ +void chd_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); +void chd_config_destroy(cmph_config_t *mph); + + +/* Chd algorithm API */ +cmph_t *chd_new(cmph_config_t *mph, double c); +void chd_load(FILE *fd, cmph_t *mphf); +int chd_dump(cmph_t *mphf, FILE *fd); +void chd_destroy(cmph_t *mphf); +cmph_uint32 chd_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void chd_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void chd_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 chd_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 chd_packed_size(cmph_t *mphf); + +/** cmph_uint32 chd_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 chd_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/chd_ph.c b/girepository/cmph/chd_ph.c new file mode 100644 index 0000000..ae986b4 --- /dev/null +++ b/girepository/cmph/chd_ph.c @@ -0,0 +1,1001 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cmph_structs.h" +#include "chd_structs_ph.h" +#include "chd_ph.h" +#include"miller_rabin.h" +#include"bitbool.h" + + +//#define DEBUG +#include "debug.h" + +// NO_ELEMENT is equivalent to null pointer +#ifndef NO_ELEMENT +#define NO_ELEMENT UINT_MAX +#endif + +// struct used to represent items at mapping, ordering and searching phases +struct _chd_ph_item_t +{ + cmph_uint32 f; + cmph_uint32 h; +}; +typedef struct _chd_ph_item_t chd_ph_item_t; + +// struct to represent the items at mapping phase only. +struct _chd_ph_map_item_t +{ + cmph_uint32 f; + cmph_uint32 h; + cmph_uint32 bucket_num; +}; +typedef struct _chd_ph_map_item_t chd_ph_map_item_t; + +// struct to represent a bucket +struct _chd_ph_bucket_t +{ + cmph_uint32 items_list; // offset + union + { + cmph_uint32 size; + cmph_uint32 bucket_id; + }; +}; + +typedef struct _chd_ph_bucket_t chd_ph_bucket_t; + +struct _chd_ph_sorted_list_t +{ + cmph_uint32 buckets_list; + cmph_uint32 size; +}; + +typedef struct _chd_ph_sorted_list_t chd_ph_sorted_list_t; + + +static inline chd_ph_bucket_t * chd_ph_bucket_new(cmph_uint32 nbuckets); +static inline void chd_ph_bucket_clean(chd_ph_bucket_t * buckets, cmph_uint32 nbuckets); +static inline void chd_ph_bucket_destroy(chd_ph_bucket_t * buckets); + +chd_ph_bucket_t * chd_ph_bucket_new(cmph_uint32 nbuckets) +{ + chd_ph_bucket_t * buckets = (chd_ph_bucket_t *) calloc(nbuckets, sizeof(chd_ph_bucket_t)); + return buckets; +} + +void chd_ph_bucket_clean(chd_ph_bucket_t * buckets, cmph_uint32 nbuckets) +{ + register cmph_uint32 i = 0; + assert(buckets); + for(i = 0; i < nbuckets; i++) + buckets[i].size = 0; +} +static cmph_uint8 chd_ph_bucket_insert(chd_ph_bucket_t * buckets,chd_ph_map_item_t * map_items, chd_ph_item_t * items, + cmph_uint32 nbuckets,cmph_uint32 item_idx) +{ + register cmph_uint32 i = 0; + register chd_ph_item_t * tmp_item; + register chd_ph_map_item_t * tmp_map_item = map_items + item_idx; + register chd_ph_bucket_t * bucket = buckets + tmp_map_item->bucket_num; + tmp_item = items + bucket->items_list; + + for(i = 0; i < bucket->size; i++) + { + if(tmp_item->f == tmp_map_item->f && tmp_item->h == tmp_map_item->h) + { + DEBUGP("Item not added\n"); + return 0; + }; + tmp_item++; + }; + tmp_item->f = tmp_map_item->f; + tmp_item->h = tmp_map_item->h; + bucket->size++; + return 1; +}; +void chd_ph_bucket_destroy(chd_ph_bucket_t * buckets) +{ + free(buckets); +} + +static inline cmph_uint8 chd_ph_mapping(cmph_config_t *mph, chd_ph_bucket_t * buckets, chd_ph_item_t * items, + cmph_uint32 *max_bucket_size); + +static chd_ph_sorted_list_t * chd_ph_ordering(chd_ph_bucket_t ** _buckets,chd_ph_item_t ** items, + cmph_uint32 nbuckets,cmph_uint32 nitems, cmph_uint32 max_bucket_size); + +static cmph_uint8 chd_ph_searching(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, chd_ph_item_t *items , + cmph_uint32 max_bucket_size, chd_ph_sorted_list_t *sorted_lists, cmph_uint32 max_probes, cmph_uint32 * disp_table); + +static inline double chd_ph_space_lower_bound(cmph_uint32 _n, cmph_uint32 _r) +{ + double r = _r, n = _n; + return (1 + (r/n - 1.0 + 1.0/(2.0*n))*log(1 - n/r))/log(2); +}; + +/* computes the entropy of non empty buckets.*/ +static inline double chd_ph_get_entropy(cmph_uint32 * disp_table, cmph_uint32 n, cmph_uint32 max_probes) +{ + register cmph_uint32 * probe_counts = (cmph_uint32 *) calloc(max_probes, sizeof(cmph_uint32)); + register cmph_uint32 i; + register double entropy = 0; + + for(i = 0; i < n; i++) + { + probe_counts[disp_table[i]]++; + }; + + for(i = 0; i < max_probes; i++) + { + if(probe_counts[i] > 0) + entropy -= probe_counts[i]*log((double)probe_counts[i]/(double)n)/log(2); + }; + free(probe_counts); + return entropy; +}; + +chd_ph_config_data_t *chd_ph_config_new(void) +{ + chd_ph_config_data_t *chd_ph; + chd_ph = (chd_ph_config_data_t *)malloc(sizeof(chd_ph_config_data_t)); + assert(chd_ph); + memset(chd_ph, 0, sizeof(chd_ph_config_data_t)); + + chd_ph->hashfunc = CMPH_HASH_JENKINS; + chd_ph->cs = NULL; + chd_ph->nbuckets = 0; + chd_ph->n = 0; + chd_ph->hl = NULL; + + chd_ph->m = 0; + chd_ph->use_h = 1; + chd_ph->keys_per_bin = 1; + chd_ph->keys_per_bucket = 4; + chd_ph->occup_table = 0; + + return chd_ph; +} + +void chd_ph_config_destroy(cmph_config_t *mph) +{ + chd_ph_config_data_t *data = (chd_ph_config_data_t *) mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + if(data->occup_table) + { + free(data->occup_table); + data->occup_table = NULL; + } + free(data); +} + + +void chd_ph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chd_ph_config_data_t *chd_ph = (chd_ph_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 1) break; //chd_ph only uses one linear hash function + chd_ph->hashfunc = *hashptr; + ++i, ++hashptr; + } +} + + +void chd_ph_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket) +{ + chd_ph_config_data_t *chd_ph; + assert(mph); + chd_ph = (chd_ph_config_data_t *)mph->data; + if(keys_per_bucket < 1 || keys_per_bucket >= 15) + { + keys_per_bucket = 4; + } + chd_ph->keys_per_bucket = keys_per_bucket; +} + + +void chd_ph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin) +{ + chd_ph_config_data_t *chd_ph; + assert(mph); + chd_ph = (chd_ph_config_data_t *)mph->data; + if(keys_per_bin <= 1 || keys_per_bin >= 128) + { + keys_per_bin = 1; + } + chd_ph->keys_per_bin = keys_per_bin; +} + +cmph_uint8 chd_ph_mapping(cmph_config_t *mph, chd_ph_bucket_t * buckets, chd_ph_item_t * items, cmph_uint32 *max_bucket_size) +{ + register cmph_uint32 i = 0, g = 0; + cmph_uint32 hl[3]; + chd_ph_config_data_t *chd_ph = (chd_ph_config_data_t *)mph->data; + char * key = NULL; + cmph_uint32 keylen = 0; + chd_ph_map_item_t * map_item; + chd_ph_map_item_t * map_items = malloc(chd_ph->m*sizeof(chd_ph_map_item_t)); + register cmph_uint32 mapping_iterations = 1000; + *max_bucket_size = 0; + while(1) + { + mapping_iterations--; + if (chd_ph->hl) hash_state_destroy(chd_ph->hl); + chd_ph->hl = hash_state_new(chd_ph->hashfunc, chd_ph->m); + + chd_ph_bucket_clean(buckets, chd_ph->nbuckets); + + mph->key_source->rewind(mph->key_source->data); + + for(i = 0; i < chd_ph->m; i++) + { + mph->key_source->read(mph->key_source->data, &key, &keylen); + hash_vector(chd_ph->hl, key, keylen, hl); + + map_item = (map_items + i); + + g = hl[0] % chd_ph->nbuckets; + map_item->f = hl[1] % chd_ph->n; + map_item->h = hl[2] % (chd_ph->n - 1) + 1; + map_item->bucket_num=g; + mph->key_source->dispose(mph->key_source->data, key, keylen); +// if(buckets[g].size == (chd_ph->keys_per_bucket << 2)) +// { +// DEBUGP("BUCKET = %u -- SIZE = %u -- MAXIMUM SIZE = %u\n", g, buckets[g].size, (chd_ph->keys_per_bucket << 2)); +// goto error; +// } + buckets[g].size++; + if(buckets[g].size > *max_bucket_size) + { + *max_bucket_size = buckets[g].size; + } + } + buckets[0].items_list = 0; + for(i = 1; i < chd_ph->nbuckets; i++) + { + buckets[i].items_list = buckets[i-1].items_list + buckets[i - 1].size; + buckets[i - 1].size = 0; + }; + buckets[i - 1].size = 0; + for(i = 0; i < chd_ph->m; i++) + { + map_item = (map_items + i); + if(!chd_ph_bucket_insert(buckets, map_items, items, chd_ph->nbuckets, i)) + break; + } + if(i == chd_ph->m) + { + free(map_items); + return 1; // SUCCESS + } + + if(mapping_iterations == 0) + { + goto error; + } + } +error: + free(map_items); + hash_state_destroy(chd_ph->hl); + chd_ph->hl = NULL; + return 0; // FAILURE +} + +chd_ph_sorted_list_t * chd_ph_ordering(chd_ph_bucket_t ** _buckets, chd_ph_item_t ** _items, + cmph_uint32 nbuckets, cmph_uint32 nitems, cmph_uint32 max_bucket_size) +{ + chd_ph_sorted_list_t * sorted_lists = (chd_ph_sorted_list_t *) calloc(max_bucket_size + 1, sizeof(chd_ph_sorted_list_t)); + + chd_ph_bucket_t * input_buckets = (*_buckets); + chd_ph_bucket_t * output_buckets; + chd_ph_item_t * input_items = (*_items); + chd_ph_item_t * output_items; + register cmph_uint32 i, j, bucket_size, position, position2; +// cmph_uint32 non_empty_buckets; + DEBUGP("MAX BUCKET SIZE = %u\n", max_bucket_size); + // Determine size of each list of buckets + for(i = 0; i < nbuckets; i++) + { + bucket_size = input_buckets[i].size; + if(bucket_size == 0) + continue; + sorted_lists[bucket_size].size++; + }; + sorted_lists[1].buckets_list = 0; + // Determine final position of list of buckets into the contiguous array that will store all the buckets + for(i = 2; i <= max_bucket_size; i++) + { + sorted_lists[i].buckets_list = sorted_lists[i-1].buckets_list + sorted_lists[i-1].size; + sorted_lists[i-1].size = 0; + }; + sorted_lists[i-1].size = 0; + // Store the buckets in a new array which is sorted by bucket sizes + output_buckets = calloc(nbuckets, sizeof(chd_ph_bucket_t)); // everything is initialized with zero +// non_empty_buckets = nbuckets; + + for(i = 0; i < nbuckets; i++) + { + bucket_size = input_buckets[i].size; + if(bucket_size == 0) + { +// non_empty_buckets--; + continue; + }; + position = sorted_lists[bucket_size].buckets_list + sorted_lists[bucket_size].size; + output_buckets[position].bucket_id = i; + output_buckets[position].items_list = input_buckets[i].items_list; + sorted_lists[bucket_size].size++; + }; +/* for(i = non_empty_buckets; i < nbuckets; i++) + output_buckets[i].size=0;*/ + // Return the buckets sorted in new order and free the old buckets sorted in old order + free(input_buckets); + (*_buckets) = output_buckets; + + + // Store the items according to the new order of buckets. + output_items = (chd_ph_item_t*)calloc(nitems, sizeof(chd_ph_item_t)); + position = 0; + i = 0; + for(bucket_size = 1; bucket_size <= max_bucket_size; bucket_size++) + { + for(i = sorted_lists[bucket_size].buckets_list; i < sorted_lists[bucket_size].size + sorted_lists[bucket_size].buckets_list; i++) + { + position2 = output_buckets[i].items_list; + output_buckets[i].items_list = position; + for(j = 0; j < bucket_size; j++) + { + output_items[position].f = input_items[position2].f; + output_items[position].h = input_items[position2].h; + position++; + position2++; + }; + }; + }; + //Return the items sorted in new order and free the old items sorted in old order + free(input_items); + (*_items) = output_items; + return sorted_lists; +}; + +static inline cmph_uint8 place_bucket_probe(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, + chd_ph_item_t *items, cmph_uint32 probe0_num, cmph_uint32 probe1_num, + cmph_uint32 bucket_num, cmph_uint32 size) +{ + register cmph_uint32 i; + register chd_ph_item_t * item; + register cmph_uint32 position; + + item = items + buckets[bucket_num].items_list; + // try place bucket with probe_num + if(chd_ph->keys_per_bin > 1) + { + for(i = 0; i < size; i++) // placement + { + position = (cmph_uint32)((item->f + ((cmph_uint64)item->h)*probe0_num + probe1_num) % chd_ph->n); + if(chd_ph->occup_table[position] >= chd_ph->keys_per_bin) + { + break; + } + (chd_ph->occup_table[position])++; + item++; + }; + } else + { + for(i = 0; i < size; i++) // placement + { + position = (cmph_uint32)((item->f + ((cmph_uint64)item->h)*probe0_num + probe1_num) % chd_ph->n); + if(GETBIT32(((cmph_uint32 *)chd_ph->occup_table), position)) + { + break; + } + SETBIT32(((cmph_uint32*)chd_ph->occup_table), position); + item++; + }; + }; + if(i != size) // Undo the placement + { + item = items + buckets[bucket_num].items_list; + if(chd_ph->keys_per_bin > 1) + { + while(1) + { + if(i == 0) + { + break; + } + position = (cmph_uint32)((item->f + ((cmph_uint64 )item->h) * probe0_num + probe1_num) % chd_ph->n); + (chd_ph->occup_table[position])--; + item++; + i--; + }; + } else + { + while(1) + { + if(i == 0) + { + break; + } + position = (cmph_uint32)((item->f + ((cmph_uint64 )item->h) * probe0_num + probe1_num) % chd_ph->n); + UNSETBIT32(((cmph_uint32*)chd_ph->occup_table), position); + +// ([position/32]^=(1<<(position%32)); + item++; + i--; + }; + }; + return 0; + } + return 1; +}; + +static inline cmph_uint8 place_bucket(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, chd_ph_item_t * items, cmph_uint32 max_probes, + cmph_uint32 * disp_table, cmph_uint32 bucket_num, cmph_uint32 size) + +{ + register cmph_uint32 probe0_num, probe1_num, probe_num; + probe0_num = 0; + probe1_num = 0; + probe_num = 0; + + while(1) + { + if(place_bucket_probe(chd_ph, buckets, items, probe0_num, probe1_num, bucket_num,size)) + { + disp_table[buckets[bucket_num].bucket_id] = probe0_num + probe1_num * chd_ph->n; + return 1; + } + probe0_num++; + if(probe0_num >= chd_ph->n) + { + probe0_num -= chd_ph->n; + probe1_num++; + }; + probe_num++; + if(probe_num >= max_probes || probe1_num >= chd_ph->n) + { + return 0; + }; + }; + return 0; +}; + +static inline cmph_uint8 place_buckets1(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t * buckets, chd_ph_item_t *items, + cmph_uint32 max_bucket_size, chd_ph_sorted_list_t *sorted_lists, cmph_uint32 max_probes, + cmph_uint32 * disp_table) +{ + register cmph_uint32 i = 0; + register cmph_uint32 curr_bucket = 0; + + for(i = max_bucket_size; i > 0; i--) + { + curr_bucket = sorted_lists[i].buckets_list; + while(curr_bucket < sorted_lists[i].size + sorted_lists[i].buckets_list) + { + if(!place_bucket(chd_ph, buckets, items, max_probes, disp_table, curr_bucket, i)) + { + return 0; + } + curr_bucket++; + }; + }; + return 1; +}; + +static inline cmph_uint8 place_buckets2(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, chd_ph_item_t * items, + cmph_uint32 max_bucket_size, chd_ph_sorted_list_t *sorted_lists, cmph_uint32 max_probes, + cmph_uint32 * disp_table) +{ + register cmph_uint32 i,j, non_placed_bucket; + register cmph_uint32 curr_bucket; + register cmph_uint32 probe_num, probe0_num, probe1_num; + cmph_uint32 sorted_list_size; +#ifdef DEBUG + cmph_uint32 items_list; + cmph_uint32 bucket_id; +#endif + DEBUGP("USING HEURISTIC TO PLACE BUCKETS\n"); + for(i = max_bucket_size; i > 0; i--) + { + probe_num = 0; + probe0_num = 0; + probe1_num = 0; + sorted_list_size = sorted_lists[i].size; + while(sorted_lists[i].size != 0) + { + curr_bucket = sorted_lists[i].buckets_list; + for(j = 0, non_placed_bucket = 0; j < sorted_lists[i].size; j++) + { + // if bucket is successfully placed remove it from list + if(place_bucket_probe(chd_ph, buckets, items, probe0_num, probe1_num, curr_bucket, i)) + { + disp_table[buckets[curr_bucket].bucket_id] = probe0_num + probe1_num * chd_ph->n; +// DEBUGP("BUCKET %u PLACED --- DISPLACEMENT = %u\n", curr_bucket, disp_table[curr_bucket]); + } + else + { +// DEBUGP("BUCKET %u NOT PLACED\n", curr_bucket); +#ifdef DEBUG + items_list = buckets[non_placed_bucket + sorted_lists[i].buckets_list].items_list; + bucket_id = buckets[non_placed_bucket + sorted_lists[i].buckets_list].bucket_id; +#endif + buckets[non_placed_bucket + sorted_lists[i].buckets_list].items_list = buckets[curr_bucket].items_list; + buckets[non_placed_bucket + sorted_lists[i].buckets_list].bucket_id = buckets[curr_bucket].bucket_id; +#ifdef DEBUG + buckets[curr_bucket].items_list=items_list; + buckets[curr_bucket].bucket_id=bucket_id; +#endif + non_placed_bucket++; + } + curr_bucket++; + }; + sorted_lists[i].size = non_placed_bucket; + probe0_num++; + if(probe0_num >= chd_ph->n) + { + probe0_num -= chd_ph->n; + probe1_num++; + }; + probe_num++; + if(probe_num >= max_probes || probe1_num >= chd_ph->n) + { + sorted_lists[i].size = sorted_list_size; + return 0; + }; + }; + sorted_lists[i].size = sorted_list_size; + }; + return 1; +}; + +cmph_uint8 chd_ph_searching(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, chd_ph_item_t *items , + cmph_uint32 max_bucket_size, chd_ph_sorted_list_t *sorted_lists, cmph_uint32 max_probes, + cmph_uint32 * disp_table) +{ + if(chd_ph->use_h) + { + return place_buckets2(chd_ph, buckets, items, max_bucket_size, sorted_lists, max_probes, disp_table); + } + else + { + return place_buckets1(chd_ph, buckets, items, max_bucket_size, sorted_lists, max_probes, disp_table); + } + +} + +static inline cmph_uint8 chd_ph_check_bin_hashing(chd_ph_config_data_t *chd_ph, chd_ph_bucket_t *buckets, chd_ph_item_t *items, + cmph_uint32 * disp_table, chd_ph_sorted_list_t * sorted_lists,cmph_uint32 max_bucket_size) +{ + register cmph_uint32 bucket_size, i, j; + register cmph_uint32 position, probe0_num, probe1_num; + G_GNUC_UNUSED register cmph_uint32 m = 0; + register chd_ph_item_t * item; + if(chd_ph->keys_per_bin > 1) + memset(chd_ph->occup_table, 0, chd_ph->n); + else + memset(chd_ph->occup_table, 0, ((chd_ph->n + 31)/32) * sizeof(cmph_uint32)); + + for(bucket_size = 1; bucket_size <= max_bucket_size; bucket_size++) + for(i = sorted_lists[bucket_size].buckets_list; i < sorted_lists[bucket_size].size + + sorted_lists[bucket_size].buckets_list; i++) + { + j = bucket_size; + item = items + buckets[i].items_list; + probe0_num = disp_table[buckets[i].bucket_id] % chd_ph->n; + probe1_num = disp_table[buckets[i].bucket_id] / chd_ph->n; + for(; j > 0; j--) + { +#ifdef DEBUG + m++; +#endif + position = (cmph_uint32)((item->f + ((cmph_uint64 )item->h) * probe0_num + probe1_num) % chd_ph->n); + if(chd_ph->keys_per_bin > 1) + { + if(chd_ph->occup_table[position] >= chd_ph->keys_per_bin) + { + return 0; + } + (chd_ph->occup_table[position])++; + } + else + { + if(GETBIT32(((cmph_uint32*)chd_ph->occup_table), position)) + { + return 0; + } + SETBIT32(((cmph_uint32*)chd_ph->occup_table), position); + }; + item++; + }; + }; + DEBUGP("We were able to place m = %u keys\n", m); + return 1; +}; + + +cmph_t *chd_ph_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + chd_ph_data_t *chd_phf = NULL; + chd_ph_config_data_t *chd_ph = (chd_ph_config_data_t *)mph->data; + + register double load_factor = c; + register cmph_uint8 searching_success = 0; + register cmph_uint32 max_probes = 1 << 20; // default value for max_probes + register cmph_uint32 iterations = 100; + chd_ph_bucket_t * buckets = NULL; + chd_ph_item_t * items = NULL; + register cmph_uint8 failure = 0; + cmph_uint32 max_bucket_size = 0; + chd_ph_sorted_list_t * sorted_lists = NULL; + cmph_uint32 * disp_table = NULL; + register double space_lower_bound = 0; + #ifdef CMPH_TIMING + double construction_time_begin = 0.0; + double construction_time = 0.0; + ELAPSED_TIME_IN_SECONDS(&construction_time_begin); + #endif + + + chd_ph->m = mph->key_source->nkeys; + DEBUGP("m = %u\n", chd_ph->m); + + chd_ph->nbuckets = (cmph_uint32)(chd_ph->m/chd_ph->keys_per_bucket) + 1; + DEBUGP("nbuckets = %u\n", chd_ph->nbuckets); + + if(load_factor < 0.5 ) + { + load_factor = 0.5; + } + + if(load_factor >= 0.99) + { + load_factor = 0.99; + } + + DEBUGP("load_factor = %.3f\n", load_factor); + + chd_ph->n = (cmph_uint32)(chd_ph->m/(chd_ph->keys_per_bin * load_factor)) + 1; + + //Round the number of bins to the prime immediately above + if(chd_ph->n % 2 == 0) chd_ph->n++; + for(;;) + { + if(check_primality(chd_ph->n) == 1) + break; + chd_ph->n += 2; // just odd numbers can be primes for n > 2 + + }; + + DEBUGP("n = %u \n", chd_ph->n); + if(chd_ph->keys_per_bin == 1) + { + space_lower_bound = chd_ph_space_lower_bound(chd_ph->m, chd_ph->n); + } + + if(mph->verbosity) + { + fprintf(stderr, "space lower bound is %.3f bits per key\n", space_lower_bound); + } + + // We allocate the working tables + buckets = chd_ph_bucket_new(chd_ph->nbuckets); + items = (chd_ph_item_t *) calloc(chd_ph->m, sizeof(chd_ph_item_t)); + + max_probes = (cmph_uint32)(((log(chd_ph->m)/log(2))/20) * max_probes); + + if(chd_ph->keys_per_bin == 1) + chd_ph->occup_table = (cmph_uint8 *) calloc(((chd_ph->n + 31)/32), sizeof(cmph_uint32)); + else + chd_ph->occup_table = (cmph_uint8 *) calloc(chd_ph->n, sizeof(cmph_uint8)); + + disp_table = (cmph_uint32 *) calloc(chd_ph->nbuckets, sizeof(cmph_uint32)); +// +// init_genrand(time(0)); + + while(1) + { + iterations --; + if (mph->verbosity) + { + fprintf(stderr, "Starting mapping step for mph creation of %u keys with %u bins\n", chd_ph->m, chd_ph->n); + } + + if(!chd_ph_mapping(mph, buckets, items, &max_bucket_size)) + { + if (mph->verbosity) + { + fprintf(stderr, "Failure in mapping step\n"); + } + failure = 1; + goto cleanup; + } + + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if(sorted_lists) + { + free(sorted_lists); + } + + sorted_lists = chd_ph_ordering(&buckets, &items, chd_ph->nbuckets, chd_ph->m, max_bucket_size); + + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step\n"); + } + + searching_success = chd_ph_searching(chd_ph, buckets, items, max_bucket_size, sorted_lists, max_probes, disp_table); + if(searching_success) break; + + // reset occup_table + if(chd_ph->keys_per_bin > 1) + memset(chd_ph->occup_table, 0, chd_ph->n); + else + memset(chd_ph->occup_table, 0, ((chd_ph->n + 31)/32) * sizeof(cmph_uint32)); + if(iterations == 0) + { + // Cleanup memory + if (mph->verbosity) + { + fprintf(stderr, "Failure because the max trials was exceeded\n"); + } + failure = 1; + goto cleanup; + }; + } + + #ifdef DEBUG + { + if(!chd_ph_check_bin_hashing(chd_ph, buckets, items, disp_table,sorted_lists,max_bucket_size)) + { + + DEBUGP("Error for bin packing generation"); + failure = 1; + goto cleanup; + } + } + #endif + + if (mph->verbosity) + { + fprintf(stderr, "Starting compressing step\n"); + } + + if(chd_ph->cs) + { + free(chd_ph->cs); + } + chd_ph->cs = (compressed_seq_t *) calloc(1, sizeof(compressed_seq_t)); + compressed_seq_init(chd_ph->cs); + compressed_seq_generate(chd_ph->cs, disp_table, chd_ph->nbuckets); + + #ifdef CMPH_TIMING + ELAPSED_TIME_IN_SECONDS(&construction_time); + register double entropy = chd_ph_get_entropy(disp_table, chd_ph->nbuckets, max_probes); + DEBUGP("Entropy = %.4f\n", entropy/chd_ph->m); + #endif + +cleanup: + chd_ph_bucket_destroy(buckets); + free(items); + free(sorted_lists); + free(disp_table); + if(failure) + { + if(chd_ph->hl) + { + hash_state_destroy(chd_ph->hl); + } + chd_ph->hl = NULL; + return NULL; + } + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chd_phf = (chd_ph_data_t *)malloc(sizeof(chd_ph_data_t)); + + chd_phf->cs = chd_ph->cs; + chd_ph->cs = NULL; //transfer memory ownership + chd_phf->hl = chd_ph->hl; + chd_ph->hl = NULL; //transfer memory ownership + chd_phf->n = chd_ph->n; + chd_phf->nbuckets = chd_ph->nbuckets; + + mphf->data = chd_phf; + mphf->size = chd_ph->n; + + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + + #ifdef CMPH_TIMING + register cmph_uint32 space_usage = chd_ph_packed_size(mphf)*8; + construction_time = construction_time - construction_time_begin; + fprintf(stdout, "%u\t%.2f\t%u\t%.4f\t%.4f\t%.4f\t%.4f\n", chd_ph->m, load_factor, chd_ph->keys_per_bucket, construction_time, space_usage/(double)chd_ph->m, space_lower_bound, entropy/chd_ph->m); + #endif + + return mphf; +} + + + +void chd_ph_load(FILE *fd, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + chd_ph_data_t *chd_ph = (chd_ph_data_t *)malloc(sizeof(chd_ph_data_t)); + + DEBUGP("Loading chd_ph mphf\n"); + mphf->data = chd_ph; + + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, fd); + chd_ph->hl = hash_state_load(buf, buflen); + free(buf); + + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + DEBUGP("Compressed sequence structure has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, fd); + chd_ph->cs = (compressed_seq_t *) calloc(1, sizeof(compressed_seq_t)); + compressed_seq_load(chd_ph->cs, buf, buflen); + free(buf); + + // loading n and nbuckets + DEBUGP("Reading n and nbuckets\n"); + nbytes = fread(&(chd_ph->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fread(&(chd_ph->nbuckets), sizeof(cmph_uint32), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } + +} + +int chd_ph_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + chd_ph_data_t *data = (chd_ph_data_t *)mphf->data; + + __cmph_dump(mphf, fd); + + hash_state_dump(data->hl, &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + compressed_seq_dump(data->cs, &buf, &buflen); + DEBUGP("Dumping compressed sequence structure with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + // dumping n and nbuckets + nbytes = fwrite(&(data->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->nbuckets), sizeof(cmph_uint32), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + return 1; +} + +void chd_ph_destroy(cmph_t *mphf) +{ + chd_ph_data_t *data = (chd_ph_data_t *)mphf->data; + compressed_seq_destroy(data->cs); + free(data->cs); + hash_state_destroy(data->hl); + free(data); + free(mphf); + +} + +cmph_uint32 chd_ph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + register chd_ph_data_t * chd_ph = mphf->data; + cmph_uint32 hl[3]; + register cmph_uint32 disp,position; + register cmph_uint32 probe0_num,probe1_num; + register cmph_uint32 f,g,h; + hash_vector(chd_ph->hl, key, keylen, hl); + g = hl[0] % chd_ph->nbuckets; + f = hl[1] % chd_ph->n; + h = hl[2] % (chd_ph->n-1) + 1; + + disp = compressed_seq_query(chd_ph->cs, g); + probe0_num = disp % chd_ph->n; + probe1_num = disp/chd_ph->n; + position = (cmph_uint32)((f + ((cmph_uint64 )h)*probe0_num + probe1_num) % chd_ph->n); + return position; +} + +void chd_ph_pack(cmph_t *mphf, void *packed_mphf) +{ + chd_ph_data_t *data = (chd_ph_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + + // packing hl type + CMPH_HASH hl_type = hash_get_type(data->hl); + *((cmph_uint32 *) ptr) = hl_type; + ptr += sizeof(cmph_uint32); + + // packing hl + hash_state_pack(data->hl, ptr); + ptr += hash_state_packed_size(hl_type); + + // packing n + *((cmph_uint32 *) ptr) = data->n; + ptr += sizeof(data->n); + + // packing nbuckets + *((cmph_uint32 *) ptr) = data->nbuckets; + ptr += sizeof(data->nbuckets); + + // packing cs + compressed_seq_pack(data->cs, ptr); + //ptr += compressed_seq_packed_size(data->cs); + +} + +cmph_uint32 chd_ph_packed_size(cmph_t *mphf) +{ + register chd_ph_data_t *data = (chd_ph_data_t *)mphf->data; + register CMPH_HASH hl_type = hash_get_type(data->hl); + register cmph_uint32 hash_state_pack_size = hash_state_packed_size(hl_type); + register cmph_uint32 cs_pack_size = compressed_seq_packed_size(data->cs); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_pack_size + cs_pack_size + 3*sizeof(cmph_uint32)); + +} + +cmph_uint32 chd_ph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register CMPH_HASH hl_type = *(cmph_uint32 *)packed_mphf; + register cmph_uint8 *hl_ptr = (cmph_uint8 *)(packed_mphf) + 4; + + register cmph_uint32 * ptr = (cmph_uint32 *)(hl_ptr + hash_state_packed_size(hl_type)); + register cmph_uint32 n = *ptr++; + register cmph_uint32 nbuckets = *ptr++; + cmph_uint32 hl[3]; + + register cmph_uint32 disp,position; + register cmph_uint32 probe0_num,probe1_num; + register cmph_uint32 f,g,h; + + hash_vector_packed(hl_ptr, hl_type, key, keylen, hl); + + g = hl[0] % nbuckets; + f = hl[1] % n; + h = hl[2] % (n-1) + 1; + + disp = compressed_seq_query_packed(ptr, g); + probe0_num = disp % n; + probe1_num = disp/n; + position = (cmph_uint32)((f + ((cmph_uint64 )h)*probe0_num + probe1_num) % n); + return position; +} + + + diff --git a/girepository/cmph/chd_ph.h b/girepository/cmph/chd_ph.h new file mode 100644 index 0000000..03e4087 --- /dev/null +++ b/girepository/cmph/chd_ph.h @@ -0,0 +1,59 @@ +#ifndef _CMPH_CHD_PH_H__ +#define _CMPH_CHD_PH_H__ + +#include "cmph.h" + +typedef struct __chd_ph_data_t chd_ph_data_t; +typedef struct __chd_ph_config_data_t chd_ph_config_data_t; + +/* Config API */ +chd_ph_config_data_t *chd_ph_config_new(void); +void chd_ph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); + +/** \fn void chd_ph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + * \brief Allows to set the number of keys per bin. + * \param mph pointer to the configuration structure + * \param keys_per_bin value for the number of keys per bin + */ +void chd_ph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); + +/** \fn void chd_ph_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); + * \brief Allows to set the number of keys per bucket. + * \param mph pointer to the configuration structure + * \param keys_per_bucket value for the number of keys per bucket + */ +void chd_ph_config_set_b(cmph_config_t *mph, cmph_uint32 keys_per_bucket); +void chd_ph_config_destroy(cmph_config_t *mph); + + +/* Chd algorithm API */ +cmph_t *chd_ph_new(cmph_config_t *mph, double c); +void chd_ph_load(FILE *fd, cmph_t *mphf); +int chd_ph_dump(cmph_t *mphf, FILE *fd); +void chd_ph_destroy(cmph_t *mphf); +cmph_uint32 chd_ph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void chd_ph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void chd_ph_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 chd_ph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 chd_ph_packed_size(cmph_t *mphf); + +/** cmph_uint32 chd_ph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 chd_ph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/chd_structs.h b/girepository/cmph/chd_structs.h new file mode 100644 index 0000000..d62f682 --- /dev/null +++ b/girepository/cmph/chd_structs.h @@ -0,0 +1,21 @@ +#ifndef __CMPH_CHD_STRUCTS_H__ +#define __CMPH_CHD_STRUCTS_H__ + +#include "chd_structs_ph.h" +#include "chd_ph.h" +#include "compressed_rank.h" + +struct __chd_data_t +{ + cmph_uint32 packed_cr_size; + cmph_uint8 * packed_cr; // packed compressed rank structure to control the number of zeros in a bit vector + + cmph_uint32 packed_chd_phf_size; + cmph_uint8 * packed_chd_phf; +}; + +struct __chd_config_data_t +{ + cmph_config_t *chd_ph; // chd_ph algorithm must be used here +}; +#endif diff --git a/girepository/cmph/chd_structs_ph.h b/girepository/cmph/chd_structs_ph.h new file mode 100644 index 0000000..d869218 --- /dev/null +++ b/girepository/cmph/chd_structs_ph.h @@ -0,0 +1,29 @@ +#ifndef __CMPH_CHD_PH_STRUCTS_H__ +#define __CMPH_CHD_PH_STRUCTS_H__ + +#include "hash_state.h" +#include "compressed_seq.h" + +struct __chd_ph_data_t +{ + compressed_seq_t * cs; // compressed displacement values + cmph_uint32 nbuckets; // number of buckets + cmph_uint32 n; // number of bins + hash_state_t *hl; // linear hash function +}; + +struct __chd_ph_config_data_t +{ + CMPH_HASH hashfunc; // linear hash function to be used + compressed_seq_t * cs; // compressed displacement values + cmph_uint32 nbuckets; // number of buckets + cmph_uint32 n; // number of bins + hash_state_t *hl; // linear hash function + + cmph_uint32 m; // number of keys + cmph_uint8 use_h; // flag to indicate the of use of a heuristic (use_h = 1) + cmph_uint32 keys_per_bin;//maximum number of keys per bin + cmph_uint32 keys_per_bucket; // average number of keys per bucket + cmph_uint8 *occup_table; // table that indicates occupied positions +}; +#endif diff --git a/girepository/cmph/chm.c b/girepository/cmph/chm.c new file mode 100644 index 0000000..36a07a0 --- /dev/null +++ b/girepository/cmph/chm.c @@ -0,0 +1,396 @@ +#include "graph.h" +#include "chm.h" +#include "cmph_structs.h" +#include "chm_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +static int chm_gen_edges(cmph_config_t *mph); +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v); + +chm_config_data_t *chm_config_new(void) +{ + chm_config_data_t *chm = NULL; + chm = (chm_config_data_t *)malloc(sizeof(chm_config_data_t)); + assert(chm); + memset(chm, 0, sizeof(chm_config_data_t)); + chm->hashfuncs[0] = CMPH_HASH_JENKINS; + chm->hashfuncs[1] = CMPH_HASH_JENKINS; + chm->g = NULL; + chm->graph = NULL; + chm->hashes = NULL; + return chm; +} +void chm_config_destroy(cmph_config_t *mph) +{ + chm_config_data_t *data = (chm_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //chm only uses two hash functions + chm->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *chm_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + chm_data_t *chmf = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + chm->m = mph->key_source->nkeys; + if (c == 0) c = 2.09; + chm->n = (cmph_uint32)ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", chm->m, chm->n, c); + chm->graph = graph_new(chm->n, chm->m); + DEBUGP("Created graph\n"); + + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) chm->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", chm->m, chm->n); + } + while(1) + { + int ok; + chm->hashes[0] = hash_state_new(chm->hashfuncs[0], chm->n); + chm->hashes[1] = hash_state_new(chm->hashfuncs[1], chm->n); + ok = chm_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(chm->hashes[0]); + chm->hashes[0] = NULL; + hash_state_destroy(chm->hashes[1]); + chm->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(chm->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (cmph_uint8 *)malloc((size_t)(chm->n/8 + 1)); + memset(visited, 0, (size_t)(chm->n/8 + 1)); + free(chm->g); + chm->g = (cmph_uint32 *)malloc(chm->n * sizeof(cmph_uint32)); + assert(chm->g); + for (i = 0; i < chm->n; ++i) + { + if (!GETBIT(visited,i)) + { + chm->g[i] = 0; + chm_traverse(chm, visited, i); + } + } + graph_destroy(chm->graph); + free(visited); + chm->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + chmf = (chm_data_t *)malloc(sizeof(chm_data_t)); + chmf->g = chm->g; + chm->g = NULL; //transfer memory ownership + chmf->hashes = chm->hashes; + chm->hashes = NULL; //transfer memory ownership + chmf->n = chm->n; + chmf->m = chm->m; + mphf->data = chmf; + mphf->size = chm->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void chm_traverse(chm_config_data_t *chm, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(chm->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(chm->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(chm->graph, v, neighbor)); + chm->g[neighbor] = graph_edge_id(chm->graph, v, neighbor) - chm->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", chm->g[neighbor], graph_edge_id(chm->graph, v, neighbor), chm->g[v], chm->m); + chm_traverse(chm, visited, neighbor); + } +} + +static int chm_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + chm_config_data_t *chm = (chm_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", chm->n, cmph_hash_names[chm->hashfuncs[0]], cmph_hash_names[chm->hashfuncs[1]]); + graph_clear_edges(chm->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(chm->hashes[0], key, keylen) % chm->n; + h2 = hash(chm->hashes[1], key, keylen) % chm->n; + if (h1 == h2) if (++h2 >= chm->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(chm->graph, h1, h2); + } + cycles = graph_is_cyclic(chm->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int chm_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + chm_data_t *data = (chm_data_t *)mphf->data; + register size_t nbytes; + + __cmph_dump(mphf, fd); + + nbytes = fwrite(&two, sizeof(cmph_uint32), (size_t)1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->n), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + + nbytes = fwrite(data->g, sizeof(cmph_uint32)*data->n, (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } +/* #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif*/ + return 1; +} + +void chm_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + chm_data_t *chm = (chm_data_t *)malloc(sizeof(chm_data_t)); + register size_t nbytes; + DEBUGP("Loading chm mphf\n"); + mphf->data = chm; + nbytes = fread(&nhashes, sizeof(cmph_uint32), (size_t)1, f); + chm->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + chm->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + state = hash_state_load(buf, buflen); + chm->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + nbytes = fread(&(chm->n), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(chm->m), sizeof(cmph_uint32), (size_t)1, f); + + chm->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*chm->n); + nbytes = fread(chm->g, chm->n*sizeof(cmph_uint32), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return; + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < chm->n; ++i) fprintf(stderr, "%u ", chm->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + chm_data_t *chm = mphf->data; + cmph_uint32 h1 = hash(chm->hashes[0], key, keylen) % chm->n; + cmph_uint32 h2 = hash(chm->hashes[1], key, keylen) % chm->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= chm->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, chm->g[h1], chm->g[h2], chm->m); + return (chm->g[h1] + chm->g[h2]) % chm->m; +} +void chm_destroy(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} + +/** \fn void chm_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void chm_pack(cmph_t *mphf, void *packed_mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + CMPH_HASH h2_type; + + // packing h1 type + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + *((cmph_uint32 *) ptr) = h1_type; + ptr += sizeof(cmph_uint32); + + // packing h1 + hash_state_pack(data->hashes[0], ptr); + ptr += hash_state_packed_size(h1_type); + + // packing h2 type + h2_type = hash_get_type(data->hashes[1]); + *((cmph_uint32 *) ptr) = h2_type; + ptr += sizeof(cmph_uint32); + + // packing h2 + hash_state_pack(data->hashes[1], ptr); + ptr += hash_state_packed_size(h2_type); + + // packing n + *((cmph_uint32 *) ptr) = data->n; + ptr += sizeof(data->n); + + // packing m + *((cmph_uint32 *) ptr) = data->m; + ptr += sizeof(data->m); + + // packing g + memcpy(ptr, data->g, sizeof(cmph_uint32)*data->n); +} + +/** \fn cmph_uint32 chm_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 chm_packed_size(cmph_t *mphf) +{ + chm_data_t *data = (chm_data_t *)mphf->data; + CMPH_HASH h1_type = hash_get_type(data->hashes[0]); + CMPH_HASH h2_type = hash_get_type(data->hashes[1]); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_packed_size(h1_type) + hash_state_packed_size(h2_type) + + 4*sizeof(cmph_uint32) + sizeof(cmph_uint32)*data->n); +} + +/** cmph_uint32 chm_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 chm_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint8 *h1_ptr = packed_mphf; + register CMPH_HASH h1_type = *((cmph_uint32 *)h1_ptr); + register cmph_uint8 *h2_ptr; + register CMPH_HASH h2_type; + register cmph_uint32 *g_ptr; + register cmph_uint32 n, m, h1, h2; + + h1_ptr += 4; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + h2_type = *((cmph_uint32 *)h2_ptr); + h2_ptr += 4; + + g_ptr = (cmph_uint32 *)(h2_ptr + hash_state_packed_size(h2_type)); + + n = *g_ptr++; + m = *g_ptr++; + + h1 = hash_packed(h1_ptr, h1_type, key, keylen) % n; + h2 = hash_packed(h2_ptr, h2_type, key, keylen) % n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, g_ptr[h1], g_ptr[h2], m); + return (g_ptr[h1] + g_ptr[h2]) % m; +} diff --git a/girepository/cmph/chm.h b/girepository/cmph/chm.h new file mode 100644 index 0000000..392d23a --- /dev/null +++ b/girepository/cmph/chm.h @@ -0,0 +1,42 @@ +#ifndef __CMPH_CHM_H__ +#define __CMPH_CHM_H__ + +#include "cmph.h" + +typedef struct __chm_data_t chm_data_t; +typedef struct __chm_config_data_t chm_config_data_t; + +chm_config_data_t *chm_config_new(void); +void chm_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void chm_config_destroy(cmph_config_t *mph); +cmph_t *chm_new(cmph_config_t *mph, double c); + +void chm_load(FILE *f, cmph_t *mphf); +int chm_dump(cmph_t *mphf, FILE *f); +void chm_destroy(cmph_t *mphf); +cmph_uint32 chm_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void chm_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void chm_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 chm_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 chm_packed_size(cmph_t *mphf); + +/** cmph_uint32 chm_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 chm_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/chm_structs.h b/girepository/cmph/chm_structs.h new file mode 100644 index 0000000..fcad1bc --- /dev/null +++ b/girepository/cmph/chm_structs.h @@ -0,0 +1,24 @@ +#ifndef __CMPH_CHM_STRUCTS_H__ +#define __CMPH_CHM_STRUCTS_H__ + +#include "hash_state.h" + +struct __chm_data_t +{ + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + cmph_uint32 *g; + hash_state_t **hashes; +}; + +struct __chm_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; //edges (words) count + cmph_uint32 n; //vertex count + graph_t *graph; + cmph_uint32 *g; + hash_state_t **hashes; +}; + +#endif diff --git a/girepository/cmph/cmph.c b/girepository/cmph/cmph.c new file mode 100644 index 0000000..3fd40a2 --- /dev/null +++ b/girepository/cmph/cmph.c @@ -0,0 +1,844 @@ +#include "cmph.h" +#include "cmph_structs.h" +#include "chm.h" +#include "bmz.h" +#include "bmz8.h" +#include "brz.h" +#include "fch.h" +#include "bdz.h" +#include "bdz_ph.h" +#include "chd_ph.h" +#include "chd.h" + +#include +#include +#include +//#define DEBUG +#include "debug.h" + +const char *cmph_names[] = {"bmz", "bmz8", "chm", "brz", "fch", "bdz", "bdz_ph", "chd_ph", "chd", NULL }; + +typedef struct +{ + void *vector; + cmph_uint32 position; // access position when data is a vector +} cmph_vector_t; + + + +/** + * Support a vector of struct as the source of keys. + * + * E.g. The keys could be the fieldB's in a vector of struct rec where + * struct rec is defined as: + * struct rec { + * fieldA; + * fieldB; + * fieldC; + * } + */ +typedef struct +{ + void *vector; /* Pointer to the vector of struct */ + cmph_uint32 position; /* current position */ + cmph_uint32 struct_size; /* The size of the struct */ + cmph_uint32 key_offset; /* The byte offset of the key in the struct */ + cmph_uint32 key_len; /* The length of the key */ +} cmph_struct_vector_t; + + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys); +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source); + +static cmph_io_adapter_t *cmph_io_struct_vector_new(void * vector, cmph_uint32 struct_size, cmph_uint32 key_offset, cmph_uint32 key_len, cmph_uint32 nkeys); +static void cmph_io_struct_vector_destroy(cmph_io_adapter_t * key_source); + +static int key_nlfile_read(void *data, char **key, cmph_uint32 *keylen) +{ + FILE *fd = (FILE *)data; + *key = NULL; + *keylen = 0; + while(1) + { + char buf[BUFSIZ]; + char *c = fgets(buf, BUFSIZ, fd); + if (c == NULL) return -1; + if (feof(fd)) return -1; + *key = (char *)realloc(*key, *keylen + strlen(buf) + 1); + memcpy(*key + *keylen, buf, strlen(buf)); + *keylen += (cmph_uint32)strlen(buf); + if (buf[strlen(buf) - 1] != '\n') continue; + break; + } + if ((*keylen) && (*key)[*keylen - 1] == '\n') + { + (*key)[(*keylen) - 1] = 0; + --(*keylen); + } + return (int)(*keylen); +} + +static int key_byte_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_uint8 **keys_vd = (cmph_uint8 **)cmph_vector->vector; + size_t size; + memcpy(keylen, keys_vd[cmph_vector->position], sizeof(*keylen)); + size = *keylen; + *key = (char *)malloc(size); + memcpy(*key, keys_vd[cmph_vector->position] + sizeof(*keylen), size); + cmph_vector->position = cmph_vector->position + 1; + return (int)(*keylen); + +} + +static int key_struct_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_struct_vector_t *cmph_struct_vector = (cmph_struct_vector_t *)data; + char *keys_vd = (char *)cmph_struct_vector->vector; + size_t size; + *keylen = cmph_struct_vector->key_len; + size = *keylen; + *key = (char *)malloc(size); + memcpy(*key, (keys_vd + (cmph_struct_vector->position * cmph_struct_vector->struct_size) + cmph_struct_vector->key_offset), size); + cmph_struct_vector->position = cmph_struct_vector->position + 1; + return (int)(*keylen); +} + +static int key_vector_read(void *data, char **key, cmph_uint32 *keylen) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + char **keys_vd = (char **)cmph_vector->vector; + size_t size; + *keylen = (cmph_uint32)strlen(keys_vd[cmph_vector->position]); + size = *keylen; + *key = (char *)malloc(size + 1); + strcpy(*key, keys_vd[cmph_vector->position]); + cmph_vector->position = cmph_vector->position + 1; + return (int)(*keylen); + +} + + +static void key_nlfile_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + +static void key_vector_dispose(void *data, char *key, cmph_uint32 keylen) +{ + free(key); +} + +static void key_nlfile_rewind(void *data) +{ + FILE *fd = (FILE *)data; + rewind(fd); +} + +static void key_struct_vector_rewind(void *data) +{ + cmph_struct_vector_t *cmph_struct_vector = (cmph_struct_vector_t *)data; + cmph_struct_vector->position = 0; +} + +static void key_vector_rewind(void *data) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)data; + cmph_vector->position = 0; +} + +static cmph_uint32 count_nlfile_keys(FILE *fd) +{ + cmph_uint32 count = 0; + rewind(fd); + while(1) + { + char buf[BUFSIZ]; + if (fgets(buf, BUFSIZ, fd) == NULL) break; + if (feof(fd)) break; + if (buf[strlen(buf) - 1] != '\n') continue; + ++count; + } + rewind(fd); + return count; +} + +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd) +{ + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = count_nlfile_keys(keys_fd); + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + assert(key_source); + key_source->data = (void *)keys_fd; + key_source->nkeys = nkeys; + key_source->read = key_nlfile_read; + key_source->dispose = key_nlfile_dispose; + key_source->rewind = key_nlfile_rewind; + return key_source; +} + +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source) +{ + free(key_source); +} + + +static cmph_io_adapter_t *cmph_io_struct_vector_new(void * vector, cmph_uint32 struct_size, cmph_uint32 key_offset, cmph_uint32 key_len, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_struct_vector_t * cmph_struct_vector = (cmph_struct_vector_t *)malloc(sizeof(cmph_struct_vector_t)); + assert(key_source); + assert(cmph_struct_vector); + cmph_struct_vector->vector = vector; + cmph_struct_vector->position = 0; + cmph_struct_vector->struct_size = struct_size; + cmph_struct_vector->key_offset = key_offset; + cmph_struct_vector->key_len = key_len; + key_source->data = (void *)cmph_struct_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_struct_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_struct_vector_t *cmph_struct_vector = (cmph_struct_vector_t *)key_source->data; + cmph_struct_vector->vector = NULL; + free(cmph_struct_vector); + free(key_source); +} + +static cmph_io_adapter_t *cmph_io_vector_new(void * vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = (cmph_io_adapter_t *)malloc(sizeof(cmph_io_adapter_t)); + cmph_vector_t * cmph_vector = (cmph_vector_t *)malloc(sizeof(cmph_vector_t)); + assert(key_source); + assert(cmph_vector); + cmph_vector->vector = vector; + cmph_vector->position = 0; + key_source->data = (void *)cmph_vector; + key_source->nkeys = nkeys; + return key_source; +} + +static void cmph_io_vector_destroy(cmph_io_adapter_t * key_source) +{ + cmph_vector_t *cmph_vector = (cmph_vector_t *)key_source->data; + cmph_vector->vector = NULL; + free(cmph_vector); + free(key_source); +} + +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_byte_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} + +cmph_io_adapter_t *cmph_io_struct_vector_adapter(void * vector, cmph_uint32 struct_size, cmph_uint32 key_offset, cmph_uint32 key_len, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_struct_vector_new(vector, struct_size, key_offset, key_len, nkeys); + key_source->read = key_struct_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_struct_vector_rewind; + return key_source; +} + +void cmph_io_struct_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_struct_vector_destroy(key_source); +} + +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys) +{ + cmph_io_adapter_t * key_source = cmph_io_vector_new(vector, nkeys); + key_source->read = key_vector_read; + key_source->dispose = key_vector_dispose; + key_source->rewind = key_vector_rewind; + return key_source; +} + +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source) +{ + cmph_io_vector_destroy(key_source); +} + +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source) +{ + cmph_config_t *mph = NULL; + mph = __config_new(key_source); + assert(mph); + mph->algo = CMPH_CHM; // default value + mph->data = chm_config_new(); + return mph; +} + +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo) +{ + if (algo != mph->algo) + { + switch (mph->algo) + { + case CMPH_CHM: + chm_config_destroy(mph); + break; + case CMPH_BMZ: + bmz_config_destroy(mph); + break; + case CMPH_BMZ8: + bmz8_config_destroy(mph); + break; + case CMPH_BRZ: + brz_config_destroy(mph); + break; + case CMPH_FCH: + fch_config_destroy(mph); + break; + case CMPH_BDZ: + bdz_config_destroy(mph); + break; + case CMPH_BDZ_PH: + bdz_ph_config_destroy(mph); + break; + case CMPH_CHD_PH: + chd_ph_config_destroy(mph); + break; + case CMPH_CHD: + chd_config_destroy(mph); + break; + default: + assert(0); + } + switch(algo) + { + case CMPH_CHM: + mph->data = chm_config_new(); + break; + case CMPH_BMZ: + mph->data = bmz_config_new(); + break; + case CMPH_BMZ8: + mph->data = bmz8_config_new(); + break; + case CMPH_BRZ: + mph->data = brz_config_new(); + break; + case CMPH_FCH: + mph->data = fch_config_new(); + break; + case CMPH_BDZ: + mph->data = bdz_config_new(); + break; + case CMPH_BDZ_PH: + mph->data = bdz_ph_config_new(); + break; + case CMPH_CHD_PH: + mph->data = chd_ph_config_new(); + break; + case CMPH_CHD: + mph->data = chd_config_new(mph); + break; + default: + assert(0); + } + } + mph->algo = algo; +} + +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir) +{ + if (mph->algo == CMPH_BRZ) + { + brz_config_set_tmp_dir(mph, tmp_dir); + } +} + + +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd) +{ + if (mph->algo == CMPH_BRZ) + { + brz_config_set_mphf_fd(mph, mphf_fd); + } +} + +void cmph_config_set_b(cmph_config_t *mph, cmph_uint32 b) +{ + if (mph->algo == CMPH_BRZ) + { + brz_config_set_b(mph, b); + } + else if (mph->algo == CMPH_BDZ) + { + bdz_config_set_b(mph, b); + } + else if (mph->algo == CMPH_CHD_PH) + { + chd_ph_config_set_b(mph, b); + } + else if (mph->algo == CMPH_CHD) + { + chd_config_set_b(mph, b); + } +} + +void cmph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin) +{ + if (mph->algo == CMPH_CHD_PH) + { + chd_ph_config_set_keys_per_bin(mph, keys_per_bin); + } + else if (mph->algo == CMPH_CHD) + { + chd_config_set_keys_per_bin(mph, keys_per_bin); + } +} + +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability) +{ + if (mph->algo == CMPH_BRZ) + { + brz_config_set_memory_availability(mph, memory_availability); + } +} + +void cmph_config_destroy(cmph_config_t *mph) +{ + if(mph) + { + DEBUGP("Destroying mph with algo %s\n", cmph_names[mph->algo]); + switch (mph->algo) + { + case CMPH_CHM: + chm_config_destroy(mph); + break; + case CMPH_BMZ: /* included -- Fabiano */ + bmz_config_destroy(mph); + break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_destroy(mph); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_destroy(mph); + break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_destroy(mph); + break; + case CMPH_BDZ: /* included -- Fabiano */ + bdz_config_destroy(mph); + break; + case CMPH_BDZ_PH: /* included -- Fabiano */ + bdz_ph_config_destroy(mph); + break; + case CMPH_CHD_PH: /* included -- Fabiano */ + chd_ph_config_destroy(mph); + break; + case CMPH_CHD: /* included -- Fabiano */ + chd_config_destroy(mph); + break; + default: + assert(0); + } + __config_destroy(mph); + } +} + +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity) +{ + mph->verbosity = verbosity; +} + +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + switch (mph->algo) + { + case CMPH_CHM: + chm_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_BMZ: /* included -- Fabiano */ + bmz_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_FCH: /* included -- Fabiano */ + fch_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_BDZ: /* included -- Fabiano */ + bdz_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_BDZ_PH: /* included -- Fabiano */ + bdz_ph_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_CHD_PH: /* included -- Fabiano */ + chd_ph_config_set_hashfuncs(mph, hashfuncs); + break; + case CMPH_CHD: /* included -- Fabiano */ + chd_config_set_hashfuncs(mph, hashfuncs); + break; + default: + break; + } + return; +} +void cmph_config_set_graphsize(cmph_config_t *mph, double c) +{ + mph->c = c; + return; +} + +cmph_t *cmph_new(cmph_config_t *mph) +{ + cmph_t *mphf = NULL; + double c = mph->c; + + DEBUGP("Creating mph with algorithm %s\n", cmph_names[mph->algo]); + switch (mph->algo) + { + case CMPH_CHM: + DEBUGP("Creating chm hash\n"); + mphf = chm_new(mph, c); + break; + case CMPH_BMZ: /* included -- Fabiano */ + DEBUGP("Creating bmz hash\n"); + mphf = bmz_new(mph, c); + break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Creating bmz8 hash\n"); + mphf = bmz8_new(mph, c); + break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Creating brz hash\n"); + if (c >= 2.0) brz_config_set_algo(mph, CMPH_FCH); + else brz_config_set_algo(mph, CMPH_BMZ8); + mphf = brz_new(mph, c); + break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Creating fch hash\n"); + mphf = fch_new(mph, c); + break; + case CMPH_BDZ: /* included -- Fabiano */ + DEBUGP("Creating bdz hash\n"); + mphf = bdz_new(mph, c); + break; + case CMPH_BDZ_PH: /* included -- Fabiano */ + DEBUGP("Creating bdz_ph hash\n"); + mphf = bdz_ph_new(mph, c); + break; + case CMPH_CHD_PH: /* included -- Fabiano */ + DEBUGP("Creating chd_ph hash\n"); + mphf = chd_ph_new(mph, c); + break; + case CMPH_CHD: /* included -- Fabiano */ + DEBUGP("Creating chd hash\n"); + mphf = chd_new(mph, c); + break; + default: + assert(0); + } + return mphf; +} + +int cmph_dump(cmph_t *mphf, FILE *f) +{ + switch (mphf->algo) + { + case CMPH_CHM: + return chm_dump(mphf, f); + case CMPH_BMZ: /* included -- Fabiano */ + return bmz_dump(mphf, f); + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_dump(mphf, f); + case CMPH_BRZ: /* included -- Fabiano */ + return brz_dump(mphf, f); + case CMPH_FCH: /* included -- Fabiano */ + return fch_dump(mphf, f); + case CMPH_BDZ: /* included -- Fabiano */ + return bdz_dump(mphf, f); + case CMPH_BDZ_PH: /* included -- Fabiano */ + return bdz_ph_dump(mphf, f); + case CMPH_CHD_PH: /* included -- Fabiano */ + return chd_ph_dump(mphf, f); + case CMPH_CHD: /* included -- Fabiano */ + return chd_dump(mphf, f); + default: + assert(0); + } + assert(0); + return 0; +} +cmph_t *cmph_load(FILE *f) +{ + cmph_t *mphf = NULL; + DEBUGP("Loading mphf generic parts\n"); + mphf = __cmph_load(f); + if (mphf == NULL) return NULL; + DEBUGP("Loading mphf algorithm dependent parts\n"); + + switch (mphf->algo) + { + case CMPH_CHM: + chm_load(f, mphf); + break; + case CMPH_BMZ: /* included -- Fabiano */ + DEBUGP("Loading bmz algorithm dependent parts\n"); + bmz_load(f, mphf); + break; + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("Loading bmz8 algorithm dependent parts\n"); + bmz8_load(f, mphf); + break; + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("Loading brz algorithm dependent parts\n"); + brz_load(f, mphf); + break; + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("Loading fch algorithm dependent parts\n"); + fch_load(f, mphf); + break; + case CMPH_BDZ: /* included -- Fabiano */ + DEBUGP("Loading bdz algorithm dependent parts\n"); + bdz_load(f, mphf); + break; + case CMPH_BDZ_PH: /* included -- Fabiano */ + DEBUGP("Loading bdz_ph algorithm dependent parts\n"); + bdz_ph_load(f, mphf); + break; + case CMPH_CHD_PH: /* included -- Fabiano */ + DEBUGP("Loading chd_ph algorithm dependent parts\n"); + chd_ph_load(f, mphf); + break; + case CMPH_CHD: /* included -- Fabiano */ + DEBUGP("Loading chd algorithm dependent parts\n"); + chd_load(f, mphf); + break; + default: + assert(0); + } + DEBUGP("Loaded mphf\n"); + return mphf; +} + + +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + DEBUGP("mphf algorithm: %u \n", mphf->algo); + switch(mphf->algo) + { + case CMPH_CHM: + return chm_search(mphf, key, keylen); + case CMPH_BMZ: /* included -- Fabiano */ + DEBUGP("bmz algorithm search\n"); + return bmz_search(mphf, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + DEBUGP("bmz8 algorithm search\n"); + return bmz8_search(mphf, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + DEBUGP("brz algorithm search\n"); + return brz_search(mphf, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + DEBUGP("fch algorithm search\n"); + return fch_search(mphf, key, keylen); + case CMPH_BDZ: /* included -- Fabiano */ + DEBUGP("bdz algorithm search\n"); + return bdz_search(mphf, key, keylen); + case CMPH_BDZ_PH: /* included -- Fabiano */ + DEBUGP("bdz_ph algorithm search\n"); + return bdz_ph_search(mphf, key, keylen); + case CMPH_CHD_PH: /* included -- Fabiano */ + DEBUGP("chd_ph algorithm search\n"); + return chd_ph_search(mphf, key, keylen); + case CMPH_CHD: /* included -- Fabiano */ + DEBUGP("chd algorithm search\n"); + return chd_search(mphf, key, keylen); + default: + assert(0); + } + assert(0); + return 0; +} + +cmph_uint32 cmph_size(cmph_t *mphf) +{ + return mphf->size; +} + +void cmph_destroy(cmph_t *mphf) +{ + switch(mphf->algo) + { + case CMPH_CHM: + chm_destroy(mphf); + return; + case CMPH_BMZ: /* included -- Fabiano */ + bmz_destroy(mphf); + return; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_destroy(mphf); + return; + case CMPH_BRZ: /* included -- Fabiano */ + brz_destroy(mphf); + return; + case CMPH_FCH: /* included -- Fabiano */ + fch_destroy(mphf); + return; + case CMPH_BDZ: /* included -- Fabiano */ + bdz_destroy(mphf); + return; + case CMPH_BDZ_PH: /* included -- Fabiano */ + bdz_ph_destroy(mphf); + return; + case CMPH_CHD_PH: /* included -- Fabiano */ + chd_ph_destroy(mphf); + return; + case CMPH_CHD: /* included -- Fabiano */ + chd_destroy(mphf); + return; + default: + assert(0); + } + assert(0); + return; +} + + +/** \fn void cmph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void cmph_pack(cmph_t *mphf, void *packed_mphf) +{ + // packing algorithm type to be used in cmph.c + cmph_uint32 * ptr = (cmph_uint32 *) packed_mphf; + *ptr++ = mphf->algo; + DEBUGP("mphf->algo = %u\n", mphf->algo); + switch(mphf->algo) + { + case CMPH_CHM: + chm_pack(mphf, ptr); + break; + case CMPH_BMZ: /* included -- Fabiano */ + bmz_pack(mphf, ptr); + break; + case CMPH_BMZ8: /* included -- Fabiano */ + bmz8_pack(mphf, ptr); + break; + case CMPH_BRZ: /* included -- Fabiano */ + brz_pack(mphf, ptr); + break; + case CMPH_FCH: /* included -- Fabiano */ + fch_pack(mphf, ptr); + break; + case CMPH_BDZ: /* included -- Fabiano */ + bdz_pack(mphf, ptr); + break; + case CMPH_BDZ_PH: /* included -- Fabiano */ + bdz_ph_pack(mphf, ptr); + break; + case CMPH_CHD_PH: /* included -- Fabiano */ + chd_ph_pack(mphf, ptr); + break; + case CMPH_CHD: /* included -- Fabiano */ + chd_pack(mphf, ptr); + break; + default: + assert(0); + } + return; +} + +/** \fn cmph_uint32 cmph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 cmph_packed_size(cmph_t *mphf) +{ + switch(mphf->algo) + { + case CMPH_CHM: + return chm_packed_size(mphf); + case CMPH_BMZ: /* included -- Fabiano */ + return bmz_packed_size(mphf); + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_packed_size(mphf); + case CMPH_BRZ: /* included -- Fabiano */ + return brz_packed_size(mphf); + case CMPH_FCH: /* included -- Fabiano */ + return fch_packed_size(mphf); + case CMPH_BDZ: /* included -- Fabiano */ + return bdz_packed_size(mphf); + case CMPH_BDZ_PH: /* included -- Fabiano */ + return bdz_ph_packed_size(mphf); + case CMPH_CHD_PH: /* included -- Fabiano */ + return chd_ph_packed_size(mphf); + case CMPH_CHD: /* included -- Fabiano */ + return chd_packed_size(mphf); + default: + assert(0); + } + return 0; // FAILURE +} + +/** cmph_uint32 cmph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 cmph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + cmph_uint32 *ptr = (cmph_uint32 *)packed_mphf; +// fprintf(stderr, "algo:%u\n", *ptr); + switch(*ptr) + { + case CMPH_CHM: + return chm_search_packed(++ptr, key, keylen); + case CMPH_BMZ: /* included -- Fabiano */ + return bmz_search_packed(++ptr, key, keylen); + case CMPH_BMZ8: /* included -- Fabiano */ + return bmz8_search_packed(++ptr, key, keylen); + case CMPH_BRZ: /* included -- Fabiano */ + return brz_search_packed(++ptr, key, keylen); + case CMPH_FCH: /* included -- Fabiano */ + return fch_search_packed(++ptr, key, keylen); + case CMPH_BDZ: /* included -- Fabiano */ + return bdz_search_packed(++ptr, key, keylen); + case CMPH_BDZ_PH: /* included -- Fabiano */ + return bdz_ph_search_packed(++ptr, key, keylen); + case CMPH_CHD_PH: /* included -- Fabiano */ + return chd_ph_search_packed(++ptr, key, keylen); + case CMPH_CHD: /* included -- Fabiano */ + return chd_search_packed(++ptr, key, keylen); + default: + assert(0); + } + return 0; // FAILURE +} diff --git a/girepository/cmph/cmph.h b/girepository/cmph/cmph.h new file mode 100644 index 0000000..1bc009e --- /dev/null +++ b/girepository/cmph/cmph.h @@ -0,0 +1,112 @@ +#ifndef __CMPH_H__ +#define __CMPH_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "cmph_types.h" + +typedef struct __config_t cmph_config_t; +typedef struct __cmph_t cmph_t; + +typedef struct +{ + void *data; + cmph_uint32 nkeys; + int (*read)(void *, char **, cmph_uint32 *); + void (*dispose)(void *, char *, cmph_uint32); + void (*rewind)(void *); +} cmph_io_adapter_t; + +/** Adapter pattern API **/ +/* please call free() in the created adapters */ +cmph_io_adapter_t *cmph_io_nlfile_adapter(FILE * keys_fd); +void cmph_io_nlfile_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_nlnkfile_adapter(FILE * keys_fd, cmph_uint32 nkeys); +void cmph_io_nlnkfile_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_vector_adapter(char ** vector, cmph_uint32 nkeys); +void cmph_io_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_byte_vector_adapter(cmph_uint8 ** vector, cmph_uint32 nkeys); +void cmph_io_byte_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +cmph_io_adapter_t *cmph_io_struct_vector_adapter(void * vector, + cmph_uint32 struct_size, + cmph_uint32 key_offset, + cmph_uint32 key_len, + cmph_uint32 nkeys); + +void cmph_io_struct_vector_adapter_destroy(cmph_io_adapter_t * key_source); + +/** Hash configuration API **/ +cmph_config_t *cmph_config_new(cmph_io_adapter_t *key_source); +void cmph_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void cmph_config_set_verbosity(cmph_config_t *mph, cmph_uint32 verbosity); +void cmph_config_set_graphsize(cmph_config_t *mph, double c); +void cmph_config_set_algo(cmph_config_t *mph, CMPH_ALGO algo); +void cmph_config_set_tmp_dir(cmph_config_t *mph, cmph_uint8 *tmp_dir); +void cmph_config_set_mphf_fd(cmph_config_t *mph, FILE *mphf_fd); +void cmph_config_set_b(cmph_config_t *mph, cmph_uint32 b); +void cmph_config_set_keys_per_bin(cmph_config_t *mph, cmph_uint32 keys_per_bin); +void cmph_config_set_memory_availability(cmph_config_t *mph, cmph_uint32 memory_availability); +void cmph_config_destroy(cmph_config_t *mph); + +/** Hash API **/ +cmph_t *cmph_new(cmph_config_t *mph); + +/** cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + * \brief Computes the mphf value. + * \param mphf pointer to the resulting function + * \param key is the key to be hashed + * \param keylen is the key legth in bytes + * \return The mphf value + */ +cmph_uint32 cmph_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +cmph_uint32 cmph_size(cmph_t *mphf); +void cmph_destroy(cmph_t *mphf); + +/** Hash serialization/deserialization */ +int cmph_dump(cmph_t *mphf, FILE *f); +cmph_t *cmph_load(FILE *f); + +/** \fn void cmph_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the + * \param resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void cmph_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 cmph_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 cmph_packed_size(cmph_t *mphf); + +/** cmph_uint32 cmph_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 cmph_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +// TIMING functions. To use the macro CMPH_TIMING must be defined +#include "cmph_time.h" + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/girepository/cmph/cmph_structs.c b/girepository/cmph/cmph_structs.c new file mode 100644 index 0000000..9ecf5fc --- /dev/null +++ b/girepository/cmph/cmph_structs.c @@ -0,0 +1,76 @@ +#include "cmph_structs.h" + +#include +#include + +//#define DEBUG +#include "debug.h" + +cmph_config_t *__config_new(cmph_io_adapter_t *key_source) +{ + cmph_config_t *mph = (cmph_config_t *)malloc(sizeof(cmph_config_t)); + memset(mph, 0, sizeof(cmph_config_t)); + if (mph == NULL) return NULL; + mph->key_source = key_source; + mph->verbosity = 0; + mph->data = NULL; + mph->c = 0; + return mph; +} + +void __config_destroy(cmph_config_t *mph) +{ + free(mph); +} + +void __cmph_dump(cmph_t *mphf, FILE *fd) +{ + register size_t nbytes; + nbytes = fwrite(cmph_names[mphf->algo], (size_t)(strlen(cmph_names[mphf->algo]) + 1), (size_t)1, fd); + nbytes = fwrite(&(mphf->size), sizeof(mphf->size), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } +} +cmph_t *__cmph_load(FILE *f) +{ + cmph_t *mphf = NULL; + cmph_uint32 i; + char algo_name[BUFSIZ]; + char *ptr = algo_name; + CMPH_ALGO algo = CMPH_COUNT; + register size_t nbytes; + + DEBUGP("Loading mphf\n"); + while(1) + { + size_t c = fread(ptr, (size_t)1, (size_t)1, f); + if (c != 1) return NULL; + if (*ptr == 0) break; + ++ptr; + } + for(i = 0; i < CMPH_COUNT; ++i) + { + if (strcmp(algo_name, cmph_names[i]) == 0) + { + algo = i; + } + } + if (algo == CMPH_COUNT) + { + DEBUGP("Algorithm %s not found\n", algo_name); + return NULL; + } + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = algo; + nbytes = fread(&(mphf->size), sizeof(mphf->size), (size_t)1, f); + mphf->data = NULL; + DEBUGP("Algorithm is %s and mphf is sized %u\n", cmph_names[algo], mphf->size); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + } + + return mphf; +} + + diff --git a/girepository/cmph/cmph_structs.h b/girepository/cmph/cmph_structs.h new file mode 100644 index 0000000..88fafb6 --- /dev/null +++ b/girepository/cmph/cmph_structs.h @@ -0,0 +1,33 @@ +#ifndef __CMPH_STRUCTS_H__ +#define __CMPH_STRUCTS_H__ + +#include "cmph.h" + +/** Hash generation algorithm data + */ +struct __config_t +{ + CMPH_ALGO algo; + cmph_io_adapter_t *key_source; + cmph_uint32 verbosity; + double c; + void *data; // algorithm dependent data +}; + +/** Hash querying algorithm data + */ +struct __cmph_t +{ + CMPH_ALGO algo; + cmph_uint32 size; + cmph_io_adapter_t *key_source; + void *data; // algorithm dependent data +}; + +cmph_config_t *__config_new(cmph_io_adapter_t *key_source); +void __config_destroy(cmph_config_t*); +void __cmph_dump(cmph_t *mphf, FILE *); +cmph_t *__cmph_load(FILE *f); + + +#endif diff --git a/girepository/cmph/cmph_time.h b/girepository/cmph/cmph_time.h new file mode 100644 index 0000000..5d5d893 --- /dev/null +++ b/girepository/cmph/cmph_time.h @@ -0,0 +1,62 @@ +#ifdef ELAPSED_TIME_IN_SECONDS +#undef ELAPSED_TIME_IN_SECONDS +#endif + +#ifdef ELAPSED_TIME_IN_uSECONDS +#undef ELAPSED_TIME_IN_uSECONDS +#endif + +#ifdef __GNUC__ + #include + #ifndef WIN32 + #include + #endif +#endif + +#ifdef __GNUC__ + #ifndef __CMPH_TIME_H__ + #define __CMPH_TIME_H__ + static inline void elapsed_time_in_seconds(double * elapsed_time) + { + struct timeval e_time; + if (gettimeofday(&e_time, NULL) < 0) { + return; + } + *elapsed_time = (double)e_time.tv_sec + ((double)e_time.tv_usec/1000000.0); + } + static inline void dummy_elapsed_time_in_seconds(double * elapsed_time) + { + (void) elapsed_time; + } + static inline void elapsed_time_in_useconds(cmph_uint64 * elapsed_time) + { + struct timeval e_time; + if (gettimeofday(&e_time, NULL) < 0) { + return; + } + *elapsed_time = (cmph_uint64)(e_time.tv_sec*1000000 + e_time.tv_usec); + } + static inline void dummy_elapsed_time_in_useconds(cmph_uint64 * elapsed_time) + { + (void) elapsed_time; + } + #endif +#endif + +#ifdef CMPH_TIMING + #ifdef __GNUC__ + #define ELAPSED_TIME_IN_SECONDS elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS elapsed_time_in_useconds + #else + #define ELAPSED_TIME_IN_SECONDS dummy_elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS dummy_elapsed_time_in_useconds + #endif +#else + #ifdef __GNUC__ + #define ELAPSED_TIME_IN_SECONDS + #define ELAPSED_TIME_IN_uSECONDS + #else + #define ELAPSED_TIME_IN_SECONDS dummy_elapsed_time_in_seconds + #define ELAPSED_TIME_IN_uSECONDS dummy_elapsed_time_in_useconds + #endif +#endif diff --git a/girepository/cmph/cmph_types.h b/girepository/cmph/cmph_types.h new file mode 100644 index 0000000..d5db4c4 --- /dev/null +++ b/girepository/cmph/cmph_types.h @@ -0,0 +1,26 @@ +#include +#include + +#ifndef __CMPH_TYPES_H__ +#define __CMPH_TYPES_H__ + +typedef int8_t cmph_int8; +typedef uint8_t cmph_uint8; + +typedef int16_t cmph_int16; +typedef uint16_t cmph_uint16; + +typedef int32_t cmph_int32; +typedef uint32_t cmph_uint32; + +typedef int64_t cmph_int64; +typedef uint64_t cmph_uint64; + +typedef enum { CMPH_HASH_JENKINS, CMPH_HASH_COUNT } CMPH_HASH; +extern const char *cmph_hash_names[]; +typedef enum { CMPH_BMZ, CMPH_BMZ8, CMPH_CHM, CMPH_BRZ, CMPH_FCH, + CMPH_BDZ, CMPH_BDZ_PH, + CMPH_CHD_PH, CMPH_CHD, CMPH_COUNT } CMPH_ALGO; +extern const char *cmph_names[]; + +#endif diff --git a/girepository/cmph/compressed_rank.c b/girepository/cmph/compressed_rank.c new file mode 100644 index 0000000..8019dbe --- /dev/null +++ b/girepository/cmph/compressed_rank.c @@ -0,0 +1,327 @@ +#include +#include +#include +#include +#include"compressed_rank.h" +#include"bitbool.h" +// #define DEBUG +#include"debug.h" +static inline cmph_uint32 compressed_rank_i_log2(cmph_uint32 x) +{ + register cmph_uint32 res = 0; + + while(x > 1) + { + x >>= 1; + res++; + } + return res; +}; + +void compressed_rank_init(compressed_rank_t * cr) +{ + cr->max_val = 0; + cr->n = 0; + cr->rem_r = 0; + select_init(&cr->sel); + cr->vals_rems = 0; +} + +void compressed_rank_destroy(compressed_rank_t * cr) +{ + free(cr->vals_rems); + cr->vals_rems = 0; + select_destroy(&cr->sel); +} + +void compressed_rank_generate(compressed_rank_t * cr, cmph_uint32 * vals_table, cmph_uint32 n) +{ + register cmph_uint32 i,j; + register cmph_uint32 rems_mask; + register cmph_uint32 * select_vec = 0; + cr->n = n; + cr->max_val = vals_table[cr->n - 1]; + cr->rem_r = compressed_rank_i_log2(cr->max_val/cr->n); + if(cr->rem_r == 0) + { + cr->rem_r = 1; + } + select_vec = (cmph_uint32 *) calloc(cr->max_val >> cr->rem_r, sizeof(cmph_uint32)); + cr->vals_rems = (cmph_uint32 *) calloc(BITS_TABLE_SIZE(cr->n, cr->rem_r), sizeof(cmph_uint32)); + rems_mask = (1U << cr->rem_r) - 1U; + + for(i = 0; i < cr->n; i++) + { + set_bits_value(cr->vals_rems, i, vals_table[i] & rems_mask, cr->rem_r, rems_mask); + } + + for(i = 1, j = 0; i <= cr->max_val >> cr->rem_r; i++) + { + while(i > (vals_table[j] >> cr->rem_r)) + { + j++; + } + select_vec[i - 1] = j; + }; + + + // FABIANO: before it was (cr->total_length >> cr->rem_r) + 1. But I wiped out the + 1 because + // I changed the select structure to work up to m, instead of up to m - 1. + select_generate(&cr->sel, select_vec, cr->max_val >> cr->rem_r, cr->n); + + free(select_vec); +} + +cmph_uint32 compressed_rank_query(compressed_rank_t * cr, cmph_uint32 idx) +{ + register cmph_uint32 rems_mask; + register cmph_uint32 val_quot, val_rem; + register cmph_uint32 sel_res, rank; + + if(idx > cr->max_val) + { + return cr->n; + } + + val_quot = idx >> cr->rem_r; + rems_mask = (1U << cr->rem_r) - 1U; + val_rem = idx & rems_mask; + if(val_quot == 0) + { + rank = sel_res = 0; + } + else + { + sel_res = select_query(&cr->sel, val_quot - 1) + 1; + rank = sel_res - val_quot; + } + + do + { + if(GETBIT32(cr->sel.bits_vec, sel_res)) + { + break; + } + if(get_bits_value(cr->vals_rems, rank, cr->rem_r, rems_mask) >= val_rem) + { + break; + } + sel_res++; + rank++; + } while(1); + + return rank; +} + +cmph_uint32 compressed_rank_get_space_usage(compressed_rank_t * cr) +{ + register cmph_uint32 space_usage = select_get_space_usage(&cr->sel); + space_usage += BITS_TABLE_SIZE(cr->n, cr->rem_r)*(cmph_uint32)sizeof(cmph_uint32)*8; + space_usage += 3*(cmph_uint32)sizeof(cmph_uint32)*8; + return space_usage; +} + +void compressed_rank_dump(compressed_rank_t * cr, char **buf, cmph_uint32 *buflen) +{ + register cmph_uint32 sel_size = select_packed_size(&(cr->sel)); + register cmph_uint32 vals_rems_size = BITS_TABLE_SIZE(cr->n, cr->rem_r) * (cmph_uint32)sizeof(cmph_uint32); + register cmph_uint32 pos = 0; + char * buf_sel = 0; + cmph_uint32 buflen_sel = 0; +#ifdef DEBUG + cmph_uint32 i; +#endif + + *buflen = 4*(cmph_uint32)sizeof(cmph_uint32) + sel_size + vals_rems_size; + + DEBUGP("sel_size = %u\n", sel_size); + DEBUGP("vals_rems_size = %u\n", vals_rems_size); + + *buf = (char *)calloc(*buflen, sizeof(char)); + + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + + // dumping max_val, n and rem_r + memcpy(*buf, &(cr->max_val), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("max_val = %u\n", cr->max_val); + + memcpy(*buf + pos, &(cr->n), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("n = %u\n", cr->n); + + memcpy(*buf + pos, &(cr->rem_r), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("rem_r = %u\n", cr->rem_r); + + // dumping sel + select_dump(&cr->sel, &buf_sel, &buflen_sel); + memcpy(*buf + pos, &buflen_sel, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("buflen_sel = %u\n", buflen_sel); + + memcpy(*buf + pos, buf_sel, buflen_sel); + + #ifdef DEBUG + i = 0; + for(i = 0; i < buflen_sel; i++) + { + DEBUGP("pos = %u -- buf_sel[%u] = %u\n", pos, i, *(*buf + pos + i)); + } + #endif + pos += buflen_sel; + + free(buf_sel); + + // dumping vals_rems + memcpy(*buf + pos, cr->vals_rems, vals_rems_size); + #ifdef DEBUG + for(i = 0; i < vals_rems_size; i++) + { + DEBUGP("pos = %u -- vals_rems_size = %u -- vals_rems[%u] = %u\n", pos, vals_rems_size, i, *(*buf + pos + i)); + } + #endif + pos += vals_rems_size; + + DEBUGP("Dumped compressed rank structure with size %u bytes\n", *buflen); +} + +void compressed_rank_load(compressed_rank_t * cr, const char *buf, cmph_uint32 buflen) +{ + register cmph_uint32 pos = 0; + cmph_uint32 buflen_sel = 0; + register cmph_uint32 vals_rems_size = 0; +#ifdef DEBUG + cmph_uint32 i; +#endif + + // loading max_val, n, and rem_r + memcpy(&(cr->max_val), buf, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("max_val = %u\n", cr->max_val); + + memcpy(&(cr->n), buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("n = %u\n", cr->n); + + memcpy(&(cr->rem_r), buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("rem_r = %u\n", cr->rem_r); + + // loading sel + memcpy(&buflen_sel, buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("buflen_sel = %u\n", buflen_sel); + + select_load(&cr->sel, buf + pos, buflen_sel); + #ifdef DEBUG + i = 0; + for(i = 0; i < buflen_sel; i++) + { + DEBUGP("pos = %u -- buf_sel[%u] = %u\n", pos, i, *(buf + pos + i)); + } + #endif + pos += buflen_sel; + + // loading vals_rems + if(cr->vals_rems) + { + free(cr->vals_rems); + } + vals_rems_size = BITS_TABLE_SIZE(cr->n, cr->rem_r); + cr->vals_rems = (cmph_uint32 *) calloc(vals_rems_size, sizeof(cmph_uint32)); + vals_rems_size *= 4; + memcpy(cr->vals_rems, buf + pos, vals_rems_size); + + #ifdef DEBUG + for(i = 0; i < vals_rems_size; i++) + { + DEBUGP("pos = %u -- vals_rems_size = %u -- vals_rems[%u] = %u\n", pos, vals_rems_size, i, *(buf + pos + i)); + } + #endif + pos += vals_rems_size; + + DEBUGP("Loaded compressed rank structure with size %u bytes\n", buflen); +} + + + +void compressed_rank_pack(compressed_rank_t *cr, void *cr_packed) +{ + if (cr && cr_packed) + { + char *buf = NULL; + cmph_uint32 buflen = 0; + compressed_rank_dump(cr, &buf, &buflen); + memcpy(cr_packed, buf, buflen); + free(buf); + } +} + +cmph_uint32 compressed_rank_packed_size(compressed_rank_t *cr) +{ + register cmph_uint32 sel_size = select_packed_size(&cr->sel); + register cmph_uint32 vals_rems_size = BITS_TABLE_SIZE(cr->n, cr->rem_r) * (cmph_uint32)sizeof(cmph_uint32); + return 4 * (cmph_uint32)sizeof(cmph_uint32) + sel_size + vals_rems_size; +} + +cmph_uint32 compressed_rank_query_packed(void * cr_packed, cmph_uint32 idx) +{ + // unpacking cr_packed + register cmph_uint32 *ptr = (cmph_uint32 *)cr_packed; + register cmph_uint32 max_val = *ptr++; + register cmph_uint32 n = *ptr++; + register cmph_uint32 rem_r = *ptr++; + register cmph_uint32 buflen_sel = *ptr++; + register cmph_uint32 * sel_packed = ptr; + + register cmph_uint32 * bits_vec = sel_packed + 2; // skipping n and m + + register cmph_uint32 * vals_rems = (ptr += (buflen_sel >> 2)); + + // compressed sequence query computation + register cmph_uint32 rems_mask; + register cmph_uint32 val_quot, val_rem; + register cmph_uint32 sel_res, rank; + + if(idx > max_val) + { + return n; + } + + val_quot = idx >> rem_r; + rems_mask = (1U << rem_r) - 1U; + val_rem = idx & rems_mask; + if(val_quot == 0) + { + rank = sel_res = 0; + } + else + { + sel_res = select_query_packed(sel_packed, val_quot - 1) + 1; + rank = sel_res - val_quot; + } + + do + { + if(GETBIT32(bits_vec, sel_res)) + { + break; + } + if(get_bits_value(vals_rems, rank, rem_r, rems_mask) >= val_rem) + { + break; + } + sel_res++; + rank++; + } while(1); + + return rank; +} + + + diff --git a/girepository/cmph/compressed_rank.h b/girepository/cmph/compressed_rank.h new file mode 100644 index 0000000..bfe930d --- /dev/null +++ b/girepository/cmph/compressed_rank.h @@ -0,0 +1,55 @@ +#ifndef __CMPH_COMPRESSED_RANK_H__ +#define __CMPH_COMPRESSED_RANK_H__ + +#include "select.h" + +struct _compressed_rank_t +{ + cmph_uint32 max_val; + cmph_uint32 n; // number of values stored in vals_rems + // The length in bits of each value is decomposed into two compnents: the lg(n) MSBs are stored in rank_select data structure + // the remaining LSBs are stored in a table of n cells, each one of rem_r bits. + cmph_uint32 rem_r; + select_t sel; + cmph_uint32 * vals_rems; +}; + +typedef struct _compressed_rank_t compressed_rank_t; + +void compressed_rank_init(compressed_rank_t * cr); + +void compressed_rank_destroy(compressed_rank_t * cr); + +void compressed_rank_generate(compressed_rank_t * cr, cmph_uint32 * vals_table, cmph_uint32 n); + +cmph_uint32 compressed_rank_query(compressed_rank_t * cr, cmph_uint32 idx); + +cmph_uint32 compressed_rank_get_space_usage(compressed_rank_t * cr); + +void compressed_rank_dump(compressed_rank_t * cr, char **buf, cmph_uint32 *buflen); + +void compressed_rank_load(compressed_rank_t * cr, const char *buf, cmph_uint32 buflen); + + +/** \fn void compressed_rank_pack(compressed_rank_t *cr, void *cr_packed); + * \brief Support the ability to pack a compressed_rank structure into a preallocated contiguous memory space pointed by cr_packed. + * \param cr points to the compressed_rank structure + * \param cr_packed pointer to the contiguous memory area used to store the compressed_rank structure. The size of cr_packed must be at least @see compressed_rank_packed_size + */ +void compressed_rank_pack(compressed_rank_t *cr, void *cr_packed); + +/** \fn cmph_uint32 compressed_rank_packed_size(compressed_rank_t *cr); + * \brief Return the amount of space needed to pack a compressed_rank structure. + * \return the size of the packed compressed_rank structure or zero for failures + */ +cmph_uint32 compressed_rank_packed_size(compressed_rank_t *cr); + + +/** \fn cmph_uint32 compressed_rank_query_packed(void * cr_packed, cmph_uint32 idx); + * \param cr_packed is a pointer to a contiguous memory area + * \param idx is an index to compute the rank + * \return an integer that represents the compressed_rank value. + */ +cmph_uint32 compressed_rank_query_packed(void * cr_packed, cmph_uint32 idx); + +#endif diff --git a/girepository/cmph/compressed_seq.c b/girepository/cmph/compressed_seq.c new file mode 100644 index 0000000..e5191fd --- /dev/null +++ b/girepository/cmph/compressed_seq.c @@ -0,0 +1,384 @@ +#include "compressed_seq.h" +#include +#include +#include +#include +#include + +#include "bitbool.h" + +// #define DEBUG +#include "debug.h" + +static inline cmph_uint32 compressed_seq_i_log2(cmph_uint32 x) +{ + register cmph_uint32 res = 0; + + while(x > 1) + { + x >>= 1; + res++; + } + return res; +}; + +void compressed_seq_init(compressed_seq_t * cs) +{ + select_init(&cs->sel); + cs->n = 0; + cs->rem_r = 0; + cs->length_rems = 0; + cs->total_length = 0; + cs->store_table = 0; +} + +void compressed_seq_destroy(compressed_seq_t * cs) +{ + free(cs->store_table); + cs->store_table = 0; + free(cs->length_rems); + cs->length_rems = 0; + select_destroy(&cs->sel); +}; + + +void compressed_seq_generate(compressed_seq_t * cs, cmph_uint32 * vals_table, cmph_uint32 n) +{ + register cmph_uint32 i; + // lengths: represents lengths of encoded values + register cmph_uint32 * lengths = (cmph_uint32 *)calloc(n, sizeof(cmph_uint32)); + register cmph_uint32 rems_mask; + register cmph_uint32 stored_value; + + cs->n = n; + cs->total_length = 0; + + for(i = 0; i < cs->n; i++) + { + if(vals_table[i] == 0) + { + lengths[i] = 0; + } + else + { + lengths[i] = compressed_seq_i_log2(vals_table[i] + 1); + cs->total_length += lengths[i]; + }; + }; + + if(cs->store_table) + { + free(cs->store_table); + } + cs->store_table = (cmph_uint32 *) calloc(((cs->total_length + 31) >> 5), sizeof(cmph_uint32)); + cs->total_length = 0; + + for(i = 0; i < cs->n; i++) + { + if(vals_table[i] == 0) + continue; + stored_value = vals_table[i] - ((1U << lengths[i]) - 1U); + set_bits_at_pos(cs->store_table, cs->total_length, stored_value, lengths[i]); + cs->total_length += lengths[i]; + }; + + cs->rem_r = compressed_seq_i_log2(cs->total_length/cs->n); + + if(cs->rem_r == 0) + { + cs->rem_r = 1; + } + + if(cs->length_rems) + { + free(cs->length_rems); + } + + cs->length_rems = (cmph_uint32 *) calloc(BITS_TABLE_SIZE(cs->n, cs->rem_r), sizeof(cmph_uint32)); + + rems_mask = (1U << cs->rem_r) - 1U; + cs->total_length = 0; + + for(i = 0; i < cs->n; i++) + { + cs->total_length += lengths[i]; + set_bits_value(cs->length_rems, i, cs->total_length & rems_mask, cs->rem_r, rems_mask); + lengths[i] = cs->total_length >> cs->rem_r; + }; + + select_init(&cs->sel); + + // FABIANO: before it was (cs->total_length >> cs->rem_r) + 1. But I wiped out the + 1 because + // I changed the select structure to work up to m, instead of up to m - 1. + select_generate(&cs->sel, lengths, cs->n, (cs->total_length >> cs->rem_r)); + + free(lengths); +}; + +cmph_uint32 compressed_seq_get_space_usage(compressed_seq_t * cs) +{ + register cmph_uint32 space_usage = select_get_space_usage(&cs->sel); + space_usage += ((cs->total_length + 31) >> 5) * (cmph_uint32)sizeof(cmph_uint32) * 8; + space_usage += BITS_TABLE_SIZE(cs->n, cs->rem_r) * (cmph_uint32)sizeof(cmph_uint32) * 8; + return 4 * (cmph_uint32)sizeof(cmph_uint32) * 8 + space_usage; +} + +cmph_uint32 compressed_seq_query(compressed_seq_t * cs, cmph_uint32 idx) +{ + register cmph_uint32 enc_idx, enc_length; + register cmph_uint32 rems_mask; + register cmph_uint32 stored_value; + register cmph_uint32 sel_res; + + assert(idx < cs->n); // FABIANO ADDED + + rems_mask = (1U << cs->rem_r) - 1U; + + if(idx == 0) + { + enc_idx = 0; + sel_res = select_query(&cs->sel, idx); + } + else + { + sel_res = select_query(&cs->sel, idx - 1); + + enc_idx = (sel_res - (idx - 1)) << cs->rem_r; + enc_idx += get_bits_value(cs->length_rems, idx-1, cs->rem_r, rems_mask); + + sel_res = select_next_query(&cs->sel, sel_res); + }; + + enc_length = (sel_res - idx) << cs->rem_r; + enc_length += get_bits_value(cs->length_rems, idx, cs->rem_r, rems_mask); + enc_length -= enc_idx; + if(enc_length == 0) + return 0; + + stored_value = get_bits_at_pos(cs->store_table, enc_idx, enc_length); + return stored_value + ((1U << enc_length) - 1U); +}; + +void compressed_seq_dump(compressed_seq_t * cs, char ** buf, cmph_uint32 * buflen) +{ + register cmph_uint32 sel_size = select_packed_size(&(cs->sel)); + register cmph_uint32 length_rems_size = BITS_TABLE_SIZE(cs->n, cs->rem_r) * 4; + register cmph_uint32 store_table_size = ((cs->total_length + 31) >> 5) * 4; + register cmph_uint32 pos = 0; + char * buf_sel = 0; + cmph_uint32 buflen_sel = 0; +#ifdef DEBUG + cmph_uint32 i; +#endif + + *buflen = 4*(cmph_uint32)sizeof(cmph_uint32) + sel_size + length_rems_size + store_table_size; + + DEBUGP("sel_size = %u\n", sel_size); + DEBUGP("length_rems_size = %u\n", length_rems_size); + DEBUGP("store_table_size = %u\n", store_table_size); + *buf = (char *)calloc(*buflen, sizeof(char)); + + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + + // dumping n, rem_r and total_length + memcpy(*buf, &(cs->n), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("n = %u\n", cs->n); + + memcpy(*buf + pos, &(cs->rem_r), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("rem_r = %u\n", cs->rem_r); + + memcpy(*buf + pos, &(cs->total_length), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("total_length = %u\n", cs->total_length); + + + // dumping sel + select_dump(&cs->sel, &buf_sel, &buflen_sel); + memcpy(*buf + pos, &buflen_sel, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("buflen_sel = %u\n", buflen_sel); + + memcpy(*buf + pos, buf_sel, buflen_sel); + #ifdef DEBUG + i = 0; + for(i = 0; i < buflen_sel; i++) + { + DEBUGP("pos = %u -- buf_sel[%u] = %u\n", pos, i, *(*buf + pos + i)); + } + #endif + pos += buflen_sel; + + free(buf_sel); + + // dumping length_rems + memcpy(*buf + pos, cs->length_rems, length_rems_size); + #ifdef DEBUG + for(i = 0; i < length_rems_size; i++) + { + DEBUGP("pos = %u -- length_rems_size = %u -- length_rems[%u] = %u\n", pos, length_rems_size, i, *(*buf + pos + i)); + } + #endif + pos += length_rems_size; + + // dumping store_table + memcpy(*buf + pos, cs->store_table, store_table_size); + + #ifdef DEBUG + for(i = 0; i < store_table_size; i++) + { + DEBUGP("pos = %u -- store_table_size = %u -- store_table[%u] = %u\n", pos, store_table_size, i, *(*buf + pos + i)); + } + #endif + DEBUGP("Dumped compressed sequence structure with size %u bytes\n", *buflen); +} + +void compressed_seq_load(compressed_seq_t * cs, const char * buf, cmph_uint32 buflen) +{ + register cmph_uint32 pos = 0; + cmph_uint32 buflen_sel = 0; + register cmph_uint32 length_rems_size = 0; + register cmph_uint32 store_table_size = 0; +#ifdef DEBUG + cmph_uint32 i; +#endif + + // loading n, rem_r and total_length + memcpy(&(cs->n), buf, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("n = %u\n", cs->n); + + memcpy(&(cs->rem_r), buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("rem_r = %u\n", cs->rem_r); + + memcpy(&(cs->total_length), buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("total_length = %u\n", cs->total_length); + + // loading sel + memcpy(&buflen_sel, buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + DEBUGP("buflen_sel = %u\n", buflen_sel); + + select_load(&cs->sel, buf + pos, buflen_sel); + #ifdef DEBUG + i = 0; + for(i = 0; i < buflen_sel; i++) + { + DEBUGP("pos = %u -- buf_sel[%u] = %u\n", pos, i, *(buf + pos + i)); + } + #endif + pos += buflen_sel; + + // loading length_rems + if(cs->length_rems) + { + free(cs->length_rems); + } + length_rems_size = BITS_TABLE_SIZE(cs->n, cs->rem_r); + cs->length_rems = (cmph_uint32 *) calloc(length_rems_size, sizeof(cmph_uint32)); + length_rems_size *= 4; + memcpy(cs->length_rems, buf + pos, length_rems_size); + + #ifdef DEBUG + for(i = 0; i < length_rems_size; i++) + { + DEBUGP("pos = %u -- length_rems_size = %u -- length_rems[%u] = %u\n", pos, length_rems_size, i, *(buf + pos + i)); + } + #endif + pos += length_rems_size; + + // loading store_table + store_table_size = ((cs->total_length + 31) >> 5); + if(cs->store_table) + { + free(cs->store_table); + } + cs->store_table = (cmph_uint32 *) calloc(store_table_size, sizeof(cmph_uint32)); + store_table_size *= 4; + memcpy(cs->store_table, buf + pos, store_table_size); + + #ifdef DEBUG + for(i = 0; i < store_table_size; i++) + { + DEBUGP("pos = %u -- store_table_size = %u -- store_table[%u] = %u\n", pos, store_table_size, i, *(buf + pos + i)); + } + #endif + + DEBUGP("Loaded compressed sequence structure with size %u bytes\n", buflen); +} + +void compressed_seq_pack(compressed_seq_t *cs, void *cs_packed) +{ + if (cs && cs_packed) + { + char *buf = NULL; + cmph_uint32 buflen = 0; + compressed_seq_dump(cs, &buf, &buflen); + memcpy(cs_packed, buf, buflen); + free(buf); + } + +} + +cmph_uint32 compressed_seq_packed_size(compressed_seq_t *cs) +{ + register cmph_uint32 sel_size = select_packed_size(&cs->sel); + register cmph_uint32 store_table_size = ((cs->total_length + 31) >> 5) * (cmph_uint32)sizeof(cmph_uint32); + register cmph_uint32 length_rems_size = BITS_TABLE_SIZE(cs->n, cs->rem_r) * (cmph_uint32)sizeof(cmph_uint32); + return 4 * (cmph_uint32)sizeof(cmph_uint32) + sel_size + store_table_size + length_rems_size; +} + + +cmph_uint32 compressed_seq_query_packed(void * cs_packed, cmph_uint32 idx) +{ + // unpacking cs_packed + register cmph_uint32 *ptr = (cmph_uint32 *)cs_packed; + register cmph_uint32 n = *ptr++; + register cmph_uint32 rem_r = *ptr++; + register cmph_uint32 buflen_sel, length_rems_size, enc_idx, enc_length; + // compressed sequence query computation + register cmph_uint32 rems_mask, stored_value, sel_res; + register cmph_uint32 *sel_packed, *length_rems, *store_table; + + ptr++; // skipping total_length +// register cmph_uint32 total_length = *ptr++; + buflen_sel = *ptr++; + sel_packed = ptr; + length_rems = (ptr += (buflen_sel >> 2)); + length_rems_size = BITS_TABLE_SIZE(n, rem_r); + store_table = (ptr += length_rems_size); + + + rems_mask = (1U << rem_r) - 1U; + + if(idx == 0) + { + enc_idx = 0; + sel_res = select_query_packed(sel_packed, idx); + } + else + { + sel_res = select_query_packed(sel_packed, idx - 1); + + enc_idx = (sel_res - (idx - 1)) << rem_r; + enc_idx += get_bits_value(length_rems, idx-1, rem_r, rems_mask); + + sel_res = select_next_query_packed(sel_packed, sel_res); + }; + + enc_length = (sel_res - idx) << rem_r; + enc_length += get_bits_value(length_rems, idx, rem_r, rems_mask); + enc_length -= enc_idx; + if(enc_length == 0) + return 0; + + stored_value = get_bits_at_pos(store_table, enc_idx, enc_length); + return stored_value + ((1U << enc_length) - 1U); +} diff --git a/girepository/cmph/compressed_seq.h b/girepository/cmph/compressed_seq.h new file mode 100644 index 0000000..8d87fc7 --- /dev/null +++ b/girepository/cmph/compressed_seq.h @@ -0,0 +1,84 @@ +#ifndef __CMPH_COMPRESSED_SEQ_H__ +#define __CMPH_COMPRESSED_SEQ_H__ + +#include"select.h" + +struct _compressed_seq_t +{ + cmph_uint32 n; // number of values stored in store_table + // The length in bits of each value is decomposed into two compnents: the lg(n) MSBs are stored in rank_select data structure + // the remaining LSBs are stored in a table of n cells, each one of rem_r bits. + cmph_uint32 rem_r; + cmph_uint32 total_length; // total length in bits of stored_table + select_t sel; + cmph_uint32 * length_rems; + cmph_uint32 * store_table; +}; + +typedef struct _compressed_seq_t compressed_seq_t; + +/** \fn void compressed_seq_init(compressed_seq_t * cs); + * \brief Initialize a compressed sequence structure. + * \param cs points to the compressed sequence structure to be initialized + */ +void compressed_seq_init(compressed_seq_t * cs); + +/** \fn void compressed_seq_destroy(compressed_seq_t * cs); + * \brief Destroy a compressed sequence given as input. + * \param cs points to the compressed sequence structure to be destroyed + */ +void compressed_seq_destroy(compressed_seq_t * cs); + +/** \fn void compressed_seq_generate(compressed_seq_t * cs, cmph_uint32 * vals_table, cmph_uint32 n); + * \brief Generate a compressed sequence from an input array with n values. + * \param cs points to the compressed sequence structure + * \param vals_table poiter to the array given as input + * \param n number of values in @see vals_table + */ +void compressed_seq_generate(compressed_seq_t * cs, cmph_uint32 * vals_table, cmph_uint32 n); + + +/** \fn cmph_uint32 compressed_seq_query(compressed_seq_t * cs, cmph_uint32 idx); + * \brief Returns the value stored at index @see idx of the compressed sequence structure. + * \param cs points to the compressed sequence structure + * \param idx index to retrieve the value from + * \return the value stored at index @see idx of the compressed sequence structure + */ +cmph_uint32 compressed_seq_query(compressed_seq_t * cs, cmph_uint32 idx); + + +/** \fn cmph_uint32 compressed_seq_get_space_usage(compressed_seq_t * cs); + * \brief Returns amount of space (in bits) to store the compressed sequence. + * \param cs points to the compressed sequence structure + * \return the amount of space (in bits) to store @see cs + */ +cmph_uint32 compressed_seq_get_space_usage(compressed_seq_t * cs); + +void compressed_seq_dump(compressed_seq_t * cs, char ** buf, cmph_uint32 * buflen); + +void compressed_seq_load(compressed_seq_t * cs, const char * buf, cmph_uint32 buflen); + + +/** \fn void compressed_seq_pack(compressed_seq_t *cs, void *cs_packed); + * \brief Support the ability to pack a compressed sequence structure into a preallocated contiguous memory space pointed by cs_packed. + * \param cs points to the compressed sequence structure + * \param cs_packed pointer to the contiguous memory area used to store the compressed sequence structure. The size of cs_packed must be at least @see compressed_seq_packed_size + */ +void compressed_seq_pack(compressed_seq_t *cs, void *cs_packed); + +/** \fn cmph_uint32 compressed_seq_packed_size(compressed_seq_t *cs); + * \brief Return the amount of space needed to pack a compressed sequence structure. + * \return the size of the packed compressed sequence structure or zero for failures + */ +cmph_uint32 compressed_seq_packed_size(compressed_seq_t *cs); + + +/** \fn cmph_uint32 compressed_seq_query_packed(void * cs_packed, cmph_uint32 idx); + * \brief Returns the value stored at index @see idx of the packed compressed sequence structure. + * \param cs_packed is a pointer to a contiguous memory area + * \param idx is the index to retrieve the value from + * \return the value stored at index @see idx of the packed compressed sequence structure + */ +cmph_uint32 compressed_seq_query_packed(void * cs_packed, cmph_uint32 idx); + +#endif diff --git a/girepository/cmph/debug.h b/girepository/cmph/debug.h new file mode 100644 index 0000000..0f7ddb1 --- /dev/null +++ b/girepository/cmph/debug.h @@ -0,0 +1,53 @@ +#ifdef DEBUGP +#undef DEBUGP +#endif + +#ifdef __cplusplus +#include +#ifdef WIN32 +#include +#endif +#else +#include +#ifdef WIN32 +#include +#endif +#endif + +#ifndef __GNUC__ +#ifndef __DEBUG_H__ +#define __DEBUG_H__ +#include +static void debugprintf(const char *format, ...) +{ + va_list ap; + char *f = NULL; + const char *p="%s:%d "; + size_t plen = strlen(p); + va_start(ap, format); + f = (char *)malloc(plen + strlen(format) + 1); + if (!f) return; + memcpy(f, p, plen); + memcpy(f + plen, format, strlen(format) + 1); + vfprintf(stderr, f, ap); + va_end(ap); + free(f); +} +static void dummyprintf(const char *format, ...) +{} +#endif +#endif + +#ifdef DEBUG +#ifndef __GNUC__ +#define DEBUGP debugprintf +#else +#define DEBUGP(args...) do { fprintf(stderr, "%s:%d ", __FILE__, __LINE__); fprintf(stderr, ## args); } while(0) +#endif +#else +#ifndef __GNUC__ +#define DEBUGP dummyprintf +#else +#define DEBUGP(args...) +#endif +#endif diff --git a/girepository/cmph/djb2_hash.c b/girepository/cmph/djb2_hash.c new file mode 100644 index 0000000..d3b4330 --- /dev/null +++ b/girepository/cmph/djb2_hash.c @@ -0,0 +1,49 @@ +#include "djb2_hash.h" +#include + +djb2_state_t *djb2_state_new() +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; + return state; +} + +void djb2_state_destroy(djb2_state_t *state) +{ + free(state); +} + +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen) +{ + register cmph_uint32 hash = 5381; + const unsigned char *ptr = (unsigned char *)k; + cmph_uint32 i = 0; + while (i < keylen) + { + hash = hash*33 ^ *ptr; + ++ptr, ++i; + } + return hash; +} + + +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +djb2_state_t *djb2_state_copy(djb2_state_t *src_state) +{ + djb2_state_t *dest_state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen) +{ + djb2_state_t *state = (djb2_state_t *)malloc(sizeof(djb2_state_t)); + state->hashfunc = CMPH_HASH_DJB2; + return state; +} diff --git a/girepository/cmph/djb2_hash.h b/girepository/cmph/djb2_hash.h new file mode 100644 index 0000000..dda97e3 --- /dev/null +++ b/girepository/cmph/djb2_hash.h @@ -0,0 +1,18 @@ +#ifndef __DJB2_HASH_H__ +#define __DJB2_HASH_H__ + +#include "hash.h" + +typedef struct __djb2_state_t +{ + CMPH_HASH hashfunc; +} djb2_state_t; + +djb2_state_t *djb2_state_new(); +cmph_uint32 djb2_hash(djb2_state_t *state, const char *k, cmph_uint32 keylen); +void djb2_state_dump(djb2_state_t *state, char **buf, cmph_uint32 *buflen); +djb2_state_t *djb2_state_copy(djb2_state_t *src_state); +djb2_state_t *djb2_state_load(const char *buf, cmph_uint32 buflen); +void djb2_state_destroy(djb2_state_t *state); + +#endif diff --git a/girepository/cmph/fch.c b/girepository/cmph/fch.c new file mode 100644 index 0000000..f12b6fc --- /dev/null +++ b/girepository/cmph/fch.c @@ -0,0 +1,539 @@ +#include "fch.h" +#include "cmph_structs.h" +#include "fch_structs.h" +#include "hash.h" +#include "bitbool.h" +#include "fch_buckets.h" +#include +#include +#include +#include +#include +#include + +#define INDEX 0 /* alignment index within a bucket */ +//#define DEBUG +#include "debug.h" + +static fch_buckets_t * mapping(cmph_config_t *mph); +static cmph_uint32 * ordering(fch_buckets_t * buckets); +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes); +static void permut(cmph_uint32 * vector, cmph_uint32 n); +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes); + +fch_config_data_t *fch_config_new(void) +{ + fch_config_data_t *fch; + fch = (fch_config_data_t *)malloc(sizeof(fch_config_data_t)); + assert(fch); + memset(fch, 0, sizeof(fch_config_data_t)); + fch->hashfuncs[0] = CMPH_HASH_JENKINS; + fch->hashfuncs[1] = CMPH_HASH_JENKINS; + fch->m = fch->b = 0; + fch->c = fch->p1 = fch->p2 = 0.0; + fch->g = NULL; + fch->h1 = NULL; + fch->h2 = NULL; + return fch; +} + +void fch_config_destroy(cmph_config_t *mph) +{ + fch_config_data_t *data = (fch_config_data_t *)mph->data; + //DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 2) break; //fch only uses two hash functions + fch->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_uint32 mixh10h11h12(cmph_uint32 b, double p1, double p2, cmph_uint32 initial_index) +{ + register cmph_uint32 int_p2 = (cmph_uint32)p2; + if (initial_index < p1) initial_index %= int_p2; /* h11 o h10 */ + else { /* h12 o h10 */ + initial_index %= b; + if(initial_index < p2) initial_index += int_p2; + } + return initial_index; +} + + +cmph_uint32 fch_calc_b(double c, cmph_uint32 m) +{ + return (cmph_uint32)ceil((c*m)/(log((double)m)/log(2.0) + 1)); +} + +double fch_calc_p1(cmph_uint32 m) +{ + return ceil(0.55*m); +} + +double fch_calc_p2(cmph_uint32 b) +{ + return ceil(0.3*b); +} + +static fch_buckets_t * mapping(cmph_config_t *mph) +{ + cmph_uint32 i = 0; + fch_buckets_t *buckets = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + if (fch->h1) hash_state_destroy(fch->h1); + fch->h1 = hash_state_new(fch->hashfuncs[0], fch->m); + fch->b = fch_calc_b(fch->c, fch->m); + fch->p1 = fch_calc_p1(fch->m); + fch->p2 = fch_calc_p2(fch->b); + //DEBUGP("b:%u p1:%f p2:%f\n", fch->b, fch->p1, fch->p2); + buckets = fch_buckets_new(fch->b); + + mph->key_source->rewind(mph->key_source->data); + for(i = 0; i < fch->m; i++) + { + cmph_uint32 h1, keylen; + char *key = NULL; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(fch->h1, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + fch_buckets_insert(buckets, h1, key, keylen); + key = NULL; // transger memory ownership + + } + return buckets; +} + + +// returns the buckets indexes sorted by their sizes. +static cmph_uint32 * ordering(fch_buckets_t * buckets) +{ + return fch_buckets_get_indexes_sorted_by_size(buckets); +} + +/* Check whether function h2 causes collisions among the keys of each bucket */ +static cmph_uint8 check_for_collisions_h2(fch_config_data_t *fch, fch_buckets_t * buckets, cmph_uint32 *sorted_indexes) +{ + //cmph_uint32 max_size = fch_buckets_get_max_size(buckets); + cmph_uint8 * hashtable = (cmph_uint8 *)calloc((size_t)fch->m, sizeof(cmph_uint8)); + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i = 0, index = 0, j =0; + for (i = 0; i < nbuckets; i++) + { + cmph_uint32 nkeys = fch_buckets_get_size(buckets, sorted_indexes[i]); + memset(hashtable, 0, (size_t)fch->m); + //DEBUGP("bucket %u -- nkeys: %u\n", i, nkeys); + for (j = 0; j < nkeys; j++) + { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + index = hash(fch->h2, key, keylen) % fch->m; + if(hashtable[index]) { // collision detected + free(hashtable); + return 1; + } + hashtable[index] = 1; + } + } + free(hashtable); + return 0; +} + +static void permut(cmph_uint32 * vector, cmph_uint32 n) +{ + cmph_uint32 i, j, b; + for (i = 0; i < n; i++) { + j = (cmph_uint32) rand() % n; + b = vector[i]; + vector[i] = vector[j]; + vector[j] = b; + } +} + +static cmph_uint8 searching(fch_config_data_t *fch, fch_buckets_t *buckets, cmph_uint32 *sorted_indexes) +{ + cmph_uint32 * random_table = (cmph_uint32 *) calloc((size_t)fch->m, sizeof(cmph_uint32)); + cmph_uint32 * map_table = (cmph_uint32 *) calloc((size_t)fch->m, sizeof(cmph_uint32)); + cmph_uint32 iteration_to_generate_h2 = 0; + cmph_uint32 searching_iterations = 0; + cmph_uint8 restart = 0; + cmph_uint32 nbuckets = fch_buckets_get_nbuckets(buckets); + cmph_uint32 i, j, z, counter = 0, filled_count = 0; + if (fch->g) free (fch->g); + fch->g = (cmph_uint32 *) calloc((size_t)fch->b, sizeof(cmph_uint32)); + + //DEBUGP("max bucket size: %u\n", fch_buckets_get_max_size(buckets)); + + for(i = 0; i < fch->m; i++) + { + random_table[i] = i; + } + permut(random_table, fch->m); + for(i = 0; i < fch->m; i++) + { + map_table[random_table[i]] = i; + } + do { + if (fch->h2) hash_state_destroy(fch->h2); + fch->h2 = hash_state_new(fch->hashfuncs[1], fch->m); + restart = check_for_collisions_h2(fch, buckets, sorted_indexes); + filled_count = 0; + if (!restart) + { + searching_iterations++; iteration_to_generate_h2 = 0; + //DEBUGP("searching_iterations: %u\n", searching_iterations); + } + else { + iteration_to_generate_h2++; + //DEBUGP("iteration_to_generate_h2: %u\n", iteration_to_generate_h2); + } + for(i = 0; (i < nbuckets) && !restart; i++) { + cmph_uint32 bucketsize = fch_buckets_get_size(buckets, sorted_indexes[i]); + if (bucketsize == 0) + { + restart = 0; // false + break; + } + else restart = 1; // true + for(z = 0; (z < (fch->m - filled_count)) && restart; z++) { + char * key = fch_buckets_get_key(buckets, sorted_indexes[i], INDEX); + cmph_uint32 keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], INDEX); + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + counter = 0; + restart = 0; // false + fch->g[sorted_indexes[i]] = (fch->m + random_table[filled_count + z] - h2) % fch->m; + //DEBUGP("g[%u]: %u\n", sorted_indexes[i], fch->g[sorted_indexes[i]]); + j = INDEX; + do { + cmph_uint32 index = 0; + key = fch_buckets_get_key(buckets, sorted_indexes[i], j); + keylen = fch_buckets_get_keylength(buckets, sorted_indexes[i], j); + h2 = hash(fch->h2, key, keylen) % fch->m; + index = (h2 + fch->g[sorted_indexes[i]]) % fch->m; + //DEBUGP("key:%s keylen:%u index: %u h2:%u bucketsize:%u\n", key, keylen, index, h2, bucketsize); + if (map_table[index] >= filled_count) { + cmph_uint32 y = map_table[index]; + cmph_uint32 ry = random_table[y]; + random_table[y] = random_table[filled_count]; + random_table[filled_count] = ry; + map_table[random_table[y]] = y; + map_table[random_table[filled_count]] = filled_count; + filled_count++; + counter ++; + } + else { + restart = 1; // true + filled_count = filled_count - counter; + counter = 0; + break; + } + j = (j + 1) % bucketsize; + } while(j % bucketsize != INDEX); + } + //getchar(); + } + } while(restart && (searching_iterations < 10) && (iteration_to_generate_h2 < 1000)); + free(map_table); + free(random_table); + return restart; +} + + + +cmph_t *fch_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + fch_data_t *fchf = NULL; + cmph_uint32 iterations = 100; + cmph_uint8 restart_mapping = 0; + fch_buckets_t * buckets = NULL; + cmph_uint32 * sorted_indexes = NULL; + fch_config_data_t *fch = (fch_config_data_t *)mph->data; + fch->m = mph->key_source->nkeys; + //DEBUGP("m: %f\n", fch->m); + if (c <= 2) c = 2.6; // validating restrictions over parameter c. + fch->c = c; + //DEBUGP("c: %f\n", fch->c); + fch->h1 = NULL; + fch->h2 = NULL; + fch->g = NULL; + do + { + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys\n", fch->m); + } + if (buckets) fch_buckets_destroy(buckets); + buckets = mapping(mph); + if (mph->verbosity) + { + fprintf(stderr, "Starting ordering step\n"); + } + if (sorted_indexes) free (sorted_indexes); + sorted_indexes = ordering(buckets); + if (mph->verbosity) + { + fprintf(stderr, "Starting searching step.\n"); + } + restart_mapping = searching(fch, buckets, sorted_indexes); + iterations--; + + } while(restart_mapping && iterations > 0); + if (buckets) fch_buckets_destroy(buckets); + if (sorted_indexes) free (sorted_indexes); + if (iterations == 0) return NULL; + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + fchf = (fch_data_t *)malloc(sizeof(fch_data_t)); + fchf->g = fch->g; + fch->g = NULL; //transfer memory ownership + fchf->h1 = fch->h1; + fch->h1 = NULL; //transfer memory ownership + fchf->h2 = fch->h2; + fch->h2 = NULL; //transfer memory ownership + fchf->p2 = fch->p2; + fchf->p1 = fch->p1; + fchf->b = fch->b; + fchf->c = fch->c; + fchf->m = fch->m; + mphf->data = fchf; + mphf->size = fch->m; + //DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +int fch_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + + fch_data_t *data = (fch_data_t *)mphf->data; + +#ifdef DEBUG + cmph_uint32 i; +#endif + __cmph_dump(mphf, fd); + + hash_state_dump(data->h1, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + hash_state_dump(data->h2, &buf, &buflen); + //DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + nbytes = fwrite(&buflen, sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(buf, (size_t)buflen, (size_t)1, fd); + free(buf); + + nbytes = fwrite(&(data->m), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->c), sizeof(double), (size_t)1, fd); + nbytes = fwrite(&(data->b), sizeof(cmph_uint32), (size_t)1, fd); + nbytes = fwrite(&(data->p1), sizeof(double), (size_t)1, fd); + nbytes = fwrite(&(data->p2), sizeof(double), (size_t)1, fd); + nbytes = fwrite(data->g, sizeof(cmph_uint32)*(data->b), (size_t)1, fd); + if (nbytes == 0 && ferror(fd)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return 0; + } + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->b; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void fch_load(FILE *f, cmph_t *mphf) +{ + char *buf = NULL; + cmph_uint32 buflen; + register size_t nbytes; + fch_data_t *fch = (fch_data_t *)malloc(sizeof(fch_data_t)); +#ifdef DEBUG + cmph_uint32 i; +#endif + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h1\n"); + fch->h1 = NULL; + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + //DEBUGP("Hash state of h1 has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + fch->h1 = hash_state_load(buf, buflen); + free(buf); + + //DEBUGP("Loading fch mphf\n"); + mphf->data = fch; + //DEBUGP("Reading h2\n"); + fch->h2 = NULL; + nbytes = fread(&buflen, sizeof(cmph_uint32), (size_t)1, f); + //DEBUGP("Hash state of h2 has %u bytes\n", buflen); + buf = (char *)malloc((size_t)buflen); + nbytes = fread(buf, (size_t)buflen, (size_t)1, f); + fch->h2 = hash_state_load(buf, buflen); + free(buf); + + + //DEBUGP("Reading m and n\n"); + nbytes = fread(&(fch->m), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(fch->c), sizeof(double), (size_t)1, f); + nbytes = fread(&(fch->b), sizeof(cmph_uint32), (size_t)1, f); + nbytes = fread(&(fch->p1), sizeof(double), (size_t)1, f); + nbytes = fread(&(fch->p2), sizeof(double), (size_t)1, f); + + fch->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*fch->b); + nbytes = fread(fch->g, fch->b*sizeof(cmph_uint32), (size_t)1, f); + if (nbytes == 0 && ferror(f)) { + fprintf(stderr, "ERROR: %s\n", strerror(errno)); + return; + } + + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < fch->b; ++i) fprintf(stderr, "%u ", fch->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + fch_data_t *fch = mphf->data; + cmph_uint32 h1 = hash(fch->h1, key, keylen) % fch->m; + cmph_uint32 h2 = hash(fch->h2, key, keylen) % fch->m; + h1 = mixh10h11h12 (fch->b, fch->p1, fch->p2, h1); + //DEBUGP("key: %s h1: %u h2: %u g[h1]: %u\n", key, h1, h2, fch->g[h1]); + return (h2 + fch->g[h1]) % fch->m; +} +void fch_destroy(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->h1); + hash_state_destroy(data->h2); + free(data); + free(mphf); +} + +/** \fn void fch_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void fch_pack(cmph_t *mphf, void *packed_mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + cmph_uint8 * ptr = packed_mphf; + + // packing h1 type + CMPH_HASH h1_type = hash_get_type(data->h1); + CMPH_HASH h2_type; + *((cmph_uint32 *) ptr) = h1_type; + ptr += sizeof(cmph_uint32); + + // packing h1 + hash_state_pack(data->h1, ptr); + ptr += hash_state_packed_size(h1_type); + + // packing h2 type + h2_type = hash_get_type(data->h2); + *((cmph_uint32 *) ptr) = h2_type; + ptr += sizeof(cmph_uint32); + + // packing h2 + hash_state_pack(data->h2, ptr); + ptr += hash_state_packed_size(h2_type); + + // packing m + *((cmph_uint32 *) ptr) = data->m; + ptr += sizeof(data->m); + + // packing b + *((cmph_uint32 *) ptr) = data->b; + ptr += sizeof(data->b); + + // packing p1 + *((cmph_uint64 *)ptr) = (cmph_uint64)data->p1; + ptr += sizeof(data->p1); + + // packing p2 + *((cmph_uint64 *)ptr) = (cmph_uint64)data->p2; + ptr += sizeof(data->p2); + + // packing g + memcpy(ptr, data->g, sizeof(cmph_uint32)*(data->b)); +} + +/** \fn cmph_uint32 fch_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 fch_packed_size(cmph_t *mphf) +{ + fch_data_t *data = (fch_data_t *)mphf->data; + CMPH_HASH h1_type = hash_get_type(data->h1); + CMPH_HASH h2_type = hash_get_type(data->h2); + + return (cmph_uint32)(sizeof(CMPH_ALGO) + hash_state_packed_size(h1_type) + hash_state_packed_size(h2_type) + + 4*sizeof(cmph_uint32) + 2*sizeof(double) + sizeof(cmph_uint32)*(data->b)); +} + + +/** cmph_uint32 fch_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 fch_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen) +{ + register cmph_uint8 *h1_ptr = packed_mphf; + register CMPH_HASH h1_type = *((cmph_uint32 *)h1_ptr); + register cmph_uint8 *h2_ptr; + register CMPH_HASH h2_type; + register cmph_uint32 *g_ptr; + register cmph_uint32 m, b, h1, h2; + register double p1, p2; + + h1_ptr += 4; + + h2_ptr = h1_ptr + hash_state_packed_size(h1_type); + h2_type = *((cmph_uint32 *)h2_ptr); + h2_ptr += 4; + + g_ptr = (cmph_uint32 *)(h2_ptr + hash_state_packed_size(h2_type)); + + m = *g_ptr++; + + b = *g_ptr++; + + p1 = (double)(*((cmph_uint64 *)g_ptr)); + g_ptr += 2; + + p2 = (double)(*((cmph_uint64 *)g_ptr)); + g_ptr += 2; + + h1 = hash_packed(h1_ptr, h1_type, key, keylen) % m; + h2 = hash_packed(h2_ptr, h2_type, key, keylen) % m; + h1 = mixh10h11h12 (b, p1, p2, h1); + return (h2 + g_ptr[h1]) % m; +} + diff --git a/girepository/cmph/fch.h b/girepository/cmph/fch.h new file mode 100644 index 0000000..9d13a1c --- /dev/null +++ b/girepository/cmph/fch.h @@ -0,0 +1,48 @@ +#ifndef __CMPH_FCH_H__ +#define __CMPH_FCH_H__ + +#include "cmph.h" + +typedef struct __fch_data_t fch_data_t; +typedef struct __fch_config_data_t fch_config_data_t; + +/* Parameters calculation */ +cmph_uint32 fch_calc_b(double c, cmph_uint32 m); +double fch_calc_p1(cmph_uint32 m); +double fch_calc_p2(cmph_uint32 b); +cmph_uint32 mixh10h11h12(cmph_uint32 b, double p1, double p2, cmph_uint32 initial_index); + +fch_config_data_t *fch_config_new(void); +void fch_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void fch_config_destroy(cmph_config_t *mph); +cmph_t *fch_new(cmph_config_t *mph, double c); + +void fch_load(FILE *f, cmph_t *mphf); +int fch_dump(cmph_t *mphf, FILE *f); +void fch_destroy(cmph_t *mphf); +cmph_uint32 fch_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); + +/** \fn void fch_pack(cmph_t *mphf, void *packed_mphf); + * \brief Support the ability to pack a perfect hash function into a preallocated contiguous memory space pointed by packed_mphf. + * \param mphf pointer to the resulting mphf + * \param packed_mphf pointer to the contiguous memory area used to store the resulting mphf. The size of packed_mphf must be at least cmph_packed_size() + */ +void fch_pack(cmph_t *mphf, void *packed_mphf); + +/** \fn cmph_uint32 fch_packed_size(cmph_t *mphf); + * \brief Return the amount of space needed to pack mphf. + * \param mphf pointer to a mphf + * \return the size of the packed function or zero for failures + */ +cmph_uint32 fch_packed_size(cmph_t *mphf); + +/** cmph_uint32 fch_search(void *packed_mphf, const char *key, cmph_uint32 keylen); + * \brief Use the packed mphf to do a search. + * \param packed_mphf pointer to the packed mphf + * \param key key to be hashed + * \param keylen key legth in bytes + * \return The mphf value + */ +cmph_uint32 fch_search_packed(void *packed_mphf, const char *key, cmph_uint32 keylen); + +#endif diff --git a/girepository/cmph/fch_buckets.c b/girepository/cmph/fch_buckets.c new file mode 100644 index 0000000..a588f14 --- /dev/null +++ b/girepository/cmph/fch_buckets.c @@ -0,0 +1,214 @@ +#include "vqueue.h" +#include "fch_buckets.h" +#include +#include +#include +//#define DEBUG +#include "debug.h" + +typedef struct __fch_bucket_entry_t +{ + char * value; + cmph_uint32 length; +} fch_bucket_entry_t; + +typedef struct __fch_bucket_t +{ + fch_bucket_entry_t * entries; + cmph_uint32 capacity, size; +} fch_bucket_t; + + + +static void fch_bucket_new(fch_bucket_t *bucket) +{ + assert(bucket); + bucket->size = 0; + bucket->entries = NULL; + bucket->capacity = 0; +} + +static void fch_bucket_destroy(fch_bucket_t *bucket) +{ + cmph_uint32 i; + assert(bucket); + for (i = 0; i < bucket->size; i++) + { + free((bucket->entries + i)->value); + } + free(bucket->entries); +} + + +static void fch_bucket_reserve(fch_bucket_t *bucket, cmph_uint32 size) +{ + assert(bucket); + if (bucket->capacity < size) + { + cmph_uint32 new_capacity = bucket->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", bucket->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + bucket->entries = (fch_bucket_entry_t *)realloc(bucket->entries, sizeof(fch_bucket_entry_t)*new_capacity); + assert(bucket->entries); + bucket->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + +static void fch_bucket_insert(fch_bucket_t *bucket, char *val, cmph_uint32 val_length) +{ + assert(bucket); + fch_bucket_reserve(bucket, bucket->size + 1); + (bucket->entries + bucket->size)->value = val; + (bucket->entries + bucket->size)->length = val_length; + ++(bucket->size); +} + + +static cmph_uint8 fch_bucket_is_empty(fch_bucket_t *bucket) +{ + assert(bucket); + return (cmph_uint8)(bucket->size == 0); +} + +static cmph_uint32 fch_bucket_size(fch_bucket_t *bucket) +{ + assert(bucket); + return bucket->size; +} + +static char * fch_bucket_get_key(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->value; +} + +static cmph_uint32 fch_bucket_get_length(fch_bucket_t *bucket, cmph_uint32 index_key) +{ + assert(bucket); assert(index_key < bucket->size); + return (bucket->entries + index_key)->length; +} + +static void fch_bucket_print(fch_bucket_t * bucket, cmph_uint32 index) +{ + cmph_uint32 i; + assert(bucket); + fprintf(stderr, "Printing bucket %u ...\n", index); + for (i = 0; i < bucket->size; i++) + { + fprintf(stderr, " key: %s\n", (bucket->entries + i)->value); + } +} + +////////////////////////////////////////////////////////////////////////////////////// + +struct __fch_buckets_t +{ + fch_bucket_t * values; + cmph_uint32 nbuckets, max_size; + +}; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets) +{ + cmph_uint32 i; + fch_buckets_t *buckets = (fch_buckets_t *)malloc(sizeof(fch_buckets_t)); + assert(buckets); + buckets->values = (fch_bucket_t *)calloc((size_t)nbuckets, sizeof(fch_bucket_t)); + for (i = 0; i < nbuckets; i++) fch_bucket_new(buckets->values + i); + assert(buckets->values); + buckets->nbuckets = nbuckets; + buckets->max_size = 0; + return buckets; +} + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_is_empty(buckets->values + index); +} + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length) +{ + assert(index < buckets->nbuckets); + fch_bucket_insert(buckets->values + index, key, length); + if (fch_bucket_size(buckets->values + index) > buckets->max_size) + { + buckets->max_size = fch_bucket_size(buckets->values + index); + } +} + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index) +{ + assert(index < buckets->nbuckets); + return fch_bucket_size(buckets->values + index); +} + + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_key(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key) +{ + assert(index < buckets->nbuckets); + return fch_bucket_get_length(buckets->values + index, index_key); +} + +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets) +{ + return buckets->max_size; +} + +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets) +{ + return buckets->nbuckets; +} + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets) +{ + cmph_uint32 i = 0; + cmph_uint32 sum = 0, value; + cmph_uint32 *nbuckets_size = (cmph_uint32 *) calloc((size_t)buckets->max_size + 1, sizeof(cmph_uint32)); + cmph_uint32 * sorted_indexes = (cmph_uint32 *) calloc((size_t)buckets->nbuckets, sizeof(cmph_uint32)); + + // collect how many buckets for each size. + for(i = 0; i < buckets->nbuckets; i++) nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + + // calculating offset considering a decreasing order of buckets size. + value = nbuckets_size[buckets->max_size]; + nbuckets_size[buckets->max_size] = sum; + for(i = (int)buckets->max_size - 1; i >= 0; i--) + { + sum += value; + value = nbuckets_size[i]; + nbuckets_size[i] = sum; + + } + for(i = 0; i < buckets->nbuckets; i++) + { + sorted_indexes[nbuckets_size[fch_bucket_size(buckets->values + i)]] = (cmph_uint32)i; + nbuckets_size[fch_bucket_size(buckets->values + i)] ++; + } + free(nbuckets_size); + return sorted_indexes; +} + +void fch_buckets_print(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_print(buckets->values + i, i); +} + +void fch_buckets_destroy(fch_buckets_t * buckets) +{ + cmph_uint32 i; + for (i = 0; i < buckets->nbuckets; i++) fch_bucket_destroy(buckets->values + i); + free(buckets->values); + free(buckets); +} diff --git a/girepository/cmph/fch_buckets.h b/girepository/cmph/fch_buckets.h new file mode 100644 index 0000000..2a1b8b2 --- /dev/null +++ b/girepository/cmph/fch_buckets.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_BUCKETS_H__ +#define __CMPH_FCH_BUCKETS_H__ + +#include "cmph_types.h" +typedef struct __fch_buckets_t fch_buckets_t; + +fch_buckets_t * fch_buckets_new(cmph_uint32 nbuckets); + +cmph_uint8 fch_buckets_is_empty(fch_buckets_t * buckets, cmph_uint32 index); + +void fch_buckets_insert(fch_buckets_t * buckets, cmph_uint32 index, char * key, cmph_uint32 length); + +cmph_uint32 fch_buckets_get_size(fch_buckets_t * buckets, cmph_uint32 index); + +char * fch_buckets_get_key(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +cmph_uint32 fch_buckets_get_keylength(fch_buckets_t * buckets, cmph_uint32 index, cmph_uint32 index_key); + +// returns the size of biggest bucket. +cmph_uint32 fch_buckets_get_max_size(fch_buckets_t * buckets); + +// returns the number of buckets. +cmph_uint32 fch_buckets_get_nbuckets(fch_buckets_t * buckets); + +cmph_uint32 * fch_buckets_get_indexes_sorted_by_size(fch_buckets_t * buckets); + +void fch_buckets_print(fch_buckets_t * buckets); + +void fch_buckets_destroy(fch_buckets_t * buckets); +#endif diff --git a/girepository/cmph/fch_structs.h b/girepository/cmph/fch_structs.h new file mode 100644 index 0000000..fcd1555 --- /dev/null +++ b/girepository/cmph/fch_structs.h @@ -0,0 +1,30 @@ +#ifndef __CMPH_FCH_STRUCTS_H__ +#define __CMPH_FCH_STRUCTS_H__ + +#include "hash_state.h" + +struct __fch_data_t +{ + cmph_uint32 m; // words count + double c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + double p1; // constant p1 = ceil(0.6*m). Don't need to be stored + double p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; + +struct __fch_config_data_t +{ + CMPH_HASH hashfuncs[2]; + cmph_uint32 m; // words count + double c; // constant c + cmph_uint32 b; // parameter b = ceil(c*m/(log(m)/log(2) + 1)). Don't need to be stored + double p1; // constant p1 = ceil(0.6*m). Don't need to be stored + double p2; // constant p2 = ceil(0.3*b). Don't need to be stored + cmph_uint32 *g; // g function. + hash_state_t *h1; // h10 function. + hash_state_t *h2; // h20 function. +}; +#endif diff --git a/girepository/cmph/fnv_hash.c b/girepository/cmph/fnv_hash.c new file mode 100644 index 0000000..aeaca8f --- /dev/null +++ b/girepository/cmph/fnv_hash.c @@ -0,0 +1,53 @@ +#include "fnv_hash.h" +#include + +fnv_state_t *fnv_state_new() +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; + return state; +} + +void fnv_state_destroy(fnv_state_t *state) +{ + free(state); +} + +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen) +{ + const unsigned char *bp = (const unsigned char *)k; + const unsigned char *be = bp + keylen; + static unsigned int hval = 0; + + while (bp < be) + { + + //hval *= 0x01000193; good for non-gcc compiler + hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24); //good for gcc + + hval ^= *bp++; + } + return hval; +} + + +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +fnv_state_t * fnv_state_copy(fnv_state_t *src_state) +{ + fnv_state_t *dest_state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen) +{ + fnv_state_t *state = (fnv_state_t *)malloc(sizeof(fnv_state_t)); + state->hashfunc = CMPH_HASH_FNV; + return state; +} diff --git a/girepository/cmph/fnv_hash.h b/girepository/cmph/fnv_hash.h new file mode 100644 index 0000000..7f57946 --- /dev/null +++ b/girepository/cmph/fnv_hash.h @@ -0,0 +1,18 @@ +#ifndef __FNV_HASH_H__ +#define __FNV_HASH_H__ + +#include "hash.h" + +typedef struct __fnv_state_t +{ + CMPH_HASH hashfunc; +} fnv_state_t; + +fnv_state_t *fnv_state_new(); +cmph_uint32 fnv_hash(fnv_state_t *state, const char *k, cmph_uint32 keylen); +void fnv_state_dump(fnv_state_t *state, char **buf, cmph_uint32 *buflen); +fnv_state_t *fnv_state_copy(fnv_state_t *src_state); +fnv_state_t *fnv_state_load(const char *buf, cmph_uint32 buflen); +void fnv_state_destroy(fnv_state_t *state); + +#endif diff --git a/girepository/cmph/graph.c b/girepository/cmph/graph.c new file mode 100644 index 0000000..c29fd8b --- /dev/null +++ b/girepository/cmph/graph.c @@ -0,0 +1,338 @@ +#include "graph.h" + +#include +#include +#include +#include +#include +#include "vstack.h" +#include "bitbool.h" + +//#define DEBUG +#include "debug.h" + +/* static const cmph_uint8 bitmask[8] = { 1, 1 << 1, 1 << 2, 1 << 3, 1 << 4, 1 << 5, 1 << 6, 1 << 7 }; */ +/* #define GETBIT(array, i) (array[(i) / 8] & bitmask[(i) % 8]) */ +/* #define SETBIT(array, i) (array[(i) / 8] |= bitmask[(i) % 8]) */ +/* #define UNSETBIT(array, i) (array[(i) / 8] &= (~(bitmask[(i) % 8]))) */ + +#define abs_edge(e, i) (e % g->nedges + i * g->nedges) + +struct __graph_t +{ + cmph_uint32 nnodes; + cmph_uint32 nedges; + cmph_uint32 *edges; + cmph_uint32 *first; + cmph_uint32 *next; + cmph_uint8 *critical_nodes; /* included -- Fabiano*/ + cmph_uint32 ncritical_nodes; /* included -- Fabiano*/ + cmph_uint32 cedges; + int shrinking; +}; + +static cmph_uint32 EMPTY = UINT_MAX; + +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges) +{ + graph_t *graph = (graph_t *)malloc(sizeof(graph_t)); + if (!graph) return NULL; + + graph->edges = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->next = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * 2 * nedges); + graph->first = (cmph_uint32 *)malloc(sizeof(cmph_uint32) * nnodes); + graph->critical_nodes = NULL; /* included -- Fabiano*/ + graph->ncritical_nodes = 0; /* included -- Fabiano*/ + graph->nnodes = nnodes; + graph->nedges = nedges; + + graph_clear_edges(graph); + return graph; +} + + +void graph_destroy(graph_t *graph) +{ + DEBUGP("Destroying graph\n"); + free(graph->edges); + free(graph->first); + free(graph->next); + free(graph->critical_nodes); /* included -- Fabiano*/ + free(graph); + return; +} + +void graph_print(graph_t *g) +{ + cmph_uint32 i, e; + for (i = 0; i < g->nnodes; ++i) + { + DEBUGP("Printing edges connected to %u\n", i); + e = g->first[i]; + if (e != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + while ((e = g->next[e]) != EMPTY) + { + printf("%u -> %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + } + } + + } + return; +} + +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +{ + cmph_uint32 e = g->cedges; + + assert(v1 < g->nnodes); + assert(v2 < g->nnodes); + assert(e < g->nedges); + assert(!g->shrinking); + + g->next[e] = g->first[v1]; + g->first[v1] = e; + g->edges[e] = v2; + + g->next[e + g->nedges] = g->first[v2]; + g->first[v2] = e + g->nedges; + g->edges[e + g->nedges] = v1; + + ++(g->cedges); +} + +static int check_edge(graph_t *g, cmph_uint32 e, cmph_uint32 v1, cmph_uint32 v2) +{ + DEBUGP("Checking edge %u %u looking for %u %u\n", g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)], v1, v2); + if (g->edges[abs_edge(e, 0)] == v1 && g->edges[abs_edge(e, 1)] == v2) return 1; + if (g->edges[abs_edge(e, 0)] == v2 && g->edges[abs_edge(e, 1)] == v1) return 1; + return 0; +} + +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +{ + cmph_uint32 e; + e = g->first[v1]; + assert(e != EMPTY); + if (check_edge(g, e, v1, v2)) return abs_edge(e, 0); + do + { + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + return abs_edge(e, 0); +} +static void del_edge_point(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +{ + cmph_uint32 e, prev; + + DEBUGP("Deleting edge point %u %u\n", v1, v2); + e = g->first[v1]; + if (check_edge(g, e, v1, v2)) + { + g->first[v1] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); + return; + } + DEBUGP("Checking linked list\n"); + do + { + prev = e; + e = g->next[e]; + assert(e != EMPTY); + } + while (!check_edge(g, e, v1, v2)); + + g->next[prev] = g->next[e]; + //g->edges[e] = EMPTY; + DEBUGP("Deleted\n"); +} + + +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) +{ + g->shrinking = 1; + del_edge_point(g, v1, v2); + del_edge_point(g, v2, v1); +} + +void graph_clear_edges(graph_t *g) +{ + cmph_uint32 i; + for (i = 0; i < g->nnodes; ++i) g->first[i] = EMPTY; + for (i = 0; i < g->nedges*2; ++i) + { + g->edges[i] = EMPTY; + g->next[i] = EMPTY; + } + g->cedges = 0; + g->shrinking = 0; +} + +static cmph_uint8 find_degree1_edge(graph_t *g, cmph_uint32 v, cmph_uint8 *deleted, cmph_uint32 *e) +{ + cmph_uint32 edge = g->first[v]; + cmph_uint8 found = 0; + DEBUGP("Checking degree of vertex %u\n", v); + if (edge == EMPTY) return 0; + else if (!(GETBIT(deleted, abs_edge(edge, 0)))) + { + found = 1; + *e = edge; + } + while(1) + { + edge = g->next[edge]; + if (edge == EMPTY) break; + if (GETBIT(deleted, abs_edge(edge, 0))) continue; + if (found) return 0; + DEBUGP("Found first edge\n"); + *e = edge; + found = 1; + } + return found; +} + +static void cyclic_del_edge(graph_t *g, cmph_uint32 v, cmph_uint8 *deleted) +{ + + cmph_uint32 e = 0; + cmph_uint8 degree1; + cmph_uint32 v1 = v; + cmph_uint32 v2 = 0; + + degree1 = find_degree1_edge(g, v1, deleted, &e); + if (!degree1) return; + while(1) + { + DEBUGP("Deleting edge %u (%u->%u)\n", e, g->edges[abs_edge(e, 0)], g->edges[abs_edge(e, 1)]); + SETBIT(deleted, abs_edge(e, 0)); + + v2 = g->edges[abs_edge(e, 0)]; + if (v2 == v1) v2 = g->edges[abs_edge(e, 1)]; + + DEBUGP("Checking if second endpoint %u has degree 1\n", v2); + degree1 = find_degree1_edge(g, v2, deleted, &e); + if (degree1) + { + DEBUGP("Inspecting vertex %u\n", v2); + v1 = v2; + } + else break; + } +} + +int graph_is_cyclic(graph_t *g) +{ + cmph_uint32 i; + cmph_uint32 v; + cmph_uint8 *deleted = (cmph_uint8 *)malloc((g->nedges*sizeof(cmph_uint8))/8 + 1); + size_t deleted_len = g->nedges/8 + 1; + memset(deleted, 0, deleted_len); + + DEBUGP("Looking for cycles in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + for (i = 0; i < g->nedges; ++i) + { + if (!(GETBIT(deleted, i))) + { + DEBUGP("Edge %u %u->%u was not deleted\n", i, g->edges[i], g->edges[i + g->nedges]); + free(deleted); + return 1; + } + } + free(deleted); + return 0; +} + +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v) /* included -- Fabiano */ +{ + return (cmph_uint8)GETBIT(g->critical_nodes,v); +} + +void graph_obtain_critical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + cmph_uint32 i; + cmph_uint32 v; + cmph_uint8 *deleted = (cmph_uint8 *)malloc((g->nedges*sizeof(cmph_uint8))/8+1); + size_t deleted_len = g->nedges/8 + 1; + memset(deleted, 0, deleted_len); + free(g->critical_nodes); + g->critical_nodes = (cmph_uint8 *)malloc((g->nnodes*sizeof(cmph_uint8))/8 + 1); + g->ncritical_nodes = 0; + memset(g->critical_nodes, 0, (g->nnodes*sizeof(cmph_uint8))/8 + 1); + DEBUGP("Looking for the 2-core in graph with %u vertices and %u edges\n", g->nnodes, g->nedges); + for (v = 0; v < g->nnodes; ++v) + { + cyclic_del_edge(g, v, deleted); + } + + for (i = 0; i < g->nedges; ++i) + { + if (!(GETBIT(deleted,i))) + { + DEBUGP("Edge %u %u->%u belongs to the 2-core\n", i, g->edges[i], g->edges[i + g->nedges]); + if(!(GETBIT(g->critical_nodes,g->edges[i]))) + { + g->ncritical_nodes ++; + SETBIT(g->critical_nodes,g->edges[i]); + } + if(!(GETBIT(g->critical_nodes,g->edges[i + g->nedges]))) + { + g->ncritical_nodes ++; + SETBIT(g->critical_nodes,g->edges[i + g->nedges]); + } + } + } + free(deleted); +} + +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2) /* included -- Fabiano*/ +{ + cmph_uint32 e; + e = g->first[v1]; + if(e == EMPTY) return 0; + if (check_edge(g, e, v1, v2)) return 1; + do + { + e = g->next[e]; + if(e == EMPTY) return 0; + } + while (!check_edge(g, e, v1, v2)); + return 1; +} + +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id) /* included -- Fabiano*/ +{ + return (g->edges[e + id*g->nedges]); +} + +cmph_uint32 graph_ncritical_nodes(graph_t *g) /* included -- Fabiano*/ +{ + return g->ncritical_nodes; +} + +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v) +{ + graph_iterator_t it; + it.vertex = v; + it.edge = g->first[v]; + return it; +} +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it) +{ + cmph_uint32 ret; + if(it->edge == EMPTY) return GRAPH_NO_NEIGHBOR; + if (g->edges[it->edge] == it->vertex) ret = g->edges[it->edge + g->nedges]; + else ret = g->edges[it->edge]; + it->edge = g->next[it->edge]; + return ret; +} + + diff --git a/girepository/cmph/graph.h b/girepository/cmph/graph.h new file mode 100644 index 0000000..e1b5de6 --- /dev/null +++ b/girepository/cmph/graph.h @@ -0,0 +1,40 @@ +#ifndef _CMPH_GRAPH_H__ +#define _CMPH_GRAPH_H__ + +#include +#include "cmph_types.h" + +#define GRAPH_NO_NEIGHBOR UINT_MAX + +typedef struct __graph_t graph_t; +typedef struct __graph_iterator_t graph_iterator_t; +struct __graph_iterator_t +{ + cmph_uint32 vertex; + cmph_uint32 edge; +}; + + + +graph_t *graph_new(cmph_uint32 nnodes, cmph_uint32 nedges); +void graph_destroy(graph_t *graph); + +void graph_add_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_del_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +void graph_clear_edges(graph_t *g); +cmph_uint32 graph_edge_id(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); +cmph_uint8 graph_contains_edge(graph_t *g, cmph_uint32 v1, cmph_uint32 v2); + +graph_iterator_t graph_neighbors_it(graph_t *g, cmph_uint32 v); +cmph_uint32 graph_next_neighbor(graph_t *g, graph_iterator_t* it); + +void graph_obtain_critical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint8 graph_node_is_critical(graph_t * g, cmph_uint32 v); /* included -- Fabiano */ +cmph_uint32 graph_ncritical_nodes(graph_t *g); /* included -- Fabiano*/ +cmph_uint32 graph_vertex_id(graph_t *g, cmph_uint32 e, cmph_uint32 id); /* included -- Fabiano*/ + +int graph_is_cyclic(graph_t *g); + +void graph_print(graph_t *); + +#endif diff --git a/girepository/cmph/hash.c b/girepository/cmph/hash.c new file mode 100644 index 0000000..be86d6e --- /dev/null +++ b/girepository/cmph/hash.c @@ -0,0 +1,216 @@ +#include "hash_state.h" +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +const char *cmph_hash_names[] = { "jenkins", NULL }; + +hash_state_t *hash_state_new(CMPH_HASH hashfunc, cmph_uint32 hashsize) +{ + hash_state_t *state = NULL; + switch (hashfunc) + { + case CMPH_HASH_JENKINS: + DEBUGP("Jenkins function - %u\n", hashsize); + state = (hash_state_t *)jenkins_state_new(hashsize); + DEBUGP("Jenkins function created\n"); + break; + default: + assert(0); + } + state->hashfunc = hashfunc; + return state; +} +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen) +{ + switch (state->hashfunc) + { + case CMPH_HASH_JENKINS: + return jenkins_hash((jenkins_state_t *)state, key, keylen); + default: + assert(0); + } + assert(0); + return 0; +} + +void hash_vector(hash_state_t *state, const char *key, cmph_uint32 keylen, cmph_uint32 * hashes) +{ + switch (state->hashfunc) + { + case CMPH_HASH_JENKINS: + jenkins_hash_vector_((jenkins_state_t *)state, key, keylen, hashes); + break; + default: + assert(0); + } +} + + +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen) +{ + char *algobuf; + size_t len; + switch (state->hashfunc) + { + case CMPH_HASH_JENKINS: + jenkins_state_dump((jenkins_state_t *)state, &algobuf, buflen); + if (*buflen == UINT_MAX) return; + break; + default: + assert(0); + } + *buf = (char *)malloc(strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen); + memcpy(*buf, cmph_hash_names[state->hashfunc], strlen(cmph_hash_names[state->hashfunc]) + 1); + DEBUGP("Algobuf is %u\n", *(cmph_uint32 *)algobuf); + len = *buflen; + memcpy(*buf + strlen(cmph_hash_names[state->hashfunc]) + 1, algobuf, len); + *buflen = (cmph_uint32)strlen(cmph_hash_names[state->hashfunc]) + 1 + *buflen; + free(algobuf); + return; +} + +hash_state_t * hash_state_copy(hash_state_t *src_state) +{ + hash_state_t *dest_state = NULL; + switch (src_state->hashfunc) + { + case CMPH_HASH_JENKINS: + dest_state = (hash_state_t *)jenkins_state_copy((jenkins_state_t *)src_state); + break; + default: + assert(0); + } + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen) +{ + cmph_uint32 i; + cmph_uint32 offset; + CMPH_HASH hashfunc = CMPH_HASH_COUNT; + for (i = 0; i < CMPH_HASH_COUNT; ++i) + { + if (strcmp(buf, cmph_hash_names[i]) == 0) + { + hashfunc = i; + break; + } + } + if (hashfunc == CMPH_HASH_COUNT) return NULL; + offset = (cmph_uint32)strlen(cmph_hash_names[hashfunc]) + 1; + switch (hashfunc) + { + case CMPH_HASH_JENKINS: + return (hash_state_t *)jenkins_state_load(buf + offset, buflen - offset); + default: + return NULL; + } + return NULL; +} +void hash_state_destroy(hash_state_t *state) +{ + switch (state->hashfunc) + { + case CMPH_HASH_JENKINS: + jenkins_state_destroy((jenkins_state_t *)state); + break; + default: + assert(0); + } + return; +} + +/** \fn void hash_state_pack(hash_state_t *state, void *hash_packed) + * \brief Support the ability to pack a hash function into a preallocated contiguous memory space pointed by hash_packed. + * \param state points to the hash function + * \param hash_packed pointer to the contiguous memory area used to store the hash function. The size of hash_packed must be at least hash_state_packed_size() + * + * Support the ability to pack a hash function into a preallocated contiguous memory space pointed by hash_packed. + * However, the hash function type must be packed outside. + */ +void hash_state_pack(hash_state_t *state, void *hash_packed) +{ + switch (state->hashfunc) + { + case CMPH_HASH_JENKINS: + // pack the jenkins hash function + jenkins_state_pack((jenkins_state_t *)state, hash_packed); + break; + default: + assert(0); + } + return; +} + +/** \fn cmph_uint32 hash_state_packed_size(CMPH_HASH hashfunc) + * \brief Return the amount of space needed to pack a hash function. + * \param hashfunc function type + * \return the size of the packed function or zero for failures + */ +cmph_uint32 hash_state_packed_size(CMPH_HASH hashfunc) +{ + cmph_uint32 size = 0; + switch (hashfunc) + { + case CMPH_HASH_JENKINS: + size += jenkins_state_packed_size(); + break; + default: + assert(0); + } + return size; +} + +/** \fn cmph_uint32 hash_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen) + * \param hash_packed is a pointer to a contiguous memory area + * \param hashfunc is the type of the hash function packed in hash_packed + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 hash_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen) +{ + switch (hashfunc) + { + case CMPH_HASH_JENKINS: + return jenkins_hash_packed(hash_packed, k, keylen); + default: + assert(0); + } + assert(0); + return 0; +} + +/** \fn hash_vector_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes) + * \param hash_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void hash_vector_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes) +{ + switch (hashfunc) + { + case CMPH_HASH_JENKINS: + jenkins_hash_vector_packed(hash_packed, k, keylen, hashes); + break; + default: + assert(0); + } +} + + +/** \fn CMPH_HASH hash_get_type(hash_state_t *state); + * \param state is a pointer to a hash_state_t structure + * \return the hash function type pointed by state + */ +CMPH_HASH hash_get_type(hash_state_t *state) +{ + return state->hashfunc; +} diff --git a/girepository/cmph/hash.h b/girepository/cmph/hash.h new file mode 100644 index 0000000..0ec4ce1 --- /dev/null +++ b/girepository/cmph/hash.h @@ -0,0 +1,76 @@ +#ifndef __CMPH_HASH_H__ +#define __CMPH_HASH_H__ + +#include "cmph_types.h" + +typedef union __hash_state_t hash_state_t; + +hash_state_t *hash_state_new(CMPH_HASH, cmph_uint32 hashsize); + +/** \fn cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); + * \param state is a pointer to a hash_state_t structure + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 hash(hash_state_t *state, const char *key, cmph_uint32 keylen); + +/** \fn void hash_vector(hash_state_t *state, const char *key, cmph_uint32 keylen, cmph_uint32 * hashes); + * \param state is a pointer to a hash_state_t structure + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void hash_vector(hash_state_t *state, const char *key, cmph_uint32 keylen, cmph_uint32 * hashes); + +void hash_state_dump(hash_state_t *state, char **buf, cmph_uint32 *buflen); + +hash_state_t * hash_state_copy(hash_state_t *src_state); + +hash_state_t *hash_state_load(const char *buf, cmph_uint32 buflen); + +void hash_state_destroy(hash_state_t *state); + +/** \fn void hash_state_pack(hash_state_t *state, void *hash_packed); + * \brief Support the ability to pack a hash function into a preallocated contiguous memory space pointed by hash_packed. + * \param state points to the hash function + * \param hash_packed pointer to the contiguous memory area used to store the hash function. The size of hash_packed must be at least hash_state_packed_size() + * + * Support the ability to pack a hash function into a preallocated contiguous memory space pointed by hash_packed. + * However, the hash function type must be packed outside. + */ +void hash_state_pack(hash_state_t *state, void *hash_packed); + +/** \fn cmph_uint32 hash_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen); + * \param hash_packed is a pointer to a contiguous memory area + * \param hashfunc is the type of the hash function packed in hash_packed + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 hash_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen); + +/** \fn cmph_uint32 hash_state_packed_size(CMPH_HASH hashfunc) + * \brief Return the amount of space needed to pack a hash function. + * \param hashfunc function type + * \return the size of the packed function or zero for failures + */ +cmph_uint32 hash_state_packed_size(CMPH_HASH hashfunc); + + +/** \fn hash_vector_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + * \param hash_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void hash_vector_packed(void *hash_packed, CMPH_HASH hashfunc, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + + +/** \fn CMPH_HASH hash_get_type(hash_state_t *state); + * \param state is a pointer to a hash_state_t structure + * \return the hash function type pointed by state + */ +CMPH_HASH hash_get_type(hash_state_t *state); + +#endif diff --git a/girepository/cmph/hash_state.h b/girepository/cmph/hash_state.h new file mode 100644 index 0000000..1b567dc --- /dev/null +++ b/girepository/cmph/hash_state.h @@ -0,0 +1,12 @@ +#ifndef __HASH_STATE_H__ +#define __HASH_STATE_H__ + +#include "hash.h" +#include "jenkins_hash.h" +union __hash_state_t +{ + CMPH_HASH hashfunc; + jenkins_state_t jenkins; +}; + +#endif diff --git a/girepository/cmph/hashtree.c b/girepository/cmph/hashtree.c new file mode 100644 index 0000000..2f3567e --- /dev/null +++ b/girepository/cmph/hashtree.c @@ -0,0 +1,289 @@ +#include "graph.h" +#include "hashtree.h" +#include "cmph_structs.h" +#include "hastree_structs.h" +#include "hash.h" +#include "bitbool.h" + +#include +#include +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +hashtree_config_data_t *hashtree_config_new() +{ + hashtree_config_data_t *hashtree; + hashtree = (hashtree_config_data_t *)malloc(sizeof(hashtree_config_data_t)); + if (!hashtree) return NULL; + memset(hashtree, 0, sizeof(hashtree_config_data_t)); + hashtree->hashfuncs[0] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[1] = CMPH_HASH_JENKINS; + hashtree->hashfuncs[2] = CMPH_HASH_JENKINS; + hashtree->memory = 32 * 1024 * 1024; + return hashtree; +} +void hashtree_config_destroy(cmph_config_t *mph) +{ + hashtree_config_data_t *data = (hashtree_config_data_t *)mph->data; + DEBUGP("Destroying algorithm dependent data\n"); + free(data); +} + +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs) +{ + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + CMPH_HASH *hashptr = hashfuncs; + cmph_uint32 i = 0; + while(*hashptr != CMPH_HASH_COUNT) + { + if (i >= 3) break; //hashtree only uses three hash functions + hashtree->hashfuncs[i] = *hashptr; + ++i, ++hashptr; + } +} + +cmph_t *hashtree_new(cmph_config_t *mph, double c) +{ + cmph_t *mphf = NULL; + hashtree_data_t *hashtreef = NULL; + + cmph_uint32 i; + cmph_uint32 iterations = 20; + cmph_uint8 *visited = NULL; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + hashtree->m = mph->key_source->nkeys; + hashtree->n = ceil(c * mph->key_source->nkeys); + DEBUGP("m (edges): %u n (vertices): %u c: %f\n", hashtree->m, hashtree->n, c); + hashtree->graph = graph_new(hashtree->n, hashtree->m); + DEBUGP("Created graph\n"); + + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*3); + for(i = 0; i < 3; ++i) hashtree->hashes[i] = NULL; + //Mapping step + if (mph->verbosity) + { + fprintf(stderr, "Entering mapping step for mph creation of %u keys with graph sized %u\n", hashtree->m, hashtree->n); + } + while(1) + { + int ok; + hashtree->hashes[0] = hash_state_new(hashtree->hashfuncs[0], hashtree->n); + hashtree->hashes[1] = hash_state_new(hashtree->hashfuncs[1], hashtree->n); + ok = hashtree_gen_edges(mph); + if (!ok) + { + --iterations; + hash_state_destroy(hashtree->hashes[0]); + hashtree->hashes[0] = NULL; + hash_state_destroy(hashtree->hashes[1]); + hashtree->hashes[1] = NULL; + DEBUGP("%u iterations remaining\n", iterations); + if (mph->verbosity) + { + fprintf(stderr, "Acyclic graph creation failure - %u iterations remaining\n", iterations); + } + if (iterations == 0) break; + } + else break; + } + if (iterations == 0) + { + graph_destroy(hashtree->graph); + return NULL; + } + + //Assignment step + if (mph->verbosity) + { + fprintf(stderr, "Starting assignment step\n"); + } + DEBUGP("Assignment step\n"); + visited = (char *)malloc(hashtree->n/8 + 1); + memset(visited, 0, hashtree->n/8 + 1); + free(hashtree->g); + hashtree->g = (cmph_uint32 *)malloc(hashtree->n * sizeof(cmph_uint32)); + assert(hashtree->g); + for (i = 0; i < hashtree->n; ++i) + { + if (!GETBIT(visited,i)) + { + hashtree->g[i] = 0; + hashtree_traverse(hashtree, visited, i); + } + } + graph_destroy(hashtree->graph); + free(visited); + hashtree->graph = NULL; + + mphf = (cmph_t *)malloc(sizeof(cmph_t)); + mphf->algo = mph->algo; + hashtreef = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + hashtreef->g = hashtree->g; + hashtree->g = NULL; //transfer memory ownership + hashtreef->hashes = hashtree->hashes; + hashtree->hashes = NULL; //transfer memory ownership + hashtreef->n = hashtree->n; + hashtreef->m = hashtree->m; + mphf->data = hashtreef; + mphf->size = hashtree->m; + DEBUGP("Successfully generated minimal perfect hash\n"); + if (mph->verbosity) + { + fprintf(stderr, "Successfully generated minimal perfect hash function\n"); + } + return mphf; +} + +static void hashtree_traverse(hashtree_config_data_t *hashtree, cmph_uint8 *visited, cmph_uint32 v) +{ + + graph_iterator_t it = graph_neighbors_it(hashtree->graph, v); + cmph_uint32 neighbor = 0; + SETBIT(visited,v); + + DEBUGP("Visiting vertex %u\n", v); + while((neighbor = graph_next_neighbor(hashtree->graph, &it)) != GRAPH_NO_NEIGHBOR) + { + DEBUGP("Visiting neighbor %u\n", neighbor); + if(GETBIT(visited,neighbor)) continue; + DEBUGP("Visiting neighbor %u\n", neighbor); + DEBUGP("Visiting edge %u->%u with id %u\n", v, neighbor, graph_edge_id(hashtree->graph, v, neighbor)); + hashtree->g[neighbor] = graph_edge_id(hashtree->graph, v, neighbor) - hashtree->g[v]; + DEBUGP("g is %u (%u - %u mod %u)\n", hashtree->g[neighbor], graph_edge_id(hashtree->graph, v, neighbor), hashtree->g[v], hashtree->m); + hashtree_traverse(hashtree, visited, neighbor); + } +} + +static int hashtree_gen_edges(cmph_config_t *mph) +{ + cmph_uint32 e; + hashtree_config_data_t *hashtree = (hashtree_config_data_t *)mph->data; + int cycles = 0; + + DEBUGP("Generating edges for %u vertices with hash functions %s and %s\n", hashtree->n, cmph_hash_names[hashtree->hashfuncs[0]], cmph_hash_names[hashtree->hashfuncs[1]]); + graph_clear_edges(hashtree->graph); + mph->key_source->rewind(mph->key_source->data); + for (e = 0; e < mph->key_source->nkeys; ++e) + { + cmph_uint32 h1, h2; + cmph_uint32 keylen; + char *key; + mph->key_source->read(mph->key_source->data, &key, &keylen); + h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + if (h1 == h2) if (++h2 >= hashtree->n) h2 = 0; + if (h1 == h2) + { + if (mph->verbosity) fprintf(stderr, "Self loop for key %u\n", e); + mph->key_source->dispose(mph->key_source->data, key, keylen); + return 0; + } + DEBUGP("Adding edge: %u -> %u for key %s\n", h1, h2, key); + mph->key_source->dispose(mph->key_source->data, key, keylen); + graph_add_edge(hashtree->graph, h1, h2); + } + cycles = graph_is_cyclic(hashtree->graph); + if (mph->verbosity && cycles) fprintf(stderr, "Cyclic graph generated\n"); + DEBUGP("Looking for cycles: %u\n", cycles); + + return ! cycles; +} + +int hashtree_dump(cmph_t *mphf, FILE *fd) +{ + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 two = 2; //number of hash functions + hashtree_data_t *data = (hashtree_data_t *)mphf->data; + __cmph_dump(mphf, fd); + + fwrite(&two, sizeof(cmph_uint32), 1, fd); + hash_state_dump(data->hashes[0], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + hash_state_dump(data->hashes[1], &buf, &buflen); + DEBUGP("Dumping hash state with %u bytes to disk\n", buflen); + fwrite(&buflen, sizeof(cmph_uint32), 1, fd); + fwrite(buf, buflen, 1, fd); + free(buf); + + fwrite(&(data->n), sizeof(cmph_uint32), 1, fd); + fwrite(&(data->m), sizeof(cmph_uint32), 1, fd); + + fwrite(data->g, sizeof(cmph_uint32)*data->n, 1, fd); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < data->n; ++i) fprintf(stderr, "%u ", data->g[i]); + fprintf(stderr, "\n"); + #endif + return 1; +} + +void hashtree_load(FILE *f, cmph_t *mphf) +{ + cmph_uint32 nhashes; + char *buf = NULL; + cmph_uint32 buflen; + cmph_uint32 i; + hashtree_data_t *hashtree = (hashtree_data_t *)malloc(sizeof(hashtree_data_t)); + + DEBUGP("Loading hashtree mphf\n"); + mphf->data = hashtree; + fread(&nhashes, sizeof(cmph_uint32), 1, f); + hashtree->hashes = (hash_state_t **)malloc(sizeof(hash_state_t *)*(nhashes + 1)); + hashtree->hashes[nhashes] = NULL; + DEBUGP("Reading %u hashes\n", nhashes); + for (i = 0; i < nhashes; ++i) + { + hash_state_t *state = NULL; + fread(&buflen, sizeof(cmph_uint32), 1, f); + DEBUGP("Hash state has %u bytes\n", buflen); + buf = (char *)malloc(buflen); + fread(buf, buflen, 1, f); + state = hash_state_load(buf, buflen); + hashtree->hashes[i] = state; + free(buf); + } + + DEBUGP("Reading m and n\n"); + fread(&(hashtree->n), sizeof(cmph_uint32), 1, f); + fread(&(hashtree->m), sizeof(cmph_uint32), 1, f); + + hashtree->g = (cmph_uint32 *)malloc(sizeof(cmph_uint32)*hashtree->n); + fread(hashtree->g, hashtree->n*sizeof(cmph_uint32), 1, f); + #ifdef DEBUG + fprintf(stderr, "G: "); + for (i = 0; i < hashtree->n; ++i) fprintf(stderr, "%u ", hashtree->g[i]); + fprintf(stderr, "\n"); + #endif + return; +} + + +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen) +{ + hashtree_data_t *hashtree = mphf->data; + cmph_uint32 h1 = hash(hashtree->hashes[0], key, keylen) % hashtree->n; + cmph_uint32 h2 = hash(hashtree->hashes[1], key, keylen) % hashtree->n; + DEBUGP("key: %s h1: %u h2: %u\n", key, h1, h2); + if (h1 == h2 && ++h2 >= hashtree->n) h2 = 0; + DEBUGP("key: %s g[h1]: %u g[h2]: %u edges: %u\n", key, hashtree->g[h1], hashtree->g[h2], hashtree->m); + return (hashtree->g[h1] + hashtree->g[h2]) % hashtree->m; +} +void hashtree_destroy(cmph_t *mphf) +{ + hashtree_data_t *data = (hashtree_data_t *)mphf->data; + free(data->g); + hash_state_destroy(data->hashes[0]); + hash_state_destroy(data->hashes[1]); + free(data->hashes); + free(data); + free(mphf); +} diff --git a/girepository/cmph/hashtree.h b/girepository/cmph/hashtree.h new file mode 100644 index 0000000..8bff674 --- /dev/null +++ b/girepository/cmph/hashtree.h @@ -0,0 +1,19 @@ +#ifndef __CMPH_HASHTREE_H__ +#define __CMPH_HASHTREE_H__ + +#include "cmph.h" + +typedef struct __hashtree_data_t hashtree_data_t; +typedef struct __hashtree_config_data_t hashtree_config_data_t; + +hashtree_config_data_t *hashtree_config_new(); +void hashtree_config_set_hashfuncs(cmph_config_t *mph, CMPH_HASH *hashfuncs); +void hashtree_config_set_leaf_algo(cmph_config_t *mph, CMPH_ALGO leaf_algo); +void hashtree_config_destroy(cmph_config_t *mph); +cmph_t *hashtree_new(cmph_config_t *mph, double c); + +void hashtree_load(FILE *f, cmph_t *mphf); +int hashtree_dump(cmph_t *mphf, FILE *f); +void hashtree_destroy(cmph_t *mphf); +cmph_uint32 hashtree_search(cmph_t *mphf, const char *key, cmph_uint32 keylen); +#endif diff --git a/girepository/cmph/hashtree_structs.h b/girepository/cmph/hashtree_structs.h new file mode 100644 index 0000000..7258cd3 --- /dev/null +++ b/girepository/cmph/hashtree_structs.h @@ -0,0 +1,32 @@ +#ifndef __CMPH_HASHTREE_STRUCTS_H__ +#define __CMPH_HASHTREE_STRUCTS_H__ + +#include "hash_state.h" + +struct __hashtree_data_t +{ + cmph_uint32 m; //edges (words) count + double c; //constant c + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 **g; + cmph_uint32 k; //number of components + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +struct __hashtree_config_data_t +{ + CMPH_ALGO leaf_algo; + CMPH_HASH hashfuncs[3]; + cmph_uint32 m; //edges (words) count + cmph_uint8 *size; //size[i] stores the number of edges represented by g[i] + cmph_uint32 *offset; //offset[i] stores the sum size[0] + ... size[i - 1] + cmph_uint32 k; //number of components + cmph_uint32 memory; + hash_state_t **h1; + hash_state_t **h2; + hash_state_t *h3; +}; + +#endif diff --git a/girepository/cmph/jenkins_hash.c b/girepository/cmph/jenkins_hash.c new file mode 100644 index 0000000..65cdff9 --- /dev/null +++ b/girepository/cmph/jenkins_hash.c @@ -0,0 +1,297 @@ +#include "jenkins_hash.h" +#include +#ifdef WIN32 +#define _USE_MATH_DEFINES //For M_LOG2E +#endif +#include +#include +#include + +//#define DEBUG +#include "debug.h" + +#define hashsize(n) ((cmph_uint32)1<<(n)) +#define hashmask(n) (hashsize(n)-1) + + + +//#define NM2 /* Define this if you do not want power of 2 table sizes*/ + + +/* + -------------------------------------------------------------------- + mix -- mix 3 32-bit values reversibly. + For every delta with one or two bits set, and the deltas of all three + high bits or all three low bits, whether the original value of a,b,c + is almost all zero or is uniformly distributed, + * If mix() is run forward or backward, at least 32 bits in a,b,c + have at least 1/4 probability of changing. + * If mix() is run forward, every bit of c will change between 1/3 and + 2/3 of the time. (Well, 22/100 and 78/100 for some 2-bit deltas.) + mix() was built out of 36 single-cycle latency instructions in a + structure that could supported 2x parallelism, like so: + a -= b; + a -= c; x = (c>>13); + b -= c; a ^= x; + b -= a; x = (a<<8); + c -= a; b ^= x; + c -= b; x = (b>>13); + ... + Unfortunately, superscalar Pentiums and Sparcs can't take advantage + of that parallelism. They've also turned some of those single-cycle + latency instructions into multi-cycle latency instructions. Still, + this is the fastest good hash I could find. There were about 2^^68 + to choose from. I only looked at a billion or so. + -------------------------------------------------------------------- + */ +#define mix(a,b,c) \ +{ \ + a -= b; a -= c; a ^= (c>>13); \ + b -= c; b -= a; b ^= (a<<8); \ + c -= a; c -= b; c ^= (b>>13); \ + a -= b; a -= c; a ^= (c>>12); \ + b -= c; b -= a; b ^= (a<<16); \ + c -= a; c -= b; c ^= (b>>5); \ + a -= b; a -= c; a ^= (c>>3); \ + b -= c; b -= a; b ^= (a<<10); \ + c -= a; c -= b; c ^= (b>>15); \ +} + +/* + -------------------------------------------------------------------- + hash() -- hash a variable-length key into a 32-bit value +k : the key (the unaligned variable-length array of bytes) +len : the length of the key, counting by bytes +initval : can be any 4-byte value +Returns a 32-bit value. Every bit of the key affects every bit of +the return value. Every 1-bit and 2-bit delta achieves avalanche. +About 6*len+35 instructions. + +The best hash table sizes are powers of 2. There is no need to do +mod a prime (mod is sooo slow!). If you need less than 32 bits, +use a bitmask. For example, if you need only 10 bits, do +h = (h & hashmask(10)); +In which case, the hash table should have hashsize(10) elements. + +If you are hashing n strings (cmph_uint8 **)k, do it like this: +for (i=0, h=0; iseed = ((cmph_uint32)rand() % size); + return state; +} +void jenkins_state_destroy(jenkins_state_t *state) +{ + free(state); +} + + +static inline void __jenkins_hash_vector(cmph_uint32 seed, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes) +{ + register cmph_uint32 len, length; + + /* Set up the internal state */ + length = keylen; + len = length; + hashes[0] = hashes[1] = 0x9e3779b9; /* the golden ratio; an arbitrary value */ + hashes[2] = seed; /* the previous hash value - seed in our case */ + + /*---------------------------------------- handle most of the key */ + while (len >= 12) + { + hashes[0] += ((cmph_uint32)k[0] +((cmph_uint32)k[1]<<8) +((cmph_uint32)k[2]<<16) +((cmph_uint32)k[3]<<24)); + hashes[1] += ((cmph_uint32)k[4] +((cmph_uint32)k[5]<<8) +((cmph_uint32)k[6]<<16) +((cmph_uint32)k[7]<<24)); + hashes[2] += ((cmph_uint32)k[8] +((cmph_uint32)k[9]<<8) +((cmph_uint32)k[10]<<16)+((cmph_uint32)k[11]<<24)); + mix(hashes[0],hashes[1],hashes[2]); + k += 12; len -= 12; + } + + /*------------------------------------- handle the last 11 bytes */ + hashes[2] += length; + switch(len) /* all the case statements fall through */ + { + case 11: + hashes[2] +=((cmph_uint32)k[10]<<24); + case 10: + hashes[2] +=((cmph_uint32)k[9]<<16); + case 9 : + hashes[2] +=((cmph_uint32)k[8]<<8); + /* the first byte of hashes[2] is reserved for the length */ + case 8 : + hashes[1] +=((cmph_uint32)k[7]<<24); + case 7 : + hashes[1] +=((cmph_uint32)k[6]<<16); + case 6 : + hashes[1] +=((cmph_uint32)k[5]<<8); + case 5 : + hashes[1] +=(cmph_uint8) k[4]; + case 4 : + hashes[0] +=((cmph_uint32)k[3]<<24); + case 3 : + hashes[0] +=((cmph_uint32)k[2]<<16); + case 2 : + hashes[0] +=((cmph_uint32)k[1]<<8); + case 1 : + hashes[0] +=(cmph_uint8)k[0]; + /* case 0: nothing left to add */ + } + + mix(hashes[0],hashes[1],hashes[2]); +} + +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen) +{ + cmph_uint32 hashes[3]; + __jenkins_hash_vector(state->seed, k, keylen, hashes); + return hashes[2]; +/* cmph_uint32 a, b, c; + cmph_uint32 len, length; + + // Set up the internal state + length = keylen; + len = length; + a = b = 0x9e3779b9; // the golden ratio; an arbitrary value + c = state->seed; // the previous hash value - seed in our case + + // handle most of the key + while (len >= 12) + { + a += (k[0] +((cmph_uint32)k[1]<<8) +((cmph_uint32)k[2]<<16) +((cmph_uint32)k[3]<<24)); + b += (k[4] +((cmph_uint32)k[5]<<8) +((cmph_uint32)k[6]<<16) +((cmph_uint32)k[7]<<24)); + c += (k[8] +((cmph_uint32)k[9]<<8) +((cmph_uint32)k[10]<<16)+((cmph_uint32)k[11]<<24)); + mix(a,b,c); + k += 12; len -= 12; + } + + // handle the last 11 bytes + c += length; + switch(len) /// all the case statements fall through + { + case 11: + c +=((cmph_uint32)k[10]<<24); + case 10: + c +=((cmph_uint32)k[9]<<16); + case 9 : + c +=((cmph_uint32)k[8]<<8); + // the first byte of c is reserved for the length + case 8 : + b +=((cmph_uint32)k[7]<<24); + case 7 : + b +=((cmph_uint32)k[6]<<16); + case 6 : + b +=((cmph_uint32)k[5]<<8); + case 5 : + b +=k[4]; + case 4 : + a +=((cmph_uint32)k[3]<<24); + case 3 : + a +=((cmph_uint32)k[2]<<16); + case 2 : + a +=((cmph_uint32)k[1]<<8); + case 1 : + a +=k[0]; + // case 0: nothing left to add + } + + mix(a,b,c); + + /// report the result + + return c; + */ +} + +void jenkins_hash_vector_(jenkins_state_t *state, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes) +{ + __jenkins_hash_vector(state->seed, k, keylen, hashes); +} + +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen) +{ + *buflen = sizeof(cmph_uint32); + *buf = (char *)malloc(sizeof(cmph_uint32)); + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + memcpy(*buf, &(state->seed), sizeof(cmph_uint32)); + DEBUGP("Dumped jenkins state with seed %u\n", state->seed); + return; +} + +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state) +{ + jenkins_state_t *dest_state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + dest_state->hashfunc = src_state->hashfunc; + dest_state->seed = src_state->seed; + return dest_state; +} + +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen) +{ + jenkins_state_t *state = (jenkins_state_t *)malloc(sizeof(jenkins_state_t)); + state->seed = *(cmph_uint32 *)buf; + state->hashfunc = CMPH_HASH_JENKINS; + DEBUGP("Loaded jenkins state with seed %u\n", state->seed); + return state; +} + + +/** \fn void jenkins_state_pack(jenkins_state_t *state, void *jenkins_packed); + * \brief Support the ability to pack a jenkins function into a preallocated contiguous memory space pointed by jenkins_packed. + * \param state points to the jenkins function + * \param jenkins_packed pointer to the contiguous memory area used to store the jenkins function. The size of jenkins_packed must be at least jenkins_state_packed_size() + */ +void jenkins_state_pack(jenkins_state_t *state, void *jenkins_packed) +{ + if (state && jenkins_packed) + { + memcpy(jenkins_packed, &(state->seed), sizeof(cmph_uint32)); + } +} + +/** \fn cmph_uint32 jenkins_state_packed_size(jenkins_state_t *state); + * \brief Return the amount of space needed to pack a jenkins function. + * \return the size of the packed function or zero for failures + */ +cmph_uint32 jenkins_state_packed_size(void) +{ + return sizeof(cmph_uint32); +} + + +/** \fn cmph_uint32 jenkins_hash_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen); + * \param jenkins_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 jenkins_hash_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen) +{ + cmph_uint32 hashes[3]; + __jenkins_hash_vector(*((cmph_uint32 *)jenkins_packed), k, keylen, hashes); + return hashes[2]; +} + +/** \fn jenkins_hash_vector_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + * \param jenkins_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void jenkins_hash_vector_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes) +{ + __jenkins_hash_vector(*((cmph_uint32 *)jenkins_packed), k, keylen, hashes); +} diff --git a/girepository/cmph/jenkins_hash.h b/girepository/cmph/jenkins_hash.h new file mode 100644 index 0000000..39626e2 --- /dev/null +++ b/girepository/cmph/jenkins_hash.h @@ -0,0 +1,65 @@ +#ifndef __JEKINS_HASH_H__ +#define __JEKINS_HASH_H__ + +#include "hash.h" + +typedef struct __jenkins_state_t +{ + CMPH_HASH hashfunc; + cmph_uint32 seed; +} jenkins_state_t; + +jenkins_state_t *jenkins_state_new(cmph_uint32 size); //size of hash table + +/** \fn cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); + * \param state is a pointer to a jenkins_state_t structure + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 jenkins_hash(jenkins_state_t *state, const char *k, cmph_uint32 keylen); + +/** \fn void jenkins_hash_vector_(jenkins_state_t *state, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + * \param state is a pointer to a jenkins_state_t structure + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void jenkins_hash_vector_(jenkins_state_t *state, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + +void jenkins_state_dump(jenkins_state_t *state, char **buf, cmph_uint32 *buflen); +jenkins_state_t *jenkins_state_copy(jenkins_state_t *src_state); +jenkins_state_t *jenkins_state_load(const char *buf, cmph_uint32 buflen); +void jenkins_state_destroy(jenkins_state_t *state); + +/** \fn void jenkins_state_pack(jenkins_state_t *state, void *jenkins_packed); + * \brief Support the ability to pack a jenkins function into a preallocated contiguous memory space pointed by jenkins_packed. + * \param state points to the jenkins function + * \param jenkins_packed pointer to the contiguous memory area used to store the jenkins function. The size of jenkins_packed must be at least jenkins_state_packed_size() + */ +void jenkins_state_pack(jenkins_state_t *state, void *jenkins_packed); + +/** \fn cmph_uint32 jenkins_state_packed_size(); + * \brief Return the amount of space needed to pack a jenkins function. + * \return the size of the packed function or zero for failures + */ +cmph_uint32 jenkins_state_packed_size(void); + + +/** \fn cmph_uint32 jenkins_hash_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen); + * \param jenkins_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \return an integer that represents a hash value of 32 bits. + */ +cmph_uint32 jenkins_hash_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen); + +/** \fn jenkins_hash_vector_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + * \param jenkins_packed is a pointer to a contiguous memory area + * \param key is a pointer to a key + * \param keylen is the key length + * \param hashes is a pointer to a memory large enough to fit three 32-bit integers. + */ +void jenkins_hash_vector_packed(void *jenkins_packed, const char *k, cmph_uint32 keylen, cmph_uint32 * hashes); + +#endif diff --git a/girepository/cmph/main.c b/girepository/cmph/main.c new file mode 100644 index 0000000..f739b32 --- /dev/null +++ b/girepository/cmph/main.c @@ -0,0 +1,342 @@ +#ifdef WIN32 +#include "wingetopt.h" +#else +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include "cmph.h" +#include "hash.h" + +#ifdef WIN32 +#define VERSION "0.8" +#else +#include "config.h" +#endif + + +void usage(const char *prg) +{ + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c algorithm_dependent_value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b algorithm_dependent_value] [-t keys_per_bin] [-d tmp_dir] [-m file.mph] keysfile\n", prg); +} +void usage_long(const char *prg) +{ + cmph_uint32 i; + fprintf(stderr, "usage: %s [-v] [-h] [-V] [-k nkeys] [-f hash_function] [-g [-c algorithm_dependent_value][-s seed] ] [-a algorithm] [-M memory_in_MB] [-b algorithm_dependent_value] [-t keys_per_bin] [-d tmp_dir] [-m file.mph] keysfile\n", prg); + fprintf(stderr, "Minimum perfect hashing tool\n\n"); + fprintf(stderr, " -h\t print this help message\n"); + fprintf(stderr, " -c\t c value determines:\n"); + fprintf(stderr, " \t * the number of vertices in the graph for the algorithms BMZ and CHM\n"); + fprintf(stderr, " \t * the number of bits per key required in the FCH algorithm\n"); + fprintf(stderr, " \t * the load factor in the CHD_PH algorithm\n"); + fprintf(stderr, " -a\t algorithm - valid values are\n"); + for (i = 0; i < CMPH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_names[i]); + fprintf(stderr, " -f\t hash function (may be used multiple times) - valid values are\n"); + for (i = 0; i < CMPH_HASH_COUNT; ++i) fprintf(stderr, " \t * %s\n", cmph_hash_names[i]); + fprintf(stderr, " -V\t print version number and exit\n"); + fprintf(stderr, " -v\t increase verbosity (may be used multiple times)\n"); + fprintf(stderr, " -k\t number of keys\n"); + fprintf(stderr, " -g\t generation mode\n"); + fprintf(stderr, " -s\t random seed\n"); + fprintf(stderr, " -m\t minimum perfect hash function file \n"); + fprintf(stderr, " -M\t main memory availability (in MB) used in BRZ algorithm \n"); + fprintf(stderr, " -d\t temporary directory used in BRZ algorithm \n"); + fprintf(stderr, " -b\t the meaning of this parameter depends on the algorithm selected in the -a option:\n"); + fprintf(stderr, " \t * For BRZ it is used to make the maximal number of keys in a bucket lower than 256.\n"); + fprintf(stderr, " \t In this case its value should be an integer in the range [64,175]. Default is 128.\n\n"); + fprintf(stderr, " \t * For BDZ it is used to determine the size of some precomputed rank\n"); + fprintf(stderr, " \t information and its value should be an integer in the range [3,10]. Default\n"); + fprintf(stderr, " \t is 7. The larger is this value, the more compact are the resulting functions\n"); + fprintf(stderr, " \t and the slower are them at evaluation time.\n\n"); + fprintf(stderr, " \t * For CHD and CHD_PH it is used to set the average number of keys per bucket\n"); + fprintf(stderr, " \t and its value should be an integer in the range [1,32]. Default is 4. The\n"); + fprintf(stderr, " \t larger is this value, the slower is the construction of the functions.\n"); + fprintf(stderr, " \t This parameter has no effect for other algorithms.\n\n"); + fprintf(stderr, " -t\t set the number of keys per bin for a t-perfect hashing function. A t-perfect\n"); + fprintf(stderr, " \t hash function allows at most t collisions in a given bin. This parameter applies\n"); + fprintf(stderr, " \t only to the CHD and CHD_PH algorithms. Its value should be an integer in the\n"); + fprintf(stderr, " \t range [1,128]. Defaul is 1\n"); + fprintf(stderr, " keysfile\t line separated file with keys\n"); +} + +int main(int argc, char **argv) +{ + cmph_uint32 verbosity = 0; + char generate = 0; + char *mphf_file = NULL; + FILE *mphf_fd = stdout; + const char *keys_file = NULL; + FILE *keys_fd; + cmph_uint32 nkeys = UINT_MAX; + cmph_uint32 seed = UINT_MAX; + CMPH_HASH *hashes = NULL; + cmph_uint32 nhashes = 0; + cmph_uint32 i; + CMPH_ALGO mph_algo = CMPH_CHM; + double c = 0; + cmph_config_t *config = NULL; + cmph_t *mphf = NULL; + char * tmp_dir = NULL; + cmph_io_adapter_t *source; + cmph_uint32 memory_availability = 0; + cmph_uint32 b = 0; + cmph_uint32 keys_per_bin = 1; + while (1) + { + char ch = (char)getopt(argc, argv, "hVvgc:k:a:M:b:t:f:m:d:s:"); + if (ch == -1) break; + switch (ch) + { + case 's': + { + char *cptr; + seed = (cmph_uint32)strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid seed %s\n", optarg); + exit(1); + } + } + break; + case 'c': + { + char *endptr; + c = strtod(optarg, &endptr); + if(*endptr != 0) { + fprintf(stderr, "Invalid c value %s\n", optarg); + exit(1); + } + } + break; + case 'g': + generate = 1; + break; + case 'k': + { + char *endptr; + nkeys = (cmph_uint32)strtoul(optarg, &endptr, 10); + if(*endptr != 0) { + fprintf(stderr, "Invalid number of keys %s\n", optarg); + exit(1); + } + } + break; + case 'm': + mphf_file = strdup(optarg); + break; + case 'd': + tmp_dir = strdup(optarg); + break; + case 'M': + { + char *cptr; + memory_availability = (cmph_uint32)strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Invalid memory availability %s\n", optarg); + exit(1); + } + } + break; + case 'b': + { + char *cptr; + b = (cmph_uint32)strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter b was not found: %s\n", optarg); + exit(1); + } + } + break; + case 't': + { + char *cptr; + keys_per_bin = (cmph_uint32)strtoul(optarg, &cptr, 10); + if(*cptr != 0) { + fprintf(stderr, "Parameter t was not found: %s\n", optarg); + exit(1); + } + } + break; + case 'v': + ++verbosity; + break; + case 'V': + printf("%s\n", VERSION); + return 0; + case 'h': + usage_long(argv[0]); + return 0; + case 'a': + { + char valid = 0; + for (i = 0; i < CMPH_COUNT; ++i) + { + if (strcmp(cmph_names[i], optarg) == 0) + { + mph_algo = i; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid mph algorithm: %s. It is not available in version %s\n", optarg, VERSION); + return -1; + } + } + break; + case 'f': + { + char valid = 0; + for (i = 0; i < CMPH_HASH_COUNT; ++i) + { + if (strcmp(cmph_hash_names[i], optarg) == 0) + { + hashes = (CMPH_HASH *)realloc(hashes, sizeof(CMPH_HASH) * ( nhashes + 2 )); + hashes[nhashes] = i; + hashes[nhashes + 1] = CMPH_HASH_COUNT; + ++nhashes; + valid = 1; + break; + } + } + if (!valid) + { + fprintf(stderr, "Invalid hash function: %s\n", optarg); + return -1; + } + } + break; + default: + usage(argv[0]); + return 1; + } + } + + if (optind != argc - 1) + { + usage(argv[0]); + return 1; + } + keys_file = argv[optind]; + + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); + srand(seed); + int ret = 0; + if (mphf_file == NULL) + { + mphf_file = (char *)malloc(strlen(keys_file) + 5); + memcpy(mphf_file, keys_file, strlen(keys_file)); + memcpy(mphf_file + strlen(keys_file), ".mph\0", (size_t)5); + } + + keys_fd = fopen(keys_file, "r"); + + if (keys_fd == NULL) + { + fprintf(stderr, "Unable to open file %s: %s\n", keys_file, strerror(errno)); + return -1; + } + + if (seed == UINT_MAX) seed = (cmph_uint32)time(NULL); + if(nkeys == UINT_MAX) source = cmph_io_nlfile_adapter(keys_fd); + else source = cmph_io_nlnkfile_adapter(keys_fd, nkeys); + if (generate) + { + //Create mphf + mphf_fd = fopen(mphf_file, "w"); + config = cmph_config_new(source); + cmph_config_set_algo(config, mph_algo); + if (nhashes) cmph_config_set_hashfuncs(config, hashes); + cmph_config_set_verbosity(config, verbosity); + cmph_config_set_tmp_dir(config, (cmph_uint8 *) tmp_dir); + cmph_config_set_mphf_fd(config, mphf_fd); + cmph_config_set_memory_availability(config, memory_availability); + cmph_config_set_b(config, b); + cmph_config_set_keys_per_bin(config, keys_per_bin); + + //if((mph_algo == CMPH_BMZ || mph_algo == CMPH_BRZ) && c >= 2.0) c=1.15; + if(mph_algo == CMPH_BMZ && c >= 2.0) c=1.15; + if (c != 0) cmph_config_set_graphsize(config, c); + mphf = cmph_new(config); + + cmph_config_destroy(config); + if (mphf == NULL) + { + fprintf(stderr, "Unable to create minimum perfect hashing function\n"); + //cmph_config_destroy(config); + free(mphf_file); + return -1; + } + + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open output file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + cmph_dump(mphf, mphf_fd); + cmph_destroy(mphf); + fclose(mphf_fd); + } + else + { + cmph_uint8 * hashtable = NULL; + mphf_fd = fopen(mphf_file, "r"); + if (mphf_fd == NULL) + { + fprintf(stderr, "Unable to open input file %s: %s\n", mphf_file, strerror(errno)); + free(mphf_file); + return -1; + } + mphf = cmph_load(mphf_fd); + fclose(mphf_fd); + if (!mphf) + { + fprintf(stderr, "Unable to parser input file %s\n", mphf_file); + free(mphf_file); + return -1; + } + cmph_uint32 siz = cmph_size(mphf); + hashtable = (cmph_uint8*)calloc(siz, sizeof(cmph_uint8)); + memset(hashtable, 0,(size_t) siz); + //check all keys + for (i = 0; i < source->nkeys; ++i) + { + cmph_uint32 h; + char *buf; + cmph_uint32 buflen = 0; + source->read(source->data, &buf, &buflen); + h = cmph_search(mphf, buf, buflen); + if (!(h < siz)) + { + fprintf(stderr, "Unknown key %*s in the input.\n", buflen, buf); + ret = 1; + } else if(hashtable[h] >= keys_per_bin) + { + fprintf(stderr, "More than %u keys were mapped to bin %u\n", keys_per_bin, h); + fprintf(stderr, "Duplicated or unknown key %*s in the input\n", buflen, buf); + ret = 1; + } else hashtable[h]++; + + if (verbosity) + { + printf("%s -> %u\n", buf, h); + } + source->dispose(source->data, buf, buflen); + } + + cmph_destroy(mphf); + free(hashtable); + } + fclose(keys_fd); + free(mphf_file); + free(tmp_dir); + cmph_io_nlfile_adapter_destroy(source); + return ret; + +} diff --git a/girepository/cmph/meson.build b/girepository/cmph/meson.build new file mode 100644 index 0000000..88f977b --- /dev/null +++ b/girepository/cmph/meson.build @@ -0,0 +1,67 @@ +cmph_sources = [ + 'bdz.c', + 'bdz_ph.c', + 'bmz8.c', + 'bmz.c', + 'brz.c', + 'buffer_entry.c', + 'buffer_manager.c', + 'chd.c', + 'chd_ph.c', + 'chm.c', + 'cmph.c', + 'cmph_structs.c', + 'compressed_rank.c', + 'compressed_seq.c', + 'fch_buckets.c', + 'fch.c', + 'graph.c', + 'hash.c', + 'jenkins_hash.c', + 'miller_rabin.c', + 'select.c', + 'vqueue.c', + 'vstack.c', +] + +cmph_deps = [ + libglib_dep, + libgobject_dep, + libm, +] + +custom_c_args = [] + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-implicit-fallthrough', + '-Wno-old-style-definition', + '-Wno-suggest-attribute=noreturn', + '-Wno-type-limits', + '-Wno-undef', + '-Wno-unused-parameter', + '-Wno-cast-align', + '-Wno-unused-function', + '-Wno-return-type', + '-Wno-sometimes-uninitialized', + ]) +endif + +cmph = static_library('cmph', + sources: cmph_sources, + c_args: custom_c_args, + dependencies: cmph_deps, + gnu_symbol_visibility : 'hidden', +) + +cmph_dep = declare_dependency( + link_with: cmph, + include_directories: include_directories('.'), +) + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-old-style-definition', + '-Wno-type-limits', + ]) +endif diff --git a/girepository/cmph/miller_rabin.c b/girepository/cmph/miller_rabin.c new file mode 100644 index 0000000..17d0ed3 --- /dev/null +++ b/girepository/cmph/miller_rabin.c @@ -0,0 +1,67 @@ +#include "miller_rabin.h" + +static inline cmph_uint64 int_pow(cmph_uint64 a, cmph_uint64 d, cmph_uint64 n) +{ + cmph_uint64 a_pow = a; + cmph_uint64 res = 1; + while(d > 0) + { + if((d & 1) == 1) + res =(((cmph_uint64)res) * a_pow) % n; + a_pow = (((cmph_uint64)a_pow) * a_pow) % n; + d /= 2; + }; + return res; +}; + +static inline cmph_uint8 check_witness(cmph_uint64 a_exp_d, cmph_uint64 n, cmph_uint64 s) +{ + cmph_uint64 i; + cmph_uint64 a_exp = a_exp_d; + if(a_exp == 1 || a_exp == (n - 1)) + return 1; + for(i = 1; i < s; i++) + { + a_exp = (((cmph_uint64)a_exp) * a_exp) % n; + if(a_exp == (n - 1)) + return 1; + }; + return 0; +}; + +cmph_uint8 check_primality(cmph_uint64 n) +{ + cmph_uint64 a, d, s, a_exp_d; + if((n % 2) == 0) + return 0; + if((n % 3) == 0) + return 0; + if((n % 5) == 0) + return 0; + if((n % 7 ) == 0) + return 0; + //we decompoe the number n - 1 into 2^s*d + s = 0; + d = n - 1; + do + { + s++; + d /= 2; + }while((d % 2) == 0); + + a = 2; + a_exp_d = int_pow(a, d, n); + if(check_witness(a_exp_d, n, s) == 0) + return 0; + a = 7; + a_exp_d = int_pow(a, d, n); + if(check_witness(a_exp_d, n, s) == 0) + return 0; + a = 61; + a_exp_d = int_pow(a, d, n); + if(check_witness(a_exp_d, n, s) == 0) + return 0; + return 1; +}; + + diff --git a/girepository/cmph/miller_rabin.h b/girepository/cmph/miller_rabin.h new file mode 100644 index 0000000..42dc6ce --- /dev/null +++ b/girepository/cmph/miller_rabin.h @@ -0,0 +1,5 @@ +#ifndef _CMPH_MILLER_RABIN_H__ +#define _CMPH_MILLER_RABIN_H__ +#include "cmph_types.h" +cmph_uint8 check_primality(cmph_uint64 n); +#endif diff --git a/girepository/cmph/sdbm_hash.c b/girepository/cmph/sdbm_hash.c new file mode 100644 index 0000000..2f706c9 --- /dev/null +++ b/girepository/cmph/sdbm_hash.c @@ -0,0 +1,49 @@ +#include "sdbm_hash.h" +#include + +sdbm_state_t *sdbm_state_new() +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; + return state; +} + +void sdbm_state_destroy(sdbm_state_t *state) +{ + free(state); +} + +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen) +{ + register cmph_uint32 hash = 0; + const unsigned char *ptr = (unsigned char *)k; + cmph_uint32 i = 0; + + while(i < keylen) { + hash = *ptr + (hash << 6) + (hash << 16) - hash; + ++ptr, ++i; + } + return hash; +} + + +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen) +{ + *buf = NULL; + *buflen = 0; + return; +} + +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state) +{ + sdbm_state_t *dest_state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + dest_state->hashfunc = src_state->hashfunc; + return dest_state; +} + +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen) +{ + sdbm_state_t *state = (sdbm_state_t *)malloc(sizeof(sdbm_state_t)); + state->hashfunc = CMPH_HASH_SDBM; + return state; +} diff --git a/girepository/cmph/sdbm_hash.h b/girepository/cmph/sdbm_hash.h new file mode 100644 index 0000000..f44b2f1 --- /dev/null +++ b/girepository/cmph/sdbm_hash.h @@ -0,0 +1,18 @@ +#ifndef __SDBM_HASH_H__ +#define __SDBM_HASH_H__ + +#include "hash.h" + +typedef struct __sdbm_state_t +{ + CMPH_HASH hashfunc; +} sdbm_state_t; + +sdbm_state_t *sdbm_state_new(); +cmph_uint32 sdbm_hash(sdbm_state_t *state, const char *k, cmph_uint32 keylen); +void sdbm_state_dump(sdbm_state_t *state, char **buf, cmph_uint32 *buflen); +sdbm_state_t *sdbm_state_copy(sdbm_state_t *src_state); +sdbm_state_t *sdbm_state_load(const char *buf, cmph_uint32 buflen); +void sdbm_state_destroy(sdbm_state_t *state); + +#endif diff --git a/girepository/cmph/select.c b/girepository/cmph/select.c new file mode 100644 index 0000000..fec4b7a --- /dev/null +++ b/girepository/cmph/select.c @@ -0,0 +1,337 @@ +#include +#include +#include +#include +#include +#include "select_lookup_tables.h" +#include "select.h" + +//#define DEBUG +#include "debug.h" + +#ifndef STEP_SELECT_TABLE +#define STEP_SELECT_TABLE 128 +#endif + +#ifndef NBITS_STEP_SELECT_TABLE +#define NBITS_STEP_SELECT_TABLE 7 +#endif + +#ifndef MASK_STEP_SELECT_TABLE +#define MASK_STEP_SELECT_TABLE 0x7f // 0x7f = 127 +#endif + +static inline void select_insert_0(cmph_uint32 * buffer) +{ + (*buffer) >>= 1; +}; + +static inline void select_insert_1(cmph_uint32 * buffer) +{ + (*buffer) >>= 1; + (*buffer) |= 0x80000000; +}; + +void select_init(select_t * sel) +{ + sel->n = 0; + sel->m = 0; + sel->bits_vec = 0; + sel->select_table = 0; +}; + +cmph_uint32 select_get_space_usage(select_t * sel) +{ + register cmph_uint32 nbits; + register cmph_uint32 vec_size; + register cmph_uint32 sel_table_size; + register cmph_uint32 space_usage; + + nbits = sel->n + sel->m; + vec_size = (nbits + 31) >> 5; + sel_table_size = (sel->n >> NBITS_STEP_SELECT_TABLE) + 1; // (sel->n >> NBITS_STEP_SELECT_TABLE) = (sel->n/STEP_SELECT_TABLE) + + space_usage = 2 * sizeof(cmph_uint32) * 8; // n and m + space_usage += vec_size * (cmph_uint32) sizeof(cmph_uint32) * 8; + space_usage += sel_table_size * (cmph_uint32)sizeof(cmph_uint32) * 8; + return space_usage; +} + +void select_destroy(select_t * sel) +{ + free(sel->bits_vec); + free(sel->select_table); + sel->bits_vec = 0; + sel->select_table = 0; +}; + +static inline void select_generate_sel_table(select_t * sel) +{ + register cmph_uint8 * bits_table = (cmph_uint8 *)sel->bits_vec; + register cmph_uint32 part_sum, old_part_sum; + register cmph_uint32 vec_idx, one_idx, sel_table_idx; + + part_sum = vec_idx = one_idx = sel_table_idx = 0; + + for(;;) + { + // FABIANO: Should'n it be one_idx >= sel->n + if(one_idx >= sel->n) + break; + do + { + old_part_sum = part_sum; + part_sum += rank_lookup_table[bits_table[vec_idx]]; + vec_idx++; + } while (part_sum <= one_idx); + + sel->select_table[sel_table_idx] = select_lookup_table[bits_table[vec_idx - 1]][one_idx - old_part_sum] + ((vec_idx - 1) << 3); // ((vec_idx - 1) << 3) = ((vec_idx - 1) * 8) + one_idx += STEP_SELECT_TABLE ; + sel_table_idx++; + }; +}; + +void select_generate(select_t * sel, cmph_uint32 * keys_vec, cmph_uint32 n, cmph_uint32 m) +{ + register cmph_uint32 i, j, idx; + cmph_uint32 buffer = 0; + + register cmph_uint32 nbits; + register cmph_uint32 vec_size; + register cmph_uint32 sel_table_size; + sel->n = n; + sel->m = m; // n values in the range [0,m-1] + + nbits = sel->n + sel->m; + vec_size = (nbits + 31) >> 5; // (nbits + 31) >> 5 = (nbits + 31)/32 + + sel_table_size = (sel->n >> NBITS_STEP_SELECT_TABLE) + 1; // (sel->n >> NBITS_STEP_SELECT_TABLE) = (sel->n/STEP_SELECT_TABLE) + + if(sel->bits_vec) + { + free(sel->bits_vec); + } + sel->bits_vec = (cmph_uint32 *)calloc(vec_size, sizeof(cmph_uint32)); + + if(sel->select_table) + { + free(sel->select_table); + } + sel->select_table = (cmph_uint32 *)calloc(sel_table_size, sizeof(cmph_uint32)); + + + + idx = i = j = 0; + + for(;;) + { + while(keys_vec[j]==i) + { + select_insert_1(&buffer); + idx++; + + if((idx & 0x1f) == 0 ) // (idx & 0x1f) = idx % 32 + sel->bits_vec[(idx >> 5) - 1] = buffer; // (idx >> 5) = idx/32 + j++; + + if(j == sel->n) + goto loop_end; + + //assert(keys_vec[j] < keys_vec[j-1]); + } + + if(i == sel->m) + break; + + while(keys_vec[j] > i) + { + select_insert_0(&buffer); + idx++; + + if((idx & 0x1f) == 0 ) // (idx & 0x1f) = idx % 32 + sel->bits_vec[(idx >> 5) - 1] = buffer; // (idx >> 5) = idx/32 + i++; + }; + + }; + loop_end: + if((idx & 0x1f) != 0 ) // (idx & 0x1f) = idx % 32 + { + buffer >>= 32 - (idx & 0x1f); + sel->bits_vec[ (idx - 1) >> 5 ] = buffer; + }; + + select_generate_sel_table(sel); +}; + +static inline cmph_uint32 _select_query(cmph_uint8 * bits_table, cmph_uint32 * select_table, cmph_uint32 one_idx) +{ + register cmph_uint32 vec_bit_idx ,vec_byte_idx; + register cmph_uint32 part_sum, old_part_sum; + + vec_bit_idx = select_table[one_idx >> NBITS_STEP_SELECT_TABLE]; // one_idx >> NBITS_STEP_SELECT_TABLE = one_idx/STEP_SELECT_TABLE + vec_byte_idx = vec_bit_idx >> 3; // vec_bit_idx / 8 + + one_idx &= MASK_STEP_SELECT_TABLE; // one_idx %= STEP_SELECT_TABLE == one_idx &= MASK_STEP_SELECT_TABLE + one_idx += rank_lookup_table[bits_table[vec_byte_idx] & ((1 << (vec_bit_idx & 0x7)) - 1)]; + part_sum = 0; + + do + { + old_part_sum = part_sum; + part_sum += rank_lookup_table[bits_table[vec_byte_idx]]; + vec_byte_idx++; + + }while (part_sum <= one_idx); + + return select_lookup_table[bits_table[vec_byte_idx - 1]][one_idx - old_part_sum] + ((vec_byte_idx-1) << 3); +} + +cmph_uint32 select_query(select_t * sel, cmph_uint32 one_idx) +{ + return _select_query((cmph_uint8 *)sel->bits_vec, sel->select_table, one_idx); +}; + + +static inline cmph_uint32 _select_next_query(cmph_uint8 * bits_table, cmph_uint32 vec_bit_idx) +{ + register cmph_uint32 vec_byte_idx, one_idx; + register cmph_uint32 part_sum, old_part_sum; + + vec_byte_idx = vec_bit_idx >> 3; + + one_idx = rank_lookup_table[bits_table[vec_byte_idx] & ((1U << (vec_bit_idx & 0x7)) - 1U)] + 1U; + part_sum = 0; + + do + { + old_part_sum = part_sum; + part_sum += rank_lookup_table[bits_table[vec_byte_idx]]; + vec_byte_idx++; + + }while (part_sum <= one_idx); + + return select_lookup_table[bits_table[(vec_byte_idx - 1)]][(one_idx - old_part_sum)] + ((vec_byte_idx - 1) << 3); +} + +cmph_uint32 select_next_query(select_t * sel, cmph_uint32 vec_bit_idx) +{ + return _select_next_query((cmph_uint8 *)sel->bits_vec, vec_bit_idx); +}; + +void select_dump(select_t *sel, char **buf, cmph_uint32 *buflen) +{ + register cmph_uint32 nbits = sel->n + sel->m; + register cmph_uint32 vec_size = ((nbits + 31) >> 5) * (cmph_uint32)sizeof(cmph_uint32); // (nbits + 31) >> 5 = (nbits + 31)/32 + register cmph_uint32 sel_table_size = ((sel->n >> NBITS_STEP_SELECT_TABLE) + 1) * (cmph_uint32)sizeof(cmph_uint32); // (sel->n >> NBITS_STEP_SELECT_TABLE) = (sel->n/STEP_SELECT_TABLE) + register cmph_uint32 pos = 0; + + *buflen = 2*(cmph_uint32)sizeof(cmph_uint32) + vec_size + sel_table_size; + + *buf = (char *)calloc(*buflen, sizeof(char)); + + if (!*buf) + { + *buflen = UINT_MAX; + return; + } + + memcpy(*buf, &(sel->n), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + memcpy(*buf + pos, &(sel->m), sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + memcpy(*buf + pos, sel->bits_vec, vec_size); + pos += vec_size; + memcpy(*buf + pos, sel->select_table, sel_table_size); + + DEBUGP("Dumped select structure with size %u bytes\n", *buflen); +} + +void select_load(select_t * sel, const char *buf, cmph_uint32 buflen) +{ + register cmph_uint32 pos = 0; + register cmph_uint32 nbits = 0; + register cmph_uint32 vec_size = 0; + register cmph_uint32 sel_table_size = 0; + + memcpy(&(sel->n), buf, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + memcpy(&(sel->m), buf + pos, sizeof(cmph_uint32)); + pos += (cmph_uint32)sizeof(cmph_uint32); + + nbits = sel->n + sel->m; + vec_size = ((nbits + 31) >> 5) * (cmph_uint32)sizeof(cmph_uint32); // (nbits + 31) >> 5 = (nbits + 31)/32 + sel_table_size = ((sel->n >> NBITS_STEP_SELECT_TABLE) + 1) * (cmph_uint32)sizeof(cmph_uint32); // (sel->n >> NBITS_STEP_SELECT_TABLE) = (sel->n/STEP_SELECT_TABLE) + + if(sel->bits_vec) + { + free(sel->bits_vec); + } + sel->bits_vec = (cmph_uint32 *)calloc(vec_size/sizeof(cmph_uint32), sizeof(cmph_uint32)); + + if(sel->select_table) + { + free(sel->select_table); + } + sel->select_table = (cmph_uint32 *)calloc(sel_table_size/sizeof(cmph_uint32), sizeof(cmph_uint32)); + + memcpy(sel->bits_vec, buf + pos, vec_size); + pos += vec_size; + memcpy(sel->select_table, buf + pos, sel_table_size); + + DEBUGP("Loaded select structure with size %u bytes\n", buflen); +} + + +/** \fn void select_pack(select_t *sel, void *sel_packed); + * \brief Support the ability to pack a select structure function into a preallocated contiguous memory space pointed by sel_packed. + * \param sel points to the select structure + * \param sel_packed pointer to the contiguous memory area used to store the select structure. The size of sel_packed must be at least @see select_packed_size + */ +void select_pack(select_t *sel, void *sel_packed) +{ + if (sel && sel_packed) + { + char *buf = NULL; + cmph_uint32 buflen = 0; + select_dump(sel, &buf, &buflen); + memcpy(sel_packed, buf, buflen); + free(buf); + } +} + + +/** \fn cmph_uint32 select_packed_size(select_t *sel); + * \brief Return the amount of space needed to pack a select structure. + * \return the size of the packed select structure or zero for failures + */ +cmph_uint32 select_packed_size(select_t *sel) +{ + register cmph_uint32 nbits = sel->n + sel->m; + register cmph_uint32 vec_size = ((nbits + 31) >> 5) * (cmph_uint32)sizeof(cmph_uint32); // (nbits + 31) >> 5 = (nbits + 31)/32 + register cmph_uint32 sel_table_size = ((sel->n >> NBITS_STEP_SELECT_TABLE) + 1) * (cmph_uint32)sizeof(cmph_uint32); // (sel->n >> NBITS_STEP_SELECT_TABLE) = (sel->n/STEP_SELECT_TABLE) + return 2*(cmph_uint32)sizeof(cmph_uint32) + vec_size + sel_table_size; +} + + + +cmph_uint32 select_query_packed(void * sel_packed, cmph_uint32 one_idx) +{ + register cmph_uint32 *ptr = (cmph_uint32 *)sel_packed; + register cmph_uint32 n = *ptr++; + register cmph_uint32 m = *ptr++; + register cmph_uint32 nbits = n + m; + register cmph_uint32 vec_size = (nbits + 31) >> 5; // (nbits + 31) >> 5 = (nbits + 31)/32 + register cmph_uint8 * bits_vec = (cmph_uint8 *)ptr; + register cmph_uint32 * select_table = ptr + vec_size; + + return _select_query(bits_vec, select_table, one_idx); +} + + +cmph_uint32 select_next_query_packed(void * sel_packed, cmph_uint32 vec_bit_idx) +{ + register cmph_uint8 * bits_vec = (cmph_uint8 *)sel_packed; + bits_vec += 8; // skipping n and m + return _select_next_query(bits_vec, vec_bit_idx); +} diff --git a/girepository/cmph/select.h b/girepository/cmph/select.h new file mode 100644 index 0000000..a31eb0f --- /dev/null +++ b/girepository/cmph/select.h @@ -0,0 +1,61 @@ +#ifndef __CMPH_SELECT_H__ +#define __CMPH_SELECT_H__ + +#include "cmph_types.h" + +struct _select_t +{ + cmph_uint32 n,m; + cmph_uint32 * bits_vec; + cmph_uint32 * select_table; +}; + +typedef struct _select_t select_t; + +void select_init(select_t * sel); + +void select_destroy(select_t * sel); + +void select_generate(select_t * sel, cmph_uint32 * keys_vec, cmph_uint32 n, cmph_uint32 m); + +cmph_uint32 select_query(select_t * sel, cmph_uint32 one_idx); + +cmph_uint32 select_next_query(select_t * sel, cmph_uint32 vec_bit_idx); + +cmph_uint32 select_get_space_usage(select_t * sel); + +void select_dump(select_t *sel, char **buf, cmph_uint32 *buflen); + +void select_load(select_t * sel, const char *buf, cmph_uint32 buflen); + + +/** \fn void select_pack(select_t *sel, void *sel_packed); + * \brief Support the ability to pack a select structure into a preallocated contiguous memory space pointed by sel_packed. + * \param sel points to the select structure + * \param sel_packed pointer to the contiguous memory area used to store the select structure. The size of sel_packed must be at least @see select_packed_size + */ +void select_pack(select_t *sel, void *sel_packed); + +/** \fn cmph_uint32 select_packed_size(select_t *sel); + * \brief Return the amount of space needed to pack a select structure. + * \return the size of the packed select structure or zero for failures + */ +cmph_uint32 select_packed_size(select_t *sel); + + +/** \fn cmph_uint32 select_query_packed(void * sel_packed, cmph_uint32 one_idx); + * \param sel_packed is a pointer to a contiguous memory area + * \param one_idx is the rank for which we want to calculate the inverse function select + * \return an integer that represents the select value of rank idx. + */ +cmph_uint32 select_query_packed(void * sel_packed, cmph_uint32 one_idx); + + +/** \fn cmph_uint32 select_next_query_packed(void * sel_packed, cmph_uint32 vec_bit_idx); + * \param sel_packed is a pointer to a contiguous memory area + * \param vec_bit_idx is a value prior computed by @see select_query_packed + * \return an integer that represents the next select value greater than @see vec_bit_idx. + */ +cmph_uint32 select_next_query_packed(void * sel_packed, cmph_uint32 vec_bit_idx); + +#endif diff --git a/girepository/cmph/select_lookup_tables.h b/girepository/cmph/select_lookup_tables.h new file mode 100644 index 0000000..efd595e --- /dev/null +++ b/girepository/cmph/select_lookup_tables.h @@ -0,0 +1,170 @@ +#ifndef SELECT_LOOKUP_TABLES +#define SELECT_LOOKUP_TABLES + +#include "cmph_types.h" + +/* +rank_lookup_table[i] simply gives the number of bits set to one in the byte of value i. +For example if i = 01010101 in binary then we have : +rank_lookup_table[i] = 4 +*/ + +static cmph_uint8 rank_lookup_table[256] ={ + 0 , 1 , 1 , 2 , 1 , 2 , 2 , 3 , 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 +, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 +, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 +, 1 , 2 , 2 , 3 , 2 , 3 , 3 , 4 , 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 +, 2 , 3 , 3 , 4 , 3 , 4 , 4 , 5 , 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 +, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 +, 3 , 4 , 4 , 5 , 4 , 5 , 5 , 6 , 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 +, 4 , 5 , 5 , 6 , 5 , 6 , 6 , 7 , 5 , 6 , 6 , 7 , 6 , 7 , 7 , 8 + }; + +/* +select_lookup_table[i][j] simply gives the index of the j'th bit set to one in the byte of value i. +For example if i=01010101 in binary then we have : +select_lookup_table[i][0] = 0, the first bit set to one is at position 0 +select_lookup_table[i][1] = 2, the second bit set to one is at position 2 +select_lookup_table[i][2] = 4, the third bit set to one is at position 4 +select_lookup_table[i][3] = 6, the fourth bit set to one is at position 6 +select_lookup_table[i][4] = 255, there is no more than 4 bits set to one in i, so we return escape value 255. +*/ +static cmph_uint8 select_lookup_table[256][8]={ +{ 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 255 , 255 , 255 , 255 , 255 } , +{ 3 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 3 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 255 , 255 , 255 , 255 } , +{ 4 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 255 , 255 , 255 , 255 } , +{ 3 , 4 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 255 , 255 , 255 , 255 } , +{ 2 , 3 , 4 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 255 , 255 , 255 } , +{ 5 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 255 , 255 , 255 , 255 } , +{ 3 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 255 , 255 , 255 , 255 } , +{ 2 , 3 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 255 , 255 , 255 } , +{ 4 , 5 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 255 , 255 , 255 , 255 } , +{ 2 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 255 , 255 , 255 } , +{ 3 , 4 , 5 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 255 , 255 , 255 } , +{ 2 , 3 , 4 , 5 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 5 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 255 , 255 } , +{ 6 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 6 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 6 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 6 , 255 , 255 , 255 , 255 } , +{ 3 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 6 , 255 , 255 , 255 , 255 } , +{ 2 , 3 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 6 , 255 , 255 , 255 } , +{ 4 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 6 , 255 , 255 , 255 , 255 } , +{ 2 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 6 , 255 , 255 , 255 } , +{ 3 , 4 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 6 , 255 , 255 , 255 } , +{ 2 , 3 , 4 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 6 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 6 , 255 , 255 } , +{ 5 , 6 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 6 , 255 , 255 , 255 , 255 } , +{ 2 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 6 , 255 , 255 , 255 } , +{ 3 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 6 , 255 , 255 , 255 } , +{ 2 , 3 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 6 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 6 , 255 , 255 } , +{ 4 , 5 , 6 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 6 , 255 , 255 , 255 } , +{ 2 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 6 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 6 , 255 , 255 } , +{ 3 , 4 , 5 , 6 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 6 , 255 , 255 } , +{ 2 , 3 , 4 , 5 , 6 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 6 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 5 , 6 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 255 } , +{ 7 , 255 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 2 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 7 , 255 , 255 , 255 , 255 } , +{ 3 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 7 , 255 , 255 , 255 , 255 } , +{ 2 , 3 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 7 , 255 , 255 , 255 } , +{ 4 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 7 , 255 , 255 , 255 , 255 } , +{ 2 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 7 , 255 , 255 , 255 } , +{ 3 , 4 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 7 , 255 , 255 , 255 } , +{ 2 , 3 , 4 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 7 , 255 , 255 } , +{ 5 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 7 , 255 , 255 , 255 , 255 } , +{ 2 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 7 , 255 , 255 , 255 } , +{ 3 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 7 , 255 , 255 , 255 } , +{ 2 , 3 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 7 , 255 , 255 } , +{ 4 , 5 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 7 , 255 , 255 , 255 } , +{ 2 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 7 , 255 , 255 } , +{ 3 , 4 , 5 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 7 , 255 , 255 } , +{ 2 , 3 , 4 , 5 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 7 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 5 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 7 , 255 } , +{ 6 , 7 , 255 , 255 , 255 , 255 , 255 , 255 } , { 0 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , +{ 1 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 1 , 6 , 7 , 255 , 255 , 255 , 255 } , +{ 2 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 2 , 6 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 2 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 2 , 6 , 7 , 255 , 255 , 255 } , +{ 3 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 3 , 6 , 7 , 255 , 255 , 255 } , +{ 2 , 3 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 3 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 3 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 3 , 6 , 7 , 255 , 255 } , +{ 4 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 4 , 6 , 7 , 255 , 255 , 255 } , +{ 2 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 4 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 4 , 6 , 7 , 255 , 255 } , +{ 3 , 4 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 4 , 6 , 7 , 255 , 255 } , +{ 2 , 3 , 4 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 4 , 6 , 7 , 255 , 255 } , +{ 1 , 2 , 3 , 4 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 4 , 6 , 7 , 255 } , +{ 5 , 6 , 7 , 255 , 255 , 255 , 255 , 255 } , { 0 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , +{ 1 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 1 , 5 , 6 , 7 , 255 , 255 , 255 } , +{ 2 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 2 , 5 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 2 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 2 , 5 , 6 , 7 , 255 , 255 } , +{ 3 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 3 , 5 , 6 , 7 , 255 , 255 } , +{ 2 , 3 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 3 , 5 , 6 , 7 , 255 , 255 } , +{ 1 , 2 , 3 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 3 , 5 , 6 , 7 , 255 } , +{ 4 , 5 , 6 , 7 , 255 , 255 , 255 , 255 } , { 0 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , +{ 1 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 1 , 4 , 5 , 6 , 7 , 255 , 255 } , +{ 2 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 2 , 4 , 5 , 6 , 7 , 255 , 255 } , +{ 1 , 2 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 2 , 4 , 5 , 6 , 7 , 255 } , +{ 3 , 4 , 5 , 6 , 7 , 255 , 255 , 255 } , { 0 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , +{ 1 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 1 , 3 , 4 , 5 , 6 , 7 , 255 } , +{ 2 , 3 , 4 , 5 , 6 , 7 , 255 , 255 } , { 0 , 2 , 3 , 4 , 5 , 6 , 7 , 255 } , +{ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 255 } , { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 } }; + +#endif diff --git a/girepository/cmph/vqueue.c b/girepository/cmph/vqueue.c new file mode 100644 index 0000000..0619dd7 --- /dev/null +++ b/girepository/cmph/vqueue.c @@ -0,0 +1,51 @@ +#include "vqueue.h" +#include +#include +#include +struct __vqueue_t +{ + cmph_uint32 * values; + cmph_uint32 beg, end, capacity; +}; + +vqueue_t * vqueue_new(cmph_uint32 capacity) +{ + size_t capacity_plus_one = capacity + 1; + vqueue_t *q = (vqueue_t *)malloc(sizeof(vqueue_t)); + assert(q); + q->values = (cmph_uint32 *)calloc(capacity_plus_one, sizeof(cmph_uint32)); + q->beg = q->end = 0; + q->capacity = (cmph_uint32) capacity_plus_one; + return q; +} + +cmph_uint8 vqueue_is_empty(vqueue_t * q) +{ + return (cmph_uint8)(q->beg == q->end); +} + +void vqueue_insert(vqueue_t * q, cmph_uint32 val) +{ + assert((q->end + 1)%q->capacity != q->beg); // Is queue full? + q->end = (q->end + 1)%q->capacity; + q->values[q->end] = val; +} + +cmph_uint32 vqueue_remove(vqueue_t * q) +{ + assert(!vqueue_is_empty(q)); // Is queue empty? + q->beg = (q->beg + 1)%q->capacity; + return q->values[q->beg]; +} + +void vqueue_print(vqueue_t * q) +{ + cmph_uint32 i; + for (i = q->beg; i != q->end; i = (i + 1)%q->capacity) + fprintf(stderr, "%u\n", q->values[(i + 1)%q->capacity]); +} + +void vqueue_destroy(vqueue_t *q) +{ + free(q->values); q->values = NULL; free(q); +} diff --git a/girepository/cmph/vqueue.h b/girepository/cmph/vqueue.h new file mode 100644 index 0000000..86fccab --- /dev/null +++ b/girepository/cmph/vqueue.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VQUEUE_H__ +#define __CMPH_VQUEUE_H__ + +#include "cmph_types.h" +typedef struct __vqueue_t vqueue_t; + +vqueue_t * vqueue_new(cmph_uint32 capacity); + +cmph_uint8 vqueue_is_empty(vqueue_t * q); + +void vqueue_insert(vqueue_t * q, cmph_uint32 val); + +cmph_uint32 vqueue_remove(vqueue_t * q); + +void vqueue_print(vqueue_t * q); + +void vqueue_destroy(vqueue_t * q); +#endif diff --git a/girepository/cmph/vstack.c b/girepository/cmph/vstack.c new file mode 100644 index 0000000..96f5380 --- /dev/null +++ b/girepository/cmph/vstack.c @@ -0,0 +1,79 @@ +#include "vstack.h" + +#include +#include + +//#define DEBUG +#include "debug.h" + +struct __vstack_t +{ + cmph_uint32 pointer; + cmph_uint32 *values; + cmph_uint32 capacity; +}; + +vstack_t *vstack_new(void) +{ + vstack_t *stack = (vstack_t *)malloc(sizeof(vstack_t)); + assert(stack); + stack->pointer = 0; + stack->values = NULL; + stack->capacity = 0; + return stack; +} + +void vstack_destroy(vstack_t *stack) +{ + assert(stack); + free(stack->values); + free(stack); +} + +void vstack_push(vstack_t *stack, cmph_uint32 val) +{ + assert(stack); + vstack_reserve(stack, stack->pointer + 1); + stack->values[stack->pointer] = val; + ++(stack->pointer); +} +void vstack_pop(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + --(stack->pointer); +} + +cmph_uint32 vstack_top(vstack_t *stack) +{ + assert(stack); + assert(stack->pointer > 0); + return stack->values[(stack->pointer - 1)]; +} +int vstack_empty(vstack_t *stack) +{ + assert(stack); + return stack->pointer == 0; +} +cmph_uint32 vstack_size(vstack_t *stack) +{ + return stack->pointer; +} +void vstack_reserve(vstack_t *stack, cmph_uint32 size) +{ + assert(stack); + if (stack->capacity < size) + { + cmph_uint32 new_capacity = stack->capacity + 1; + DEBUGP("Increasing current capacity %u to %u\n", stack->capacity, size); + while (new_capacity < size) + { + new_capacity *= 2; + } + stack->values = (cmph_uint32 *)realloc(stack->values, sizeof(cmph_uint32)*new_capacity); + assert(stack->values); + stack->capacity = new_capacity; + DEBUGP("Increased\n"); + } +} + diff --git a/girepository/cmph/vstack.h b/girepository/cmph/vstack.h new file mode 100644 index 0000000..fecc7d5 --- /dev/null +++ b/girepository/cmph/vstack.h @@ -0,0 +1,18 @@ +#ifndef __CMPH_VSTACK_H__ +#define __CMPH_VSTACK_H__ + +#include "cmph_types.h" +typedef struct __vstack_t vstack_t; + +vstack_t *vstack_new(void); +void vstack_destroy(vstack_t *stack); + +void vstack_push(vstack_t *stack, cmph_uint32 val); +cmph_uint32 vstack_top(vstack_t *stack); +void vstack_pop(vstack_t *stack); +int vstack_empty(vstack_t *stack); +cmph_uint32 vstack_size(vstack_t *stack); + +void vstack_reserve(vstack_t *stack, cmph_uint32 size); + +#endif diff --git a/girepository/cmph/wingetopt.c b/girepository/cmph/wingetopt.c new file mode 100644 index 0000000..c981d0f --- /dev/null +++ b/girepository/cmph/wingetopt.c @@ -0,0 +1,179 @@ +#ifdef WIN32 +/***************************************************************************** + * + * MODULE NAME : GETOPT.C + * + * COPYRIGHTS: + * This module contains code made available by IBM + * Corporation on an AS IS basis. Any one receiving the + * module is considered to be licensed under IBM copyrights + * to use the IBM-provided source code in any way he or she + * deems fit, including copying it, compiling it, modifying + * it, and redistributing it, with or without + * modifications. No license under any IBM patents or + * patent applications is to be implied from this copyright + * license. + * + * A user of the module should understand that IBM cannot + * provide technical support for the module and will not be + * responsible for any consequences of use of the program. + * + * Any notices, including this one, are not to be removed + * from the module without the prior written consent of + * IBM. + * + * AUTHOR: Original author: + * G. R. Blair (BOBBLAIR at AUSVM1) + * Internet: bobblair@bobblair.austin.ibm.com + * + * Extensively revised by: + * John Q. Walker II, Ph.D. (JOHHQ at RALVM6) + * Internet: johnq@ralvm6.vnet.ibm.com + * + *****************************************************************************/ + +/****************************************************************************** + * getopt() + * + * The getopt() function is a command line parser. It returns the next + * option character in argv that matches an option character in opstring. + * + * The argv argument points to an array of argc+1 elements containing argc + * pointers to character strings followed by a null pointer. + * + * The opstring argument points to a string of option characters; if an + * option character is followed by a colon, the option is expected to have + * an argument that may or may not be separated from it by white space. + * The external variable optarg is set to point to the start of the option + * argument on return from getopt(). + * + * The getopt() function places in optind the argv index of the next argument + * to be processed. The system initializes the external variable optind to + * 1 before the first call to getopt(). + * + * When all options have been processed (that is, up to the first nonoption + * argument), getopt() returns EOF. The special option "--" may be used to + * delimit the end of the options; EOF will be returned, and "--" will be + * skipped. + * + * The getopt() function returns a question mark (?) when it encounters an + * option character not included in opstring. This error message can be + * disabled by setting opterr to zero. Otherwise, it returns the option + * character that was detected. + * + * If the special option "--" is detected, or all options have been + * processed, EOF is returned. + * + * Options are marked by either a minus sign (-) or a slash (/). + * + * No errors are defined. + *****************************************************************************/ + +#include /* for EOF */ +#include /* for strchr() */ + +/* static (global) variables that are specified as exported by getopt() */ +extern char *optarg; /* pointer to the start of the option argument */ +extern int optind; /* number of the next argv[] to be evaluated */ +extern int opterr; /* non-zero if a question mark should be returned + when a non-valid option character is detected */ + +/* handle possible future character set concerns by putting this in a macro */ +#define _next_char(string) (char)(*(string+1)) + +int getopt(int argc, char *argv[], char *opstring) +{ + static char *pIndexPosition = NULL; /* place inside current argv string */ + char *pArgString = NULL; /* where to start from next */ + char *pOptString; /* the string in our program */ + + + if (pIndexPosition != NULL) { + /* we last left off inside an argv string */ + if (*(++pIndexPosition)) { + /* there is more to come in the most recent argv */ + pArgString = pIndexPosition; + } + } + + if (pArgString == NULL) { + /* we didn't leave off in the middle of an argv string */ + if (optind >= argc) { + /* more command-line arguments than the argument count */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all command-line arguments */ + } + + /*--------------------------------------------------------------------- + * If the next argv[] is not an option, there can be no more options. + *-------------------------------------------------------------------*/ + pArgString = argv[optind++]; /* set this to the next argument ptr */ + + if (('/' != *pArgString) && /* doesn't start with a slash or a dash? */ + ('-' != *pArgString)) { + --optind; /* point to current arg once we're done */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* used up all the command-line flags */ + } + + /* check for special end-of-flags markers */ + if ((strcmp(pArgString, "-") == 0) || + (strcmp(pArgString, "--") == 0)) { + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return EOF; /* encountered the special flag */ + } + + pArgString++; /* look past the / or - */ + } + + if (':' == *pArgString) { /* is it a colon? */ + /*--------------------------------------------------------------------- + * Rare case: if opterr is non-zero, return a question mark; + * otherwise, just return the colon we're on. + *-------------------------------------------------------------------*/ + return (opterr ? (int)'?' : (int)':'); + } + else if ((pOptString = strchr(opstring, *pArgString)) == 0) { + /*--------------------------------------------------------------------- + * The letter on the command-line wasn't any good. + *-------------------------------------------------------------------*/ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = NULL; /* not in the middle of anything */ + return (opterr ? (int)'?' : (int)*pArgString); + } + else { + /*--------------------------------------------------------------------- + * The letter on the command-line matches one we expect to see + *-------------------------------------------------------------------*/ + if (':' == _next_char(pOptString)) { /* is the next letter a colon? */ + /* It is a colon. Look for an argument string. */ + if ('\0' != _next_char(pArgString)) { /* argument in this argv? */ + optarg = &pArgString[1]; /* Yes, it is */ + } + else { + /*------------------------------------------------------------- + * The argument string must be in the next argv. + * But, what if there is none (bad input from the user)? + * In that case, return the letter, and optarg as NULL. + *-----------------------------------------------------------*/ + if (optind < argc) + optarg = argv[optind++]; + else { + optarg = NULL; + return (opterr ? (int)'?' : (int)*pArgString); + } + } + pIndexPosition = NULL; /* not in the middle of anything */ + } + else { + /* it's not a colon, so just return the letter */ + optarg = NULL; /* no argument follows the option */ + pIndexPosition = pArgString; /* point to the letter we're on */ + } + return (int)*pArgString; /* return the letter that matched */ + } +} + +#endif //WIN32 diff --git a/girepository/cmph/wingetopt.h b/girepository/cmph/wingetopt.h new file mode 100644 index 0000000..9596853 --- /dev/null +++ b/girepository/cmph/wingetopt.h @@ -0,0 +1,25 @@ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WIN32 + #include +#else + #ifndef _GETOPT_ + #define _GETOPT_ + + #include /* for EOF */ + #include /* for strchr() */ + + char *optarg = NULL; /* pointer to the start of the option argument */ + int optind = 1; /* number of the next argv[] to be evaluated */ + int opterr = 1; /* non-zero if a question mark should be returned */ + + int getopt(int argc, char *argv[], char *opstring); + #endif //_GETOPT_ +#endif //WIN32 + +#ifdef __cplusplus +} +#endif + diff --git a/girepository/compiler/compiler.c b/girepository/compiler/compiler.c new file mode 100644 index 0000000..c786d4f --- /dev/null +++ b/girepository/compiler/compiler.c @@ -0,0 +1,262 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* GObject introspection: Typelib compiler + * + * + * SPDX-License-Identifier: LGPL-2.1-or-later + + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2024 GNOME Foundation + * + * 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.1 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, see . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#ifdef G_OS_WIN32 +#include +#include +#endif + +#include "girmodule-private.h" +#include "girnode-private.h" +#include "girparser-private.h" + +static gchar **includedirs = NULL; +static gchar **input = NULL; +static gchar *output = NULL; +static gchar **shlibs = NULL; +static gboolean debug = FALSE; +static gboolean verbose = FALSE; +static gboolean show_version = FALSE; + +static gboolean +write_out_typelib (gchar *prefix, + GITypelib *typelib) +{ + FILE *file; + gsize written; + GFile *file_obj; + gchar *filename; + GFile *tmp_file_obj; + gchar *tmp_filename; + GError *error = NULL; + gboolean success = FALSE; + + if (output == NULL) + { + file = stdout; + file_obj = NULL; + filename = NULL; + tmp_filename = NULL; + tmp_file_obj = NULL; +#ifdef G_OS_WIN32 + setmode (fileno (file), _O_BINARY); +#endif + } + else + { + if (prefix) + { + filename = g_strdup_printf ("%s-%s", prefix, output); + } + else + { + filename = g_strdup (output); + } + file_obj = g_file_new_for_path (filename); + tmp_filename = g_strdup_printf ("%s.tmp", filename); + tmp_file_obj = g_file_new_for_path (tmp_filename); + file = g_fopen (tmp_filename, "wb"); + + if (file == NULL) + { + char *message = g_strdup_printf (_("Failed to open ‘%s’: %s"), tmp_filename, g_strerror (errno)); + g_fprintf (stderr, "%s\n", message); + g_free (message); + goto out; + } + } + + written = fwrite (typelib->data, 1, typelib->len, file); + if (written < typelib->len) + { + char *message = g_strdup_printf (_("Error: Could not write the whole output: %s"), g_strerror (errno)); + g_fprintf (stderr, "%s\n", message); + g_free (message); + goto out; + } + + if (output != NULL) + fclose (file); + if (tmp_filename != NULL) + { + if (!g_file_move (tmp_file_obj, file_obj, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error)) + { + char *message = g_strdup_printf (_("Error: Failed to rename ‘%s’ to ‘%s’: %s"), + tmp_filename, filename, + error->message); + g_fprintf (stderr, "%s\n", message); + g_free (message); + g_clear_error (&error); + goto out; + } + } + success = TRUE; +out: + g_clear_object (&file_obj); + g_clear_object (&tmp_file_obj); + g_free (filename); + g_free (tmp_filename); + + return success; +} + +static GLogLevelFlags logged_levels; + +static void +log_handler (const gchar *log_domain, + GLogLevelFlags log_level, + const gchar *message, + gpointer user_data) +{ + if (log_level & logged_levels) + g_log_default_handler (log_domain, log_level, message, user_data); +} + +static GOptionEntry options[] = { + { "includedir", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &includedirs, N_("Include directories in GIR search path"), N_("DIRECTORY") }, + { "output", 'o', 0, G_OPTION_ARG_FILENAME, &output, N_("Output file"), N_("FILE") }, + { "shared-library", 'l', 0, G_OPTION_ARG_FILENAME_ARRAY, &shlibs, N_("Shared library"), N_("FILE") }, + { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Show debug messages"), NULL }, + { "verbose", 0, 0, G_OPTION_ARG_NONE, &verbose, N_("Show verbose messages"), NULL }, + { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Show program’s version number and exit"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &input, NULL, NULL }, + G_OPTION_ENTRY_NULL +}; + +int +main (int argc, char **argv) +{ + GOptionContext *context; + GError *error = NULL; + GIIrParser *parser; + GIIrModule *module; + + setlocale (LC_ALL, ""); + + /* Translators: commandline placeholder */ + context = g_option_context_new (_("FILE")); + g_option_context_add_main_entries (context, options, NULL); + g_option_context_parse (context, &argc, &argv, &error); + g_option_context_free (context); + + if (error) + { + char *message = g_strdup_printf (_("Error parsing arguments: %s"), error->message); + g_fprintf (stderr, "%s\n", message); + g_free (message); + + g_error_free (error); + + return 1; + } + + logged_levels = G_LOG_LEVEL_MASK & ~(G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_DEBUG); + if (debug) + logged_levels = logged_levels | G_LOG_LEVEL_DEBUG; + if (verbose) + logged_levels = logged_levels | G_LOG_LEVEL_MESSAGE; + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); + + g_log_set_default_handler (log_handler, NULL); + + if (show_version) + { + g_printf ("gi-compile-repository %u.%u.%u\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + return 0; + } + + if (!input || g_strv_length (input) != 1) + { + g_fprintf (stderr, "%s\n", _("Please specify exactly one input file")); + + return 1; + } + + g_debug ("[parsing] start, %d includes", + includedirs ? g_strv_length (includedirs) : 0); + + parser = gi_ir_parser_new (); + gi_ir_parser_set_debug (parser, logged_levels); + + gi_ir_parser_set_includes (parser, (const char *const *) includedirs); + + module = gi_ir_parser_parse_file (parser, input[0], &error); + if (module == NULL) + { + char *message = g_strdup_printf (_("Error parsing file ‘%s’: %s"), input[0], error->message); + g_fprintf (stderr, "%s\n", message); + g_free (message); + + return 1; + } + + g_debug ("[parsing] done"); + + g_debug ("[building] start"); + + { + GITypelib *typelib = NULL; + + if (shlibs) + { + if (module->shared_library) + g_free (module->shared_library); + module->shared_library = g_strjoinv (",", shlibs); + } + + g_debug ("[building] module %s", module->name); + + typelib = gi_ir_module_build_typelib (module); + if (typelib == NULL) + g_error (_("Failed to build typelib for module ‘%s’"), module->name); + if (!gi_typelib_validate (typelib, &error)) + g_error (_("Invalid typelib for module ‘%s’: %s"), + module->name, error->message); + + if (!write_out_typelib (NULL, typelib)) + return 1; + + g_clear_pointer (&typelib, gi_typelib_unref); + } + + g_debug ("[building] done"); + +#if 0 + /* No point */ + gi_ir_parser_free (parser); +#endif + + return 0; +} diff --git a/girepository/compiler/meson.build b/girepository/compiler/meson.build new file mode 100644 index 0000000..f724f32 --- /dev/null +++ b/girepository/compiler/meson.build @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# SPDX-FileCopyrightText: 2024 GNOME Foundation + +custom_c_args = [ + '-DG_LOG_DOMAIN="GLib-GirCompiler"', +] + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-old-style-definition', + '-Wno-cast-align', + '-Wno-unused-parameter', + '-Wno-duplicated-branches', + ]) +endif + +gicompilerepository = executable('gi-compile-repository', 'compiler.c', + dependencies: [ + libgirepository_dep, + libgirepository_internals_dep, + libgio_dep, + ], + install: true, + c_args: custom_c_args, +) + +# Only override the user-installed compiler if we need to generate the GIRs +# GLib, Gio, and GObject... +if enable_gir + # Replace the default g-ir-compiler target with the version we + # just built. + meson.override_find_program('g-ir-compiler', gicompilerepository) +endif diff --git a/girepository/decompiler/decompiler.c b/girepository/decompiler/decompiler.c new file mode 100644 index 0000000..9e18337 --- /dev/null +++ b/girepository/decompiler/decompiler.c @@ -0,0 +1,147 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: IDL generator + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include + +#include +#include +#include +#include +#include + +#include "girwriter-private.h" +#include "gitypelib-internal.h" + +int +main (int argc, char *argv[]) +{ + GIRepository *repository = NULL; + gchar *param; + gchar *output = NULL; + gchar **includedirs = NULL; + gboolean show_all = FALSE; + gchar **input = NULL; + GOptionContext *context; + GError *error = NULL; + gboolean needs_prefix; + gboolean show_version = FALSE; + gint i; + GOptionEntry options[] = + { + { "output", 'o', 0, G_OPTION_ARG_FILENAME, &output, N_("Output file"), N_("FILE") }, + { "includedir", 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &includedirs, N_("Include directories in GIR search path"), N_("DIRECTORY") }, + { "all", 0, 0, G_OPTION_ARG_NONE, &show_all, N_("Show all available information"), NULL, }, + { "version", 0, 0, G_OPTION_ARG_NONE, &show_version, N_("Show program’s version number and exit"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &input, NULL, NULL }, + G_OPTION_ENTRY_NULL + }; + + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL); + + setlocale (LC_ALL, ""); + + /* Translators: commandline placeholder */ + param = g_strdup_printf ("%s…", _("FILE")); + context = g_option_context_new (param); + g_free (param); + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + char *message = g_strdup_printf (_("Failed to parse: %s"), error->message); + g_fprintf (stderr, "%s\n", message); + g_free (message); + g_error_free (error); + return 1; + } + + if (show_version) + { + g_printf ("gi-decompile-typelib %u.%u.%u\n", + GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION, GLIB_MICRO_VERSION); + return 0; + } + + if (!input) + { + g_fprintf (stderr, "%s\n", _("No input files")); + + return 1; + } + + repository = gi_repository_new (); + + if (includedirs != NULL) + { + guint n = g_strv_length (includedirs); + guint j; + + for (j = 1; j <= n; j++) + gi_repository_prepend_search_path (repository, includedirs[n - j]); + } + + for (i = 0; input[i]; i++) + { + const char *namespace; + GMappedFile *mfile = NULL; + GBytes *bytes = NULL; + GITypelib *typelib; + + error = NULL; + mfile = g_mapped_file_new (input[i], FALSE, &error); + if (!mfile) + g_error (_("Failed to read ‘%s’: %s"), input[i], error->message); + + bytes = g_mapped_file_get_bytes (mfile); + g_clear_pointer (&mfile, g_mapped_file_unref); + + if (input[i + 1] && output) + needs_prefix = TRUE; + else + needs_prefix = FALSE; + + typelib = gi_typelib_new_from_bytes (bytes, &error); + if (!typelib) + g_error (_("Failed to create typelib ‘%s’: %s"), input[i], error->message); + + namespace = gi_repository_load_typelib (repository, typelib, 0, &error); + if (namespace == NULL) + g_error (_("Failed to load typelib: %s"), error->message); + + gi_ir_writer_write (repository, output, namespace, needs_prefix, show_all); + + /* when writing to stdout, stop after the first module */ + if (input[i + 1] && !output) + { + char *message = g_strdup_printf (_("Warning: %u modules omitted"), g_strv_length (input) - 1); + g_fprintf (stderr, "%s\n", message); + g_free (message); + + break; + } + } + + g_clear_object (&repository); + + return 0; +} diff --git a/girepository/decompiler/meson.build b/girepository/decompiler/meson.build new file mode 100644 index 0000000..cb45532 --- /dev/null +++ b/girepository/decompiler/meson.build @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# SPDX-FileCopyrightText: 2024 GNOME Foundation + +custom_c_args = [ + '-DG_LOG_DOMAIN="GLib-GirDecompiler"', +] + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-old-style-definition', + '-Wno-cast-align', + '-Wno-unused-parameter', + '-Wno-duplicated-branches', + ]) +endif + +gidecompiletypelib = executable('gi-decompile-typelib', 'decompiler.c', + dependencies: [ + libgirepository_dep, + libgirepository_internals_dep, + libgio_dep, + ], + install: true, + c_args: custom_c_args, +) diff --git a/girepository/gdump.c b/girepository/gdump.c new file mode 100644 index 0000000..2388626 --- /dev/null +++ b/girepository/gdump.c @@ -0,0 +1,749 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Dump introspection data + * + * Copyright (C) 2008 Colin Walters + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* This file is both compiled into libgirepository.so, and installed + * on the filesystem. But for the dumper, we want to avoid linking + * to libgirepository; see + * https://bugzilla.gnome.org/show_bug.cgi?id=630342 + */ +#ifdef GI_COMPILATION +#include "config.h" +#include "girepository.h" +#endif + +#include +#include +#include + +#include +#include +#include +#include + +/* Analogue of g_output_stream_write_all(). */ +static gboolean +write_all (FILE *out, + const void *buffer, + size_t count, + size_t *bytes_written, + GError **error) +{ + size_t ret; + + ret = fwrite (buffer, 1, count, out); + + if (bytes_written != NULL) + *bytes_written = ret; + + if (ret < count) + { + g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_FAILED, + "Failed to write to file"); + return FALSE; + } + + return TRUE; +} + +/* Analogue of g_data_input_stream_read_line(). */ +static char * +read_line (FILE *input, + size_t *len_out) +{ + GByteArray *buffer = g_byte_array_new (); + const uint8_t nul = '\0'; + + while (TRUE) + { + size_t ret; + uint8_t byte; + + ret = fread (&byte, 1, 1, input); + if (ret == 0) + break; + + if (byte == '\n') + break; + + g_byte_array_append (buffer, &byte, 1); + } + + g_byte_array_append (buffer, &nul, 1); + + if (len_out != NULL) + *len_out = buffer->len - 1; /* don’t include terminating nul */ + + return (char *) g_byte_array_free (buffer, FALSE); +} + +static void +escaped_printf (FILE *out, const char *fmt, ...) G_GNUC_PRINTF (2, 3); + +static void +escaped_printf (FILE *out, const char *fmt, ...) +{ + char *str; + va_list args; + size_t written; + GError *error = NULL; + + va_start (args, fmt); + + str = g_markup_vprintf_escaped (fmt, args); + if (!write_all (out, str, strlen (str), &written, &error)) + { + g_critical ("failed to write to iochannel: %s", error->message); + g_clear_error (&error); + } + g_free (str); + + va_end (args); +} + +static void +goutput_write (FILE *out, const char *str) +{ + size_t written; + GError *error = NULL; + if (!write_all (out, str, strlen (str), &written, &error)) + { + g_critical ("failed to write to iochannel: %s", error->message); + g_clear_error (&error); + } +} + +typedef GType (*GetTypeFunc)(void); +typedef GQuark (*ErrorQuarkFunc)(void); + +static GType +invoke_get_type (GModule *self, const char *symbol, GError **error) +{ + GetTypeFunc sym; + GType ret; + + if (!g_module_symbol (self, symbol, (void**)&sym)) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "Failed to find symbol '%s'", symbol); + return G_TYPE_INVALID; + } + + ret = sym (); + if (ret == G_TYPE_INVALID) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "Function '%s' returned G_TYPE_INVALID", symbol); + } + return ret; +} + +static GQuark +invoke_error_quark (GModule *self, const char *symbol, GError **error) +{ + ErrorQuarkFunc sym; + + if (!g_module_symbol (self, symbol, (void**)&sym)) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "Failed to find symbol '%s'", symbol); + return G_TYPE_INVALID; + } + + return sym (); +} + +static char * +value_transform_to_string (const GValue *value) +{ + GValue tmp = G_VALUE_INIT; + char *s = NULL; + + g_value_init (&tmp, G_TYPE_STRING); + + if (g_value_transform (value, &tmp)) + { + const char *str = g_value_get_string (&tmp); + + if (str != NULL) + s = g_strescape (str, NULL); + } + + g_value_unset (&tmp); + + return s; +} + +/* A simpler version of g_strdup_value_contents(), but with stable + * output and less complex semantics + */ +static char * +value_to_string (const GValue *value) +{ + if (value == NULL) + return NULL; + + if (G_VALUE_HOLDS_STRING (value)) + { + const char *s = g_value_get_string (value); + + if (s == NULL) + return g_strdup ("NULL"); + + return g_strescape (s, NULL); + } + else + { + GType value_type = G_VALUE_TYPE (value); + + switch (G_TYPE_FUNDAMENTAL (value_type)) + { + case G_TYPE_BOXED: + if (g_value_get_boxed (value) == NULL) + return NULL; + else + return value_transform_to_string (value); + break; + + case G_TYPE_OBJECT: + if (g_value_get_object (value) == NULL) + return NULL; + else + return value_transform_to_string (value); + break; + + case G_TYPE_POINTER: + return NULL; + + default: + return value_transform_to_string (value); + } + } + + return NULL; +} + +static void +dump_properties (GType type, FILE *out) +{ + unsigned int i; + unsigned int n_properties = 0; + GParamSpec **props; + + if (G_TYPE_FUNDAMENTAL (type) == G_TYPE_OBJECT) + { + GObjectClass *klass; + klass = g_type_class_ref (type); + props = g_object_class_list_properties (klass, &n_properties); + } + else + { + void *klass; + klass = g_type_default_interface_ref (type); + props = g_object_interface_list_properties (klass, &n_properties); + } + + for (i = 0; i < n_properties; i++) + { + GParamSpec *prop; + + prop = props[i]; + if (prop->owner_type != type) + continue; + + const GValue *v = g_param_spec_get_default_value (prop); + char *default_value = value_to_string (v); + + if (v != NULL && default_value != NULL) + { + escaped_printf (out, " \n", + prop->name, + g_type_name (prop->value_type), + prop->flags, + default_value); + } + else + { + escaped_printf (out, " \n", + prop->name, + g_type_name (prop->value_type), + prop->flags); + } + + g_free (default_value); + } + + g_free (props); +} + +static void +dump_signals (GType type, FILE *out) +{ + unsigned int i; + unsigned int n_sigs; + unsigned int *sig_ids; + + sig_ids = g_signal_list_ids (type, &n_sigs); + for (i = 0; i < n_sigs; i++) + { + unsigned int sigid; + GSignalQuery query; + unsigned int j; + + sigid = sig_ids[i]; + g_signal_query (sigid, &query); + + escaped_printf (out, " \n"); + + for (j = 0; j < query.n_params; j++) + { + escaped_printf (out, " \n", + g_type_name (query.param_types[j])); + } + goutput_write (out, " \n"); + } + g_free (sig_ids); +} + +static void +dump_object_type (GType type, const char *symbol, FILE *out) +{ + unsigned int n_interfaces; + unsigned int i; + GType *interfaces; + + escaped_printf (out, " str); + + g_string_free (parent_str, TRUE); + } + + if (G_TYPE_IS_ABSTRACT (type)) + escaped_printf (out, " abstract=\"1\""); + + if (G_TYPE_IS_FINAL (type)) + escaped_printf (out, " final=\"1\""); + + goutput_write (out, ">\n"); + + interfaces = g_type_interfaces (type, &n_interfaces); + for (i = 0; i < n_interfaces; i++) + { + GType itype = interfaces[i]; + escaped_printf (out, " \n", + g_type_name (itype)); + } + g_free (interfaces); + + dump_properties (type, out); + dump_signals (type, out); + goutput_write (out, " \n"); +} + +static void +dump_interface_type (GType type, const char *symbol, FILE *out) +{ + unsigned int n_interfaces; + unsigned int i; + GType *interfaces; + + escaped_printf (out, " \n", + g_type_name (type), symbol); + + interfaces = g_type_interface_prerequisites (type, &n_interfaces); + for (i = 0; i < n_interfaces; i++) + { + GType itype = interfaces[i]; + if (itype == G_TYPE_OBJECT) + { + /* Treat this as implicit for now; in theory GInterfaces are + * supported on things like GstMiniObject, but right now + * the introspection system only supports GObject. + * http://bugzilla.gnome.org/show_bug.cgi?id=559706 + */ + continue; + } + escaped_printf (out, " \n", + g_type_name (itype)); + } + g_free (interfaces); + + dump_properties (type, out); + dump_signals (type, out); + goutput_write (out, " \n"); +} + +static void +dump_boxed_type (GType type, const char *symbol, FILE *out) +{ + escaped_printf (out, " \n", + g_type_name (type), symbol); +} + +static void +dump_flags_type (GType type, const char *symbol, FILE *out) +{ + unsigned int i; + GFlagsClass *klass; + + klass = g_type_class_ref (type); + escaped_printf (out, " \n", + g_type_name (type), symbol); + + for (i = 0; i < klass->n_values; i++) + { + GFlagsValue *value = &(klass->values[i]); + + escaped_printf (out, " \n", + value->value_name, value->value_nick, value->value); + } + goutput_write (out, " \n"); +} + +static void +dump_enum_type (GType type, const char *symbol, FILE *out) +{ + unsigned int i; + GEnumClass *klass; + + klass = g_type_class_ref (type); + escaped_printf (out, " \n", + g_type_name (type), symbol); + + for (i = 0; i < klass->n_values; i++) + { + GEnumValue *value = &(klass->values[i]); + + escaped_printf (out, " \n", + value->value_name, value->value_nick, value->value); + } + goutput_write (out, " "); +} + +static void +dump_fundamental_type (GType type, const char *symbol, FILE *out) +{ + unsigned int n_interfaces; + unsigned int i; + GType *interfaces; + GString *parent_str; + GType parent; + gboolean first = TRUE; + + + escaped_printf (out, " len > 0) + escaped_printf (out, " parents=\"%s\"", parent_str->str); + g_string_free (parent_str, TRUE); + + goutput_write (out, ">\n"); + + interfaces = g_type_interfaces (type, &n_interfaces); + for (i = 0; i < n_interfaces; i++) + { + GType itype = interfaces[i]; + escaped_printf (out, " \n", + g_type_name (itype)); + } + g_free (interfaces); + goutput_write (out, " \n"); +} + +static void +dump_type (GType type, const char *symbol, FILE *out) +{ + switch (g_type_fundamental (type)) + { + case G_TYPE_OBJECT: + dump_object_type (type, symbol, out); + break; + case G_TYPE_INTERFACE: + dump_interface_type (type, symbol, out); + break; + case G_TYPE_BOXED: + dump_boxed_type (type, symbol, out); + break; + case G_TYPE_FLAGS: + dump_flags_type (type, symbol, out); + break; + case G_TYPE_ENUM: + dump_enum_type (type, symbol, out); + break; + case G_TYPE_POINTER: + /* GValue, etc. Just skip them. */ + break; + default: + dump_fundamental_type (type, symbol, out); + break; + } +} + +static void +dump_error_quark (GQuark quark, const char *symbol, FILE *out) +{ + escaped_printf (out, " \n", + symbol, g_quark_to_string (quark)); +} + +/** + * gi_repository_dump: + * @input_filename: (type filename): Input filename (for example `input.txt`) + * @output_filename: (type filename): Output filename (for example `output.xml`) + * @error: a %GError + * + * Dump the introspection data from the types specified in @input_filename to + * @output_filename. + * + * The input file should be a + * UTF-8 Unix-line-ending text file, with each line containing either + * `get-type:` followed by the name of a [type@GObject.Type] `_get_type` + * function, or `error-quark:` followed by the name of an error quark function. + * No extra whitespace is allowed. + * + * This function will overwrite the contents of the output file. + * + * Returns: true on success, false on error + * Since: 2.80 + */ +#ifndef GI_COMPILATION +static gboolean +dump_irepository (const char *input_filename, + const char *output_filename, + GError **error) G_GNUC_UNUSED; +static gboolean +dump_irepository (const char *input_filename, + const char *output_filename, + GError **error) +#else +gboolean +gi_repository_dump (const char *input_filename, + const char *output_filename, + GError **error) +#endif +{ + GHashTable *output_types; + FILE *input; + FILE *output; + GModule *self; + gboolean caught_error = FALSE; + + self = g_module_open (NULL, 0); + if (!self) + { + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + "failed to open self: %s", + g_module_error ()); + return FALSE; + } + + input = fopen (input_filename, "rb"); + if (input == NULL) + { + int saved_errno = errno; + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno), + "Failed to open ‘%s’: %s", input_filename, g_strerror (saved_errno)); + + g_module_close (self); + + return FALSE; + } + + output = fopen (output_filename, "wb"); + if (output == NULL) + { + int saved_errno = errno; + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno), + "Failed to open ‘%s’: %s", output_filename, g_strerror (saved_errno)); + + fclose (input); + g_module_close (self); + + return FALSE; + } + + goutput_write (output, "\n"); + goutput_write (output, "\n"); + + output_types = g_hash_table_new (NULL, NULL); + + while (TRUE) + { + size_t len; + char *line = read_line (input, &len); + const char *function; + + if (line == NULL || *line == '\0') + { + g_free (line); + break; + } + + g_strchomp (line); + + if (strncmp (line, "get-type:", strlen ("get-type:")) == 0) + { + GType type; + + function = line + strlen ("get-type:"); + + type = invoke_get_type (self, function, error); + + if (type == G_TYPE_INVALID) + { + g_printerr ("Invalid GType function: '%s'\n", function); + caught_error = TRUE; + g_free (line); + break; + } + + if (g_hash_table_lookup (output_types, (gpointer) type)) + goto next; + g_hash_table_insert (output_types, (gpointer) type, (gpointer) type); + + dump_type (type, function, output); + } + else if (strncmp (line, "error-quark:", strlen ("error-quark:")) == 0) + { + GQuark quark; + function = line + strlen ("error-quark:"); + quark = invoke_error_quark (self, function, error); + + if (quark == 0) + { + g_printerr ("Invalid error quark function: '%s'\n", function); + caught_error = TRUE; + g_free (line); + break; + } + + dump_error_quark (quark, function, output); + } + + + next: + g_free (line); + } + + g_hash_table_destroy (output_types); + + goutput_write (output, "\n"); + + { + /* Avoid overwriting an earlier set error */ + if (fclose (input) != 0 && !caught_error) + { + int saved_errno = errno; + + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno), + "Error closing input file ‘%s’: %s", input_filename, + g_strerror (saved_errno)); + caught_error = TRUE; + } + + if (fclose (output) != 0 && !caught_error) + { + int saved_errno = errno; + + g_set_error (error, G_FILE_ERROR, g_file_error_from_errno (saved_errno), + "Error closing output file ‘%s’: %s", output_filename, + g_strerror (saved_errno)); + caught_error = TRUE; + } + } + + return !caught_error; +} diff --git a/girepository/gi-dump-types.c b/girepository/gi-dump-types.c new file mode 100644 index 0000000..791fcf8 --- /dev/null +++ b/girepository/gi-dump-types.c @@ -0,0 +1,53 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: typelib validation, auxiliary functions + * related to the binary typelib format + * + * Copyright (C) 2011 Colin Walters + * Copyright (C) 2020 Gisle Vanem + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "gdump.c" + +int +main (int argc, + char **argv) +{ + int i; + GModule *self; + + self = g_module_open (NULL, 0); + + for (i = 1; i < argc; i++) + { + GError *error = NULL; + GType type; + + type = invoke_get_type (self, argv[i], &error); + if (!type) + { + g_printerr ("%s\n", error->message); + g_clear_error (&error); + } + else + dump_type (type, argv[i], stdout); + } + + return 0; +} diff --git a/girepository/giarginfo.c b/girepository/giarginfo.c new file mode 100644 index 0000000..8728fd0 --- /dev/null +++ b/girepository/giarginfo.c @@ -0,0 +1,381 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Argument implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include "gibaseinfo-private.h" +#include "gitypelib-internal.h" +#include "girepository-private.h" +#include "giarginfo.h" + + +/* GIArgInfo functions */ + +/** + * GIArgInfo: + * + * `GIArgInfo` represents an argument of a callable. + * + * An argument is always part of a [class@GIRepository.CallableInfo]. + * + * Since: 2.80 + */ + +/** + * gi_arg_info_get_direction: + * @info: a #GIArgInfo + * + * Obtain the direction of the argument. Check [type@GIRepository.Direction] + * for possible direction values. + * + * Returns: The direction + * Since: 2.80 + */ +GIDirection +gi_arg_info_get_direction (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_ARG_INFO (info), -1); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->in && blob->out) + return GI_DIRECTION_INOUT; + else if (blob->out) + return GI_DIRECTION_OUT; + else + return GI_DIRECTION_IN; +} + +/** + * gi_arg_info_is_return_value: + * @info: a #GIArgInfo + * + * Obtain if the argument is a return value. It can either be a + * parameter or a return value. + * + * Returns: `TRUE` if it is a return value + * Since: 2.80 + */ +gboolean +gi_arg_info_is_return_value (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->return_value; +} + +/** + * gi_arg_info_is_caller_allocates: + * @info: a #GIArgInfo + * + * Obtain if the argument is a pointer to a struct or object that will + * receive an output of a function. + * + * The default assumption for `GI_DIRECTION_OUT` arguments which have allocation + * is that the callee allocates; if this is `TRUE`, then the caller must + * allocate. + * + * Returns: `TRUE` if caller is required to have allocated the argument + * Since: 2.80 + */ +gboolean +gi_arg_info_is_caller_allocates (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->caller_allocates; +} + +/** + * gi_arg_info_is_optional: + * @info: a #GIArgInfo + * + * Obtain if the argument is optional. + * + * For ‘out’ arguments this means that you can pass `NULL` in order to ignore + * the result. + * + * Returns: `TRUE` if it is an optional argument + * Since: 2.80 + */ +gboolean +gi_arg_info_is_optional (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->optional; +} + +/** + * gi_arg_info_may_be_null: + * @info: a #GIArgInfo + * + * Obtain if the type of the argument includes the possibility of `NULL`. + * + * For ‘in’ values this means that `NULL` is a valid value. For ‘out’ + * values, this means that `NULL` may be returned. + * + * See also [method@GIRepository.ArgInfo.is_optional]. + * + * Returns: `TRUE` if the value may be `NULL` + * Since: 2.80 + */ +gboolean +gi_arg_info_may_be_null (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->nullable; +} + +/** + * gi_arg_info_is_skip: + * @info: a #GIArgInfo + * + * Obtain if an argument is only useful in C. + * + * Returns: `TRUE` if argument is only useful in C. + * Since: 2.80 + */ +gboolean +gi_arg_info_is_skip (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->skip; +} + +/** + * gi_arg_info_get_ownership_transfer: + * @info: a #GIArgInfo + * + * Obtain the ownership transfer for this argument. + * [type@GIRepository.Transfer] contains a list of possible values. + * + * Returns: The transfer + * Since: 2.80 + */ +GITransfer +gi_arg_info_get_ownership_transfer (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_ARG_INFO (info), -1); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->transfer_ownership) + return GI_TRANSFER_EVERYTHING; + else if (blob->transfer_container_ownership) + return GI_TRANSFER_CONTAINER; + else + return GI_TRANSFER_NOTHING; +} + +/** + * gi_arg_info_get_scope: + * @info: a #GIArgInfo + * + * Obtain the scope type for this argument. + * + * The scope type explains how a callback is going to be invoked, most + * importantly when the resources required to invoke it can be freed. + * + * [type@GIRepository.ScopeType] contains a list of possible values. + * + * Returns: The scope type + * Since: 2.80 + */ +GIScopeType +gi_arg_info_get_scope (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_ARG_INFO (info), -1); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->scope; +} + +/** + * gi_arg_info_get_closure_index: + * @info: a #GIArgInfo + * @out_closure_index: (out) (optional): return location for the closure index + * + * Obtain the index of the user data argument. This is only valid + * for arguments which are callbacks. + * + * Returns: `TRUE` if the argument has a user data argument + * Since: 2.80 + */ +gboolean +gi_arg_info_get_closure_index (GIArgInfo *info, + unsigned int *out_closure_index) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + gboolean has_closure_index; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + has_closure_index = (blob->closure >= 0); + + if (out_closure_index != NULL) + *out_closure_index = has_closure_index ? blob->closure : 0; + return has_closure_index; +} + +/** + * gi_arg_info_get_destroy_index: + * @info: a #GIArgInfo + * @out_destroy_index: (out) (optional): return location for the destroy index + * + * Obtains the index of the [type@GLib.DestroyNotify] argument. This is only + * valid for arguments which are callbacks. + * + * Returns: `TRUE` if the argument has a [type@GLib.DestroyNotify] argument + * Since: 2.80 + */ +gboolean +gi_arg_info_get_destroy_index (GIArgInfo *info, + unsigned int *out_destroy_index) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ArgBlob *blob; + gboolean has_destroy_index; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_ARG_INFO (info), FALSE); + + blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + has_destroy_index = (blob->destroy >= 0); + + if (out_destroy_index != NULL) + *out_destroy_index = has_destroy_index ? blob->destroy : 0; + return has_destroy_index; +} + +/** + * gi_arg_info_get_type_info: + * @info: a #GIArgInfo + * + * Obtain the type information for @info. + * + * Returns: (transfer full): The [class@GIRepository.TypeInfo] holding the type + * information for @info, free it with [method@GIRepository.BaseInfo.unref] + * when done + * Since: 2.80 + */ +GITypeInfo * +gi_arg_info_get_type_info (GIArgInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_ARG_INFO (info), NULL); + + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); +} + +/** + * gi_arg_info_load_type_info: + * @info: a #GIArgInfo + * @type: (out caller-allocates): Initialized with information about type of @info + * + * Obtain information about a the type of given argument @info; this + * function is a variant of [method@GIRepository.ArgInfo.get_type_info] designed + * for stack allocation. + * + * The initialized @type must not be referenced after @info is deallocated. + * + * Once you are done with @type, it must be cleared using + * [method@GIRepository.BaseInfo.clear]. + * + * Since: 2.80 + */ +void +gi_arg_info_load_type_info (GIArgInfo *info, + GITypeInfo *type) +{ + GIRealInfo *rinfo = (GIRealInfo*) info; + + g_return_if_fail (info != NULL); + g_return_if_fail (GI_IS_ARG_INFO (info)); + + gi_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (ArgBlob, arg_type)); +} + +void +gi_arg_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_ARG; +} diff --git a/girepository/giarginfo.h b/girepository/giarginfo.h new file mode 100644 index 0000000..e7a61b1 --- /dev/null +++ b/girepository/giarginfo.h @@ -0,0 +1,100 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Argument + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_ARG_INFO (gi_arg_info_get_type ()) + +/** + * GI_ARG_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.ArgInfo] or derived pointer into a + * `(GIArgInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_ARG_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_ARG_INFO, GIArgInfo)) + +/** + * GI_IS_ARG_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.ArgInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_ARG_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_ARG_INFO)) + + +GI_AVAILABLE_IN_ALL +GIDirection gi_arg_info_get_direction (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_is_return_value (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_is_optional (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_is_caller_allocates (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_may_be_null (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_is_skip (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +GITransfer gi_arg_info_get_ownership_transfer (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +GIScopeType gi_arg_info_get_scope (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_get_closure_index (GIArgInfo *info, + unsigned int *out_closure_index); + +GI_AVAILABLE_IN_ALL +gboolean gi_arg_info_get_destroy_index (GIArgInfo *info, + unsigned int *out_destroy_index); + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_arg_info_get_type_info (GIArgInfo *info); + +GI_AVAILABLE_IN_ALL +void gi_arg_info_load_type_info (GIArgInfo *info, + GITypeInfo *type); +G_END_DECLS diff --git a/girepository/gibaseinfo-private.h b/girepository/gibaseinfo-private.h new file mode 100644 index 0000000..453a18d --- /dev/null +++ b/girepository/gibaseinfo-private.h @@ -0,0 +1,58 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Parsed GIR + * + * Copyright 2023 GNOME Foundation Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include + +#include "girepository-private.h" +#include "gitypes.h" + +G_BEGIN_DECLS + +struct _GIBaseInfoClass +{ + GTypeClass parent_class; + + GIInfoType info_type; + + void (* finalize) (GIBaseInfo *info); +}; + +void gi_base_info_init_types (void); + +GType gi_base_info_type_register_static (const char *type_name, + size_t instance_size, + GClassInitFunc class_init, + GType parent_type, + GTypeFlags type_flags); + +GIInfoType gi_base_info_get_info_type (GIBaseInfo *info); + +GIBaseInfo * gi_base_info_new (GIInfoType type, + GIBaseInfo *container, + GITypelib *typelib, + size_t offset); + +G_END_DECLS diff --git a/girepository/gibaseinfo.c b/girepository/gibaseinfo.c new file mode 100644 index 0000000..ccc5aed --- /dev/null +++ b/girepository/gibaseinfo.c @@ -0,0 +1,1047 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Base struct implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include + +#include +#include +#include + +#include "gitypelib-internal.h" +#include "girepository-private.h" +#include "gibaseinfo.h" +#include "gibaseinfo-private.h" + +#define INVALID_REFCOUNT 0x7FFFFFFF + +/* Type registration of BaseInfo. */ +#define GI_BASE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GI_TYPE_BASE_INFO, GIBaseInfoClass)) + +static void +value_base_info_init (GValue *value) +{ + value->data[0].v_pointer = NULL; +} + +static void +value_base_info_free_value (GValue *value) +{ + if (value->data[0].v_pointer != NULL) + gi_base_info_unref (value->data[0].v_pointer); +} + +static void +value_base_info_copy_value (const GValue *src, + GValue *dst) +{ + if (src->data[0].v_pointer != NULL) + dst->data[0].v_pointer = gi_base_info_ref (src->data[0].v_pointer); + else + dst->data[0].v_pointer = NULL; +} + +static void * +value_base_info_peek_pointer (const GValue *value) +{ + return value->data[0].v_pointer; +} + +static char * +value_base_info_collect_value (GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + GIBaseInfo *info = collect_values[0].v_pointer; + + if (info == NULL) + { + value->data[0].v_pointer = NULL; + return NULL; + } + + if (info->parent_instance.g_class == NULL) + return g_strconcat ("invalid unclassed GIBaseInfo pointer for " + "value type '", + G_VALUE_TYPE_NAME (value), + "'", + NULL); + + value->data[0].v_pointer = gi_base_info_ref (info); + + return NULL; +} + +static char * +value_base_info_lcopy_value (const GValue *value, + guint n_collect_values, + GTypeCValue *collect_values, + guint collect_flags) +{ + GIBaseInfo **node_p = collect_values[0].v_pointer; + + if (node_p == NULL) + return g_strconcat ("value location for '", + G_VALUE_TYPE_NAME (value), + "' passed as NULL", + NULL); + + if (value->data[0].v_pointer == NULL) + *node_p = NULL; + else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) + *node_p = value->data[0].v_pointer; + else + *node_p = gi_base_info_ref (value->data[0].v_pointer); + + return NULL; +} + +static void +gi_base_info_finalize (GIBaseInfo *self) +{ + if (self->ref_count != INVALID_REFCOUNT && + self->container && self->container->ref_count != INVALID_REFCOUNT) + gi_base_info_unref (self->container); +} + +static void +gi_base_info_class_init (GIBaseInfoClass *klass) +{ + klass->info_type = GI_INFO_TYPE_INVALID; + klass->finalize = gi_base_info_finalize; +} + +static void +gi_base_info_init (GIBaseInfo *self) +{ + /* Initialise a dynamically allocated #GIBaseInfo’s members. + * + * This function *must* be kept in sync with gi_info_init(). */ + g_atomic_ref_count_init (&self->ref_count); +} + +GType +gi_base_info_get_type (void) +{ + static GType base_info_type = 0; + + if (g_once_init_enter_pointer (&base_info_type)) + { + static const GTypeFundamentalInfo finfo = { + (G_TYPE_FLAG_CLASSED | + G_TYPE_FLAG_INSTANTIATABLE | + G_TYPE_FLAG_DERIVABLE | + G_TYPE_FLAG_DEEP_DERIVABLE), + }; + + static const GTypeValueTable value_table = { + value_base_info_init, + value_base_info_free_value, + value_base_info_copy_value, + value_base_info_peek_pointer, + "p", + value_base_info_collect_value, + "p", + value_base_info_lcopy_value, + }; + + const GTypeInfo type_info = { + /* Class */ + sizeof (GIBaseInfoClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) gi_base_info_class_init, + (GClassFinalizeFunc) NULL, + NULL, + + /* Instance */ + sizeof (GIBaseInfo), + 0, + (GInstanceInitFunc) gi_base_info_init, + + /* GValue */ + &value_table, + }; + + GType _base_info_type = + g_type_register_fundamental (g_type_fundamental_next (), + g_intern_static_string ("GIBaseInfo"), + &type_info, &finfo, + G_TYPE_FLAG_ABSTRACT); + + g_once_init_leave_pointer (&base_info_type, _base_info_type); + } + + return base_info_type; +} + +/*< private > + * gi_base_info_type_register_static: + * @type_name: the name of the type + * @instance_size: size (in bytes) of the type’s instance struct + * @class_init: class init function for the type + * @parent_type: [type@GObject.Type] for the parent type; this will typically be + * `GI_TYPE_BASE_INFO` + * @type_flags: flags for the type + * + * Registers a new [type@GIRepository.BaseInfo] type for the given @type_name + * using the type information provided. + * + * Returns: the newly registered [type@GObject.Type] + * Since: 2.80 + */ +GType +gi_base_info_type_register_static (const char *type_name, + size_t instance_size, + GClassInitFunc class_init, + GType parent_type, + GTypeFlags type_flags) +{ + GTypeInfo info; + + info.class_size = sizeof (GIBaseInfoClass); + info.base_init = NULL; + info.base_finalize = NULL; + info.class_init = class_init; + info.class_finalize = NULL; + info.instance_size = instance_size; + info.n_preallocs = 0; + info.instance_init = NULL; + info.value_table = NULL; + + return g_type_register_static (parent_type, type_name, &info, type_flags); +} + +static GType gi_base_info_types[GI_INFO_TYPE_N_TYPES]; + +#define GI_DEFINE_BASE_INFO_TYPE(type_name, TYPE_ENUM_VALUE) \ +GType \ +type_name ## _get_type (void) \ +{ \ + gi_base_info_init_types (); \ + g_assert (gi_base_info_types[TYPE_ENUM_VALUE] != G_TYPE_INVALID); \ + return gi_base_info_types[TYPE_ENUM_VALUE]; \ +} + +GI_DEFINE_BASE_INFO_TYPE (gi_callable_info, GI_INFO_TYPE_CALLABLE) +GI_DEFINE_BASE_INFO_TYPE (gi_function_info, GI_INFO_TYPE_FUNCTION) +GI_DEFINE_BASE_INFO_TYPE (gi_callback_info, GI_INFO_TYPE_CALLBACK) +GI_DEFINE_BASE_INFO_TYPE (gi_registered_type_info, GI_INFO_TYPE_REGISTERED_TYPE) +GI_DEFINE_BASE_INFO_TYPE (gi_struct_info, GI_INFO_TYPE_STRUCT) +GI_DEFINE_BASE_INFO_TYPE (gi_union_info, GI_INFO_TYPE_UNION) +GI_DEFINE_BASE_INFO_TYPE (gi_enum_info, GI_INFO_TYPE_ENUM) +GI_DEFINE_BASE_INFO_TYPE (gi_flags_info, GI_INFO_TYPE_FLAGS) +GI_DEFINE_BASE_INFO_TYPE (gi_object_info, GI_INFO_TYPE_OBJECT) +GI_DEFINE_BASE_INFO_TYPE (gi_interface_info, GI_INFO_TYPE_INTERFACE) +GI_DEFINE_BASE_INFO_TYPE (gi_constant_info, GI_INFO_TYPE_CONSTANT) +GI_DEFINE_BASE_INFO_TYPE (gi_value_info, GI_INFO_TYPE_VALUE) +GI_DEFINE_BASE_INFO_TYPE (gi_signal_info, GI_INFO_TYPE_SIGNAL) +GI_DEFINE_BASE_INFO_TYPE (gi_vfunc_info, GI_INFO_TYPE_VFUNC) +GI_DEFINE_BASE_INFO_TYPE (gi_property_info, GI_INFO_TYPE_PROPERTY) +GI_DEFINE_BASE_INFO_TYPE (gi_field_info, GI_INFO_TYPE_FIELD) +GI_DEFINE_BASE_INFO_TYPE (gi_arg_info, GI_INFO_TYPE_ARG) +GI_DEFINE_BASE_INFO_TYPE (gi_type_info, GI_INFO_TYPE_TYPE) +GI_DEFINE_BASE_INFO_TYPE (gi_unresolved_info, GI_INFO_TYPE_UNRESOLVED) + +void +gi_base_info_init_types (void) +{ + static size_t register_types_once = 0; + + if (g_once_init_enter (®ister_types_once)) + { + const struct + { + GIInfoType info_type; + const char *type_name; + size_t instance_size; + GClassInitFunc class_init; + GIInfoType parent_info_type; /* 0 for GIBaseInfo */ + GTypeFlags type_flags; + } + types[] = + { + { GI_INFO_TYPE_CALLABLE, "GICallableInfo", sizeof (GICallableInfo), gi_callable_info_class_init, 0, G_TYPE_FLAG_ABSTRACT }, + { GI_INFO_TYPE_FUNCTION, "GIFunctionInfo", sizeof (GIFunctionInfo), gi_function_info_class_init, GI_INFO_TYPE_CALLABLE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_CALLBACK, "GICallbackInfo", sizeof (GICallbackInfo), gi_callback_info_class_init, GI_INFO_TYPE_CALLABLE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_REGISTERED_TYPE, "GIRegisteredTypeInfo", sizeof (GIRegisteredTypeInfo), gi_registered_type_info_class_init, 0, G_TYPE_FLAG_ABSTRACT }, + { GI_INFO_TYPE_STRUCT, "GIStructInfo", sizeof (GIStructInfo), gi_struct_info_class_init, GI_INFO_TYPE_REGISTERED_TYPE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_UNION, "GIUnionInfo", sizeof (GIUnionInfo), gi_union_info_class_init, GI_INFO_TYPE_REGISTERED_TYPE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_ENUM, "GIEnumInfo", sizeof (GIEnumInfo), gi_enum_info_class_init, GI_INFO_TYPE_REGISTERED_TYPE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_FLAGS, "GIFlagsInfo", sizeof (GIFlagsInfo), gi_flags_info_class_init, GI_INFO_TYPE_ENUM, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_OBJECT, "GIObjectInfo", sizeof (GIObjectInfo), gi_object_info_class_init, GI_INFO_TYPE_REGISTERED_TYPE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_INTERFACE, "GIInterfaceInfo", sizeof (GIInterfaceInfo), gi_interface_info_class_init, GI_INFO_TYPE_REGISTERED_TYPE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_CONSTANT, "GIConstantInfo", sizeof (GIConstantInfo), gi_constant_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_VALUE, "GIValueInfo", sizeof (GIValueInfo), gi_value_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_SIGNAL, "GISignalInfo", sizeof (GISignalInfo), gi_signal_info_class_init, GI_INFO_TYPE_CALLABLE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_VFUNC, "GIVFuncInfo", sizeof (GIVFuncInfo), gi_vfunc_info_class_init, GI_INFO_TYPE_CALLABLE, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_PROPERTY, "GIPropertyInfo", sizeof (GIPropertyInfo), gi_property_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_FIELD, "GIFieldInfo", sizeof (GIFieldInfo), gi_field_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_ARG, "GIArgInfo", sizeof (GIArgInfo), gi_arg_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_TYPE, "GITypeInfo", sizeof (GITypeInfo), gi_type_info_class_init, 0, G_TYPE_FLAG_NONE }, + { GI_INFO_TYPE_UNRESOLVED, "GIUnresolvedInfo", sizeof (GIUnresolvedInfo), gi_unresolved_info_class_init, 0, G_TYPE_FLAG_NONE }, + }; + + for (size_t i = 0; i < G_N_ELEMENTS (types); i++) + { + GType registered_type, parent_type; + + parent_type = (types[i].parent_info_type == 0) ? GI_TYPE_BASE_INFO : gi_base_info_types[types[i].parent_info_type]; + g_assert (parent_type != G_TYPE_INVALID); + + registered_type = gi_base_info_type_register_static (g_intern_static_string (types[i].type_name), + types[i].instance_size, + types[i].class_init, + parent_type, + types[i].type_flags); + gi_base_info_types[types[i].info_type] = registered_type; + } + + g_once_init_leave (®ister_types_once, 1); + } +} + +/* info creation */ +GIBaseInfo * +gi_info_new_full (GIInfoType type, + GIRepository *repository, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset) +{ + GIRealInfo *info; + + g_return_val_if_fail (container != NULL || repository != NULL, NULL); + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (offset <= G_MAXUINT32, NULL); + + gi_base_info_init_types (); + g_assert (gi_base_info_types[type] != G_TYPE_INVALID); + info = (GIRealInfo *) g_type_create_instance (gi_base_info_types[type]); + + info->typelib = typelib; + info->offset = offset; + + if (container) + info->container = container; + if (container && container->ref_count != INVALID_REFCOUNT) + gi_base_info_ref (info->container); + + /* Don’t keep a strong ref, since the repository keeps a cache of #GIBaseInfos + * and holds refs on them. If we kept a ref here, there’d be a cycle. + * Don’t keep a weak ref either, as that would make creating/destroying a + * #GIBaseInfo noticeably more expensive, and infos are performance critical + * for bindings. + * As stated in the documentation, the mitigation here is to require the user + * to keep the #GIRepository alive longer than any of its #GIBaseInfos. */ + info->repository = repository; + + return (GIBaseInfo*)info; +} + +/** + * gi_base_info_new: + * @type: type of the info to create + * @container: (nullable): info which contains this one + * @typelib: typelib containing the info + * @offset: offset of the info within @typelib, in bytes + * + * Create a new #GIBaseInfo representing an object of the given @type from + * @offset of @typelib. + * + * Returns: (transfer full): The new #GIBaseInfo, unref with + * [method@GIRepository.BaseInfo.unref] + * Since: 2.80 + */ +GIBaseInfo * +gi_base_info_new (GIInfoType type, + GIBaseInfo *container, + GITypelib *typelib, + size_t offset) +{ + return gi_info_new_full (type, ((GIRealInfo*)container)->repository, container, typelib, offset); +} + +/*< private > + * gi_info_init: + * @info: (out caller-allocates): caller-allocated #GIRealInfo to populate + * @type: type of the info to create + * @repository: repository the info is in + * @container: (nullable): info which contains this one + * @typelib: typelib containing the info + * @offset: offset of the info within @typelib, in bytes + * + * Initialise a stack-allocated #GIBaseInfo representing an object of the given + * @type from @offset of @typelib. + * + * Since: 2.80 + */ +void +gi_info_init (GIRealInfo *info, + GType type, + GIRepository *repository, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset) +{ + memset (info, 0, sizeof (GIRealInfo)); + + /* Evil setup of a stack allocated #GTypeInstance. This is not something it’s + * really designed to do. + * + * This function *must* be kept in sync with gi_base_info_init(), which is + * the equivalent function for dynamically allocated types. */ + info->parent_instance.g_class = g_type_class_ref (type); + + /* g_type_create_instance() calls the #GInstanceInitFunc for each of the + * parent types, down to (and including) @type. We don’t need to do that, as + * #GIBaseInfo is fundamental so doesn’t have a parent type, the instance init + * function for #GIBaseInfo is gi_base_info_init() (which only sets the + * refcount, which we already do here), and subtypes of #GIBaseInfo don’t have + * instance init functions (see gi_base_info_type_register_static()). */ + + /* Invalid refcount used to flag stack-allocated infos */ + info->ref_count = INVALID_REFCOUNT; + info->typelib = typelib; + info->offset = offset; + + if (container) + info->container = container; + + g_assert (GI_IS_REPOSITORY (repository)); + info->repository = repository; +} + +/** + * gi_base_info_clear: + * @info: (type GIRepository.BaseInfo): a #GIBaseInfo + * + * Clears memory allocated internally by a stack-allocated + * [type@GIRepository.BaseInfo]. + * + * This does not deallocate the [type@GIRepository.BaseInfo] struct itself. It + * does clear the struct to zero so that calling this function subsequent times + * on the same struct is a no-op. + * + * This must only be called on stack-allocated [type@GIRepository.BaseInfo]s. + * Use [method@GIRepository.BaseInfo.unref] for heap-allocated ones. + * + * Since: 2.80 + */ +void +gi_base_info_clear (void *info) +{ + GIBaseInfo *rinfo = (GIBaseInfo *) info; + + /* If @info is zero-filled, do nothing. This allows gi_base_info_clear() to be + * used with g_auto(). */ + if (rinfo->ref_count == 0) + return; + + g_return_if_fail (GI_IS_BASE_INFO (rinfo)); + + g_assert (rinfo->ref_count == INVALID_REFCOUNT); + + GI_BASE_INFO_GET_CLASS (info)->finalize (rinfo); + + g_type_class_unref (rinfo->parent_instance.g_class); + + memset (rinfo, 0, sizeof (*rinfo)); +} + +GIBaseInfo * +gi_info_from_entry (GIRepository *repository, + GITypelib *typelib, + uint16_t index) +{ + GIBaseInfo *result; + DirEntry *entry = gi_typelib_get_dir_entry (typelib, index); + + if (entry->local) + result = gi_info_new_full (gi_typelib_blob_type_to_info_type (entry->blob_type), + repository, NULL, typelib, entry->offset); + else + { + const char *namespace = gi_typelib_get_string (typelib, entry->offset); + const char *name = gi_typelib_get_string (typelib, entry->name); + + result = gi_repository_find_by_name (repository, namespace, name); + if (result == NULL) + { + GIUnresolvedInfo *unresolved; + + unresolved = (GIUnresolvedInfo *) gi_info_new_full (GI_INFO_TYPE_UNRESOLVED, + repository, + NULL, + typelib, + entry->offset); + + unresolved->name = name; + unresolved->namespace = namespace; + + return (GIBaseInfo *)unresolved; + } + return (GIBaseInfo *)result; + } + + return (GIBaseInfo *)result; +} + +GITypeInfo * +gi_type_info_new (GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset) +{ + SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset]; + + return (GITypeInfo *) gi_base_info_new (GI_INFO_TYPE_TYPE, container, typelib, + (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset); +} + +/*< private > + * gi_type_info_init: + * @info: (out caller-allocates): caller-allocated #GITypeInfo to populate + * @container: (nullable): info which contains this one + * @typelib: typelib containing the info + * @offset: offset of the info within @typelib, in bytes + * + * Initialise a stack-allocated #GITypeInfo representing an object of type + * [type@GIRepository.TypeInfo] from @offset of @typelib. + * + * This is a specialised form of [func@GIRepository.info_init] for type + * information. + * + * Since: 2.80 + */ +void +gi_type_info_init (GITypeInfo *info, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset) +{ + GIRealInfo *rinfo = (GIRealInfo*)container; + SimpleTypeBlob *type = (SimpleTypeBlob *)&typelib->data[offset]; + + gi_info_init ((GIRealInfo*)info, GI_TYPE_TYPE_INFO, rinfo->repository, container, typelib, + (type->flags.reserved == 0 && type->flags.reserved2 == 0) ? offset : type->offset); +} + +/* GIBaseInfo functions */ + +/** + * GIBaseInfo: + * + * `GIBaseInfo` is the common base struct of all other Info structs + * accessible through the [class@GIRepository.Repository] API. + * + * All info structures can be cast to a `GIBaseInfo`, for instance: + * + * ```c + * GIFunctionInfo *function_info = …; + * GIBaseInfo *info = (GIBaseInfo *) function_info; + * ``` + * + * Most [class@GIRepository.Repository] APIs returning a `GIBaseInfo` are + * actually creating a new struct; in other words, + * [method@GIRepository.BaseInfo.unref] has to be called when done accessing the + * data. + * + * `GIBaseInfo` structuress are normally accessed by calling either + * [method@GIRepository.Repository.find_by_name], + * [method@GIRepository.Repository.find_by_gtype] or + * [method@GIRepository.get_info]. + * + * ```c + * GIBaseInfo *button_info = + * gi_repository_find_by_name (NULL, "Gtk", "Button"); + * + * // use button_info… + * + * gi_base_info_unref (button_info); + * ``` + * + * Since: 2.80 + */ + +/** + * gi_base_info_ref: + * @info: (type GIRepository.BaseInfo): a #GIBaseInfo + * + * Increases the reference count of @info. + * + * Returns: (transfer full): the same @info. + * Since: 2.80 + */ +GIBaseInfo * +gi_base_info_ref (void *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + + g_return_val_if_fail (GI_IS_BASE_INFO (info), NULL); + + g_assert (rinfo->ref_count != INVALID_REFCOUNT); + g_atomic_ref_count_inc (&rinfo->ref_count); + + return info; +} + +/** + * gi_base_info_unref: + * @info: (type GIRepository.BaseInfo) (transfer full): a #GIBaseInfo + * + * Decreases the reference count of @info. When its reference count + * drops to 0, the info is freed. + * + * This must not be called on stack-allocated [type@GIRepository.BaseInfo]s — + * use [method@GIRepository.BaseInfo.clear] for that. + * + * Since: 2.80 + */ +void +gi_base_info_unref (void *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + + g_return_if_fail (GI_IS_BASE_INFO (info)); + + g_assert (rinfo->ref_count > 0 && rinfo->ref_count != INVALID_REFCOUNT); + + if (g_atomic_ref_count_dec (&rinfo->ref_count)) + { + GI_BASE_INFO_GET_CLASS (info)->finalize (info); + g_type_free_instance ((GTypeInstance *) info); + } +} + +/** + * gi_base_info_get_info_type: + * @info: a #GIBaseInfo + * + * Obtain the info type of the `GIBaseInfo`. + * + * Returns: the info type of @info + * Since: 2.80 + */ +GIInfoType +gi_base_info_get_info_type (GIBaseInfo *info) +{ + return GI_BASE_INFO_GET_CLASS (info)->info_type; +} + +/** + * gi_base_info_get_name: + * @info: a #GIBaseInfo + * + * Obtain the name of the @info. + * + * What the name represents depends on the type of the + * @info. For instance for [class@GIRepository.FunctionInfo] it is the name of + * the function. + * + * Returns: (nullable): the name of @info or `NULL` if it lacks a name. + * Since: 2.80 + */ +const char * +gi_base_info_get_name (GIBaseInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + g_assert (rinfo->ref_count > 0); + switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) + { + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CALLBACK: + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + case GI_INFO_TYPE_OBJECT: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_UNION: + { + CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_VALUE: + { + ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_SIGNAL: + { + SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_PROPERTY: + { + PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_VFUNC: + { + VFuncBlob *blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_FIELD: + { + FieldBlob *blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + + case GI_INFO_TYPE_ARG: + { + ArgBlob *blob = (ArgBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->name); + } + break; + case GI_INFO_TYPE_UNRESOLVED: + { + GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; + + return unresolved->name; + } + break; + case GI_INFO_TYPE_TYPE: + return NULL; + default: ; + g_assert_not_reached (); + /* unnamed */ + } + + return NULL; +} + +/** + * gi_base_info_get_namespace: + * @info: a #GIBaseInfo + * + * Obtain the namespace of @info. + * + * Returns: the namespace + * Since: 2.80 + */ +const char * +gi_base_info_get_namespace (GIBaseInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*) info; + Header *header = (Header *)rinfo->typelib->data; + + g_assert (rinfo->ref_count > 0); + + if (gi_base_info_get_info_type (info) == GI_INFO_TYPE_UNRESOLVED) + { + GIUnresolvedInfo *unresolved = (GIUnresolvedInfo *)info; + + return unresolved->namespace; + } + + return gi_typelib_get_string (rinfo->typelib, header->namespace); +} + +/** + * gi_base_info_is_deprecated: + * @info: a #GIBaseInfo + * + * Obtain whether the @info is represents a metadata which is + * deprecated. + * + * Returns: `TRUE` if deprecated + * Since: 2.80 + */ +gboolean +gi_base_info_is_deprecated (GIBaseInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*) info; + switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) + { + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CALLBACK: + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + case GI_INFO_TYPE_OBJECT: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_CONSTANT: + { + CommonBlob *blob = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->deprecated; + } + break; + + case GI_INFO_TYPE_VALUE: + { + ValueBlob *blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->deprecated; + } + break; + + case GI_INFO_TYPE_SIGNAL: + { + SignalBlob *blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->deprecated; + } + break; + + case GI_INFO_TYPE_PROPERTY: + { + PropertyBlob *blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->deprecated; + } + break; + + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + default: ; + /* no deprecation flag for these */ + } + + return FALSE; +} + +/** + * gi_base_info_get_attribute: + * @info: a #GIBaseInfo + * @name: a freeform string naming an attribute + * + * Retrieve an arbitrary attribute associated with this node. + * + * Returns: (nullable): The value of the attribute, or `NULL` if no such + * attribute exists + * Since: 2.80 + */ +const char * +gi_base_info_get_attribute (GIBaseInfo *info, + const char *name) +{ + GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + const char *curname, *curvalue; + while (gi_base_info_iterate_attributes (info, &iter, &curname, &curvalue)) + { + if (strcmp (name, curname) == 0) + return (const char *) curvalue; + } + + return NULL; +} + +static int +cmp_attribute (const void *av, + const void *bv) +{ + const AttributeBlob *a = av; + const AttributeBlob *b = bv; + + if (a->offset < b->offset) + return -1; + else if (a->offset == b->offset) + return 0; + else + return 1; +} + +/*< private > + * _attribute_blob_find_first: + * @GIBaseInfo: A #GIBaseInfo. + * @blob_offset: The offset for the blob to find the first attribute for. + * + * Searches for the first #AttributeBlob for @blob_offset and returns + * it if found. + * + * Returns: (transfer none): A pointer to #AttributeBlob or `NULL` if not found. + * Since: 2.80 + */ +AttributeBlob * +_attribute_blob_find_first (GIBaseInfo *info, + uint32_t blob_offset) +{ + GIRealInfo *rinfo = (GIRealInfo *) info; + Header *header = (Header *)rinfo->typelib->data; + AttributeBlob blob, *first, *res, *previous; + + blob.offset = blob_offset; + + first = (AttributeBlob *) &rinfo->typelib->data[header->attributes]; + + res = bsearch (&blob, first, header->n_attributes, + header->attribute_blob_size, cmp_attribute); + + if (res == NULL) + return NULL; + + previous = res - 1; + while (previous >= first && previous->offset == blob_offset) + { + res = previous; + previous = res - 1; + } + + return res; +} + +/** + * gi_base_info_iterate_attributes: + * @info: a #GIBaseInfo + * @iterator: (inout): a [type@GIRepository.AttributeIter] structure, must be + * initialized; see below + * @name: (out) (transfer none): Returned name, must not be freed + * @value: (out) (transfer none): Returned name, must not be freed + * + * Iterate over all attributes associated with this node. + * + * The iterator structure is typically stack allocated, and must have its first + * member initialized to `NULL`. Attributes are arbitrary namespaced key–value + * pairs which can be attached to almost any item. They are intended for use + * by software higher in the toolchain than bindings, and are distinct from + * normal GIR annotations. + * + * Both the @name and @value should be treated as constants + * and must not be freed. + * + * ```c + * void + * print_attributes (GIBaseInfo *info) + * { + * GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + * const char *name; + * const char *value; + * while (gi_base_info_iterate_attributes (info, &iter, &name, &value)) + * { + * g_print ("attribute name: %s value: %s", name, value); + * } + * } + * ``` + * + * Returns: `TRUE` if there are more attributes + * Since: 2.80 + */ +gboolean +gi_base_info_iterate_attributes (GIBaseInfo *info, + GIAttributeIter *iterator, + const char **name, + const char **value) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + AttributeBlob *next, *after; + + after = (AttributeBlob *) &rinfo->typelib->data[header->attributes + + header->n_attributes * header->attribute_blob_size]; + + if (iterator->data != NULL) + next = (AttributeBlob *) iterator->data; + else + next = _attribute_blob_find_first (info, rinfo->offset); + + if (next == NULL || next->offset != rinfo->offset || next >= after) + return FALSE; + + *name = gi_typelib_get_string (rinfo->typelib, next->name); + *value = gi_typelib_get_string (rinfo->typelib, next->value); + iterator->data = next + 1; + + return TRUE; +} + +/** + * gi_base_info_get_container: + * @info: a #GIBaseInfo + * + * Obtain the container of the @info. + * + * The container is the parent `GIBaseInfo`. For instance, the parent of a + * [class@GIRepository.FunctionInfo] is an [class@GIRepository.ObjectInfo] or + * [class@GIRepository.InterfaceInfo]. + * + * Returns: (transfer none): the container + * Since: 2.80 + */ +GIBaseInfo * +gi_base_info_get_container (GIBaseInfo *info) +{ + return ((GIRealInfo*)info)->container; +} + +/** + * gi_base_info_get_typelib: + * @info: a #GIBaseInfo + * + * Obtain the typelib this @info belongs to + * + * Returns: (transfer none): the typelib + * Since: 2.80 + */ +GITypelib * +gi_base_info_get_typelib (GIBaseInfo *info) +{ + return ((GIRealInfo*)info)->typelib; +} + +/** + * gi_base_info_equal: + * @info1: a #GIBaseInfo + * @info2: a #GIBaseInfo + * + * Compare two `GIBaseInfo`s. + * + * Using pointer comparison is not practical since many functions return + * different instances of `GIBaseInfo` that refers to the same part of the + * TypeLib; use this function instead to do `GIBaseInfo` comparisons. + * + * Returns: `TRUE` if and only if @info1 equals @info2. + * Since: 2.80 + */ +gboolean +gi_base_info_equal (GIBaseInfo *info1, GIBaseInfo *info2) +{ + /* Compare the TypeLib pointers, which are mmapped. */ + GIRealInfo *rinfo1 = (GIRealInfo*)info1; + GIRealInfo *rinfo2 = (GIRealInfo*)info2; + return rinfo1->typelib->data + rinfo1->offset == rinfo2->typelib->data + rinfo2->offset; +} diff --git a/girepository/gibaseinfo.h b/girepository/gibaseinfo.h new file mode 100644 index 0000000..4f87b9f --- /dev/null +++ b/girepository/gibaseinfo.h @@ -0,0 +1,129 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: GIBaseInfo + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include +#include + +G_BEGIN_DECLS + +/** + * GIAttributeIter: + * + * An opaque structure used to iterate over attributes + * in a [class@GIRepository.BaseInfo] struct. + * + * Since: 2.80 + */ +typedef struct { + /*< private >*/ + void *data; + void *_dummy[4]; +} GIAttributeIter; + +/** + * GI_ATTRIBUTE_ITER_INIT: + * + * Initialise a stack-allocated [type@GIRepository.AttributeIter] to a value + * suitable for passing to the first call to an ‘iterate’ function. + * + * Since: 2.80 + */ +#define GI_ATTRIBUTE_ITER_INIT { NULL, { NULL, } } + +#define GI_TYPE_BASE_INFO (gi_base_info_get_type ()) + +/** + * GI_BASE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.BaseInfo] or derived pointer into a + * `(GIBaseInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_BASE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_BASE_INFO, GIBaseInfo)) + +/** + * GI_IS_BASE_INFO: + * @info: Instance to check for being a `GI_TYPE_BASE_INFO`. + * + * Checks whether a valid [type@GObject.TypeInstance] pointer is of type + * `GI_TYPE_BASE_INFO` (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_BASE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_BASE_INFO)) + +GI_AVAILABLE_IN_ALL +GType gi_base_info_get_type (void) G_GNUC_CONST; + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_base_info_ref (void *info); + +GI_AVAILABLE_IN_ALL +void gi_base_info_unref (void *info); + +GI_AVAILABLE_IN_ALL +void gi_base_info_clear (void *info); + +GI_AVAILABLE_IN_ALL +const char * gi_base_info_get_name (GIBaseInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_base_info_get_namespace (GIBaseInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_base_info_is_deprecated (GIBaseInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_base_info_get_attribute (GIBaseInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +gboolean gi_base_info_iterate_attributes (GIBaseInfo *info, + GIAttributeIter *iterator, + const char **name, + const char **value); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_base_info_get_container (GIBaseInfo *info); + +GI_AVAILABLE_IN_ALL +GITypelib * gi_base_info_get_typelib (GIBaseInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_base_info_equal (GIBaseInfo *info1, + GIBaseInfo *info2); + +G_END_DECLS diff --git a/girepository/gicallableinfo.c b/girepository/gicallableinfo.c new file mode 100644 index 0000000..49430e9 --- /dev/null +++ b/girepository/gicallableinfo.c @@ -0,0 +1,841 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "girffi.h" +#include "gicallableinfo.h" + +/* GICallableInfo functions */ + +/** + * GICallableInfo: + * + * `GICallableInfo` represents an entity which is callable. + * + * Examples of callable are: + * + * - functions ([class@GIRepository.FunctionInfo]) + * - virtual functions ([class@GIRepository.VFuncInfo]) + * - callbacks ([class@GIRepository.CallbackInfo]). + * + * A callable has a list of arguments ([class@GIRepository.ArgInfo]), a return + * type, direction and a flag which decides if it returns `NULL`. + * + * Since: 2.80 + */ + +static uint32_t +signature_offset (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + int sigoff = -1; + + switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) + { + case GI_INFO_TYPE_FUNCTION: + sigoff = G_STRUCT_OFFSET (FunctionBlob, signature); + break; + case GI_INFO_TYPE_VFUNC: + sigoff = G_STRUCT_OFFSET (VFuncBlob, signature); + break; + case GI_INFO_TYPE_CALLBACK: + sigoff = G_STRUCT_OFFSET (CallbackBlob, signature); + break; + case GI_INFO_TYPE_SIGNAL: + sigoff = G_STRUCT_OFFSET (SignalBlob, signature); + break; + default: + g_assert_not_reached (); + } + if (sigoff >= 0) + return *(uint32_t *)&rinfo->typelib->data[rinfo->offset + sigoff]; + return 0; +} + +/** + * gi_callable_info_can_throw_gerror: + * @info: a #GICallableInfo + * + * Whether the callable can throw a [type@GLib.Error] + * + * Returns: `TRUE` if this `GICallableInfo` can throw a [type@GLib.Error] + * Since: 2.80 + */ +gboolean +gi_callable_info_can_throw_gerror (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + SignatureBlob *signature; + + signature = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + if (signature->throws) + return TRUE; + + /* Functions and VFuncs store "throws" in their own blobs. + * This info was additionally added to the SignatureBlob + * to support the other callables. For Functions and VFuncs, + * also check their legacy flag for compatibility. + */ + switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) { + case GI_INFO_TYPE_FUNCTION: + { + FunctionBlob *blob; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + return blob->throws; + } + case GI_INFO_TYPE_VFUNC: + { + VFuncBlob *blob; + blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + return blob->throws; + } + case GI_INFO_TYPE_CALLBACK: + case GI_INFO_TYPE_SIGNAL: + return FALSE; + default: + g_assert_not_reached (); + } +} + +/** + * gi_callable_info_is_method: + * @info: a #GICallableInfo + * + * Determines if the callable info is a method. + * + * For [class@GIRepository.VFuncInfo]s, [class@GIRepository.CallbackInfo]s, and + * [class@GIRepository.SignalInfo]s, this is always true. Otherwise, this looks + * at the `GI_FUNCTION_IS_METHOD` flag on the [class@GIRepository.FunctionInfo]. + * + * Concretely, this function returns whether + * [method@GIRepository.CallableInfo.get_n_args] matches the number of arguments + * in the raw C method. For methods, there is one more C argument than is + * exposed by introspection: the `self` or `this` object. + * + * Returns: `TRUE` if @info is a method, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_callable_info_is_method (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*)info; + switch (gi_base_info_get_info_type ((GIBaseInfo *) info)) { + case GI_INFO_TYPE_FUNCTION: + { + FunctionBlob *blob; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + return (!blob->constructor && !blob->is_static); + } + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_SIGNAL: + return TRUE; + case GI_INFO_TYPE_CALLBACK: + return FALSE; + default: + g_assert_not_reached (); + } +} + +/** + * gi_callable_info_get_return_type: + * @info: a #GICallableInfo + * + * Obtain the return type of a callable item as a [class@GIRepository.TypeInfo]. + * + * If the callable doesn’t return anything, a [class@GIRepository.TypeInfo] of + * type [enum@GIRepository.TypeTag.VOID] will be returned. + * + * Returns: (transfer full): the [class@GIRepository.TypeInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GITypeInfo * +gi_callable_info_get_return_type (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + uint32_t offset; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), NULL); + + offset = signature_offset (info); + + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, offset); +} + +/** + * gi_callable_info_load_return_type: + * @info: a #GICallableInfo + * @type: (out caller-allocates): Initialized with return type of @info + * + * Obtain information about a return value of callable; this + * function is a variant of [method@GIRepository.CallableInfo.get_return_type] + * designed for stack allocation. + * + * The initialized @type must not be referenced after @info is deallocated. + * + * Once you are done with @type, it must be cleared using + * [method@GIRepository.BaseInfo.clear]. + * + * Since: 2.80 + */ +void +gi_callable_info_load_return_type (GICallableInfo *info, + GITypeInfo *type) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + uint32_t offset; + + g_return_if_fail (info != NULL); + g_return_if_fail (GI_IS_CALLABLE_INFO (info)); + + offset = signature_offset (info); + + gi_type_info_init (type, (GIBaseInfo*)info, rinfo->typelib, offset); +} + +/** + * gi_callable_info_may_return_null: + * @info: a #GICallableInfo + * + * See if a callable could return `NULL`. + * + * Returns: `TRUE` if callable could return `NULL` + * Since: 2.80 + */ +gboolean +gi_callable_info_may_return_null (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SignatureBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), FALSE); + + blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + return blob->may_return_null; +} + +/** + * gi_callable_info_skip_return: + * @info: a #GICallableInfo + * + * See if a callable’s return value is only useful in C. + * + * Returns: `TRUE` if return value is only useful in C. + * Since: 2.80 + */ +gboolean +gi_callable_info_skip_return (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SignatureBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), FALSE); + + blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + return blob->skip_return; +} + +/** + * gi_callable_info_get_caller_owns: + * @info: a #GICallableInfo + * + * See whether the caller owns the return value of this callable. + * + * [type@GIRepository.Transfer] contains a list of possible transfer values. + * + * Returns: the transfer mode for the return value of the callable + * Since: 2.80 + */ +GITransfer +gi_callable_info_get_caller_owns (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*) info; + SignatureBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), -1); + + blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + if (blob->caller_owns_return_value) + return GI_TRANSFER_EVERYTHING; + else if (blob->caller_owns_return_container) + return GI_TRANSFER_CONTAINER; + else + return GI_TRANSFER_NOTHING; +} + +/** + * gi_callable_info_get_instance_ownership_transfer: + * @info: a #GICallableInfo + * + * Obtains the ownership transfer for the instance argument. + * + * [type@GIRepository.Transfer] contains a list of possible transfer values. + * + * Returns: the transfer mode of the instance argument + * Since: 2.80 + */ +GITransfer +gi_callable_info_get_instance_ownership_transfer (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo*) info; + SignatureBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), -1); + + blob = (SignatureBlob *)&rinfo->typelib->data[signature_offset (info)]; + + if (blob->instance_transfer_ownership) + return GI_TRANSFER_EVERYTHING; + else + return GI_TRANSFER_NOTHING; +} + +/** + * gi_callable_info_get_n_args: + * @info: a #GICallableInfo + * + * Obtain the number of arguments (both ‘in’ and ‘out’) for this callable. + * + * Returns: The number of arguments this callable expects. + * Since: 2.80 + */ +unsigned int +gi_callable_info_get_n_args (GICallableInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + uint32_t offset; + SignatureBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), -1); + + offset = signature_offset (info); + blob = (SignatureBlob *)&rinfo->typelib->data[offset]; + + return blob->n_arguments; +} + +/** + * gi_callable_info_get_arg: + * @info: a #GICallableInfo + * @n: the argument index to fetch + * + * Obtain information about a particular argument of this callable. + * + * Returns: (transfer full): the [class@GIRepository.ArgInfo]. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIArgInfo * +gi_callable_info_get_arg (GICallableInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + uint32_t offset; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_CALLABLE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + offset = signature_offset (info); + header = (Header *)rinfo->typelib->data; + + return (GIArgInfo *) gi_base_info_new (GI_INFO_TYPE_ARG, (GIBaseInfo*)info, rinfo->typelib, + offset + header->signature_blob_size + n * header->arg_blob_size); +} + +/** + * gi_callable_info_load_arg: + * @info: a #GICallableInfo + * @n: the argument index to fetch + * @arg: (out caller-allocates): Initialize with argument number @n + * + * Obtain information about a particular argument of this callable; this + * function is a variant of [method@GIRepository.CallableInfo.get_arg] designed + * for stack allocation. + * + * The initialized @arg must not be referenced after @info is deallocated. + * + * Once you are done with @arg, it must be cleared using + * [method@GIRepository.BaseInfo.clear]. + * + * Since: 2.80 + */ +void +gi_callable_info_load_arg (GICallableInfo *info, + unsigned int n, + GIArgInfo *arg) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + uint32_t offset; + + g_return_if_fail (info != NULL); + g_return_if_fail (GI_IS_CALLABLE_INFO (info)); + g_return_if_fail (n <= G_MAXUINT16); + + offset = signature_offset (info); + header = (Header *)rinfo->typelib->data; + + gi_info_init ((GIRealInfo*)arg, GI_TYPE_ARG_INFO, rinfo->repository, (GIBaseInfo*)info, rinfo->typelib, + offset + header->signature_blob_size + n * header->arg_blob_size); +} + +/** + * gi_callable_info_get_return_attribute: + * @info: a #GICallableInfo + * @name: a freeform string naming an attribute + * + * Retrieve an arbitrary attribute associated with the return value. + * + * Returns: (nullable): The value of the attribute, or `NULL` if no such + * attribute exists + * Since: 2.80 + */ +const char * +gi_callable_info_get_return_attribute (GICallableInfo *info, + const char *name) +{ + GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + const char *curname, *curvalue; + while (gi_callable_info_iterate_return_attributes (info, &iter, &curname, &curvalue)) + { + if (g_strcmp0 (name, curname) == 0) + return (const char*) curvalue; + } + + return NULL; +} + +/** + * gi_callable_info_iterate_return_attributes: + * @info: a #GICallableInfo + * @iterator: (inout): a [type@GIRepository.AttributeIter] structure, must be + * initialized; see below + * @name: (out) (transfer none): Returned name, must not be freed + * @value: (out) (transfer none): Returned name, must not be freed + * + * Iterate over all attributes associated with the return value. + * + * The iterator structure is typically stack allocated, and must have its + * first member initialized to `NULL`. + * + * Both the @name and @value should be treated as constants + * and must not be freed. + * + * See [method@GIRepository.BaseInfo.iterate_attributes] for an example of how + * to use a similar API. + * + * Returns: `TRUE` if there are more attributes + * Since: 2.80 + */ +gboolean +gi_callable_info_iterate_return_attributes (GICallableInfo *info, + GIAttributeIter *iterator, + const char **name, + const char **value) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + AttributeBlob *next, *after; + uint32_t blob_offset; + + after = (AttributeBlob *) &rinfo->typelib->data[header->attributes + + header->n_attributes * header->attribute_blob_size]; + + blob_offset = signature_offset (info); + + if (iterator->data != NULL) + next = (AttributeBlob *) iterator->data; + else + next = _attribute_blob_find_first ((GIBaseInfo *) info, blob_offset); + + if (next == NULL || next->offset != blob_offset || next >= after) + return FALSE; + + *name = gi_typelib_get_string (rinfo->typelib, next->name); + *value = gi_typelib_get_string (rinfo->typelib, next->value); + iterator->data = next + 1; + + return TRUE; +} + +/** + * gi_type_tag_extract_ffi_return_value: + * @return_tag: [type@GIRepository.TypeTag] of the return value + * @interface_type: [type@GObject.Type] of the underlying interface type + * @ffi_value: pointer to [type@GIRepository.FFIReturnValue] union containing + * the return value from `ffi_call()` + * @arg: (out caller-allocates): pointer to an allocated + * [class@GIRepository.Argument] + * + * Extract the correct bits from an `ffi_arg` return value into + * [class@GIRepository.Argument]. + * + * See: https://bugzilla.gnome.org/show_bug.cgi?id=665152 + * + * Also see [`ffi_call()`](man:ffi_call(3)): the storage requirements for return + * values are ‘special’. + * + * The @interface_type argument only applies if @return_tag is + * `GI_TYPE_TAG_INTERFACE`. Otherwise it is ignored. + * + * Since: 2.80 + */ +void +gi_type_tag_extract_ffi_return_value (GITypeTag return_tag, + GType interface_type, + GIFFIReturnValue *ffi_value, + GIArgument *arg) +{ + switch (return_tag) { + case GI_TYPE_TAG_INT8: + arg->v_int8 = (int8_t) ffi_value->v_long; + break; + case GI_TYPE_TAG_UINT8: + arg->v_uint8 = (uint8_t) ffi_value->v_ulong; + break; + case GI_TYPE_TAG_INT16: + arg->v_int16 = (int16_t) ffi_value->v_long; + break; + case GI_TYPE_TAG_UINT16: + arg->v_uint16 = (uint16_t) ffi_value->v_ulong; + break; + case GI_TYPE_TAG_INT32: + arg->v_int32 = (int32_t) ffi_value->v_long; + break; + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_BOOLEAN: + case GI_TYPE_TAG_UNICHAR: + arg->v_uint32 = (uint32_t) ffi_value->v_ulong; + break; + case GI_TYPE_TAG_INT64: + arg->v_int64 = (int64_t) ffi_value->v_int64; + break; + case GI_TYPE_TAG_UINT64: + arg->v_uint64 = (uint64_t) ffi_value->v_uint64; + break; + case GI_TYPE_TAG_FLOAT: + arg->v_float = ffi_value->v_float; + break; + case GI_TYPE_TAG_DOUBLE: + arg->v_double = ffi_value->v_double; + break; + case GI_TYPE_TAG_INTERFACE: + if (interface_type == GI_TYPE_ENUM_INFO || + interface_type == GI_TYPE_FLAGS_INFO) + arg->v_int32 = (int32_t) ffi_value->v_long; + else + arg->v_pointer = (void *) ffi_value->v_pointer; + break; + default: + arg->v_pointer = (void *) ffi_value->v_pointer; + break; + } +} + +/** + * gi_type_info_extract_ffi_return_value: + * @return_info: [type@GIRepository.TypeInfo] describing the return type + * @ffi_value: pointer to [type@GIRepository.FFIReturnValue] union containing + * the return value from `ffi_call()` + * @arg: (out caller-allocates): pointer to an allocated + * [class@GIRepository.Argument] + * + * Extract the correct bits from an `ffi_arg` return value into + * [class@GIRepository.Argument]. + * + * See: https://bugzilla.gnome.org/show_bug.cgi?id=665152 + * + * Also see [`ffi_call()`](man:ffi_call(3)): the storage requirements for return + * values are ‘special’. + * + * Since: 2.80 + */ +void +gi_type_info_extract_ffi_return_value (GITypeInfo *return_info, + GIFFIReturnValue *ffi_value, + GIArgument *arg) +{ + GITypeTag return_tag = gi_type_info_get_tag (return_info); + GType interface_type = G_TYPE_INVALID; + + if (return_tag == GI_TYPE_TAG_INTERFACE) + { + GIBaseInfo *interface_info = gi_type_info_get_interface (return_info); + interface_type = G_TYPE_FROM_INSTANCE (interface_info); + gi_base_info_unref (interface_info); + } + + gi_type_tag_extract_ffi_return_value (return_tag, interface_type, + ffi_value, arg); +} + +/** + * gi_callable_info_invoke: + * @info: a #GICallableInfo + * @function: function pointer to call + * @in_args: (array length=n_in_args): array of ‘in’ arguments + * @n_in_args: number of arguments in @in_args + * @out_args: (array length=n_out_args): array of ‘out’ arguments allocated by + * the caller, to be populated with outputted values + * @n_out_args: number of arguments in @out_args + * @return_value: (out caller-allocates) (not optional) (nullable): return + * location for the return value from the callable; `NULL` may be returned if + * the callable returns that + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Invoke the given `GICallableInfo` by calling the given @function pointer. + * + * The set of arguments passed to @function will be constructed according to the + * introspected type of the `GICallableInfo`, using @in_args, @out_args + * and @error. + * + * Returns: `TRUE` if the callable was executed successfully and didn’t throw + * a [type@GLib.Error]; `FALSE` if @error is set + * Since: 2.80 + */ +gboolean +gi_callable_info_invoke (GICallableInfo *info, + void *function, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error) +{ + ffi_cif cif; + ffi_type *rtype; + ffi_type **atypes; + GITypeInfo *tinfo; + GITypeInfo *rinfo; + GITypeTag rtag; + GIArgInfo *ainfo; + size_t n_args, n_invoke_args, in_pos, out_pos, i; + void **args; + gboolean success = FALSE; + GError *local_error = NULL; + void *error_address = &local_error; + GIFFIReturnValue ffi_return_value; + void *return_value_p; /* Will point inside the union return_value */ + gboolean is_method, throws; + + rinfo = gi_callable_info_get_return_type ((GICallableInfo *)info); + rtype = gi_type_info_get_ffi_type (rinfo); + rtag = gi_type_info_get_tag(rinfo); + is_method = gi_callable_info_is_method (info); + throws = gi_callable_info_can_throw_gerror (info); + + in_pos = 0; + out_pos = 0; + + n_args = gi_callable_info_get_n_args ((GICallableInfo *)info); + if (is_method) + { + if (n_in_args == 0) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too few \"in\" arguments (handling this)"); + goto out; + } + n_invoke_args = n_args+1; + in_pos++; + } + else + n_invoke_args = n_args; + + if (throws) + /* Add an argument for the GError */ + n_invoke_args ++; + + atypes = g_alloca (sizeof (ffi_type*) * n_invoke_args); + args = g_alloca (sizeof (void *) * n_invoke_args); + + if (is_method) + { + atypes[0] = &ffi_type_pointer; + args[0] = (void *) &in_args[0]; + } + for (i = 0; i < n_args; i++) + { + int offset = (is_method ? 1 : 0); + ainfo = gi_callable_info_get_arg ((GICallableInfo *)info, i); + switch (gi_arg_info_get_direction (ainfo)) + { + case GI_DIRECTION_IN: + tinfo = gi_arg_info_get_type_info (ainfo); + atypes[i+offset] = gi_type_info_get_ffi_type (tinfo); + gi_base_info_unref ((GIBaseInfo *)ainfo); + gi_base_info_unref ((GIBaseInfo *)tinfo); + + if (in_pos >= n_in_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too few \"in\" arguments (handling in)"); + goto out; + } + + args[i+offset] = (void *)&in_args[in_pos]; + in_pos++; + + break; + case GI_DIRECTION_OUT: + atypes[i+offset] = &ffi_type_pointer; + gi_base_info_unref ((GIBaseInfo *)ainfo); + + if (out_pos >= n_out_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too few \"out\" arguments (handling out)"); + goto out; + } + + args[i+offset] = (void *)&out_args[out_pos]; + out_pos++; + break; + case GI_DIRECTION_INOUT: + atypes[i+offset] = &ffi_type_pointer; + gi_base_info_unref ((GIBaseInfo *)ainfo); + + if (in_pos >= n_in_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too few \"in\" arguments (handling inout)"); + goto out; + } + + if (out_pos >= n_out_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too few \"out\" arguments (handling inout)"); + goto out; + } + + args[i+offset] = (void *)&in_args[in_pos]; + in_pos++; + out_pos++; + break; + default: + gi_base_info_unref ((GIBaseInfo *)ainfo); + g_assert_not_reached (); + } + } + + if (throws) + { + args[n_invoke_args - 1] = &error_address; + atypes[n_invoke_args - 1] = &ffi_type_pointer; + } + + if (in_pos < n_in_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too many \"in\" arguments (at end)"); + goto out; + } + if (out_pos < n_out_args) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH, + "Too many \"out\" arguments (at end)"); + goto out; + } + + if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, n_invoke_args, rtype, atypes) != FFI_OK) + goto out; + + g_return_val_if_fail (return_value, FALSE); + /* See comment for GIFFIReturnValue above */ + switch (rtag) + { + case GI_TYPE_TAG_FLOAT: + return_value_p = &ffi_return_value.v_float; + break; + case GI_TYPE_TAG_DOUBLE: + return_value_p = &ffi_return_value.v_double; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + return_value_p = &ffi_return_value.v_uint64; + break; + default: + return_value_p = &ffi_return_value.v_long; + } + ffi_call (&cif, function, return_value_p, args); + + if (local_error) + { + g_propagate_error (error, local_error); + success = FALSE; + } + else + { + gi_type_info_extract_ffi_return_value (rinfo, &ffi_return_value, return_value); + success = TRUE; + } + out: + gi_base_info_unref ((GIBaseInfo *)rinfo); + return success; +} + +void +gi_callable_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_CALLABLE; +} diff --git a/girepository/gicallableinfo.h b/girepository/gicallableinfo.h new file mode 100644 index 0000000..293f521 --- /dev/null +++ b/girepository/gicallableinfo.h @@ -0,0 +1,119 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_CALLABLE_INFO (gi_callable_info_get_type ()) + +/** + * GI_CALLABLE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.CallableInfo] or derived pointer into a + * `(GICallableInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_CALLABLE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_CALLABLE_INFO, GICallableInfo)) + +/** + * GI_IS_CALLABLE_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.CallableInfo] or derived from it. + * + * Since: 2.80 + */ +#define GI_IS_CALLABLE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_CALLABLE_INFO)) + + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_is_method (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_can_throw_gerror (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_callable_info_get_return_type (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +void gi_callable_info_load_return_type (GICallableInfo *info, + GITypeInfo *type); + +GI_AVAILABLE_IN_ALL +const char * gi_callable_info_get_return_attribute (GICallableInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_iterate_return_attributes (GICallableInfo *info, + GIAttributeIter *iterator, + const char **name, + const char **value); + +GI_AVAILABLE_IN_ALL +GITransfer gi_callable_info_get_caller_owns (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_may_return_null (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_skip_return (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +unsigned int gi_callable_info_get_n_args (GICallableInfo *info); + +GI_AVAILABLE_IN_ALL +GIArgInfo * gi_callable_info_get_arg (GICallableInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +void gi_callable_info_load_arg (GICallableInfo *info, + unsigned int n, + GIArgInfo *arg); + +GI_AVAILABLE_IN_ALL +gboolean gi_callable_info_invoke (GICallableInfo *info, + void *function, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error); + +GI_AVAILABLE_IN_ALL +GITransfer gi_callable_info_get_instance_ownership_transfer (GICallableInfo *info); + +G_END_DECLS diff --git a/girepository/gicallbackinfo.c b/girepository/gicallbackinfo.c new file mode 100644 index 0000000..8fa4688 --- /dev/null +++ b/girepository/gicallbackinfo.c @@ -0,0 +1,52 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright 2023 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gicallbackinfo.h" + +/** + * GICallbackInfo: + * + * `GICallbackInfo` represents a callback. + * + * Since: 2.80 + */ + +void +gi_callback_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_CALLBACK; +} diff --git a/girepository/gicallbackinfo.h b/girepository/gicallbackinfo.h new file mode 100644 index 0000000..8f55902 --- /dev/null +++ b/girepository/gicallbackinfo.h @@ -0,0 +1,60 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable + * + * Copyright 2023 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_CALLBACK_INFO (gi_callback_info_get_type ()) + +/** + * GI_CALLBACK_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.CallbackInfo] or derived pointer into a + * `(GICallbackInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_CALLBACK_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_CALLBACK_INFO, GICallbackInfo)) + +/** + * GI_IS_CALLBACK_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.CallbackInfo] or derived from it. + * + * Since: 2.80 + */ +#define GI_IS_CALLBACK_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_CALLBACK_INFO)) + +G_END_DECLS diff --git a/girepository/giconstantinfo.c b/girepository/giconstantinfo.c new file mode 100644 index 0000000..efe7d85 --- /dev/null +++ b/girepository/giconstantinfo.c @@ -0,0 +1,193 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Constant implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include // memcpy + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giconstantinfo.h" + +/** + * GIConstantInfo: + * + * `GIConstantInfo` represents a constant. + * + * A constant has a type associated – which can be obtained by calling + * [method@GIRepository.ConstantInfo.get_type_info] – and a value – which can be + * obtained by calling [method@GIRepository.ConstantInfo.get_value]. + * + * Since: 2.80 + */ + +/** + * gi_constant_info_get_type_info: + * @info: a #GIConstantInfo + * + * Obtain the type of the constant as a [class@GIRepository.TypeInfo]. + * + * Returns: (transfer full): The [class@GIRepository.TypeInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GITypeInfo * +gi_constant_info_get_type_info (GIConstantInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_CONSTANT_INFO (info), NULL); + + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 8); +} + +#define DO_ALIGNED_COPY(dest_addr, src_addr, type) \ + memcpy((dest_addr), (src_addr), sizeof(type)) + +/** + * gi_constant_info_free_value: (skip) + * @info: a #GIConstantInfo + * @value: the argument + * + * Free the value returned from [method@GIRepository.ConstantInfo.get_value]. + * + * Since: 2.80 + */ +void +gi_constant_info_free_value (GIConstantInfo *info, + GIArgument *value) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ConstantBlob *blob; + + g_return_if_fail (info != NULL); + g_return_if_fail (GI_IS_CONSTANT_INFO (info)); + + blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset]; + + /* FIXME non-basic types ? */ + if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0) + { + if (blob->type.flags.pointer) + g_free (value->v_pointer); + } +} + +/** + * gi_constant_info_get_value: (skip) + * @info: a #GIConstantInfo + * @value: (out caller-allocates): an argument + * + * Obtain the value associated with the `GIConstantInfo` and store it in the + * @value parameter. + * + * @argument needs to be allocated before passing it in. + * + * The size of the constant value (in bytes) stored in @argument will be + * returned. + * + * Free the value with [method@GIRepository.ConstantInfo.free_value]. + * + * Returns: size of the constant, in bytes + * Since: 2.80 + */ +size_t +gi_constant_info_get_value (GIConstantInfo *info, + GIArgument *value) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ConstantBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_CONSTANT_INFO (info), 0); + + blob = (ConstantBlob *)&rinfo->typelib->data[rinfo->offset]; + + /* FIXME non-basic types ? */ + if (blob->type.flags.reserved == 0 && blob->type.flags.reserved2 == 0) + { + if (blob->type.flags.pointer) + { + size_t blob_size = blob->size; + + value->v_pointer = g_memdup2 (&rinfo->typelib->data[blob->offset], blob_size); + } + else + { + switch (blob->type.flags.tag) + { + case GI_TYPE_TAG_BOOLEAN: + value->v_boolean = *(gboolean*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT8: + value->v_int8 = *(int8_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT8: + value->v_uint8 = *(uint8_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT16: + value->v_int16 = *(int16_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT16: + value->v_uint16 = *(uint16_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT32: + value->v_int32 = *(int32_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_UINT32: + value->v_uint32 = *(uint32_t*)&rinfo->typelib->data[blob->offset]; + break; + case GI_TYPE_TAG_INT64: + DO_ALIGNED_COPY (&value->v_int64, &rinfo->typelib->data[blob->offset], int64_t); + break; + case GI_TYPE_TAG_UINT64: + DO_ALIGNED_COPY (&value->v_uint64, &rinfo->typelib->data[blob->offset], uint64_t); + break; + case GI_TYPE_TAG_FLOAT: + DO_ALIGNED_COPY (&value->v_float, &rinfo->typelib->data[blob->offset], float); + break; + case GI_TYPE_TAG_DOUBLE: + DO_ALIGNED_COPY (&value->v_double, &rinfo->typelib->data[blob->offset], double); + break; + default: + g_assert_not_reached (); + } + } + } + + return blob->size; +} + +void +gi_constant_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_CONSTANT; +} diff --git a/girepository/giconstantinfo.h b/girepository/giconstantinfo.h new file mode 100644 index 0000000..eda6989 --- /dev/null +++ b/girepository/giconstantinfo.h @@ -0,0 +1,72 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Constant + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_CONSTANT_INFO (gi_constant_info_get_type ()) + +/** + * GI_CONSTANT_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.ConstantInfo] or derived pointer into a + * `(GIConstantInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_CONSTANT_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_CONSTANT_INFO, GIConstantInfo)) + +/** + * GI_IS_CONSTANT_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.ConstantInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_CONSTANT_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_CONSTANT_INFO)) + + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_constant_info_get_type_info (GIConstantInfo *info); + +GI_AVAILABLE_IN_ALL +void gi_constant_info_free_value (GIConstantInfo *info, + GIArgument *value); + +GI_AVAILABLE_IN_ALL +size_t gi_constant_info_get_value (GIConstantInfo *info, + GIArgument *value); +G_END_DECLS diff --git a/girepository/gienuminfo.c b/girepository/gienuminfo.c new file mode 100644 index 0000000..e73b1a6 --- /dev/null +++ b/girepository/gienuminfo.c @@ -0,0 +1,223 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Enum implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gienuminfo.h" + +/** + * GIEnumInfo: + * + * A `GIEnumInfo` represents an enumeration. + * + * The `GIEnumInfo` contains a set of values (each a + * [class@GIRepository.ValueInfo]) and a type. + * + * The [class@GIRepository.ValueInfo] for a value is fetched by calling + * [method@GIRepository.EnumInfo.get_value] on a `GIEnumInfo`. + * + * Since: 2.80 + */ + +/** + * gi_enum_info_get_n_values: + * @info: a #GIEnumInfo + * + * Obtain the number of values this enumeration contains. + * + * Returns: the number of enumeration values + * Since: 2.80 + */ +unsigned int +gi_enum_info_get_n_values (GIEnumInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + EnumBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), 0); + + blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_values; +} + +/** + * gi_enum_info_get_error_domain: + * @info: a #GIEnumInfo + * + * Obtain the string form of the quark for the error domain associated with + * this enum, if any. + * + * Returns: (transfer none) (nullable): the string form of the error domain + * associated with this enum, or `NULL`. + * Since: 2.80 + */ +const char * +gi_enum_info_get_error_domain (GIEnumInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + EnumBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), 0); + + blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->error_domain) + return gi_typelib_get_string (rinfo->typelib, blob->error_domain); + else + return NULL; +} + +/** + * gi_enum_info_get_value: + * @info: a #GIEnumInfo + * @n: index of value to fetch + * + * Obtain a value for this enumeration. + * + * Returns: (transfer full): the enumeration value, free the struct with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIValueInfo * +gi_enum_info_get_value (GIEnumInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + size_t offset; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + offset = rinfo->offset + header->enum_blob_size + + n * header->value_blob_size; + + return (GIValueInfo *) gi_base_info_new (GI_INFO_TYPE_VALUE, (GIBaseInfo*)info, rinfo->typelib, offset); +} + +/** + * gi_enum_info_get_n_methods: + * @info: a #GIEnumInfo + * + * Obtain the number of methods that this enum type has. + * + * Returns: number of methods + * Since: 2.80 + */ +unsigned int +gi_enum_info_get_n_methods (GIEnumInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + EnumBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), 0); + + blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; +} + +/** + * gi_enum_info_get_method: + * @info: a #GIEnumInfo + * @n: index of method to get + * + * Obtain an enum type method at index @n. + * + * Returns: (transfer full): the [class@GIRepository.FunctionInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_enum_info_get_method (GIEnumInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + EnumBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->enum_blob_size + + blob->n_values * header->value_blob_size + + n * header->function_blob_size; + + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_enum_info_get_storage_type: + * @info: a #GIEnumInfo + * + * Obtain the tag of the type used for the enum in the C ABI. This will + * will be a signed or unsigned integral type. + * + * Note that in the current implementation the width of the type is + * computed correctly, but the signed or unsigned nature of the type + * may not match the sign of the type used by the C compiler. + * + * Returns: the storage type for the enumeration + * Since: 2.80 + */ +GITypeTag +gi_enum_info_get_storage_type (GIEnumInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + EnumBlob *blob; + + g_return_val_if_fail (info != NULL, GI_TYPE_TAG_BOOLEAN); + g_return_val_if_fail (GI_IS_ENUM_INFO (info), GI_TYPE_TAG_BOOLEAN); + + blob = (EnumBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->storage_type; +} + +void +gi_enum_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_ENUM; +} diff --git a/girepository/gienuminfo.h b/girepository/gienuminfo.h new file mode 100644 index 0000000..fcd2205 --- /dev/null +++ b/girepository/gienuminfo.h @@ -0,0 +1,82 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Enum and Enum values + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_ENUM_INFO (gi_enum_info_get_type ()) + +/** + * GI_ENUM_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.EnumInfo] or derived pointer into a + * `(GIEnumInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_ENUM_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_ENUM_INFO, GIEnumInfo)) + +/** + * GI_IS_ENUM_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.EnumInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_ENUM_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_ENUM_INFO)) + + +GI_AVAILABLE_IN_ALL +unsigned int gi_enum_info_get_n_values (GIEnumInfo *info); + +GI_AVAILABLE_IN_ALL +GIValueInfo * gi_enum_info_get_value (GIEnumInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_enum_info_get_n_methods (GIEnumInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_enum_info_get_method (GIEnumInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GITypeTag gi_enum_info_get_storage_type (GIEnumInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_enum_info_get_error_domain (GIEnumInfo *info); + +G_END_DECLS diff --git a/girepository/gifieldinfo.c b/girepository/gifieldinfo.c new file mode 100644 index 0000000..819ccf7 --- /dev/null +++ b/girepository/gifieldinfo.c @@ -0,0 +1,575 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Field implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "config.h" +#include "gifieldinfo.h" + +/** + * GIFieldInfo: + * + * A `GIFieldInfo` struct represents a field of a struct, union, or object. + * + * The `GIFieldInfo` is fetched by calling + * [method@GIRepository.StructInfo.get_field], + * [method@GIRepository.UnionInfo.get_field] or + * [method@GIRepository.ObjectInfo.get_field]. + * + * A field has a size, type and a struct offset associated and a set of flags, + * which are currently `GI_FIELD_IS_READABLE` or `GI_FIELD_IS_WRITABLE`. + * + * See also: [type@GIRepository.StructInfo], [type@GIRepository.UnionInfo], + * [type@GIRepository.ObjectInfo] + * + * Since: 2.80 + */ + +/** + * gi_field_info_get_flags: + * @info: a #GIFieldInfo + * + * Obtain the flags for this `GIFieldInfo`. See + * [flags@GIRepository.FieldInfoFlags] for possible flag values. + * + * Returns: the flags + * Since: 2.80 + */ +GIFieldInfoFlags +gi_field_info_get_flags (GIFieldInfo *info) +{ + GIFieldInfoFlags flags; + GIRealInfo *rinfo = (GIRealInfo *)info; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + + if (blob->readable) + flags = flags | GI_FIELD_IS_READABLE; + + if (blob->writable) + flags = flags | GI_FIELD_IS_WRITABLE; + + return flags; +} + +/** + * gi_field_info_get_size: + * @info: a #GIFieldInfo + * + * Obtain the size of the field member, in bits. This is how + * much space you need to allocate to store the field. + * + * Returns: the field size, in bits + * Since: 2.80 + */ +size_t +gi_field_info_get_size (GIFieldInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->bits; +} + +/** + * gi_field_info_get_offset: + * @info: a #GIFieldInfo + * + * Obtain the offset of the field member, in bytes. This is relative + * to the beginning of the struct or union. + * + * Returns: the field offset, in bytes + * Since: 2.80 + */ +size_t +gi_field_info_get_offset (GIFieldInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + FieldBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->struct_offset; +} + +/** + * gi_field_info_get_type_info: + * @info: a #GIFieldInfo + * + * Obtain the type of a field as a [type@GIRepository.TypeInfo]. + * + * Returns: (transfer full): the [type@GIRepository.TypeInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GITypeInfo * +gi_field_info_get_type_info (GIFieldInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + FieldBlob *blob; + GIRealInfo *type_info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_FIELD_INFO (info), NULL); + + blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->has_embedded_type) + { + type_info = (GIRealInfo *) gi_base_info_new (GI_INFO_TYPE_TYPE, + (GIBaseInfo*)info, rinfo->typelib, + rinfo->offset + header->field_blob_size); + type_info->type_is_embedded = TRUE; + } + else + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type)); + + return (GITypeInfo *) type_info; +} + +/** + * gi_field_info_get_field: (skip) + * @field_info: a #GIFieldInfo + * @mem: pointer to a block of memory representing a C structure or union + * @value: a [type@GIRepository.Argument] into which to store the value retrieved + * + * Reads a field identified by a `GIFieldInfo` from a C structure or + * union. + * + * This only handles fields of simple C types. It will fail for a field of a + * composite type like a nested structure or union even if that is actually + * readable. + * + * Returns: `TRUE` if reading the field succeeded, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_field_info_get_field (GIFieldInfo *field_info, + void *mem, + GIArgument *value) +{ + int offset; + GITypeInfo *type_info; + gboolean result = FALSE; + + g_return_val_if_fail (field_info != NULL, FALSE); + g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE); + + if ((gi_field_info_get_flags (field_info) & GI_FIELD_IS_READABLE) == 0) + return FALSE; + + offset = gi_field_info_get_offset (field_info); + type_info = gi_field_info_get_type_info (field_info); + + if (gi_type_info_is_pointer (type_info)) + { + value->v_pointer = G_STRUCT_MEMBER (void *, mem, offset); + result = TRUE; + } + else + { + switch (gi_type_info_get_tag (type_info)) + { + case GI_TYPE_TAG_VOID: + g_warning("Field %s: should not be have void type", + gi_base_info_get_name ((GIBaseInfo *)field_info)); + break; + case GI_TYPE_TAG_BOOLEAN: + value->v_boolean = G_STRUCT_MEMBER (gboolean, mem, offset) != FALSE; + result = TRUE; + break; + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + value->v_uint8 = G_STRUCT_MEMBER (uint8_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + value->v_uint16 = G_STRUCT_MEMBER (uint16_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + value->v_uint32 = G_STRUCT_MEMBER (uint32_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + value->v_uint64 = G_STRUCT_MEMBER (uint64_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_GTYPE: + value->v_size = G_STRUCT_MEMBER (size_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_FLOAT: + value->v_float = G_STRUCT_MEMBER (float, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_DOUBLE: + value->v_double = G_STRUCT_MEMBER (double, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_ARRAY: + /* We don't check the array type and that it is fixed-size, + we trust gi-compile-repository to do the right thing */ + value->v_pointer = G_STRUCT_MEMBER_P (mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + g_warning("Field %s: type %s should have is_pointer set", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_type_tag_to_string (gi_type_info_get_tag (type_info))); + break; + case GI_TYPE_TAG_ERROR: + /* Needs to be handled by the language binding directly */ + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *interface = gi_type_info_get_interface (type_info); + switch (gi_base_info_get_info_type (interface)) + { + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_UNION: + /* Needs to be handled by the language binding directly */ + break; + case GI_INFO_TYPE_OBJECT: + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + { + /* FIXME: there's a mismatch here between the value->v_int we use + * here and the int64_t result returned from gi_value_info_get_value(). + * But to switch this to int64_t, we'd have to make gi_function_info_invoke() + * translate value->v_int64 to the proper ABI for an enum function + * call parameter, which will usually be int, and then fix up language + * bindings. + */ + GITypeTag storage_type = gi_enum_info_get_storage_type ((GIEnumInfo *)interface); + switch (storage_type) + { + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + value->v_int = (int)G_STRUCT_MEMBER (uint8_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + value->v_int = (int)G_STRUCT_MEMBER (uint16_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + value->v_int = (int)G_STRUCT_MEMBER (uint32_t, mem, offset); + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + value->v_int = (int)G_STRUCT_MEMBER (uint64_t, mem, offset); + result = TRUE; + break; + default: + g_warning("Field %s: Unexpected enum storage type %s", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_type_tag_to_string (storage_type)); + break; + } + break; + } + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_CALLBACK: + g_warning("Field %s: Interface type %d should have is_pointer set", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_base_info_get_info_type (interface)); + break; + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_warning("Field %s: Interface type %d not expected", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_base_info_get_info_type (interface)); + break; + default: + break; + } + + gi_base_info_unref ((GIBaseInfo *)interface); + break; + } + break; + default: + break; + } + } + + gi_base_info_unref ((GIBaseInfo *)type_info); + + return result; +} + +/** + * gi_field_info_set_field: (skip) + * @field_info: a #GIFieldInfo + * @mem: pointer to a block of memory representing a C structure or union + * @value: a [type@GIRepository.Argument] holding the value to store + * + * Writes a field identified by a `GIFieldInfo` to a C structure or + * union. + * + * This only handles fields of simple C types. It will fail for a field of a + * composite type like a nested structure or union even if that is actually + * writable. Note also that that it will refuse to write fields where memory + * management would by required. A field with a type such as `char *` must be + * set with a setter function. + * + * Returns: `TRUE` if writing the field succeeded, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_field_info_set_field (GIFieldInfo *field_info, + void *mem, + const GIArgument *value) +{ + int offset; + GITypeInfo *type_info; + gboolean result = FALSE; + + g_return_val_if_fail (field_info != NULL, FALSE); + g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE); + + if ((gi_field_info_get_flags (field_info) & GI_FIELD_IS_WRITABLE) == 0) + return FALSE; + + offset = gi_field_info_get_offset (field_info); + type_info = gi_field_info_get_type_info (field_info); + + if (!gi_type_info_is_pointer (type_info)) + { + switch (gi_type_info_get_tag (type_info)) + { + case GI_TYPE_TAG_VOID: + g_warning("Field %s: should not be have void type", + gi_base_info_get_name ((GIBaseInfo *)field_info)); + break; + case GI_TYPE_TAG_BOOLEAN: + G_STRUCT_MEMBER (gboolean, mem, offset) = value->v_boolean != FALSE; + result = TRUE; + break; + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + G_STRUCT_MEMBER (uint8_t, mem, offset) = value->v_uint8; + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + G_STRUCT_MEMBER (uint16_t, mem, offset) = value->v_uint16; + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + G_STRUCT_MEMBER (uint32_t, mem, offset) = value->v_uint32; + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + G_STRUCT_MEMBER (uint64_t, mem, offset) = value->v_uint64; + result = TRUE; + break; + case GI_TYPE_TAG_GTYPE: + G_STRUCT_MEMBER (size_t, mem, offset) = value->v_size; + result = TRUE; + break; + case GI_TYPE_TAG_FLOAT: + G_STRUCT_MEMBER (float, mem, offset) = value->v_float; + result = TRUE; + break; + case GI_TYPE_TAG_DOUBLE: + G_STRUCT_MEMBER (double, mem, offset)= value->v_double; + result = TRUE; + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + g_warning("Field %s: type %s should have is_pointer set", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_type_tag_to_string (gi_type_info_get_tag (type_info))); + break; + case GI_TYPE_TAG_ERROR: + /* Needs to be handled by the language binding directly */ + break; + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *interface = gi_type_info_get_interface (type_info); + switch (gi_base_info_get_info_type (interface)) + { + case GI_INFO_TYPE_STRUCT: + case GI_INFO_TYPE_UNION: + /* Needs to be handled by the language binding directly */ + break; + case GI_INFO_TYPE_OBJECT: + break; + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + { + /* See FIXME above + */ + GITypeTag storage_type = gi_enum_info_get_storage_type ((GIEnumInfo *)interface); + switch (storage_type) + { + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + G_STRUCT_MEMBER (uint8_t, mem, offset) = (uint8_t)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + G_STRUCT_MEMBER (uint16_t, mem, offset) = (uint16_t)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + G_STRUCT_MEMBER (uint32_t, mem, offset) = (uint32_t)value->v_int; + result = TRUE; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + G_STRUCT_MEMBER (uint64_t, mem, offset) = (uint64_t)value->v_int; + result = TRUE; + break; + default: + g_warning("Field %s: Unexpected enum storage type %s", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_type_tag_to_string (storage_type)); + break; + } + break; + } + break; + case GI_INFO_TYPE_VFUNC: + case GI_INFO_TYPE_CALLBACK: + g_warning("Field%s: Interface type %d should have is_pointer set", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_base_info_get_info_type (interface)); + break; + case GI_INFO_TYPE_INVALID: + case GI_INFO_TYPE_INTERFACE: + case GI_INFO_TYPE_FUNCTION: + case GI_INFO_TYPE_CONSTANT: + case GI_INFO_TYPE_VALUE: + case GI_INFO_TYPE_SIGNAL: + case GI_INFO_TYPE_PROPERTY: + case GI_INFO_TYPE_FIELD: + case GI_INFO_TYPE_ARG: + case GI_INFO_TYPE_TYPE: + case GI_INFO_TYPE_UNRESOLVED: + g_warning("Field %s: Interface type %d not expected", + gi_base_info_get_name ((GIBaseInfo *)field_info), + gi_base_info_get_info_type (interface)); + break; + default: + break; + } + + gi_base_info_unref ((GIBaseInfo *)interface); + break; + } + break; + default: + break; + } + } else { + switch (gi_type_info_get_tag (type_info)) + { + case GI_TYPE_TAG_INTERFACE: + { + GIBaseInfo *interface = gi_type_info_get_interface (type_info); + switch (gi_base_info_get_info_type (interface)) + { + case GI_INFO_TYPE_OBJECT: + case GI_INFO_TYPE_INTERFACE: + G_STRUCT_MEMBER (void *, mem, offset) = (void *)value->v_pointer; + result = TRUE; + break; + default: + break; + } + gi_base_info_unref ((GIBaseInfo *)interface); + } + break; + default: + break; + } + } + + gi_base_info_unref ((GIBaseInfo *)type_info); + + return result; +} + +void +gi_field_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_FIELD; +} diff --git a/girepository/gifieldinfo.h b/girepository/gifieldinfo.h new file mode 100644 index 0000000..e3d1372 --- /dev/null +++ b/girepository/gifieldinfo.h @@ -0,0 +1,84 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Field and Field values + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_FIELD_INFO (gi_field_info_get_type ()) + +/** + * GI_FIELD_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.FieldInfo] or derived pointer into a + * `(GIFieldInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_FIELD_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_FIELD_INFO, GIFieldInfo)) + +/** + * GI_IS_FIELD_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.FieldInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_FIELD_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_FIELD_INFO)) + + +GI_AVAILABLE_IN_ALL +GIFieldInfoFlags gi_field_info_get_flags (GIFieldInfo *info); + +GI_AVAILABLE_IN_ALL +size_t gi_field_info_get_size (GIFieldInfo *info); + +GI_AVAILABLE_IN_ALL +size_t gi_field_info_get_offset (GIFieldInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_field_info_get_type_info (GIFieldInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_field_info_get_field (GIFieldInfo *field_info, + void *mem, + GIArgument *value); + +GI_AVAILABLE_IN_ALL +gboolean gi_field_info_set_field (GIFieldInfo *field_info, + void *mem, + const GIArgument *value); + +G_END_DECLS diff --git a/girepository/giflagsinfo.c b/girepository/giflagsinfo.c new file mode 100644 index 0000000..34a3e00 --- /dev/null +++ b/girepository/giflagsinfo.c @@ -0,0 +1,56 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Enum implementation + * + * Copyright 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giflagsinfo.h" + +/** + * GIFlagsInfo: + * + * A `GIFlagsInfo` represents an enumeration which defines flag values + * (independently set bits). + * + * The `GIFlagsInfo` contains a set of values (each a + * [class@GIRepository.ValueInfo]) and a type. + * + * The [class@GIRepository.ValueInfo] for a value is fetched by calling + * [method@GIRepository.EnumInfo.get_value] on a `GIFlagsInfo`. + * + * Since: 2.80 + */ + +void +gi_flags_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_FLAGS; +} diff --git a/girepository/giflagsinfo.h b/girepository/giflagsinfo.h new file mode 100644 index 0000000..1070eff --- /dev/null +++ b/girepository/giflagsinfo.h @@ -0,0 +1,60 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Flags type + * + * Copyright 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_FLAGS_INFO (gi_flags_info_get_type ()) + +/** + * GI_FLAGS_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.FlagsInfo] or derived pointer into a + * `(GIFlagsInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_FLAGS_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_FLAGS_INFO, GIFlagsInfo)) + +/** + * GI_IS_FLAGS_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.FlagsInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_FLAGS_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_FLAGS_INFO)) + +G_END_DECLS diff --git a/girepository/gifunctioninfo.c b/girepository/gifunctioninfo.c new file mode 100644 index 0000000..e50cc00 --- /dev/null +++ b/girepository/gifunctioninfo.c @@ -0,0 +1,305 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Function implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gifunctioninfo.h" + +/** + * GIFunctionInfo: + * + * `GIFunctionInfo` represents a function, method or constructor. + * + * To find out what kind of entity a `GIFunctionInfo` represents, call + * [method@GIRepository.FunctionInfo.get_flags]. + * + * See also [class@GIRepository.CallableInfo] for information on how to retrieve + * arguments and other metadata. + * + * Since: 2.80 + */ + +GIFunctionInfo * +gi_base_info_find_method (GIBaseInfo *base, + uint32_t offset, + uint16_t n_methods, + const char *name) +{ + /* FIXME hash */ + GIRealInfo *rinfo = (GIRealInfo*)base; + Header *header = (Header *)rinfo->typelib->data; + + for (uint16_t i = 0; i < n_methods; i++) + { + FunctionBlob *fblob = (FunctionBlob *)&rinfo->typelib->data[offset]; + const char *fname = (const char *)&rinfo->typelib->data[fblob->name]; + + if (strcmp (name, fname) == 0) + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, base, + rinfo->typelib, offset); + + offset += header->function_blob_size; + } + + return NULL; +} + +/** + * gi_function_info_get_symbol: + * @info: a #GIFunctionInfo + * + * Obtain the symbol of the function. + * + * The symbol is the name of the exported function, suitable to be used as an + * argument to [method@GModule.Module.symbol]. + * + * Returns: the symbol + * Since: 2.80 + */ +const char * +gi_function_info_get_symbol (GIFunctionInfo *info) +{ + GIRealInfo *rinfo; + FunctionBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), NULL); + + rinfo = (GIRealInfo *)info; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->symbol); +} + +/** + * gi_function_info_get_flags: + * @info: a #GIFunctionInfo + * + * Obtain the [type@GIRepository.FunctionInfoFlags] for the @info. + * + * Returns: the flags + * Since: 2.80 + */ +GIFunctionInfoFlags +gi_function_info_get_flags (GIFunctionInfo *info) +{ + GIFunctionInfoFlags flags; + GIRealInfo *rinfo; + FunctionBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), -1); + + rinfo = (GIRealInfo *)info; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + + /* Make sure we don't flag Constructors as methods */ + if (!blob->constructor && !blob->is_static) + flags = flags | GI_FUNCTION_IS_METHOD; + + if (blob->constructor) + flags = flags | GI_FUNCTION_IS_CONSTRUCTOR; + + if (blob->getter) + flags = flags | GI_FUNCTION_IS_GETTER; + + if (blob->setter) + flags = flags | GI_FUNCTION_IS_SETTER; + + if (blob->wraps_vfunc) + flags = flags | GI_FUNCTION_WRAPS_VFUNC; + + return flags; +} + +/** + * gi_function_info_get_property: + * @info: a #GIFunctionInfo + * + * Obtain the property associated with this `GIFunctionInfo`. + * + * Only `GIFunctionInfo`s with the flag `GI_FUNCTION_IS_GETTER` or + * `GI_FUNCTION_IS_SETTER` have a property set. For other cases, + * `NULL` will be returned. + * + * Returns: (transfer full) (nullable): The property or `NULL` if not set. Free + * it with [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIPropertyInfo * +gi_function_info_get_property (GIFunctionInfo *info) +{ + GIRealInfo *rinfo; + FunctionBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), NULL); + + rinfo = (GIRealInfo *)info; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (gi_base_info_get_info_type ((GIBaseInfo *) rinfo->container) == GI_INFO_TYPE_INTERFACE) + { + GIInterfaceInfo *container = (GIInterfaceInfo *)rinfo->container; + + return gi_interface_info_get_property (container, blob->index); + } + else if (gi_base_info_get_info_type ((GIBaseInfo *) rinfo->container) == GI_INFO_TYPE_OBJECT) + { + GIObjectInfo *container = (GIObjectInfo *)rinfo->container; + + return gi_object_info_get_property (container, blob->index); + } + else + return NULL; +} + +/** + * gi_function_info_get_vfunc: + * @info: a #GIFunctionInfo + * + * Obtain the virtual function associated with this `GIFunctionInfo`. + * + * Only `GIFunctionInfo`s with the flag `GI_FUNCTION_WRAPS_VFUNC` have + * a virtual function set. For other cases, `NULL` will be returned. + * + * Returns: (transfer full) (nullable): The virtual function or `NULL` if not + * set. Free it by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_function_info_get_vfunc (GIFunctionInfo *info) +{ + GIRealInfo *rinfo; + FunctionBlob *blob; + GIInterfaceInfo *container; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_FUNCTION_INFO (info), NULL); + + rinfo = (GIRealInfo *)info; + blob = (FunctionBlob *)&rinfo->typelib->data[rinfo->offset]; + container = (GIInterfaceInfo *)rinfo->container; + + return gi_interface_info_get_vfunc (container, blob->index); +} + +/** + * gi_invoke_error_quark: + * + * Get the error quark which represents [type@GIRepository.InvokeError]. + * + * Returns: error quark + * Since: 2.80 + */ +GQuark +gi_invoke_error_quark (void) +{ + static GQuark quark = 0; + if (quark == 0) + quark = g_quark_from_static_string ("gi-invoke-error-quark"); + return quark; +} + +/** + * gi_function_info_invoke: (skip) + * @info: a #GIFunctionInfo describing the function to invoke + * @in_args: (array length=n_in_args) (nullable): An array of + * [type@GIRepository.Argument]s, one for each ‘in’ parameter of @info. If + * there are no ‘in’ parameters, @in_args can be `NULL`. + * @n_in_args: the length of the @in_args array + * @out_args: (array length=n_out_args) (nullable): An array of + * [type@GIRepository.Argument]s, one for each ‘out’ parameter of @info. If + * there are no ‘out’ parameters, @out_args may be `NULL`. + * @n_out_args: the length of the @out_args array + * @return_value: (out caller-allocates) (not optional): return location for the + * return value of the function. + * @error: return location for detailed error information, or `NULL` + * + * Invokes the function described in @info with the given + * arguments. + * + * Note that ‘inout’ parameters must appear in both argument lists. This + * function uses [`dlsym()`](man:dlsym(3)) to obtain a pointer to the function, + * so the library or shared object containing the described function must either + * be linked to the caller, or must have been loaded with + * [method@GModule.Module.symbol] before calling this function. + * + * Returns: `TRUE` if the function has been invoked, `FALSE` if an + * error occurred. + * Since: 2.80 + */ +gboolean +gi_function_info_invoke (GIFunctionInfo *info, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error) +{ + const char *symbol; + void *func; + + symbol = gi_function_info_get_symbol (info); + + if (!gi_typelib_symbol (gi_base_info_get_typelib ((GIBaseInfo *) info), + symbol, &func)) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_SYMBOL_NOT_FOUND, + "Could not locate %s: %s", symbol, g_module_error ()); + + return FALSE; + } + + return gi_callable_info_invoke ((GICallableInfo*) info, + func, + in_args, + n_in_args, + out_args, + n_out_args, + return_value, + error); +} + +void +gi_function_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_FUNCTION; +} diff --git a/girepository/gifunctioninfo.h b/girepository/gifunctioninfo.h new file mode 100644 index 0000000..ce7dd9e --- /dev/null +++ b/girepository/gifunctioninfo.h @@ -0,0 +1,117 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Function + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_FUNCTION_INFO (gi_function_info_get_type ()) + +/** + * GI_FUNCTION_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.FunctionInfo] or derived pointer into a + * `(GIFunctionInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_FUNCTION_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_FUNCTION_INFO, GIFunctionInfo)) + +/** + * GI_IS_FUNCTION_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.FunctionInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_FUNCTION_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_FUNCTION_INFO)) + + +GI_AVAILABLE_IN_ALL +const char * gi_function_info_get_symbol (GIFunctionInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfoFlags gi_function_info_get_flags (GIFunctionInfo *info); + +GI_AVAILABLE_IN_ALL +GIPropertyInfo * gi_function_info_get_property (GIFunctionInfo *info); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_function_info_get_vfunc (GIFunctionInfo *info); + +/** + * GI_INVOKE_ERROR: + * + * Type quark function for [enum@GIRepository.InvokeError]. + * + * Since: 2.80 + */ +#define GI_INVOKE_ERROR (gi_invoke_error_quark ()) + +GI_AVAILABLE_IN_ALL +GQuark gi_invoke_error_quark (void); + +/** + * GIInvokeError: + * @GI_INVOKE_ERROR_FAILED: invocation failed, unknown error. + * @GI_INVOKE_ERROR_SYMBOL_NOT_FOUND: symbol couldn’t be found in any of the + * libraries associated with the typelib of the function. + * @GI_INVOKE_ERROR_ARGUMENT_MISMATCH: the arguments provided didn’t match + * the expected arguments for the function’s type signature. + * + * An error occurring while invoking a function via + * [method@GIRepository.FunctionInfo.invoke]. + * + * Since: 2.80 + */ +typedef enum +{ + GI_INVOKE_ERROR_FAILED, + GI_INVOKE_ERROR_SYMBOL_NOT_FOUND, + GI_INVOKE_ERROR_ARGUMENT_MISMATCH +} GIInvokeError; + + +GI_AVAILABLE_IN_ALL +gboolean gi_function_info_invoke (GIFunctionInfo *info, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error); + + +G_END_DECLS diff --git a/girepository/giinterfaceinfo.c b/girepository/giinterfaceinfo.c new file mode 100644 index 0000000..1c5289e --- /dev/null +++ b/girepository/giinterfaceinfo.c @@ -0,0 +1,542 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Interface implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giinterfaceinfo.h" + +/** + * GIInterfaceInfo: + * + * `GIInterfaceInfo` represents a `GInterface` type. + * + * A `GInterface` has methods, fields, properties, signals, + * interfaces, constants, virtual functions and prerequisites. + * + * Since: 2.80 + */ + +/** + * gi_interface_info_get_n_prerequisites: + * @info: a #GIInterfaceInfo + * + * Obtain the number of prerequisites for this interface type. + * + * A prerequisite is another interface that needs to be implemented for + * interface, similar to a base class for [class@GObject.Object]s. + * + * Returns: number of prerequisites + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_prerequisites (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_prerequisites; +} + +/** + * gi_interface_info_get_prerequisite: + * @info: a #GIInterfaceInfo + * @n: index of prerequisite to get + * + * Obtain an interface type’s prerequisite at index @n. + * + * Returns: (transfer full): The prerequisite as a [class@GIRepository.BaseInfo]. + * Free the struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIBaseInfo * +gi_interface_info_get_prerequisite (GIInterfaceInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_info_from_entry (rinfo->repository, + rinfo->typelib, blob->prerequisites[n]); +} + + +/** + * gi_interface_info_get_n_properties: + * @info: a #GIInterfaceInfo + * + * Obtain the number of properties that this interface type has. + * + * Returns: number of properties + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_properties (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_properties; +} + +/** + * gi_interface_info_get_property: + * @info: a #GIInterfaceInfo + * @n: index of property to get + * + * Obtain an interface type property at index @n. + * + * Returns: (transfer full): The [class@GIRepository.PropertyInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIPropertyInfo * +gi_interface_info_get_property (GIInterfaceInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + n * header->property_blob_size; + + return (GIPropertyInfo *) gi_base_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_interface_info_get_n_methods: + * @info: a #GIInterfaceInfo + * + * Obtain the number of methods that this interface type has. + * + * Returns: number of methods + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_methods (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; +} + +/** + * gi_interface_info_get_method: + * @info: a #GIInterfaceInfo + * @n: index of method to get + * + * Obtain an interface type method at index @n. + * + * Returns: (transfer full): The [class@GIRepository.FunctionInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_interface_info_get_method (GIInterfaceInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + n * header->function_blob_size; + + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_interface_info_find_method: + * @info: a #GIInterfaceInfo + * @name: name of method to obtain + * + * Obtain a method of the interface type given a @name. + * + * `NULL` will be returned if there’s no method available with that name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.FunctionInfo] or + * `NULL` if none found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_interface_info_find_method (GIInterfaceInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + InterfaceBlob *blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size; + + return gi_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); +} + +/** + * gi_interface_info_get_n_signals: + * @info: a #GIInterfaceInfo + * + * Obtain the number of signals that this interface type has. + * + * Returns: number of signals + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_signals (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_signals; +} + +/** + * gi_interface_info_get_signal: + * @info: a #GIInterfaceInfo + * @n: index of signal to get + * + * Obtain an interface type signal at index @n. + * + * Returns: (transfer full): The [class@GIRepository.SignalInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GISignalInfo * +gi_interface_info_get_signal (GIInterfaceInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + n * header->signal_blob_size; + + return (GISignalInfo *) gi_base_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_interface_info_find_signal: + * @info: a #GIInterfaceInfo + * @name: name of signal to find + * + * Obtain a signal of the interface type given a @name. + * + * `NULL` will be returned if there’s no signal available with that name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.SignalInfo] or + * `NULL` if none found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GISignalInfo * +gi_interface_info_find_signal (GIInterfaceInfo *info, + const char *name) +{ + uint32_t n_signals; + + n_signals = gi_interface_info_get_n_signals (info); + for (uint32_t i = 0; i < n_signals; i++) + { + GISignalInfo *siginfo = gi_interface_info_get_signal (info, i); + + if (g_strcmp0 (gi_base_info_get_name ((GIBaseInfo *) siginfo), name) != 0) + { + gi_base_info_unref ((GIBaseInfo*)siginfo); + continue; + } + + return siginfo; + } + return NULL; +} + +/** + * gi_interface_info_get_n_vfuncs: + * @info: a #GIInterfaceInfo + * + * Obtain the number of virtual functions that this interface type has. + * + * Returns: number of virtual functions + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_vfuncs (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_vfuncs; +} + +/** + * gi_interface_info_get_vfunc: + * @info: a #GIInterfaceInfo + * @n: index of virtual function to get + * + * Obtain an interface type virtual function at index @n. + * + * Returns: (transfer full): the [class@GIRepository.VFuncInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_interface_info_get_vfunc (GIInterfaceInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size + + n * header->vfunc_blob_size; + + return (GIVFuncInfo *) gi_base_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_interface_info_find_vfunc: + * @info: a #GIInterfaceInfo + * @name: The name of a virtual function to find. + * + * Locate a virtual function slot with name @name. + * + * See the documentation for [method@GIRepository.ObjectInfo.find_vfunc] for + * more information on virtuals. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.VFuncInfo], or + * `NULL` if none found. Free it with [method@GIRepository.BaseInfo.unref] + * when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_interface_info_find_vfunc (GIInterfaceInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size; + + return gi_base_info_find_vfunc (rinfo, offset, blob->n_vfuncs, name); +} + +/** + * gi_interface_info_get_n_constants: + * @info: a #GIInterfaceInfo + * + * Obtain the number of constants that this interface type has. + * + * Returns: number of constants + * Since: 2.80 + */ +unsigned int +gi_interface_info_get_n_constants (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), 0); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_constants; +} + +/** + * gi_interface_info_get_constant: + * @info: a #GIInterfaceInfo + * @n: index of constant to get + * + * Obtain an interface type constant at index @n. + * + * Returns: (transfer full): The [class@GIRepository.ConstantInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIConstantInfo * +gi_interface_info_get_constant (GIInterfaceInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->interface_blob_size + + (blob->n_prerequisites + (blob->n_prerequisites % 2)) * 2 + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size + + blob->n_vfuncs * header->vfunc_blob_size + + n * header->constant_blob_size; + + return (GIConstantInfo *) gi_base_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_interface_info_get_iface_struct: + * @info: a #GIInterfaceInfo + * + * Returns the layout C structure associated with this `GInterface`. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.StructInfo] or + * `NULL` if unknown. Free it with [method@GIRepository.BaseInfo.unref] when + * done. + * Since: 2.80 + */ +GIStructInfo * +gi_interface_info_get_iface_struct (GIInterfaceInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + InterfaceBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_INTERFACE_INFO (info), NULL); + + blob = (InterfaceBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_struct) + return (GIStructInfo *) gi_info_from_entry (rinfo->repository, + rinfo->typelib, blob->gtype_struct); + else + return NULL; +} + +void +gi_interface_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_INTERFACE; +} diff --git a/girepository/giinterfaceinfo.h b/girepository/giinterfaceinfo.h new file mode 100644 index 0000000..9cb0d4e --- /dev/null +++ b/girepository/giinterfaceinfo.h @@ -0,0 +1,120 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Interface + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_INTERFACE_INFO (gi_interface_info_get_type ()) + +/** + * GI_INTERFACE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.InterfaceInfo] or derived pointer into a + * `(GIInterfaceInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_INTERFACE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_INTERFACE_INFO, GIInterfaceInfo)) + +/** + * GI_IS_INTERFACE_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.InterfaceInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_INTERFACE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_INTERFACE_INFO)) + + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_prerequisites (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_interface_info_get_prerequisite (GIInterfaceInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_properties (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GIPropertyInfo * gi_interface_info_get_property (GIInterfaceInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_methods (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_interface_info_get_method (GIInterfaceInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_interface_info_find_method (GIInterfaceInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_signals (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GISignalInfo * gi_interface_info_get_signal (GIInterfaceInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GISignalInfo * gi_interface_info_find_signal (GIInterfaceInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_vfuncs (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_interface_info_get_vfunc (GIInterfaceInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_interface_info_find_vfunc (GIInterfaceInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +unsigned int gi_interface_info_get_n_constants (GIInterfaceInfo *info); + +GI_AVAILABLE_IN_ALL +GIConstantInfo * gi_interface_info_get_constant (GIInterfaceInfo *info, + unsigned int n); + + +GI_AVAILABLE_IN_ALL +GIStructInfo * gi_interface_info_get_iface_struct (GIInterfaceInfo *info); + +G_END_DECLS diff --git a/girepository/ginvoke.c b/girepository/ginvoke.c new file mode 100644 index 0000000..20d882c --- /dev/null +++ b/girepository/ginvoke.c @@ -0,0 +1,335 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Invoke functionality + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include + +#include +#include "girffi.h" + +/** + * value_to_ffi_type: + * @gvalue: (transfer none): a [type@GObject.Value] to convert + * @value: (out caller-allocates): return location for the ffi data + * + * Convert @gvalue to a format suitable for passing to ffi. + * + * @value is only valid as long as @gvalue is alive. + * + * Returns: pointer to the `ffi_type` associated with @value + * Since: 2.80 + */ +static ffi_type * +value_to_ffi_type (const GValue *gvalue, void **value) +{ + ffi_type *rettype = NULL; + GType type = g_type_fundamental (G_VALUE_TYPE (gvalue)); + g_assert (type != G_TYPE_INVALID); + + switch (type) + { + case G_TYPE_BOOLEAN: + case G_TYPE_CHAR: + case G_TYPE_INT: + rettype = &ffi_type_sint; + *value = (void *) &(gvalue->data[0].v_int); + break; + case G_TYPE_UCHAR: + case G_TYPE_UINT: + rettype = &ffi_type_uint; + *value = (void *) &(gvalue->data[0].v_uint); + break; + case G_TYPE_STRING: + case G_TYPE_OBJECT: + case G_TYPE_BOXED: + case G_TYPE_POINTER: + case G_TYPE_PARAM: + rettype = &ffi_type_pointer; + *value = (void *) &(gvalue->data[0].v_pointer); + break; + case G_TYPE_FLOAT: + rettype = &ffi_type_float; + *value = (void *) &(gvalue->data[0].v_float); + break; + case G_TYPE_DOUBLE: + rettype = &ffi_type_double; + *value = (void *) &(gvalue->data[0].v_double); + break; + case G_TYPE_LONG: + rettype = &ffi_type_slong; + *value = (void *) &(gvalue->data[0].v_long); + break; + case G_TYPE_ULONG: + rettype = &ffi_type_ulong; + *value = (void *) &(gvalue->data[0].v_ulong); + break; + case G_TYPE_INT64: + rettype = &ffi_type_sint64; + *value = (void *) &(gvalue->data[0].v_int64); + break; + case G_TYPE_UINT64: + rettype = &ffi_type_uint64; + *value = (void *) &(gvalue->data[0].v_uint64); + break; + default: + rettype = &ffi_type_pointer; + *value = NULL; + g_warning ("Unsupported fundamental type: %s", g_type_name (type)); + break; + } + return rettype; +} + +/** + * g_value_to_ffi_return_type: + * @gvalue: (transfer none): a [type@GObject.Value] to convert + * @ffi_value: (transfer none): a [type@GIRepository.Argument] containing the + * data to use + * @value: (out caller-allocates): return location for the ffi data + * + * Convert @ffi_value to a format suitable for passing to ffi, using the type + * data from @gvalue. + * + * @value is only valid as long as @gvalue and @ffi_value are alive. + * + * Returns: pointer to the `ffi_type` associated with @value + * Since: 2.80 + */ +static ffi_type * +g_value_to_ffi_return_type (const GValue *gvalue, + const GIArgument *ffi_value, + void **value) +{ + ffi_type *rettype = NULL; + GType type = g_type_fundamental (G_VALUE_TYPE (gvalue)); + g_assert (type != G_TYPE_INVALID); + + *value = (void *) &(ffi_value->v_long); + + switch (type) { + case G_TYPE_CHAR: + rettype = &ffi_type_sint8; + break; + case G_TYPE_UCHAR: + rettype = &ffi_type_uint8; + break; + case G_TYPE_BOOLEAN: + case G_TYPE_INT: + rettype = &ffi_type_sint; + break; + case G_TYPE_UINT: + rettype = &ffi_type_uint; + break; + case G_TYPE_STRING: + case G_TYPE_OBJECT: + case G_TYPE_BOXED: + case G_TYPE_POINTER: + case G_TYPE_PARAM: + rettype = &ffi_type_pointer; + break; + case G_TYPE_FLOAT: + rettype = &ffi_type_float; + *value = (void *) &(ffi_value->v_float); + break; + case G_TYPE_DOUBLE: + rettype = &ffi_type_double; + *value = (void *) &(ffi_value->v_double); + break; + case G_TYPE_LONG: + rettype = &ffi_type_slong; + break; + case G_TYPE_ULONG: + rettype = &ffi_type_ulong; + break; + case G_TYPE_INT64: + rettype = &ffi_type_sint64; + *value = (void *) &(ffi_value->v_int64); + break; + case G_TYPE_UINT64: + rettype = &ffi_type_uint64; + *value = (void *) &(ffi_value->v_uint64); + break; + default: + rettype = &ffi_type_pointer; + *value = NULL; + g_warning ("Unsupported fundamental type: %s", g_type_name (type)); + break; + } + return rettype; +} + +/** + * g_value_from_ffi_value: + * @gvalue: (inout): a [type@GObject.Value] to set + * @value: (transfer none): ffi data to convert + * + * Convert @value to a [type@GObject.Value] according to the type already set + * on @gvalue. + * + * @gvalue is valid even after @value is finalised. + * + * Since: 2.80 + */ +static void +g_value_from_ffi_value (GValue *gvalue, + const GIArgument *value) +{ + switch (g_type_fundamental (G_VALUE_TYPE (gvalue))) { + case G_TYPE_INT: + g_value_set_int (gvalue, (gint)value->v_long); + break; + case G_TYPE_FLOAT: + g_value_set_float (gvalue, (gfloat)value->v_float); + break; + case G_TYPE_DOUBLE: + g_value_set_double (gvalue, (gdouble)value->v_double); + break; + case G_TYPE_BOOLEAN: + g_value_set_boolean (gvalue, (gboolean)value->v_long); + break; + case G_TYPE_STRING: + g_value_set_string (gvalue, (char*)value->v_pointer); + break; + case G_TYPE_CHAR: + g_value_set_schar (gvalue, (char)value->v_long); + break; + case G_TYPE_UCHAR: + g_value_set_uchar (gvalue, (guchar)value->v_ulong); + break; + case G_TYPE_UINT: + g_value_set_uint (gvalue, (guint)value->v_ulong); + break; + case G_TYPE_POINTER: + g_value_set_pointer (gvalue, (gpointer)value->v_pointer); + break; + case G_TYPE_LONG: + g_value_set_long (gvalue, (glong)value->v_long); + break; + case G_TYPE_ULONG: + g_value_set_ulong (gvalue, (gulong)value->v_ulong); + break; + case G_TYPE_INT64: + g_value_set_int64 (gvalue, (gint64)value->v_int64); + break; + case G_TYPE_UINT64: + g_value_set_uint64 (gvalue, (guint64)value->v_uint64); + break; + case G_TYPE_BOXED: + g_value_set_boxed (gvalue, (gpointer)value->v_pointer); + break; + case G_TYPE_PARAM: + g_value_set_param (gvalue, (gpointer)value->v_pointer); + break; + default: + g_warning ("Unsupported fundamental type: %s", + g_type_name (g_type_fundamental (G_VALUE_TYPE (gvalue)))); + } + +} + +/** + * gi_cclosure_marshal_generic: (skip) + * @closure: a [type@GObject.Closure] + * @return_gvalue: (optional) (out caller-allocates): return location for the + * return value from the closure, or `NULL` to ignore + * @n_param_values: number of param values + * @param_values: (array length=n_param_values): values to pass to the closure + * parameters + * @invocation_hint: invocation hint + * @marshal_data: marshal data + * + * A generic C closure marshal function using ffi and + * [type@GIRepository.Argument]. + * + * Since: 2.80 + */ +void +gi_cclosure_marshal_generic (GClosure *closure, + GValue *return_gvalue, + unsigned int n_param_values, + const GValue *param_values, + void *invocation_hint, + void *marshal_data) +{ + GIArgument return_ffi_value = { 0, }; + ffi_type *rtype; + void *rvalue; + unsigned int n_args; + ffi_type **atypes; + void **args; + unsigned int i; + ffi_cif cif; + GCClosure *cc = (GCClosure*) closure; + + if (return_gvalue && G_VALUE_TYPE (return_gvalue)) + { + rtype = g_value_to_ffi_return_type (return_gvalue, &return_ffi_value, + &rvalue); + } + else + { + rtype = &ffi_type_void; + rvalue = &return_ffi_value.v_long; + } + + n_args = n_param_values + 1; + atypes = g_alloca (sizeof (ffi_type *) * n_args); + args = g_alloca (sizeof (void *) * n_args); + + if (n_param_values > 0) + { + if (G_CCLOSURE_SWAP_DATA (closure)) + { + atypes[n_args-1] = value_to_ffi_type (param_values + 0, + &args[n_args-1]); + atypes[0] = &ffi_type_pointer; + args[0] = &closure->data; + } + else + { + atypes[0] = value_to_ffi_type (param_values + 0, &args[0]); + atypes[n_args-1] = &ffi_type_pointer; + args[n_args-1] = &closure->data; + } + } + else + { + atypes[0] = &ffi_type_pointer; + args[0] = &closure->data; + } + + for (i = 1; i < n_args - 1; i++) + atypes[i] = value_to_ffi_type (param_values + i, &args[i]); + + if (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, n_args, rtype, atypes) != FFI_OK) + return; + + ffi_call (&cif, marshal_data ? marshal_data : cc->callback, rvalue, args); + + if (return_gvalue && G_VALUE_TYPE (return_gvalue)) + g_value_from_ffi_value (return_gvalue, &return_ffi_value); +} diff --git a/girepository/giobjectinfo.c b/girepository/giobjectinfo.c new file mode 100644 index 0000000..6211b90 --- /dev/null +++ b/girepository/giobjectinfo.c @@ -0,0 +1,1194 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Object implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giobjectinfo.h" + +/** + * GIObjectInfo: + * + * `GIObjectInfo` represents a classed type. + * + * Classed types in [type@GObject.Type] inherit from + * [type@GObject.TypeInstance]; the most common type is [class@GObject.Object]. + * + * A `GIObjectInfo` doesn’t represent a specific instance of a classed type, + * instead this represent the object type (i.e. the class). + * + * A `GIObjectInfo` has methods, fields, properties, signals, interfaces, + * constants and virtual functions. + * + * Since: 2.80 + */ + +/** + * gi_object_info_get_field_offset: + * @info: a #GIObjectInfo + * @n: index of queried field + * + * Obtain the offset of the specified field. + * + * Returns: field offset, in bytes + * Since: 2.80 + */ +static size_t +gi_object_info_get_field_offset (GIObjectInfo *info, + size_t n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + ObjectBlob *blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + uint32_t offset; + FieldBlob *field_blob; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2; + + for (size_t i = 0; i < n; i++) + { + field_blob = (FieldBlob *)&rinfo->typelib->data[offset]; + offset += header->field_blob_size; + if (field_blob->has_embedded_type) + offset += header->callback_blob_size; + } + + return offset; +} + +/** + * gi_object_info_get_parent: + * @info: a #GIObjectInfo + * + * Obtain the parent of the object type. + * + * Returns: (transfer full) (nullable): The `GIObjectInfo`. Free the struct by + * calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIObjectInfo * +gi_object_info_get_parent (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->parent) + return (GIObjectInfo *) gi_info_from_entry (rinfo->repository, + rinfo->typelib, blob->parent); + else + return NULL; +} + +/** + * gi_object_info_get_abstract: + * @info: a #GIObjectInfo + * + * Obtain if the object type is an abstract type, i.e. if it cannot be + * instantiated. + * + * Returns: `TRUE` if the object type is abstract + * Since: 2.80 + */ +gboolean +gi_object_info_get_abstract (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), FALSE); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->abstract != 0; +} + +/** + * gi_object_info_get_final: + * @info: a #GIObjectInfo + * + * Checks whether the object type is a final type, i.e. if it cannot + * be derived. + * + * Returns: `TRUE` if the object type is final + * Since: 2.80 + */ +gboolean +gi_object_info_get_final (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *) info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), FALSE); + + blob = (ObjectBlob *) &rinfo->typelib->data[rinfo->offset]; + + return blob->final_ != 0; +} + +/** + * gi_object_info_get_fundamental: + * @info: a #GIObjectInfo + * + * Obtain if the object type is of a fundamental type which is not + * `G_TYPE_OBJECT`. + * + * This is mostly for supporting `GstMiniObject`. + * + * Returns: `TRUE` if the object type is a fundamental type + * Since: 2.80 + */ +gboolean +gi_object_info_get_fundamental (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), FALSE); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->fundamental != 0; +} + +/** + * gi_object_info_get_type_name: + * @info: a #GIObjectInfo + * + * Obtain the name of the object’s class/type. + * + * Returns: name of the object’s type + * Since: 2.80 + */ +const char * +gi_object_info_get_type_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->gtype_name); +} + +/** + * gi_object_info_get_type_init_function_name: + * @info: a #GIObjectInfo + * + * Obtain the name of the function which, when called, will return the + * [type@GObject.Type] for this object type. + * + * Returns: the type init function name + * Since: 2.80 + */ +const char * +gi_object_info_get_type_init_function_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return gi_typelib_get_string (rinfo->typelib, blob->gtype_init); +} + +/** + * gi_object_info_get_n_interfaces: + * @info: a #GIObjectInfo + * + * Obtain the number of interfaces that this object type has. + * + * Returns: number of interfaces + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_interfaces (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_interfaces; +} + +/** + * gi_object_info_get_interface: + * @info: a #GIObjectInfo + * @n: index of interface to get + * + * Obtain an object type interface at index @n. + * + * Returns: (transfer full): The [class@GIRepository.InterfaceInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIInterfaceInfo * +gi_object_info_get_interface (GIObjectInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return (GIInterfaceInfo *) gi_info_from_entry (rinfo->repository, + rinfo->typelib, blob->interfaces[n]); +} + +/** + * gi_object_info_get_n_fields: + * @info: a #GIObjectInfo + * + * Obtain the number of fields that this object type has. + * + * Returns: number of fields + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_fields (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; +} + +/** + * gi_object_info_get_field: + * @info: a #GIObjectInfo + * @n: index of field to get + * + * Obtain an object type field at index @n. + * + * Returns: (transfer full): The [class@GIRepository.FieldInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFieldInfo * +gi_object_info_get_field (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + offset = gi_object_info_get_field_offset(info, n); + + return (GIFieldInfo *) gi_base_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, offset); +} + +/** + * gi_object_info_get_n_properties: + * @info: a #GIObjectInfo + * + * Obtain the number of properties that this object type has. + * + * Returns: number of properties + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_properties (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + return blob->n_properties; +} + +/** + * gi_object_info_get_property: + * @info: a #GIObjectInfo + * @n: index of property to get + * + * Obtain an object type property at index @n. + * + * Returns: (transfer full): The [class@GIRepository.PropertyInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIPropertyInfo * +gi_object_info_get_property (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + n * header->property_blob_size; + + return (GIPropertyInfo *) gi_base_info_new (GI_INFO_TYPE_PROPERTY, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_object_info_get_n_methods: + * @info: a #GIObjectInfo + * + * Obtain the number of methods that this object type has. + * + * Returns: number of methods + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_methods (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; +} + +/** + * gi_object_info_get_method: + * @info: a #GIObjectInfo + * @n: index of method to get + * + * Obtain an object type method at index @n. + * + * Returns: (transfer full): The [class@GIRepository.FunctionInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_object_info_get_method (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size + + n * header->function_blob_size; + + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_object_info_find_method: + * @info: a #GIObjectInfo + * @name: name of method to obtain + * + * Obtain a method of the object type given a @name. + * + * `NULL` will be returned if there’s no method available with that name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.FunctionInfo], + * or `NULL` if no method could be found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_object_info_find_method (GIObjectInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size; + + return gi_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); +} + +/** + * gi_object_info_find_method_using_interfaces: + * @info: a #GIObjectInfo + * @name: name of method to obtain + * @declarer: (out) (transfer full) (optional) (nullable): The + * [class@GIRepository.ObjectInfo] or [class@GIRepository.InterfaceInfo] which + * declares the method, or `NULL` to ignore. If no method is found, this will + * return `NULL`. + * + * Obtain a method of the object given a @name, searching both the + * object @info and any interfaces it implements. + * + * `NULL` will be returned if there’s no method available with that name. + * + * Note that this function does *not* search parent classes; you will have + * to chain up if that’s desired. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.FunctionInfo], + * or `NULL` if none was found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_object_info_find_method_using_interfaces (GIObjectInfo *info, + const char *name, + GIBaseInfo **declarer) +{ + GIFunctionInfo *result = NULL; + GIBaseInfo *declarer_result = NULL; + + result = gi_object_info_find_method (info, name); + if (result) + declarer_result = gi_base_info_ref (info); + + if (result == NULL) + { + int n_interfaces; + int i; + + n_interfaces = gi_object_info_get_n_interfaces (info); + for (i = 0; i < n_interfaces; ++i) + { + GIInterfaceInfo *iface_info; + + iface_info = gi_object_info_get_interface (info, i); + + result = gi_interface_info_find_method (iface_info, name); + + if (result != NULL) + { + declarer_result = GI_BASE_INFO (g_steal_pointer (&iface_info)); + break; + } + gi_base_info_unref ((GIBaseInfo*) iface_info); + } + } + + if (declarer) + *declarer = g_steal_pointer (&declarer_result); + + g_clear_pointer (&declarer_result, gi_base_info_unref); + + return g_steal_pointer (&result); +} + +/** + * gi_object_info_get_n_signals: + * @info: a #GIObjectInfo + * + * Obtain the number of signals that this object type has. + * + * Returns: number of signals + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_signals (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_signals; +} + +/** + * gi_object_info_get_signal: + * @info: a #GIObjectInfo + * @n: index of signal to get + * + * Obtain an object type signal at index @n. + * + * Returns: (transfer full): The [class@GIRepository.SignalInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GISignalInfo * +gi_object_info_get_signal (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + n * header->signal_blob_size; + + return (GISignalInfo *) gi_base_info_new (GI_INFO_TYPE_SIGNAL, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_object_info_find_signal: + * @info: a #GIObjectInfo + * @name: name of signal + * + * Obtain a signal of the object type given a @name. + * + * `NULL` will be returned if there’s no signal available with that name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.SignalInfo], + * or `NULL` if no signal could be found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GISignalInfo * +gi_object_info_find_signal (GIObjectInfo *info, + const char *name) +{ + size_t n_signals; + + n_signals = gi_object_info_get_n_signals (info); + for (size_t i = 0; i < n_signals; i++) + { + GISignalInfo *siginfo = gi_object_info_get_signal (info, i); + + if (g_strcmp0 (gi_base_info_get_name ((GIBaseInfo *) siginfo), name) != 0) + { + gi_base_info_unref ((GIBaseInfo*)siginfo); + continue; + } + + return siginfo; + } + return NULL; +} + + +/** + * gi_object_info_get_n_vfuncs: + * @info: a #GIObjectInfo + * + * Obtain the number of virtual functions that this object type has. + * + * Returns: number of virtual functions + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_vfuncs (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_vfuncs; +} + +/** + * gi_object_info_get_vfunc: + * @info: a #GIObjectInfo + * @n: index of virtual function to get + * + * Obtain an object type virtual function at index @n. + * + * Returns: (transfer full): The [class@GIRepository.VFuncInfo]. Free the struct + * by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_object_info_get_vfunc (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size + + n * header->vfunc_blob_size; + + return (GIVFuncInfo *) gi_base_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_object_info_find_vfunc: + * @info: a #GIObjectInfo + * @name: the name of a virtual function to find. + * + * Locate a virtual function slot with name @name. + * + * Note that the namespace for virtuals is distinct from that of methods; there + * may or may not be a concrete method associated for a virtual. If there is + * one, it may be retrieved using [method@GIRepository.VFuncInfo.get_invoker], + * otherwise that method will return `NULL`. + * + * See the documentation for [method@GIRepository.VFuncInfo.get_invoker] for + * more information on invoking virtuals. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.VFuncInfo], or + * `NULL` if none is found. Free it with [method@GIRepository.BaseInfo.unref] + * when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_object_info_find_vfunc (GIObjectInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size; + + return gi_base_info_find_vfunc (rinfo, offset, blob->n_vfuncs, name); +} + +/** + * gi_object_info_find_vfunc_using_interfaces: + * @info: a #GIObjectInfo + * @name: name of vfunc to obtain + * @declarer: (out) (transfer full) (optional) (nullable): The + * [class@GIRepository.ObjectInfo] or [class@GIRepository.InterfaceInfo] which + * declares the vfunc, or `NULL` to ignore. If no vfunc is found, this will + * return `NULL`. + * + * Locate a virtual function slot with name @name, searching both the object + * @info and any interfaces it implements. + * + * `NULL` will be returned if there’s no vfunc available with that name. + * + * Note that the namespace for virtuals is distinct from that of methods; there + * may or may not be a concrete method associated for a virtual. If there is + * one, it may be retrieved using [method@GIRepository.VFuncInfo.get_invoker], + * otherwise that method will return `NULL`. + * + * Note that this function does *not* search parent classes; you will have + * to chain up if that’s desired. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.VFuncInfo], + * or `NULL` if none was found. Free the struct by calling + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIVFuncInfo * +gi_object_info_find_vfunc_using_interfaces (GIObjectInfo *info, + const char *name, + GIBaseInfo **declarer) +{ + GIVFuncInfo *result = NULL; + GIBaseInfo *declarer_result = NULL; + + result = gi_object_info_find_vfunc (info, name); + if (result) + declarer_result = gi_base_info_ref (info); + + if (result == NULL) + { + int n_interfaces; + int i; + + n_interfaces = gi_object_info_get_n_interfaces (info); + for (i = 0; i < n_interfaces; ++i) + { + GIInterfaceInfo *iface_info; + + iface_info = gi_object_info_get_interface (info, i); + + result = gi_interface_info_find_vfunc (iface_info, name); + + if (result != NULL) + { + declarer_result = GI_BASE_INFO (g_steal_pointer (&iface_info)); + break; + } + gi_base_info_unref ((GIBaseInfo*) iface_info); + } + } + + if (declarer) + *declarer = g_steal_pointer (&declarer_result); + + g_clear_pointer (&declarer_result, gi_base_info_unref); + + return g_steal_pointer (&result); +} + +/** + * gi_object_info_get_n_constants: + * @info: a #GIObjectInfo + * + * Obtain the number of constants that this object type has. + * + * Returns: number of constants + * Since: 2.80 + */ +unsigned int +gi_object_info_get_n_constants (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), 0); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_constants; +} + +/** + * gi_object_info_get_constant: + * @info: a #GIObjectInfo + * @n: index of constant to get + * + * Obtain an object type constant at index @n. + * + * Returns: (transfer full): The [class@GIRepository.ConstantInfo]. Free the + * struct by calling [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIConstantInfo * +gi_object_info_get_constant (GIObjectInfo *info, + unsigned int n) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + header = (Header *)rinfo->typelib->data; + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->object_blob_size + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * header->field_blob_size + + blob->n_field_callbacks * header->callback_blob_size + + blob->n_properties * header->property_blob_size + + blob->n_methods * header->function_blob_size + + blob->n_signals * header->signal_blob_size + + blob->n_vfuncs * header->vfunc_blob_size + + n * header->constant_blob_size; + + return (GIConstantInfo *) gi_base_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_object_info_get_class_struct: + * @info: a #GIObjectInfo + * + * Every [class@GObject.Object] has two structures; an instance structure and a + * class structure. This function returns the metadata for the class structure. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.StructInfo] or + * `NULL` if it’s unknown. Free with [method@GIRepository.BaseInfo.unref] when + * done. + * Since: 2.80 + */ +GIStructInfo * +gi_object_info_get_class_struct (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_struct) + return (GIStructInfo *) gi_info_from_entry (rinfo->repository, + rinfo->typelib, blob->gtype_struct); + else + return NULL; +} + +typedef const char* (*SymbolGetter) (GIObjectInfo *info); + +static void * +_get_func(GIObjectInfo *info, + SymbolGetter getter) +{ + const char* symbol; + GSList *parents = NULL, *l; + GIObjectInfo *parent_info; + void *func = NULL; + + parent_info = (GIObjectInfo *) gi_base_info_ref ((GIBaseInfo *) info); + while (parent_info != NULL) + { + parents = g_slist_prepend (parents, parent_info); + parent_info = gi_object_info_get_parent (parent_info); + } + + for (l = parents; l; l = l->next) + { + parent_info = l->data; + symbol = getter (parent_info); + if (symbol == NULL) + continue; + + gi_typelib_symbol (((GIRealInfo *)parent_info)->typelib, symbol, (gpointer*) &func); + if (func) + break; + } + + g_slist_free_full (parents, (GDestroyNotify) gi_base_info_unref); + return func; +} + +/** + * gi_object_info_get_ref_function_name: + * @info: a #GIObjectInfo + * + * Obtain the symbol name of the function that should be called to ref this + * object type. + * + * It’s mainly used for fundamental types. The type signature for + * the symbol is [type@GIRepository.ObjectInfoRefFunction]. To fetch the + * function pointer see + * [method@GIRepository.ObjectInfo.get_ref_function_pointer]. + * + * Returns: (nullable): the symbol, or `NULL` if the object type has no ref + * function + * Since: 2.80 + */ +const char * +gi_object_info_get_ref_function_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->ref_func) + return gi_typelib_get_string (rinfo->typelib, blob->ref_func); + + return NULL; +} + +/** + * gi_object_info_get_ref_function_pointer: (skip) + * @info: a #GIObjectInfo + * + * Obtain a pointer to a function which can be used to + * increase the reference count an instance of this object type. + * + * This takes derivation into account and will reversely traverse + * the base classes of this type, starting at the top type. + * + * Returns: (nullable): the function pointer, or `NULL` if the object type has + * no ref function + * Since: 2.80 + */ +GIObjectInfoRefFunction +gi_object_info_get_ref_function_pointer (GIObjectInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + return (GIObjectInfoRefFunction)_get_func(info, (SymbolGetter)gi_object_info_get_ref_function_name); +} + +/** + * gi_object_info_get_unref_function_name: + * @info: a #GIObjectInfo + * + * Obtain the symbol name of the function that should be called to unref this + * object type. + * + * It’s mainly used for fundamental types. The type signature for the symbol is + * [type@GIRepository.ObjectInfoUnrefFunction]. To fetch the function pointer + * see [method@GIRepository.ObjectInfo.get_unref_function_pointer]. + * + * Returns: (nullable): the symbol, or `NULL` if the object type has no unref + * function + * Since: 2.80 + */ +const char * +gi_object_info_get_unref_function_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->unref_func) + return gi_typelib_get_string (rinfo->typelib, blob->unref_func); + + return NULL; +} + +/** + * gi_object_info_get_unref_function_pointer: (skip) + * @info: a #GIObjectInfo + * + * Obtain a pointer to a function which can be used to + * decrease the reference count an instance of this object type. + * + * This takes derivation into account and will reversely traverse + * the base classes of this type, starting at the top type. + * + * Returns: (nullable): the function pointer, or `NULL` if the object type has + * no unref function + * Since: 2.80 + */ +GIObjectInfoUnrefFunction +gi_object_info_get_unref_function_pointer (GIObjectInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + return (GIObjectInfoUnrefFunction)_get_func(info, (SymbolGetter)gi_object_info_get_unref_function_name); +} + +/** + * gi_object_info_get_set_value_function_name: + * @info: a #GIObjectInfo + * + * Obtain the symbol name of the function that should be called to set a + * [type@GObject.Value], given an object instance pointer of this object type. + * + * It’s mainly used for fundamental types. The type signature for the symbol + * is [type@GIRepository.ObjectInfoSetValueFunction]. To fetch the function + * pointer see [method@GIRepository.ObjectInfo.get_set_value_function_pointer]. + * + * Returns: (nullable): the symbol, or `NULL` if the object type has no + * set-value function + * Since: 2.80 + */ +const char * +gi_object_info_get_set_value_function_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->set_value_func) + return gi_typelib_get_string (rinfo->typelib, blob->set_value_func); + + return NULL; +} + +/** + * gi_object_info_get_set_value_function_pointer: (skip) + * @info: a #GIObjectInfo + * + * Obtain a pointer to a function which can be used to set a + * [type@GObject.Value], given an instance of this object type. + * + * This takes derivation into account and will reversely traverse + * the base classes of this type, starting at the top type. + * + * Returns: (nullable): the function pointer, or `NULL` if the object type has + * no set-value function + * Since: 2.80 + */ +GIObjectInfoSetValueFunction +gi_object_info_get_set_value_function_pointer (GIObjectInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + return (GIObjectInfoSetValueFunction)_get_func(info, (SymbolGetter)gi_object_info_get_set_value_function_name); +} + +/** + * gi_object_info_get_get_value_function_name: + * @info: a #GIObjectInfo + * + * Obtain the symbol name of the function that should be called to convert + * an object instance pointer of this object type to a [type@GObject.Value]. + * + * It’s mainly used for fundamental types. The type signature for the symbol + * is [type@GIRepository.ObjectInfoGetValueFunction]. To fetch the function + * pointer see [method@GIRepository.ObjectInfo.get_get_value_function_pointer]. + * + * Returns: (nullable): the symbol, or `NULL` if the object type has no + * get-value function + * Since: 2.80 + */ +const char * +gi_object_info_get_get_value_function_name (GIObjectInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ObjectBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + blob = (ObjectBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->get_value_func) + return gi_typelib_get_string (rinfo->typelib, blob->get_value_func); + + return NULL; +} + +/** + * gi_object_info_get_get_value_function_pointer: (skip) + * @info: a #GIObjectInfo + * + * Obtain a pointer to a function which can be used to extract an instance of + * this object type out of a [type@GObject.Value]. + * + * This takes derivation into account and will reversely traverse + * the base classes of this type, starting at the top type. + * + * Returns: (nullable): the function pointer, or `NULL` if the object type has + * no get-value function + * Since: 2.80 + */ +GIObjectInfoGetValueFunction +gi_object_info_get_get_value_function_pointer (GIObjectInfo *info) +{ + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_OBJECT_INFO (info), NULL); + + return (GIObjectInfoGetValueFunction)_get_func(info, (SymbolGetter)gi_object_info_get_get_value_function_name); +} + +void +gi_object_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_OBJECT; +} diff --git a/girepository/giobjectinfo.h b/girepository/giobjectinfo.h new file mode 100644 index 0000000..cb65270 --- /dev/null +++ b/girepository/giobjectinfo.h @@ -0,0 +1,230 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Object + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +/** + * GIObjectInfoRefFunction: (skip) + * @object: object instance pointer + * + * Increases the reference count of an object instance. + * + * Returns: (transfer full): the object instance + * Since: 2.80 + */ +typedef void * (*GIObjectInfoRefFunction) (void *object); + +/** + * GIObjectInfoUnrefFunction: (skip) + * @object: (transfer full): object instance pointer + * + * Decreases the reference count of an object instance. + * + * Since: 2.80 + */ +typedef void (*GIObjectInfoUnrefFunction) (void *object); + +/** + * GIObjectInfoSetValueFunction: (skip) + * @value: a [type@GObject.Value] + * @object: object instance pointer + * + * Update @value and attach the object instance pointer @object to it. + * + * Since: 2.80 + */ +typedef void (*GIObjectInfoSetValueFunction) (GValue *value, void *object); + +/** + * GIObjectInfoGetValueFunction: (skip) + * @value: a [type@GObject.Value] + * + * Extract an object instance out of @value. + * + * Returns: (transfer full): the object instance + * Since: 2.80 + */ +typedef void * (*GIObjectInfoGetValueFunction) (const GValue *value); + +#define GI_TYPE_OBJECT_INFO (gi_object_info_get_type ()) + +/** + * GI_OBJECT_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.ObjectInfo] or derived pointer into a + * `(GIObjectInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_OBJECT_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_OBJECT_INFO, GIObjectInfo)) + +/** + * GI_IS_OBJECT_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.ObjectInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_OBJECT_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_OBJECT_INFO)) + + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_type_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_type_init_function_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_object_info_get_abstract (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_object_info_get_final (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_object_info_get_fundamental (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIObjectInfo * gi_object_info_get_parent (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_interfaces (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIInterfaceInfo * gi_object_info_get_interface (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_fields (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIFieldInfo * gi_object_info_get_field (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_properties (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIPropertyInfo * gi_object_info_get_property (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_methods (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_object_info_get_method (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_object_info_find_method (GIObjectInfo *info, + const char *name); + + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_object_info_find_method_using_interfaces (GIObjectInfo *info, + const char *name, + GIBaseInfo **declarer); + + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_signals (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GISignalInfo * gi_object_info_get_signal (GIObjectInfo *info, + unsigned int n); + + +GI_AVAILABLE_IN_ALL +GISignalInfo * gi_object_info_find_signal (GIObjectInfo *info, + const char *name); + + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_vfuncs (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_object_info_get_vfunc (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_object_info_find_vfunc (GIObjectInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_object_info_find_vfunc_using_interfaces (GIObjectInfo *info, + const char *name, + GIBaseInfo **declarer); + +GI_AVAILABLE_IN_ALL +unsigned int gi_object_info_get_n_constants (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIConstantInfo * gi_object_info_get_constant (GIObjectInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIStructInfo * gi_object_info_get_class_struct (GIObjectInfo *info); + + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_ref_function_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIObjectInfoRefFunction gi_object_info_get_ref_function_pointer (GIObjectInfo *info); + + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_unref_function_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIObjectInfoUnrefFunction gi_object_info_get_unref_function_pointer (GIObjectInfo *info); + + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_set_value_function_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIObjectInfoSetValueFunction gi_object_info_get_set_value_function_pointer (GIObjectInfo *info); + + +GI_AVAILABLE_IN_ALL +const char * gi_object_info_get_get_value_function_name (GIObjectInfo *info); + +GI_AVAILABLE_IN_ALL +GIObjectInfoGetValueFunction gi_object_info_get_get_value_function_pointer (GIObjectInfo *info); + + +G_END_DECLS diff --git a/girepository/gipropertyinfo.c b/girepository/gipropertyinfo.c new file mode 100644 index 0000000..9aaed45 --- /dev/null +++ b/girepository/gipropertyinfo.c @@ -0,0 +1,228 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Property implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gipropertyinfo.h" + +/** + * GIPropertyInfo: + * + * `GIPropertyInfo` represents a property in a [class@GObject.Object]. + * + * A property belongs to either a [class@GIRepository.ObjectInfo] or a + * [class@GIRepository.InterfaceInfo]. + * + * Since: 2.80 + */ + +/** + * gi_property_info_get_flags: + * @info: a #GIPropertyInfo + * + * Obtain the flags for this property info. + * + * See [type@GObject.ParamFlags] for more information about possible flag + * values. + * + * Returns: the flags + * Since: 2.80 + */ +GParamFlags +gi_property_info_get_flags (GIPropertyInfo *info) +{ + GParamFlags flags; + GIRealInfo *rinfo = (GIRealInfo *)info; + PropertyBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_PROPERTY_INFO (info), 0); + + blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + + if (blob->readable) + flags = flags | G_PARAM_READABLE; + + if (blob->writable) + flags = flags | G_PARAM_WRITABLE; + + if (blob->construct) + flags = flags | G_PARAM_CONSTRUCT; + + if (blob->construct_only) + flags = flags | G_PARAM_CONSTRUCT_ONLY; + + return flags; +} + +/** + * gi_property_info_get_type_info: + * @info: a #GIPropertyInfo + * + * Obtain the type information for the property @info. + * + * Returns: (transfer full): The [class@GIRepository.TypeInfo]. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GITypeInfo * +gi_property_info_get_type_info (GIPropertyInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_PROPERTY_INFO (info), NULL); + + return gi_type_info_new ((GIBaseInfo*)info, + rinfo->typelib, + rinfo->offset + G_STRUCT_OFFSET (PropertyBlob, type)); +} + +/** + * gi_property_info_get_ownership_transfer: + * @info: a #GIPropertyInfo + * + * Obtain the ownership transfer for this property. + * + * See [type@GIRepository.Transfer] for more information about transfer values. + * + * Returns: the transfer + * Since: 2.80 + */ +GITransfer +gi_property_info_get_ownership_transfer (GIPropertyInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + PropertyBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_PROPERTY_INFO (info), -1); + + blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->transfer_ownership) + return GI_TRANSFER_EVERYTHING; + else if (blob->transfer_container_ownership) + return GI_TRANSFER_CONTAINER; + else + return GI_TRANSFER_NOTHING; +} + +/** + * gi_property_info_get_setter: + * @info: a #GIPropertyInfo + * + * Obtains the setter function associated with this `GIPropertyInfo`. + * + * The setter is only available for `G_PARAM_WRITABLE` properties that + * are also not `G_PARAM_CONSTRUCT_ONLY`. + * + * Returns: (transfer full) (nullable): The function info, or `NULL` if not set. + * Free it with [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_property_info_get_setter (GIPropertyInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + PropertyBlob *blob; + GIBaseInfo *container; + GIInfoType parent_type; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_PROPERTY_INFO (info), NULL); + + blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + if (!blob->writable || blob->construct_only) + return NULL; + + if (blob->setter == ACCESSOR_SENTINEL) + return NULL; + + container = rinfo->container; + parent_type = gi_base_info_get_info_type (container); + if (parent_type == GI_INFO_TYPE_OBJECT) + return gi_object_info_get_method ((GIObjectInfo *) container, blob->setter); + else if (parent_type == GI_INFO_TYPE_INTERFACE) + return gi_interface_info_get_method ((GIInterfaceInfo *) container, blob->setter); + else + return NULL; +} + +/** + * gi_property_info_get_getter: + * @info: a #GIPropertyInfo + * + * Obtains the getter function associated with this `GIPropertyInfo`. + * + * The setter is only available for `G_PARAM_READABLE` properties. + * + * Returns: (transfer full) (nullable): The function info, or `NULL` if not set. + * Free it with [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_property_info_get_getter (GIPropertyInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + PropertyBlob *blob; + GIBaseInfo *container; + GIInfoType parent_type; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_PROPERTY_INFO (info), NULL); + + blob = (PropertyBlob *)&rinfo->typelib->data[rinfo->offset]; + if (!blob->readable) + return NULL; + + if (blob->getter == ACCESSOR_SENTINEL) + return NULL; + + container = rinfo->container; + parent_type = gi_base_info_get_info_type (container); + if (parent_type == GI_INFO_TYPE_OBJECT) + return gi_object_info_get_method ((GIObjectInfo *) container, blob->getter); + else if (parent_type == GI_INFO_TYPE_INTERFACE) + return gi_interface_info_get_method ((GIInterfaceInfo *) container, blob->getter); + else + return NULL; +} + +void +gi_property_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_PROPERTY; +} diff --git a/girepository/gipropertyinfo.h b/girepository/gipropertyinfo.h new file mode 100644 index 0000000..a21831a --- /dev/null +++ b/girepository/gipropertyinfo.h @@ -0,0 +1,77 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Property + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_PROPERTY_INFO (gi_property_info_get_type ()) + +/** + * GI_PROPERTY_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.PropertyInfo] or derived pointer into a + * `(GIPropertyInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_PROPERTY_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_PROPERTY_INFO, GIPropertyInfo)) + +/** + * GI_IS_PROPERTY_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.PropertyInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_PROPERTY_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_PROPERTY_INFO)) + + +GI_AVAILABLE_IN_ALL +GParamFlags gi_property_info_get_flags (GIPropertyInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeInfo *gi_property_info_get_type_info (GIPropertyInfo *info); + +GI_AVAILABLE_IN_ALL +GITransfer gi_property_info_get_ownership_transfer (GIPropertyInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo *gi_property_info_get_setter (GIPropertyInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo *gi_property_info_get_getter (GIPropertyInfo *info); + +G_END_DECLS diff --git a/girepository/giregisteredtypeinfo.c b/girepository/giregisteredtypeinfo.c new file mode 100644 index 0000000..4312cba --- /dev/null +++ b/girepository/giregisteredtypeinfo.c @@ -0,0 +1,229 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Registered Type implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giregisteredtypeinfo.h" + +/** + * GIRegisteredTypeInfo: + * + * `GIRegisteredTypeInfo` represents an entity with a [type@GObject.Type] + * associated. + * + * Could be either a [class@GIRepository.EnumInfo], + * [class@GIRepository.InterfaceInfo], [class@GIRepository.ObjectInfo], + * [class@GIRepository.StructInfo] or a [class@GIRepository.UnionInfo]. + * + * A registered type info struct has a name and a type function. + * + * To get the name call [method@GIRepository.RegisteredTypeInfo.get_type_name]. + * Most users want to call [method@GIRepository.RegisteredTypeInfo.get_g_type] + * and don’t worry about the rest of the details. + * + * If the registered type is a subtype of `G_TYPE_BOXED`, + * [method@GIRepository.RegisteredTypeInfo.is_boxed] will return true, and + * [method@GIRepository.RegisteredTypeInfo.get_type_name] is guaranteed to + * return a non-`NULL` value. This is relevant for the + * [class@GIRepository.StructInfo] and [class@GIRepository.UnionInfo] + * subclasses. + * + * Since: 2.80 + */ + +/** + * gi_registered_type_info_get_type_name: + * @info: a #GIRegisteredTypeInfo + * + * Obtain the type name of the struct within the GObject type system. + * + * This type can be passed to [func@GObject.type_name] to get a + * [type@GObject.Type]. + * + * Returns: (nullable): the type name, or `NULL` if unknown + * Since: 2.80 + */ +const char * +gi_registered_type_info_get_type_name (GIRegisteredTypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + RegisteredTypeBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_REGISTERED_TYPE_INFO (info), NULL); + + blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_name) + return gi_typelib_get_string (rinfo->typelib, blob->gtype_name); + + return NULL; +} + +/** + * gi_registered_type_info_get_type_init_function_name: + * @info: a #GIRegisteredTypeInfo + * + * Obtain the type init function for @info. + * + * The type init function is the function which will register the + * [type@GObject.Type] within the GObject type system. Usually this is not + * called by language bindings or applications — use + * [method@GIRepository.RegisteredTypeInfo.get_g_type] directly instead. + * + * Returns: (nullable): the symbol name of the type init function, suitable for + * passing into [method@GModule.Module.symbol], or `NULL` if unknown + * Since: 2.80 + */ +const char * +gi_registered_type_info_get_type_init_function_name (GIRegisteredTypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + RegisteredTypeBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_REGISTERED_TYPE_INFO (info), NULL); + + blob = (RegisteredTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->gtype_init) + return gi_typelib_get_string (rinfo->typelib, blob->gtype_init); + + return NULL; +} + +/** + * gi_registered_type_info_get_g_type: + * @info: a #GIRegisteredTypeInfo + * + * Obtain the [type@GObject.Type] for this registered type. + * + * If there is no type information associated with @info, or the shared library + * which provides the `type_init` function for @info cannot be called, then + * `G_TYPE_NONE` is returned. + * + * Returns: the [type@GObject.Type], or `G_TYPE_NONE` if unknown + * Since: 2.80 + */ +GType +gi_registered_type_info_get_g_type (GIRegisteredTypeInfo *info) +{ + const char *type_init; + GType (* get_type_func) (void); + GIRealInfo *rinfo = (GIRealInfo*)info; + + g_return_val_if_fail (info != NULL, G_TYPE_INVALID); + g_return_val_if_fail (GI_IS_REGISTERED_TYPE_INFO (info), G_TYPE_INVALID); + + type_init = gi_registered_type_info_get_type_init_function_name (info); + + if (type_init == NULL) + return G_TYPE_NONE; + else if (!strcmp (type_init, "intern")) + /* The special string "intern" is used for some types exposed by libgobject + (that therefore should be always available) */ + return g_type_from_name (gi_registered_type_info_get_type_name (info)); + + get_type_func = NULL; + if (!gi_typelib_symbol (rinfo->typelib, + type_init, + (void**) &get_type_func)) + return G_TYPE_NONE; + + return (* get_type_func) (); +} + +/** + * gi_registered_type_info_is_boxed: + * @info: a #GIRegisteredTypeInfo + * + * Get whether the registered type is a boxed type. + * + * A boxed type is a subtype of the fundamental `G_TYPE_BOXED` type. + * It’s a type which has registered a [type@GObject.Type], and which has + * associated copy and free functions. + * + * Most boxed types are `struct`s; some are `union`s; and it’s possible for a + * boxed type to be neither, but that is currently unsupported by + * libgirepository. It’s also possible for a `struct` or `union` to have + * associated copy and/or free functions *without* being a boxed type, by virtue + * of not having registered a [type@GObject.Type]. + * + * This function will return false for [type@GObject.Type]s which are not boxed, + * such as classes or interfaces. It will also return false for the `struct`s + * associated with a class or interface, which return true from + * [method@GIRepository.StructInfo.is_gtype_struct]. + * + * Returns: true if @info is a boxed type + * Since: 2.80 + */ +gboolean +gi_registered_type_info_is_boxed (GIRegisteredTypeInfo *info) +{ + GIBaseInfo *base_info = GI_BASE_INFO (info); + const RegisteredTypeBlob *blob; + + g_return_val_if_fail (GI_IS_REGISTERED_TYPE_INFO (info), G_TYPE_INVALID); + + blob = (const RegisteredTypeBlob *) &base_info->typelib->data[base_info->offset]; + + if (blob->blob_type == BLOB_TYPE_BOXED) + { + return TRUE; + } + else if (blob->blob_type == BLOB_TYPE_STRUCT) + { + const StructBlob *struct_blob = (const StructBlob *) &base_info->typelib->data[base_info->offset]; + + return !struct_blob->unregistered; + } + else if (blob->blob_type == BLOB_TYPE_UNION) + { + const UnionBlob *union_blob = (const UnionBlob *) &base_info->typelib->data[base_info->offset]; + + return !union_blob->unregistered; + } + + /* We don’t currently support boxed ‘other’ types (boxed types which aren’t + * a struct or union. */ + + return FALSE; +} + +void +gi_registered_type_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_REGISTERED_TYPE; +} diff --git a/girepository/giregisteredtypeinfo.h b/girepository/giregisteredtypeinfo.h new file mode 100644 index 0000000..a6fe2dd --- /dev/null +++ b/girepository/giregisteredtypeinfo.h @@ -0,0 +1,75 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Registered Type + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define GI_TYPE_REGISTERED_TYPE_INFO (gi_registered_type_info_get_type ()) + +/** + * GI_REGISTERED_TYPE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.RegisteredTypeInfo] or derived pointer into a + * `(GIRegisteredTypeInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_REGISTERED_TYPE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_REGISTERED_TYPE_INFO, GIRegisteredTypeInfo)) + +/** + * GI_IS_REGISTERED_TYPE_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.RegisteredTypeInfo] or derived from + * it. + * + * Since: 2.80 + */ +#define GI_IS_REGISTERED_TYPE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_REGISTERED_TYPE_INFO)) + +GI_AVAILABLE_IN_ALL +const char * gi_registered_type_info_get_type_name (GIRegisteredTypeInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_registered_type_info_get_type_init_function_name (GIRegisteredTypeInfo *info); + +GI_AVAILABLE_IN_ALL +GType gi_registered_type_info_get_g_type (GIRegisteredTypeInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_registered_type_info_is_boxed (GIRegisteredTypeInfo *info); + +G_END_DECLS diff --git a/girepository/girepository-autocleanups.h b/girepository/girepository-autocleanups.h new file mode 100644 index 0000000..d48e7b2 --- /dev/null +++ b/girepository/girepository-autocleanups.h @@ -0,0 +1,56 @@ +/* + * Copyright 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Author: Philip Withnall + */ + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef __GI_SCANNER__ + +/* GIRepository already has its cleanups defined by G_DECLARE_FINAL_TYPE */ +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GITypelib, gi_typelib_unref) + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIBaseInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIArgInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GICallableInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GICallbackInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIConstantInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIEnumInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIFieldInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIFlagsInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIFunctionInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIInterfaceInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIObjectInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIPropertyInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIRegisteredTypeInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GISignalInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIStructInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GITypeInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIUnionInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIUnresolvedInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIValueInfo, gi_base_info_unref) +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GIVFuncInfo, gi_base_info_unref) + +/* These types can additionally be stack allocated and cleared */ +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GIArgInfo, gi_base_info_clear) +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GITypeInfo, gi_base_info_clear) + +#endif /* __GI_SCANNER__ */ diff --git a/girepository/girepository-private.h b/girepository/girepository-private.h new file mode 100644 index 0000000..8ff3123 --- /dev/null +++ b/girepository/girepository-private.h @@ -0,0 +1,339 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Private headers + * + * Copyright (C) 2010 Johan Dahlin + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include + +#define __GIREPOSITORY_H_INSIDE__ + +#include +#include +#include + +#include "gitypelib-internal.h" + +/* FIXME: For now, GIRealInfo is a compatibility define. This will eventually + * be removed. */ +typedef struct _GIBaseInfo GIRealInfo; + +/* + * We just use one structure for all of the info object + * types; in general, we should be reading data directly + * from the typelib, and not having computed data in + * per-type structures. + */ +struct _GIBaseInfo +{ + /*< private >*/ + GTypeInstance parent_instance; + gatomicrefcount ref_count; + + /* @repository is never reffed, as that would lead to a refcount cycle with the repository */ + GIRepository *repository; + /* @container is reffed if the GIBaseInfo is heap-allocated, but not reffed if it’s stack-allocated */ + GIBaseInfo *container; + + GITypelib *typelib; + uint32_t offset; + + uint32_t type_is_embedded : 1; /* Used by GITypeInfo */ + + /* A copy of GIBaseInfo is exposed publicly for stack-allocated derivatives + * such as GITypeInfo, so its size is now ABI. */ + void *padding[6]; +}; + +G_STATIC_ASSERT (sizeof (GIBaseInfo) == sizeof (GIBaseInfoStack)); +G_STATIC_ASSERT (G_ALIGNOF (GIBaseInfo) == G_ALIGNOF (GIBaseInfoStack)); + +/** + * GIInfoType: + * @GI_INFO_TYPE_INVALID: invalid type + * @GI_INFO_TYPE_FUNCTION: function, see [class@GIRepository.FunctionInfo] + * @GI_INFO_TYPE_CALLBACK: callback, see [class@GIRepository.FunctionInfo] + * @GI_INFO_TYPE_STRUCT: struct, see [class@GIRepository.StructInfo] + * @GI_INFO_TYPE_ENUM: enum, see [class@GIRepository.EnumInfo] + * @GI_INFO_TYPE_FLAGS: flags, see [class@GIRepository.EnumInfo] + * @GI_INFO_TYPE_OBJECT: object, see [class@GIRepository.ObjectInfo] + * @GI_INFO_TYPE_INTERFACE: interface, see [class@GIRepository.InterfaceInfo] + * @GI_INFO_TYPE_CONSTANT: constant, see [class@GIRepository.ConstantInfo] + * @GI_INFO_TYPE_UNION: union, see [class@GIRepository.UnionInfo] + * @GI_INFO_TYPE_VALUE: enum value, see [class@GIRepository.ValueInfo] + * @GI_INFO_TYPE_SIGNAL: signal, see [class@GIRepository.SignalInfo] + * @GI_INFO_TYPE_VFUNC: virtual function, see [class@GIRepository.VFuncInfo] + * @GI_INFO_TYPE_PROPERTY: [class@GObject.Object] property, see + * [class@GIRepository.PropertyInfo] + * @GI_INFO_TYPE_FIELD: struct or union field, see + * [class@GIRepository.FieldInfo] + * @GI_INFO_TYPE_ARG: argument of a function or callback, see + * [class@GIRepository.ArgInfo] + * @GI_INFO_TYPE_TYPE: type information, see [class@GIRepository.TypeInfo] + * @GI_INFO_TYPE_UNRESOLVED: unresolved type, a type which is not present in + * the typelib, or any of its dependencies, see + * [class@GIRepository.UnresolvedInfo] + * @GI_INFO_TYPE_CALLABLE: an abstract type representing any callable (function, + * callback, vfunc), see [class@GIRepository.CallableInfo] + * @GI_INFO_TYPE_REGISTERED_TYPE: an abstract type representing any registered + * type (enum, interface, object, struct, union), see + * [class@GIRepository.RegisteredTypeInfo] + * + * The type of a [class@GIRepository.BaseInfo] struct. + * + * See [const@GIRepository.INFO_TYPE_N_TYPES] for the total number of elements + * in this enum. + * + * Since: 2.80 + */ +typedef enum +{ + /* The values here must be kept in sync with GITypelibBlobType */ + GI_INFO_TYPE_INVALID, + GI_INFO_TYPE_FUNCTION, + GI_INFO_TYPE_CALLBACK, + GI_INFO_TYPE_STRUCT, + /* 4 is skipped, it used to be BOXED, but was removed in girepository 2.80. + * It is still part of the binary format in GITypelibBlobType. */ + GI_INFO_TYPE_ENUM = 5, /* 5 */ + GI_INFO_TYPE_FLAGS = 6, + GI_INFO_TYPE_OBJECT = 7, + GI_INFO_TYPE_INTERFACE = 8, + GI_INFO_TYPE_CONSTANT = 9, + /* 10 is skipped, it used to be used, but was removed before girepository-2.0 + * It is, however, part of the binary format in GITypelibBlobType */ + GI_INFO_TYPE_UNION = 11, + GI_INFO_TYPE_VALUE = 12, + GI_INFO_TYPE_SIGNAL = 13, + GI_INFO_TYPE_VFUNC = 14, + GI_INFO_TYPE_PROPERTY = 15, + GI_INFO_TYPE_FIELD = 16, + GI_INFO_TYPE_ARG = 17, + GI_INFO_TYPE_TYPE = 18, + GI_INFO_TYPE_UNRESOLVED = 19, + GI_INFO_TYPE_CALLABLE = 20, + GI_INFO_TYPE_REGISTERED_TYPE = 21, + /* keep GI_INFO_TYPE_N_TYPES in sync with this */ +} GIInfoType; + +GIInfoType gi_typelib_blob_type_to_info_type (GITypelibBlobType blob_type); + +/** + * GI_INFO_TYPE_N_TYPES: + * + * Number of entries in [enum@GIRepository.InfoType]. + * + * Since: 2.80 + */ +#define GI_INFO_TYPE_N_TYPES (GI_INFO_TYPE_REGISTERED_TYPE + 1) + +const char * gi_info_type_to_string (GIInfoType type); + +/* Subtypes */ +struct _GICallableInfo +{ + GIBaseInfo parent; +}; + +void gi_callable_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIFunctionInfo +{ + GICallableInfo parent; +}; + +void gi_function_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GICallbackInfo +{ + GICallableInfo parent; +}; + +void gi_callback_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIRegisteredTypeInfo +{ + GIBaseInfo parent; +}; + +void gi_registered_type_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIStructInfo +{ + GIRegisteredTypeInfo parent; +}; + +void gi_struct_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIUnionInfo +{ + GIRegisteredTypeInfo parent; +}; + +void gi_union_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIEnumInfo +{ + GIRegisteredTypeInfo parent; +}; + +void gi_enum_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIFlagsInfo +{ + GIEnumInfo parent; +}; + +void gi_flags_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIObjectInfo +{ + GIRegisteredTypeInfo parent; +}; + +void gi_object_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIInterfaceInfo +{ + GIRegisteredTypeInfo parent; +}; + +void gi_interface_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIConstantInfo +{ + GIBaseInfo parent; +}; + +void gi_constant_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIValueInfo +{ + GIBaseInfo parent; +}; + +void gi_value_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GISignalInfo +{ + GICallableInfo parent; +}; + +void gi_signal_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIVFuncInfo +{ + GICallableInfo parent; +}; + +void gi_vfunc_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIPropertyInfo +{ + GIBaseInfo parent; +}; + +void gi_property_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIFieldInfo +{ + GIBaseInfo parent; +}; + +void gi_field_info_class_init (gpointer g_class, + gpointer class_data); + +/* GIArgInfo is stack-allocatable so it can be used with + * gi_callable_info_load_return_type() and gi_callable_info_load_arg(), so its + * definition is actually public in gitypes.h. */ + +void gi_arg_info_class_init (gpointer g_class, + gpointer class_data); + +/* GITypeInfo is stack-allocatable so it can be used with + * gi_arg_info_load_type_info(), so its definition is actually public in + * gitypes.h. */ + +void gi_type_info_class_init (gpointer g_class, + gpointer class_data); + +struct _GIUnresolvedInfo +{ + GIBaseInfo parent; + + const char *name; + const char *namespace; +}; + +void gi_unresolved_info_class_init (gpointer g_class, + gpointer class_data); + +void gi_info_init (GIRealInfo *info, + GType type, + GIRepository *repository, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset); + +GIBaseInfo * gi_info_from_entry (GIRepository *repository, + GITypelib *typelib, + uint16_t index); + +GIBaseInfo * gi_info_new_full (GIInfoType type, + GIRepository *repository, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset); + +GITypeInfo * gi_type_info_new (GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset); + +void gi_type_info_init (GITypeInfo *info, + GIBaseInfo *container, + GITypelib *typelib, + uint32_t offset); + +GIFunctionInfo * gi_base_info_find_method (GIBaseInfo *base, + uint32_t offset, + uint16_t n_methods, + const char *name); + +GIVFuncInfo * gi_base_info_find_vfunc (GIRealInfo *rinfo, + uint32_t offset, + uint16_t n_vfuncs, + const char *name); diff --git a/girepository/girepository.c b/girepository/girepository.c new file mode 100644 index 0000000..24d83ca --- /dev/null +++ b/girepository/girepository.c @@ -0,0 +1,2117 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Repository implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008 Colin Walters + * Copyright (C) 2008 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include +#include + +#include +#include +#include +#include "gibaseinfo-private.h" +#include "girepository.h" +#include "gitypelib-internal.h" +#include "girepository-private.h" + +/** + * GIRepository: + * + * `GIRepository` is used to manage repositories of namespaces. Namespaces + * are represented on disk by type libraries (`.typelib` files). + * + * The individual pieces of API within a type library are represented by + * subclasses of [class@GIRepository.BaseInfo]. These can be found using + * methods like [method@GIRepository.Repository.find_by_name] or + * [method@GIRepository.Repository.get_info]. + * + * You are responsible for ensuring that the lifetime of the + * [class@GIRepository.Repository] exceeds that of the lifetime of any of its + * [class@GIRepository.BaseInfo]s. This cannot be guaranteed by using internal + * references within libgirepository as that would affect performance. + * + * ### Discovery of type libraries + * + * `GIRepository` will typically look for a `girepository-1.0` directory + * under the library directory used when compiling gobject-introspection. On a + * standard Linux system this will end up being `/usr/lib/girepository-1.0`. + * + * It is possible to control the search paths programmatically, using + * [method@GIRepository.Repository.prepend_search_path]. It is also possible to + * modify the search paths by using the `GI_TYPELIB_PATH` environment variable. + * The environment variable takes precedence over the default search path + * and the [method@GIRepository.Repository.prepend_search_path] calls. + * + * Since: 2.80 + */ + +/* The namespace and version corresponding to libgirepository itself, so + * that we can refuse to load typelibs corresponding to the older, + * incompatible version of this same library in gobject-introspection. */ +#define GIREPOSITORY_TYPELIB_NAME "GIRepository" +#define GIREPOSITORY_TYPELIB_VERSION "3.0" +#define GIREPOSITORY_TYPELIB_FILENAME \ + GIREPOSITORY_TYPELIB_NAME "-" GIREPOSITORY_TYPELIB_VERSION ".typelib" + +typedef struct { + size_t n_interfaces; + GIBaseInfo *interfaces[]; +} GTypeInterfaceCache; + +static void +gtype_interface_cache_free (gpointer data) +{ + GTypeInterfaceCache *cache = data; + + for (size_t i = 0; i < cache->n_interfaces; i++) + gi_base_info_unref ((GIBaseInfo*) cache->interfaces[i]); + g_free (cache); +} + +struct _GIRepository +{ + GObject parent; + + GPtrArray *typelib_search_path; /* (element-type filename) (owned) */ + GPtrArray *library_paths; /* (element-type filename) (owned) */ + + GHashTable *typelibs; /* (string) namespace -> GITypelib */ + GHashTable *lazy_typelibs; /* (string) namespace-version -> GITypelib */ + GHashTable *info_by_gtype; /* GType -> GIBaseInfo */ + GHashTable *info_by_error_domain; /* GQuark -> GIBaseInfo */ + GHashTable *interfaces_for_gtype; /* GType -> GTypeInterfaceCache */ + GHashTable *unknown_gtypes; /* hashset of GType */ + + char **cached_shared_libraries; /* (owned) (nullable) (array zero-terminated=1) */ + size_t cached_n_shared_libraries; /* length of @cached_shared_libraries, not including NULL terminator */ +}; + +G_DEFINE_TYPE (GIRepository, gi_repository, G_TYPE_OBJECT); + +#ifdef G_PLATFORM_WIN32 + +#include + +static HMODULE girepository_dll = NULL; + +#ifdef DLL_EXPORT + +BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + if (fdwReason == DLL_PROCESS_ATTACH) + girepository_dll = hinstDLL; + + return TRUE; +} + +#endif + +#undef GOBJECT_INTROSPECTION_LIBDIR + +/* GOBJECT_INTROSPECTION_LIBDIR is used only in code called just once, + * so no problem leaking this + */ +#define GOBJECT_INTROSPECTION_LIBDIR \ + g_build_filename (g_win32_get_package_installation_directory_of_module (girepository_dll), \ + "lib", \ + NULL) + +#endif + +static void +gi_repository_init (GIRepository *repository) +{ + /* typelib search path */ + { + const char *libdir; + char *typelib_dir; + const char *type_lib_path_env; + + /* This variable is intended to take precedence over both: + * - the default search path; + * - all gi_repository_prepend_search_path() calls. + */ + type_lib_path_env = g_getenv ("GI_TYPELIB_PATH"); + + if (type_lib_path_env) + { + char **custom_dirs; + + custom_dirs = g_strsplit (type_lib_path_env, G_SEARCHPATH_SEPARATOR_S, 0); + repository->typelib_search_path = + g_ptr_array_new_take_null_terminated ((gpointer) g_steal_pointer (&custom_dirs), g_free); + } + else + { + repository->typelib_search_path = g_ptr_array_new_null_terminated (1, g_free, TRUE); + } + + libdir = GOBJECT_INTROSPECTION_LIBDIR; + + typelib_dir = g_build_filename (libdir, "girepository-1.0", NULL); + + g_ptr_array_add (repository->typelib_search_path, g_steal_pointer (&typelib_dir)); + } + + repository->library_paths = g_ptr_array_new_null_terminated (1, g_free, TRUE); + + repository->typelibs + = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) gi_typelib_unref); + repository->lazy_typelibs + = g_hash_table_new_full (g_str_hash, g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) gi_typelib_unref); + repository->info_by_gtype + = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) NULL, + (GDestroyNotify) gi_base_info_unref); + repository->info_by_error_domain + = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) NULL, + (GDestroyNotify) gi_base_info_unref); + repository->interfaces_for_gtype + = g_hash_table_new_full (g_direct_hash, g_direct_equal, + (GDestroyNotify) NULL, + (GDestroyNotify) gtype_interface_cache_free); + repository->unknown_gtypes = g_hash_table_new (NULL, NULL); +} + +static void +gi_repository_finalize (GObject *object) +{ + GIRepository *repository = GI_REPOSITORY (object); + + g_hash_table_destroy (repository->typelibs); + g_hash_table_destroy (repository->lazy_typelibs); + g_hash_table_destroy (repository->info_by_gtype); + g_hash_table_destroy (repository->info_by_error_domain); + g_hash_table_destroy (repository->interfaces_for_gtype); + g_hash_table_destroy (repository->unknown_gtypes); + + g_clear_pointer (&repository->cached_shared_libraries, g_strfreev); + + g_clear_pointer (&repository->library_paths, g_ptr_array_unref); + g_clear_pointer (&repository->typelib_search_path, g_ptr_array_unref); + + (* G_OBJECT_CLASS (gi_repository_parent_class)->finalize) (G_OBJECT (repository)); +} + +static void +gi_repository_class_init (GIRepositoryClass *class) +{ + GObjectClass *gobject_class; + + gobject_class = G_OBJECT_CLASS (class); + + gobject_class->finalize = gi_repository_finalize; +} + +/** + * gi_repository_prepend_search_path: + * @repository: A #GIRepository + * @directory: (type filename): directory name to prepend to the typelib + * search path + * + * Prepends @directory to the typelib search path. + * + * See also: gi_repository_get_search_path(). + * + * Since: 2.80 + */ +void +gi_repository_prepend_search_path (GIRepository *repository, + const char *directory) +{ + g_return_if_fail (GI_IS_REPOSITORY (repository)); + + g_ptr_array_insert (repository->typelib_search_path, 0, g_strdup (directory)); +} + +/** + * gi_repository_get_search_path: + * @repository: A #GIRepository + * @n_paths_out: (optional) (out): The number of search paths returned. + * + * Returns the current search path [class@GIRepository.Repository] will use when + * loading typelib files. + * + * The list is internal to [class@GIRepository.Repository] and should not be + * freed, nor should its string elements. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_paths_out. + * + * Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most + * important first + * Since: 2.80 + */ +const char * const * +gi_repository_get_search_path (GIRepository *repository, + size_t *n_paths_out) +{ + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + if G_UNLIKELY (!repository->typelib_search_path || + !repository->typelib_search_path->pdata) + { + static const char * const empty_search_path[] = {NULL}; + + if (n_paths_out) + *n_paths_out = 0; + + return empty_search_path; + } + + if (n_paths_out) + *n_paths_out = repository->typelib_search_path->len; + + return (const char * const *) repository->typelib_search_path->pdata; +} + +/** + * gi_repository_prepend_library_path: + * @repository: A #GIRepository + * @directory: (type filename): a single directory to scan for shared libraries + * + * Prepends @directory to the search path that is used to + * search shared libraries referenced by imported namespaces. + * + * Multiple calls to this function all contribute to the final + * list of paths. + * + * The list of paths is unique to @repository. When a typelib is loaded by the + * repository, the list of paths from the @repository at that instant is used + * by the typelib for loading its modules. + * + * If the library is not found in the directories configured + * in this way, loading will fall back to the system library + * path (i.e. `LD_LIBRARY_PATH` and `DT_RPATH` in ELF systems). + * See the documentation of your dynamic linker for full details. + * + * Since: 2.80 + */ +void +gi_repository_prepend_library_path (GIRepository *repository, + const char *directory) +{ + g_return_if_fail (GI_IS_REPOSITORY (repository)); + + g_ptr_array_insert (repository->library_paths, 0, g_strdup (directory)); +} + +/** + * gi_repository_get_library_path: + * @repository: A #GIRepository + * @n_paths_out: (optional) (out): The number of library paths returned. + * + * Returns the current search path [class@GIRepository.Repository] will use when + * loading shared libraries referenced by imported namespaces. + * + * The list is internal to [class@GIRepository.Repository] and should not be + * freed, nor should its string elements. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_paths_out. + * + * Returns: (element-type filename) (transfer none) (array length=n_paths_out): list of search paths, most + * important first + * Since: 2.80 + */ +const char * const * +gi_repository_get_library_path (GIRepository *repository, + size_t *n_paths_out) +{ + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + if G_UNLIKELY (!repository->library_paths || !repository->library_paths->pdata) + { + static const char * const empty_search_path[] = {NULL}; + + if (n_paths_out) + *n_paths_out = 0; + + return empty_search_path; + } + + if (n_paths_out) + *n_paths_out = repository->library_paths->len; + + return (const char * const *) repository->library_paths->pdata; +} + +static char * +build_typelib_key (const char *name, const char *source) +{ + GString *str = g_string_new (name); + g_string_append_c (str, '\0'); + g_string_append (str, source); + return g_string_free (str, FALSE); +} + +/* Note: Returns %NULL (not an empty %NULL-terminated array) if there are no + * dependencies. */ +static char ** +get_typelib_dependencies (GITypelib *typelib) +{ + Header *header; + const char *dependencies_glob; + + header = (Header *)typelib->data; + + if (header->dependencies == 0) + return NULL; + + dependencies_glob = gi_typelib_get_string (typelib, header->dependencies); + return g_strsplit (dependencies_glob, "|", 0); +} + +static GITypelib * +check_version_conflict (GITypelib *typelib, + const char *namespace, + const char *expected_version, + char **version_conflict) +{ + Header *header; + const char *loaded_version; + + if (expected_version == NULL) + { + if (version_conflict) + *version_conflict = NULL; + return typelib; + } + + header = (Header*)typelib->data; + loaded_version = gi_typelib_get_string (typelib, header->nsversion); + g_assert (loaded_version != NULL); + + if (strcmp (expected_version, loaded_version) != 0) + { + if (version_conflict) + *version_conflict = (char*)loaded_version; + return NULL; + } + if (version_conflict) + *version_conflict = NULL; + return typelib; +} + +static GITypelib * +get_registered_status (GIRepository *repository, + const char *namespace, + const char *version, + gboolean allow_lazy, + gboolean *lazy_status, + char **version_conflict) +{ + GITypelib *typelib; + + if (lazy_status) + *lazy_status = FALSE; + typelib = g_hash_table_lookup (repository->typelibs, namespace); + if (typelib) + return check_version_conflict (typelib, namespace, version, version_conflict); + typelib = g_hash_table_lookup (repository->lazy_typelibs, namespace); + if (!typelib) + return NULL; + if (lazy_status) + *lazy_status = TRUE; + if (!allow_lazy) + return NULL; + return check_version_conflict (typelib, namespace, version, version_conflict); +} + +static GITypelib * +get_registered (GIRepository *repository, + const char *namespace, + const char *version) +{ + return get_registered_status (repository, namespace, version, TRUE, NULL, NULL); +} + +static gboolean +load_dependencies_recurse (GIRepository *repository, + GITypelib *typelib, + GError **error) +{ + char **dependencies; + + dependencies = get_typelib_dependencies (typelib); + + if (dependencies != NULL) + { + int i; + + for (i = 0; dependencies[i]; i++) + { + char *dependency = dependencies[i]; + const char *last_dash; + char *dependency_namespace; + const char *dependency_version; + + last_dash = strrchr (dependency, '-'); + dependency_namespace = g_strndup (dependency, last_dash - dependency); + dependency_version = last_dash+1; + + if (!gi_repository_require (repository, dependency_namespace, dependency_version, + 0, error)) + { + g_free (dependency_namespace); + g_strfreev (dependencies); + return FALSE; + } + g_free (dependency_namespace); + } + g_strfreev (dependencies); + } + return TRUE; +} + +static const char * +register_internal (GIRepository *repository, + const char *source, + gboolean lazy, + GITypelib *typelib, + GError **error) +{ + Header *header; + const char *namespace; + + g_return_val_if_fail (typelib != NULL, FALSE); + + header = (Header *)typelib->data; + + g_return_val_if_fail (header != NULL, FALSE); + + namespace = gi_typelib_get_string (typelib, header->namespace); + + if (lazy) + { + g_assert (!g_hash_table_lookup (repository->lazy_typelibs, + namespace)); + g_hash_table_insert (repository->lazy_typelibs, + build_typelib_key (namespace, source), gi_typelib_ref (typelib)); + } + else + { + gpointer value; + char *key; + + /* First, try loading all the dependencies */ + if (!load_dependencies_recurse (repository, typelib, error)) + return NULL; + + /* Check if we are transitioning from lazily loaded state */ + if (g_hash_table_lookup_extended (repository->lazy_typelibs, + namespace, + (gpointer)&key, &value)) + g_hash_table_remove (repository->lazy_typelibs, key); + else + key = build_typelib_key (namespace, source); + + g_hash_table_insert (repository->typelibs, + g_steal_pointer (&key), + gi_typelib_ref (typelib)); + } + + /* These types might be resolved now, clear the cache */ + g_hash_table_remove_all (repository->unknown_gtypes); + + return namespace; +} + +/** + * gi_repository_get_immediate_dependencies: + * @repository: A #GIRepository + * @namespace_: Namespace of interest + * @n_dependencies_out: (optional) (out): Return location for the number of + * dependencies + * + * Return an array of the immediate versioned dependencies for @namespace_. + * Returned strings are of the form `namespace-version`. + * + * Note: @namespace_ must have already been loaded using a function + * such as [method@GIRepository.Repository.require] before calling this + * function. + * + * To get the transitive closure of dependencies for @namespace_, use + * [method@GIRepository.Repository.get_dependencies]. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_dependencies_out. + * + * Returns: (transfer full) (array length=n_dependencies_out): String array of + * immediate versioned dependencies + * Since: 2.80 + */ +char ** +gi_repository_get_immediate_dependencies (GIRepository *repository, + const char *namespace, + size_t *n_dependencies_out) +{ + GITypelib *typelib; + char **deps; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + + typelib = get_registered (repository, namespace, NULL); + g_return_val_if_fail (typelib != NULL, NULL); + + /* Ensure we always return a non-%NULL vector. */ + deps = get_typelib_dependencies (typelib); + if (deps == NULL) + deps = g_strsplit ("", "|", 0); + + if (n_dependencies_out != NULL) + *n_dependencies_out = g_strv_length (deps); + + return deps; +} + +/* Load the transitive closure of dependency namespace-version strings for the + * given @typelib. @repository must be non-%NULL. @transitive_dependencies must + * be a pre-existing GHashTable set for storing the + * dependencies. */ +static void +get_typelib_dependencies_transitive (GIRepository *repository, + GITypelib *typelib, + GHashTable *transitive_dependencies) +{ + char **immediate_dependencies; + + immediate_dependencies = get_typelib_dependencies (typelib); + + for (size_t i = 0; immediate_dependencies != NULL && immediate_dependencies[i]; i++) + { + char *dependency; + const char *last_dash; + char *dependency_namespace; + + dependency = immediate_dependencies[i]; + + /* Steal from the strv. */ + g_hash_table_add (transitive_dependencies, dependency); + immediate_dependencies[i] = NULL; + + /* Recurse for this namespace. */ + last_dash = strrchr (dependency, '-'); + dependency_namespace = g_strndup (dependency, last_dash - dependency); + + typelib = get_registered (repository, dependency_namespace, NULL); + g_return_if_fail (typelib != NULL); + get_typelib_dependencies_transitive (repository, typelib, + transitive_dependencies); + + g_free (dependency_namespace); + } + + g_free (immediate_dependencies); +} + +/** + * gi_repository_get_dependencies: + * @repository: A #GIRepository + * @namespace_: Namespace of interest + * @n_dependencies_out: (optional) (out): Return location for the number of + * dependencies + * + * Retrieves all (transitive) versioned dependencies for + * @namespace_. + * + * The returned strings are of the form `namespace-version`. + * + * Note: @namespace_ must have already been loaded using a function + * such as [method@GIRepository.Repository.require] before calling this + * function. + * + * To get only the immediate dependencies for @namespace_, use + * [method@GIRepository.Repository.get_immediate_dependencies]. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_dependencies_out. + * + * Returns: (transfer full) (array length=n_dependencies_out): String array of + * all versioned dependencies + * Since: 2.80 + */ +char ** +gi_repository_get_dependencies (GIRepository *repository, + const char *namespace, + size_t *n_dependencies_out) +{ + GITypelib *typelib; + GHashTable *transitive_dependencies; /* set of owned utf8 */ + GHashTableIter iter; + char *dependency; + GPtrArray *out; /* owned utf8 elements */ + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + + typelib = get_registered (repository, namespace, NULL); + g_return_val_if_fail (typelib != NULL, NULL); + + /* Load the dependencies. */ + transitive_dependencies = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + get_typelib_dependencies_transitive (repository, typelib, + transitive_dependencies); + + /* Convert to a string array. */ + out = g_ptr_array_new_null_terminated (g_hash_table_size (transitive_dependencies), + g_free, TRUE); + g_hash_table_iter_init (&iter, transitive_dependencies); + + while (g_hash_table_iter_next (&iter, (gpointer) &dependency, NULL)) + { + g_ptr_array_add (out, dependency); + g_hash_table_iter_steal (&iter); + } + + g_hash_table_unref (transitive_dependencies); + + if (n_dependencies_out != NULL) + *n_dependencies_out = out->len; + + return (char **) g_ptr_array_free (out, FALSE); +} + +/** + * gi_repository_load_typelib: + * @repository: A #GIRepository + * @typelib: (transfer none): the typelib to load + * @flags: flags affecting the loading operation + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Load the given @typelib into the repository. + * + * Returns: namespace of the loaded typelib + * Since: 2.80 + */ +const char * +gi_repository_load_typelib (GIRepository *repository, + GITypelib *typelib, + GIRepositoryLoadFlags flags, + GError **error) +{ + Header *header; + const char *namespace; + const char *nsversion; + gboolean allow_lazy = flags & GI_REPOSITORY_LOAD_FLAG_LAZY; + gboolean is_lazy; + char *version_conflict; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + header = (Header *) typelib->data; + namespace = gi_typelib_get_string (typelib, header->namespace); + nsversion = gi_typelib_get_string (typelib, header->nsversion); + + if (get_registered_status (repository, namespace, nsversion, allow_lazy, + &is_lazy, &version_conflict)) + { + if (version_conflict != NULL) + { + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_NAMESPACE_VERSION_CONFLICT, + "Attempting to load namespace '%s', version '%s', but '%s' is already loaded", + namespace, nsversion, version_conflict); + return NULL; + } + return namespace; + } + return register_internal (repository, "", + allow_lazy, typelib, error); +} + +/** + * gi_repository_is_registered: + * @repository: A #GIRepository + * @namespace_: Namespace of interest + * @version: (nullable): Required version, may be `NULL` for latest + * + * Check whether a particular namespace (and optionally, a specific + * version thereof) is currently loaded. + * + * This function is likely to only be useful in unusual circumstances; in order + * to act upon metadata in the namespace, you should call + * [method@GIRepository.Repository.require] instead which will ensure the + * namespace is loaded, and return as quickly as this function will if it has + * already been loaded. + * + * Returns: `TRUE` if namespace-version is loaded, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_repository_is_registered (GIRepository *repository, + const char *namespace, + const char *version) +{ + g_return_val_if_fail (GI_IS_REPOSITORY (repository), FALSE); + + return get_registered (repository, namespace, version) != NULL; +} + +/** + * gi_repository_new: + * + * Create a new [class@GIRepository.Repository]. + * + * Returns: (transfer full): a new [class@GIRepository.Repository] + * Since: 2.80 + */ +GIRepository * +gi_repository_new (void) +{ + return g_object_new (GI_TYPE_REPOSITORY, NULL); +} + +/** + * gi_repository_get_n_infos: + * @repository: A #GIRepository + * @namespace_: Namespace to inspect + * + * This function returns the number of metadata entries in + * given namespace @namespace_. + * + * The namespace must have already been loaded before calling this function. + * + * Returns: number of metadata entries + * Since: 2.80 + */ +unsigned int +gi_repository_get_n_infos (GIRepository *repository, + const char *namespace) +{ + GITypelib *typelib; + unsigned int n_interfaces = 0; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), -1); + g_return_val_if_fail (namespace != NULL, -1); + + typelib = get_registered (repository, namespace, NULL); + + g_return_val_if_fail (typelib != NULL, -1); + + n_interfaces = ((Header *)typelib->data)->n_local_entries; + + return n_interfaces; +} + +/** + * gi_repository_get_info: + * @repository: A #GIRepository + * @namespace_: Namespace to inspect + * @idx: 0-based offset into namespace metadata for entry + * + * This function returns a particular metadata entry in the + * given namespace @namespace_. + * + * The namespace must have already been loaded before calling this function. + * See [method@GIRepository.Repository.get_n_infos] to find the maximum number + * of entries. It is an error to pass an invalid @idx to this function. + * + * Returns: (transfer full) (not nullable): [class@GIRepository.BaseInfo] + * containing metadata + * Since: 2.80 + */ +GIBaseInfo * +gi_repository_get_info (GIRepository *repository, + const char *namespace, + unsigned int idx) +{ + GITypelib *typelib; + DirEntry *entry; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + g_return_val_if_fail (idx < G_MAXUINT16, NULL); + + typelib = get_registered (repository, namespace, NULL); + + g_return_val_if_fail (typelib != NULL, NULL); + + entry = gi_typelib_get_dir_entry (typelib, idx + 1); + g_return_val_if_fail (entry != NULL, NULL); + + return gi_info_new_full (gi_typelib_blob_type_to_info_type (entry->blob_type), + repository, + NULL, typelib, entry->offset); +} + +typedef struct { + const char *gtype_name; + GITypelib *result_typelib; +} FindByGTypeData; + +static DirEntry * +find_by_gtype (GHashTable *table, FindByGTypeData *data, gboolean check_prefix) +{ + GHashTableIter iter; + gpointer key, value; + DirEntry *ret; + + g_hash_table_iter_init (&iter, table); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + GITypelib *typelib = (GITypelib*)value; + if (check_prefix) + { + if (!gi_typelib_matches_gtype_name_prefix (typelib, data->gtype_name)) + continue; + } + + ret = gi_typelib_get_dir_entry_by_gtype_name (typelib, data->gtype_name); + if (ret) + { + data->result_typelib = typelib; + return ret; + } + } + + return NULL; +} + +/** + * gi_repository_find_by_gtype: + * @repository: A #GIRepository + * @gtype: [type@GObject.Type] to search for + * + * Searches all loaded namespaces for a particular [type@GObject.Type]. + * + * Note that in order to locate the metadata, the namespace corresponding to + * the type must first have been loaded. There is currently no + * mechanism for determining the namespace which corresponds to an + * arbitrary [type@GObject.Type] — thus, this function will operate most + * reliably when you know the [type@GObject.Type] is from a loaded namespace. + * + * Returns: (transfer full) (nullable): [class@GIRepository.BaseInfo] + * representing metadata about @type, or `NULL` if none found + * Since: 2.80 + */ +GIBaseInfo * +gi_repository_find_by_gtype (GIRepository *repository, + GType gtype) +{ + FindByGTypeData data; + GIBaseInfo *cached; + DirEntry *entry; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (gtype != G_TYPE_INVALID, NULL); + + cached = g_hash_table_lookup (repository->info_by_gtype, + (gpointer)gtype); + + if (cached != NULL) + return gi_base_info_ref (cached); + + if (g_hash_table_contains (repository->unknown_gtypes, (gpointer)gtype)) + return NULL; + + data.gtype_name = g_type_name (gtype); + data.result_typelib = NULL; + + /* Inside each typelib, we include the "C prefix" which acts as + * a namespace mechanism. For GtkTreeView, the C prefix is Gtk. + * Given the assumption that GTypes for a library also use the + * C prefix, we know we can skip examining a typelib if our + * target type does not have this typelib's C prefix. Use this + * assumption as our first attempt at locating the DirEntry. + */ + entry = find_by_gtype (repository->typelibs, &data, TRUE); + if (entry == NULL) + entry = find_by_gtype (repository->lazy_typelibs, &data, TRUE); + + /* Not ever class library necessarily specifies a correct c_prefix, + * so take a second pass. This time we will try a global lookup, + * ignoring prefixes. + * See http://bugzilla.gnome.org/show_bug.cgi?id=564016 + */ + if (entry == NULL) + entry = find_by_gtype (repository->typelibs, &data, FALSE); + if (entry == NULL) + entry = find_by_gtype (repository->lazy_typelibs, &data, FALSE); + + if (entry != NULL) + { + cached = gi_info_new_full (gi_typelib_blob_type_to_info_type (entry->blob_type), + repository, + NULL, data.result_typelib, entry->offset); + + g_hash_table_insert (repository->info_by_gtype, + (gpointer) gtype, + gi_base_info_ref (cached)); + return cached; + } + else + { + g_hash_table_add (repository->unknown_gtypes, (gpointer) gtype); + return NULL; + } +} + +/** + * gi_repository_find_by_name: + * @repository: A #GIRepository + * @namespace_: Namespace which will be searched + * @name: Entry name to find + * + * Searches for a particular entry in a namespace. + * + * Before calling this function for a particular namespace, you must call + * [method@GIRepository.Repository.require] to load the namespace, or otherwise + * ensure the namespace has already been loaded. + * + * Returns: (transfer full) (nullable): [class@GIRepository.BaseInfo] + * representing metadata about @name, or `NULL` if none found + * Since: 2.80 + */ +GIBaseInfo * +gi_repository_find_by_name (GIRepository *repository, + const char *namespace, + const char *name) +{ + GITypelib *typelib; + DirEntry *entry; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + + typelib = get_registered (repository, namespace, NULL); + g_return_val_if_fail (typelib != NULL, NULL); + + entry = gi_typelib_get_dir_entry_by_name (typelib, name); + if (entry == NULL) + return NULL; + return gi_info_new_full (gi_typelib_blob_type_to_info_type (entry->blob_type), + repository, + NULL, typelib, entry->offset); +} + +typedef struct { + GIRepository *repository; + GQuark domain; + + GITypelib *result_typelib; + DirEntry *result; +} FindByErrorDomainData; + +static void +find_by_error_domain_foreach (gpointer key, + gpointer value, + gpointer datap) +{ + GITypelib *typelib = (GITypelib*)value; + FindByErrorDomainData *data = datap; + + if (data->result != NULL) + return; + + data->result = gi_typelib_get_dir_entry_by_error_domain (typelib, data->domain); + if (data->result) + data->result_typelib = typelib; +} + +/** + * gi_repository_find_by_error_domain: + * @repository: A #GIRepository + * @domain: a [type@GLib.Error] domain + * + * Searches for the enum type corresponding to the given [type@GLib.Error] + * domain. + * + * Before calling this function for a particular namespace, you must call + * [method@GIRepository.Repository.require] to load the namespace, or otherwise + * ensure the namespace has already been loaded. + * + * Returns: (transfer full) (nullable): [class@GIRepository.EnumInfo] + * representing metadata about @domain’s enum type, or `NULL` if none found + * Since: 2.80 + */ +GIEnumInfo * +gi_repository_find_by_error_domain (GIRepository *repository, + GQuark domain) +{ + FindByErrorDomainData data; + GIEnumInfo *cached; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + cached = g_hash_table_lookup (repository->info_by_error_domain, + GUINT_TO_POINTER (domain)); + + if (cached != NULL) + return (GIEnumInfo *) gi_base_info_ref ((GIBaseInfo *)cached); + + data.repository = repository; + data.domain = domain; + data.result_typelib = NULL; + data.result = NULL; + + g_hash_table_foreach (repository->typelibs, find_by_error_domain_foreach, &data); + if (data.result == NULL) + g_hash_table_foreach (repository->lazy_typelibs, find_by_error_domain_foreach, &data); + + if (data.result != NULL) + { + cached = (GIEnumInfo *) gi_info_new_full (gi_typelib_blob_type_to_info_type (data.result->blob_type), + repository, + NULL, data.result_typelib, data.result->offset); + + g_hash_table_insert (repository->info_by_error_domain, + GUINT_TO_POINTER (domain), + gi_base_info_ref ((GIBaseInfo *) cached)); + return cached; + } + return NULL; +} + +/** + * gi_repository_get_object_gtype_interfaces: + * @repository: a #GIRepository + * @gtype: a [type@GObject.Type] whose fundamental type is `G_TYPE_OBJECT` + * @n_interfaces_out: (out): Number of interfaces + * @interfaces_out: (out) (transfer none) (array length=n_interfaces_out): Interfaces for @gtype + * + * Look up the implemented interfaces for @gtype. + * + * This function cannot fail per se; but for a totally ‘unknown’ + * [type@GObject.Type], it may return 0 implemented interfaces. + * + * The semantics of this function are designed for a dynamic binding, + * where in certain cases (such as a function which returns an + * interface which may have ‘hidden’ implementation classes), not all + * data may be statically known, and will have to be determined from + * the [type@GObject.Type] of the object. An example is + * [func@Gio.File.new_for_path] returning a concrete class of + * `GLocalFile`, which is a [type@GObject.Type] we see at runtime, but + * not statically. + * + * Since: 2.80 + */ +void +gi_repository_get_object_gtype_interfaces (GIRepository *repository, + GType gtype, + size_t *n_interfaces_out, + GIInterfaceInfo ***interfaces_out) +{ + GTypeInterfaceCache *cache; + + g_return_if_fail (GI_IS_REPOSITORY (repository)); + g_return_if_fail (g_type_fundamental (gtype) == G_TYPE_OBJECT); + + cache = g_hash_table_lookup (repository->interfaces_for_gtype, + (void *) gtype); + if (cache == NULL) + { + GType *interfaces; + unsigned int i; + unsigned int n_interfaces; + GList *interface_infos = NULL, *iter; + + interfaces = g_type_interfaces (gtype, &n_interfaces); + for (i = 0; i < n_interfaces; i++) + { + GIBaseInfo *base_info; + + base_info = gi_repository_find_by_gtype (repository, interfaces[i]); + if (base_info == NULL) + continue; + + if (gi_base_info_get_info_type (base_info) != GI_INFO_TYPE_INTERFACE) + { + /* FIXME - could this really happen? */ + gi_base_info_unref (base_info); + continue; + } + + if (!g_list_find (interface_infos, base_info)) + interface_infos = g_list_prepend (interface_infos, base_info); + } + + cache = g_malloc (sizeof (GTypeInterfaceCache) + + sizeof (GIBaseInfo*) * g_list_length (interface_infos)); + cache->n_interfaces = g_list_length (interface_infos); + for (iter = interface_infos, i = 0; iter; iter = iter->next, i++) + cache->interfaces[i] = iter->data; + g_list_free (interface_infos); + + g_hash_table_insert (repository->interfaces_for_gtype, (gpointer) gtype, + cache); + + g_free (interfaces); + } + + *n_interfaces_out = cache->n_interfaces; + *interfaces_out = (GIInterfaceInfo**)&cache->interfaces[0]; +} + +static void +collect_namespaces (gpointer key, + gpointer value, + gpointer data) +{ + GList **list = data; + + *list = g_list_append (*list, key); +} + +/** + * gi_repository_get_loaded_namespaces: + * @repository: A #GIRepository + * @n_namespaces_out: (optional) (out): Return location for the number of + * namespaces + * + * Return the list of currently loaded namespaces. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_namespaces_out. + * + * Returns: (element-type utf8) (transfer full) (array length=n_namespaces_out): + * list of namespaces + * Since: 2.80 + */ +char ** +gi_repository_get_loaded_namespaces (GIRepository *repository, + size_t *n_namespaces_out) +{ + GList *l, *list = NULL; + char **names; + size_t i; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + g_hash_table_foreach (repository->typelibs, collect_namespaces, &list); + g_hash_table_foreach (repository->lazy_typelibs, collect_namespaces, &list); + + names = g_malloc0 (sizeof (char *) * (g_list_length (list) + 1)); + i = 0; + for (l = list; l; l = l->next) + names[i++] = g_strdup (l->data); + g_list_free (list); + + if (n_namespaces_out != NULL) + *n_namespaces_out = i; + + return names; +} + +/** + * gi_repository_get_version: + * @repository: A #GIRepository + * @namespace_: Namespace to inspect + * + * This function returns the loaded version associated with the given + * namespace @namespace_. + * + * Note: The namespace must have already been loaded using a function + * such as [method@GIRepository.Repository.require] before calling this + * function. + * + * Returns: Loaded version + * Since: 2.80 + */ +const char * +gi_repository_get_version (GIRepository *repository, + const char *namespace) +{ + GITypelib *typelib; + Header *header; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + + typelib = get_registered (repository, namespace, NULL); + + g_return_val_if_fail (typelib != NULL, NULL); + + header = (Header *) typelib->data; + return gi_typelib_get_string (typelib, header->nsversion); +} + +/** + * gi_repository_get_shared_libraries: + * @repository: A #GIRepository + * @namespace_: Namespace to inspect + * @out_n_elements: (out) (optional): Return location for the number of elements + * in the returned array + * + * This function returns an array of paths to the + * shared C libraries associated with the given namespace @namespace_. + * + * There may be no shared library path associated, in which case this + * function will return `NULL`. + * + * Note: The namespace must have already been loaded using a function + * such as [method@GIRepository.Repository.require] before calling this + * function. + * + * The list is internal to [class@GIRepository.Repository] and should not be + * freed, nor should its string elements. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @out_n_elements. + * + * Returns: (nullable) (array length=out_n_elements) (transfer none): Array of + * paths to shared libraries, or `NULL` if none are associated + * Since: 2.80 + */ +const char * const * +gi_repository_get_shared_libraries (GIRepository *repository, + const char *namespace, + size_t *out_n_elements) +{ + GITypelib *typelib; + Header *header; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, NULL); + + typelib = get_registered (repository, namespace, NULL); + + g_return_val_if_fail (typelib != NULL, NULL); + + header = (Header *) typelib->data; + if (!header->shared_library) + { + if (out_n_elements != NULL) + *out_n_elements = 0; + return NULL; + } + + /* Populate the cache. */ + if (repository->cached_shared_libraries == NULL) + { + const char *comma_separated = gi_typelib_get_string (typelib, header->shared_library); + + if (comma_separated != NULL && *comma_separated != '\0') + { + repository->cached_shared_libraries = g_strsplit (comma_separated, ",", -1); + repository->cached_n_shared_libraries = g_strv_length (repository->cached_shared_libraries); + } + } + + if (out_n_elements != NULL) + *out_n_elements = repository->cached_n_shared_libraries; + + return (const char * const *) repository->cached_shared_libraries; +} + +/** + * gi_repository_get_c_prefix: + * @repository: A #GIRepository + * @namespace_: Namespace to inspect + * + * This function returns the ‘C prefix’, or the C level namespace + * associated with the given introspection namespace. + * + * Each C symbol starts with this prefix, as well each [type@GObject.Type] in + * the library. + * + * Note: The namespace must have already been loaded using a function + * such as [method@GIRepository.Repository.require] before calling this + * function. + * + * Returns: (nullable): C namespace prefix, or `NULL` if none associated + * Since: 2.80 + */ +const char * +gi_repository_get_c_prefix (GIRepository *repository, + const char *namespace_) +{ + GITypelib *typelib; + Header *header; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace_ != NULL, NULL); + + typelib = get_registered (repository, namespace_, NULL); + + g_return_val_if_fail (typelib != NULL, NULL); + + header = (Header *) typelib->data; + if (header->c_prefix) + return gi_typelib_get_string (typelib, header->c_prefix); + else + return NULL; +} + +/** + * gi_repository_get_typelib_path: + * @repository: A #GIRepository + * @namespace_: GI namespace to use, e.g. `Gtk` + * + * If namespace @namespace_ is loaded, return the full path to the + * .typelib file it was loaded from. + * + * If the typelib for namespace @namespace_ was included in a shared library, + * return the special string ``. + * + * Returns: (type filename) (nullable): Filesystem path (or ``) if + * successful, `NULL` if namespace is not loaded + * Since: 2.80 + */ +const char * +gi_repository_get_typelib_path (GIRepository *repository, + const char *namespace) +{ + gpointer orig_key, value; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + if (!g_hash_table_lookup_extended (repository->typelibs, namespace, + &orig_key, &value)) + { + if (!g_hash_table_lookup_extended (repository->lazy_typelibs, namespace, + &orig_key, &value)) + + return NULL; + } + return ((char*)orig_key) + strlen ((char *) orig_key) + 1; +} + +/* This simple search function looks for a specified namespace-version; + it's faster than the full directory listing required for latest version. */ +static GMappedFile * +find_namespace_version (const char *namespace, + const char *version, + const char * const *search_paths, + size_t n_search_paths, + char **path_ret) +{ + GError *error = NULL; + GMappedFile *mfile = NULL; + char *fname; + + if (g_str_equal (namespace, GIREPOSITORY_TYPELIB_NAME) && + !g_str_equal (version, GIREPOSITORY_TYPELIB_VERSION)) + { + g_debug ("Ignoring %s-%s.typelib because this libgirepository " + "corresponds to %s-%s", + namespace, version, + namespace, GIREPOSITORY_TYPELIB_VERSION); + return NULL; + } + + fname = g_strdup_printf ("%s-%s.typelib", namespace, version); + + for (size_t i = 0; i < n_search_paths; ++i) + { + char *path = g_build_filename (search_paths[i], fname, NULL); + + mfile = g_mapped_file_new (path, FALSE, &error); + if (error) + { + g_free (path); + g_clear_error (&error); + continue; + } + *path_ret = path; + break; + } + g_free (fname); + return mfile; +} + +static gboolean +parse_version (const char *version, + int *major, + int *minor) +{ + const char *dot; + char *end; + + *major = strtol (version, &end, 10); + dot = strchr (version, '.'); + if (dot == NULL) + { + *minor = 0; + return TRUE; + } + if (dot != end) + return FALSE; + *minor = strtol (dot+1, &end, 10); + if (end != (version + strlen (version))) + return FALSE; + return TRUE; +} + +static int +compare_version (const char *v1, + const char *v2) +{ + gboolean success; + int v1_major, v1_minor; + int v2_major, v2_minor; + + success = parse_version (v1, &v1_major, &v1_minor); + g_assert (success); + + success = parse_version (v2, &v2_major, &v2_minor); + g_assert (success); + + /* Avoid a compiler warning about `success` being unused with G_DISABLE_ASSERT */ + (void) success; + + if (v1_major > v2_major) + return 1; + else if (v2_major > v1_major) + return -1; + else if (v1_minor > v2_minor) + return 1; + else if (v2_minor > v1_minor) + return -1; + return 0; +} + +struct NamespaceVersionCandidadate +{ + GMappedFile *mfile; + int path_index; + char *path; + char *version; +}; + +static int +compare_candidate_reverse (struct NamespaceVersionCandidadate *c1, + struct NamespaceVersionCandidadate *c2) +{ + int result = compare_version (c1->version, c2->version); + /* First, check the version */ + if (result > 0) + return -1; + else if (result < 0) + return 1; + else + { + /* Now check the path index, which says how early in the search path + * we found it. This ensures that of equal version targets, we + * pick the earlier one. + */ + if (c1->path_index == c2->path_index) + return 0; + else if (c1->path_index > c2->path_index) + return 1; + else + return -1; + } +} + +static void +free_candidate (struct NamespaceVersionCandidadate *candidate) +{ + g_mapped_file_unref (candidate->mfile); + g_free (candidate->path); + g_free (candidate->version); + g_slice_free (struct NamespaceVersionCandidadate, candidate); +} + +static GSList * +enumerate_namespace_versions (const char *namespace, + const char * const *search_paths, + size_t n_search_paths) +{ + GSList *candidates = NULL; + GHashTable *found_versions = g_hash_table_new (g_str_hash, g_str_equal); + char *namespace_dash; + char *namespace_typelib; + GError *error = NULL; + int index; + + namespace_dash = g_strdup_printf ("%s-", namespace); + namespace_typelib = g_strdup_printf ("%s.typelib", namespace); + + index = 0; + for (size_t i = 0; i < n_search_paths; ++i) + { + GDir *dir; + const char *dirname; + const char *entry; + + dirname = search_paths[i]; + dir = g_dir_open (dirname, 0, NULL); + if (dir == NULL) + continue; + while ((entry = g_dir_read_name (dir)) != NULL) + { + GMappedFile *mfile; + char *path, *version; + struct NamespaceVersionCandidadate *candidate; + + if (!g_str_has_suffix (entry, ".typelib")) + continue; + + if (g_str_has_prefix (entry, namespace_dash)) + { + const char *last_dash; + const char *name_end; + int major, minor; + + if (g_str_equal (namespace, GIREPOSITORY_TYPELIB_NAME) && + !g_str_equal (entry, GIREPOSITORY_TYPELIB_FILENAME)) + { + g_debug ("Ignoring %s because this libgirepository " + "corresponds to %s", + entry, GIREPOSITORY_TYPELIB_FILENAME); + continue; + } + + name_end = strrchr (entry, '.'); + last_dash = strrchr (entry, '-'); + version = g_strndup (last_dash+1, name_end-(last_dash+1)); + if (!parse_version (version, &major, &minor)) + { + g_free (version); + continue; + } + } + else + continue; + + if (g_hash_table_lookup (found_versions, version) != NULL) + { + g_free (version); + continue; + } + + path = g_build_filename (dirname, entry, NULL); + mfile = g_mapped_file_new (path, FALSE, &error); + if (mfile == NULL) + { + g_free (path); + g_free (version); + g_clear_error (&error); + continue; + } + candidate = g_slice_new0 (struct NamespaceVersionCandidadate); + candidate->mfile = mfile; + candidate->path_index = index; + candidate->path = path; + candidate->version = version; + candidates = g_slist_prepend (candidates, candidate); + g_hash_table_add (found_versions, version); + } + g_dir_close (dir); + index++; + } + + g_free (namespace_dash); + g_free (namespace_typelib); + g_hash_table_destroy (found_versions); + + return candidates; +} + +static GMappedFile * +find_namespace_latest (const char *namespace, + const char * const *search_paths, + size_t n_search_paths, + char **version_ret, + char **path_ret) +{ + GSList *candidates; + GMappedFile *result = NULL; + + *version_ret = NULL; + *path_ret = NULL; + + candidates = enumerate_namespace_versions (namespace, search_paths, n_search_paths); + + if (candidates != NULL) + { + struct NamespaceVersionCandidadate *elected; + candidates = g_slist_sort (candidates, (GCompareFunc) compare_candidate_reverse); + + elected = (struct NamespaceVersionCandidadate *) candidates->data; + /* Remove the elected one so we don't try to free its contents */ + candidates = g_slist_delete_link (candidates, candidates); + + result = elected->mfile; + *path_ret = elected->path; + *version_ret = elected->version; + g_slice_free (struct NamespaceVersionCandidadate, elected); /* just free the container */ + g_slist_foreach (candidates, (GFunc) (void *) free_candidate, NULL); + g_slist_free (candidates); + } + return result; +} + +/** + * gi_repository_enumerate_versions: + * @repository: A #GIRepository + * @namespace_: GI namespace, e.g. `Gtk` + * @n_versions_out: (optional) (out): The number of versions returned. + * + * Obtain an unordered list of versions (either currently loaded or + * available) for @namespace_ in this @repository. + * + * The list is guaranteed to be `NULL` terminated. The `NULL` terminator is not + * counted in @n_versions_out. + * + * Returns: (element-type utf8) (transfer full) (array length=n_versions_out): the array of versions. + * Since: 2.80 + */ +char ** +gi_repository_enumerate_versions (GIRepository *repository, + const char *namespace_, + size_t *n_versions_out) +{ + GPtrArray *versions; + GSList *candidates, *link; + const char *loaded_version; + char **ret; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + + candidates = enumerate_namespace_versions (namespace_, + (const char * const *) repository->typelib_search_path->pdata, + repository->typelib_search_path->len); + + if (!candidates) + { + if (n_versions_out) + *n_versions_out = 0; + return g_strdupv ((char *[]) {NULL}); + } + + versions = g_ptr_array_new_null_terminated (1, g_free, TRUE); + for (link = candidates; link; link = link->next) + { + struct NamespaceVersionCandidadate *candidate = link->data; + g_ptr_array_add (versions, g_steal_pointer (&candidate->version)); + free_candidate (candidate); + } + g_slist_free (candidates); + + /* The currently loaded version of a namespace is also part of the + * available versions, as it could have been loaded using + * require_private(). + */ + if (gi_repository_is_registered (repository, namespace_, NULL)) + { + loaded_version = gi_repository_get_version (repository, namespace_); + if (loaded_version && + !g_ptr_array_find_with_equal_func (versions, loaded_version, g_str_equal, NULL)) + g_ptr_array_add (versions, g_strdup (loaded_version)); + } + + ret = (char **) g_ptr_array_steal (versions, n_versions_out); + g_ptr_array_unref (g_steal_pointer (&versions)); + + return ret; +} + +static GITypelib * +require_internal (GIRepository *repository, + const char *namespace, + const char *version, + GIRepositoryLoadFlags flags, + const char * const *search_paths, + size_t n_search_paths, + GError **error) +{ + GMappedFile *mfile; + GITypelib *ret = NULL; + Header *header; + GITypelib *typelib = NULL; + GITypelib *typelib_owned = NULL; + const char *typelib_namespace, *typelib_version; + gboolean allow_lazy = (flags & GI_REPOSITORY_LOAD_FLAG_LAZY) > 0; + gboolean is_lazy; + char *version_conflict = NULL; + char *path = NULL; + char *tmp_version = NULL; + + g_return_val_if_fail (GI_IS_REPOSITORY (repository), NULL); + g_return_val_if_fail (namespace != NULL, FALSE); + + typelib = get_registered_status (repository, namespace, version, allow_lazy, + &is_lazy, &version_conflict); + if (typelib) + return typelib; + + if (version_conflict != NULL) + { + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_NAMESPACE_VERSION_CONFLICT, + "Requiring namespace '%s' version '%s', but '%s' is already loaded", + namespace, version, version_conflict); + return NULL; + } + + if (version != NULL) + { + mfile = find_namespace_version (namespace, version, search_paths, + n_search_paths, &path); + tmp_version = g_strdup (version); + } + else + { + mfile = find_namespace_latest (namespace, search_paths, n_search_paths, + &tmp_version, &path); + } + + if (mfile == NULL) + { + if (version != NULL) + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_TYPELIB_NOT_FOUND, + "Typelib file for namespace '%s', version '%s' not found", + namespace, version); + else + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_TYPELIB_NOT_FOUND, + "Typelib file for namespace '%s' (any version) not found", + namespace); + goto out; + } + + { + GError *temp_error = NULL; + GBytes *bytes = NULL; + + bytes = g_mapped_file_get_bytes (mfile); + typelib_owned = typelib = gi_typelib_new_from_bytes (bytes, &temp_error); + g_bytes_unref (bytes); + g_clear_pointer (&mfile, g_mapped_file_unref); + + if (!typelib) + { + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_TYPELIB_NOT_FOUND, + "Failed to load typelib file '%s' for namespace '%s': %s", + path, namespace, temp_error->message); + g_clear_error (&temp_error); + goto out; + } + + typelib->library_paths = (repository->library_paths != NULL) ? g_ptr_array_ref (repository->library_paths) : NULL; + } + header = (Header *) typelib->data; + typelib_namespace = gi_typelib_get_string (typelib, header->namespace); + typelib_version = gi_typelib_get_string (typelib, header->nsversion); + + if (strcmp (typelib_namespace, namespace) != 0) + { + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_NAMESPACE_MISMATCH, + "Typelib file %s for namespace '%s' contains " + "namespace '%s' which doesn't match the file name", + path, namespace, typelib_namespace); + goto out; + } + if (version != NULL && strcmp (typelib_version, version) != 0) + { + g_set_error (error, GI_REPOSITORY_ERROR, + GI_REPOSITORY_ERROR_NAMESPACE_MISMATCH, + "Typelib file %s for namespace '%s' contains " + "version '%s' which doesn't match the expected version '%s'", + path, namespace, typelib_version, version); + goto out; + } + + if (!register_internal (repository, path, allow_lazy, + typelib, error)) + goto out; + ret = typelib; + out: + g_clear_pointer (&typelib_owned, gi_typelib_unref); + g_free (tmp_version); + g_free (path); + return ret; +} + +/** + * gi_repository_require: + * @repository: A #GIRepository + * @namespace_: GI namespace to use, e.g. `Gtk` + * @version: (nullable): Version of namespace, may be `NULL` for latest + * @flags: Set of [flags@GIRepository.RepositoryLoadFlags], may be 0 + * @error: a [type@GLib.Error]. + * + * Force the namespace @namespace_ to be loaded if it isn’t already. + * + * If @namespace_ is not loaded, this function will search for a + * `.typelib` file using the repository search path. In addition, a + * version @version of namespace may be specified. If @version is + * not specified, the latest will be used. + * + * Returns: (transfer none): a pointer to the [type@GIRepository.Typelib] if + * successful, `NULL` otherwise + * Since: 2.80 + */ +GITypelib * +gi_repository_require (GIRepository *repository, + const char *namespace, + const char *version, + GIRepositoryLoadFlags flags, + GError **error) +{ + GITypelib *typelib; + + typelib = require_internal (repository, namespace, version, flags, + (const char * const *) repository->typelib_search_path->pdata, + repository->typelib_search_path->len, error); + + return typelib; +} + +/** + * gi_repository_require_private: + * @repository: A #GIRepository + * @typelib_dir: (type filename): Private directory where to find the requested + * typelib + * @namespace_: GI namespace to use, e.g. `Gtk` + * @version: (nullable): Version of namespace, may be `NULL` for latest + * @flags: Set of [flags@GIRepository.RepositoryLoadFlags], may be 0 + * @error: a [type@GLib.Error]. + * + * Force the namespace @namespace_ to be loaded if it isn’t already. + * + * If @namespace_ is not loaded, this function will search for a + * `.typelib` file within the private directory only. In addition, a + * version @version of namespace should be specified. If @version is + * not specified, the latest will be used. + * + * Returns: (transfer none): a pointer to the [type@GIRepository.Typelib] if + * successful, `NULL` otherwise + * Since: 2.80 + */ +GITypelib * +gi_repository_require_private (GIRepository *repository, + const char *typelib_dir, + const char *namespace, + const char *version, + GIRepositoryLoadFlags flags, + GError **error) +{ + const char * const search_path[] = { typelib_dir, NULL }; + + return require_internal (repository, namespace, version, flags, + search_path, 1, error); +} + +static gboolean +gi_repository_introspect_cb (const char *option_name, + const char *value, + gpointer data, + GError **error) +{ + GError *tmp_error = NULL; + char **args; + + args = g_strsplit (value, ",", 2); + + if (!gi_repository_dump (args[0], args[1], &tmp_error)) + { + g_error ("Failed to extract GType data: %s", + tmp_error->message); + exit (1); + } + exit (0); +} + +static const GOptionEntry introspection_args[] = { + { "introspect-dump", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_CALLBACK, + gi_repository_introspect_cb, "Dump introspection information", + "infile.txt,outfile.xml" }, + G_OPTION_ENTRY_NULL +}; + +/** + * gi_repository_get_option_group: + * + * Obtain the option group for girepository. + * + * It’s used by the dumper and for programs that want to provide introspection + * information + * + * Returns: (transfer full): the option group + * Since: 2.80 + */ +GOptionGroup * +gi_repository_get_option_group (void) +{ + GOptionGroup *group; + group = g_option_group_new ("girepository", "Introspection Options", "Show Introspection Options", NULL, NULL); + + g_option_group_add_entries (group, introspection_args); + return group; +} + +GQuark +gi_repository_error_quark (void) +{ + static GQuark quark = 0; + if (quark == 0) + quark = g_quark_from_static_string ("g-irepository-error-quark"); + return quark; +} + +/** + * gi_type_tag_to_string: + * @type: the type_tag + * + * Obtain a string representation of @type + * + * Returns: the string + * Since: 2.80 + */ +const char * +gi_type_tag_to_string (GITypeTag type) +{ + switch (type) + { + case GI_TYPE_TAG_VOID: + return "void"; + case GI_TYPE_TAG_BOOLEAN: + return "gboolean"; + case GI_TYPE_TAG_INT8: + return "gint8"; + case GI_TYPE_TAG_UINT8: + return "guint8"; + case GI_TYPE_TAG_INT16: + return "gint16"; + case GI_TYPE_TAG_UINT16: + return "guint16"; + case GI_TYPE_TAG_INT32: + return "gint32"; + case GI_TYPE_TAG_UINT32: + return "guint32"; + case GI_TYPE_TAG_INT64: + return "gint64"; + case GI_TYPE_TAG_UINT64: + return "guint64"; + case GI_TYPE_TAG_FLOAT: + return "gfloat"; + case GI_TYPE_TAG_DOUBLE: + return "gdouble"; + case GI_TYPE_TAG_UNICHAR: + return "gunichar"; + case GI_TYPE_TAG_GTYPE: + return "GType"; + case GI_TYPE_TAG_UTF8: + return "utf8"; + case GI_TYPE_TAG_FILENAME: + return "filename"; + case GI_TYPE_TAG_ARRAY: + return "array"; + case GI_TYPE_TAG_INTERFACE: + return "interface"; + case GI_TYPE_TAG_GLIST: + return "glist"; + case GI_TYPE_TAG_GSLIST: + return "gslist"; + case GI_TYPE_TAG_GHASH: + return "ghash"; + case GI_TYPE_TAG_ERROR: + return "error"; + default: + return "unknown"; + } +} + +/** + * gi_info_type_to_string: + * @type: the info type + * + * Obtain a string representation of @type + * + * Returns: the string + * Since: 2.80 + */ +const char * +gi_info_type_to_string (GIInfoType type) +{ + switch (type) + { + case GI_INFO_TYPE_INVALID: + return "invalid"; + case GI_INFO_TYPE_FUNCTION: + return "function"; + case GI_INFO_TYPE_CALLBACK: + return "callback"; + case GI_INFO_TYPE_STRUCT: + return "struct"; + case GI_INFO_TYPE_ENUM: + return "enum"; + case GI_INFO_TYPE_FLAGS: + return "flags"; + case GI_INFO_TYPE_OBJECT: + return "object"; + case GI_INFO_TYPE_INTERFACE: + return "interface"; + case GI_INFO_TYPE_CONSTANT: + return "constant"; + case GI_INFO_TYPE_UNION: + return "union"; + case GI_INFO_TYPE_VALUE: + return "value"; + case GI_INFO_TYPE_SIGNAL: + return "signal"; + case GI_INFO_TYPE_VFUNC: + return "vfunc"; + case GI_INFO_TYPE_PROPERTY: + return "property"; + case GI_INFO_TYPE_FIELD: + return "field"; + case GI_INFO_TYPE_ARG: + return "arg"; + case GI_INFO_TYPE_TYPE: + return "type"; + case GI_INFO_TYPE_UNRESOLVED: + return "unresolved"; + default: + return "unknown"; + } +} + +GIInfoType +gi_typelib_blob_type_to_info_type (GITypelibBlobType blob_type) +{ + switch (blob_type) + { + case BLOB_TYPE_BOXED: + /* `BLOB_TYPE_BOXED` now always refers to a `StructBlob`, and + * `GIRegisteredTypeInfo` (the parent type of `GIStructInfo`) has a method + * for distinguishing whether the struct is a boxed type. So presenting + * `BLOB_TYPE_BOXED` as its own `GIBaseInfo` subclass is not helpful. + * See commit e28078c70cbf4a57c7dbd39626f43f9bd2674145 and + * https://gitlab.gnome.org/GNOME/glib/-/issues/3245. */ + return GI_INFO_TYPE_STRUCT; + default: + return (GIInfoType) blob_type; + } +} diff --git a/girepository/girepository.h b/girepository/girepository.h new file mode 100644 index 0000000..13d94cd --- /dev/null +++ b/girepository/girepository.h @@ -0,0 +1,247 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Repository + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include + +#include + +#define __GIREPOSITORY_H_INSIDE__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +#define GI_TYPE_REPOSITORY (gi_repository_get_type ()) +GI_AVAILABLE_IN_ALL +G_DECLARE_FINAL_TYPE (GIRepository, gi_repository, GI, REPOSITORY, GObject) + +/** + * GIRepositoryLoadFlags: + * @GI_REPOSITORY_LOAD_FLAG_NONE: No flags set. + * @GI_REPOSITORY_LOAD_FLAG_LAZY: Lazily load the typelib. + * + * Flags that control how a typelib is loaded. + * + * Since: 2.80 + */ +typedef enum +{ + GI_REPOSITORY_LOAD_FLAG_NONE = 0, + GI_REPOSITORY_LOAD_FLAG_LAZY = 1 << 0 +} GIRepositoryLoadFlags; + +/* Repository */ + +GI_AVAILABLE_IN_ALL +GIRepository *gi_repository_new (void); + +GI_AVAILABLE_IN_ALL +void gi_repository_prepend_search_path (GIRepository *repository, + const char *directory); + +GI_AVAILABLE_IN_ALL +void gi_repository_prepend_library_path (GIRepository *repository, + const char *directory); + +GI_AVAILABLE_IN_ALL +const char * const * gi_repository_get_search_path (GIRepository *repository, + size_t *n_paths_out); + +GI_AVAILABLE_IN_ALL +const char * const *gi_repository_get_library_path (GIRepository *repository, + size_t *n_paths_out); + +GI_AVAILABLE_IN_ALL +const char * gi_repository_load_typelib (GIRepository *repository, + GITypelib *typelib, + GIRepositoryLoadFlags flags, + GError **error); + +GI_AVAILABLE_IN_ALL +gboolean gi_repository_is_registered (GIRepository *repository, + const char *namespace_, + const char *version); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_repository_find_by_name (GIRepository *repository, + const char *namespace_, + const char *name); + +GI_AVAILABLE_IN_ALL +char ** gi_repository_enumerate_versions (GIRepository *repository, + const char *namespace_, + size_t *n_versions_out); + +GI_AVAILABLE_IN_ALL +GITypelib * gi_repository_require (GIRepository *repository, + const char *namespace_, + const char *version, + GIRepositoryLoadFlags flags, + GError **error); + +GI_AVAILABLE_IN_ALL +GITypelib * gi_repository_require_private (GIRepository *repository, + const char *typelib_dir, + const char *namespace_, + const char *version, + GIRepositoryLoadFlags flags, + GError **error); + +GI_AVAILABLE_IN_ALL +char ** gi_repository_get_immediate_dependencies (GIRepository *repository, + const char *namespace_, + size_t *n_dependencies_out); + +GI_AVAILABLE_IN_ALL +char ** gi_repository_get_dependencies (GIRepository *repository, + const char *namespace_, + size_t *n_dependencies_out); + +GI_AVAILABLE_IN_ALL +char ** gi_repository_get_loaded_namespaces (GIRepository *repository, + size_t *n_namespaces_out); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_repository_find_by_gtype (GIRepository *repository, + GType gtype); + +GI_AVAILABLE_IN_ALL +void gi_repository_get_object_gtype_interfaces (GIRepository *repository, + GType gtype, + size_t *n_interfaces_out, + GIInterfaceInfo ***interfaces_out); + +GI_AVAILABLE_IN_ALL +unsigned int gi_repository_get_n_infos (GIRepository *repository, + const char *namespace_); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_repository_get_info (GIRepository *repository, + const char *namespace_, + unsigned int idx); + +GI_AVAILABLE_IN_ALL +GIEnumInfo * gi_repository_find_by_error_domain (GIRepository *repository, + GQuark domain); + +GI_AVAILABLE_IN_ALL +const char * gi_repository_get_typelib_path (GIRepository *repository, + const char *namespace_); +GI_AVAILABLE_IN_ALL +const char * const *gi_repository_get_shared_libraries (GIRepository *repository, + const char *namespace_, + size_t *out_n_elements); +GI_AVAILABLE_IN_ALL +const char * gi_repository_get_c_prefix (GIRepository *repository, + const char *namespace_); +GI_AVAILABLE_IN_ALL +const char * gi_repository_get_version (GIRepository *repository, + const char *namespace_); + + +GI_AVAILABLE_IN_ALL +GOptionGroup * gi_repository_get_option_group (void); + + +GI_AVAILABLE_IN_ALL +gboolean gi_repository_dump (const char *input_filename, + const char *output_filename, + GError **error); + +/** + * GIRepositoryError: + * @GI_REPOSITORY_ERROR_TYPELIB_NOT_FOUND: the typelib could not be found. + * @GI_REPOSITORY_ERROR_NAMESPACE_MISMATCH: the namespace does not match the + * requested namespace. + * @GI_REPOSITORY_ERROR_NAMESPACE_VERSION_CONFLICT: the version of the + * typelib does not match the requested version. + * @GI_REPOSITORY_ERROR_LIBRARY_NOT_FOUND: the library used by the typelib + * could not be found. + * + * An error code used with `GI_REPOSITORY_ERROR` in a [type@GLib.Error] + * returned from a [class@GIRepository.Repository] routine. + * + * Since: 2.80 + */ +typedef enum +{ + GI_REPOSITORY_ERROR_TYPELIB_NOT_FOUND, + GI_REPOSITORY_ERROR_NAMESPACE_MISMATCH, + GI_REPOSITORY_ERROR_NAMESPACE_VERSION_CONFLICT, + GI_REPOSITORY_ERROR_LIBRARY_NOT_FOUND +} GIRepositoryError; + +/** + * GI_REPOSITORY_ERROR: + * + * Error domain for [class@GIRepository.Repository]. + * + * Errors in this domain will be from the [enum@GIRepository.Error] enumeration. + * See [type@GLib.Error] for more information on error domains. + * + * Since: 2.80 + */ +#define GI_REPOSITORY_ERROR (gi_repository_error_quark ()) + +GI_AVAILABLE_IN_ALL +GQuark gi_repository_error_quark (void); + + +/* Global utility functions */ + +GI_AVAILABLE_IN_ALL +void gi_cclosure_marshal_generic (GClosure *closure, + GValue *return_gvalue, + unsigned int n_param_values, + const GValue *param_values, + void *invocation_hint, + void *marshal_data); + +#include + +G_END_DECLS diff --git a/girepository/girffi.c b/girepository/girffi.c new file mode 100644 index 0000000..053fd34 --- /dev/null +++ b/girepository/girffi.c @@ -0,0 +1,467 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Helper functions for ffi integration + * + * Copyright (C) 2008 Red Hat, Inc + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "girffi.h" +#include "gibaseinfo-private.h" +#include "girepository.h" +#include "girepository-private.h" + +static ffi_type * +gi_type_tag_get_ffi_type_internal (GITypeTag tag, + gboolean is_pointer, + gboolean is_enum) +{ + switch (tag) + { + case GI_TYPE_TAG_BOOLEAN: + return &ffi_type_uint; + case GI_TYPE_TAG_INT8: + return &ffi_type_sint8; + case GI_TYPE_TAG_UINT8: + return &ffi_type_uint8; + case GI_TYPE_TAG_INT16: + return &ffi_type_sint16; + case GI_TYPE_TAG_UINT16: + return &ffi_type_uint16; + case GI_TYPE_TAG_INT32: + return &ffi_type_sint32; + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + return &ffi_type_uint32; + case GI_TYPE_TAG_INT64: + return &ffi_type_sint64; + case GI_TYPE_TAG_UINT64: + return &ffi_type_uint64; + case GI_TYPE_TAG_GTYPE: +#if GLIB_SIZEOF_SIZE_T == 4 + return &ffi_type_uint32; +#elif GLIB_SIZEOF_SIZE_T == 8 + return &ffi_type_uint64; +#else +# error "Unexpected size for size_t: not 4 or 8" +#endif + case GI_TYPE_TAG_FLOAT: + return &ffi_type_float; + case GI_TYPE_TAG_DOUBLE: + return &ffi_type_double; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + return &ffi_type_pointer; + case GI_TYPE_TAG_INTERFACE: + { + /* We need to handle enums specially: + * https://bugzilla.gnome.org/show_bug.cgi?id=665150 + */ + if (!is_enum) + return &ffi_type_pointer; + else + return &ffi_type_sint32; + } + case GI_TYPE_TAG_VOID: + if (is_pointer) + return &ffi_type_pointer; + else + return &ffi_type_void; + default: + break; + } + + g_assert_not_reached (); + + return NULL; +} + +/** + * gi_type_tag_get_ffi_type: + * @type_tag: a #GITypeTag + * @is_pointer: whether this is a pointer type + * + * Get the `ffi_type` corresponding to @type_tag. + * + * Returns: (transfer none): an `ffi_type` corresponding to the platform default + * C ABI for @tag and @is_pointer. + * Since: 2.80 + */ +ffi_type * +gi_type_tag_get_ffi_type (GITypeTag type_tag, + gboolean is_pointer) +{ + return gi_type_tag_get_ffi_type_internal (type_tag, is_pointer, FALSE); +} + +/** + * gi_type_info_get_ffi_type: + * @info: a #GITypeInfo + * + * Get the `ffi_type` corresponding to @info. + * + * Returns: (transfer none): a `ffi_type` corresponding to the platform default + * C ABI for @info. + * Since: 2.80 + */ +ffi_type * +gi_type_info_get_ffi_type (GITypeInfo *info) +{ + gboolean is_enum = FALSE; + GIBaseInfo *iinfo; + + if (gi_type_info_get_tag (info) == GI_TYPE_TAG_INTERFACE) + { + iinfo = gi_type_info_get_interface (info); + switch (gi_base_info_get_info_type (iinfo)) + { + case GI_INFO_TYPE_ENUM: + case GI_INFO_TYPE_FLAGS: + is_enum = TRUE; + break; + default: + break; + } + gi_base_info_unref (iinfo); + } + + return gi_type_tag_get_ffi_type_internal (gi_type_info_get_tag (info), gi_type_info_is_pointer (info), is_enum); +} + +/** + * gi_callable_info_get_ffi_arg_types: + * @callable_info: a callable info from a typelib + * @n_args_p: (out) (optional): the number of arguments returned + * + * Get the `ffi_type`s for the arguments of @callable_info. + * + * Returns: (transfer container) (array length=n_args_p): an array of + * `ffi_type*`. The array itself should be freed using [func@GLib.free] after + * use. + * Since: 2.80 + */ +static ffi_type ** +gi_callable_info_get_ffi_arg_types (GICallableInfo *callable_info, + size_t *n_args_p) +{ + ffi_type **arg_types; + gboolean is_method, throws; + size_t n_args, n_invoke_args, i, offset; + + g_return_val_if_fail (callable_info != NULL, NULL); + + n_args = gi_callable_info_get_n_args (callable_info); + is_method = gi_callable_info_is_method (callable_info); + throws = gi_callable_info_can_throw_gerror (callable_info); + offset = is_method ? 1 : 0; + + n_invoke_args = n_args; + + if (is_method) + n_invoke_args++; + if (throws) + n_invoke_args++; + + if (n_args_p) + *n_args_p = n_invoke_args; + + arg_types = (ffi_type **) g_new0 (ffi_type *, n_invoke_args + 1); + + if (is_method) + arg_types[0] = &ffi_type_pointer; + if (throws) + arg_types[n_invoke_args - 1] = &ffi_type_pointer; + + for (i = 0; i < n_args; ++i) + { + GIArgInfo arg_info; + GITypeInfo arg_type; + + gi_callable_info_load_arg (callable_info, i, &arg_info); + gi_arg_info_load_type_info (&arg_info, &arg_type); + switch (gi_arg_info_get_direction (&arg_info)) + { + case GI_DIRECTION_IN: + arg_types[i + offset] = gi_type_info_get_ffi_type (&arg_type); + break; + case GI_DIRECTION_OUT: + case GI_DIRECTION_INOUT: + arg_types[i + offset] = &ffi_type_pointer; + break; + default: + g_assert_not_reached (); + } + + gi_base_info_clear (&arg_type); + gi_base_info_clear (&arg_info); + } + + arg_types[n_invoke_args] = NULL; + + return arg_types; +} + +/** + * gi_callable_info_get_ffi_return_type: + * @callable_info: a callable info from a typelib + * + * Fetches the `ffi_type` for a corresponding return value of + * a [class@GIRepository.CallableInfo]. + * + * Returns: (transfer none): the `ffi_type` for the return value + * Since: 2.80 + */ +static ffi_type * +gi_callable_info_get_ffi_return_type (GICallableInfo *callable_info) +{ + GITypeInfo *return_type; + ffi_type *return_ffi_type; + + g_return_val_if_fail (callable_info != NULL, NULL); + + return_type = gi_callable_info_get_return_type (callable_info); + return_ffi_type = gi_type_info_get_ffi_type (return_type); + gi_base_info_unref((GIBaseInfo*)return_type); + + return return_ffi_type; +} + +/** + * gi_function_info_prep_invoker: + * @info: A #GIFunctionInfo + * @invoker: (out caller-allocates): Output invoker structure + * @error: A #GError + * + * Initialize the caller-allocated @invoker structure with a cache + * of information needed to invoke the C function corresponding to + * @info with the platform’s default ABI. + * + * A primary intent of this function is that a dynamic structure allocated + * by a language binding could contain a [type@GIRepository.FunctionInvoker] + * structure inside the binding’s function mapping. + * + * @invoker must be freed using [method@GIRepository.FunctionInvoker.clear] + * when it’s finished with. + * + * Returns: `TRUE` on success, `FALSE` otherwise with @error set. + * Since: 2.80 + */ +gboolean +gi_function_info_prep_invoker (GIFunctionInfo *info, + GIFunctionInvoker *invoker, + GError **error) +{ + const char *symbol; + void *addr; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (invoker != NULL, FALSE); + + symbol = gi_function_info_get_symbol ((GIFunctionInfo*) info); + + if (!gi_typelib_symbol (gi_base_info_get_typelib ((GIBaseInfo *) info), + symbol, &addr)) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_SYMBOL_NOT_FOUND, + "Could not locate %s: %s", symbol, g_module_error ()); + + return FALSE; + } + + return gi_function_invoker_new_for_address (addr, (GICallableInfo *) info, invoker, error); +} + +/** + * gi_function_invoker_new_for_address: + * @addr: The address + * @info: A #GICallableInfo + * @invoker: (out caller-allocates): Output invoker structure + * @error: A #GError + * + * Initialize the caller-allocated @invoker structure with a cache + * of information needed to invoke the C function corresponding to + * @info with the platform’s default ABI. + * + * A primary intent of this function is that a dynamic structure allocated + * by a language binding could contain a [type@GIRepository.FunctionInvoker] + * structure inside the binding’s function mapping. + * + * Returns: `TRUE` on success, `FALSE` otherwise with @error set. + * Since: 2.80 + */ +gboolean +gi_function_invoker_new_for_address (void *addr, + GICallableInfo *info, + GIFunctionInvoker *invoker, + GError **error) +{ + ffi_type **atypes; + size_t n_args; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (invoker != NULL, FALSE); + + invoker->native_address = addr; + + atypes = gi_callable_info_get_ffi_arg_types (info, &n_args); + + return ffi_prep_cif (&(invoker->cif), FFI_DEFAULT_ABI, n_args, + gi_callable_info_get_ffi_return_type (info), + atypes) == FFI_OK; +} + +/** + * gi_function_invoker_clear: + * @invoker: (transfer none): A #GIFunctionInvoker + * + * Release all resources allocated for the internals of @invoker. + * + * Callers are responsible for freeing any resources allocated for the structure + * itself however. + * + * Since: 2.80 + */ +void +gi_function_invoker_clear (GIFunctionInvoker *invoker) +{ + g_free (invoker->cif.arg_types); +} + +typedef struct { + ffi_closure ffi_closure; + void *writable_self; + void *native_address; +} GIClosureWrapper; + +/** + * gi_callable_info_create_closure: + * @callable_info: a callable info from a typelib + * @cif: a `ffi_cif` structure + * @callback: the ffi callback + * @user_data: data to be passed into the callback + * + * Prepares a callback for ffi invocation. + * + * Returns: (transfer full) (nullable): the `ffi_closure`, or `NULL` on error. + * The return value should be freed by calling + * [method@GIRepository.CallableInfo.destroy_closure]. + * Since: 2.80 + */ +ffi_closure * +gi_callable_info_create_closure (GICallableInfo *callable_info, + ffi_cif *cif, + GIFFIClosureCallback callback, + void *user_data) +{ + void *exec_ptr; + size_t n_args; + ffi_type **atypes; + GIClosureWrapper *closure; + ffi_status status; + + g_return_val_if_fail (callable_info != NULL, FALSE); + g_return_val_if_fail (cif != NULL, FALSE); + g_return_val_if_fail (callback != NULL, FALSE); + + closure = ffi_closure_alloc (sizeof (GIClosureWrapper), &exec_ptr); + if (!closure) + { + g_warning ("could not allocate closure"); + return NULL; + } + closure->writable_self = closure; + closure->native_address = exec_ptr; + + + atypes = gi_callable_info_get_ffi_arg_types (callable_info, &n_args); + status = ffi_prep_cif (cif, FFI_DEFAULT_ABI, n_args, + gi_callable_info_get_ffi_return_type (callable_info), + atypes); + if (status != FFI_OK) + { + g_warning ("ffi_prep_cif failed: %d", status); + ffi_closure_free (closure); + return NULL; + } + + status = ffi_prep_closure_loc (&closure->ffi_closure, cif, callback, user_data, exec_ptr); + if (status != FFI_OK) + { + g_warning ("ffi_prep_closure failed: %d", status); + ffi_closure_free (closure); + return NULL; + } + + return &closure->ffi_closure; +} + +/** + * gi_callable_info_get_closure_native_address: + * @callable_info: a callable info from a typelib + * @closure: ffi closure + * + * Gets callable code from `ffi_closure` prepared by + * [method@GIRepository.CallableInfo.create_closure]. + * + * Returns: (transfer none): native address + * Since: 2.80 + */ +void ** +gi_callable_info_get_closure_native_address (GICallableInfo *callable_info, + ffi_closure *closure) +{ + GIClosureWrapper *wrapper = (GIClosureWrapper *)closure; + return wrapper->native_address; +} + +/** + * gi_callable_info_destroy_closure: + * @callable_info: a callable info from a typelib + * @closure: (transfer full): ffi closure + * + * Frees a `ffi_closure` returned from + * [method@GIRepository.CallableInfo.create_closure]. + * + * Since: 2.80 + */ +void +gi_callable_info_destroy_closure (GICallableInfo *callable_info, + ffi_closure *closure) +{ + GIClosureWrapper *wrapper = (GIClosureWrapper *)closure; + + g_free (wrapper->ffi_closure.cif->arg_types); + ffi_closure_free (wrapper->writable_self); +} diff --git a/girepository/girffi.h b/girepository/girffi.h new file mode 100644 index 0000000..5d792c9 --- /dev/null +++ b/girepository/girffi.h @@ -0,0 +1,129 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Helper functions for ffi integration + * + * Copyright (C) 2008 Red Hat, Inc + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include "girepository.h" + +G_BEGIN_DECLS + +/** + * GIFFIClosureCallback: + * @cif: the `ffi_cif` passed to + * [method@GIRepository.CallableInfo.create_closure] + * @ret: (out caller-allocates): a pointer to the memory used for the function’s + * return value + * @args: a vector of pointers to memory holding the arguments to the function + * @user_data: the user data passed to + * [method@GIRepository.CallableInfo.create_closure] + * + * The function which will be called when a closure created with + * [method@GIRepository.CallableInfo.create_closure] is invoked. + * + * The value of @ret is undefined if the function returns `void`. + * + * Since: 2.80 + */ +typedef void (*GIFFIClosureCallback) (ffi_cif *cif, + void *ret, + void **args, + void *user_data); + +/** + * GIFunctionInvoker: + * @cif: the cif + * @native_address: the native address + * + * Structure containing the data necessary to invoke a callable function. + * + * Since: 2.80 + */ +typedef struct { + ffi_cif cif; + void *native_address; + /*< private >*/ + void *padding[3]; +} GIFunctionInvoker; + +/** + * GIFFIReturnValue: + * + * The type of a return value from a callable invocation closure. + * + * Since: 2.80 + */ +typedef GIArgument GIFFIReturnValue; + +GI_AVAILABLE_IN_ALL +ffi_type * gi_type_tag_get_ffi_type (GITypeTag type_tag, gboolean is_pointer); + +GI_AVAILABLE_IN_ALL +ffi_type * gi_type_info_get_ffi_type (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +void gi_type_info_extract_ffi_return_value (GITypeInfo *return_info, + GIFFIReturnValue *ffi_value, + GIArgument *arg); + +GI_AVAILABLE_IN_ALL +void gi_type_tag_extract_ffi_return_value (GITypeTag return_tag, + GType interface_type, + GIFFIReturnValue *ffi_value, + GIArgument *arg); + +GI_AVAILABLE_IN_ALL +gboolean gi_function_info_prep_invoker (GIFunctionInfo *info, + GIFunctionInvoker *invoker, + GError **error); + +GI_AVAILABLE_IN_ALL +gboolean gi_function_invoker_new_for_address (void *addr, + GICallableInfo *info, + GIFunctionInvoker *invoker, + GError **error); + +GI_AVAILABLE_IN_ALL +void gi_function_invoker_clear (GIFunctionInvoker *invoker); + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GIFunctionInvoker, gi_function_invoker_clear) + +GI_AVAILABLE_IN_ALL +ffi_closure * gi_callable_info_create_closure (GICallableInfo *callable_info, + ffi_cif *cif, + GIFFIClosureCallback callback, + void *user_data); + +GI_AVAILABLE_IN_ALL +void ** gi_callable_info_get_closure_native_address (GICallableInfo *callable_info, + ffi_closure *closure); + +GI_AVAILABLE_IN_ALL +void gi_callable_info_destroy_closure (GICallableInfo *callable_info, + ffi_closure *closure); + +G_END_DECLS diff --git a/girepository/girmodule-private.h b/girepository/girmodule-private.h new file mode 100644 index 0000000..c3cb9df --- /dev/null +++ b/girepository/girmodule-private.h @@ -0,0 +1,88 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Parsed IDL + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include "gitypelib-internal.h" + +G_BEGIN_DECLS + +typedef struct _GIIrTypelibBuild GIIrTypelibBuild; +typedef struct _GIIrModule GIIrModule; + +struct _GIIrTypelibBuild { + GIIrModule *module; + GHashTable *strings; + GHashTable *types; + GList *nodes_with_attributes; + uint32_t n_attributes; + uint8_t *data; + GList *stack; +}; + +struct _GIIrModule +{ + char *name; + char *version; + char *shared_library; + char *c_prefix; + GList *dependencies; + GList *entries; + + /* All modules that are included directly or indirectly */ + GList *include_modules; + + /* Aliases defined in the module or in included modules */ + GHashTable *aliases; + + /* Structures with the 'pointer' flag (typedef struct _X *X) + * in the module or in included modules + */ + GHashTable *pointer_structures; + /* Same as 'pointer' structures, but with the deprecated + * 'disguised' flag + */ + GHashTable *disguised_structures; +}; + +GIIrModule *gi_ir_module_new (const char *name, + const char *nsversion, + const char *module_filename, + const char *c_prefix); +void gi_ir_module_free (GIIrModule *module); + +void gi_ir_module_add_include_module (GIIrModule *module, + GIIrModule *include_module); + +GITypelib * gi_ir_module_build_typelib (GIIrModule *module); + +void gi_ir_module_fatal (GIIrTypelibBuild *build, + unsigned int line, + const char *msg, + ...) G_GNUC_PRINTF (3, 4) G_GNUC_NORETURN; + +void gi_ir_node_init_stats (void); +void gi_ir_node_dump_stats (void); + +G_END_DECLS diff --git a/girepository/girmodule.c b/girepository/girmodule.c new file mode 100644 index 0000000..e595f7a --- /dev/null +++ b/girepository/girmodule.c @@ -0,0 +1,595 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Typelib creation + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "girmodule-private.h" + +#include "girnode-private.h" +#include "gitypelib-internal.h" + +#include +#include +#include + +#define ALIGN_VALUE(this, boundary) \ + (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) + +#define NUM_SECTIONS 2 + +/*< private > + * gi_ir_module_new: + * @name: + * @version: + * @shared_library: (nullable): + * @c_prefix: + * + * Since: 2.80 + */ +GIIrModule * +gi_ir_module_new (const char *name, + const char *version, + const char *shared_library, + const char *c_prefix) +{ + GIIrModule *module; + + module = g_slice_new0 (GIIrModule); + + module->name = g_strdup (name); + module->version = g_strdup (version); + module->shared_library = g_strdup (shared_library); + module->c_prefix = g_strdup (c_prefix); + module->dependencies = NULL; + module->entries = NULL; + + module->include_modules = NULL; + module->aliases = NULL; + + return module; +} + +void +gi_ir_module_free (GIIrModule *module) +{ + GList *e; + + g_free (module->name); + + for (e = module->entries; e; e = e->next) + gi_ir_node_free ((GIIrNode *)e->data); + + g_list_free (module->entries); + /* Don't free dependencies, we inherit that from the parser */ + + g_list_free (module->include_modules); + + g_hash_table_destroy (module->aliases); + g_hash_table_destroy (module->pointer_structures); + g_hash_table_destroy (module->disguised_structures); + + g_slice_free (GIIrModule, module); +} + +/** + * gi_ir_module_fatal: + * @build: Current build + * @line: Origin line number, or 0 if unknown + * @msg: printf-format string + * @args: Remaining arguments + * + * Report a fatal error, then exit. + * + * Since: 2.80 + */ +void +gi_ir_module_fatal (GIIrTypelibBuild *build, + unsigned int line, + const char *msg, + ...) +{ + GString *context; + char *formatted; + GList *link; + + va_list args; + + va_start (args, msg); + + formatted = g_strdup_vprintf (msg, args); + + context = g_string_new (""); + if (line > 0) + g_string_append_printf (context, "%u: ", line); + if (build->stack) + g_string_append (context, "In "); + for (link = g_list_last (build->stack); link; link = link->prev) + { + GIIrNode *node = link->data; + const char *name = node->name; + if (name) + g_string_append (context, name); + if (link->prev) + g_string_append (context, "."); + } + if (build->stack) + g_string_append (context, ": "); + + g_printerr ("%s-%s.gir:%serror: %s\n", build->module->name, + build->module->version, + context->str, formatted); + g_string_free (context, TRUE); + + exit (1); + + va_end (args); +} + +static void +add_alias_foreach (gpointer key, + gpointer value, + gpointer data) +{ + GIIrModule *module = data; + + g_hash_table_replace (module->aliases, g_strdup (key), g_strdup (value)); +} + +static void +add_pointer_structure_foreach (gpointer key, + gpointer value, + gpointer data) +{ + GIIrModule *module = data; + + g_hash_table_replace (module->pointer_structures, g_strdup (key), value); +} + +static void +add_disguised_structure_foreach (gpointer key, + gpointer value, + gpointer data) +{ + GIIrModule *module = data; + + g_hash_table_replace (module->disguised_structures, g_strdup (key), value); +} + +void +gi_ir_module_add_include_module (GIIrModule *module, + GIIrModule *include_module) +{ + module->include_modules = g_list_prepend (module->include_modules, + include_module); + + g_hash_table_foreach (include_module->aliases, + add_alias_foreach, + module); + + g_hash_table_foreach (include_module->pointer_structures, + add_pointer_structure_foreach, + module); + g_hash_table_foreach (include_module->disguised_structures, + add_disguised_structure_foreach, + module); +} + +struct AttributeWriteData +{ + unsigned int count; + uint8_t *databuf; + GIIrNode *node; + GHashTable *strings; + uint32_t *offset; + uint32_t *offset2; +}; + +static void +write_attribute (gpointer key, gpointer value, gpointer datap) +{ + struct AttributeWriteData *data = datap; + uint32_t old_offset = *(data->offset); + AttributeBlob *blob = (AttributeBlob*)&(data->databuf[old_offset]); + + *(data->offset) += sizeof (AttributeBlob); + + blob->offset = data->node->offset; + blob->name = gi_ir_write_string ((const char*) key, data->strings, data->databuf, data->offset2); + blob->value = gi_ir_write_string ((const char*) value, data->strings, data->databuf, data->offset2); + + data->count++; +} + +static unsigned +write_attributes (GIIrModule *module, + GIIrNode *node, + GHashTable *strings, + uint8_t *data, + uint32_t *offset, + uint32_t *offset2) +{ + struct AttributeWriteData wdata; + wdata.count = 0; + wdata.databuf = data; + wdata.node = node; + wdata.offset = offset; + wdata.offset2 = offset2; + wdata.strings = strings; + + g_hash_table_foreach (node->attributes, write_attribute, &wdata); + + return wdata.count; +} + +static int +node_cmp_offset_func (const void *a, + const void *b) +{ + const GIIrNode *na = a; + const GIIrNode *nb = b; + return na->offset - nb->offset; +} + +static void +alloc_section (uint8_t *data, SectionType section_id, uint32_t offset) +{ + int i; + Header *header = (Header*)data; + Section *section_data = (Section*)&data[header->sections]; + + g_assert (section_id != GI_SECTION_END); + + for (i = 0; i < NUM_SECTIONS; i++) + { + if (section_data->id == GI_SECTION_END) + { + section_data->id = section_id; + section_data->offset = offset; + return; + } + section_data++; + } + g_assert_not_reached (); +} + +static uint8_t * +add_directory_index_section (uint8_t *data, GIIrModule *module, uint32_t *offset2) +{ + DirEntry *entry; + Header *header = (Header*)data; + GITypelibHashBuilder *dirindex_builder; + uint16_t n_interfaces; + uint16_t required_size; + uint32_t new_offset; + + dirindex_builder = gi_typelib_hash_builder_new (); + + n_interfaces = ((Header *)data)->n_local_entries; + + for (uint16_t i = 0; i < n_interfaces; i++) + { + const char *str; + entry = (DirEntry *)&data[header->directory + (i * header->entry_blob_size)]; + str = (const char *) (&data[entry->name]); + gi_typelib_hash_builder_add_string (dirindex_builder, str, i); + } + + if (!gi_typelib_hash_builder_prepare (dirindex_builder)) + { + /* This happens if CMPH couldn't create a perfect hash. So + * we just punt and leave no directory index section. + */ + gi_typelib_hash_builder_destroy (dirindex_builder); + return data; + } + + alloc_section (data, GI_SECTION_DIRECTORY_INDEX, *offset2); + + required_size = gi_typelib_hash_builder_get_buffer_size (dirindex_builder); + required_size = ALIGN_VALUE (required_size, 4); + + new_offset = *offset2 + required_size; + + data = g_realloc (data, new_offset); + + gi_typelib_hash_builder_pack (dirindex_builder, ((uint8_t*)data) + *offset2, required_size); + + *offset2 = new_offset; + + gi_typelib_hash_builder_destroy (dirindex_builder); + return data; +} + +GITypelib * +gi_ir_module_build_typelib (GIIrModule *module) +{ + GError *error = NULL; + GBytes *bytes = NULL; + GITypelib *typelib; + size_t length; + size_t i; + GList *e; + Header *header; + DirEntry *entry; + uint32_t header_size; + uint32_t dir_size; + uint32_t n_entries; + uint32_t n_local_entries; + uint32_t size, offset, offset2, old_offset; + GHashTable *strings; + GHashTable *types; + GList *nodes_with_attributes; + char *dependencies; + uint8_t *data; + Section *section; + + header_size = ALIGN_VALUE (sizeof (Header), 4); + n_local_entries = g_list_length (module->entries); + + /* Serialize dependencies into one string; this is convenient + * and not a major change to the typelib format. */ + { + GString *dependencies_str = g_string_new (""); + GList *link; + for (link = module->dependencies; link; link = link->next) + { + const char *dependency = link->data; + if (!strcmp (dependency, module->name)) + continue; + g_string_append (dependencies_str, dependency); + if (link->next) + g_string_append_c (dependencies_str, '|'); + } + dependencies = g_string_free (dependencies_str, FALSE); + if (!dependencies[0]) + { + g_free (dependencies); + dependencies = NULL; + } + } + + restart: + gi_ir_node_init_stats (); + strings = g_hash_table_new (g_str_hash, g_str_equal); + types = g_hash_table_new (g_str_hash, g_str_equal); + nodes_with_attributes = NULL; + n_entries = g_list_length (module->entries); + + g_message ("%d entries (%d local), %d dependencies", n_entries, n_local_entries, + g_list_length (module->dependencies)); + + dir_size = n_entries * sizeof (DirEntry); + size = header_size + dir_size; + + size += ALIGN_VALUE (strlen (module->name) + 1, 4); + + for (e = module->entries; e; e = e->next) + { + GIIrNode *node = e->data; + + size += gi_ir_node_get_full_size (node); + + /* Also reset the offset here */ + node->offset = 0; + } + + /* Adjust size for strings allocated in header below specially */ + size += ALIGN_VALUE (strlen (module->name) + 1, 4); + if (module->shared_library) + size += ALIGN_VALUE (strlen (module->shared_library) + 1, 4); + if (dependencies != NULL) + size += ALIGN_VALUE (strlen (dependencies) + 1, 4); + if (module->c_prefix != NULL) + size += ALIGN_VALUE (strlen (module->c_prefix) + 1, 4); + + size += sizeof (Section) * NUM_SECTIONS; + + g_message ("allocating %d bytes (%d header, %d directory, %d entries)", + size, header_size, dir_size, size - header_size - dir_size); + + data = g_malloc0 (size); + + /* fill in header */ + header = (Header *)data; + memcpy (header, GI_IR_MAGIC, 16); + header->major_version = 4; + header->minor_version = 0; + header->reserved = 0; + header->n_entries = n_entries; + header->n_local_entries = n_local_entries; + header->n_attributes = 0; + header->attributes = 0; /* filled in later */ + /* NOTE: When writing strings to the typelib here, you should also update + * the size calculations above. + */ + if (dependencies != NULL) + header->dependencies = gi_ir_write_string (dependencies, strings, data, &header_size); + else + header->dependencies = 0; + header->size = 0; /* filled in later */ + header->namespace = gi_ir_write_string (module->name, strings, data, &header_size); + header->nsversion = gi_ir_write_string (module->version, strings, data, &header_size); + header->shared_library = (module->shared_library? + gi_ir_write_string (module->shared_library, strings, data, &header_size) + : 0); + if (module->c_prefix != NULL) + header->c_prefix = gi_ir_write_string (module->c_prefix, strings, data, &header_size); + else + header->c_prefix = 0; + header->entry_blob_size = sizeof (DirEntry); + header->function_blob_size = sizeof (FunctionBlob); + header->callback_blob_size = sizeof (CallbackBlob); + header->signal_blob_size = sizeof (SignalBlob); + header->vfunc_blob_size = sizeof (VFuncBlob); + header->arg_blob_size = sizeof (ArgBlob); + header->property_blob_size = sizeof (PropertyBlob); + header->field_blob_size = sizeof (FieldBlob); + header->value_blob_size = sizeof (ValueBlob); + header->constant_blob_size = sizeof (ConstantBlob); + header->error_domain_blob_size = 16; /* No longer used */ + header->attribute_blob_size = sizeof (AttributeBlob); + header->signature_blob_size = sizeof (SignatureBlob); + header->enum_blob_size = sizeof (EnumBlob); + header->struct_blob_size = sizeof (StructBlob); + header->object_blob_size = sizeof(ObjectBlob); + header->interface_blob_size = sizeof (InterfaceBlob); + header->union_blob_size = sizeof (UnionBlob); + + offset2 = ALIGN_VALUE (header_size, 4); + header->sections = offset2; + + /* Initialize all the sections to _END/0; we fill them in later using + * alloc_section(). (Right now there's just the directory index + * though, note) + */ + for (i = 0; i < NUM_SECTIONS; i++) + { + section = (Section*) &data[offset2]; + section->id = GI_SECTION_END; + section->offset = 0; + offset2 += sizeof(Section); + } + header->directory = offset2; + + /* fill in directory and content */ + entry = (DirEntry *)&data[header->directory]; + + offset2 += dir_size; + + for (e = module->entries, i = 0; e; e = e->next, i++) + { + GIIrTypelibBuild build; + GIIrNode *node = e->data; + + if (strchr (node->name, '.')) + { + g_error ("Names may not contain '.'"); + } + + /* we picked up implicit xref nodes, start over */ + if (i == n_entries) + { + GList *link; + g_message ("Found implicit cross references, starting over"); + + g_hash_table_destroy (strings); + g_hash_table_destroy (types); + + /* Reset the cached offsets */ + for (link = nodes_with_attributes; link; link = link->next) + ((GIIrNode *) link->data)->offset = 0; + + g_list_free (nodes_with_attributes); + strings = NULL; + + g_free (data); + data = NULL; + + goto restart; + } + + offset = offset2; + + if (node->type == GI_IR_NODE_XREF) + { + const char *namespace = ((GIIrNodeXRef*)node)->namespace; + + entry->blob_type = 0; + entry->local = FALSE; + entry->offset = gi_ir_write_string (namespace, strings, data, &offset2); + entry->name = gi_ir_write_string (node->name, strings, data, &offset2); + } + else + { + old_offset = offset; + offset2 = offset + gi_ir_node_get_size (node); + + entry->blob_type = node->type; + entry->local = TRUE; + entry->offset = offset; + entry->name = gi_ir_write_string (node->name, strings, data, &offset2); + + memset (&build, 0, sizeof (build)); + build.module = module; + build.strings = strings; + build.types = types; + build.nodes_with_attributes = nodes_with_attributes; + build.n_attributes = header->n_attributes; + build.data = data; + gi_ir_node_build_typelib (node, NULL, &build, &offset, &offset2, NULL); + + nodes_with_attributes = build.nodes_with_attributes; + header->n_attributes = build.n_attributes; + + if (offset2 > old_offset + gi_ir_node_get_full_size (node)) + g_error ("left a hole of %d bytes", offset2 - old_offset - gi_ir_node_get_full_size (node)); + } + + entry++; + } + + /* GIBaseInfo expects the AttributeBlob array to be sorted on the field (offset) */ + nodes_with_attributes = g_list_sort (nodes_with_attributes, node_cmp_offset_func); + + g_message ("header: %d entries, %d attributes", header->n_entries, header->n_attributes); + + gi_ir_node_dump_stats (); + + /* Write attributes after the blobs */ + offset = offset2; + header->attributes = offset; + offset2 = offset + header->n_attributes * header->attribute_blob_size; + + for (e = nodes_with_attributes; e; e = e->next) + { + GIIrNode *node = e->data; + write_attributes (module, node, strings, data, &offset, &offset2); + } + + g_message ("reallocating to %d bytes", offset2); + + data = g_realloc (data, offset2); + header = (Header*) data; + + data = add_directory_index_section (data, module, &offset2); + header = (Header *)data; + + length = header->size = offset2; + + bytes = g_bytes_new_take (g_steal_pointer (&data), length); + typelib = gi_typelib_new_from_bytes (bytes, &error); + g_bytes_unref (bytes); + + if (!typelib) + { + g_error ("error building typelib: %s", + error->message); + } + + g_hash_table_destroy (strings); + g_hash_table_destroy (types); + g_list_free (nodes_with_attributes); + + return typelib; +} + diff --git a/girepository/girnode-private.h b/girepository/girnode-private.h new file mode 100644 index 0000000..353d6d6 --- /dev/null +++ b/girepository/girnode-private.h @@ -0,0 +1,426 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Parsed GIR + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include + +#include "girmodule-private.h" + +G_BEGIN_DECLS + +typedef struct _GIIrNode GIIrNode; +typedef struct _GIIrNodeFunction GIIrNodeFunction; +typedef struct _GIIrNodeParam GIIrNodeParam; +typedef struct _GIIrNodeType GIIrNodeType; +typedef struct _GIIrNodeInterface GIIrNodeInterface; +typedef struct _GIIrNodeSignal GIIrNodeSignal; +typedef struct _GIIrNodeProperty GIIrNodeProperty; +typedef struct _GIIrNodeVFunc GIIrNodeVFunc; +typedef struct _GIIrNodeField GIIrNodeField; +typedef struct _GIIrNodeValue GIIrNodeValue; +typedef struct _GIIrNodeEnum GIIrNodeEnum; +typedef struct _GIIrNodeBoxed GIIrNodeBoxed; +typedef struct _GIIrNodeStruct GIIrNodeStruct; +typedef struct _GIIrNodeConstant GIIrNodeConstant; +typedef struct _GIIrNodeXRef GIIrNodeXRef; +typedef struct _GIIrNodeUnion GIIrNodeUnion; + +typedef enum +{ + GI_IR_NODE_INVALID = 0, + GI_IR_NODE_FUNCTION = 1, + GI_IR_NODE_CALLBACK = 2, + GI_IR_NODE_STRUCT = 3, + GI_IR_NODE_BOXED = 4, + GI_IR_NODE_ENUM = 5, + GI_IR_NODE_FLAGS = 6, + GI_IR_NODE_OBJECT = 7, + GI_IR_NODE_INTERFACE = 8, + GI_IR_NODE_CONSTANT = 9, + GI_IR_NODE_INVALID_0 = 10, /* DELETED - used to be ERROR_DOMAIN */ + GI_IR_NODE_UNION = 11, + GI_IR_NODE_PARAM = 12, + GI_IR_NODE_TYPE = 13, + GI_IR_NODE_PROPERTY = 14, + GI_IR_NODE_SIGNAL = 15, + GI_IR_NODE_VALUE = 16, + GI_IR_NODE_VFUNC = 17, + GI_IR_NODE_FIELD = 18, + GI_IR_NODE_XREF = 19 +} GIIrNodeTypeId; + +/** + * GIIrOffsetsState: + * @GI_IR_OFFSETS_UNKNOWN: offsets have not been calculated yet + * @GI_IR_OFFSETS_COMPUTED: offsets have been successfully calculated + * @GI_IR_OFFSETS_FAILED: calculating the offsets failed + * @GI_IR_OFFSETS_IN_PROGRESS: offsets are currently being calculated (used to + * detect type recursion) + * + * State tracking for calculating size and alignment of + * [type@GIRepository.IrNode]s. + * + * Since: 2.80 + */ +typedef enum +{ + GI_IR_OFFSETS_UNKNOWN, + GI_IR_OFFSETS_COMPUTED, + GI_IR_OFFSETS_FAILED, + GI_IR_OFFSETS_IN_PROGRESS, +} GIIrOffsetsState; + +struct _GIIrNode +{ + GIIrNodeTypeId type; + char *name; /* (owned) */ + GIIrModule *module; /* (unowned) */ + + uint32_t offset; /* Assigned as we build the typelib */ + + GHashTable *attributes; /* (element-type utf8 utf8) (owned) */ +}; + +struct _GIIrNodeXRef +{ + GIIrNode node; + + char *namespace; /* (owned) */ +}; + +struct _GIIrNodeFunction +{ + GIIrNode node; + + uint8_t deprecated : 1; + uint8_t is_varargs : 1; /* Not in typelib yet */ + + uint8_t is_method : 1; + uint8_t is_setter : 1; + uint8_t is_getter : 1; + uint8_t is_constructor : 1; + uint8_t wraps_vfunc : 1; + uint8_t throws : 1; + uint8_t instance_transfer_full : 1; + + char *symbol; /* (owned) */ + char *property; /* (owned) */ + + GIIrNodeParam *result; /* (owned) */ + GList *parameters; /* (element-type GIIrNode) (owned) */ +}; + +struct _GIIrNodeType +{ + GIIrNode node; + + uint8_t is_pointer : 1; + uint8_t is_basic : 1; + uint8_t is_array : 1; + uint8_t is_glist : 1; + uint8_t is_gslist : 1; + uint8_t is_ghashtable : 1; + uint8_t is_interface : 1; + uint8_t is_error : 1; + int tag; + + char *unparsed; /* (owned) */ + + uint8_t zero_terminated : 1; + uint8_t has_length : 1; + unsigned int length; + uint8_t has_size : 1; + size_t size; + GIArrayType array_type; + + GIIrNodeType *parameter_type1; /* (owned) */ + GIIrNodeType *parameter_type2; /* (owned) */ + + char *giinterface; /* (owned) */ + char **errors; /* (array zero-terminated=1) (owned) */ +}; + +struct _GIIrNodeParam +{ + GIIrNode node; + + uint8_t in : 1; + uint8_t out : 1; + uint8_t caller_allocates : 1; + uint8_t optional : 1; + uint8_t retval : 1; + uint8_t nullable : 1; + uint8_t skip : 1; + uint8_t transfer : 1; + uint8_t shallow_transfer : 1; + GIScopeType scope : 3; + + int8_t closure; + int8_t destroy; + + GIIrNodeType *type; /* (owned) */ +}; + +struct _GIIrNodeProperty +{ + GIIrNode node; + + uint8_t deprecated : 1; + + char *name; /* (owned) */ + uint8_t readable : 1; + uint8_t writable : 1; + uint8_t construct : 1; + uint8_t construct_only : 1; + uint8_t transfer : 1; + uint8_t shallow_transfer : 1; + + char *setter; /* (owned) */ + char *getter; /* (owned) */ + + GIIrNodeType *type; /* (owned) */ +}; + +struct _GIIrNodeSignal +{ + GIIrNode node; + + uint8_t deprecated : 1; + + uint8_t run_first : 1; + uint8_t run_last : 1; + uint8_t run_cleanup : 1; + uint8_t no_recurse : 1; + uint8_t detailed : 1; + uint8_t action : 1; + uint8_t no_hooks : 1; + uint8_t instance_transfer_full : 1; + + uint8_t has_class_closure : 1; + uint8_t true_stops_emit : 1; + + unsigned int class_closure; + + GList *parameters; /* (element-type GIIrNode) (owned) */ + GIIrNodeParam *result; /* (owned) */ +}; + +struct _GIIrNodeVFunc +{ + GIIrNode node; + + uint8_t is_varargs : 1; /* Not in typelib yet */ + uint8_t must_chain_up : 1; + uint8_t must_be_implemented : 1; + uint8_t must_not_be_implemented : 1; + uint8_t is_class_closure : 1; + uint8_t throws : 1; + uint8_t instance_transfer_full : 1; + + char *invoker; /* (owned) */ + + GList *parameters; /* (element-type GIIrNode) (owned) */ + GIIrNodeParam *result; /* (owned) */ + + size_t offset; +}; + +struct _GIIrNodeField +{ + GIIrNode node; + + uint8_t readable : 1; + uint8_t writable : 1; + unsigned int bits; + size_t offset; + GIIrOffsetsState offset_state; + GIIrNodeFunction *callback; /* (owned) */ + + GIIrNodeType *type; /* (owned) */ +}; + +struct _GIIrNodeInterface +{ + GIIrNode node; + + uint8_t abstract : 1; + uint8_t deprecated : 1; + uint8_t fundamental : 1; + uint8_t final_ : 1; + + char *gtype_name; /* (owned) */ + char *gtype_init; /* (owned) */ + + char *ref_func; /* (owned) */ + char *unref_func; /* (owned) */ + char *set_value_func; /* (owned) */ + char *get_value_func; /* (owned) */ + + char *parent; /* (owned) */ + char *glib_type_struct; /* (owned) */ + + GList *interfaces; /* (element-type GIIrNode) (owned) */ + GList *prerequisites; /* (element-type utf8) (owned) */ + + size_t alignment; + size_t size; + GIIrOffsetsState offsets_state; + + GList *members; /* (element-type GIIrNode) (owned) */ +}; + +struct _GIIrNodeValue +{ + GIIrNode node; + + uint8_t deprecated : 1; + + int64_t value; +}; + +struct _GIIrNodeConstant +{ + GIIrNode node; + + uint8_t deprecated : 1; + + GIIrNodeType *type; /* (owned) */ + + char *value; /* (owned) */ +}; + +struct _GIIrNodeEnum +{ + GIIrNode node; + + uint8_t deprecated : 1; + GITypeTag storage_type; + + char *gtype_name; /* (owned) */ + char *gtype_init; /* (owned) */ + char *error_domain; /* (owned) */ + + GList *values; /* (element-type GIIrNode) (owned) */ + GList *methods; /* (element-type GIIrNode) (owned) */ +}; + +struct _GIIrNodeBoxed +{ + GIIrNode node; + + uint8_t deprecated : 1; + + char *gtype_name; /* (owned) */ + char *gtype_init; /* (owned) */ + + size_t alignment; + size_t size; + GIIrOffsetsState offsets_state; + + GList *members; /* (element-type GIIrNode) (owned) */ +}; + +struct _GIIrNodeStruct +{ + GIIrNode node; + + uint8_t deprecated : 1; + uint8_t disguised : 1; + uint8_t opaque : 1; + uint8_t pointer : 1; + uint8_t is_gtype_struct : 1; + uint8_t foreign : 1; + + char *gtype_name; /* (owned) */ + char *gtype_init; /* (owned) */ + + char *copy_func; /* (owned) */ + char *free_func; /* (owned) */ + + size_t alignment; + size_t size; + GIIrOffsetsState offsets_state; + + GList *members; /* (element-type GIIrNode) (owned) */ +}; + +struct _GIIrNodeUnion +{ + GIIrNode node; + + uint8_t deprecated : 1; + + GList *members; /* (element-type GIIrNode) (owned) */ + GList *discriminators; /* (element-type GIIrNode) (owned) */ + + char *gtype_name; /* (owned) */ + char *gtype_init; /* (owned) */ + + char *copy_func; /* (owned) */ + char *free_func; /* (owned) */ + + size_t alignment; + size_t size; + GIIrOffsetsState offsets_state; + + size_t discriminator_offset; + GIIrNodeType *discriminator_type; /* (owned) */ +}; + + +GIIrNode *gi_ir_node_new (GIIrNodeTypeId type, + GIIrModule *module); +void gi_ir_node_free (GIIrNode *node); +uint32_t gi_ir_node_get_size (GIIrNode *node); +uint32_t gi_ir_node_get_full_size (GIIrNode *node); +void gi_ir_node_build_typelib (GIIrNode *node, + GIIrNode *parent, + GIIrTypelibBuild *build, + uint32_t *offset, + uint32_t *offset2, + uint16_t *count2); +int gi_ir_node_cmp (GIIrNode *node, + GIIrNode *other); +gboolean gi_ir_node_can_have_member (GIIrNode *node); +void gi_ir_node_add_member (GIIrNode *node, + GIIrNodeFunction *member); +uint32_t gi_ir_write_string (const char *str, + GHashTable *strings, + uint8_t *data, + uint32_t *offset); + +const char * gi_ir_node_param_direction_string (GIIrNodeParam * node); +const char * gi_ir_node_type_to_string (GIIrNodeTypeId type); + +GIIrNode *gi_ir_find_node (GIIrTypelibBuild *build, + GIIrModule *module, + const char *name); + +/* In giroffsets.c */ + +void gi_ir_node_compute_offsets (GIIrTypelibBuild *build, + GIIrNode *node); + + +G_END_DECLS diff --git a/girepository/girnode.c b/girepository/girnode.c new file mode 100644 index 0000000..3a09830 --- /dev/null +++ b/girepository/girnode.c @@ -0,0 +1,2449 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Typelib creation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "girnode-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" + +#include +#include +#include + +#ifdef _MSC_VER +#define strtoll _strtoi64 +#define strtoull _strtoui64 +#endif + +static gulong string_count = 0; +static gulong unique_string_count = 0; +static gulong string_size = 0; +static gulong unique_string_size = 0; +static gulong types_count = 0; +static gulong unique_types_count = 0; + +void +gi_ir_node_init_stats (void) +{ + string_count = 0; + unique_string_count = 0; + string_size = 0; + unique_string_size = 0; + types_count = 0; + unique_types_count = 0; +} + +void +gi_ir_node_dump_stats (void) +{ + g_message ("%lu strings (%lu before sharing), %lu bytes (%lu before sharing)", + unique_string_count, string_count, unique_string_size, string_size); + g_message ("%lu types (%lu before sharing)", unique_types_count, types_count); +} + +#define DO_ALIGNED_COPY(dest_addr, value, type) \ +do { \ + type tmp_var; \ + tmp_var = value; \ + memcpy(dest_addr, &tmp_var, sizeof(type)); \ +} while(0) + +#define ALIGN_VALUE(this, boundary) \ + (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) + + +const char * +gi_ir_node_type_to_string (GIIrNodeTypeId type) +{ + switch (type) + { + case GI_IR_NODE_FUNCTION: + return "function"; + case GI_IR_NODE_CALLBACK: + return "callback"; + case GI_IR_NODE_PARAM: + return "param"; + case GI_IR_NODE_TYPE: + return "type"; + case GI_IR_NODE_OBJECT: + return "object"; + case GI_IR_NODE_INTERFACE: + return "interface"; + case GI_IR_NODE_SIGNAL: + return "signal"; + case GI_IR_NODE_PROPERTY: + return "property"; + case GI_IR_NODE_VFUNC: + return "vfunc"; + case GI_IR_NODE_FIELD: + return "field"; + case GI_IR_NODE_ENUM: + return "enum"; + case GI_IR_NODE_FLAGS: + return "flags"; + case GI_IR_NODE_BOXED: + return "boxed"; + case GI_IR_NODE_STRUCT: + return "struct"; + case GI_IR_NODE_VALUE: + return "value"; + case GI_IR_NODE_CONSTANT: + return "constant"; + case GI_IR_NODE_XREF: + return "xref"; + case GI_IR_NODE_UNION: + return "union"; + default: + return "unknown"; + } +} + +GIIrNode * +gi_ir_node_new (GIIrNodeTypeId type, + GIIrModule *module) +{ + GIIrNode *node = NULL; + + switch (type) + { + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + node = g_malloc0 (sizeof (GIIrNodeFunction)); + break; + + case GI_IR_NODE_PARAM: + node = g_malloc0 (sizeof (GIIrNodeParam)); + break; + + case GI_IR_NODE_TYPE: + node = g_malloc0 (sizeof (GIIrNodeType)); + break; + + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + node = g_malloc0 (sizeof (GIIrNodeInterface)); + break; + + case GI_IR_NODE_SIGNAL: + node = g_malloc0 (sizeof (GIIrNodeSignal)); + break; + + case GI_IR_NODE_PROPERTY: + node = g_malloc0 (sizeof (GIIrNodeProperty)); + break; + + case GI_IR_NODE_VFUNC: + node = g_malloc0 (sizeof (GIIrNodeFunction)); + break; + + case GI_IR_NODE_FIELD: + node = g_malloc0 (sizeof (GIIrNodeField)); + break; + + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + node = g_malloc0 (sizeof (GIIrNodeEnum)); + break; + + case GI_IR_NODE_BOXED: + node = g_malloc0 (sizeof (GIIrNodeBoxed)); + break; + + case GI_IR_NODE_STRUCT: + node = g_malloc0 (sizeof (GIIrNodeStruct)); + break; + + case GI_IR_NODE_VALUE: + node = g_malloc0 (sizeof (GIIrNodeValue)); + break; + + case GI_IR_NODE_CONSTANT: + node = g_malloc0 (sizeof (GIIrNodeConstant)); + break; + + case GI_IR_NODE_XREF: + node = g_malloc0 (sizeof (GIIrNodeXRef)); + break; + + case GI_IR_NODE_UNION: + node = g_malloc0 (sizeof (GIIrNodeUnion)); + break; + + default: + g_error ("Unhandled node type %d", type); + break; + } + + node->type = type; + node->module = module; + node->offset = 0; + node->attributes = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + + return node; +} + +void +gi_ir_node_free (GIIrNode *node) +{ + GList *l; + + if (node == NULL) + return; + + switch (node->type) + { + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + { + GIIrNodeFunction *function = (GIIrNodeFunction *)node; + + g_free (node->name); + g_free (function->symbol); + g_free (function->property); + gi_ir_node_free ((GIIrNode *)function->result); + for (l = function->parameters; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (function->parameters); + } + break; + + case GI_IR_NODE_TYPE: + { + GIIrNodeType *type = (GIIrNodeType *)node; + + g_free (node->name); + gi_ir_node_free ((GIIrNode *)type->parameter_type1); + gi_ir_node_free ((GIIrNode *)type->parameter_type2); + + g_free (type->giinterface); + g_strfreev (type->errors); + g_free (type->unparsed); + } + break; + + case GI_IR_NODE_PARAM: + { + GIIrNodeParam *param = (GIIrNodeParam *)node; + + g_free (node->name); + gi_ir_node_free ((GIIrNode *)param->type); + } + break; + + case GI_IR_NODE_PROPERTY: + { + GIIrNodeProperty *property = (GIIrNodeProperty *)node; + + g_free (node->name); + g_free (property->setter); + g_free (property->getter); + gi_ir_node_free ((GIIrNode *)property->type); + } + break; + + case GI_IR_NODE_SIGNAL: + { + GIIrNodeSignal *signal = (GIIrNodeSignal *)node; + + g_free (node->name); + for (l = signal->parameters; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (signal->parameters); + gi_ir_node_free ((GIIrNode *)signal->result); + } + break; + + case GI_IR_NODE_VFUNC: + { + GIIrNodeVFunc *vfunc = (GIIrNodeVFunc *)node; + + g_free (node->name); + g_free (vfunc->invoker); + for (l = vfunc->parameters; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (vfunc->parameters); + gi_ir_node_free ((GIIrNode *)vfunc->result); + } + break; + + case GI_IR_NODE_FIELD: + { + GIIrNodeField *field = (GIIrNodeField *)node; + + g_free (node->name); + gi_ir_node_free ((GIIrNode *)field->type); + gi_ir_node_free ((GIIrNode *)field->callback); + } + break; + + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + g_free (node->name); + g_free (iface->gtype_name); + g_free (iface->gtype_init); + g_free (iface->ref_func); + g_free (iface->unref_func); + g_free (iface->set_value_func); + g_free (iface->get_value_func); + + + g_free (iface->glib_type_struct); + g_free (iface->parent); + + for (l = iface->interfaces; l; l = l->next) + g_free ((GIIrNode *)l->data); + g_list_free (iface->interfaces); + + g_list_free_full (iface->prerequisites, g_free); + + for (l = iface->members; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (iface->members); + + } + break; + + case GI_IR_NODE_VALUE: + { + g_free (node->name); + } + break; + + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + GIIrNodeEnum *enum_ = (GIIrNodeEnum *)node; + + g_free (node->name); + g_free (enum_->gtype_name); + g_free (enum_->gtype_init); + g_free (enum_->error_domain); + + for (l = enum_->values; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (enum_->values); + + for (l = enum_->methods; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (enum_->methods); + } + break; + + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + + g_free (node->name); + g_free (boxed->gtype_name); + g_free (boxed->gtype_init); + + for (l = boxed->members; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (boxed->members); + } + break; + + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + + g_free (node->name); + g_free (struct_->gtype_name); + g_free (struct_->gtype_init); + g_free (struct_->copy_func); + g_free (struct_->free_func); + + for (l = struct_->members; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + g_list_free (struct_->members); + } + break; + + case GI_IR_NODE_CONSTANT: + { + GIIrNodeConstant *constant = (GIIrNodeConstant *)node; + + g_free (node->name); + g_free (constant->value); + gi_ir_node_free ((GIIrNode *)constant->type); + } + break; + + case GI_IR_NODE_XREF: + { + GIIrNodeXRef *xref = (GIIrNodeXRef *)node; + + g_free (node->name); + g_free (xref->namespace); + } + break; + + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + + g_free (node->name); + g_free (union_->gtype_name); + g_free (union_->gtype_init); + g_free (union_->copy_func); + g_free (union_->free_func); + + gi_ir_node_free ((GIIrNode *)union_->discriminator_type); + for (l = union_->members; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + for (l = union_->discriminators; l; l = l->next) + gi_ir_node_free ((GIIrNode *)l->data); + } + break; + + default: + g_error ("Unhandled node type %d", node->type); + break; + } + + g_hash_table_destroy (node->attributes); + + g_free (node); +} + +/* returns the fixed size of the blob */ +uint32_t +gi_ir_node_get_size (GIIrNode *node) +{ + GList *l; + size_t size, n; + + switch (node->type) + { + case GI_IR_NODE_CALLBACK: + size = sizeof (CallbackBlob); + break; + + case GI_IR_NODE_FUNCTION: + size = sizeof (FunctionBlob); + break; + + case GI_IR_NODE_PARAM: + /* See the comment in the GI_IR_NODE_PARAM/ArgBlob writing below */ + size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob); + break; + + case GI_IR_NODE_TYPE: + size = sizeof (SimpleTypeBlob); + break; + + case GI_IR_NODE_OBJECT: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + n = g_list_length (iface->interfaces); + size = sizeof (ObjectBlob) + 2 * (n + (n % 2)); + + for (l = iface->members; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + n = g_list_length (iface->prerequisites); + size = sizeof (InterfaceBlob) + 2 * (n + (n % 2)); + + for (l = iface->members; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + GIIrNodeEnum *enum_ = (GIIrNodeEnum *)node; + + size = sizeof (EnumBlob); + for (l = enum_->values; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + for (l = enum_->methods; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_VALUE: + size = sizeof (ValueBlob); + break; + + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + + size = sizeof (StructBlob); + for (l = struct_->members; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + + size = sizeof (StructBlob); + for (l = boxed->members; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_PROPERTY: + size = sizeof (PropertyBlob); + break; + + case GI_IR_NODE_SIGNAL: + size = sizeof (SignalBlob); + break; + + case GI_IR_NODE_VFUNC: + size = sizeof (VFuncBlob); + break; + + case GI_IR_NODE_FIELD: + { + GIIrNodeField *field = (GIIrNodeField *)node; + + size = sizeof (FieldBlob); + if (field->callback) + size += gi_ir_node_get_size ((GIIrNode *)field->callback); + } + break; + + case GI_IR_NODE_CONSTANT: + size = sizeof (ConstantBlob); + break; + + case GI_IR_NODE_XREF: + size = 0; + break; + + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + + size = sizeof (UnionBlob); + for (l = union_->members; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + for (l = union_->discriminators; l; l = l->next) + size += gi_ir_node_get_size ((GIIrNode *)l->data); + } + break; + + default: + g_error ("Unhandled node type '%s'", gi_ir_node_type_to_string (node->type)); + size = 0; + } + + g_debug ("node %p type '%s' size %zu", node, + gi_ir_node_type_to_string (node->type), size); + + g_assert (size <= G_MAXUINT32); + + return size; +} + +static void +add_attribute_size (gpointer key, gpointer value, gpointer data) +{ + const char *key_str = key; + const char *value_str = value; + size_t *size_p = data; + + *size_p += sizeof (AttributeBlob); + *size_p += ALIGN_VALUE (strlen (key_str) + 1, 4); + *size_p += ALIGN_VALUE (strlen (value_str) + 1, 4); +} + +/* returns the full size of the blob including variable-size parts (including attributes) */ +static uint32_t +gi_ir_node_get_full_size_internal (GIIrNode *parent, + GIIrNode *node) +{ + GList *l; + size_t size, n; + + if (node == NULL && parent != NULL) + g_error ("Caught NULL node, parent=%s", parent->name); + + g_debug ("node %p type '%s'", node, + gi_ir_node_type_to_string (node->type)); + + switch (node->type) + { + case GI_IR_NODE_CALLBACK: + { + GIIrNodeFunction *function = (GIIrNodeFunction *)node; + size = sizeof (CallbackBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + for (l = function->parameters; l; l = l->next) + { + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)function->result); + } + break; + + case GI_IR_NODE_FUNCTION: + { + GIIrNodeFunction *function = (GIIrNodeFunction *)node; + size = sizeof (FunctionBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += ALIGN_VALUE (strlen (function->symbol) + 1, 4); + for (l = function->parameters; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)function->result); + } + break; + + case GI_IR_NODE_PARAM: + { + GIIrNodeParam *param = (GIIrNodeParam *)node; + + /* See the comment in the GI_IR_NODE_PARAM/ArgBlob writing below */ + size = sizeof (ArgBlob) - sizeof (SimpleTypeBlob); + if (node->name) + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)param->type); + } + break; + + case GI_IR_NODE_TYPE: + { + GIIrNodeType *type = (GIIrNodeType *)node; + size = sizeof (SimpleTypeBlob); + if (!GI_TYPE_TAG_IS_BASIC (type->tag)) + { + g_debug ("node %p type tag '%s'", node, + gi_type_tag_to_string (type->tag)); + + switch (type->tag) + { + case GI_TYPE_TAG_ARRAY: + size = sizeof (ArrayTypeBlob); + if (type->parameter_type1) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)type->parameter_type1); + break; + case GI_TYPE_TAG_INTERFACE: + size += sizeof (InterfaceTypeBlob); + break; + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + size += sizeof (ParamTypeBlob); + if (type->parameter_type1) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)type->parameter_type1); + break; + case GI_TYPE_TAG_GHASH: + size += sizeof (ParamTypeBlob) * 2; + if (type->parameter_type1) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)type->parameter_type1); + if (type->parameter_type2) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)type->parameter_type2); + break; + case GI_TYPE_TAG_ERROR: + size += sizeof (ErrorTypeBlob); + break; + default: + g_error ("Unknown type tag %d", type->tag); + break; + } + } + } + break; + + case GI_IR_NODE_OBJECT: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + n = g_list_length (iface->interfaces); + size = sizeof(ObjectBlob); + if (iface->parent) + size += ALIGN_VALUE (strlen (iface->parent) + 1, 4); + if (iface->glib_type_struct) + size += ALIGN_VALUE (strlen (iface->glib_type_struct) + 1, 4); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4); + if (iface->gtype_init) + size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4); + if (iface->ref_func) + size += ALIGN_VALUE (strlen (iface->ref_func) + 1, 4); + if (iface->unref_func) + size += ALIGN_VALUE (strlen (iface->unref_func) + 1, 4); + if (iface->set_value_func) + size += ALIGN_VALUE (strlen (iface->set_value_func) + 1, 4); + if (iface->get_value_func) + size += ALIGN_VALUE (strlen (iface->get_value_func) + 1, 4); + size += 2 * (n + (n % 2)); + + for (l = iface->members; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + n = g_list_length (iface->prerequisites); + size = sizeof (InterfaceBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += ALIGN_VALUE (strlen (iface->gtype_name) + 1, 4); + size += ALIGN_VALUE (strlen (iface->gtype_init) + 1, 4); + size += 2 * (n + (n % 2)); + + for (l = iface->members; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + GIIrNodeEnum *enum_ = (GIIrNodeEnum *)node; + + size = sizeof (EnumBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (enum_->gtype_name) + { + size += ALIGN_VALUE (strlen (enum_->gtype_name) + 1, 4); + size += ALIGN_VALUE (strlen (enum_->gtype_init) + 1, 4); + } + if (enum_->error_domain) + size += ALIGN_VALUE (strlen (enum_->error_domain) + 1, 4); + + for (l = enum_->values; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + for (l = enum_->methods; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_VALUE: + { + size = sizeof (ValueBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + } + break; + + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + + size = sizeof (StructBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (struct_->gtype_name) + size += ALIGN_VALUE (strlen (struct_->gtype_name) + 1, 4); + if (struct_->gtype_init) + size += ALIGN_VALUE (strlen (struct_->gtype_init) + 1, 4); + if (struct_->copy_func) + size += ALIGN_VALUE (strlen (struct_->copy_func) + 1, 4); + if (struct_->free_func) + size += ALIGN_VALUE (strlen (struct_->free_func) + 1, 4); + for (l = struct_->members; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + + size = sizeof (StructBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (boxed->gtype_name) + { + size += ALIGN_VALUE (strlen (boxed->gtype_name) + 1, 4); + size += ALIGN_VALUE (strlen (boxed->gtype_init) + 1, 4); + } + for (l = boxed->members; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + case GI_IR_NODE_PROPERTY: + { + GIIrNodeProperty *prop = (GIIrNodeProperty *)node; + + size = sizeof (PropertyBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)prop->type); + } + break; + + case GI_IR_NODE_SIGNAL: + { + GIIrNodeSignal *signal = (GIIrNodeSignal *)node; + + size = sizeof (SignalBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + for (l = signal->parameters; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)signal->result); + } + break; + + case GI_IR_NODE_VFUNC: + { + GIIrNodeVFunc *vfunc = (GIIrNodeVFunc *)node; + + size = sizeof (VFuncBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + for (l = vfunc->parameters; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)vfunc->result); + } + break; + + case GI_IR_NODE_FIELD: + { + GIIrNodeField *field = (GIIrNodeField *)node; + + size = sizeof (FieldBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (field->callback) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)field->callback); + else + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)field->type); + } + break; + + case GI_IR_NODE_CONSTANT: + { + GIIrNodeConstant *constant = (GIIrNodeConstant *)node; + + size = sizeof (ConstantBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + /* FIXME non-string values */ + size += ALIGN_VALUE (strlen (constant->value) + 1, 4); + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)constant->type); + } + break; + + case GI_IR_NODE_XREF: + { + GIIrNodeXRef *xref = (GIIrNodeXRef *)node; + + size = 0; + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + size += ALIGN_VALUE (strlen (xref->namespace) + 1, 4); + } + break; + + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + + size = sizeof (UnionBlob); + size += ALIGN_VALUE (strlen (node->name) + 1, 4); + if (union_->gtype_name) + size += ALIGN_VALUE (strlen (union_->gtype_name) + 1, 4); + if (union_->gtype_init) + size += ALIGN_VALUE (strlen (union_->gtype_init) + 1, 4); + if (union_->copy_func) + size += ALIGN_VALUE (strlen (union_->copy_func) + 1, 4); + if (union_->free_func) + size += ALIGN_VALUE (strlen (union_->free_func) + 1, 4); + for (l = union_->members; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + for (l = union_->discriminators; l; l = l->next) + size += gi_ir_node_get_full_size_internal (node, (GIIrNode *)l->data); + } + break; + + default: + g_error ("Unknown type tag %d", node->type); + size = 0; + } + + g_debug ("node %s%s%s%p type '%s' full size %zu", + node->name ? "'" : "", + node->name ? node->name : "", + node->name ? "' " : "", + node, gi_ir_node_type_to_string (node->type), size); + + g_hash_table_foreach (node->attributes, add_attribute_size, &size); + + g_assert (size <= G_MAXUINT32); + + return size; +} + +uint32_t +gi_ir_node_get_full_size (GIIrNode *node) +{ + return gi_ir_node_get_full_size_internal (NULL, node); +} + +int +gi_ir_node_cmp (GIIrNode *node, + GIIrNode *other) +{ + if (node->type < other->type) + return -1; + else if (node->type > other->type) + return 1; + else + return strcmp (node->name, other->name); +} + +gboolean +gi_ir_node_can_have_member (GIIrNode *node) +{ + switch (node->type) + { + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + case GI_IR_NODE_BOXED: + case GI_IR_NODE_STRUCT: + case GI_IR_NODE_UNION: + return TRUE; + /* list others individually rather than with default: so that compiler + * warns if new node types are added without adding them to the switch + */ + case GI_IR_NODE_INVALID: + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + case GI_IR_NODE_CONSTANT: + case GI_IR_NODE_INVALID_0: + case GI_IR_NODE_PARAM: + case GI_IR_NODE_TYPE: + case GI_IR_NODE_PROPERTY: + case GI_IR_NODE_SIGNAL: + case GI_IR_NODE_VALUE: + case GI_IR_NODE_VFUNC: + case GI_IR_NODE_FIELD: + case GI_IR_NODE_XREF: + return FALSE; + default: + g_assert_not_reached (); + }; + return FALSE; +} + +void +gi_ir_node_add_member (GIIrNode *node, + GIIrNodeFunction *member) +{ + g_return_if_fail (node != NULL); + g_return_if_fail (member != NULL); + + switch (node->type) + { + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + iface->members = + g_list_insert_sorted (iface->members, member, + (GCompareFunc) gi_ir_node_cmp); + break; + } + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + boxed->members = + g_list_insert_sorted (boxed->members, member, + (GCompareFunc) gi_ir_node_cmp); + break; + } + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + struct_->members = + g_list_insert_sorted (struct_->members, member, + (GCompareFunc) gi_ir_node_cmp); + break; + } + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + union_->members = + g_list_insert_sorted (union_->members, member, + (GCompareFunc) gi_ir_node_cmp); + break; + } + default: + g_error ("Cannot add a member to unknown type tag type %d", + node->type); + break; + } +} + +const char * +gi_ir_node_param_direction_string (GIIrNodeParam * node) +{ + if (node->out) + { + if (node->in) + return "in-out"; + else + return "out"; + } + return "in"; +} + +static int64_t +parse_int_value (const char *str) +{ + return g_ascii_strtoll (str, NULL, 0); +} + +static uint64_t +parse_uint_value (const char *str) +{ + return g_ascii_strtoull (str, NULL, 0); +} + +static double +parse_float_value (const char *str) +{ + return g_ascii_strtod (str, NULL); +} + +static gboolean +parse_boolean_value (const char *str) +{ + if (g_ascii_strcasecmp (str, "TRUE") == 0) + return TRUE; + + if (g_ascii_strcasecmp (str, "FALSE") == 0) + return FALSE; + + return parse_int_value (str) ? TRUE : FALSE; +} + +static GIIrNode * +find_entry_node (GIIrTypelibBuild *build, + const char *name, + uint16_t *idx) + +{ + GIIrModule *module = build->module; + GList *l; + size_t i; + unsigned int n_names; + char **names; + GIIrNode *result = NULL; + + g_assert (name != NULL); + g_assert (strlen (name) > 0); + + names = g_strsplit (name, ".", 0); + n_names = g_strv_length (names); + if (n_names > 2) + g_error ("Too many name parts"); + + for (l = module->entries, i = 1; l; l = l->next, i++) + { + GIIrNode *node = (GIIrNode *)l->data; + + if (n_names > 1) + { + if (node->type != GI_IR_NODE_XREF) + continue; + + if (((GIIrNodeXRef *)node)->namespace == NULL || + strcmp (((GIIrNodeXRef *)node)->namespace, names[0]) != 0) + continue; + } + + if (strcmp (node->name, names[n_names - 1]) == 0) + { + if (idx) + *idx = i; + + result = node; + goto out; + } + } + + if (n_names > 1) + { + GIIrNode *node = gi_ir_node_new (GI_IR_NODE_XREF, module); + + ((GIIrNodeXRef *)node)->namespace = g_strdup (names[0]); + node->name = g_strdup (names[1]); + + module->entries = g_list_append (module->entries, node); + + if (idx) + *idx = g_list_length (module->entries); + + result = node; + + g_debug ("Creating XREF: %s %s", names[0], names[1]); + + goto out; + } + + + gi_ir_module_fatal (build, 0, "type reference '%s' not found", name); + out: + + g_strfreev (names); + + return result; +} + +static uint16_t +find_entry (GIIrTypelibBuild *build, + const char *name) +{ + uint16_t idx = 0; + + find_entry_node (build, name, &idx); + + return idx; +} + +static GIIrModule * +find_namespace (GIIrModule *module, + const char *name) +{ + GIIrModule *target; + GList *l; + + if (strcmp (module->name, name) == 0) + return module; + + for (l = module->include_modules; l; l = l->next) + { + GIIrModule *submodule = l->data; + + if (strcmp (submodule->name, name) == 0) + return submodule; + + target = find_namespace (submodule, name); + if (target) + return target; + } + return NULL; +} + +GIIrNode * +gi_ir_find_node (GIIrTypelibBuild *build, + GIIrModule *src_module, + const char *name) +{ + GList *l; + GIIrNode *return_node = NULL; + char **names = g_strsplit (name, ".", 0); + unsigned n_names = g_strv_length (names); + const char *target_name; + GIIrModule *target_module; + + if (n_names == 1) + { + target_module = src_module; + target_name = name; + } + else + { + target_module = find_namespace (build->module, names[0]); + target_name = names[1]; + } + + /* find_namespace() may return NULL. */ + if (target_module == NULL) + goto done; + + for (l = target_module->entries; l; l = l->next) + { + GIIrNode *node = (GIIrNode *)l->data; + + if (strcmp (node->name, target_name) == 0) + { + return_node = node; + break; + } + } + +done: + g_strfreev (names); + + return return_node; +} + +static int +get_index_of_member_type (GIIrNodeInterface *node, + GIIrNodeTypeId type, + const char *name) +{ + int index = -1; + GList *l; + + for (l = node->members; l; l = l->next) + { + GIIrNode *member_node = l->data; + + if (member_node->type != type) + continue; + + index++; + + if (strcmp (member_node->name, name) == 0) + break; + } + + return index; +} + +static void +serialize_type (GIIrTypelibBuild *build, + GIIrNodeType *node, + GString *str) +{ + size_t i; + + if (GI_TYPE_TAG_IS_BASIC (node->tag)) + { + g_string_append_printf (str, "%s%s", gi_type_tag_to_string (node->tag), + node->is_pointer ? "*" : ""); + } + else if (node->tag == GI_TYPE_TAG_ARRAY) + { + if (node->array_type == GI_ARRAY_TYPE_C) + { + serialize_type (build, node->parameter_type1, str); + g_string_append (str, "["); + + if (node->has_length) + g_string_append_printf (str, "length=%d", node->length); + else if (node->has_size) + g_string_append_printf (str, "fixed-size=%" G_GSIZE_FORMAT, node->size); + + if (node->zero_terminated) + g_string_append_printf (str, "%szero-terminated=1", + node->has_length ? "," : ""); + + g_string_append (str, "]"); + if (node->is_pointer) + g_string_append (str, "*"); + } + else if (node->array_type == GI_ARRAY_TYPE_BYTE_ARRAY) + { + /* We on purpose skip serializing parameter_type1, which should + always be void* + */ + g_string_append (str, "GByteArray"); + } + else + { + if (node->array_type == GI_ARRAY_TYPE_ARRAY) + g_string_append (str, "GArray"); + else + g_string_append (str, "GPtrArray"); + if (node->parameter_type1) + { + g_string_append (str, "<"); + serialize_type (build, node->parameter_type1, str); + g_string_append (str, ">"); + } + } + } + else if (node->tag == GI_TYPE_TAG_INTERFACE) + { + GIIrNode *iface; + char *name; + + iface = find_entry_node (build, node->giinterface, NULL); + if (iface) + { + if (iface->type == GI_IR_NODE_XREF) + g_string_append_printf (str, "%s.", ((GIIrNodeXRef *)iface)->namespace); + name = iface->name; + } + else + { + g_warning ("Interface for type reference %s not found", node->giinterface); + name = node->giinterface; + } + + g_string_append_printf (str, "%s%s", name, + node->is_pointer ? "*" : ""); + } + else if (node->tag == GI_TYPE_TAG_GLIST) + { + g_string_append (str, "GList"); + if (node->parameter_type1) + { + g_string_append (str, "<"); + serialize_type (build, node->parameter_type1, str); + g_string_append (str, ">"); + } + } + else if (node->tag == GI_TYPE_TAG_GSLIST) + { + g_string_append (str, "GSList"); + if (node->parameter_type1) + { + g_string_append (str, "<"); + serialize_type (build, node->parameter_type1, str); + g_string_append (str, ">"); + } + } + else if (node->tag == GI_TYPE_TAG_GHASH) + { + g_string_append (str, "GHashTable"); + if (node->parameter_type1) + { + g_string_append (str, "<"); + serialize_type (build, node->parameter_type1, str); + g_string_append (str, ","); + serialize_type (build, node->parameter_type2, str); + g_string_append (str, ">"); + } + } + else if (node->tag == GI_TYPE_TAG_ERROR) + { + g_string_append (str, "GError"); + if (node->errors) + { + g_string_append (str, "<"); + for (i = 0; node->errors[i]; i++) + { + if (i > 0) + g_string_append (str, ","); + g_string_append (str, node->errors[i]); + } + g_string_append (str, ">"); + } + } +} + +static void +gi_ir_node_build_members (GList **members, + GIIrNodeTypeId type, + uint16_t *count, + GIIrNode *parent, + GIIrTypelibBuild *build, + uint32_t *offset, + uint32_t *offset2, + uint16_t *count2) +{ + GList *l = *members; + + while (l) + { + GIIrNode *member = (GIIrNode *)l->data; + GList *next = l->next; + + if (member->type == type) + { + (*count)++; + gi_ir_node_build_typelib (member, parent, build, offset, offset2, count2); + *members = g_list_delete_link (*members, l); + } + l = next; + } +} + +static void +gi_ir_node_check_unhandled_members (GList **members, + GIIrNodeTypeId container_type) +{ +#if 0 + if (*members) + { + GList *l; + + for (l = *members; l; l = l->next) + { + GIIrNode *member = (GIIrNode *)l->data; + g_printerr ("Unhandled '%s' member '%s' type '%s'\n", + gi_ir_node_type_to_string (container_type), + member->name, + gi_ir_node_type_to_string (member->type)); + } + + g_list_free (*members); + *members = NULL; + + g_error ("Unhandled members. Aborting."); + } +#else + g_list_free (*members); + *members = NULL; +#endif +} + +void +gi_ir_node_build_typelib (GIIrNode *node, + GIIrNode *parent, + GIIrTypelibBuild *build, + uint32_t *offset, + uint32_t *offset2, + uint16_t *count2) +{ + gboolean appended_stack; + GHashTable *strings = build->strings; + GHashTable *types = build->types; + uint8_t *data = build->data; + GList *l; + uint32_t old_offset = *offset; + uint32_t old_offset2 = *offset2; + + g_assert (node != NULL); + + g_debug ("build_typelib: %s%s(%s)", + node->name ? node->name : "", + node->name ? " " : "", + gi_ir_node_type_to_string (node->type)); + + if (build->stack) + appended_stack = node != (GIIrNode*)build->stack->data; + else + appended_stack = TRUE; + if (appended_stack) + build->stack = g_list_prepend (build->stack, node); + + gi_ir_node_compute_offsets (build, node); + + /* We should only be building each node once. If we do a typelib expansion, we also + * reset the offset in girmodule.c. + */ + g_assert (node->offset == 0); + node->offset = *offset; + build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, node); + + build->n_attributes += g_hash_table_size (node->attributes); + + switch (node->type) + { + case GI_IR_NODE_TYPE: + { + GIIrNodeType *type = (GIIrNodeType *)node; + SimpleTypeBlob *blob = (SimpleTypeBlob *)&data[*offset]; + + *offset += sizeof (SimpleTypeBlob); + + if (GI_TYPE_TAG_IS_BASIC (type->tag)) + { + blob->flags.reserved = 0; + blob->flags.reserved2 = 0; + blob->flags.pointer = type->is_pointer; + blob->flags.reserved3 = 0; + blob->flags.tag = type->tag; + } + else + { + GString *str; + char *s; + gpointer value; + + str = g_string_new (0); + serialize_type (build, type, str); + s = g_string_free (str, FALSE); + + types_count += 1; + value = g_hash_table_lookup (types, s); + if (value) + { + blob->offset = GPOINTER_TO_UINT (value); + g_free (s); + } + else + { + unique_types_count += 1; + g_hash_table_insert (types, s, GUINT_TO_POINTER(*offset2)); + + blob->offset = *offset2; + switch (type->tag) + { + case GI_TYPE_TAG_ARRAY: + { + ArrayTypeBlob *array = (ArrayTypeBlob *)&data[*offset2]; + uint32_t pos; + + array->pointer = type->is_pointer; + array->reserved = 0; + array->tag = type->tag; + array->zero_terminated = type->zero_terminated; + array->has_length = type->has_length; + array->has_size = type->has_size; + array->array_type = type->array_type; + array->reserved2 = 0; + if (array->has_length) + array->dimensions.length = type->length; + else if (array->has_size) + array->dimensions.size = type->size; + else + array->dimensions.length = -1; + + pos = *offset2 + G_STRUCT_OFFSET (ArrayTypeBlob, type); + *offset2 += sizeof (ArrayTypeBlob); + + gi_ir_node_build_typelib ((GIIrNode *)type->parameter_type1, + node, build, &pos, offset2, NULL); + } + break; + + case GI_TYPE_TAG_INTERFACE: + { + InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&data[*offset2]; + *offset2 += sizeof (InterfaceTypeBlob); + + iface->pointer = type->is_pointer; + iface->reserved = 0; + iface->tag = type->tag; + iface->reserved2 = 0; + iface->interface = find_entry (build, type->giinterface); + + } + break; + + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + { + ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2]; + uint32_t pos; + + param->pointer = 1; + param->reserved = 0; + param->tag = type->tag; + param->reserved2 = 0; + param->n_types = 1; + + pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type); + *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob); + + gi_ir_node_build_typelib ((GIIrNode *)type->parameter_type1, + node, build, &pos, offset2, NULL); + } + break; + + case GI_TYPE_TAG_GHASH: + { + ParamTypeBlob *param = (ParamTypeBlob *)&data[*offset2]; + uint32_t pos; + + param->pointer = 1; + param->reserved = 0; + param->tag = type->tag; + param->reserved2 = 0; + param->n_types = 2; + + pos = *offset2 + G_STRUCT_OFFSET (ParamTypeBlob, type); + *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob)*2; + + gi_ir_node_build_typelib ((GIIrNode *)type->parameter_type1, + node, build, &pos, offset2, NULL); + gi_ir_node_build_typelib ((GIIrNode *)type->parameter_type2, + node, build, &pos, offset2, NULL); + } + break; + + case GI_TYPE_TAG_ERROR: + { + ErrorTypeBlob *error_blob = (ErrorTypeBlob *)&data[*offset2]; + + error_blob->pointer = 1; + error_blob->reserved = 0; + error_blob->tag = type->tag; + error_blob->reserved2 = 0; + error_blob->n_domains = 0; + + *offset2 += sizeof (ErrorTypeBlob); + } + break; + + default: + g_error ("Unknown type tag %d", type->tag); + break; + } + } + } + } + break; + + case GI_IR_NODE_FIELD: + { + GIIrNodeField *field = (GIIrNodeField *)node; + FieldBlob *blob; + + blob = (FieldBlob *)&data[*offset]; + + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->readable = field->readable; + blob->writable = field->writable; + blob->reserved = 0; + blob->bits = 0; + if (field->offset_state == GI_IR_OFFSETS_COMPUTED) + blob->struct_offset = field->offset; + else + blob->struct_offset = 0xFFFF; /* mark as unknown */ + + if (field->callback) + { + blob->has_embedded_type = TRUE; + blob->type.offset = GI_INFO_TYPE_CALLBACK; + *offset += sizeof (FieldBlob); + gi_ir_node_build_typelib ((GIIrNode *)field->callback, + node, build, offset, offset2, NULL); + /* Fields with callbacks are bigger than normal, update count2 + * as an extra hint which represents the number of fields which are + * callbacks. This allows us to gain constant time performance in the + * repository for skipping over the fields section. + */ + if (count2) + (*count2)++; + } + else + { + blob->has_embedded_type = FALSE; + /* We handle the size member specially below, so subtract it */ + *offset += sizeof (FieldBlob) - sizeof (SimpleTypeBlob); + gi_ir_node_build_typelib ((GIIrNode *)field->type, + node, build, offset, offset2, NULL); + } + } + break; + + case GI_IR_NODE_PROPERTY: + { + GIIrNodeProperty *prop = (GIIrNodeProperty *)node; + PropertyBlob *blob = (PropertyBlob *)&data[*offset]; + /* We handle the size member specially below, so subtract it */ + *offset += sizeof (PropertyBlob) - sizeof (SimpleTypeBlob); + + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->deprecated = prop->deprecated; + blob->readable = prop->readable; + blob->writable = prop->writable; + blob->construct = prop->construct; + blob->construct_only = prop->construct_only; + blob->transfer_ownership = prop->transfer; + blob->transfer_container_ownership = prop->shallow_transfer; + blob->reserved = 0; + + if (prop->setter != NULL) + { + int index = get_index_of_member_type ((GIIrNodeInterface*)parent, + GI_IR_NODE_FUNCTION, + prop->setter); + if (index == -1) + { + g_error ("Unknown setter %s for property %s:%s", prop->setter, parent->name, node->name); + } + + blob->setter = (uint16_t) index; + } + else + blob->setter = ACCESSOR_SENTINEL; + + if (prop->getter != NULL) + { + int index = get_index_of_member_type ((GIIrNodeInterface*)parent, + GI_IR_NODE_FUNCTION, + prop->getter); + if (index == -1) + { + g_error ("Unknown getter %s for property %s:%s", prop->getter, parent->name, node->name); + } + + blob->getter = (uint16_t) index; + } + else + blob->getter = ACCESSOR_SENTINEL; + + gi_ir_node_build_typelib ((GIIrNode *)prop->type, + node, build, offset, offset2, NULL); + } + break; + + case GI_IR_NODE_FUNCTION: + { + FunctionBlob *blob = (FunctionBlob *)&data[*offset]; + SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2]; + GIIrNodeFunction *function = (GIIrNodeFunction *)node; + uint32_t signature; + unsigned int n; + + signature = *offset2; + n = g_list_length (function->parameters); + + *offset += sizeof (FunctionBlob); + *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob); + + blob->blob_type = BLOB_TYPE_FUNCTION; + blob->deprecated = function->deprecated; + blob->is_static = !function->is_method; + blob->setter = FALSE; + blob->getter = FALSE; + blob->constructor = function->is_constructor; + blob->wraps_vfunc = function->wraps_vfunc; + blob->throws = function->throws; /* Deprecated. Also stored in SignatureBlob. */ + blob->index = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->symbol = gi_ir_write_string (function->symbol, strings, data, offset2); + blob->signature = signature; + + if (function->is_setter || function->is_getter) + { + int index = get_index_of_member_type ((GIIrNodeInterface*)parent, + GI_IR_NODE_PROPERTY, + function->property); + if (index == -1) + { + g_error ("Unknown property %s:%s for accessor %s", parent->name, function->property, function->symbol); + } + + blob->setter = function->is_setter; + blob->getter = function->is_getter; + blob->index = (uint16_t) index; + } + + /* function->result is special since it doesn't appear in the serialized format but + * we do want the attributes for it to appear + */ + build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, function->result); + build->n_attributes += g_hash_table_size (((GIIrNode *) function->result)->attributes); + g_assert (((GIIrNode *) function->result)->offset == 0); + ((GIIrNode *) function->result)->offset = signature; + + g_debug ("building function '%s'", function->symbol); + + gi_ir_node_build_typelib ((GIIrNode *)function->result->type, + node, build, &signature, offset2, NULL); + + blob2->may_return_null = function->result->nullable; + blob2->caller_owns_return_value = function->result->transfer; + blob2->caller_owns_return_container = function->result->shallow_transfer; + blob2->skip_return = function->result->skip; + blob2->instance_transfer_ownership = function->instance_transfer_full; + blob2->reserved = 0; + blob2->n_arguments = n; + blob2->throws = function->throws; + + signature += 4; + + for (l = function->parameters; l; l = l->next) + { + GIIrNode *param = (GIIrNode *)l->data; + + gi_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); + } + + } + break; + + case GI_IR_NODE_CALLBACK: + { + CallbackBlob *blob = (CallbackBlob *)&data[*offset]; + SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2]; + GIIrNodeFunction *function = (GIIrNodeFunction *)node; + uint32_t signature; + unsigned int n; + + signature = *offset2; + n = g_list_length (function->parameters); + + *offset += sizeof (CallbackBlob); + *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob); + + blob->blob_type = BLOB_TYPE_CALLBACK; + blob->deprecated = function->deprecated; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->signature = signature; + + gi_ir_node_build_typelib ((GIIrNode *)function->result->type, + node, build, &signature, offset2, NULL); + + blob2->may_return_null = function->result->nullable; + blob2->caller_owns_return_value = function->result->transfer; + blob2->caller_owns_return_container = function->result->shallow_transfer; + blob2->reserved = 0; + blob2->n_arguments = n; + blob2->throws = function->throws; + + signature += 4; + + for (l = function->parameters; l; l = l->next) + { + GIIrNode *param = (GIIrNode *)l->data; + + gi_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); + } + } + break; + + case GI_IR_NODE_SIGNAL: + { + SignalBlob *blob = (SignalBlob *)&data[*offset]; + SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2]; + GIIrNodeSignal *signal = (GIIrNodeSignal *)node; + uint32_t signature; + unsigned int n; + + signature = *offset2; + n = g_list_length (signal->parameters); + + *offset += sizeof (SignalBlob); + *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob); + + blob->deprecated = signal->deprecated; + blob->run_first = signal->run_first; + blob->run_last = signal->run_last; + blob->run_cleanup = signal->run_cleanup; + blob->no_recurse = signal->no_recurse; + blob->detailed = signal->detailed; + blob->action = signal->action; + blob->no_hooks = signal->no_hooks; + blob->has_class_closure = 0; /* FIXME */ + blob->true_stops_emit = 0; /* FIXME */ + blob->reserved = 0; + blob->class_closure = 0; /* FIXME */ + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->signature = signature; + + /* signal->result is special since it doesn't appear in the serialized format but + * we do want the attributes for it to appear + */ + build->nodes_with_attributes = g_list_prepend (build->nodes_with_attributes, signal->result); + build->n_attributes += g_hash_table_size (((GIIrNode *) signal->result)->attributes); + g_assert (((GIIrNode *) signal->result)->offset == 0); + ((GIIrNode *) signal->result)->offset = signature; + + gi_ir_node_build_typelib ((GIIrNode *)signal->result->type, + node, build, &signature, offset2, NULL); + + blob2->may_return_null = signal->result->nullable; + blob2->caller_owns_return_value = signal->result->transfer; + blob2->caller_owns_return_container = signal->result->shallow_transfer; + blob2->instance_transfer_ownership = signal->instance_transfer_full; + blob2->reserved = 0; + blob2->n_arguments = n; + + signature += 4; + + for (l = signal->parameters; l; l = l->next) + { + GIIrNode *param = (GIIrNode *)l->data; + + gi_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); + } + } + break; + + case GI_IR_NODE_VFUNC: + { + VFuncBlob *blob = (VFuncBlob *)&data[*offset]; + SignatureBlob *blob2 = (SignatureBlob *)&data[*offset2]; + GIIrNodeVFunc *vfunc = (GIIrNodeVFunc *)node; + uint32_t signature; + unsigned int n; + + signature = *offset2; + n = g_list_length (vfunc->parameters); + + *offset += sizeof (VFuncBlob); + *offset2 += sizeof (SignatureBlob) + n * sizeof (ArgBlob); + + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->must_chain_up = 0; /* FIXME */ + blob->must_be_implemented = 0; /* FIXME */ + blob->must_not_be_implemented = 0; /* FIXME */ + blob->class_closure = 0; /* FIXME */ + blob->throws = vfunc->throws; /* Deprecated. Also stored in SignatureBlob. */ + blob->reserved = 0; + + if (vfunc->invoker) + { + int index = get_index_of_member_type ((GIIrNodeInterface*)parent, GI_IR_NODE_FUNCTION, vfunc->invoker); + if (index == -1) + { + g_error ("Unknown member function %s for vfunc %s", vfunc->invoker, node->name); + } + blob->invoker = (uint16_t) index; + } + else + blob->invoker = 0x3ff; /* max of 10 bits */ + + blob->struct_offset = vfunc->offset; + blob->reserved2 = 0; + blob->signature = signature; + + gi_ir_node_build_typelib ((GIIrNode *)vfunc->result->type, + node, build, &signature, offset2, NULL); + + blob2->may_return_null = vfunc->result->nullable; + blob2->caller_owns_return_value = vfunc->result->transfer; + blob2->caller_owns_return_container = vfunc->result->shallow_transfer; + blob2->instance_transfer_ownership = vfunc->instance_transfer_full; + blob2->reserved = 0; + blob2->n_arguments = n; + blob2->throws = vfunc->throws; + + signature += 4; + + for (l = vfunc->parameters; l; l = l->next) + { + GIIrNode *param = (GIIrNode *)l->data; + + gi_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); + } + } + break; + + case GI_IR_NODE_PARAM: + { + ArgBlob *blob = (ArgBlob *)&data[*offset]; + GIIrNodeParam *param = (GIIrNodeParam *)node; + + /* The offset for this one is smaller than the struct because + * we recursively build the simple type inline here below. + */ + *offset += sizeof (ArgBlob) - sizeof (SimpleTypeBlob); + + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->in = param->in; + blob->out = param->out; + blob->caller_allocates = param->caller_allocates; + blob->nullable = param->nullable; + blob->skip = param->skip; + blob->optional = param->optional; + blob->transfer_ownership = param->transfer; + blob->transfer_container_ownership = param->shallow_transfer; + blob->return_value = param->retval; + blob->scope = param->scope; + blob->reserved = 0; + blob->closure = param->closure; + blob->destroy = param->destroy; + + gi_ir_node_build_typelib ((GIIrNode *)param->type, node, build, offset, offset2, NULL); + } + break; + + case GI_IR_NODE_STRUCT: + { + StructBlob *blob = (StructBlob *)&data[*offset]; + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + GList *members; + + blob->blob_type = BLOB_TYPE_STRUCT; + blob->foreign = struct_->foreign; + blob->deprecated = struct_->deprecated; + blob->is_gtype_struct = struct_->is_gtype_struct; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->alignment = struct_->alignment; + blob->size = struct_->size; + + if (struct_->gtype_name) + { + blob->unregistered = FALSE; + blob->gtype_name = gi_ir_write_string (struct_->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (struct_->gtype_init, strings, data, offset2); + } + else + { + blob->unregistered = TRUE; + blob->gtype_name = 0; + blob->gtype_init = 0; + } + + if (struct_->copy_func) + blob->copy_func = gi_ir_write_string (struct_->copy_func, strings, data, offset2); + if (struct_->free_func) + blob->free_func = gi_ir_write_string (struct_->free_func, strings, data, offset2); + + blob->n_fields = 0; + blob->n_methods = 0; + + *offset += sizeof (StructBlob); + + members = g_list_copy (struct_->members); + + gi_ir_node_build_members (&members, GI_IR_NODE_FIELD, &blob->n_fields, + node, build, offset, offset2, NULL); + + gi_ir_node_build_members (&members, GI_IR_NODE_FUNCTION, &blob->n_methods, + node, build, offset, offset2, NULL); + + gi_ir_node_check_unhandled_members (&members, node->type); + + g_assert (members == NULL); + } + break; + + case GI_IR_NODE_BOXED: + { + StructBlob *blob = (StructBlob *)&data[*offset]; + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + GList *members; + + blob->blob_type = BLOB_TYPE_BOXED; + blob->deprecated = boxed->deprecated; + blob->unregistered = FALSE; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->gtype_name = gi_ir_write_string (boxed->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (boxed->gtype_init, strings, data, offset2); + blob->alignment = boxed->alignment; + blob->size = boxed->size; + + blob->n_fields = 0; + blob->n_methods = 0; + + *offset += sizeof (StructBlob); + + members = g_list_copy (boxed->members); + + gi_ir_node_build_members (&members, GI_IR_NODE_FIELD, &blob->n_fields, + node, build, offset, offset2, NULL); + + gi_ir_node_build_members (&members, GI_IR_NODE_FUNCTION, &blob->n_methods, + node, build, offset, offset2, NULL); + + gi_ir_node_check_unhandled_members (&members, node->type); + + g_assert (members == NULL); + } + break; + + case GI_IR_NODE_UNION: + { + UnionBlob *blob = (UnionBlob *)&data[*offset]; + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + GList *members; + + blob->blob_type = BLOB_TYPE_UNION; + blob->deprecated = union_->deprecated; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->alignment = union_->alignment; + blob->size = union_->size; + if (union_->gtype_name) + { + blob->unregistered = FALSE; + blob->gtype_name = gi_ir_write_string (union_->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (union_->gtype_init, strings, data, offset2); + } + else + { + blob->unregistered = TRUE; + blob->gtype_name = 0; + blob->gtype_init = 0; + } + + blob->n_fields = 0; + blob->n_functions = 0; + + blob->discriminator_offset = union_->discriminator_offset; + + if (union_->copy_func) + blob->copy_func = gi_ir_write_string (union_->copy_func, strings, data, offset2); + if (union_->free_func) + blob->free_func = gi_ir_write_string (union_->free_func, strings, data, offset2); + + /* We don't support Union discriminators right now. */ + /* + if (union_->discriminator_type) + { + *offset += 28; + blob->discriminated = TRUE; + gi_ir_node_build_typelib ((GIIrNode *)union_->discriminator_type, + build, offset, offset2, NULL); + } + else + { + */ + *offset += sizeof (UnionBlob); + blob->discriminated = FALSE; + blob->discriminator_type.offset = 0; + + members = g_list_copy (union_->members); + + gi_ir_node_build_members (&members, GI_IR_NODE_FIELD, &blob->n_fields, + node, build, offset, offset2, NULL); + + gi_ir_node_build_members (&members, GI_IR_NODE_FUNCTION, &blob->n_functions, + node, build, offset, offset2, NULL); + + gi_ir_node_check_unhandled_members (&members, node->type); + + g_assert (members == NULL); + + if (union_->discriminator_type) + { + for (l = union_->discriminators; l; l = l->next) + { + GIIrNode *member = (GIIrNode *)l->data; + + gi_ir_node_build_typelib (member, node, build, offset, offset2, NULL); + } + } + } + break; + + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + EnumBlob *blob = (EnumBlob *)&data[*offset]; + GIIrNodeEnum *enum_ = (GIIrNodeEnum *)node; + + *offset += sizeof (EnumBlob); + + if (node->type == GI_IR_NODE_ENUM) + blob->blob_type = BLOB_TYPE_ENUM; + else + blob->blob_type = BLOB_TYPE_FLAGS; + + blob->deprecated = enum_->deprecated; + blob->reserved = 0; + blob->storage_type = enum_->storage_type; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + if (enum_->gtype_name) + { + blob->unregistered = FALSE; + blob->gtype_name = gi_ir_write_string (enum_->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (enum_->gtype_init, strings, data, offset2); + } + else + { + blob->unregistered = TRUE; + blob->gtype_name = 0; + blob->gtype_init = 0; + } + if (enum_->error_domain) + blob->error_domain = gi_ir_write_string (enum_->error_domain, strings, data, offset2); + else + blob->error_domain = 0; + + blob->n_values = 0; + blob->n_methods = 0; + + for (l = enum_->values; l; l = l->next) + { + GIIrNode *value = (GIIrNode *)l->data; + + blob->n_values++; + gi_ir_node_build_typelib (value, node, build, offset, offset2, NULL); + } + + for (l = enum_->methods; l; l = l->next) + { + GIIrNode *method = (GIIrNode *)l->data; + + blob->n_methods++; + gi_ir_node_build_typelib (method, node, build, offset, offset2, NULL); + } + } + break; + + case GI_IR_NODE_OBJECT: + { + ObjectBlob *blob = (ObjectBlob *)&data[*offset]; + GIIrNodeInterface *object = (GIIrNodeInterface *)node; + GList *members; + + blob->blob_type = BLOB_TYPE_OBJECT; + blob->abstract = object->abstract; + blob->fundamental = object->fundamental; + blob->final_ = object->final_; + blob->deprecated = object->deprecated; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->gtype_name = gi_ir_write_string (object->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (object->gtype_init, strings, data, offset2); + if (object->ref_func) + blob->ref_func = gi_ir_write_string (object->ref_func, strings, data, offset2); + if (object->unref_func) + blob->unref_func = gi_ir_write_string (object->unref_func, strings, data, offset2); + if (object->set_value_func) + blob->set_value_func = gi_ir_write_string (object->set_value_func, strings, data, offset2); + if (object->get_value_func) + blob->get_value_func = gi_ir_write_string (object->get_value_func, strings, data, offset2); + if (object->parent) + blob->parent = find_entry (build, object->parent); + else + blob->parent = 0; + if (object->glib_type_struct) + blob->gtype_struct = find_entry (build, object->glib_type_struct); + else + blob->gtype_struct = 0; + + blob->n_interfaces = 0; + blob->n_fields = 0; + blob->n_properties = 0; + blob->n_methods = 0; + blob->n_signals = 0; + blob->n_vfuncs = 0; + blob->n_constants = 0; + blob->n_field_callbacks = 0; + + *offset += sizeof(ObjectBlob); + for (l = object->interfaces; l; l = l->next) + { + blob->n_interfaces++; + *(uint16_t *)&data[*offset] = find_entry (build, (char *)l->data); + *offset += 2; + } + + members = g_list_copy (object->members); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_FIELD, &blob->n_fields, + node, build, offset, offset2, &blob->n_field_callbacks); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_PROPERTY, &blob->n_properties, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_FUNCTION, &blob->n_methods, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_SIGNAL, &blob->n_signals, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_VFUNC, &blob->n_vfuncs, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_CONSTANT, &blob->n_constants, + node, build, offset, offset2, NULL); + + gi_ir_node_check_unhandled_members (&members, node->type); + + g_assert (members == NULL); + } + break; + + case GI_IR_NODE_INTERFACE: + { + InterfaceBlob *blob = (InterfaceBlob *)&data[*offset]; + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + GList *members; + + blob->blob_type = BLOB_TYPE_INTERFACE; + blob->deprecated = iface->deprecated; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->gtype_name = gi_ir_write_string (iface->gtype_name, strings, data, offset2); + blob->gtype_init = gi_ir_write_string (iface->gtype_init, strings, data, offset2); + if (iface->glib_type_struct) + blob->gtype_struct = find_entry (build, iface->glib_type_struct); + else + blob->gtype_struct = 0; + blob->n_prerequisites = 0; + blob->n_properties = 0; + blob->n_methods = 0; + blob->n_signals = 0; + blob->n_vfuncs = 0; + blob->n_constants = 0; + + *offset += sizeof (InterfaceBlob); + for (l = iface->prerequisites; l; l = l->next) + { + blob->n_prerequisites++; + *(uint16_t *)&data[*offset] = find_entry (build, (char *)l->data); + *offset += 2; + } + + members = g_list_copy (iface->members); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_PROPERTY, &blob->n_properties, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_FUNCTION, &blob->n_methods, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_SIGNAL, &blob->n_signals, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_VFUNC, &blob->n_vfuncs, + node, build, offset, offset2, NULL); + + *offset = ALIGN_VALUE (*offset, 4); + gi_ir_node_build_members (&members, GI_IR_NODE_CONSTANT, &blob->n_constants, + node, build, offset, offset2, NULL); + + gi_ir_node_check_unhandled_members (&members, node->type); + + g_assert (members == NULL); + } + break; + + + case GI_IR_NODE_VALUE: + { + GIIrNodeValue *value = (GIIrNodeValue *)node; + ValueBlob *blob = (ValueBlob *)&data[*offset]; + *offset += sizeof (ValueBlob); + + blob->deprecated = value->deprecated; + blob->reserved = 0; + blob->unsigned_value = value->value >= 0 ? 1 : 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + blob->value = (int32_t) value->value; + } + break; + + case GI_IR_NODE_CONSTANT: + { + GIIrNodeConstant *constant = (GIIrNodeConstant *)node; + ConstantBlob *blob = (ConstantBlob *)&data[*offset]; + uint32_t pos; + + pos = *offset + G_STRUCT_OFFSET (ConstantBlob, type); + *offset += sizeof (ConstantBlob); + + blob->blob_type = BLOB_TYPE_CONSTANT; + blob->deprecated = constant->deprecated; + blob->reserved = 0; + blob->name = gi_ir_write_string (node->name, strings, data, offset2); + + blob->offset = *offset2; + switch (constant->type->tag) + { + case GI_TYPE_TAG_BOOLEAN: + blob->size = 4; + *(gboolean*)&data[blob->offset] = parse_boolean_value (constant->value); + break; + case GI_TYPE_TAG_INT8: + blob->size = 1; + *(int8_t *)&data[blob->offset] = (int8_t) parse_int_value (constant->value); + break; + case GI_TYPE_TAG_UINT8: + blob->size = 1; + *(uint8_t *)&data[blob->offset] = (uint8_t) parse_uint_value (constant->value); + break; + case GI_TYPE_TAG_INT16: + blob->size = 2; + *(int16_t *)&data[blob->offset] = (int16_t) parse_int_value (constant->value); + break; + case GI_TYPE_TAG_UINT16: + blob->size = 2; + *(uint16_t *)&data[blob->offset] = (uint16_t) parse_uint_value (constant->value); + break; + case GI_TYPE_TAG_INT32: + blob->size = 4; + *(int32_t *)&data[blob->offset] = (int32_t) parse_int_value (constant->value); + break; + case GI_TYPE_TAG_UINT32: + blob->size = 4; + *(uint32_t*)&data[blob->offset] = (uint32_t) parse_uint_value (constant->value); + break; + case GI_TYPE_TAG_INT64: + blob->size = 8; + DO_ALIGNED_COPY (&data[blob->offset], parse_int_value (constant->value), int64_t); + break; + case GI_TYPE_TAG_UINT64: + blob->size = 8; + DO_ALIGNED_COPY (&data[blob->offset], parse_uint_value (constant->value), uint64_t); + break; + case GI_TYPE_TAG_FLOAT: + blob->size = sizeof (float); + DO_ALIGNED_COPY (&data[blob->offset], parse_float_value (constant->value), float); + break; + case GI_TYPE_TAG_DOUBLE: + blob->size = sizeof (double); + DO_ALIGNED_COPY (&data[blob->offset], parse_float_value (constant->value), double); + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + blob->size = strlen (constant->value) + 1; + memcpy (&data[blob->offset], constant->value, blob->size); + break; + default: + break; + } + *offset2 += ALIGN_VALUE (blob->size, 4); + + gi_ir_node_build_typelib ((GIIrNode *)constant->type, node, build, &pos, offset2, NULL); + } + break; + default: + g_assert_not_reached (); + } + + g_debug ("node %s%s%s%p type '%s', offset %d -> %d, offset2 %d -> %d", + node->name ? "'" : "", + node->name ? node->name : "", + node->name ? "' " : "", + node, gi_ir_node_type_to_string (node->type), + old_offset, *offset, old_offset2, *offset2); + + if (*offset2 - old_offset2 + *offset - old_offset > gi_ir_node_get_full_size (node)) + g_error ("exceeding space reservation; offset: %d (prev %d) offset2: %d (prev %d) nodesize: %d", + *offset, old_offset, *offset2, old_offset2, gi_ir_node_get_full_size (node)); + + if (appended_stack) + build->stack = g_list_delete_link (build->stack, build->stack); +} + +/* if str is already in the pool, return previous location, otherwise write str + * to the typelib at offset, put it in the pool and update offset. If the + * typelib is not large enough to hold the string, reallocate it. + */ +uint32_t +gi_ir_write_string (const char *str, + GHashTable *strings, + uint8_t *data, + uint32_t *offset) +{ + uint32_t start; + void *value; + + string_count += 1; + string_size += strlen (str); + + value = g_hash_table_lookup (strings, str); + + if (value) + return GPOINTER_TO_UINT (value); + + unique_string_count += 1; + unique_string_size += strlen (str); + + g_hash_table_insert (strings, (void *)str, GUINT_TO_POINTER (*offset)); + + start = *offset; + *offset = ALIGN_VALUE (start + strlen (str) + 1, 4); + + strcpy ((char *)&data[start], str); + + return start; +} + diff --git a/girepository/giroffsets.c b/girepository/giroffsets.c new file mode 100644 index 0000000..d3fe36a --- /dev/null +++ b/girepository/giroffsets.c @@ -0,0 +1,599 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Compute structure offsets + * + * Copyright (C) 2008 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "girffi.h" + +#include "girnode-private.h" + +#include + +/* The C standard specifies that an enumeration can be any char or any signed + * or unsigned integer type capable of representing all the values of the + * enumeration. We use test enumerations to figure out what choices the + * compiler makes. (Ignoring > 32 bit enumerations) + */ + +typedef enum { + ENUM_1 = 1 /* compiler could use int8, uint8, int16, uint16, int32, uint32 */ +} Enum1; + +typedef enum { + ENUM_2 = 128 /* compiler could use uint8, int16, uint16, int32, uint32 */ +} Enum2; + +typedef enum { + ENUM_3 = 257 /* compiler could use int16, uint16, int32, uint32 */ +} Enum3; + +typedef enum { + ENUM_4 = G_MAXSHORT + 1 /* compiler could use uint16, int32, uint32 */ +} Enum4; + +typedef enum { + ENUM_5 = G_MAXUSHORT + 1 /* compiler could use int32, uint32 */ +} Enum5; + +typedef enum { + ENUM_6 = ((unsigned int)G_MAXINT) + 1 /* compiler could use uint32 */ +} Enum6; + +typedef enum { + ENUM_7 = -1 /* compiler could use int8, int16, int32 */ +} Enum7; + +typedef enum { + ENUM_8 = -129 /* compiler could use int16, int32 */ +} Enum8; + +typedef enum { + ENUM_9 = G_MINSHORT - 1 /* compiler could use int32 */ +} Enum9; + +static void +compute_enum_storage_type (GIIrNodeEnum *enum_node) +{ + GList *l; + int64_t max_value = 0; + int64_t min_value = 0; + int width; + gboolean signed_type; + + if (enum_node->storage_type != GI_TYPE_TAG_VOID) /* already done */ + return; + + for (l = enum_node->values; l; l = l->next) + { + GIIrNodeValue *value = l->data; + if (value->value > max_value) + max_value = value->value; + if (value->value < min_value) + min_value = value->value; + } + + if (min_value < 0) + { + signed_type = TRUE; + + if (min_value > -128 && max_value <= 127) + width = sizeof(Enum7); + else if (min_value >= G_MINSHORT && max_value <= G_MAXSHORT) + width = sizeof(Enum8); + else + width = sizeof(Enum9); + } + else + { + if (max_value <= 127) + { + width = sizeof (Enum1); + signed_type = (int64_t)(Enum1)(-1) < 0; + } + else if (max_value <= 255) + { + width = sizeof (Enum2); + signed_type = (int64_t)(Enum2)(-1) < 0; + } + else if (max_value <= G_MAXSHORT) + { + width = sizeof (Enum3); + signed_type = (int64_t)(Enum3)(-1) < 0; + } + else if (max_value <= G_MAXUSHORT) + { + width = sizeof (Enum4); + signed_type = (int64_t)(Enum4)(-1) < 0; + } + else if (max_value <= G_MAXINT) + { + width = sizeof (Enum5); + signed_type = (int64_t)(Enum5)(-1) < 0; + } + else + { + width = sizeof (Enum6); + signed_type = (int64_t)(Enum6)(-1) < 0; + } + } + + if (width == 1) + enum_node->storage_type = signed_type ? GI_TYPE_TAG_INT8 : GI_TYPE_TAG_UINT8; + else if (width == 2) + enum_node->storage_type = signed_type ? GI_TYPE_TAG_INT16 : GI_TYPE_TAG_UINT16; + else if (width == 4) + enum_node->storage_type = signed_type ? GI_TYPE_TAG_INT32 : GI_TYPE_TAG_UINT32; + else if (width == 8) + enum_node->storage_type = signed_type ? GI_TYPE_TAG_INT64 : GI_TYPE_TAG_UINT64; + else + g_error ("Unexpected enum width %d", width); +} + +static gboolean +get_enum_size_alignment (GIIrNodeEnum *enum_node, + size_t *size, + size_t *alignment) +{ + ffi_type *type_ffi; + + compute_enum_storage_type (enum_node); + + switch (enum_node->storage_type) + { + case GI_TYPE_TAG_INT8: + case GI_TYPE_TAG_UINT8: + type_ffi = &ffi_type_uint8; + break; + case GI_TYPE_TAG_INT16: + case GI_TYPE_TAG_UINT16: + type_ffi = &ffi_type_uint16; + break; + case GI_TYPE_TAG_INT32: + case GI_TYPE_TAG_UINT32: + type_ffi = &ffi_type_uint32; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + type_ffi = &ffi_type_uint64; + break; + default: + g_error ("Unexpected enum storage type %s", + gi_type_tag_to_string (enum_node->storage_type)); + } + + *size = type_ffi->size; + *alignment = type_ffi->alignment; + + return TRUE; +} + +static gboolean +get_interface_size_alignment (GIIrTypelibBuild *build, + GIIrNodeType *type, + size_t *size, + size_t *alignment, + const char *who) +{ + GIIrNode *iface; + + iface = gi_ir_find_node (build, ((GIIrNode*)type)->module, type->giinterface); + if (!iface) + { + gi_ir_module_fatal (build, 0, "Can't resolve type '%s' for %s", type->giinterface, who); + *size = 0; + *alignment = 0; + return FALSE; + } + + gi_ir_node_compute_offsets (build, iface); + + switch (iface->type) + { + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)iface; + *size = boxed->size; + *alignment = boxed->alignment; + break; + } + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)iface; + *size = struct_->size; + *alignment = struct_->alignment; + break; + } + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *interface = (GIIrNodeInterface *)iface; + *size = interface->size; + *alignment = interface->alignment; + break; + } + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)iface; + *size = union_->size; + *alignment = union_->alignment; + break; + } + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + return get_enum_size_alignment ((GIIrNodeEnum *)iface, + size, alignment); + } + case GI_IR_NODE_CALLBACK: + { + *size = ffi_type_pointer.size; + *alignment = ffi_type_pointer.alignment; + break; + } + default: + { + g_warning ("%s has is not a pointer and is of type %s", + who, + gi_ir_node_type_to_string (iface->type)); + *size = 0; + *alignment = 0; + return FALSE; + } + } + + return *alignment > 0; +} + +static gboolean +get_type_size_alignment (GIIrTypelibBuild *build, + GIIrNodeType *type, + size_t *size, + size_t *alignment, + const char *who) +{ + ffi_type *type_ffi; + + if (type->is_pointer) + { + type_ffi = &ffi_type_pointer; + } + else if (type->tag == GI_TYPE_TAG_ARRAY) + { + size_t elt_size; + size_t elt_alignment; + + if (!type->has_size + || !get_type_size_alignment(build, type->parameter_type1, + &elt_size, &elt_alignment, who)) + { + *size = 0; + *alignment = 0; + return FALSE; + } + + *size = type->size * elt_size; + *alignment = elt_alignment; + + return TRUE; + } + else + { + if (type->tag == GI_TYPE_TAG_INTERFACE) + { + return get_interface_size_alignment (build, type, size, alignment, who); + } + else + { + type_ffi = gi_type_tag_get_ffi_type (type->tag, type->is_pointer); + + if (type_ffi == &ffi_type_void) + { + g_warning ("%s has void type", who); + *size = 0; + *alignment = 0; + return FALSE; + } + else if (type_ffi == &ffi_type_pointer) + { + g_warning ("%s has is not a pointer and is of type %s", + who, + gi_type_tag_to_string (type->tag)); + *size = 0; + *alignment = 0; + return FALSE; + } + } + } + + g_assert (type_ffi); + *size = type_ffi->size; + *alignment = type_ffi->alignment; + + return TRUE; +} + +static gboolean +get_field_size_alignment (GIIrTypelibBuild *build, + GIIrNodeField *field, + GIIrNode *parent_node, + size_t *size, + size_t *alignment) +{ + GIIrModule *module = build->module; + char *who; + gboolean success; + + who = g_strdup_printf ("field %s.%s.%s", module->name, parent_node->name, ((GIIrNode *)field)->name); + + if (field->callback) + { + *size = ffi_type_pointer.size; + *alignment = ffi_type_pointer.alignment; + success = TRUE; + } + else + success = get_type_size_alignment (build, field->type, size, alignment, who); + g_free (who); + + return success; +} + +#define GI_ALIGN(n, align) (((n) + (align) - 1) & ~((align) - 1)) + +static gboolean +compute_struct_field_offsets (GIIrTypelibBuild *build, + GIIrNode *node, + GList *members, + size_t *size_out, + size_t *alignment_out, + GIIrOffsetsState *offsets_state_out) +{ + size_t size = 0; + size_t alignment = 1; + GList *l; + gboolean have_error = FALSE; + + *offsets_state_out = GI_IR_OFFSETS_IN_PROGRESS; /* mark to detect recursion */ + + for (l = members; l; l = l->next) + { + GIIrNode *member = (GIIrNode *)l->data; + + if (member->type == GI_IR_NODE_FIELD) + { + GIIrNodeField *field = (GIIrNodeField *)member; + + if (!have_error) + { + size_t member_size; + size_t member_alignment; + + if (get_field_size_alignment (build, field, node, + &member_size, &member_alignment)) + { + size = GI_ALIGN (size, member_alignment); + alignment = MAX (alignment, member_alignment); + field->offset = size; + field->offset_state = GI_IR_OFFSETS_COMPUTED; + size += member_size; + } + else + have_error = TRUE; + } + + if (have_error) + { + field->offset = 0; + field->offset_state = GI_IR_OFFSETS_FAILED; + } + } + else if (member->type == GI_IR_NODE_CALLBACK) + { + size = GI_ALIGN (size, ffi_type_pointer.alignment); + alignment = MAX (alignment, ffi_type_pointer.alignment); + size += ffi_type_pointer.size; + } + } + + /* Structs are tail-padded out to a multiple of their alignment */ + size = GI_ALIGN (size, alignment); + + if (!have_error) + { + *size_out = size; + *alignment_out = alignment; + *offsets_state_out = GI_IR_OFFSETS_COMPUTED; + } + else + { + *size_out = 0; + *alignment_out = 0; + *offsets_state_out = GI_IR_OFFSETS_FAILED; + } + + return !have_error; +} + +static gboolean +compute_union_field_offsets (GIIrTypelibBuild *build, + GIIrNode *node, + GList *members, + size_t *size_out, + size_t *alignment_out, + GIIrOffsetsState *offsets_state_out) +{ + size_t size = 0; + size_t alignment = 1; + GList *l; + gboolean have_error = FALSE; + + *offsets_state_out = GI_IR_OFFSETS_IN_PROGRESS; /* mark to detect recursion */ + + for (l = members; l; l = l->next) + { + GIIrNode *member = (GIIrNode *)l->data; + + if (member->type == GI_IR_NODE_FIELD) + { + GIIrNodeField *field = (GIIrNodeField *)member; + + if (!have_error) + { + size_t member_size; + size_t member_alignment; + + if (get_field_size_alignment (build,field, node, + &member_size, &member_alignment)) + { + size = MAX (size, member_size); + alignment = MAX (alignment, member_alignment); + } + else + have_error = TRUE; + } + } + } + + /* Unions are tail-padded out to a multiple of their alignment */ + size = GI_ALIGN (size, alignment); + + if (!have_error) + { + *size_out = size; + *alignment_out = alignment; + *offsets_state_out = GI_IR_OFFSETS_COMPUTED; + } + else + { + *size_out = 0; + *alignment_out = 0; + *offsets_state_out = GI_IR_OFFSETS_FAILED; + } + + return !have_error; +} + +static gboolean +check_needs_computation (GIIrTypelibBuild *build, + GIIrNode *node, + GIIrOffsetsState offsets_state) +{ + GIIrModule *module = build->module; + + if (offsets_state == GI_IR_OFFSETS_IN_PROGRESS) + { + g_warning ("Recursion encountered when computing the size of %s.%s", + module->name, node->name); + } + + return offsets_state == GI_IR_OFFSETS_UNKNOWN; +} + +/* + * gi_ir_node_compute_offsets: + * @build: Current typelib build + * @node: a #GIIrNode + * + * If a node is a a structure or union, makes sure that the field + * offsets have been computed, and also computes the overall size and + * alignment for the type. + * + * Since: 2.80 + */ +void +gi_ir_node_compute_offsets (GIIrTypelibBuild *build, + GIIrNode *node) +{ + gboolean appended_stack; + + if (build->stack) + appended_stack = node != (GIIrNode*)build->stack->data; + else + appended_stack = TRUE; + if (appended_stack) + build->stack = g_list_prepend (build->stack, node); + + switch (node->type) + { + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed = (GIIrNodeBoxed *)node; + + if (!check_needs_computation (build, node, boxed->offsets_state)) + return; + + compute_struct_field_offsets (build, node, boxed->members, + &boxed->size, &boxed->alignment, &boxed->offsets_state); + break; + } + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_ = (GIIrNodeStruct *)node; + + if (!check_needs_computation (build, node, struct_->offsets_state)) + return; + + compute_struct_field_offsets (build, node, struct_->members, + &struct_->size, &struct_->alignment, &struct_->offsets_state); + break; + } + case GI_IR_NODE_OBJECT: + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)node; + + if (!check_needs_computation (build, node, iface->offsets_state)) + return; + + compute_struct_field_offsets (build, node, iface->members, + &iface->size, &iface->alignment, &iface->offsets_state); + break; + } + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_ = (GIIrNodeUnion *)node; + + if (!check_needs_computation (build, node, union_->offsets_state)) + return; + + compute_union_field_offsets (build, (GIIrNode*)union_, union_->members, + &union_->size, &union_->alignment, &union_->offsets_state); + break; + } + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + GIIrNodeEnum *enum_ = (GIIrNodeEnum *)node; + + if (enum_->storage_type != GI_TYPE_TAG_VOID) /* already done */ + return; + + compute_enum_storage_type (enum_); + + break; + } + default: + break; + } + + if (appended_stack) + build->stack = g_list_delete_link (build->stack, build->stack); +} diff --git a/girepository/girparser-private.h b/girepository/girparser-private.h new file mode 100644 index 0000000..4754a83 --- /dev/null +++ b/girepository/girparser-private.h @@ -0,0 +1,51 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: A parser for the XML GIR format + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include + +G_BEGIN_DECLS + +#include "girmodule-private.h" + +typedef struct _GIIrParser GIIrParser; + +GIIrParser *gi_ir_parser_new (void); +void gi_ir_parser_free (GIIrParser *parser); +void gi_ir_parser_set_debug (GIIrParser *parser, + GLogLevelFlags logged_levels); +void gi_ir_parser_set_includes (GIIrParser *parser, + const char *const *includes); + +GIIrModule *gi_ir_parser_parse_string (GIIrParser *parser, + const char *namespace, + const char *filename, + const char *buffer, + gssize length, + GError **error); +GIIrModule *gi_ir_parser_parse_file (GIIrParser *parser, + const char *filename, + GError **error); + +G_END_DECLS diff --git a/girepository/girparser.c b/girepository/girparser.c new file mode 100644 index 0000000..647cf24 --- /dev/null +++ b/girepository/girparser.c @@ -0,0 +1,3864 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: A parser for the XML GIR format + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008 Philip Van Hoof + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "girparser-private.h" + +#include "girnode-private.h" +#include "gitypelib-internal.h" + +#include +#include +#include + +/* This is a "major" version in the sense that it's only bumped + * for incompatible changes. + */ +#define SUPPORTED_GIR_VERSION "1.2" + +#ifdef G_OS_WIN32 + +#include + +#ifdef GIR_DIR +#undef GIR_DIR +#endif + +/* GIR_DIR is used only in code called just once, + * so no problem leaking this + */ +#define GIR_DIR \ + g_build_filename (g_win32_get_package_installation_directory_of_module(NULL), \ + "share", \ + GIR_SUFFIX, \ + NULL) +#endif + +struct _GIIrParser +{ + char **includes; + char **gi_gir_path; + GList *parsed_modules; /* All previously parsed modules */ + GLogLevelFlags logged_levels; +}; + +typedef enum +{ + STATE_NONE = 0, + STATE_START, + STATE_END, + STATE_REPOSITORY, + STATE_INCLUDE, + STATE_C_INCLUDE, /* 5 */ + STATE_PACKAGE, + STATE_NAMESPACE, + STATE_ENUM, + STATE_BITFIELD, + STATE_FUNCTION, /* 10 */ + STATE_FUNCTION_RETURN, + STATE_FUNCTION_PARAMETERS, + STATE_FUNCTION_PARAMETER, + STATE_CLASS, + STATE_CLASS_FIELD, /* 15 */ + STATE_CLASS_PROPERTY, + STATE_INTERFACE, + STATE_INTERFACE_PROPERTY, + STATE_INTERFACE_FIELD, + STATE_IMPLEMENTS, /* 20 */ + STATE_PREREQUISITE, + STATE_BOXED, + STATE_BOXED_FIELD, + STATE_STRUCT, + STATE_STRUCT_FIELD, /* 25 */ + STATE_UNION, + STATE_UNION_FIELD, + STATE_NAMESPACE_CONSTANT, + STATE_CLASS_CONSTANT, + STATE_INTERFACE_CONSTANT, /* 30 */ + STATE_ALIAS, + STATE_TYPE, + STATE_ATTRIBUTE, + STATE_PASSTHROUGH +} ParseState; + +typedef struct _ParseContext ParseContext; +struct _ParseContext +{ + GIIrParser *parser; + + ParseState state; + int unknown_depth; + ParseState prev_state; + + GList *modules; + GList *include_modules; + GList *dependencies; + GHashTable *aliases; + GHashTable *disguised_structures; + GHashTable *pointer_structures; + + const char *file_path; + const char *namespace; + const char *c_prefix; + GIIrModule *current_module; + GSList *node_stack; + char *current_alias; + GIIrNode *current_typed; + GList *type_stack; + GList *type_parameters; + int type_depth; + ParseState in_embedded_state; +}; +#define CURRENT_NODE(ctx) ((GIIrNode *)((ctx)->node_stack->data)) + +static void start_element_handler (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + void *user_data, + GError **error); +static void end_element_handler (GMarkupParseContext *context, + const char *element_name, + void *user_data, + GError **error); +static void text_handler (GMarkupParseContext *context, + const char *text, + gsize text_len, + void *user_data, + GError **error); +static void cleanup (GMarkupParseContext *context, + GError *error, + void *user_data); +static void state_switch (ParseContext *ctx, ParseState newstate); + + +static GMarkupParser markup_parser = +{ + start_element_handler, + end_element_handler, + text_handler, + NULL, + cleanup +}; + +static gboolean +start_alias (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error); +static gboolean +start_type (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error); + +static const char *find_attribute (const char *name, + const char **attribute_names, + const char **attribute_values); + + +GIIrParser * +gi_ir_parser_new (void) +{ + GIIrParser *parser = g_slice_new0 (GIIrParser); + const char *gi_gir_path = g_getenv ("GI_GIR_PATH"); + + if (gi_gir_path != NULL) + parser->gi_gir_path = g_strsplit (gi_gir_path, G_SEARCHPATH_SEPARATOR_S, 0); + + parser->logged_levels = G_LOG_LEVEL_MASK & ~(G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_DEBUG); + return parser; +} + +void +gi_ir_parser_set_debug (GIIrParser *parser, + GLogLevelFlags logged_levels) +{ + parser->logged_levels = logged_levels; +} + +void +gi_ir_parser_free (GIIrParser *parser) +{ + GList *l; + + g_strfreev (parser->includes); + g_strfreev (parser->gi_gir_path); + + for (l = parser->parsed_modules; l; l = l->next) + gi_ir_module_free (l->data); + + g_slice_free (GIIrParser, parser); +} + +void +gi_ir_parser_set_includes (GIIrParser *parser, + const char *const *includes) +{ + g_strfreev (parser->includes); + + parser->includes = g_strdupv ((char **)includes); +} + +static void +firstpass_start_element_handler (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + void *user_data, + GError **error) +{ + ParseContext *ctx = user_data; + + if (strcmp (element_name, "alias") == 0) + { + start_alias (context, element_name, attribute_names, attribute_values, + ctx, error); + } + else if (ctx->state == STATE_ALIAS && strcmp (element_name, "type") == 0) + { + start_type (context, element_name, attribute_names, attribute_values, + ctx, error); + } + else if (strcmp (element_name, "record") == 0) + { + const char *name; + const char *disguised; + const char *pointer; + + name = find_attribute ("name", attribute_names, attribute_values); + disguised = find_attribute ("disguised", attribute_names, attribute_values); + pointer = find_attribute ("pointer", attribute_names, attribute_values); + + if (g_strcmp0 (pointer, "1") == 0) + { + char *key; + + key = g_strdup_printf ("%s.%s", ctx->namespace, name); + g_hash_table_replace (ctx->pointer_structures, key, GINT_TO_POINTER (1)); + } + else if (g_strcmp0 (disguised, "1") == 0) + { + char *key; + + key = g_strdup_printf ("%s.%s", ctx->namespace, name); + g_hash_table_replace (ctx->disguised_structures, key, GINT_TO_POINTER (1)); + } + } +} + +static void +firstpass_end_element_handler (GMarkupParseContext *context, + const char *element_name, + gpointer user_data, + GError **error) +{ + ParseContext *ctx = user_data; + if (strcmp (element_name, "alias") == 0) + { + state_switch (ctx, STATE_NAMESPACE); + g_free (ctx->current_alias); + ctx->current_alias = NULL; + } + else if (strcmp (element_name, "type") == 0 && ctx->state == STATE_TYPE) + state_switch (ctx, ctx->prev_state); +} + +static GMarkupParser firstpass_parser = +{ + firstpass_start_element_handler, + firstpass_end_element_handler, + NULL, + NULL, + NULL, +}; + +static char * +locate_gir (GIIrParser *parser, + const char *girname) +{ + const char *const *datadirs; + const char *const *dir; + char *path = NULL; + + g_debug ("Looking for %s", girname); + datadirs = g_get_system_data_dirs (); + + if (parser->includes != NULL) + { + for (dir = (const char *const *)parser->includes; *dir; dir++) + { + path = g_build_filename (*dir, girname, NULL); + g_debug ("Trying %s from includes", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + } + } + + if (parser->gi_gir_path != NULL) + { + for (dir = (const char *const *) parser->gi_gir_path; *dir; dir++) + { + if (**dir == '\0') + continue; + + path = g_build_filename (*dir, girname, NULL); + g_debug ("Trying %s from GI_GIR_PATH", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + } + } + + path = g_build_filename (g_get_user_data_dir (), GIR_SUFFIX, girname, NULL); + g_debug ("Trying %s from user data dir", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + + for (dir = datadirs; *dir; dir++) + { + path = g_build_filename (*dir, GIR_SUFFIX, girname, NULL); + g_debug ("Trying %s from system data dirs", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + } + + path = g_build_filename (GIR_DIR, girname, NULL); + g_debug ("Trying %s from GIR_DIR", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + + path = g_build_filename (GOBJECT_INTROSPECTION_DATADIR, GIR_SUFFIX, girname, NULL); + g_debug ("Trying %s from DATADIR", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); + +#ifdef G_OS_UNIX + path = g_build_filename ("/usr/share", GIR_SUFFIX, girname, NULL); + g_debug ("Trying %s", path); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + return g_steal_pointer (&path); + g_clear_pointer (&path, g_free); +#endif + + g_debug ("Did not find %s", girname); + return NULL; +} + +#define MISSING_ATTRIBUTE(context,error,element,attribute) \ + do { \ + int line_number, char_number; \ + g_markup_parse_context_get_position (context, &line_number, &char_number); \ + g_set_error (error, \ + G_MARKUP_ERROR, \ + G_MARKUP_ERROR_INVALID_CONTENT, \ + "Line %d, character %d: The attribute '%s' on the element '%s' must be specified", \ + line_number, char_number, attribute, element); \ + } while (0) + +static const char * +find_attribute (const char *name, + const char **attribute_names, + const char **attribute_values) +{ + size_t i; + + for (i = 0; attribute_names[i] != NULL; i++) + if (strcmp (attribute_names[i], name) == 0) + return attribute_values[i]; + + return 0; +} + +static void +state_switch (ParseContext *ctx, ParseState newstate) +{ + g_assert (ctx->state != newstate); + ctx->prev_state = ctx->state; + ctx->state = newstate; + + if (ctx->state == STATE_PASSTHROUGH) + ctx->unknown_depth = 1; +} + +static GIIrNode * +pop_node (ParseContext *ctx) +{ + GSList *top; + GIIrNode *node; + g_assert (ctx->node_stack != 0); + + top = ctx->node_stack; + node = top->data; + + g_debug ("popping node %d %s", node->type, node->name); + ctx->node_stack = top->next; + g_slist_free_1 (top); + return node; +} + +static void +push_node (ParseContext *ctx, GIIrNode *node) +{ + g_assert (node != NULL); + g_debug ("pushing node %d %s", node->type, node->name); + ctx->node_stack = g_slist_prepend (ctx->node_stack, node); +} + +static GIIrNodeType * parse_type_internal (GIIrModule *module, + const char *str, + char **next, + gboolean in_glib, + gboolean in_gobject); + +typedef struct { + const char *str; + size_t size; + unsigned int is_signed : 1; +} IntegerAliasInfo; + +static IntegerAliasInfo integer_aliases[] = { + { "gchar", SIZEOF_CHAR, 1 }, + { "guchar", SIZEOF_CHAR, 0 }, + { "gshort", SIZEOF_SHORT, 1 }, + { "gushort", SIZEOF_SHORT, 0 }, + { "gint", SIZEOF_INT, 1 }, + { "guint", SIZEOF_INT, 0 }, + { "glong", SIZEOF_LONG, 1 }, + { "gulong", SIZEOF_LONG, 0 }, + { "gssize", GLIB_SIZEOF_SIZE_T, 1 }, + { "gsize", GLIB_SIZEOF_SIZE_T, 0 }, + { "gintptr", GLIB_SIZEOF_SIZE_T, 1 }, + { "guintptr", GLIB_SIZEOF_SIZE_T, 0 }, +}; + +typedef struct { + const char *str; + int tag; + gboolean pointer; +} BasicTypeInfo; + +#define BASIC_TYPE_FIXED_OFFSET 3 + +static BasicTypeInfo basic_types[] = { + { "none", GI_TYPE_TAG_VOID, 0 }, + { "gpointer", GI_TYPE_TAG_VOID, 1 }, + + { "gboolean", GI_TYPE_TAG_BOOLEAN, 0 }, + { "gint8", GI_TYPE_TAG_INT8, 0 }, /* Start of BASIC_TYPE_FIXED_OFFSET */ + { "guint8", GI_TYPE_TAG_UINT8, 0 }, + { "gint16", GI_TYPE_TAG_INT16, 0 }, + { "guint16", GI_TYPE_TAG_UINT16, 0 }, + { "gint32", GI_TYPE_TAG_INT32, 0 }, + { "guint32", GI_TYPE_TAG_UINT32, 0 }, + { "gint64", GI_TYPE_TAG_INT64, 0 }, + { "guint64", GI_TYPE_TAG_UINT64, 0 }, + { "gfloat", GI_TYPE_TAG_FLOAT, 0 }, + { "gdouble", GI_TYPE_TAG_DOUBLE, 0 }, + { "GType", GI_TYPE_TAG_GTYPE, 0 }, + { "utf8", GI_TYPE_TAG_UTF8, 1 }, + { "filename", GI_TYPE_TAG_FILENAME,1 }, + { "gunichar", GI_TYPE_TAG_UNICHAR, 0 }, +}; + +static const BasicTypeInfo * +parse_basic (const char *str) +{ + size_t i; + size_t n_basic = G_N_ELEMENTS (basic_types); + + for (i = 0; i < n_basic; i++) + { + if (strcmp (str, basic_types[i].str) == 0) + return &(basic_types[i]); + } + for (i = 0; i < G_N_ELEMENTS (integer_aliases); i++) + { + if (strcmp (str, integer_aliases[i].str) == 0) + { + switch (integer_aliases[i].size) + { + case sizeof (uint8_t): + if (integer_aliases[i].is_signed) + return &basic_types[BASIC_TYPE_FIXED_OFFSET]; + else + return &basic_types[BASIC_TYPE_FIXED_OFFSET+1]; + break; + case sizeof (uint16_t): + if (integer_aliases[i].is_signed) + return &basic_types[BASIC_TYPE_FIXED_OFFSET+2]; + else + return &basic_types[BASIC_TYPE_FIXED_OFFSET+3]; + break; + case sizeof (uint32_t): + if (integer_aliases[i].is_signed) + return &basic_types[BASIC_TYPE_FIXED_OFFSET+4]; + else + return &basic_types[BASIC_TYPE_FIXED_OFFSET+5]; + break; + case sizeof (uint64_t): + if (integer_aliases[i].is_signed) + return &basic_types[BASIC_TYPE_FIXED_OFFSET+6]; + else + return &basic_types[BASIC_TYPE_FIXED_OFFSET+7]; + break; + default: + g_assert_not_reached (); + } + } + } + return NULL; +} + +static GIIrNodeType * +parse_type_internal (GIIrModule *module, + const char *str, + char **next, + gboolean in_glib, + gboolean in_gobject) +{ + const BasicTypeInfo *basic; + GIIrNodeType *type; + char *temporary_type = NULL; + + type = (GIIrNodeType *)gi_ir_node_new (GI_IR_NODE_TYPE, module); + + type->unparsed = g_strdup (str); + + /* See comment below on GLib.List handling */ + if (in_gobject && strcmp (str, "Type") == 0) + { + temporary_type = g_strdup ("GLib.Type"); + str = temporary_type; + } + + basic = parse_basic (str); + if (basic != NULL) + { + type->is_basic = TRUE; + type->tag = basic->tag; + type->is_pointer = basic->pointer; + + str += strlen(basic->str); + } + else if (in_glib) + { + /* If we're inside GLib, handle "List" etc. by prefixing with + * "GLib." so the parsing code below doesn't have to get more + * special. + */ + if (g_str_has_prefix (str, "List<") || + strcmp (str, "List") == 0) + { + temporary_type = g_strdup_printf ("GLib.List%s", str + 4); + str = temporary_type; + } + else if (g_str_has_prefix (str, "SList<") || + strcmp (str, "SList") == 0) + { + temporary_type = g_strdup_printf ("GLib.SList%s", str + 5); + str = temporary_type; + } + else if (g_str_has_prefix (str, "HashTable<") || + strcmp (str, "HashTable") == 0) + { + temporary_type = g_strdup_printf ("GLib.HashTable%s", str + 9); + str = temporary_type; + } + else if (g_str_has_prefix (str, "Error<") || + strcmp (str, "Error") == 0) + { + temporary_type = g_strdup_printf ("GLib.Error%s", str + 5); + str = temporary_type; + } + } + + if (basic != NULL) + /* found a basic type */; + else if (g_str_has_prefix (str, "GLib.List") || + g_str_has_prefix (str, "GLib.SList")) + { + str += strlen ("GLib."); + if (g_str_has_prefix (str, "List")) + { + type->tag = GI_TYPE_TAG_GLIST; + type->is_glist = TRUE; + type->is_pointer = TRUE; + str += strlen ("List"); + } + else + { + type->tag = GI_TYPE_TAG_GSLIST; + type->is_gslist = TRUE; + type->is_pointer = TRUE; + str += strlen ("SList"); + } + } + else if (g_str_has_prefix (str, "GLib.HashTable")) + { + str += strlen ("GLib."); + + type->tag = GI_TYPE_TAG_GHASH; + type->is_ghashtable = TRUE; + type->is_pointer = TRUE; + str += strlen ("HashTable"); + } + else if (g_str_has_prefix (str, "GLib.Error")) + { + str += strlen ("GLib."); + + type->tag = GI_TYPE_TAG_ERROR; + type->is_error = TRUE; + type->is_pointer = TRUE; + str += strlen ("Error"); + + if (*str == '<') + { + char *tmp, *end; + (str)++; + + end = strchr (str, '>'); + tmp = g_strndup (str, end - str); + type->errors = g_strsplit (tmp, ",", 0); + g_free (tmp); + + str = end; + } + } + else + { + const char *start; + type->tag = GI_TYPE_TAG_INTERFACE; + type->is_interface = TRUE; + start = str; + + /* must be an interface type */ + while (g_ascii_isalnum (*str) || + *str == '.' || + *str == '-' || + *str == '_' || + *str == ':') + (str)++; + + type->giinterface = g_strndup (start, str - start); + } + + if (next) + *next = (char*)str; + g_assert (type->tag >= 0 && type->tag < GI_TYPE_TAG_N_TYPES); + g_free (temporary_type); + return type; + +/* error: */ + gi_ir_node_free ((GIIrNode *)type); + g_free (temporary_type); + return NULL; +} + +static const char * +resolve_aliases (ParseContext *ctx, const char *type) +{ + void *orig; + void *value; + GSList *seen_values = NULL; + const char *lookup; + char *prefixed; + + if (strchr (type, '.') == NULL) + { + prefixed = g_strdup_printf ("%s.%s", ctx->namespace, type); + lookup = prefixed; + } + else + { + lookup = type; + prefixed = NULL; + } + + seen_values = g_slist_prepend (seen_values, (char*)lookup); + while (g_hash_table_lookup_extended (ctx->current_module->aliases, lookup, &orig, &value)) + { + g_debug ("Resolved: %s => %s", lookup, (char*)value); + lookup = value; + if (g_slist_find_custom (seen_values, lookup, + (GCompareFunc)strcmp) != NULL) + break; + seen_values = g_slist_prepend (seen_values, (char*) lookup); + } + g_slist_free (seen_values); + + if (lookup == prefixed) + lookup = type; + + g_free (prefixed); + + return lookup; +} + +static void +is_pointer_or_disguised_structure (ParseContext *ctx, + const char *type, + gboolean *is_pointer, + gboolean *is_disguised) +{ + const char *lookup; + char *prefixed; + + if (strchr (type, '.') == NULL) + { + prefixed = g_strdup_printf ("%s.%s", ctx->namespace, type); + lookup = prefixed; + } + else + { + lookup = type; + prefixed = NULL; + } + + if (is_pointer != NULL) + *is_pointer = g_hash_table_lookup (ctx->current_module->pointer_structures, lookup) != NULL; + if (is_disguised != NULL) + *is_disguised = g_hash_table_lookup (ctx->current_module->disguised_structures, lookup) != NULL; + + g_free (prefixed); +} + +static GIIrNodeType * +parse_type (ParseContext *ctx, const char *type) +{ + GIIrNodeType *node; + const BasicTypeInfo *basic; + gboolean in_glib, in_gobject; + + in_glib = strcmp (ctx->namespace, "GLib") == 0; + in_gobject = strcmp (ctx->namespace, "GObject") == 0; + + /* Do not search aliases for basic types */ + basic = parse_basic (type); + if (basic == NULL) + type = resolve_aliases (ctx, type); + + node = parse_type_internal (ctx->current_module, type, NULL, in_glib, in_gobject); + if (node) + g_debug ("Parsed type: %s => %d", type, node->tag); + else + g_critical ("Failed to parse type: '%s'", type); + + return node; +} + +static gboolean +introspectable_prelude (GMarkupParseContext *context, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + ParseState new_state) +{ + const char *introspectable_arg; + const char *shadowed_by; + gboolean introspectable; + + g_assert (ctx->state != STATE_PASSTHROUGH); + + introspectable_arg = find_attribute ("introspectable", attribute_names, attribute_values); + shadowed_by = find_attribute ("shadowed-by", attribute_names, attribute_values); + + introspectable = !(introspectable_arg && atoi (introspectable_arg) == 0) && shadowed_by == NULL; + + if (introspectable) + state_switch (ctx, new_state); + else + state_switch (ctx, STATE_PASSTHROUGH); + + return introspectable; +} + +static gboolean +start_glib_boxed (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *typename; + const char *typeinit; + const char *deprecated; + GIIrNodeBoxed *boxed; + + if (!(strcmp (element_name, "glib:boxed") == 0 && + ctx->state == STATE_NAMESPACE)) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_BOXED)) + return TRUE; + + name = find_attribute ("glib:name", attribute_names, attribute_values); + typename = find_attribute ("glib:type-name", attribute_names, attribute_values); + typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:name"); + return FALSE; + } + else if (typename == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:type-name"); + return FALSE; + } + else if (typeinit == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:get-type"); + return FALSE; + } + + boxed = (GIIrNodeBoxed *) gi_ir_node_new (GI_IR_NODE_BOXED, + ctx->current_module); + + ((GIIrNode *)boxed)->name = g_strdup (name); + boxed->gtype_name = g_strdup (typename); + boxed->gtype_init = g_strdup (typeinit); + if (deprecated) + boxed->deprecated = TRUE; + else + boxed->deprecated = FALSE; + + push_node (ctx, (GIIrNode *)boxed); + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, boxed); + + return TRUE; +} + +static gboolean +start_function (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *shadows; + const char *symbol; + const char *deprecated; + const char *throws; + const char *set_property; + const char *get_property; + GIIrNodeFunction *function; + gboolean found = FALSE; + ParseState in_embedded_state = STATE_NONE; + + switch (ctx->state) + { + case STATE_NAMESPACE: + found = (strcmp (element_name, "function") == 0 || + strcmp (element_name, "callback") == 0); + break; + case STATE_CLASS: + case STATE_BOXED: + case STATE_STRUCT: + case STATE_UNION: + found = strcmp (element_name, "constructor") == 0; + /* fallthrough */ + G_GNUC_FALLTHROUGH; + case STATE_INTERFACE: + found = (found || + strcmp (element_name, "function") == 0 || + strcmp (element_name, "method") == 0 || + strcmp (element_name, "callback") == 0); + break; + case STATE_ENUM: + found = strcmp (element_name, "function") == 0; + break; + case STATE_CLASS_FIELD: + case STATE_STRUCT_FIELD: + found = (found || strcmp (element_name, "callback") == 0); + in_embedded_state = ctx->state; + break; + default: + break; + } + + if (!found) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_FUNCTION)) + return TRUE; + + ctx->in_embedded_state = in_embedded_state; + + name = find_attribute ("name", attribute_names, attribute_values); + shadows = find_attribute ("shadows", attribute_names, attribute_values); + symbol = find_attribute ("c:identifier", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + throws = find_attribute ("throws", attribute_names, attribute_values); + set_property = find_attribute ("glib:set-property", attribute_names, attribute_values); + get_property = find_attribute ("glib:get-property", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + else if (strcmp (element_name, "callback") != 0 && symbol == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "c:identifier"); + return FALSE; + } + + if (shadows) + name = shadows; + + function = (GIIrNodeFunction *) gi_ir_node_new (GI_IR_NODE_FUNCTION, + ctx->current_module); + + ((GIIrNode *)function)->name = g_strdup (name); + function->symbol = g_strdup (symbol); + function->parameters = NULL; + if (deprecated) + function->deprecated = TRUE; + else + function->deprecated = FALSE; + + if (strcmp (element_name, "method") == 0 || + strcmp (element_name, "constructor") == 0) + { + function->is_method = TRUE; + + if (strcmp (element_name, "constructor") == 0) + function->is_constructor = TRUE; + else + function->is_constructor = FALSE; + + if (set_property != NULL) + { + function->is_setter = TRUE; + function->is_getter = FALSE; + function->property = g_strdup (set_property); + } + else if (get_property != NULL) + { + function->is_setter = FALSE; + function->is_getter = TRUE; + function->property = g_strdup (get_property); + } + else + { + function->is_setter = FALSE; + function->is_getter = FALSE; + function->property = NULL; + } + } + else + { + function->is_method = FALSE; + function->is_setter = FALSE; + function->is_getter = FALSE; + function->is_constructor = FALSE; + if (strcmp (element_name, "callback") == 0) + ((GIIrNode *)function)->type = GI_IR_NODE_CALLBACK; + } + + if (throws && strcmp (throws, "1") == 0) + function->throws = TRUE; + else + function->throws = FALSE; + + if (ctx->node_stack == NULL) + { + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, function); + } + else if (ctx->current_typed) + { + GIIrNodeField *field; + + field = (GIIrNodeField *)ctx->current_typed; + field->callback = function; + } + else + switch (CURRENT_NODE (ctx)->type) + { + case GI_IR_NODE_INTERFACE: + case GI_IR_NODE_OBJECT: + { + GIIrNodeInterface *iface; + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, function); + } + break; + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed; + + boxed = (GIIrNodeBoxed *)CURRENT_NODE (ctx); + boxed->members = g_list_append (boxed->members, function); + } + break; + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_; + + struct_ = (GIIrNodeStruct *)CURRENT_NODE (ctx); + struct_->members = g_list_append (struct_->members, function); } + break; + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_; + + union_ = (GIIrNodeUnion *)CURRENT_NODE (ctx); + union_->members = g_list_append (union_->members, function); + } + break; + case GI_IR_NODE_ENUM: + case GI_IR_NODE_FLAGS: + { + GIIrNodeEnum *enum_; + + enum_ = (GIIrNodeEnum *)CURRENT_NODE (ctx); + enum_->methods = g_list_append (enum_->methods, function); + } + break; + default: + g_assert_not_reached (); + } + + push_node(ctx, (GIIrNode *)function); + + return TRUE; +} + +static void +parse_property_transfer (GIIrNodeProperty *property, + const char *transfer, + ParseContext *ctx) +{ + if (transfer == NULL) + { +#if 0 + GIIrNodeInterface *iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + + g_debug ("required attribute 'transfer-ownership' is missing from " + "property '%s' in type '%s.%s'. Assuming 'none'", + property->node.name, ctx->namespace, iface->node.name); +#endif + transfer = "none"; + } + if (strcmp (transfer, "none") == 0) + { + property->transfer = FALSE; + property->shallow_transfer = FALSE; + } + else if (strcmp (transfer, "container") == 0) + { + property->transfer = FALSE; + property->shallow_transfer = TRUE; + } + else if (strcmp (transfer, "full") == 0) + { + property->transfer = TRUE; + property->shallow_transfer = FALSE; + } + else + { + GIIrNodeInterface *iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + + g_warning ("Unknown transfer-ownership value: '%s' for property '%s' in " + "type '%s.%s'", transfer, property->node.name, ctx->namespace, + iface->node.name); + } +} + +static gboolean +parse_param_transfer (GIIrNodeParam *param, const char *transfer, const char *name, + GError **error) +{ + if (transfer == NULL) + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "required attribute 'transfer-ownership' missing"); + return FALSE; + } + else if (strcmp (transfer, "none") == 0) + { + param->transfer = FALSE; + param->shallow_transfer = FALSE; + } + else if (strcmp (transfer, "container") == 0) + { + param->transfer = FALSE; + param->shallow_transfer = TRUE; + } + else if (strcmp (transfer, "full") == 0) + { + param->transfer = TRUE; + param->shallow_transfer = FALSE; + } + else + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "invalid value for 'transfer-ownership': %s", transfer); + return FALSE; + } + return TRUE; +} + +static gboolean +start_instance_parameter (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *transfer; + gboolean transfer_full; + + if (!(strcmp (element_name, "instance-parameter") == 0 && + ctx->state == STATE_FUNCTION_PARAMETERS)) + return FALSE; + + transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values); + + state_switch (ctx, STATE_PASSTHROUGH); + + if (g_strcmp0 (transfer, "full") == 0) + transfer_full = TRUE; + else if (g_strcmp0 (transfer, "none") == 0) + transfer_full = FALSE; + else + { + g_set_error (error, G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "invalid value for 'transfer-ownership' for instance parameter: %s", transfer); + return FALSE; + } + + switch (CURRENT_NODE (ctx)->type) + { + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + { + GIIrNodeFunction *func; + + func = (GIIrNodeFunction *)CURRENT_NODE (ctx); + func->instance_transfer_full = transfer_full; + } + break; + case GI_IR_NODE_SIGNAL: + { + GIIrNodeSignal *signal; + + signal = (GIIrNodeSignal *)CURRENT_NODE (ctx); + signal->instance_transfer_full = transfer_full; + } + break; + case GI_IR_NODE_VFUNC: + { + GIIrNodeVFunc *vfunc; + + vfunc = (GIIrNodeVFunc *)CURRENT_NODE (ctx); + vfunc->instance_transfer_full = transfer_full; + } + break; + default: + g_assert_not_reached (); + } + + return TRUE; +} + +static gboolean +start_parameter (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *direction; + const char *retval; + const char *optional; + const char *caller_allocates; + const char *allow_none; + const char *transfer; + const char *scope; + const char *closure; + const char *destroy; + const char *skip; + const char *nullable; + GIIrNodeParam *param; + + if (!(strcmp (element_name, "parameter") == 0 && + ctx->state == STATE_FUNCTION_PARAMETERS)) + return FALSE; + + name = find_attribute ("name", attribute_names, attribute_values); + direction = find_attribute ("direction", attribute_names, attribute_values); + retval = find_attribute ("retval", attribute_names, attribute_values); + optional = find_attribute ("optional", attribute_names, attribute_values); + allow_none = find_attribute ("allow-none", attribute_names, attribute_values); + caller_allocates = find_attribute ("caller-allocates", attribute_names, attribute_values); + transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values); + scope = find_attribute ("scope", attribute_names, attribute_values); + closure = find_attribute ("closure", attribute_names, attribute_values); + destroy = find_attribute ("destroy", attribute_names, attribute_values); + skip = find_attribute ("skip", attribute_names, attribute_values); + nullable = find_attribute ("nullable", attribute_names, attribute_values); + + if (name == NULL) + name = "unknown"; + + param = (GIIrNodeParam *)gi_ir_node_new (GI_IR_NODE_PARAM, + ctx->current_module); + + ctx->current_typed = (GIIrNode*) param; + ctx->current_typed->name = g_strdup (name); + + state_switch (ctx, STATE_FUNCTION_PARAMETER); + + if (direction && strcmp (direction, "out") == 0) + { + param->in = FALSE; + param->out = TRUE; + if (caller_allocates == NULL) + param->caller_allocates = FALSE; + else + param->caller_allocates = strcmp (caller_allocates, "1") == 0; + } + else if (direction && strcmp (direction, "inout") == 0) + { + param->in = TRUE; + param->out = TRUE; + param->caller_allocates = FALSE; + } + else + { + param->in = TRUE; + param->out = FALSE; + param->caller_allocates = FALSE; + } + + if (retval && strcmp (retval, "1") == 0) + param->retval = TRUE; + else + param->retval = FALSE; + + if (optional && strcmp (optional, "1") == 0) + param->optional = TRUE; + else + param->optional = FALSE; + + if (nullable && strcmp (nullable, "1") == 0) + param->nullable = TRUE; + else + param->nullable = FALSE; + + if (allow_none && strcmp (allow_none, "1") == 0) + { + if (param->out) + param->optional = TRUE; + else + param->nullable = TRUE; + } + + if (skip && strcmp (skip, "1") == 0) + param->skip = TRUE; + else + param->skip = FALSE; + + if (!parse_param_transfer (param, transfer, name, error)) + return FALSE; + + if (scope && strcmp (scope, "call") == 0) + param->scope = GI_SCOPE_TYPE_CALL; + else if (scope && strcmp (scope, "async") == 0) + param->scope = GI_SCOPE_TYPE_ASYNC; + else if (scope && strcmp (scope, "notified") == 0) + param->scope = GI_SCOPE_TYPE_NOTIFIED; + else if (scope && strcmp (scope, "forever") == 0) + param->scope = GI_SCOPE_TYPE_FOREVER; + else + param->scope = GI_SCOPE_TYPE_INVALID; + + param->closure = closure ? atoi (closure) : -1; + param->destroy = destroy ? atoi (destroy) : -1; + + ((GIIrNode *)param)->name = g_strdup (name); + + switch (CURRENT_NODE (ctx)->type) + { + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + { + GIIrNodeFunction *func; + + func = (GIIrNodeFunction *)CURRENT_NODE (ctx); + func->parameters = g_list_append (func->parameters, param); + } + break; + case GI_IR_NODE_SIGNAL: + { + GIIrNodeSignal *signal; + + signal = (GIIrNodeSignal *)CURRENT_NODE (ctx); + signal->parameters = g_list_append (signal->parameters, param); + } + break; + case GI_IR_NODE_VFUNC: + { + GIIrNodeVFunc *vfunc; + + vfunc = (GIIrNodeVFunc *)CURRENT_NODE (ctx); + vfunc->parameters = g_list_append (vfunc->parameters, param); + } + break; + default: + g_assert_not_reached (); + } + + return TRUE; +} + +static gboolean +start_field (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *readable; + const char *writable; + const char *bits; + const char *branch; + GIIrNodeField *field; + ParseState target_state; + gboolean introspectable; + guint64 parsed_bits; + + switch (ctx->state) + { + case STATE_CLASS: + target_state = STATE_CLASS_FIELD; + break; + case STATE_BOXED: + target_state = STATE_BOXED_FIELD; + break; + case STATE_STRUCT: + target_state = STATE_STRUCT_FIELD; + break; + case STATE_UNION: + target_state = STATE_UNION_FIELD; + break; + case STATE_INTERFACE: + target_state = STATE_INTERFACE_FIELD; + break; + default: + return FALSE; + } + + if (strcmp (element_name, "field") != 0) + return FALSE; + + g_assert (ctx->state != STATE_PASSTHROUGH); + + /* We handle introspectability specially here; we replace with just gpointer + * for the type. + */ + introspectable = introspectable_prelude (context, attribute_names, attribute_values, ctx, target_state); + + name = find_attribute ("name", attribute_names, attribute_values); + readable = find_attribute ("readable", attribute_names, attribute_values); + writable = find_attribute ("writable", attribute_names, attribute_values); + bits = find_attribute ("bits", attribute_names, attribute_values); + branch = find_attribute ("branch", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + field = (GIIrNodeField *)gi_ir_node_new (GI_IR_NODE_FIELD, + ctx->current_module); + if (introspectable) + { + ctx->current_typed = (GIIrNode*) field; + } + else + { + field->type = parse_type (ctx, "gpointer"); + } + + ((GIIrNode *)field)->name = g_strdup (name); + /* Fields are assumed to be read-only. + * (see also girwriter.py and generate.c) + */ + field->readable = readable == NULL || strcmp (readable, "0") == 0; + field->writable = writable != NULL && strcmp (writable, "1") == 0; + + if (bits == NULL) + field->bits = 0; + else if (g_ascii_string_to_unsigned (bits, 10, 0, G_MAXUINT, &parsed_bits, error)) + field->bits = parsed_bits; + else + { + gi_ir_node_free ((GIIrNode *) field); + return FALSE; + } + + switch (CURRENT_NODE (ctx)->type) + { + case GI_IR_NODE_OBJECT: + { + GIIrNodeInterface *iface; + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, field); + } + break; + case GI_IR_NODE_INTERFACE: + { + GIIrNodeInterface *iface; + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, field); + } + break; + case GI_IR_NODE_BOXED: + { + GIIrNodeBoxed *boxed; + + boxed = (GIIrNodeBoxed *)CURRENT_NODE (ctx); + boxed->members = g_list_append (boxed->members, field); + } + break; + case GI_IR_NODE_STRUCT: + { + GIIrNodeStruct *struct_; + + struct_ = (GIIrNodeStruct *)CURRENT_NODE (ctx); + struct_->members = g_list_append (struct_->members, field); + } + break; + case GI_IR_NODE_UNION: + { + GIIrNodeUnion *union_; + + union_ = (GIIrNodeUnion *)CURRENT_NODE (ctx); + union_->members = g_list_append (union_->members, field); + if (branch) + { + GIIrNodeConstant *constant; + + constant = (GIIrNodeConstant *) gi_ir_node_new (GI_IR_NODE_CONSTANT, + ctx->current_module); + ((GIIrNode *)constant)->name = g_strdup (name); + constant->value = g_strdup (branch); + constant->type = union_->discriminator_type; + constant->deprecated = FALSE; + + union_->discriminators = g_list_append (union_->discriminators, constant); + } + } + break; + default: + g_assert_not_reached (); + } + + return TRUE; +} + +static gboolean +start_alias (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + + name = find_attribute ("name", attribute_names, attribute_values); + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + ctx->current_alias = g_strdup (name); + state_switch (ctx, STATE_ALIAS); + + return TRUE; +} + +static gboolean +start_enum (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *typename; + const char *typeinit; + const char *deprecated; + const char *error_domain; + GIIrNodeEnum *enum_; + + if (!((strcmp (element_name, "enumeration") == 0 && ctx->state == STATE_NAMESPACE) || + (strcmp (element_name, "bitfield") == 0 && ctx->state == STATE_NAMESPACE))) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_ENUM)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + typename = find_attribute ("glib:type-name", attribute_names, attribute_values); + typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); + error_domain = find_attribute ("glib:error-domain", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + if (strcmp (element_name, "enumeration") == 0) + enum_ = (GIIrNodeEnum *) gi_ir_node_new (GI_IR_NODE_ENUM, + ctx->current_module); + else + enum_ = (GIIrNodeEnum *) gi_ir_node_new (GI_IR_NODE_FLAGS, + ctx->current_module); + ((GIIrNode *)enum_)->name = g_strdup (name); + enum_->gtype_name = g_strdup (typename); + enum_->gtype_init = g_strdup (typeinit); + enum_->error_domain = g_strdup (error_domain); + + if (deprecated) + enum_->deprecated = TRUE; + else + enum_->deprecated = FALSE; + + push_node (ctx, (GIIrNode *) enum_); + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, enum_); + + return TRUE; +} + +static gboolean +start_property (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + ParseState target_state; + const char *name; + const char *readable; + const char *writable; + const char *construct; + const char *construct_only; + const char *transfer; + const char *setter; + const char *getter; + GIIrNodeProperty *property; + GIIrNodeInterface *iface; + + if (!(strcmp (element_name, "property") == 0 && + (ctx->state == STATE_CLASS || + ctx->state == STATE_INTERFACE))) + return FALSE; + + if (ctx->state == STATE_CLASS) + target_state = STATE_CLASS_PROPERTY; + else if (ctx->state == STATE_INTERFACE) + target_state = STATE_INTERFACE_PROPERTY; + else + g_assert_not_reached (); + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, target_state)) + return TRUE; + + + name = find_attribute ("name", attribute_names, attribute_values); + readable = find_attribute ("readable", attribute_names, attribute_values); + writable = find_attribute ("writable", attribute_names, attribute_values); + construct = find_attribute ("construct", attribute_names, attribute_values); + construct_only = find_attribute ("construct-only", attribute_names, attribute_values); + transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values); + setter = find_attribute ("setter", attribute_names, attribute_values); + getter = find_attribute ("getter", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + property = (GIIrNodeProperty *) gi_ir_node_new (GI_IR_NODE_PROPERTY, + ctx->current_module); + ctx->current_typed = (GIIrNode*) property; + + ((GIIrNode *)property)->name = g_strdup (name); + + /* Assume properties are readable */ + if (readable == NULL || strcmp (readable, "1") == 0) + property->readable = TRUE; + else + property->readable = FALSE; + if (writable && strcmp (writable, "1") == 0) + property->writable = TRUE; + else + property->writable = FALSE; + if (construct && strcmp (construct, "1") == 0) + property->construct = TRUE; + else + property->construct = FALSE; + if (construct_only && strcmp (construct_only, "1") == 0) + property->construct_only = TRUE; + else + property->construct_only = FALSE; + + property->setter = g_strdup (setter); + property->getter = g_strdup (getter); + + parse_property_transfer (property, transfer, ctx); + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, property); + + return TRUE; +} + +static int64_t +parse_value (const char *str) +{ + char *shift_op; + + /* FIXME just a quick hack */ + shift_op = strstr (str, "<<"); + + if (shift_op) + { + int64_t base, shift; + + base = g_ascii_strtoll (str, NULL, 10); + shift = g_ascii_strtoll (shift_op + 3, NULL, 10); + + return base << shift; + } + else + return g_ascii_strtoll (str, NULL, 10); + + return 0; +} + +static gboolean +start_member (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *value; + const char *deprecated; + const char *c_identifier; + GIIrNodeEnum *enum_; + GIIrNodeValue *value_; + + if (!(strcmp (element_name, "member") == 0 && + ctx->state == STATE_ENUM)) + return FALSE; + + name = find_attribute ("name", attribute_names, attribute_values); + value = find_attribute ("value", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + c_identifier = find_attribute ("c:identifier", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + value_ = (GIIrNodeValue *) gi_ir_node_new (GI_IR_NODE_VALUE, + ctx->current_module); + + ((GIIrNode *)value_)->name = g_strdup (name); + + value_->value = parse_value (value); + + if (deprecated) + value_->deprecated = TRUE; + else + value_->deprecated = FALSE; + + g_hash_table_insert (((GIIrNode *)value_)->attributes, + g_strdup ("c:identifier"), + g_strdup (c_identifier)); + + enum_ = (GIIrNodeEnum *)CURRENT_NODE (ctx); + enum_->values = g_list_append (enum_->values, value_); + + return TRUE; +} + +static gboolean +start_constant (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + ParseState prev_state; + ParseState target_state; + const char *name; + const char *value; + const char *deprecated; + GIIrNodeConstant *constant; + + if (!(strcmp (element_name, "constant") == 0 && + (ctx->state == STATE_NAMESPACE || + ctx->state == STATE_CLASS || + ctx->state == STATE_INTERFACE))) + return FALSE; + + switch (ctx->state) + { + case STATE_NAMESPACE: + target_state = STATE_NAMESPACE_CONSTANT; + break; + case STATE_CLASS: + target_state = STATE_CLASS_CONSTANT; + break; + case STATE_INTERFACE: + target_state = STATE_INTERFACE_CONSTANT; + break; + default: + g_assert_not_reached (); + } + + prev_state = ctx->state; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, target_state)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + value = find_attribute ("value", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + else if (value == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "value"); + return FALSE; + } + + constant = (GIIrNodeConstant *) gi_ir_node_new (GI_IR_NODE_CONSTANT, + ctx->current_module); + + ((GIIrNode *)constant)->name = g_strdup (name); + constant->value = g_strdup (value); + + ctx->current_typed = (GIIrNode*) constant; + + if (deprecated) + constant->deprecated = TRUE; + else + constant->deprecated = FALSE; + + if (prev_state == STATE_NAMESPACE) + { + push_node (ctx, (GIIrNode *) constant); + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, constant); + } + else + { + GIIrNodeInterface *iface; + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, constant); + } + + return TRUE; +} + +static gboolean +start_interface (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *typename; + const char *typeinit; + const char *deprecated; + const char *glib_type_struct; + GIIrNodeInterface *iface; + + if (!(strcmp (element_name, "interface") == 0 && + ctx->state == STATE_NAMESPACE)) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_INTERFACE)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + typename = find_attribute ("glib:type-name", attribute_names, attribute_values); + typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); + glib_type_struct = find_attribute ("glib:type-struct", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + else if (typename == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:type-name"); + return FALSE; + } + else if (typeinit == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:get-type"); + return FALSE; + } + + iface = (GIIrNodeInterface *) gi_ir_node_new (GI_IR_NODE_INTERFACE, + ctx->current_module); + ((GIIrNode *)iface)->name = g_strdup (name); + iface->gtype_name = g_strdup (typename); + iface->gtype_init = g_strdup (typeinit); + iface->glib_type_struct = g_strdup (glib_type_struct); + if (deprecated) + iface->deprecated = TRUE; + else + iface->deprecated = FALSE; + + push_node (ctx, (GIIrNode *) iface); + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, iface); + + return TRUE; +} + +static gboolean +start_class (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *parent; + const char *glib_type_struct; + const char *typename; + const char *typeinit; + const char *deprecated; + const char *abstract; + const char *fundamental; + const char *final; + const char *ref_func; + const char *unref_func; + const char *set_value_func; + const char *get_value_func; + GIIrNodeInterface *iface; + + if (!(strcmp (element_name, "class") == 0 && + ctx->state == STATE_NAMESPACE)) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_CLASS)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + parent = find_attribute ("parent", attribute_names, attribute_values); + glib_type_struct = find_attribute ("glib:type-struct", attribute_names, attribute_values); + typename = find_attribute ("glib:type-name", attribute_names, attribute_values); + typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + abstract = find_attribute ("abstract", attribute_names, attribute_values); + final = find_attribute ("final", attribute_names, attribute_values); + fundamental = find_attribute ("glib:fundamental", attribute_names, attribute_values); + ref_func = find_attribute ("glib:ref-func", attribute_names, attribute_values); + unref_func = find_attribute ("glib:unref-func", attribute_names, attribute_values); + set_value_func = find_attribute ("glib:set-value-func", attribute_names, attribute_values); + get_value_func = find_attribute ("glib:get-value-func", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + else if (typename == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:type-name"); + return FALSE; + } + else if (typeinit == NULL && strcmp (typename, "GObject")) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:get-type"); + return FALSE; + } + + iface = (GIIrNodeInterface *) gi_ir_node_new (GI_IR_NODE_OBJECT, + ctx->current_module); + ((GIIrNode *)iface)->name = g_strdup (name); + iface->gtype_name = g_strdup (typename); + iface->gtype_init = g_strdup (typeinit); + iface->parent = g_strdup (parent); + iface->glib_type_struct = g_strdup (glib_type_struct); + if (deprecated) + iface->deprecated = TRUE; + else + iface->deprecated = FALSE; + + iface->abstract = abstract && strcmp (abstract, "1") == 0; + iface->final_ = final && strcmp (final, "1") == 0; + + if (fundamental) + iface->fundamental = TRUE; + if (ref_func) + iface->ref_func = g_strdup (ref_func); + if (unref_func) + iface->unref_func = g_strdup (unref_func); + if (set_value_func) + iface->set_value_func = g_strdup (set_value_func); + if (get_value_func) + iface->get_value_func = g_strdup (get_value_func); + + push_node (ctx, (GIIrNode *) iface); + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, iface); + + return TRUE; +} + +static gboolean +start_type (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *ctype; + gboolean in_alias = FALSE; + gboolean is_array; + gboolean is_varargs; + GIIrNodeType *typenode; + + is_array = strcmp (element_name, "array") == 0; + is_varargs = strcmp (element_name, "varargs") == 0; + + if (!(is_array || is_varargs || (strcmp (element_name, "type") == 0))) + return FALSE; + + if (ctx->state == STATE_TYPE) + { + ctx->type_depth++; + ctx->type_stack = g_list_prepend (ctx->type_stack, ctx->type_parameters); + ctx->type_parameters = NULL; + } + else if (ctx->state == STATE_FUNCTION_PARAMETER || + ctx->state == STATE_FUNCTION_RETURN || + ctx->state == STATE_STRUCT_FIELD || + ctx->state == STATE_UNION_FIELD || + ctx->state == STATE_CLASS_PROPERTY || + ctx->state == STATE_CLASS_FIELD || + ctx->state == STATE_INTERFACE_FIELD || + ctx->state == STATE_INTERFACE_PROPERTY || + ctx->state == STATE_BOXED_FIELD || + ctx->state == STATE_NAMESPACE_CONSTANT || + ctx->state == STATE_CLASS_CONSTANT || + ctx->state == STATE_INTERFACE_CONSTANT || + ctx->state == STATE_ALIAS + ) + { + if (ctx->state == STATE_ALIAS) + in_alias = TRUE; + state_switch (ctx, STATE_TYPE); + ctx->type_depth = 1; + ctx->type_stack = NULL; + ctx->type_parameters = NULL; + } + + name = find_attribute ("name", attribute_names, attribute_values); + + if (in_alias && ctx->current_alias) + { + char *key; + char *value; + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + key = g_strdup_printf ("%s.%s", ctx->namespace, ctx->current_alias); + if (!strchr (name, '.')) + { + const BasicTypeInfo *basic = parse_basic (name); + if (!basic) + { + /* For non-basic types, re-qualify the interface */ + value = g_strdup_printf ("%s.%s", ctx->namespace, name); + } + else + { + value = g_strdup (name); + } + } + else + value = g_strdup (name); + + g_hash_table_replace (ctx->aliases, key, value); + + return TRUE; + } + else if (!ctx->current_module || in_alias) + return TRUE; + + if (!ctx->current_typed) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "The element is invalid here"); + return FALSE; + } + + if (is_varargs) + return TRUE; + + if (is_array) + { + const char *zero; + const char *len; + const char *size; + + typenode = (GIIrNodeType *)gi_ir_node_new (GI_IR_NODE_TYPE, + ctx->current_module); + + typenode->tag = GI_TYPE_TAG_ARRAY; + typenode->is_pointer = TRUE; + typenode->is_array = TRUE; + + if (name && strcmp (name, "GLib.Array") == 0) { + typenode->array_type = GI_ARRAY_TYPE_ARRAY; + } else if (name && strcmp (name, "GLib.ByteArray") == 0) { + typenode->array_type = GI_ARRAY_TYPE_BYTE_ARRAY; + } else if (name && strcmp (name, "GLib.PtrArray") == 0) { + typenode->array_type = GI_ARRAY_TYPE_PTR_ARRAY; + } else { + typenode->array_type = GI_ARRAY_TYPE_C; + } + + if (typenode->array_type == GI_ARRAY_TYPE_C) { + guint64 parsed_uint; + + zero = find_attribute ("zero-terminated", attribute_names, attribute_values); + len = find_attribute ("length", attribute_names, attribute_values); + size = find_attribute ("fixed-size", attribute_names, attribute_values); + + typenode->has_length = len != NULL; + if (!typenode->has_length) + typenode->length = -1; + else if (g_ascii_string_to_unsigned (len, 10, 0, G_MAXUINT, &parsed_uint, error)) + typenode->length = parsed_uint; + else + { + gi_ir_node_free ((GIIrNode *) typenode); + return FALSE; + } + + typenode->has_size = size != NULL; + if (!typenode->has_size) + typenode->size = -1; + else if (g_ascii_string_to_unsigned (size, 10, 0, G_MAXSIZE, &parsed_uint, error)) + typenode->size = parsed_uint; + else + { + gi_ir_node_free ((GIIrNode *) typenode); + return FALSE; + } + + if (zero) + typenode->zero_terminated = strcmp(zero, "1") == 0; + else + /* If neither zero-terminated nor length nor fixed-size is given, assume zero-terminated. */ + typenode->zero_terminated = !(typenode->has_length || typenode->has_size); + + if (typenode->has_size && ctx->current_typed->type == GI_IR_NODE_FIELD) + typenode->is_pointer = FALSE; + } else { + typenode->zero_terminated = FALSE; + typenode->has_length = FALSE; + typenode->length = -1; + typenode->has_size = FALSE; + typenode->size = -1; + } + } + else + { + int pointer_depth; + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + pointer_depth = 0; + ctype = find_attribute ("c:type", attribute_names, attribute_values); + if (ctype != NULL) + { + const char *cp = ctype + strlen(ctype) - 1; + while (cp > ctype && *cp-- == '*') + pointer_depth++; + + if (g_str_has_prefix (ctype, "gpointer") + || g_str_has_prefix (ctype, "gconstpointer")) + pointer_depth++; + } + + if (ctx->current_typed->type == GI_IR_NODE_PARAM && + ((GIIrNodeParam *)ctx->current_typed)->out && + pointer_depth > 0) + pointer_depth--; + + typenode = parse_type (ctx, name); + + /* A "pointer" structure is one where the c:type is a typedef that + * to a pointer to a structure; we used to call them "disguised" + * structures as well. + */ + if (typenode->tag == GI_TYPE_TAG_INTERFACE) + { + gboolean is_pointer = FALSE; + gboolean is_disguised = FALSE; + + is_pointer_or_disguised_structure (ctx, typenode->giinterface, + &is_pointer, + &is_disguised); + + if (is_pointer || is_disguised) + pointer_depth++; + } + + if (pointer_depth > 0) + typenode->is_pointer = TRUE; + } + + ctx->type_parameters = g_list_append (ctx->type_parameters, typenode); + + return TRUE; +} + +static void +end_type_top (ParseContext *ctx) +{ + GIIrNodeType *typenode; + + if (!ctx->type_parameters) + goto out; + + typenode = (GIIrNodeType*)ctx->type_parameters->data; + + /* Default to pointer for unspecified containers */ + if (typenode->tag == GI_TYPE_TAG_ARRAY || + typenode->tag == GI_TYPE_TAG_GLIST || + typenode->tag == GI_TYPE_TAG_GSLIST) + { + if (typenode->parameter_type1 == NULL) + typenode->parameter_type1 = parse_type (ctx, "gpointer"); + } + else if (typenode->tag == GI_TYPE_TAG_GHASH) + { + if (typenode->parameter_type1 == NULL) + { + typenode->parameter_type1 = parse_type (ctx, "gpointer"); + typenode->parameter_type2 = parse_type (ctx, "gpointer"); + } + } + + switch (ctx->current_typed->type) + { + case GI_IR_NODE_PARAM: + { + GIIrNodeParam *param = (GIIrNodeParam *)ctx->current_typed; + param->type = typenode; + } + break; + case GI_IR_NODE_FIELD: + { + GIIrNodeField *field = (GIIrNodeField *)ctx->current_typed; + field->type = typenode; + } + break; + case GI_IR_NODE_PROPERTY: + { + GIIrNodeProperty *property = (GIIrNodeProperty *) ctx->current_typed; + property->type = typenode; + } + break; + case GI_IR_NODE_CONSTANT: + { + GIIrNodeConstant *constant = (GIIrNodeConstant *)ctx->current_typed; + constant->type = typenode; + } + break; + default: + g_printerr("current node is %d\n", CURRENT_NODE (ctx)->type); + g_assert_not_reached (); + } + g_list_free (ctx->type_parameters); + + out: + ctx->type_depth = 0; + ctx->type_parameters = NULL; + ctx->current_typed = NULL; +} + +static void +end_type_recurse (ParseContext *ctx) +{ + GIIrNodeType *parent; + GIIrNodeType *param = NULL; + + parent = (GIIrNodeType *) ((GList*)ctx->type_stack->data)->data; + if (ctx->type_parameters) + param = (GIIrNodeType *) ctx->type_parameters->data; + + if (parent->tag == GI_TYPE_TAG_ARRAY || + parent->tag == GI_TYPE_TAG_GLIST || + parent->tag == GI_TYPE_TAG_GSLIST) + { + g_assert (param != NULL); + + if (parent->parameter_type1 == NULL) + parent->parameter_type1 = param; + else + g_assert_not_reached (); + } + else if (parent->tag == GI_TYPE_TAG_GHASH) + { + g_assert (param != NULL); + + if (parent->parameter_type1 == NULL) + parent->parameter_type1 = param; + else if (parent->parameter_type2 == NULL) + parent->parameter_type2 = param; + else + g_assert_not_reached (); + } + g_list_free (ctx->type_parameters); + ctx->type_parameters = (GList *)ctx->type_stack->data; + ctx->type_stack = g_list_delete_link (ctx->type_stack, ctx->type_stack); +} + +static void +end_type (ParseContext *ctx) +{ + if (ctx->type_depth == 1) + { + end_type_top (ctx); + state_switch (ctx, ctx->prev_state); + } + else + { + end_type_recurse (ctx); + ctx->type_depth--; + } +} + +static gboolean +start_attribute (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *value; + GIIrNode *curnode; + + if (strcmp (element_name, "attribute") != 0 || ctx->node_stack == NULL) + return FALSE; + + name = find_attribute ("name", attribute_names, attribute_values); + value = find_attribute ("value", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + if (value == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "value"); + return FALSE; + } + + state_switch (ctx, STATE_ATTRIBUTE); + + curnode = CURRENT_NODE (ctx); + + if (ctx->current_typed && ctx->current_typed->type == GI_IR_NODE_PARAM) + { + g_hash_table_insert (ctx->current_typed->attributes, g_strdup (name), g_strdup (value)); + } + else + { + g_hash_table_insert (curnode->attributes, g_strdup (name), g_strdup (value)); + } + + return TRUE; +} + +static gboolean +start_return_value (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + GIIrNodeParam *param; + const char *transfer; + const char *skip; + const char *nullable; + + if (!(strcmp (element_name, "return-value") == 0 && + ctx->state == STATE_FUNCTION)) + return FALSE; + + param = (GIIrNodeParam *)gi_ir_node_new (GI_IR_NODE_PARAM, + ctx->current_module); + param->in = FALSE; + param->out = FALSE; + param->retval = TRUE; + + ctx->current_typed = (GIIrNode*) param; + + state_switch (ctx, STATE_FUNCTION_RETURN); + + skip = find_attribute ("skip", attribute_names, attribute_values); + if (skip && strcmp (skip, "1") == 0) + param->skip = TRUE; + else + param->skip = FALSE; + + transfer = find_attribute ("transfer-ownership", attribute_names, attribute_values); + if (!parse_param_transfer (param, transfer, NULL, error)) + return FALSE; + + nullable = find_attribute ("nullable", attribute_names, attribute_values); + if (nullable && g_str_equal (nullable, "1")) + param->nullable = TRUE; + + switch (CURRENT_NODE (ctx)->type) + { + case GI_IR_NODE_FUNCTION: + case GI_IR_NODE_CALLBACK: + { + GIIrNodeFunction *func = (GIIrNodeFunction *)CURRENT_NODE (ctx); + func->result = param; + } + break; + case GI_IR_NODE_SIGNAL: + { + GIIrNodeSignal *signal = (GIIrNodeSignal *)CURRENT_NODE (ctx); + signal->result = param; + } + break; + case GI_IR_NODE_VFUNC: + { + GIIrNodeVFunc *vfunc = (GIIrNodeVFunc *)CURRENT_NODE (ctx); + vfunc->result = param; + } + break; + default: + g_assert_not_reached (); + } + + return TRUE; +} + +static gboolean +start_implements (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + GIIrNodeInterface *iface; + const char *name; + + if (strcmp (element_name, "implements") != 0 || + !(ctx->state == STATE_CLASS)) + return FALSE; + + state_switch (ctx, STATE_IMPLEMENTS); + + name = find_attribute ("name", attribute_names, attribute_values); + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->interfaces = g_list_append (iface->interfaces, g_strdup (name)); + + return TRUE; +} + +static gboolean +start_glib_signal (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *when; + const char *no_recurse; + const char *detailed; + const char *action; + const char *no_hooks; + const char *has_class_closure; + GIIrNodeInterface *iface; + GIIrNodeSignal *signal; + + if (!(strcmp (element_name, "glib:signal") == 0 && + (ctx->state == STATE_CLASS || + ctx->state == STATE_INTERFACE))) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_FUNCTION)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + when = find_attribute ("when", attribute_names, attribute_values); + no_recurse = find_attribute ("no-recurse", attribute_names, attribute_values); + detailed = find_attribute ("detailed", attribute_names, attribute_values); + action = find_attribute ("action", attribute_names, attribute_values); + no_hooks = find_attribute ("no-hooks", attribute_names, attribute_values); + has_class_closure = find_attribute ("has-class-closure", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + signal = (GIIrNodeSignal *)gi_ir_node_new (GI_IR_NODE_SIGNAL, + ctx->current_module); + + ((GIIrNode *)signal)->name = g_strdup (name); + + signal->run_first = FALSE; + signal->run_last = FALSE; + signal->run_cleanup = FALSE; + if (when == NULL || g_ascii_strcasecmp (when, "LAST") == 0) + signal->run_last = TRUE; + else if (g_ascii_strcasecmp (when, "FIRST") == 0) + signal->run_first = TRUE; + else + signal->run_cleanup = TRUE; + + if (no_recurse && strcmp (no_recurse, "1") == 0) + signal->no_recurse = TRUE; + else + signal->no_recurse = FALSE; + if (detailed && strcmp (detailed, "1") == 0) + signal->detailed = TRUE; + else + signal->detailed = FALSE; + if (action && strcmp (action, "1") == 0) + signal->action = TRUE; + else + signal->action = FALSE; + if (no_hooks && strcmp (no_hooks, "1") == 0) + signal->no_hooks = TRUE; + else + signal->no_hooks = FALSE; + if (has_class_closure && strcmp (has_class_closure, "1") == 0) + signal->has_class_closure = TRUE; + else + signal->has_class_closure = FALSE; + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, signal); + + push_node (ctx, (GIIrNode *)signal); + + return TRUE; +} + +static gboolean +start_vfunc (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *must_chain_up; + const char *override; + const char *is_class_closure; + const char *offset; + const char *invoker; + const char *throws; + GIIrNodeInterface *iface; + GIIrNodeVFunc *vfunc; + guint64 parsed_offset; + + if (!(strcmp (element_name, "virtual-method") == 0 && + (ctx->state == STATE_CLASS || + ctx->state == STATE_INTERFACE))) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_FUNCTION)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + must_chain_up = find_attribute ("must-chain-up", attribute_names, attribute_values); + override = find_attribute ("override", attribute_names, attribute_values); + is_class_closure = find_attribute ("is-class-closure", attribute_names, attribute_values); + offset = find_attribute ("offset", attribute_names, attribute_values); + invoker = find_attribute ("invoker", attribute_names, attribute_values); + throws = find_attribute ("throws", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + vfunc = (GIIrNodeVFunc *)gi_ir_node_new (GI_IR_NODE_VFUNC, + ctx->current_module); + + ((GIIrNode *)vfunc)->name = g_strdup (name); + + if (must_chain_up && strcmp (must_chain_up, "1") == 0) + vfunc->must_chain_up = TRUE; + else + vfunc->must_chain_up = FALSE; + + if (override && strcmp (override, "always") == 0) + { + vfunc->must_be_implemented = TRUE; + vfunc->must_not_be_implemented = FALSE; + } + else if (override && strcmp (override, "never") == 0) + { + vfunc->must_be_implemented = FALSE; + vfunc->must_not_be_implemented = TRUE; + } + else + { + vfunc->must_be_implemented = FALSE; + vfunc->must_not_be_implemented = FALSE; + } + + if (is_class_closure && strcmp (is_class_closure, "1") == 0) + vfunc->is_class_closure = TRUE; + else + vfunc->is_class_closure = FALSE; + + if (throws && strcmp (throws, "1") == 0) + vfunc->throws = TRUE; + else + vfunc->throws = FALSE; + + if (offset == NULL) + vfunc->offset = 0xFFFF; + else if (g_ascii_string_to_unsigned (offset, 10, 0, G_MAXSIZE, &parsed_offset, error)) + vfunc->offset = parsed_offset; + else + { + gi_ir_node_free ((GIIrNode *) vfunc); + return FALSE; + } + + vfunc->invoker = g_strdup (invoker); + + iface = (GIIrNodeInterface *)CURRENT_NODE (ctx); + iface->members = g_list_append (iface->members, vfunc); + + push_node (ctx, (GIIrNode *)vfunc); + + return TRUE; +} + +static gboolean +start_struct (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *deprecated; + const char *disguised; + const char *opaque; + const char *pointer; + const char *gtype_name; + const char *gtype_init; + const char *gtype_struct; + const char *foreign; + const char *copy_func; + const char *free_func; + GIIrNodeStruct *struct_; + + if (!(strcmp (element_name, "record") == 0 && + (ctx->state == STATE_NAMESPACE || + ctx->state == STATE_UNION || + ctx->state == STATE_STRUCT || + ctx->state == STATE_CLASS))) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_STRUCT)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + disguised = find_attribute ("disguised", attribute_names, attribute_values); + pointer = find_attribute ("pointer", attribute_names, attribute_values); + opaque = find_attribute ("opaque", attribute_names, attribute_values); + gtype_name = find_attribute ("glib:type-name", attribute_names, attribute_values); + gtype_init = find_attribute ("glib:get-type", attribute_names, attribute_values); + gtype_struct = find_attribute ("glib:is-gtype-struct-for", attribute_names, attribute_values); + foreign = find_attribute ("foreign", attribute_names, attribute_values); + copy_func = find_attribute ("copy-function", attribute_names, attribute_values); + free_func = find_attribute ("free-function", attribute_names, attribute_values); + + if (name == NULL && ctx->node_stack == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + if ((gtype_name == NULL && gtype_init != NULL)) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:type-name"); + return FALSE; + } + if ((gtype_name != NULL && gtype_init == NULL)) + { + MISSING_ATTRIBUTE (context, error, element_name, "glib:get-type"); + return FALSE; + } + + struct_ = (GIIrNodeStruct *) gi_ir_node_new (GI_IR_NODE_STRUCT, + ctx->current_module); + + ((GIIrNode *)struct_)->name = g_strdup (name ? name : ""); + if (deprecated) + struct_->deprecated = TRUE; + else + struct_->deprecated = FALSE; + + if (g_strcmp0 (disguised, "1") == 0) + struct_->disguised = TRUE; + + if (g_strcmp0 (pointer, "1") == 0) + struct_->pointer = TRUE; + + if (g_strcmp0 (opaque, "1") == 0) + struct_->opaque = TRUE; + + struct_->is_gtype_struct = gtype_struct != NULL; + + struct_->gtype_name = g_strdup (gtype_name); + struct_->gtype_init = g_strdup (gtype_init); + + struct_->foreign = (g_strcmp0 (foreign, "1") == 0); + + struct_->copy_func = g_strdup (copy_func); + struct_->free_func = g_strdup (free_func); + + if (ctx->node_stack == NULL) + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, struct_); + push_node (ctx, (GIIrNode *)struct_); + return TRUE; +} + +static gboolean +start_union (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *name; + const char *deprecated; + const char *typename; + const char *typeinit; + const char *copy_func; + const char *free_func; + GIIrNodeUnion *union_; + + if (!(strcmp (element_name, "union") == 0 && + (ctx->state == STATE_NAMESPACE || + ctx->state == STATE_UNION || + ctx->state == STATE_STRUCT || + ctx->state == STATE_CLASS))) + return FALSE; + + if (!introspectable_prelude (context, attribute_names, attribute_values, ctx, STATE_UNION)) + return TRUE; + + name = find_attribute ("name", attribute_names, attribute_values); + deprecated = find_attribute ("deprecated", attribute_names, attribute_values); + typename = find_attribute ("glib:type-name", attribute_names, attribute_values); + typeinit = find_attribute ("glib:get-type", attribute_names, attribute_values); + copy_func = find_attribute ("copy-function", attribute_names, attribute_values); + free_func = find_attribute ("free-function", attribute_names, attribute_values); + + if (name == NULL && ctx->node_stack == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + return FALSE; + } + + union_ = (GIIrNodeUnion *) gi_ir_node_new (GI_IR_NODE_UNION, + ctx->current_module); + + ((GIIrNode *)union_)->name = g_strdup (name ? name : ""); + union_->gtype_name = g_strdup (typename); + union_->gtype_init = g_strdup (typeinit); + union_->copy_func = g_strdup (copy_func); + union_->free_func = g_strdup (free_func); + if (deprecated) + union_->deprecated = TRUE; + else + union_->deprecated = FALSE; + + if (ctx->node_stack == NULL) + ctx->current_module->entries = + g_list_append (ctx->current_module->entries, union_); + push_node (ctx, (GIIrNode *)union_); + return TRUE; +} + +static gboolean +start_discriminator (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + ParseContext *ctx, + GError **error) +{ + const char *type; + const char *offset; + guint64 parsed_offset; + + if (!(strcmp (element_name, "discriminator") == 0 && + ctx->state == STATE_UNION)) + return FALSE; + + type = find_attribute ("type", attribute_names, attribute_values); + offset = find_attribute ("offset", attribute_names, attribute_values); + if (type == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "type"); + return FALSE; + } + else if (offset == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "offset"); + return FALSE; + } + + ((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_type + = parse_type (ctx, type); + + if (g_ascii_string_to_unsigned (offset, 10, 0, G_MAXSIZE, &parsed_offset, error)) + ((GIIrNodeUnion *)CURRENT_NODE (ctx))->discriminator_offset = parsed_offset; + else + return FALSE; + + return TRUE; +} + +static gboolean +parse_include (GMarkupParseContext *context, + ParseContext *ctx, + const char *name, + const char *version) +{ + GError *error = NULL; + char *buffer; + gsize length; + char *girpath, *girname; + GIIrModule *module; + GList *l; + + for (l = ctx->parser->parsed_modules; l; l = l->next) + { + GIIrModule *m = l->data; + + if (strcmp (m->name, name) == 0) + { + if (strcmp (m->version, version) == 0) + { + ctx->include_modules = g_list_prepend (ctx->include_modules, m); + + return TRUE; + } + else + { + g_printerr ("Module '%s' imported with conflicting versions '%s' and '%s'\n", + name, m->version, version); + return FALSE; + } + } + } + + girname = g_strdup_printf ("%s-%s.gir", name, version); + girpath = locate_gir (ctx->parser, girname); + + if (girpath == NULL) + { + g_printerr ("Could not find GIR file '%s'; check XDG_DATA_DIRS or use --includedir\n", + girname); + g_free (girname); + return FALSE; + } + g_free (girname); + + g_debug ("Parsing include %s", girpath); + + if (!g_file_get_contents (girpath, &buffer, &length, &error)) + { + g_printerr ("%s: %s\n", girpath, error->message); + g_clear_error (&error); + g_free (girpath); + return FALSE; + } + + module = gi_ir_parser_parse_string (ctx->parser, name, girpath, buffer, length, &error); + g_free (buffer); + if (error != NULL) + { + int line_number, char_number; + g_markup_parse_context_get_position (context, &line_number, &char_number); + g_printerr ("%s:%d:%d: error: %s\n", girpath, line_number, char_number, error->message); + g_clear_error (&error); + g_free (girpath); + return FALSE; + } + g_free (girpath); + + ctx->include_modules = g_list_append (ctx->include_modules, + module); + + return TRUE; +} + +static void +start_element_handler (GMarkupParseContext *context, + const char *element_name, + const char **attribute_names, + const char **attribute_values, + gpointer user_data, + GError **error) +{ + ParseContext *ctx = user_data; + + if (ctx->parser->logged_levels & G_LOG_LEVEL_DEBUG) + { + GString *tags = g_string_new (""); + int i; + for (i = 0; attribute_names[i]; i++) + g_string_append_printf (tags, "%s=\"%s\" ", + attribute_names[i], + attribute_values[i]); + + if (i) + { + g_string_insert_c (tags, 0, ' '); + g_string_truncate (tags, tags->len - 1); + } + g_debug ("<%s%s>", element_name, tags->str); + g_string_free (tags, TRUE); + } + + if (ctx->state == STATE_PASSTHROUGH) + { + ctx->unknown_depth += 1; + return; + } + + switch (element_name[0]) + { + case 'a': + if (ctx->state == STATE_NAMESPACE && strcmp (element_name, "alias") == 0) + { + state_switch (ctx, STATE_ALIAS); + goto out; + } + if (start_type (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_attribute (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + case 'b': + if (start_enum (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + case 'c': + if (start_function (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_constant (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_class (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'd': + if (start_discriminator (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + if (strcmp ("doc", element_name) == 0 || strcmp ("doc-deprecated", element_name) == 0 || + strcmp ("doc-stability", element_name) == 0 || strcmp ("doc-version", element_name) == 0 || + strcmp ("docsection", element_name) == 0) + { + state_switch (ctx, STATE_PASSTHROUGH); + goto out; + } + break; + + case 'e': + if (start_enum (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'f': + if (strcmp ("function-macro", element_name) == 0) + { + state_switch (ctx, STATE_PASSTHROUGH); + goto out; + } + else if (start_function (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_field (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'g': + if (start_glib_boxed (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_glib_signal (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'i': + if (strcmp (element_name, "include") == 0 && + ctx->state == STATE_REPOSITORY) + { + const char *name; + const char *version; + + name = find_attribute ("name", attribute_names, attribute_values); + version = find_attribute ("version", attribute_names, attribute_values); + + if (name == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "name"); + break; + } + if (version == NULL) + { + MISSING_ATTRIBUTE (context, error, element_name, "version"); + break; + } + + if (!parse_include (context, ctx, name, version)) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Failed to parse included gir %s-%s", + name, + version); + return; + } + + ctx->dependencies = g_list_prepend (ctx->dependencies, + g_strdup_printf ("%s-%s", name, version)); + + + state_switch (ctx, STATE_INCLUDE); + goto out; + } + if (start_interface (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_implements (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_instance_parameter (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (strcmp (element_name, "c:include") == 0) + { + state_switch (ctx, STATE_C_INCLUDE); + goto out; + } + break; + + case 'm': + if (start_function (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_member (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'n': + if (strcmp (element_name, "namespace") == 0 && ctx->state == STATE_REPOSITORY) + { + const char *name, *version, *shared_library, *cprefix; + + if (ctx->current_module != NULL) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Only one element is currently allowed per "); + goto out; + } + + name = find_attribute ("name", attribute_names, attribute_values); + version = find_attribute ("version", attribute_names, attribute_values); + shared_library = find_attribute ("shared-library", attribute_names, attribute_values); + cprefix = find_attribute ("c:identifier-prefixes", attribute_names, attribute_values); + /* Backwards compatibility; vala currently still generates this */ + if (cprefix == NULL) + cprefix = find_attribute ("c:prefix", attribute_names, attribute_values); + + if (name == NULL) + MISSING_ATTRIBUTE (context, error, element_name, "name"); + else if (version == NULL) + MISSING_ATTRIBUTE (context, error, element_name, "version"); + else + { + GList *l; + + if (strcmp (name, ctx->namespace) != 0) + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + " name element '%s' doesn't match file name '%s'", + name, ctx->namespace); + + ctx->current_module = gi_ir_module_new (name, version, shared_library, cprefix); + + ctx->current_module->aliases = ctx->aliases; + ctx->aliases = NULL; + ctx->current_module->disguised_structures = ctx->disguised_structures; + ctx->current_module->pointer_structures = ctx->pointer_structures; + ctx->disguised_structures = NULL; + ctx->pointer_structures = NULL; + + for (l = ctx->include_modules; l; l = l->next) + gi_ir_module_add_include_module (ctx->current_module, l->data); + + g_list_free (ctx->include_modules); + ctx->include_modules = NULL; + + ctx->modules = g_list_append (ctx->modules, ctx->current_module); + ctx->current_module->dependencies = ctx->dependencies; + + state_switch (ctx, STATE_NAMESPACE); + goto out; + } + } + break; + + case 'p': + if (start_property (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (strcmp (element_name, "parameters") == 0 && + ctx->state == STATE_FUNCTION) + { + state_switch (ctx, STATE_FUNCTION_PARAMETERS); + + goto out; + } + else if (start_parameter (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (strcmp (element_name, "prerequisite") == 0 && + ctx->state == STATE_INTERFACE) + { + const char *name; + + name = find_attribute ("name", attribute_names, attribute_values); + + state_switch (ctx, STATE_PREREQUISITE); + + if (name == NULL) + MISSING_ATTRIBUTE (context, error, element_name, "name"); + else + { + GIIrNodeInterface *iface; + + iface = (GIIrNodeInterface *)CURRENT_NODE(ctx); + iface->prerequisites = g_list_append (iface->prerequisites, g_strdup (name)); + } + goto out; + } + else if (strcmp (element_name, "package") == 0 && + ctx->state == STATE_REPOSITORY) + { + state_switch (ctx, STATE_PACKAGE); + goto out; + } + break; + + case 'r': + if (strcmp (element_name, "repository") == 0 && ctx->state == STATE_START) + { + const char *version; + + version = find_attribute ("version", attribute_names, attribute_values); + + if (version == NULL) + MISSING_ATTRIBUTE (context, error, element_name, "version"); + else if (strcmp (version, SUPPORTED_GIR_VERSION) != 0) + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unsupported version '%s'", + version); + else + state_switch (ctx, STATE_REPOSITORY); + + goto out; + } + else if (start_return_value (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + else if (start_struct (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 's': + if (strcmp ("source-position", element_name) == 0) + { + state_switch (ctx, STATE_PASSTHROUGH); + goto out; + } + break; + case 'u': + if (start_union (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 't': + if (start_type (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + + case 'v': + if (start_vfunc (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + if (start_type (context, element_name, + attribute_names, attribute_values, + ctx, error)) + goto out; + break; + default: + break; + } + + if (*error == NULL && ctx->state != STATE_PASSTHROUGH) + { + int line_number, char_number; + g_markup_parse_context_get_position (context, &line_number, &char_number); + if (!g_str_has_prefix (element_name, "c:")) + g_printerr ("%s:%d:%d: warning: element %s from state %d is unknown, ignoring\n", + ctx->file_path, line_number, char_number, element_name, + ctx->state); + state_switch (ctx, STATE_PASSTHROUGH); + } + + out: + if (*error) + { + int line_number, char_number; + g_markup_parse_context_get_position (context, &line_number, &char_number); + + g_printerr ("%s:%d:%d: error: %s\n", ctx->file_path, line_number, char_number, (*error)->message); + } +} + +static gboolean +require_one_of_end_elements (GMarkupParseContext *context, + ParseContext *ctx, + const char *actual_name, + GError **error, + ...) +{ + va_list args; + int line_number, char_number; + const char *expected; + gboolean matched = FALSE; + + va_start (args, error); + + while ((expected = va_arg (args, const char*)) != NULL) + { + if (strcmp (expected, actual_name) == 0) + { + matched = TRUE; + break; + } + } + + va_end (args); + + if (matched) + return TRUE; + + g_markup_parse_context_get_position (context, &line_number, &char_number); + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unexpected end tag '%s' on line %d char %d; current state=%d (prev=%d)", + actual_name, + line_number, char_number, ctx->state, ctx->prev_state); + return FALSE; +} + +static gboolean +state_switch_end_struct_or_union (GMarkupParseContext *context, + ParseContext *ctx, + const char *element_name, + GError **error) +{ + pop_node (ctx); + if (ctx->node_stack == NULL) + { + state_switch (ctx, STATE_NAMESPACE); + } + else + { + if (CURRENT_NODE (ctx)->type == GI_IR_NODE_STRUCT) + state_switch (ctx, STATE_STRUCT); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_UNION) + state_switch (ctx, STATE_UNION); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_OBJECT) + state_switch (ctx, STATE_CLASS); + else + { + int line_number, char_number; + g_markup_parse_context_get_position (context, &line_number, &char_number); + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unexpected end tag '%s' on line %d char %d", + element_name, + line_number, char_number); + return FALSE; + } + } + return TRUE; +} + +static gboolean +require_end_element (GMarkupParseContext *context, + ParseContext *ctx, + const char *expected_name, + const char *actual_name, + GError **error) +{ + return require_one_of_end_elements (context, ctx, actual_name, error, expected_name, NULL); +} + +static void +end_element_handler (GMarkupParseContext *context, + const char *element_name, + gpointer user_data, + GError **error) +{ + ParseContext *ctx = user_data; + + g_debug ("", element_name); + + switch (ctx->state) + { + case STATE_START: + case STATE_END: + /* no need to GError here, GMarkup already catches this */ + break; + + case STATE_REPOSITORY: + state_switch (ctx, STATE_END); + break; + + case STATE_INCLUDE: + if (require_end_element (context, ctx, "include", element_name, error)) + { + state_switch (ctx, STATE_REPOSITORY); + } + break; + + case STATE_C_INCLUDE: + if (require_end_element (context, ctx, "c:include", element_name, error)) + { + state_switch (ctx, STATE_REPOSITORY); + } + break; + + case STATE_PACKAGE: + if (require_end_element (context, ctx, "package", element_name, error)) + { + state_switch (ctx, STATE_REPOSITORY); + } + break; + + case STATE_NAMESPACE: + if (require_end_element (context, ctx, "namespace", element_name, error)) + { + ctx->current_module = NULL; + state_switch (ctx, STATE_REPOSITORY); + } + break; + + case STATE_ALIAS: + if (require_end_element (context, ctx, "alias", element_name, error)) + { + g_free (ctx->current_alias); + ctx->current_alias = NULL; + state_switch (ctx, STATE_NAMESPACE); + } + break; + + case STATE_FUNCTION_RETURN: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "return-value", element_name, error)) + { + state_switch (ctx, STATE_FUNCTION); + } + break; + + case STATE_FUNCTION_PARAMETERS: + if (require_end_element (context, ctx, "parameters", element_name, error)) + { + state_switch (ctx, STATE_FUNCTION); + } + break; + + case STATE_FUNCTION_PARAMETER: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "parameter", element_name, error)) + { + state_switch (ctx, STATE_FUNCTION_PARAMETERS); + } + break; + + case STATE_FUNCTION: + { + pop_node (ctx); + if (ctx->node_stack == NULL) + { + state_switch (ctx, STATE_NAMESPACE); + } + else + { + g_debug("case STATE_FUNCTION %d", CURRENT_NODE (ctx)->type); + if (ctx->in_embedded_state != STATE_NONE) + { + state_switch (ctx, ctx->in_embedded_state); + ctx->in_embedded_state = STATE_NONE; + } + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_INTERFACE) + state_switch (ctx, STATE_INTERFACE); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_OBJECT) + state_switch (ctx, STATE_CLASS); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_BOXED) + state_switch (ctx, STATE_BOXED); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_STRUCT) + state_switch (ctx, STATE_STRUCT); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_UNION) + state_switch (ctx, STATE_UNION); + else if (CURRENT_NODE (ctx)->type == GI_IR_NODE_ENUM || + CURRENT_NODE (ctx)->type == GI_IR_NODE_FLAGS) + state_switch (ctx, STATE_ENUM); + else + { + int line_number, char_number; + g_markup_parse_context_get_position (context, &line_number, &char_number); + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Unexpected end tag '%s' on line %d char %d", + element_name, + line_number, char_number); + } + } + } + break; + + case STATE_CLASS_FIELD: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "field", element_name, error)) + { + state_switch (ctx, STATE_CLASS); + } + break; + + case STATE_CLASS_PROPERTY: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "property", element_name, error)) + { + state_switch (ctx, STATE_CLASS); + } + break; + + case STATE_CLASS: + if (require_end_element (context, ctx, "class", element_name, error)) + { + pop_node (ctx); + state_switch (ctx, STATE_NAMESPACE); + } + break; + + case STATE_INTERFACE_PROPERTY: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "property", element_name, error)) + { + state_switch (ctx, STATE_INTERFACE); + } + break; + + case STATE_INTERFACE_FIELD: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "field", element_name, error)) + { + state_switch (ctx, STATE_INTERFACE); + } + break; + + case STATE_INTERFACE: + if (require_end_element (context, ctx, "interface", element_name, error)) + { + pop_node (ctx); + state_switch (ctx, STATE_NAMESPACE); + } + break; + + case STATE_ENUM: + if (strcmp ("member", element_name) == 0) + break; + else if (strcmp ("function", element_name) == 0) + break; + else if (require_one_of_end_elements (context, ctx, + element_name, error, "enumeration", + "bitfield", NULL)) + { + pop_node (ctx); + state_switch (ctx, STATE_NAMESPACE); + } + break; + + case STATE_BOXED: + if (require_end_element (context, ctx, "glib:boxed", element_name, error)) + { + pop_node (ctx); + state_switch (ctx, STATE_NAMESPACE); + } + break; + + case STATE_BOXED_FIELD: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "field", element_name, error)) + { + state_switch (ctx, STATE_BOXED); + } + break; + + case STATE_STRUCT_FIELD: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "field", element_name, error)) + { + state_switch (ctx, STATE_STRUCT); + } + break; + + case STATE_STRUCT: + if (require_end_element (context, ctx, "record", element_name, error)) + { + state_switch_end_struct_or_union (context, ctx, element_name, error); + } + break; + + case STATE_UNION_FIELD: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "field", element_name, error)) + { + state_switch (ctx, STATE_UNION); + } + break; + + case STATE_UNION: + if (require_end_element (context, ctx, "union", element_name, error)) + { + state_switch_end_struct_or_union (context, ctx, element_name, error); + } + break; + case STATE_IMPLEMENTS: + if (strcmp ("interface", element_name) == 0) + break; + if (require_end_element (context, ctx, "implements", element_name, error)) + state_switch (ctx, STATE_CLASS); + break; + case STATE_PREREQUISITE: + if (require_end_element (context, ctx, "prerequisite", element_name, error)) + state_switch (ctx, STATE_INTERFACE); + break; + case STATE_NAMESPACE_CONSTANT: + case STATE_CLASS_CONSTANT: + case STATE_INTERFACE_CONSTANT: + if (strcmp ("type", element_name) == 0) + break; + if (require_end_element (context, ctx, "constant", element_name, error)) + { + switch (ctx->state) + { + case STATE_NAMESPACE_CONSTANT: + pop_node (ctx); + state_switch (ctx, STATE_NAMESPACE); + break; + case STATE_CLASS_CONSTANT: + state_switch (ctx, STATE_CLASS); + break; + case STATE_INTERFACE_CONSTANT: + state_switch (ctx, STATE_INTERFACE); + break; + default: + g_assert_not_reached (); + break; + } + } + break; + case STATE_TYPE: + if ((strcmp ("type", element_name) == 0) || (strcmp ("array", element_name) == 0) || + (strcmp ("varargs", element_name) == 0)) + { + end_type (ctx); + } + break; + case STATE_ATTRIBUTE: + if (strcmp ("attribute", element_name) == 0) + { + state_switch (ctx, ctx->prev_state); + } + break; + + case STATE_PASSTHROUGH: + ctx->unknown_depth -= 1; + g_assert (ctx->unknown_depth >= 0); + if (ctx->unknown_depth == 0) + state_switch (ctx, ctx->prev_state); + break; + default: + g_error ("Unhandled state %d in end_element_handler", ctx->state); + } +} + +static void +text_handler (GMarkupParseContext *context, + const char *text, + gsize text_len, + gpointer user_data, + GError **error) +{ + /* FIXME warn about non-whitespace text */ +} + +static void +cleanup (GMarkupParseContext *context, + GError *error, + void *user_data) +{ + ParseContext *ctx = user_data; + GList *m; + + for (m = ctx->modules; m; m = m->next) + gi_ir_module_free (m->data); + g_list_free (ctx->modules); + ctx->modules = NULL; + + ctx->current_module = NULL; +} + +/** + * gi_ir_parser_parse_string: + * @parser: a #GIIrParser + * @namespace: the namespace of the string + * @filename: (nullable) (type filename): Path to parsed file, or `NULL` + * @buffer: (array length=length): the data containing the XML + * @length: length of the data, in bytes + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Parse a string that holds a complete GIR XML file, and return a list of a + * a [class@GIRepository.IrModule] for each `` element within the + * file. + * + * Returns: (transfer none): a new [class@GIRepository.IrModule] + * Since: 2.80 + */ +GIIrModule * +gi_ir_parser_parse_string (GIIrParser *parser, + const char *namespace, + const char *filename, + const char *buffer, + gssize length, + GError **error) +{ + ParseContext ctx = { 0 }; + GMarkupParseContext *context; + + ctx.parser = parser; + ctx.state = STATE_START; + ctx.file_path = filename; + ctx.namespace = namespace; + ctx.include_modules = NULL; + ctx.aliases = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); + ctx.disguised_structures = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + ctx.pointer_structures = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + ctx.type_depth = 0; + ctx.dependencies = NULL; + ctx.current_module = NULL; + + context = g_markup_parse_context_new (&firstpass_parser, 0, &ctx, NULL); + + if (!g_markup_parse_context_parse (context, buffer, length, error)) + goto out; + + if (!g_markup_parse_context_end_parse (context, error)) + goto out; + + g_markup_parse_context_free (context); + + ctx.state = STATE_START; + context = g_markup_parse_context_new (&markup_parser, 0, &ctx, NULL); + if (!g_markup_parse_context_parse (context, buffer, length, error)) + goto out; + + if (!g_markup_parse_context_end_parse (context, error)) + goto out; + + parser->parsed_modules = g_list_concat (g_list_copy (ctx.modules), + parser->parsed_modules); + + out: + + if (ctx.modules == NULL) + { + /* An error occurred before we created a module, so we haven't + * transferred ownership of these hash tables to the module. + */ + g_clear_pointer (&ctx.aliases, g_hash_table_unref); + g_clear_pointer (&ctx.disguised_structures, g_hash_table_unref); + g_clear_pointer (&ctx.pointer_structures, g_hash_table_unref); + g_list_free (ctx.include_modules); + } + + g_markup_parse_context_free (context); + + if (ctx.modules) + return ctx.modules->data; + + if (error && *error == NULL) + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Expected namespace element in the gir file"); + return NULL; +} + +/** + * gi_ir_parser_parse_file: + * @parser: a #GIIrParser + * @filename: (type filename): filename to parse + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Parse the given GIR XML file, and return a list of a + * [class@GIRepository.IrModule] for each `` element within the + * file. + * + * Returns: (transfer container): a newly allocated list of + * [class@GIRepository.IrModule]s. The modules themselves + * are owned by the `GIIrParser` and will be freed along with the parser. + * Since: 2.80 + */ +GIIrModule * +gi_ir_parser_parse_file (GIIrParser *parser, + const char *filename, + GError **error) +{ + char *buffer; + gsize length; + GIIrModule *module; + char *dash; + char *namespace; + + if (!g_str_has_suffix (filename, ".gir")) + { + g_set_error (error, + G_MARKUP_ERROR, + G_MARKUP_ERROR_INVALID_CONTENT, + "Expected filename to end with '.gir'"); + return NULL; + } + + g_debug ("[parsing] filename %s", filename); + + namespace = g_path_get_basename (filename); + namespace[strlen(namespace)-4] = '\0'; + + /* Remove version */ + dash = strstr (namespace, "-"); + if (dash != NULL) + *dash = '\0'; + + if (!g_file_get_contents (filename, &buffer, &length, error)) + { + g_free (namespace); + + return NULL; + } + + module = gi_ir_parser_parse_string (parser, namespace, filename, buffer, length, error); + + g_free (namespace); + + g_free (buffer); + + return module; +} + + diff --git a/girepository/girwriter-private.h b/girepository/girwriter-private.h new file mode 100644 index 0000000..6c67e00 --- /dev/null +++ b/girepository/girwriter-private.h @@ -0,0 +1,37 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: IDL writer + * + * Copyright (C) 2007 Johan Dahlin + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include + +G_BEGIN_DECLS + +void gi_ir_writer_write (GIRepository *repository, + const char *filename, + const char *ns, + gboolean needs_prefix, + gboolean show_all); + +G_END_DECLS diff --git a/girepository/girwriter.c b/girepository/girwriter.c new file mode 100644 index 0000000..a0307a2 --- /dev/null +++ b/girepository/girwriter.c @@ -0,0 +1,1448 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: IDL generator + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include "girwriter-private.h" + +#include "gibaseinfo-private.h" +#include "girepository.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" + +#include +#include +#include + +#include +#include +#include + +typedef struct { + FILE *file; + GSList *stack; + gboolean show_all; +} Xml; + +typedef struct { + char *name; + unsigned has_children : 1; +} XmlElement; + +static XmlElement * +xml_element_new (const char *name) +{ + XmlElement *elem; + + elem = g_slice_new (XmlElement); + elem->name = g_strdup (name); + elem->has_children = FALSE; + return elem; +} + +static void +xml_element_free (XmlElement *elem) +{ + g_free (elem->name); + g_slice_free (XmlElement, elem); +} + +static void +xml_printf (Xml *xml, const char *fmt, ...) G_GNUC_PRINTF (2, 3); + +static void +xml_printf (Xml *xml, const char *fmt, ...) +{ + va_list ap; + char *s; + + va_start (ap, fmt); + s = g_markup_vprintf_escaped (fmt, ap); + fputs (s, xml->file); + g_free (s); + va_end (ap); +} + +static void +xml_start_element (Xml *xml, const char *element_name) +{ + XmlElement *parent = NULL; + + if (xml->stack) + { + parent = xml->stack->data; + + if (!parent->has_children) + xml_printf (xml, ">\n"); + + parent->has_children = TRUE; + } + + xml_printf (xml, "%*s<%s", g_slist_length(xml->stack)*2, "", element_name); + + xml->stack = g_slist_prepend (xml->stack, xml_element_new (element_name)); +} + +static void +xml_end_element (Xml *xml, const char *name) +{ + XmlElement *elem; + + g_assert (xml->stack != NULL); + + elem = xml->stack->data; + xml->stack = g_slist_delete_link (xml->stack, xml->stack); + + if (name != NULL) + g_assert_cmpstr (name, ==, elem->name); + + if (elem->has_children) + xml_printf (xml, "%*s\n", g_slist_length (xml->stack)*2, "", elem->name); + else + xml_printf (xml, "/>\n"); + + xml_element_free (elem); +} + +static void +xml_end_element_unchecked (Xml *xml) +{ + xml_end_element (xml, NULL); +} + +static Xml * +xml_open (FILE *file) +{ + Xml *xml; + + xml = g_slice_new (Xml); + xml->file = file; + xml->stack = NULL; + + return xml; +} + +static void +xml_close (Xml *xml) +{ + g_assert (xml->stack == NULL); + if (xml->file != NULL) + { + fflush (xml->file); + if (xml->file != stdout) + fclose (xml->file); + xml->file = NULL; + } +} + +static void +xml_free (Xml *xml) +{ + xml_close (xml); + g_slice_free (Xml, xml); +} + + +static void +check_unresolved (GIBaseInfo *info) +{ + if (!GI_IS_UNRESOLVED_INFO (info)) + return; + + g_critical ("Found unresolved type '%s' '%s'", + gi_base_info_get_name (info), gi_base_info_get_namespace (info)); +} + +static void +write_type_name (const char *ns, + GIBaseInfo *info, + Xml *file) +{ + if (strcmp (ns, gi_base_info_get_namespace (info)) != 0) + xml_printf (file, "%s.", gi_base_info_get_namespace (info)); + + xml_printf (file, "%s", gi_base_info_get_name (info)); +} + +static void +write_type_name_attribute (const char *ns, + GIBaseInfo *info, + const char *attr_name, + Xml *file) +{ + xml_printf (file, " %s=\"", attr_name); + write_type_name (ns, info, file); + xml_printf (file, "\""); +} + + static void +write_ownership_transfer (GITransfer transfer, + Xml *file) +{ + switch (transfer) + { + case GI_TRANSFER_NOTHING: + xml_printf (file, " transfer-ownership=\"none\""); + break; + case GI_TRANSFER_CONTAINER: + xml_printf (file, " transfer-ownership=\"container\""); + break; + case GI_TRANSFER_EVERYTHING: + xml_printf (file, " transfer-ownership=\"full\""); + break; + default: + g_assert_not_reached (); + } +} + +static void +write_type_info (const char *ns, + GITypeInfo *info, + Xml *file) +{ + int tag; + GITypeInfo *type; + gboolean is_pointer; + + check_unresolved ((GIBaseInfo*)info); + + tag = gi_type_info_get_tag (info); + is_pointer = gi_type_info_is_pointer (info); + + if (tag == GI_TYPE_TAG_VOID) + { + xml_start_element (file, "type"); + + xml_printf (file, " name=\"%s\"", is_pointer ? "any" : "none"); + + xml_end_element (file, "type"); + } + else if (GI_TYPE_TAG_IS_BASIC (tag)) + { + xml_start_element (file, "type"); + xml_printf (file, " name=\"%s\"", gi_type_tag_to_string (tag)); + xml_end_element (file, "type"); + } + else if (tag == GI_TYPE_TAG_ARRAY) + { + unsigned int length_index; + size_t size; + const char *name = NULL; + + xml_start_element (file, "array"); + + switch (gi_type_info_get_array_type (info)) { + case GI_ARRAY_TYPE_C: + break; + case GI_ARRAY_TYPE_ARRAY: + name = "GLib.Array"; + break; + case GI_ARRAY_TYPE_PTR_ARRAY: + name = "GLib.PtrArray"; + break; + case GI_ARRAY_TYPE_BYTE_ARRAY: + name = "GLib.ByteArray"; + break; + default: + break; + } + + if (name) + xml_printf (file, " name=\"%s\"", name); + + type = gi_type_info_get_param_type (info, 0); + + if (gi_type_info_get_array_length_index (info, &length_index)) + xml_printf (file, " length=\"%u\"", length_index); + + if (gi_type_info_get_array_fixed_size (info, &size)) + xml_printf (file, " fixed-size=\"%zu\"", size); + + if (gi_type_info_is_zero_terminated (info)) + xml_printf (file, " zero-terminated=\"1\""); + + write_type_info (ns, type, file); + + gi_base_info_unref ((GIBaseInfo *)type); + + xml_end_element (file, "array"); + } + else if (tag == GI_TYPE_TAG_INTERFACE) + { + GIBaseInfo *iface = gi_type_info_get_interface (info); + xml_start_element (file, "type"); + write_type_name_attribute (ns, iface, "name", file); + xml_end_element (file, "type"); + gi_base_info_unref (iface); + } + else if (tag == GI_TYPE_TAG_GLIST) + { + xml_start_element (file, "type"); + xml_printf (file, " name=\"GLib.List\""); + type = gi_type_info_get_param_type (info, 0); + if (type) + { + write_type_info (ns, type, file); + gi_base_info_unref ((GIBaseInfo *)type); + } + xml_end_element (file, "type"); + } + else if (tag == GI_TYPE_TAG_GSLIST) + { + xml_start_element (file, "type"); + xml_printf (file, " name=\"GLib.SList\""); + type = gi_type_info_get_param_type (info, 0); + if (type) + { + write_type_info (ns, type, file); + gi_base_info_unref ((GIBaseInfo *)type); + } + xml_end_element (file, "type"); + } + else if (tag == GI_TYPE_TAG_GHASH) + { + xml_start_element (file, "type"); + xml_printf (file, " name=\"GLib.HashTable\""); + type = gi_type_info_get_param_type (info, 0); + if (type) + { + write_type_info (ns, type, file); + gi_base_info_unref ((GIBaseInfo *)type); + type = gi_type_info_get_param_type (info, 1); + write_type_info (ns, type, file); + gi_base_info_unref ((GIBaseInfo *)type); + } + xml_end_element (file, "type"); + } + else if (tag == GI_TYPE_TAG_ERROR) + { + xml_start_element (file, "type"); + xml_printf (file, " name=\"GLib.Error\""); + xml_end_element (file, "type"); + } + else + { + g_printerr ("Unhandled type tag %d\n", tag); + g_assert_not_reached (); + } +} + +static void +write_attributes (Xml *file, + GIBaseInfo *info) +{ + GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + const char *name, *value; + + while (gi_base_info_iterate_attributes (info, &iter, &name, &value)) + { + xml_start_element (file, "attribute"); + xml_printf (file, " name=\"%s\" value=\"%s\"", name, value); + xml_end_element (file, "attribute"); + } +} + +static void +write_return_value_attributes (Xml *file, + GICallableInfo *info) +{ + GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + const char *name, *value; + + while (gi_callable_info_iterate_return_attributes (info, &iter, &name, &value)) + { + xml_start_element (file, "attribute"); + xml_printf (file, " name=\"%s\" value=\"%s\"", name, value); + xml_end_element (file, "attribute"); + } +} + +static void +write_constant_value (const char *ns, + GITypeInfo *info, + GIArgument *argument, + Xml *file); + +static void +write_callback_info (const char *ns, + GICallbackInfo *info, + Xml *file); + +static void +write_field_info (const char *ns, + GIFieldInfo *info, + GIConstantInfo *branch, + Xml *file) +{ + const char *name; + GIFieldInfoFlags flags; + size_t size; + size_t offset; + GITypeInfo *type; + GIBaseInfo *interface; + GIArgument value; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + flags = gi_field_info_get_flags (info); + size = gi_field_info_get_size (info); + offset = gi_field_info_get_offset (info); + + xml_start_element (file, "field"); + xml_printf (file, " name=\"%s\"", name); + + /* Fields are assumed to be read-only + * (see also girwriter.py and girparser.c) + */ + if (!(flags & GI_FIELD_IS_READABLE)) + xml_printf (file, " readable=\"0\""); + if (flags & GI_FIELD_IS_WRITABLE) + xml_printf (file, " writable=\"1\""); + + if (size) + xml_printf (file, " bits=\"%zu\"", size); + + write_attributes (file, (GIBaseInfo*) info); + + type = gi_field_info_get_type_info (info); + + if (branch) + { + xml_printf (file, " branch=\""); + gi_base_info_unref ((GIBaseInfo *)type); + type = gi_constant_info_get_type_info (branch); + gi_constant_info_get_value (branch, &value); + write_constant_value (ns, type, &value, file); + xml_printf (file, "\""); + } + + if (file->show_all) + { + xml_printf (file, "offset=\"%zu\"", offset); + } + + interface = gi_type_info_get_interface (type); + if (interface != NULL && GI_IS_CALLBACK_INFO (interface)) + write_callback_info (ns, (GICallbackInfo *)interface, file); + else + write_type_info (ns, type, file); + + if (interface) + gi_base_info_unref (interface); + + gi_base_info_unref ((GIBaseInfo *)type); + + xml_end_element (file, "field"); +} + +static void +write_callable_info (const char *ns, + GICallableInfo *info, + Xml *file) +{ + GITypeInfo *type; + + if (gi_callable_info_can_throw_gerror (info)) + xml_printf (file, " throws=\"1\""); + + write_attributes (file, (GIBaseInfo*) info); + + type = gi_callable_info_get_return_type (info); + + xml_start_element (file, "return-value"); + + write_ownership_transfer (gi_callable_info_get_caller_owns (info), file); + + if (gi_callable_info_may_return_null (info)) + xml_printf (file, " allow-none=\"1\""); + + if (gi_callable_info_skip_return (info)) + xml_printf (file, " skip=\"1\""); + + write_return_value_attributes (file, info); + + write_type_info (ns, type, file); + + xml_end_element (file, "return-value"); + + if (gi_callable_info_get_n_args (info) <= 0) + return; + + xml_start_element (file, "parameters"); + for (unsigned int i = 0; i < gi_callable_info_get_n_args (info); i++) + { + GIArgInfo *arg = gi_callable_info_get_arg (info, i); + unsigned int closure_index, destroy_index; + + xml_start_element (file, "parameter"); + xml_printf (file, " name=\"%s\"", + gi_base_info_get_name ((GIBaseInfo *) arg)); + + write_ownership_transfer (gi_arg_info_get_ownership_transfer (arg), file); + + switch (gi_arg_info_get_direction (arg)) + { + case GI_DIRECTION_IN: + break; + case GI_DIRECTION_OUT: + xml_printf (file, " direction=\"out\" caller-allocates=\"%s\"", + gi_arg_info_is_caller_allocates (arg) ? "1" : "0"); + break; + case GI_DIRECTION_INOUT: + xml_printf (file, " direction=\"inout\""); + break; + default: + g_assert_not_reached (); + } + + if (gi_arg_info_may_be_null (arg)) + xml_printf (file, " allow-none=\"1\""); + + if (gi_arg_info_is_return_value (arg)) + xml_printf (file, " retval=\"1\""); + + if (gi_arg_info_is_optional (arg)) + xml_printf (file, " optional=\"1\""); + + switch (gi_arg_info_get_scope (arg)) + { + case GI_SCOPE_TYPE_INVALID: + break; + case GI_SCOPE_TYPE_CALL: + xml_printf (file, " scope=\"call\""); + break; + case GI_SCOPE_TYPE_ASYNC: + xml_printf (file, " scope=\"async\""); + break; + case GI_SCOPE_TYPE_NOTIFIED: + xml_printf (file, " scope=\"notified\""); + break; + case GI_SCOPE_TYPE_FOREVER: + xml_printf (file, " scope=\"forever\""); + break; + default: + g_assert_not_reached (); + } + + if (gi_arg_info_get_closure_index (arg, &closure_index)) + xml_printf (file, " closure=\"%u\"", closure_index); + + if (gi_arg_info_get_destroy_index (arg, &destroy_index)) + xml_printf (file, " destroy=\"%u\"", destroy_index); + + if (gi_arg_info_is_skip (arg)) + xml_printf (file, " skip=\"1\""); + + write_attributes (file, (GIBaseInfo*) arg); + + type = gi_arg_info_get_type_info (arg); + write_type_info (ns, type, file); + + xml_end_element (file, "parameter"); + + gi_base_info_unref ((GIBaseInfo *)arg); + } + + xml_end_element (file, "parameters"); + gi_base_info_unref ((GIBaseInfo *)type); +} + +static void +write_function_info (const char *ns, + GIFunctionInfo *info, + Xml *file) +{ + GIFunctionInfoFlags flags; + const char *tag; + const char *name; + const char *symbol; + gboolean deprecated; + + flags = gi_function_info_get_flags (info); + name = gi_base_info_get_name ((GIBaseInfo *)info); + symbol = gi_function_info_get_symbol (info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + if (flags & GI_FUNCTION_IS_CONSTRUCTOR) + tag = "constructor"; + else if (flags & GI_FUNCTION_IS_METHOD) + tag = "method"; + else + tag = "function"; + + xml_start_element (file, tag); + xml_printf (file, " name=\"%s\" c:identifier=\"%s\"", + name, symbol); + + if ((flags & GI_FUNCTION_IS_SETTER) || (flags & GI_FUNCTION_IS_GETTER)) + { + GIPropertyInfo *property = gi_function_info_get_property (info); + + if (property != NULL) + { + const char *property_name = gi_base_info_get_name ((GIBaseInfo *)property); + + if (flags & GI_FUNCTION_IS_SETTER) + xml_printf (file, " glib:set-property=\"%s\"", property_name); + else if (flags & GI_FUNCTION_IS_GETTER) + xml_printf (file, " glib:get-property=\"%s\"", property_name); + + gi_base_info_unref ((GIBaseInfo *) property); + } + } + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_callable_info (ns, (GICallableInfo*)info, file); + xml_end_element (file, tag); +} + +static void +write_callback_info (const char *ns, + GICallbackInfo *info, + Xml *file) +{ + const char *name; + gboolean deprecated; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + xml_start_element (file, "callback"); + xml_printf (file, " name=\"%s\"", name); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_callable_info (ns, (GICallableInfo*)info, file); + xml_end_element (file, "callback"); +} + +static void +write_struct_info (const char *ns, + GIStructInfo *info, + Xml *file) +{ + const char *name; + const char *type_name; + const char *type_init; + const char *func; + gboolean deprecated; + gboolean is_gtype_struct; + gboolean foreign; + size_t size; + unsigned int n_elts; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); + type_init = gi_registered_type_info_get_type_init_function_name ((GIRegisteredTypeInfo*)info); + + if (gi_registered_type_info_is_boxed (GI_REGISTERED_TYPE_INFO (info))) + { + xml_start_element (file, "glib:boxed"); + xml_printf (file, " glib:name=\"%s\"", name); + } + else + { + xml_start_element (file, "record"); + xml_printf (file, " name=\"%s\"", name); + } + + if (type_name != NULL) + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + is_gtype_struct = gi_struct_info_is_gtype_struct (info); + if (is_gtype_struct) + xml_printf (file, " glib:is-gtype-struct=\"1\""); + + func = gi_struct_info_get_copy_function_name (info); + if (func) + xml_printf (file, " copy-function=\"%s\"", func); + + func = gi_struct_info_get_free_function_name (info); + if (func) + xml_printf (file, " free-function=\"%s\"", func); + + write_attributes (file, (GIBaseInfo*) info); + + size = gi_struct_info_get_size (info); + if (file->show_all) + xml_printf (file, " size=\"%zu\"", size); + + foreign = gi_struct_info_is_foreign (info); + if (foreign) + xml_printf (file, " foreign=\"1\""); + + n_elts = gi_struct_info_get_n_fields (info) + gi_struct_info_get_n_methods (info); + if (n_elts > 0) + { + for (unsigned int i = 0; i < gi_struct_info_get_n_fields (info); i++) + { + GIFieldInfo *field = gi_struct_info_get_field (info, i); + write_field_info (ns, field, NULL, file); + gi_base_info_unref ((GIBaseInfo *)field); + } + + for (unsigned int i = 0; i < gi_struct_info_get_n_methods (info); i++) + { + GIFunctionInfo *function = gi_struct_info_get_method (info, i); + write_function_info (ns, function, file); + gi_base_info_unref ((GIBaseInfo *)function); + } + + } + + xml_end_element_unchecked (file); +} + +static void +write_value_info (const char *ns, + GIValueInfo *info, + Xml *file) +{ + const char *name; + int64_t value; + char *value_str; + gboolean deprecated; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + value = gi_value_info_get_value (info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + xml_start_element (file, "member"); + value_str = g_strdup_printf ("%" G_GINT64_FORMAT, value); + xml_printf (file, " name=\"%s\" value=\"%s\"", name, value_str); + g_free (value_str); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_attributes (file, (GIBaseInfo*) info); + + xml_end_element (file, "member"); +} + +static void +write_constant_value (const char *ns, + GITypeInfo *type, + GIArgument *value, + Xml *file) +{ + switch (gi_type_info_get_tag (type)) + { + case GI_TYPE_TAG_BOOLEAN: + xml_printf (file, "%d", value->v_boolean); + break; + case GI_TYPE_TAG_INT8: + xml_printf (file, "%d", value->v_int8); + break; + case GI_TYPE_TAG_UINT8: + xml_printf (file, "%d", value->v_uint8); + break; + case GI_TYPE_TAG_INT16: + xml_printf (file, "%" G_GINT16_FORMAT, value->v_int16); + break; + case GI_TYPE_TAG_UINT16: + xml_printf (file, "%" G_GUINT16_FORMAT, value->v_uint16); + break; + case GI_TYPE_TAG_INT32: + xml_printf (file, "%" G_GINT32_FORMAT, value->v_int32); + break; + case GI_TYPE_TAG_UINT32: + xml_printf (file, "%" G_GUINT32_FORMAT, value->v_uint32); + break; + case GI_TYPE_TAG_INT64: + xml_printf (file, "%" G_GINT64_FORMAT, value->v_int64); + break; + case GI_TYPE_TAG_UINT64: + xml_printf (file, "%" G_GUINT64_FORMAT, value->v_uint64); + break; + case GI_TYPE_TAG_FLOAT: + xml_printf (file, "%f", (double)value->v_float); + break; + case GI_TYPE_TAG_DOUBLE: + xml_printf (file, "%f", value->v_double); + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + xml_printf (file, "%s", value->v_string); + break; + default: + g_assert_not_reached (); + } +} + +static void +write_constant_info (const char *ns, + GIConstantInfo *info, + Xml *file) +{ + GITypeInfo *type; + const char *name; + GIArgument value; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + + xml_start_element (file, "constant"); + xml_printf (file, " name=\"%s\"", name); + + type = gi_constant_info_get_type_info (info); + xml_printf (file, " value=\""); + + gi_constant_info_get_value (info, &value); + write_constant_value (ns, type, &value, file); + xml_printf (file, "\""); + + write_type_info (ns, type, file); + + write_attributes (file, (GIBaseInfo*) info); + + xml_end_element (file, "constant"); + + gi_base_info_unref ((GIBaseInfo *)type); +} + + +static void +write_enum_info (const char *ns, + GIEnumInfo *info, + Xml *file) +{ + const char *name; + const char *type_name; + const char *type_init; + const char *error_domain; + gboolean deprecated; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); + type_init = gi_registered_type_info_get_type_init_function_name ((GIRegisteredTypeInfo*)info); + error_domain = gi_enum_info_get_error_domain (info); + + if (GI_IS_ENUM_INFO (info)) + xml_start_element (file, "enumeration"); + else + xml_start_element (file, "bitfield"); + xml_printf (file, " name=\"%s\"", name); + + if (type_init) + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + if (error_domain) + xml_printf (file, " glib:error-domain=\"%s\"", error_domain); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_attributes (file, (GIBaseInfo*) info); + + for (unsigned int i = 0; i < gi_enum_info_get_n_values (info); i++) + { + GIValueInfo *value = gi_enum_info_get_value (info, i); + write_value_info (ns, value, file); + gi_base_info_unref ((GIBaseInfo *)value); + } + + xml_end_element_unchecked (file); +} + +static void +write_signal_info (const char *ns, + GISignalInfo *info, + Xml *file) +{ + GSignalFlags flags; + const char *name; + gboolean deprecated; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + flags = gi_signal_info_get_flags (info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + xml_start_element (file, "glib:signal"); + xml_printf (file, " name=\"%s\"", name); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + if (flags & G_SIGNAL_RUN_FIRST) + xml_printf (file, " when=\"FIRST\""); + else if (flags & G_SIGNAL_RUN_LAST) + xml_printf (file, " when=\"LAST\""); + else if (flags & G_SIGNAL_RUN_CLEANUP) + xml_printf (file, " when=\"CLEANUP\""); + + if (flags & G_SIGNAL_NO_RECURSE) + xml_printf (file, " no-recurse=\"1\""); + + if (flags & G_SIGNAL_DETAILED) + xml_printf (file, " detailed=\"1\""); + + if (flags & G_SIGNAL_ACTION) + xml_printf (file, " action=\"1\""); + + if (flags & G_SIGNAL_NO_HOOKS) + xml_printf (file, " no-hooks=\"1\""); + + write_callable_info (ns, (GICallableInfo*)info, file); + + xml_end_element (file, "glib:signal"); +} + +static void +write_vfunc_info (const char *ns, + GIVFuncInfo *info, + Xml *file) +{ + GIVFuncInfoFlags flags; + const char *name; + GIFunctionInfo *invoker; + gboolean deprecated; + size_t offset; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + flags = gi_vfunc_info_get_flags (info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + offset = gi_vfunc_info_get_offset (info); + invoker = gi_vfunc_info_get_invoker (info); + + xml_start_element (file, "virtual-method"); + xml_printf (file, " name=\"%s\"", name); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + if (flags & GI_VFUNC_MUST_CHAIN_UP) + xml_printf (file, " must-chain-up=\"1\""); + + if (flags & GI_VFUNC_MUST_OVERRIDE) + xml_printf (file, " override=\"always\""); + else if (flags & GI_VFUNC_MUST_NOT_OVERRIDE) + xml_printf (file, " override=\"never\""); + + xml_printf (file, " offset=\"%zu\"", offset); + + if (invoker) + { + xml_printf (file, " invoker=\"%s\"", gi_base_info_get_name ((GIBaseInfo*)invoker)); + gi_base_info_unref ((GIBaseInfo *)invoker); + } + + write_callable_info (ns, (GICallableInfo*)info, file); + + xml_end_element (file, "virtual-method"); +} + +static void +write_property_info (const char *ns, + GIPropertyInfo *info, + Xml *file) +{ + GParamFlags flags; + const char *name; + gboolean deprecated; + GITypeInfo *type; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + flags = gi_property_info_get_flags (info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + xml_start_element (file, "property"); + xml_printf (file, " name=\"%s\"", name); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + /* Properties are assumed to be read-only (see also girwriter.py) */ + if (!(flags & G_PARAM_READABLE)) + xml_printf (file, " readable=\"0\""); + if (flags & G_PARAM_WRITABLE) + xml_printf (file, " writable=\"1\""); + + if (flags & G_PARAM_CONSTRUCT) + xml_printf (file, " construct=\"1\""); + + if (flags & G_PARAM_CONSTRUCT_ONLY) + xml_printf (file, " construct-only=\"1\""); + + if (flags & G_PARAM_READABLE) + { + GIFunctionInfo *getter = gi_property_info_get_getter (info); + + if (getter != NULL) + { + xml_printf (file, " getter=\"%s\"", gi_base_info_get_name ((GIBaseInfo *) getter)); + gi_base_info_unref ((GIBaseInfo *) getter); + } + } + + if (flags & G_PARAM_WRITABLE) + { + GIFunctionInfo *setter = gi_property_info_get_setter (info); + + if (setter != NULL) + { + xml_printf (file, " setter=\"%s\"", gi_base_info_get_name ((GIBaseInfo *) setter)); + gi_base_info_unref ((GIBaseInfo *) setter); + } + } + + write_ownership_transfer (gi_property_info_get_ownership_transfer (info), file); + + write_attributes (file, (GIBaseInfo*) info); + + type = gi_property_info_get_type_info (info); + + write_type_info (ns, type, file); + + xml_end_element (file, "property"); +} + +static void +write_object_info (const char *ns, + GIObjectInfo *info, + Xml *file) +{ + const char *name; + const char *type_name; + const char *type_init; + const char *func; + gboolean deprecated; + gboolean is_abstract; + gboolean is_fundamental; + gboolean is_final; + GIObjectInfo *pnode; + GIStructInfo *class_struct; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + is_abstract = gi_object_info_get_abstract (info); + is_fundamental = gi_object_info_get_fundamental (info); + is_final = gi_object_info_get_final (info); + + type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); + type_init = gi_registered_type_info_get_type_init_function_name ((GIRegisteredTypeInfo*)info); + xml_start_element (file, "class"); + xml_printf (file, " name=\"%s\"", name); + + pnode = gi_object_info_get_parent (info); + if (pnode) + { + write_type_name_attribute (ns, (GIBaseInfo *)pnode, "parent", file); + gi_base_info_unref ((GIBaseInfo *)pnode); + } + + class_struct = gi_object_info_get_class_struct (info); + if (class_struct) + { + write_type_name_attribute (ns, (GIBaseInfo*) class_struct, "glib:type-struct", file); + gi_base_info_unref ((GIBaseInfo*)class_struct); + } + + if (is_abstract) + xml_printf (file, " abstract=\"1\""); + + if (is_final) + xml_printf (file, " final=\"1\""); + + xml_printf (file, " glib:type-name=\"%s\" glib:get-type=\"%s\"", type_name, type_init); + + if (is_fundamental) + xml_printf (file, " glib:fundamental=\"1\""); + + func = gi_object_info_get_unref_function_name (info); + if (func) + xml_printf (file, " glib:unref-function=\"%s\"", func); + + func = gi_object_info_get_ref_function_name (info); + if (func) + xml_printf (file, " glib:ref-function=\"%s\"", func); + + func = gi_object_info_get_set_value_function_name (info); + if (func) + xml_printf (file, " glib:set-value-function=\"%s\"", func); + + func = gi_object_info_get_get_value_function_name (info); + if (func) + xml_printf (file, " glib:get-value-function=\"%s\"", func); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_attributes (file, (GIBaseInfo*) info); + + if (gi_object_info_get_n_interfaces (info) > 0) + { + for (unsigned int i = 0; i < gi_object_info_get_n_interfaces (info); i++) + { + GIInterfaceInfo *imp = gi_object_info_get_interface (info, i); + xml_start_element (file, "implements"); + write_type_name_attribute (ns, (GIBaseInfo *)imp, "name", file); + xml_end_element (file, "implements"); + gi_base_info_unref ((GIBaseInfo*)imp); + } + } + + for (unsigned int i = 0; i < gi_object_info_get_n_fields (info); i++) + { + GIFieldInfo *field = gi_object_info_get_field (info, i); + write_field_info (ns, field, NULL, file); + gi_base_info_unref ((GIBaseInfo *)field); + } + + for (unsigned int i = 0; i < gi_object_info_get_n_methods (info); i++) + { + GIFunctionInfo *function = gi_object_info_get_method (info, i); + write_function_info (ns, function, file); + gi_base_info_unref ((GIBaseInfo *)function); + } + + for (unsigned int i = 0; i < gi_object_info_get_n_properties (info); i++) + { + GIPropertyInfo *prop = gi_object_info_get_property (info, i); + write_property_info (ns, prop, file); + gi_base_info_unref ((GIBaseInfo *)prop); + } + + for (unsigned int i = 0; i < gi_object_info_get_n_signals (info); i++) + { + GISignalInfo *signal = gi_object_info_get_signal (info, i); + write_signal_info (ns, signal, file); + gi_base_info_unref ((GIBaseInfo *)signal); + } + + for (unsigned int i = 0; i < gi_object_info_get_n_vfuncs (info); i++) + { + GIVFuncInfo *vfunc = gi_object_info_get_vfunc (info, i); + write_vfunc_info (ns, vfunc, file); + gi_base_info_unref ((GIBaseInfo *)vfunc); + } + + for (unsigned int i = 0; i < gi_object_info_get_n_constants (info); i++) + { + GIConstantInfo *constant = gi_object_info_get_constant (info, i); + write_constant_info (ns, constant, file); + gi_base_info_unref ((GIBaseInfo *)constant); + } + + xml_end_element (file, "class"); +} + +static void +write_interface_info (const char *ns, + GIInterfaceInfo *info, + Xml *file) +{ + const char *name; + const char *type_name; + const char *type_init; + GIStructInfo *class_struct; + gboolean deprecated; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); + type_init = gi_registered_type_info_get_type_init_function_name ((GIRegisteredTypeInfo*)info); + xml_start_element (file, "interface"); + xml_printf (file, " name=\"%s\" glib:type-name=\"%s\" glib:get-type=\"%s\"", + name, type_name, type_init); + + class_struct = gi_interface_info_get_iface_struct (info); + if (class_struct) + { + write_type_name_attribute (ns, (GIBaseInfo*) class_struct, "glib:type-struct", file); + gi_base_info_unref ((GIBaseInfo*)class_struct); + } + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + write_attributes (file, (GIBaseInfo*) info); + + if (gi_interface_info_get_n_prerequisites (info) > 0) + { + for (unsigned int i = 0; i < gi_interface_info_get_n_prerequisites (info); i++) + { + GIBaseInfo *req = gi_interface_info_get_prerequisite (info, i); + + xml_start_element (file, "prerequisite"); + write_type_name_attribute (ns, req, "name", file); + + xml_end_element_unchecked (file); + gi_base_info_unref (req); + } + } + + for (unsigned int i = 0; i < gi_interface_info_get_n_methods (info); i++) + { + GIFunctionInfo *function = gi_interface_info_get_method (info, i); + write_function_info (ns, function, file); + gi_base_info_unref ((GIBaseInfo *)function); + } + + for (unsigned int i = 0; i < gi_interface_info_get_n_properties (info); i++) + { + GIPropertyInfo *prop = gi_interface_info_get_property (info, i); + write_property_info (ns, prop, file); + gi_base_info_unref ((GIBaseInfo *)prop); + } + + for (unsigned int i = 0; i < gi_interface_info_get_n_signals (info); i++) + { + GISignalInfo *signal = gi_interface_info_get_signal (info, i); + write_signal_info (ns, signal, file); + gi_base_info_unref ((GIBaseInfo *)signal); + } + + for (unsigned int i = 0; i < gi_interface_info_get_n_vfuncs (info); i++) + { + GIVFuncInfo *vfunc = gi_interface_info_get_vfunc (info, i); + write_vfunc_info (ns, vfunc, file); + gi_base_info_unref ((GIBaseInfo *)vfunc); + } + + for (unsigned int i = 0; i < gi_interface_info_get_n_constants (info); i++) + { + GIConstantInfo *constant = gi_interface_info_get_constant (info, i); + write_constant_info (ns, constant, file); + gi_base_info_unref ((GIBaseInfo *)constant); + } + + xml_end_element (file, "interface"); +} + +static void +write_union_info (const char *ns, + GIUnionInfo *info, + Xml *file) +{ + const char *name; + const char *type_name; + const char *type_init; + const char *func; + gboolean deprecated; + size_t size; + + name = gi_base_info_get_name ((GIBaseInfo *)info); + deprecated = gi_base_info_is_deprecated ((GIBaseInfo *)info); + + type_name = gi_registered_type_info_get_type_name ((GIRegisteredTypeInfo*)info); + type_init = gi_registered_type_info_get_type_init_function_name ((GIRegisteredTypeInfo*)info); + + /* FIXME: Add support for boxed unions */ + xml_start_element (file, "union"); + xml_printf (file, " name=\"%s\"", name); + + if (type_name) + xml_printf (file, " type-name=\"%s\" get-type=\"%s\"", type_name, type_init); + + if (deprecated) + xml_printf (file, " deprecated=\"1\""); + + size = gi_union_info_get_size (info); + if (file->show_all) + xml_printf (file, " size=\"%" G_GSIZE_FORMAT "\"", size); + + func = gi_union_info_get_copy_function_name (info); + if (func) + xml_printf (file, " copy-function=\"%s\"", func); + + func = gi_union_info_get_free_function_name (info); + if (func) + xml_printf (file, " free-function=\"%s\"", func); + + write_attributes (file, (GIBaseInfo*) info); + + if (gi_union_info_is_discriminated (info)) + { + size_t offset; + GITypeInfo *type; + + gi_union_info_get_discriminator_offset (info, &offset); + type = gi_union_info_get_discriminator_type (info); + + xml_start_element (file, "discriminator"); + xml_printf (file, " offset=\"%zu\" type=\"", offset); + write_type_info (ns, type, file); + xml_end_element (file, "discriminator"); + gi_base_info_unref ((GIBaseInfo *)type); + } + + for (unsigned int i = 0; i < gi_union_info_get_n_fields (info); i++) + { + GIFieldInfo *field = gi_union_info_get_field (info, i); + GIConstantInfo *constant = gi_union_info_get_discriminator (info, i); + write_field_info (ns, field, constant, file); + gi_base_info_unref ((GIBaseInfo *)field); + if (constant) + gi_base_info_unref ((GIBaseInfo *)constant); + } + + for (unsigned int i = 0; i < gi_union_info_get_n_methods (info); i++) + { + GIFunctionInfo *function = gi_union_info_get_method (info, i); + write_function_info (ns, function, file); + gi_base_info_unref ((GIBaseInfo *)function); + } + + xml_end_element (file, "union"); +} + + +/** + * gi_ir_writer_write: + * @repository: repository containing @ns + * @filename: (type filename): filename to write to + * @ns: GIR namespace to write + * @needs_prefix: if the filename needs prefixing + * @show_all: if field size calculations should be included + * + * Writes the output of a typelib represented by @ns + * into a GIR xml file named @filename. + * + * Since: 2.80 + */ +void +gi_ir_writer_write (GIRepository *repository, + const char *filename, + const char *ns, + gboolean needs_prefix, + gboolean show_all) +{ + FILE *ofile; + size_t i, j; + char **dependencies; + Xml *xml; + + if (filename == NULL) + ofile = stdout; + else + { + char *full_filename; + + if (needs_prefix) + full_filename = g_strdup_printf ("%s-%s", ns, filename); + else + full_filename = g_strdup (filename); + ofile = g_fopen (filename, "w"); + + if (ofile == NULL) + { + g_fprintf (stderr, "failed to open '%s': %s\n", + full_filename, g_strerror (errno)); + g_free (full_filename); + + return; + } + + g_free (full_filename); + } + + xml = xml_open (ofile); + xml->show_all = show_all; + xml_printf (xml, "\n"); + xml_start_element (xml, "repository"); + xml_printf (xml, " version=\"1.0\"\n" + " xmlns=\"http://www.gtk.org/introspection/core/1.0\"\n" + " xmlns:c=\"http://www.gtk.org/introspection/c/1.0\"\n" + " xmlns:glib=\"http://www.gtk.org/introspection/glib/1.0\""); + + dependencies = gi_repository_get_immediate_dependencies (repository, ns, NULL); + if (dependencies != NULL) + { + for (i = 0; dependencies[i]; i++) + { + char **parts = g_strsplit (dependencies[i], "-", 2); + xml_start_element (xml, "include"); + xml_printf (xml, " name=\"%s\" version=\"%s\"", parts[0], parts[1]); + xml_end_element (xml, "include"); + g_strfreev (parts); + } + } + + if (TRUE) + { + const char * const *shared_libraries; + const char *c_prefix; + const char *cur_ns = ns; + const char *cur_version; + unsigned int n_infos; + + cur_version = gi_repository_get_version (repository, cur_ns); + + shared_libraries = gi_repository_get_shared_libraries (repository, cur_ns, NULL); + c_prefix = gi_repository_get_c_prefix (repository, cur_ns); + xml_start_element (xml, "namespace"); + xml_printf (xml, " name=\"%s\" version=\"%s\"", cur_ns, cur_version); + if (shared_libraries != NULL) + { + char *shared_libraries_str = g_strjoinv (",", (char **) shared_libraries); + xml_printf (xml, " shared-library=\"%s\"", shared_libraries_str); + g_free (shared_libraries_str); + } + if (c_prefix) + xml_printf (xml, " c:prefix=\"%s\"", c_prefix); + + n_infos = gi_repository_get_n_infos (repository, cur_ns); + for (j = 0; j < n_infos; j++) + { + GIBaseInfo *info = gi_repository_get_info (repository, cur_ns, j); + + if (GI_IS_FUNCTION_INFO (info)) + write_function_info (ns, (GIFunctionInfo *)info, xml); + else if (GI_IS_CALLBACK_INFO (info)) + write_callback_info (ns, (GICallbackInfo *)info, xml); + else if (GI_IS_STRUCT_INFO (info)) + write_struct_info (ns, (GIStructInfo *)info, xml); + else if (GI_IS_UNION_INFO (info)) + write_union_info (ns, (GIUnionInfo *)info, xml); + else if (GI_IS_ENUM_INFO (info) || + GI_IS_FLAGS_INFO (info)) + write_enum_info (ns, (GIEnumInfo *)info, xml); + else if (GI_IS_CONSTANT_INFO (info)) + write_constant_info (ns, (GIConstantInfo *)info, xml); + else if (GI_IS_OBJECT_INFO (info)) + write_object_info (ns, (GIObjectInfo *)info, xml); + else if (GI_IS_INTERFACE_INFO (info)) + write_interface_info (ns, (GIInterfaceInfo *)info, xml); + else + g_error ("unknown info type %s", g_type_name (G_TYPE_FROM_INSTANCE (info))); + + gi_base_info_unref (info); + } + + xml_end_element (xml, "namespace"); + } + + xml_end_element (xml, "repository"); + + xml_free (xml); +} diff --git a/girepository/gisignalinfo.c b/girepository/gisignalinfo.c new file mode 100644 index 0000000..3a1b80c --- /dev/null +++ b/girepository/gisignalinfo.c @@ -0,0 +1,159 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Signal implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gisignalinfo.h" + +/** + * GISignalInfo: + * + * `GISignalInfo` represents a signal. + * + * It’s a sub-struct of [class@GIRepository.CallableInfo] and contains a set of + * flags and a class closure. + * + * See [class@GIRepository.CallableInfo] for information on how to retrieve + * arguments and other metadata from the signal. + * + * Since: 2.80 + */ + +/** + * gi_signal_info_get_flags: + * @info: a #GISignalInfo + * + * Obtain the flags for this signal info. + * + * See [flags@GObject.SignalFlags] for more information about possible flag + * values. + * + * Returns: the flags + * Since: 2.80 + */ +GSignalFlags +gi_signal_info_get_flags (GISignalInfo *info) +{ + GSignalFlags flags; + GIRealInfo *rinfo = (GIRealInfo *)info; + SignalBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_SIGNAL_INFO (info), 0); + + blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + flags = 0; + + if (blob->run_first) + flags = flags | G_SIGNAL_RUN_FIRST; + + if (blob->run_last) + flags = flags | G_SIGNAL_RUN_LAST; + + if (blob->run_cleanup) + flags = flags | G_SIGNAL_RUN_CLEANUP; + + if (blob->no_recurse) + flags = flags | G_SIGNAL_NO_RECURSE; + + if (blob->detailed) + flags = flags | G_SIGNAL_DETAILED; + + if (blob->action) + flags = flags | G_SIGNAL_ACTION; + + if (blob->no_hooks) + flags = flags | G_SIGNAL_NO_HOOKS; + + return flags; +} + +/** + * gi_signal_info_get_class_closure: + * @info: a #GISignalInfo + * + * Obtain the class closure for this signal if one is set. + * + * The class closure is a virtual function on the type that the signal belongs + * to. If the signal lacks a closure, `NULL` will be returned. + * + * Returns: (transfer full) (nullable): the class closure, or `NULL` if none is + * set + * Since: 2.80 + */ +GIVFuncInfo * +gi_signal_info_get_class_closure (GISignalInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SignalBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_SIGNAL_INFO (info), 0); + + blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->has_class_closure) + return gi_interface_info_get_vfunc ((GIInterfaceInfo *)rinfo->container, blob->class_closure); + + return NULL; +} + +/** + * gi_signal_info_true_stops_emit: + * @info: a #GISignalInfo + * + * Obtain if the returning `TRUE` in the signal handler will stop the emission + * of the signal. + * + * Returns: `TRUE` if returning `TRUE` stops the signal emission + * Since: 2.80 + */ +gboolean +gi_signal_info_true_stops_emit (GISignalInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SignalBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_SIGNAL_INFO (info), 0); + + blob = (SignalBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->true_stops_emit; +} + +void +gi_signal_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_SIGNAL; +} diff --git a/girepository/gisignalinfo.h b/girepository/gisignalinfo.h new file mode 100644 index 0000000..ebac506 --- /dev/null +++ b/girepository/gisignalinfo.h @@ -0,0 +1,72 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Signal + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include +#include + +G_BEGIN_DECLS + +#define GI_TYPE_SIGNAL_INFO (gi_signal_info_get_type ()) + +/** + * GI_SIGNAL_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.SignalInfo] or derived pointer into a + * `(GISignalInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_SIGNAL_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_SIGNAL_INFO, GISignalInfo)) + +/** + * GI_IS_SIGNAL_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.SignalInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_SIGNAL_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_SIGNAL_INFO)) + + +GI_AVAILABLE_IN_ALL +GSignalFlags gi_signal_info_get_flags (GISignalInfo *info); + +GI_AVAILABLE_IN_ALL +GIVFuncInfo * gi_signal_info_get_class_closure (GISignalInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_signal_info_true_stops_emit (GISignalInfo *info); + +G_END_DECLS diff --git a/girepository/gistructinfo.c b/girepository/gistructinfo.c new file mode 100644 index 0000000..a122a69 --- /dev/null +++ b/girepository/gistructinfo.c @@ -0,0 +1,367 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Struct implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gistructinfo.h" + +/** + * GIStructInfo: + * + * `GIStructInfo` represents a generic C structure type. + * + * A structure has methods and fields. + * + * Since: 2.80 + */ + +/** + * gi_struct_info_get_n_fields: + * @info: a #GIStructInfo + * + * Obtain the number of fields this structure has. + * + * Returns: number of fields + * Since: 2.80 + */ +unsigned int +gi_struct_info_get_n_fields (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; +} + +/** + * gi_struct_info_get_field_offset: + * @info: a #GIStructInfo + * @n: index of queried field + * + * Obtain the offset of the specified field. + * + * Returns: field offset, in bytes + * Since: 2.80 + */ +static size_t +gi_struct_get_field_offset (GIStructInfo *info, + uint16_t n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + size_t offset = rinfo->offset + header->struct_blob_size; + FieldBlob *field_blob; + + for (uint16_t i = 0; i < n; i++) + { + field_blob = (FieldBlob *)&rinfo->typelib->data[offset]; + offset += header->field_blob_size; + if (field_blob->has_embedded_type) + offset += header->callback_blob_size; + } + + return offset; +} + +/** + * gi_struct_info_get_field: + * @info: a #GIStructInfo + * @n: a field index + * + * Obtain the type information for field with specified index. + * + * Returns: (transfer full): The [class@GIRepository.FieldInfo]. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFieldInfo * +gi_struct_info_get_field (GIStructInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + return (GIFieldInfo *) gi_base_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, + gi_struct_get_field_offset (info, n)); +} + +/** + * gi_struct_info_find_field: + * @info: a #GIStructInfo + * @name: a field name + * + * Obtain the type information for field named @name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.FieldInfo], or + * `NULL` if not found. Free it with [method@GIRepository.BaseInfo.unref] when + * done. + * Since: 2.80 + */ +GIFieldInfo * +gi_struct_info_find_field (GIStructInfo *info, + const char *name) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + Header *header = (Header *)rinfo->typelib->data; + size_t offset = rinfo->offset + header->struct_blob_size; + + for (size_t i = 0; i < blob->n_fields; i++) + { + FieldBlob *field_blob = (FieldBlob *)&rinfo->typelib->data[offset]; + const char *fname = (const char *)&rinfo->typelib->data[field_blob->name]; + + if (strcmp (name, fname) == 0) + { + return (GIFieldInfo *) gi_base_info_new (GI_INFO_TYPE_FIELD, + (GIBaseInfo* )info, + rinfo->typelib, + offset); + } + + offset += header->field_blob_size; + if (field_blob->has_embedded_type) + offset += header->callback_blob_size; + } + + return NULL; +} + +/** + * gi_struct_info_get_n_methods: + * @info: a #GIStructInfo + * + * Obtain the number of methods this structure has. + * + * Returns: number of methods + * Since: 2.80 + */ +unsigned int +gi_struct_info_get_n_methods (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_methods; +} + +/** + * gi_struct_info_get_method: + * @info: a #GIStructInfo + * @n: a method index + * + * Obtain the type information for method with specified index. + * + * Returns: (transfer full): The [class@GIRepository.FunctionInfo]. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_struct_info_get_method (GIStructInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + Header *header = (Header *)rinfo->typelib->data; + size_t offset; + + g_return_val_if_fail (n <= G_MAXUINT16, NULL); + + offset = gi_struct_get_field_offset (info, blob->n_fields) + n * header->function_blob_size; + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_struct_info_find_method: + * @info: a #GIStructInfo + * @name: a method name + * + * Obtain the type information for method named @name. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.FunctionInfo], + * or `NULL` if none was found. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_struct_info_find_method (GIStructInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = gi_struct_get_field_offset (info, blob->n_fields); + return gi_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_methods, name); +} + +/** + * gi_struct_info_get_size: + * @info: a #GIStructInfo + * + * Obtain the total size of the structure. + * + * Returns: size of the structure, in bytes + * Since: 2.80 + */ +size_t +gi_struct_info_get_size (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->size; +} + +/** + * gi_struct_info_get_alignment: + * @info: a #GIStructInfo + * + * Obtain the required alignment of the structure. + * + * Returns: required alignment, in bytes + * Since: 2.80 + */ +size_t +gi_struct_info_get_alignment (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->alignment; +} + +/** + * gi_struct_info_is_foreign: + * @info: a #GIStructInfo + * + * Gets whether the structure is foreign, i.e. if it’s expected to be overridden + * by a native language binding instead of relying of introspected bindings. + * + * Returns: `TRUE` if the structure is foreign + * Since: 2.80 + */ +gboolean +gi_struct_info_is_foreign (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->foreign; +} + +/** + * gi_struct_info_is_gtype_struct: + * @info: a #GIStructInfo + * + * Return true if this structure represents the ‘class structure’ for some + * [class@GObject.Object] or `GInterface`. + * + * This function is mainly useful to hide this kind of structure from generated + * public APIs. + * + * Returns: `TRUE` if this is a class struct, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_struct_info_is_gtype_struct (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->is_gtype_struct; +} + +/** + * gi_struct_info_get_copy_function_name: + * @info: a struct information blob + * + * Retrieves the name of the copy function for @info, if any is set. + * + * Returns: (transfer none) (nullable): the name of the copy function, or `NULL` + * if the structure has no copy function + * Since: 2.80 + */ +const char * +gi_struct_info_get_copy_function_name (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_STRUCT_INFO (info), NULL); + + blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->copy_func) + return gi_typelib_get_string (rinfo->typelib, blob->copy_func); + + return NULL; +} + +/** + * gi_struct_info_get_free_function_name: + * @info: a struct information blob + * + * Retrieves the name of the free function for @info, if any is set. + * + * Returns: (transfer none) (nullable): the name of the free function, or `NULL` + * if the structure has no free function + * Since: 2.80 + */ +const char * +gi_struct_info_get_free_function_name (GIStructInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + StructBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_STRUCT_INFO (info), NULL); + + blob = (StructBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->free_func) + return gi_typelib_get_string (rinfo->typelib, blob->free_func); + + return NULL; +} + +void +gi_struct_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_STRUCT; +} diff --git a/girepository/gistructinfo.h b/girepository/gistructinfo.h new file mode 100644 index 0000000..c9e82ce --- /dev/null +++ b/girepository/gistructinfo.h @@ -0,0 +1,102 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Struct + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_STRUCT_INFO (gi_struct_info_get_type ()) + +/** + * GI_STRUCT_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.StructInfo] or derived pointer into a + * `(GIStructInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_STRUCT_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_STRUCT_INFO, GIStructInfo)) + +/** + * GI_IS_STRUCT_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.StructInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_STRUCT_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_STRUCT_INFO)) + + +GI_AVAILABLE_IN_ALL +unsigned int gi_struct_info_get_n_fields (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +GIFieldInfo * gi_struct_info_get_field (GIStructInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIFieldInfo * gi_struct_info_find_field (GIStructInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +unsigned int gi_struct_info_get_n_methods (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_struct_info_get_method (GIStructInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_struct_info_find_method (GIStructInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +size_t gi_struct_info_get_size (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +size_t gi_struct_info_get_alignment (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_struct_info_is_gtype_struct (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_struct_info_is_foreign (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_struct_info_get_copy_function_name (GIStructInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_struct_info_get_free_function_name (GIStructInfo *info); + +G_END_DECLS diff --git a/girepository/gitypeinfo.c b/girepository/gitypeinfo.c new file mode 100644 index 0000000..e07ab8e --- /dev/null +++ b/girepository/gitypeinfo.c @@ -0,0 +1,644 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Type implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "gitypeinfo.h" + +/** + * GITypeInfo: + * + * `GITypeInfo` represents a type, including information about direction and + * transfer. + * + * You can retrieve a type info from an argument (see + * [class@GIRepository.ArgInfo]), a function’s return value (see + * [class@GIRepository.FunctionInfo]), a field (see + * [class@GIRepository.FieldInfo]), a property (see + * [class@GIRepository.PropertyInfo]), a constant (see + * [class@GIRepository.ConstantInfo]) or for a union discriminator (see + * [class@GIRepository.UnionInfo]). + * + * A type can either be a of a basic type which is a standard C primitive + * type or an interface type. For interface types you need to call + * [method@GIRepository.TypeInfo.get_interface] to get a reference to the base + * info for that interface. + * + * Since: 2.80 + */ + +/** + * gi_type_info_is_pointer: + * @info: a #GITypeInfo + * + * Obtain if the type is passed as a reference. + * + * Note that the types of `GI_DIRECTION_OUT` and `GI_DIRECTION_INOUT` parameters + * will only be pointers if the underlying type being transferred is a pointer + * (i.e. only if the type of the C function’s formal parameter is a pointer to a + * pointer). + * + * Returns: `TRUE` if it is a pointer + * Since: 2.80 + */ +gboolean +gi_type_info_is_pointer (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), FALSE); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (type->flags.reserved == 0 && type->flags.reserved2 == 0) + return type->flags.pointer; + else + { + InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + return iface->pointer; + } +} + +/** + * gi_type_info_get_tag: + * @info: a #GITypeInfo + * + * Obtain the type tag for the type. + * + * See [type@GIRepository.TypeTag] for a list of type tags. + * + * Returns: the type tag + * Since: 2.80 + */ +GITypeTag +gi_type_info_get_tag (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, GI_TYPE_TAG_BOOLEAN); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), GI_TYPE_TAG_BOOLEAN); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (rinfo->type_is_embedded) + return GI_TYPE_TAG_INTERFACE; + else if (type->flags.reserved == 0 && type->flags.reserved2 == 0) + return type->flags.tag; + else + { + InterfaceTypeBlob *iface = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + return iface->tag; + } +} + +/** + * gi_type_info_get_param_type: + * @info: a #GITypeInfo + * @n: index of the parameter + * + * Obtain the parameter type @n, or `NULL` if the type is not an array. + * + * Returns: (transfer full) (nullable): the param type info, or `NULL` if the + * type is not an array + * Since: 2.80 + */ +GITypeInfo * +gi_type_info_get_param_type (GITypeInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), NULL); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ParamTypeBlob *param = (ParamTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + switch (param->tag) + { + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, + rinfo->offset + sizeof (ParamTypeBlob) + + sizeof (SimpleTypeBlob) * n); + break; + default: + break; + } + } + + return NULL; +} + +/** + * gi_type_info_get_interface: + * @info: a #GITypeInfo + * + * For types which have `GI_TYPE_TAG_INTERFACE` such as [class@GObject.Object]s + * and boxed values, this function returns full information about the referenced + * type. + * + * You can then inspect the type of the returned [class@GIRepository.BaseInfo] + * to further query whether it is a concrete [class@GObject.Object], an + * interface, a structure, etc., using the type checking macros like + * [func@GIRepository.IS_OBJECT_INFO], or raw [type@GObject.Type]s with + * [func@GObject.TYPE_FROM_INSTANCE]. + * + * Returns: (transfer full) (nullable): The [class@GIRepository.BaseInfo], or + * `NULL`. Free it with gi_base_info_unref() when done. + * Since: 2.80 + */ +GIBaseInfo * +gi_type_info_get_interface (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), NULL); + + /* For embedded types, the given offset is a pointer to the actual blob, + * after the end of the field. In that case we know it's a "subclass" of + * CommonBlob, so use that to determine the info type. + */ + if (rinfo->type_is_embedded) + { + CommonBlob *common = (CommonBlob *)&rinfo->typelib->data[rinfo->offset]; + GIInfoType info_type; + + switch (common->blob_type) + { + case BLOB_TYPE_CALLBACK: + info_type = GI_INFO_TYPE_CALLBACK; + break; + default: + g_assert_not_reached (); + return NULL; + } + return (GIBaseInfo *) gi_base_info_new (info_type, (GIBaseInfo*)info, rinfo->typelib, + rinfo->offset); + } + else + { + SimpleTypeBlob *type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + InterfaceTypeBlob *blob = (InterfaceTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_INTERFACE) + return gi_info_from_entry (rinfo->repository, rinfo->typelib, blob->interface); + } + } + + return NULL; +} + +/** + * gi_type_info_get_array_length_index: + * @info: a #GITypeInfo + * @out_length_index: (out) (optional): return location for the length argument + * + * Obtain the position of the argument which gives the array length of the type. + * + * The type tag must be a `GI_TYPE_TAG_ARRAY` with a length argument, or `FALSE` + * will be returned. + * + * Returns: `TRUE` if the type is an array and has a length argument + * Since: 2.80 + */ +gboolean +gi_type_info_get_array_length_index (GITypeInfo *info, + unsigned int *out_length_index) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), FALSE); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + { + if (blob->has_length) + { + if (out_length_index != NULL) + *out_length_index = blob->dimensions.length; + return TRUE; + } + } + } + + if (out_length_index != NULL) + *out_length_index = 0; + return FALSE; +} + +/** + * gi_type_info_get_array_fixed_size: + * @info: a #GITypeInfo + * @out_size: (out) (optional): return location for the array size + * + * Obtain the fixed array size of the type, in number of elements (not bytes). + * + * The type tag must be a `GI_TYPE_TAG_ARRAY` with a fixed size, or `FALSE` will + * be returned. + * + * Returns: `TRUE` if the type is an array and has a fixed size + * Since: 2.80 + */ +gboolean +gi_type_info_get_array_fixed_size (GITypeInfo *info, + size_t *out_size) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), FALSE); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + { + if (blob->has_size) + { + if (out_size != NULL) + *out_size = blob->dimensions.size; + return TRUE; + } + } + } + + if (out_size != NULL) + *out_size = 0; + return FALSE; +} + +/** + * gi_type_info_is_zero_terminated: + * @info: a #GITypeInfo + * + * Obtain if the last element of the array is `NULL`. + * + * The type tag must be a `GI_TYPE_TAG_ARRAY` or `FALSE` will be returned. + * + * Returns: `TRUE` if zero terminated + * Since: 2.80 + */ +gboolean +gi_type_info_is_zero_terminated (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), FALSE); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->tag == GI_TYPE_TAG_ARRAY) + return blob->zero_terminated; + } + + return FALSE; +} + +/** + * gi_type_info_get_array_type: + * @info: a #GITypeInfo + * + * Obtain the array type for this type. + * + * See [enum@GIRepository.ArrayType] for a list of possible values. + * + * It is an error to call this on an @info which is not an array type. Use + * [method@GIRepository.TypeInfo.get_tag] to check. + * + * Returns: the array type + * Since: 2.80 + */ +GIArrayType +gi_type_info_get_array_type (GITypeInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + SimpleTypeBlob *type; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_TYPE_INFO (info), -1); + + type = (SimpleTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!(type->flags.reserved == 0 && type->flags.reserved2 == 0)) + { + ArrayTypeBlob *blob = (ArrayTypeBlob *)&rinfo->typelib->data[rinfo->offset]; + g_return_val_if_fail (blob->tag == GI_TYPE_TAG_ARRAY, -1); + + return blob->array_type; + } + + /* Not an array type */ + g_assert_not_reached (); +} + +/** + * gi_type_info_get_storage_type: + * @info: a #GITypeInfo + * + * Obtain the type tag corresponding to the underlying storage type in C for + * the type. + * + * See [type@GIRepository.TypeTag] for a list of type tags. + * + * Returns: the type tag + * Since: 2.80 + */ +GITypeTag +gi_type_info_get_storage_type (GITypeInfo *info) +{ + GITypeTag type_tag = gi_type_info_get_tag (info); + + if (type_tag == GI_TYPE_TAG_INTERFACE) + { + GIBaseInfo *interface = gi_type_info_get_interface (info); + GIInfoType info_type = gi_base_info_get_info_type (interface); + if (info_type == GI_INFO_TYPE_ENUM || info_type == GI_INFO_TYPE_FLAGS) + type_tag = gi_enum_info_get_storage_type ((GIEnumInfo *) interface); + gi_base_info_unref (interface); + } + + return type_tag; +} + +/** + * gi_type_tag_argument_from_hash_pointer: + * @storage_type: a [type@GIRepository.TypeTag] obtained from + * [method@GIRepository.TypeInfo.get_storage_type] + * @hash_pointer: a pointer, such as a [struct@GLib.HashTable] data pointer + * @arg: (out caller-allocates) (not nullable): a [type@GIRepository.Argument] + * to fill in + * + * Convert a data pointer from a GLib data structure to a + * [type@GIRepository.Argument]. + * + * GLib data structures, such as [type@GLib.List], [type@GLib.SList], and + * [type@GLib.HashTable], all store data pointers. + * + * In the case where the list or hash table is storing single types rather than + * structs, these data pointers may have values stuffed into them via macros + * such as `GPOINTER_TO_INT`. + * + * Use this function to ensure that all values are correctly extracted from + * stuffed pointers, regardless of the machine’s architecture or endianness. + * + * This function fills in the appropriate field of @arg with the value extracted + * from @hash_pointer, depending on @storage_type. + * + * Since: 2.80 + */ +void +gi_type_tag_argument_from_hash_pointer (GITypeTag storage_type, + void *hash_pointer, + GIArgument *arg) +{ + switch (storage_type) + { + case GI_TYPE_TAG_BOOLEAN: + arg->v_boolean = !!GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_INT8: + arg->v_int8 = (int8_t) GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT8: + arg->v_uint8 = (uint8_t) GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_INT16: + arg->v_int16 = (int16_t) GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT16: + arg->v_uint16 = (uint16_t) GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_INT32: + arg->v_int32 = (int32_t) GPOINTER_TO_INT (hash_pointer); + break; + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + arg->v_uint32 = (uint32_t) GPOINTER_TO_UINT (hash_pointer); + break; + case GI_TYPE_TAG_GTYPE: + arg->v_size = GPOINTER_TO_SIZE (hash_pointer); + break; + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_INTERFACE: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + arg->v_pointer = hash_pointer; + break; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + default: + g_critical ("Unsupported storage type for pointer-stuffing: %s", + gi_type_tag_to_string (storage_type)); + arg->v_pointer = hash_pointer; + } +} + +/** + * gi_type_info_argument_from_hash_pointer: + * @info: a #GITypeInfo + * @hash_pointer: a pointer, such as a [struct@GLib.HashTable] data pointer + * @arg: (out caller-allocates): a [type@GIRepository.Argument] to fill in + * + * Convert a data pointer from a GLib data structure to a + * [type@GIRepository.Argument]. + * + * GLib data structures, such as [type@GLib.List], [type@GLib.SList], and + * [type@GLib.HashTable], all store data pointers. + * + * In the case where the list or hash table is storing single types rather than + * structs, these data pointers may have values stuffed into them via macros + * such as `GPOINTER_TO_INT`. + * + * Use this function to ensure that all values are correctly extracted from + * stuffed pointers, regardless of the machine’s architecture or endianness. + * + * This function fills in the appropriate field of @arg with the value extracted + * from @hash_pointer, depending on the storage type of @info. + * + * Since: 2.80 + */ +void +gi_type_info_argument_from_hash_pointer (GITypeInfo *info, + void *hash_pointer, + GIArgument *arg) +{ + GITypeTag storage_type = gi_type_info_get_storage_type (info); + gi_type_tag_argument_from_hash_pointer (storage_type, hash_pointer, + arg); +} + +/** + * gi_type_tag_hash_pointer_from_argument: + * @storage_type: a [type@GIRepository.TypeTag] obtained from + * [method@GIRepository.TypeInfo.get_storage_type] + * @arg: a [type@GIRepository.Argument] with the value to stuff into a pointer + * + * Convert a [type@GIRepository.Argument] to data pointer for use in a GLib + * data structure. + * + * GLib data structures, such as [type@GLib.List], [type@GLib.SList], and + * [type@GLib.HashTable], all store data pointers. + * + * In the case where the list or hash table is storing single types rather than + * structs, these data pointers may have values stuffed into them via macros + * such as `GPOINTER_TO_INT`. + * + * Use this function to ensure that all values are correctly stuffed into + * pointers, regardless of the machine’s architecture or endianness. + * + * This function returns a pointer stuffed with the appropriate field of @arg, + * depending on @storage_type. + * + * Returns: A stuffed pointer, that can be stored in a [struct@GLib.HashTable], + * for example + * Since: 2.80 + */ +void * +gi_type_tag_hash_pointer_from_argument (GITypeTag storage_type, + GIArgument *arg) +{ + switch (storage_type) + { + case GI_TYPE_TAG_BOOLEAN: + return GINT_TO_POINTER (arg->v_boolean); + case GI_TYPE_TAG_INT8: + return GINT_TO_POINTER (arg->v_int8); + case GI_TYPE_TAG_UINT8: + return GUINT_TO_POINTER (arg->v_uint8); + case GI_TYPE_TAG_INT16: + return GINT_TO_POINTER (arg->v_int16); + case GI_TYPE_TAG_UINT16: + return GUINT_TO_POINTER (arg->v_uint16); + case GI_TYPE_TAG_INT32: + return GINT_TO_POINTER (arg->v_int32); + case GI_TYPE_TAG_UINT32: + case GI_TYPE_TAG_UNICHAR: + return GUINT_TO_POINTER (arg->v_uint32); + case GI_TYPE_TAG_GTYPE: + return GSIZE_TO_POINTER (arg->v_size); + case GI_TYPE_TAG_UTF8: + case GI_TYPE_TAG_FILENAME: + case GI_TYPE_TAG_INTERFACE: + case GI_TYPE_TAG_ARRAY: + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + case GI_TYPE_TAG_GHASH: + case GI_TYPE_TAG_ERROR: + return arg->v_pointer; + case GI_TYPE_TAG_INT64: + case GI_TYPE_TAG_UINT64: + case GI_TYPE_TAG_FLOAT: + case GI_TYPE_TAG_DOUBLE: + default: + g_critical ("Unsupported storage type for pointer-stuffing: %s", + gi_type_tag_to_string (storage_type)); + return arg->v_pointer; + } +} + +/** + * gi_type_info_hash_pointer_from_argument: + * @info: a #GITypeInfo + * @arg: a [struct@GIRepository.Argument] with the value to stuff into a pointer + * + * Convert a [type@GIRepository.Argument] to data pointer for use in a GLib + * data structure. + * + * GLib data structures, such as [type@GLib.List], [type@GLib.SList], and + * [type@GLib.HashTable], all store data pointers. + * + * In the case where the list or hash table is storing single types rather than + * structs, these data pointers may have values stuffed into them via macros + * such as `GPOINTER_TO_INT`. + * + * Use this function to ensure that all values are correctly stuffed into + * pointers, regardless of the machine’s architecture or endianness. + * + * This function returns a pointer stuffed with the appropriate field of @arg, + * depending on the storage type of @info. + * + * Returns: A stuffed pointer, that can be stored in a [struct@GLib.HashTable], + * for example + * Since: 2.80 + */ +void * +gi_type_info_hash_pointer_from_argument (GITypeInfo *info, + GIArgument *arg) +{ + GITypeTag storage_type = gi_type_info_get_storage_type (info); + return gi_type_tag_hash_pointer_from_argument (storage_type, arg); +} + +void +gi_type_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_TYPE; +} diff --git a/girepository/gitypeinfo.h b/girepository/gitypeinfo.h new file mode 100644 index 0000000..73f0ce4 --- /dev/null +++ b/girepository/gitypeinfo.h @@ -0,0 +1,144 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Type + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_TYPE_INFO (gi_type_info_get_type ()) + +/** + * GI_TYPE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.TypeInfo] or derived pointer into a + * `(GITypeInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_TYPE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_TYPE_INFO, GITypeInfo)) + +/** + * GI_IS_TYPE_INFO: + * @info: an info structure + * + * Checks if @info is a [alias@GIRepository.TypeInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_TYPE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_TYPE_INFO)) + +/** + * GI_TYPE_TAG_IS_BASIC: + * @tag: a type tag + * + * Checks if @tag is a basic type. + * + * Since: 2.80 + */ +#define GI_TYPE_TAG_IS_BASIC(tag) ((tag) < GI_TYPE_TAG_ARRAY || (tag) == GI_TYPE_TAG_UNICHAR) + +/** + * GI_TYPE_TAG_IS_NUMERIC: + * @tag: a type tag + * + * Checks if @tag is a numeric type. That is, integer or floating point. + * + * Since: 2.80 + */ +#define GI_TYPE_TAG_IS_NUMERIC(tag) ((tag) >= GI_TYPE_TAG_INT8 && (tag) <= GI_TYPE_TAG_DOUBLE) + +/** + * GI_TYPE_TAG_IS_CONTAINER: + * @tag: a type tag + * + * Checks if @tag is a container type. That is, a type which may have a nonnull + * return from [method@GIRepository.TypeInfo.get_param_type]. + * + * Since: 2.80 + */ + #define GI_TYPE_TAG_IS_CONTAINER(tag) ((tag) == GI_TYPE_TAG_ARRAY || \ + ((tag) >= GI_TYPE_TAG_GLIST && (tag) <= GI_TYPE_TAG_GHASH)) + +GI_AVAILABLE_IN_ALL +const char * gi_type_tag_to_string (GITypeTag type); + +GI_AVAILABLE_IN_ALL +gboolean gi_type_info_is_pointer (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeTag gi_type_info_get_tag (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_type_info_get_param_type (GITypeInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +GIBaseInfo * gi_type_info_get_interface (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_type_info_get_array_length_index (GITypeInfo *info, + unsigned int *out_length_index); + +GI_AVAILABLE_IN_ALL +gboolean gi_type_info_get_array_fixed_size (GITypeInfo *info, + size_t *out_size); + +GI_AVAILABLE_IN_ALL +gboolean gi_type_info_is_zero_terminated (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +GIArrayType gi_type_info_get_array_type (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +GITypeTag gi_type_info_get_storage_type (GITypeInfo *info); + +GI_AVAILABLE_IN_ALL +void gi_type_info_argument_from_hash_pointer (GITypeInfo *info, + void *hash_pointer, + GIArgument *arg); + +GI_AVAILABLE_IN_ALL +void * gi_type_info_hash_pointer_from_argument (GITypeInfo *info, + GIArgument *arg); + +GI_AVAILABLE_IN_ALL +void gi_type_tag_argument_from_hash_pointer (GITypeTag storage_type, + void *hash_pointer, + GIArgument *arg); + +GI_AVAILABLE_IN_ALL +void * gi_type_tag_hash_pointer_from_argument (GITypeTag storage_type, + GIArgument *arg); + +G_END_DECLS diff --git a/girepository/gitypelib-internal.h b/girepository/gitypelib-internal.h new file mode 100644 index 0000000..f7b928f --- /dev/null +++ b/girepository/gitypelib-internal.h @@ -0,0 +1,1421 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: struct definitions for the binary + * typelib format, validation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#include +#include "girepository.h" + +G_BEGIN_DECLS + +/** + * SECTION:gitypelib-internal + * @title: GITypelib Internals + * @short_description: Layout and accessors for typelib + * @stability: Stable + * + * The ‘typelib’ is a binary, readonly, memory-mappable database + * containing reflective information about a GObject library. + * + * What the typelib describes and the types used are the same for every + * platform so, apart the endianness of its scalar values, the typelib + * database must be considered architecture-independent. + * + * The format of GObject typelib is strongly influenced by the Mozilla XPCOM + * format. + * + * Some of the differences to XPCOM include: + * + * - Type information is stored not quite as compactly (XPCOM stores it inline + * in function descriptions in variable-sized blobs of 1 to n bytes. We store + * 16 bits of type information for each parameter, which is enough to encode + * simple types inline. Complex (e.g. recursive) types are stored out of line + * in a separate list of types. + * - String and complex type data is stored outside of typelib entry blobs, + * references are stored as offsets relative to the start of the typelib. + * One possibility is to store the strings and types in a pools at the end + * of the typelib. + * + * The typelib has the following general format: + * + * ``` + * typelib ::= header, section-index, directory, blobs, attributes, attributedata + * + * directory ::= list of entries + * + * entry ::= blob type, name, namespace, offset + * blob ::= function|callback|struct|boxed|enum|flags|object|interface|constant|union + * attribute ::= offset, key, value + * attributedata ::= string data for attributes + * ``` + * + * ## Details + * + * We describe the fragments that make up the typelib in the form of C structs + * (although some fall short of being valid C structs since they contain + * multiple flexible arrays). + * + * Since: 2.80 + */ + +/* +TYPELIB HISTORY +----- + +Version 1.1 +- Add ref/unref/set-value/get-value functions to Object, to be able + to support instantiatable fundamental types which are not GObject based. + +Version 1.0 +- Rename class_struct to gtype_struct, add to interfaces + +Changes since 0.9: +- Add padding to structures + +Changes since 0.8: +- Add class struct concept to ObjectBlob +- Add is_class_struct bit to StructBlob + +Changes since 0.7: +- Add dependencies + +Changes since 0.6: +- rename metadata to typelib, to follow xpcom terminology + +Changes since 0.5: +- basic type cleanup: + + remove GString + + add [u]int, [u]long, [s]size_t + + rename string to utf8, add filename +- allow blob_type to be zero for non-local entries + +Changes since 0.4: +- add a UnionBlob + +Changes since 0.3: +- drop short_name for ValueBlob + +Changes since 0.2: +- make inline types 4 bytes after all, remove header->types and allow + types to appear anywhere +- allow error domains in the directory + +Changes since 0.1: + +- drop comments about _GOBJ_METADATA +- drop string pool, strings can appear anywhere +- use 'blob' as collective name for the various blob types +- rename 'type' field in blobs to 'blob_type' +- rename 'type_name' and 'type_init' fields to 'gtype_name', 'gtype_init' +- shrink directory entries to 12 bytes +- merge struct and boxed blobs +- split interface blobs into enum, object and interface blobs +- add an 'unregistered' flag to struct and enum blobs +- add a 'wraps_vfunc' flag to function blobs and link them to + the vfuncs they wrap +- restrict value blobs to only occur inside enums and flags again +- add constant blobs, allow them toplevel, in interfaces and in objects +- rename 'receiver_owns_value' and 'receiver_owns_container' to + 'transfer_ownership' and 'transfer_container_ownership' +- add a 'struct_offset' field to virtual function and field blobs +- add 'dipper' and 'optional' flags to arg blobs +- add a 'true_stops_emit' flag to signal blobs +- add variable blob sizes to header +- store offsets to signature blobs instead of including them directly +- change the type offset to be measured in words rather than bytes +*/ + +/** + * GI_IR_MAGIC: + * + * Identifying prefix for the typelib. + * + * This was inspired by XPCOM, which in turn borrowed from PNG. + * + * Since: 2.80 + */ +#define GI_IR_MAGIC "GOBJ\nMETADATA\r\n\032" + +/** + * GITypelibBlobType: + * @BLOB_TYPE_INVALID: Should not appear in code + * @BLOB_TYPE_FUNCTION: A #FunctionBlob + * @BLOB_TYPE_CALLBACK: A #CallbackBlob + * @BLOB_TYPE_STRUCT: A #StructBlob + * @BLOB_TYPE_BOXED: Can be either a #StructBlob or #UnionBlob + * @BLOB_TYPE_ENUM: An #EnumBlob + * @BLOB_TYPE_FLAGS: An #EnumBlob + * @BLOB_TYPE_OBJECT: An #ObjectBlob + * @BLOB_TYPE_INTERFACE: An #InterfaceBlob + * @BLOB_TYPE_CONSTANT: A #ConstantBlob + * @BLOB_TYPE_INVALID_0: Deleted, used to be ErrorDomain. + * @BLOB_TYPE_UNION: A #UnionBlob + * + * The integral value of this enumeration appears in each "Blob" component of + * a typelib to identify its type. + * + * Since: 2.80 + */ +typedef enum { + /* The values here must be kept in sync with GIInfoType */ + BLOB_TYPE_INVALID, + BLOB_TYPE_FUNCTION, + BLOB_TYPE_CALLBACK, + BLOB_TYPE_STRUCT, + BLOB_TYPE_BOXED, + BLOB_TYPE_ENUM, + BLOB_TYPE_FLAGS, + BLOB_TYPE_OBJECT, + BLOB_TYPE_INTERFACE, + BLOB_TYPE_CONSTANT, + BLOB_TYPE_INVALID_0, + BLOB_TYPE_UNION +} GITypelibBlobType; + + +#if defined (G_CAN_INLINE) && defined (G_ALWAYS_INLINE) + +G_ALWAYS_INLINE +inline gboolean +_blob_is_registered_type (GITypelibBlobType blob_type) +{ + switch (blob_type) + { + case BLOB_TYPE_STRUCT: + case BLOB_TYPE_UNION: + case BLOB_TYPE_ENUM: + case BLOB_TYPE_FLAGS: + case BLOB_TYPE_OBJECT: + case BLOB_TYPE_INTERFACE: + return TRUE; + default: + return FALSE; + } +} + +#define BLOB_IS_REGISTERED_TYPE(blob) \ + _blob_is_registered_type ((GITypelibBlobType) (blob)->blob_type) + +#else + +#define BLOB_IS_REGISTERED_TYPE(blob) \ + ((blob)->blob_type == BLOB_TYPE_STRUCT || \ + (blob)->blob_type == BLOB_TYPE_UNION || \ + (blob)->blob_type == BLOB_TYPE_ENUM || \ + (blob)->blob_type == BLOB_TYPE_FLAGS || \ + (blob)->blob_type == BLOB_TYPE_OBJECT || \ + (blob)->blob_type == BLOB_TYPE_INTERFACE) + +#endif /* defined (G_CAN_INLINE) && defined (G_ALWAYS_INLINE) */ + +/** + * Header: + * @magic: See #GI_IR_MAGIC. + * @major_version: The major version number of the typelib format. Major version + * number changes indicate incompatible changes to the tyeplib format. + * @minor_version: The minor version number of the typelib format. Minor version + * number changes indicate compatible changes and should still allow the + * typelib to be parsed by a parser designed for the same @major_version. + * @reserved: Reserved for future use. + * @n_entries: The number of entries in the directory. + * @n_local_entries: The number of entries referring to blobs in this typelib. + * The local entries must occur before the unresolved entries. + * @directory: Offset of the directory in the typelib. + * @n_attributes: Number of attribute blocks + * @attributes: Offset of the list of attributes in the typelib. + * @dependencies: Offset of a single string, which is the list of immediate + * dependencies, separated by the '|' character. The dependencies are + * required in order to avoid having programs consuming a typelib check for + * an "Unresolved" type return from every API call. + * @size: The size in bytes of the typelib. + * @namespace: Offset of the namespace string in the typelib. + * @nsversion: Offset of the namespace version string in the typelib. + * @shared_library: This field is the set of shared libraries associated with + * the typelib. The entries are separated by the '|' (pipe) character. + * @c_prefix: The prefix for the function names of the library + * @entry_blob_size: The sizes of fixed-size blobs. Recording this information + * here allows to write parser which continue to work if the format is + * extended by adding new fields to the end of the fixed-size blobs. + * @function_blob_size: See @entry_blob_size. + * @callback_blob_size: See @entry_blob_size. + * @signal_blob_size: See @entry_blob_size. + * @vfunc_blob_size: See @entry_blob_size. + * @arg_blob_size: See @entry_blob_size. + * @property_blob_size: See @entry_blob_size. + * @field_blob_size: See @entry_blob_size. + * @value_blob_size: See @entry_blob_size. + * @attribute_blob_size: See @entry_blob_size. + * @constant_blob_size: See @entry_blob_size. + * @error_domain_blob_size: See @entry_blob_size. + * @signature_blob_size: See @entry_blob_size. + * @enum_blob_size: See @entry_blob_size. + * @struct_blob_size: See @entry_blob_size. + * @object_blob_size: See @entry_blob_size. + * @interface_blob_size: For variable-size blobs, the size of the struct up to + * the first flexible array member. Recording this information here allows + * to write parser which continue to work if the format is extended by + * adding new fields before the first flexible array member in + * variable-size blobs. + * @union_blob_size: See @entry_blob_size. + * @sections: Offset of section blob array + * @padding: TODO + * + * The header structure appears exactly once at the beginning of a typelib. It is a + * collection of meta-information, such as the number of entries and dependencies. + * + * Since: 2.80 + */ +typedef struct { + char magic[16]; + uint8_t major_version; + uint8_t minor_version; + uint16_t reserved; + uint16_t n_entries; + uint16_t n_local_entries; + uint32_t directory; + uint32_t n_attributes; + uint32_t attributes; + + uint32_t dependencies; + + uint32_t size; + uint32_t namespace; + uint32_t nsversion; + uint32_t shared_library; + uint32_t c_prefix; + + uint16_t entry_blob_size; + uint16_t function_blob_size; + uint16_t callback_blob_size; + uint16_t signal_blob_size; + uint16_t vfunc_blob_size; + uint16_t arg_blob_size; + uint16_t property_blob_size; + uint16_t field_blob_size; + uint16_t value_blob_size; + uint16_t attribute_blob_size; + uint16_t constant_blob_size; + uint16_t error_domain_blob_size; + + uint16_t signature_blob_size; + uint16_t enum_blob_size; + uint16_t struct_blob_size; + uint16_t object_blob_size; + uint16_t interface_blob_size; + uint16_t union_blob_size; + + uint32_t sections; + + uint16_t padding[6]; +} Header; + +/** + * SectionType: + * @GI_SECTION_END: TODO + * @GI_SECTION_DIRECTORY_INDEX: TODO + * + * TODO + * + * Since: 2.80 + */ +typedef enum { + GI_SECTION_END = 0, + GI_SECTION_DIRECTORY_INDEX = 1 +} SectionType; + +/** + * Section: + * @id: A #SectionType + * @offset: Integer offset for this section + * + * A section is a blob of data that's (at least theoretically) optional, + * and may or may not be present in the typelib. Presently, just used + * for the directory index. This allows a form of dynamic extensibility + * with different tradeoffs from the format minor version. + * + * Since: 2.80 + */ +typedef struct { + uint32_t id; + uint32_t offset; +} Section; + + +/** + * DirEntry: + * @blob_type: A #GITypelibBlobType + * @local: Whether this entry refers to a blob in this typelib. + * @reserved: Reserved for future use. + * @name: The name of the entry. + * @offset: If is_local is set, this is the offset of the blob in the typelib. + * Otherwise, it is the offset of the namespace in which the blob has to be + * looked up by name. + * + * References to directory entries are stored as 1-based 16-bit indexes. + * + * All blobs pointed to by a directory entry start with the same layout for + * the first 8 bytes (the reserved flags may be used by some blob types) + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + + uint16_t local : 1; + uint16_t reserved :15; + uint32_t name; + uint32_t offset; +} DirEntry; + +/** + * SimpleTypeBlobFlags: + * @reserved: Reserved for future use. + * @reserved2: Reserved for future use. + * @pointer: TODO + * @reserved3: Reserved for future use. + * @tag: A #GITypeTag + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + unsigned reserved : 8; + unsigned reserved2 :16; + unsigned pointer : 1; + unsigned reserved3 : 2; + unsigned tag : 5; +} SimpleTypeBlobFlags; + +union _SimpleTypeBlob +{ + SimpleTypeBlobFlags flags; + uint32_t offset; +}; + +/** + * SimpleTypeBlob: + * @flags: TODO + * @offset: Offset relative to header->types that points to a TypeBlob. + * Unlike other offsets, this is in words (ie 32bit units) rather + * than bytes. + * + * The SimpleTypeBlob is the general purpose "reference to a type" construct, + * used in method parameters, returns, callback definitions, fields, constants, + * etc. It's actually just a 32 bit integer which you can see from the union + * definition. This is for efficiency reasons, since there are so many + * references to types. + * + * SimpleTypeBlob is divided into two cases; first, if "reserved" and + * "reserved2" are both zero, the type tag for a basic type is embedded in the + * "tag" bits. This allows e.g. GI_TYPE_TAG_UTF8, GI_TYPE_TAG_INT and the like + * to be embedded directly without taking up extra space. + * + * References to "interfaces" (objects, interfaces) are more complicated; + * In this case, the integer is actually an offset into the directory (see + * above). Because the header is larger than 2^8=256 bits, all offsets will + * have one of the upper 24 bits set. + * + * Since: 2.80 + */ +typedef union _SimpleTypeBlob SimpleTypeBlob; + +/** + * ArgBlob: + * @name: A suggested name for the parameter. + * @in: The parameter is an input to the function + * @out: The parameter is used to return an output of the function. Parameters + * can be both in and out. Out parameters implicitly add another level of + * indirection to the parameter type. Ie if the type is uint32 in an out + * parameter, the function actually takes an uint32*. + * @caller_allocates: The parameter is a pointer to a struct or object that + * will receive an output of the function. + * @nullable: Only meaningful for types which are passed as pointers. For an + * in parameter, indicates if it is ok to pass NULL in. Gor an out + * parameter, indicates whether it may return NULL. Note that NULL is a + * valid GList and GSList value, thus allow_none will normally be set + * for parameters of these types. + * @optional: For an out parameter, indicates that NULL may be passed in + * if the value is not needed. + * @transfer_ownership: For an in parameter, indicates that the function takes + * over ownership of the parameter value. For an out parameter, it indicates + * that the caller is responsible for freeing the return value. + * @transfer_container_ownership: For container types, indicates that the + * ownership of the container, but not of its contents is transferred. + * This is typically the case for out parameters returning lists of + * statically allocated things. + * @return_value: The parameter should be considered the return value of the + * function. Only out parameters can be marked as return value, and there + * can be at most one per function call. If an out parameter is marked as + * return value, the actual return value of the function should be either + * void or a boolean indicating the success of the call. + * @scope: A #GIScopeType. If the parameter is of a callback type, this denotes + * the scope of the user_data and the callback function pointer itself + * (for languages that emit code at run-time). + * @skip: Indicates that the parameter is only useful in C and should be skipped. + * @reserved: Reserved for future use. + * @closure: Index of the closure (user_data) parameter associated with the + * callback, or -1. + * @destroy: Index of the destroy notfication callback parameter associated + * with the callback, or -1. + * @padding: TODO + * @arg_type: Describes the type of the parameter. See details below. + * + * Types are specified by four bytes. If the three high bytes are zero, + * the low byte describes a basic type, otherwise the 32bit number is an + * offset which points to a TypeBlob. + * + * Since: 2.80 + */ +typedef struct { + uint32_t name; + + unsigned in : 1; + unsigned out : 1; + unsigned caller_allocates : 1; + unsigned nullable : 1; + unsigned optional : 1; + unsigned transfer_ownership : 1; + unsigned transfer_container_ownership : 1; + unsigned return_value : 1; + unsigned scope : 3; + unsigned skip : 1; + unsigned reserved :20; + int8_t closure; + int8_t destroy; + + uint16_t padding; + + SimpleTypeBlob arg_type; +} ArgBlob; + +/** + * SignatureBlob: + * @return_type: Describes the type of the return value. See details below. + * @may_return_null: Only relevant for pointer types. Indicates whether the + * caller must expect NULL as a return value. + * @caller_owns_return_value: If set, the caller is responsible for freeing + * the return value if it is no longer needed. + * @caller_owns_return_container: This flag is only relevant if the return type + * is a container type. If the flag is set, the caller is resonsible for + * freeing the container, but not its contents. + * @skip_return: Indicates that the return value is only useful in C and should + * be skipped. + * @instance_transfer_ownership: When calling, the function assumes ownership of + * the instance parameter. + * @throws: Denotes the signature takes an additional #GError argument beyond + * the annotated arguments. + * @reserved: Reserved for future use. + * @n_arguments: The number of arguments that this function expects, also the + * length of the array of ArgBlobs. + * @arguments: An array of ArgBlob for the arguments of the function. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + SimpleTypeBlob return_type; + + uint16_t may_return_null : 1; + uint16_t caller_owns_return_value : 1; + uint16_t caller_owns_return_container : 1; + uint16_t skip_return : 1; + uint16_t instance_transfer_ownership : 1; + uint16_t throws : 1; + uint16_t reserved :10; + + uint16_t n_arguments; + + ArgBlob arguments[]; +} SignatureBlob; + +/** + * CommonBlob: + * @blob_type: A #GITypelibBlobType + * @deprecated: Whether the blob is deprecated. + * @reserved: Reserved for future use. + * @name: The name of the blob. + * + * The #CommonBlob is shared between #FunctionBlob, + * #CallbackBlob, #SignalBlob. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; /* 1 */ + + uint16_t deprecated : 1; + uint16_t reserved :15; + uint32_t name; +} CommonBlob; + +/** + * FunctionBlob: + * @blob_type: #BLOB_TYPE_FUNCTION + * @deprecated: The function is deprecated. + * @setter: The function is a setter for a property. Language bindings may + * prefer to not bind individual setters and rely on the generic + * g_object_set(). + * @getter: The function is a getter for a property. Language bindings may + * prefer to not bind individual getters and rely on the generic + * g_object_get(). + * @constructor: The function acts as a constructor for the object it is + * contained in. + * @wraps_vfunc: The function is a simple wrapper for a virtual function. + * @throws: This is now additionally stored in the #SignatureBlob. (deprecated) + * @index: Index of the property that this function is a setter or getter of + * in the array of properties of the containing interface, or index + * of the virtual function that this function wraps. + * @name: TODO + * @symbol: The symbol which can be used to obtain the function pointer with + * dlsym(). + * @signature: Offset of the SignatureBlob describing the parameter types and the + * return value type. + * @is_static: The function is a "static method"; in other words it's a pure + * function whose name is conceptually scoped to the object. + * @reserved: Reserved for future use. + * @reserved2: Reserved for future use. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; /* 1 */ + + uint16_t deprecated : 1; + uint16_t setter : 1; + uint16_t getter : 1; + uint16_t constructor : 1; + uint16_t wraps_vfunc : 1; + uint16_t throws : 1; + uint16_t index :10; + /* Note the bits above need to match CommonBlob + * and are thus exhausted, extend things using + * the reserved block below. */ + + uint32_t name; + uint32_t symbol; + uint32_t signature; + + uint16_t is_static : 1; + uint16_t reserved : 15; + uint16_t reserved2 : 16; +} FunctionBlob; + +/** + * CallbackBlob: + * @blob_type: TODO + * @deprecated: TODO + * @reserved: Reserved for future use. + * @name: TODO + * @signature: Offset of the #SignatureBlob describing the parameter types and + * the return value type. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; /* 2 */ + + uint16_t deprecated : 1; + uint16_t reserved :15; + uint32_t name; + uint32_t signature; +} CallbackBlob; + +/** + * InterfaceTypeBlob: + * @pointer: Whether this type represents an indirection + * @reserved: Reserved for future use. + * @tag: A #GITypeTag + * @reserved2: Reserved for future use. + * @interface: Index of the directory entry for the interface. + * + * If the interface is an enum of flags type, is_pointer is 0, otherwise it is 1. + * + * Since: 2.80 + */ +typedef struct { + uint8_t pointer :1; + uint8_t reserved :2; + uint8_t tag :5; + uint8_t reserved2; + uint16_t interface; +} InterfaceTypeBlob; + +/** + * ArrayTypeDimension: + * @length: TODO + * @size: TODO + * + * TODO + * + * Since: 2.80 + */ +typedef union { + uint16_t length; + uint16_t size; +} ArrayTypeDimension; + +/** + * ArrayTypeBlob: + * @pointer: TODO + * @reserved: Reserved for future use. + * @tag: TODO + * @zero_terminated: Indicates that the array must be terminated by a suitable + * #NULL value. + * @has_length: Indicates that length points to a parameter specifying the + * length of the array. If both has_length and zero_terminated are set, the + * convention is to pass -1 for the length if the array is zero-terminated. + * @has_size: Indicates that size is the fixed size of the array. + * @array_type: Indicates whether this is a C array, GArray, GPtrArray, or + * GByteArray. If something other than a C array, the length and element + * size are implicit in the structure. + * @reserved2: Reserved for future use. + * @dimensions: TODO + * @type: TODO + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t pointer :1; + uint16_t reserved :2; + uint16_t tag :5; + + uint16_t zero_terminated :1; + uint16_t has_length :1; + uint16_t has_size :1; + uint16_t array_type :2; + uint16_t reserved2 :3; + + ArrayTypeDimension dimensions; + + SimpleTypeBlob type; +} ArrayTypeBlob; + +/** + * ParamTypeBlob: + * @pointer: TODO + * @reserved: Reserved for future use. + * @tag: TODO + * @reserved2: Reserved for future use. + * @n_types: The number of parameter types to follow. + * @type: Describes the type of the list elements. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint8_t pointer :1; + uint8_t reserved :2; + uint8_t tag :5; + + uint8_t reserved2; + uint16_t n_types; + + SimpleTypeBlob type[]; +} ParamTypeBlob; + +/** + * ErrorTypeBlob: + * @pointer: TODO + * @reserved: TODO + * @tag: TODO + * @reserved2: TODO + * @n_domains: TODO: must be 0 + * @domains: TODO + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint8_t pointer :1; + uint8_t reserved :2; + uint8_t tag :5; + + uint8_t reserved2; + + uint16_t n_domains; /* Must be 0 */ + uint16_t domains[]; +} ErrorTypeBlob; + +/** + * ValueBlob: + * @deprecated: Whether this value is deprecated + * @unsigned_value: if set, value is a 32-bit unsigned integer cast to int32_t + * @reserved: Reserved for future use. + * @name: Name of blob + * @value: The numerical value + * + * Values commonly occur in enums and flags. + * + * Since: 2.80 + */ +typedef struct { + uint32_t deprecated : 1; + uint32_t unsigned_value : 1; + uint32_t reserved :30; + uint32_t name; + int32_t value; +} ValueBlob; + +/** + * FieldBlob: + * @name: The name of the field. + * @readable: TODO + * @writable: How the field may be accessed. + * @has_embedded_type: An anonymous type follows the FieldBlob. + * @reserved: Reserved for future use. + * @bits: If this field is part of a bitfield, the number of bits which it + * uses, otherwise 0. + * @struct_offset: The offset of the field in the struct. The value 0xFFFF + * indicates that the struct offset is unknown. + * @reserved2: Reserved for future use. + * @type: The type of the field. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint32_t name; + + uint8_t readable :1; + uint8_t writable :1; + uint8_t has_embedded_type :1; + uint8_t reserved :5; + uint8_t bits; + + uint16_t struct_offset; + + uint32_t reserved2; + + SimpleTypeBlob type; +} FieldBlob; + +/** + * RegisteredTypeBlob: + * @blob_type: TODO + * @deprecated: TODO + * @unregistered: TODO + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: The name under which the type is registered with GType. + * @gtype_init: The symbol name of the get_type() function which registers the + * type. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + uint16_t deprecated : 1; + uint16_t unregistered : 1; + uint16_t reserved :14; + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; +} RegisteredTypeBlob; + +/** + * StructBlob: + * @blob_type: #BLOB_TYPE_STRUCT + * @deprecated: Whether this structure is deprecated + * @unregistered: If this is set, the type is not registered with GType. + * @is_gtype_struct: Whether this structure is the class or interface layout + * for a GObject + * @alignment: The byte boundary that the struct is aligned to in memory + * @foreign: If the type is foreign, eg if it's expected to be overridden by + * a native language binding instead of relying of introspected bindings. + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: String name of the associated #GType + * @gtype_init: String naming the symbol which gets the runtime #GType + * @size: The size of the struct in bytes. + * @n_fields: TODO + * @n_methods: TODO + * @copy_func: String pointing to a function which can be called to copy + * the contents of this struct type + * @free_func: String pointing to a function which can be called to free + * the contents of this struct type + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + + uint16_t deprecated : 1; + uint16_t unregistered : 1; + uint16_t is_gtype_struct : 1; + uint16_t alignment : 6; + uint16_t foreign : 1; + uint16_t reserved : 6; + + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; + + uint32_t size; + + uint16_t n_fields; + uint16_t n_methods; + + uint32_t copy_func; + uint32_t free_func; +} StructBlob; + +/** + * UnionBlob: + * @blob_type: TODO + * @deprecated: TODO + * @unregistered: If this is set, the type is not registered with GType. + * @discriminated: Is set if the union is discriminated + * @alignment: The byte boundary that the union is aligned to in memory + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: String name of the associated #GType + * @gtype_init: String naming the symbol which gets the runtime #GType + * @size: TODO + * @n_fields: Length of the arrays + * @n_functions: TODO + * @copy_func: String pointing to a function which can be called to copy + * the contents of this union type + * @free_func: String pointing to a function which can be called to free + * the contents of this union type + * @discriminator_offset: Offset from the beginning of the union where the + * discriminator of a discriminated union is located. The value 0xFFFF + * indicates that the discriminator offset is unknown. + * @discriminator_type: Type of the discriminator + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + uint16_t deprecated : 1; + uint16_t unregistered : 1; + uint16_t discriminated : 1; + uint16_t alignment : 6; + uint16_t reserved : 7; + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; + + uint32_t size; + + uint16_t n_fields; + uint16_t n_functions; + + uint32_t copy_func; + uint32_t free_func; + + int32_t discriminator_offset; + SimpleTypeBlob discriminator_type; +} UnionBlob; + +/** + * EnumBlob: + * @blob_type: TODO + * @deprecated: TODO + * @unregistered: If this is set, the type is not registered with GType. + * @storage_type: The tag of the type used for the enum in the C ABI + * (will be a signed or unsigned integral type) + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: String name of the associated #GType + * @gtype_init: String naming the symbol which gets the runtime #GType + * @n_values: The length of the values array. + * @n_methods: The length of the methods array. + * @error_domain: String naming the #GError domain this enum is associated with + * @values: TODO + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + + uint16_t deprecated : 1; + uint16_t unregistered : 1; + uint16_t storage_type : 5; + uint16_t reserved : 9; + + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; + + uint16_t n_values; + uint16_t n_methods; + + uint32_t error_domain; + + ValueBlob values[]; +} EnumBlob; + +#define ACCESSOR_SENTINEL 0x3ff + +/** + * PropertyBlob: + * @name: The name of the property. + * @deprecated: TODO + * @readable: TODO + * @writable: TODO + * @construct: TODO + * @construct_only: The ParamFlags used when registering the property. + * @transfer_ownership: When writing, the type containing the property takes + * ownership of the value. When reading, the returned value needs to be + * released by the caller. + * @transfer_container_ownership: For container types indicates that the + * ownership of the container, but not of its contents, is transferred. + * This is typically the case when reading lists of statically allocated + * things. + * @setter: the index of the setter function for this property, if @writable + * is set; if the method is not known, the value will be set to %ACCESSOR_SENTINEL + * @getter: ths index of the getter function for this property, if @readable + * is set; if the method is not known, the value will be set to %ACCESSOR_SENTINEL + * @reserved: Reserved for future use. + * @reserved2: Reserved for future use. + * @type: Describes the type of the property. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint32_t name; + + uint32_t deprecated : 1; + uint32_t readable : 1; + uint32_t writable : 1; + uint32_t construct : 1; + uint32_t construct_only : 1; + uint32_t transfer_ownership : 1; + uint32_t transfer_container_ownership : 1; + uint32_t setter :10; + uint32_t getter :10; + uint32_t reserved : 5; + + uint32_t reserved2; + + SimpleTypeBlob type; +} PropertyBlob; + +/** + * SignalBlob: + * @deprecated: TODO + * @run_first: TODO + * @run_last: TODO + * @run_cleanup: TODO + * @no_recurse: TODO + * @detailed: TODO + * @action: TODO + * @no_hooks: The flags used when registering the signal. + * @has_class_closure: Set if the signal has a class closure. + * @true_stops_emit: Whether the signal has true-stops-emit semantics + * @reserved: Reserved for future use. + * @class_closure: The index of the class closure in the list of virtual + * functions of the object or interface on which the signal is defined. + * @name: The name of the signal. + * @reserved2: Reserved for future use. + * @signature: Offset of the SignatureBlob describing the parameter types + * and the return value type. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t deprecated : 1; + uint16_t run_first : 1; + uint16_t run_last : 1; + uint16_t run_cleanup : 1; + uint16_t no_recurse : 1; + uint16_t detailed : 1; + uint16_t action : 1; + uint16_t no_hooks : 1; + uint16_t has_class_closure : 1; + uint16_t true_stops_emit : 1; + uint16_t reserved : 6; + + uint16_t class_closure; + + uint32_t name; + + uint32_t reserved2; + + uint32_t signature; +} SignalBlob; + +/** + * VFuncBlob: + * @name: The name of the virtual function. + * @must_chain_up: If set, every implementation of this virtual function must + * chain up to the implementation of the parent class. + * @must_be_implemented: If set, every derived class must override this virtual + * function. + * @must_not_be_implemented: If set, derived class must not override this + * virtual function. + * @class_closure: Set if this virtual function is the class closure of a + * signal. + * @throws: This is now additionally stored in the #SignatureBlob. (deprecated) + * @reserved: Reserved for future use. + * @signal: The index of the signal in the list of signals of the object or + * interface to which this virtual function belongs. + * @struct_offset: The offset of the function pointer in the class struct. + * The value 0xFFFF indicates that the struct offset is unknown. + * @invoker: If a method invoker for this virtual exists, this is the offset + * in the class structure of the method. If no method is known, this value + * will be 0x3ff. + * @reserved2: Reserved for future use. + * @reserved3: Reserved for future use. + * @signature: Offset of the SignatureBlob describing the parameter types and + * the return value type. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint32_t name; + + uint16_t must_chain_up : 1; + uint16_t must_be_implemented : 1; + uint16_t must_not_be_implemented : 1; + uint16_t class_closure : 1; + uint16_t throws : 1; + uint16_t reserved :11; + uint16_t signal; + + uint16_t struct_offset; + uint16_t invoker : 10; /* Number of bits matches @index in FunctionBlob */ + uint16_t reserved2 : 6; + + uint32_t reserved3; + uint32_t signature; +} VFuncBlob; + +/** + * ObjectBlob: + * @blob_type: #BLOB_TYPE_OBJECT + * @deprecated: whether the type is deprecated + * @abstract: whether the type can be instantiated + * @fundamental: this object is not a GObject derived type, instead it's + * an additional fundamental type. + * @final_: whether the type can be derived + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: String name of the associated #GType + * @gtype_init: String naming the symbol which gets the runtime #GType + * @parent: The directory index of the parent type. This is only set for + * objects. If an object does not have a parent, it is zero. + * @gtype_struct: TODO + * @n_interfaces: TODO + * @n_fields: TODO + * @n_properties: TODO + * @n_methods: TODO + * @n_signals: TODO + * @n_vfuncs: TODO + * @n_constants: The lengths of the arrays.Up to 16bits of padding may be + * inserted between the arrays to ensure that they start on a 32bit + * boundary. + * @n_field_callbacks: The number of n_fields which are also callbacks. + * This is used to calculate the fields section size in constant time. + * @ref_func: String pointing to a function which can be called to increase + * the reference count for an instance of this object type. + * @unref_func: String pointing to a function which can be called to decrease + * the reference count for an instance of this object type. + * @set_value_func: String pointing to a function which can be called to + * convert a pointer of this object to a GValue + * @get_value_func: String pointing to a function which can be called to + * convert extract a pointer to this object from a GValue + * @reserved3: Reserved for future use. + * @reserved4: Reserved for future use. + * @interfaces: An array of indices of directory entries for the implemented + * interfaces. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; /* 7 */ + uint16_t deprecated : 1; + uint16_t abstract : 1; + uint16_t fundamental : 1; + uint16_t final_ : 1; + uint16_t reserved :12; + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; + + uint16_t parent; + uint16_t gtype_struct; + + uint16_t n_interfaces; + uint16_t n_fields; + uint16_t n_properties; + uint16_t n_methods; + uint16_t n_signals; + uint16_t n_vfuncs; + uint16_t n_constants; + uint16_t n_field_callbacks; + + uint32_t ref_func; + uint32_t unref_func; + uint32_t set_value_func; + uint32_t get_value_func; + + uint32_t reserved3; + uint32_t reserved4; + + uint16_t interfaces[]; +} ObjectBlob; + +/** + * InterfaceBlob: + * @blob_type: TODO + * @deprecated: TODO + * @reserved: Reserved for future use. + * @name: TODO + * @gtype_name: TODO + * @gtype_init: TODO + * @gtype_struct: Name of the interface "class" C structure + * @n_prerequisites: Number of prerequisites + * @n_properties: Number of properties + * @n_methods: Number of methods + * @n_signals: Number of signals + * @n_vfuncs: Number of virtual functions + * @n_constants: The lengths of the arrays. Up to 16bits of padding may be + * inserted between the arrays to ensure that they start on a 32bit + * boundary. + * @padding: TODO + * @reserved2: Reserved for future use. + * @reserved3: Reserved for future use. + * @prerequisites: An array of indices of directory entries for required + * interfaces. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + uint16_t deprecated : 1; + uint16_t reserved :15; + uint32_t name; + + uint32_t gtype_name; + uint32_t gtype_init; + uint16_t gtype_struct; + + uint16_t n_prerequisites; + uint16_t n_properties; + uint16_t n_methods; + uint16_t n_signals; + uint16_t n_vfuncs; + uint16_t n_constants; + + uint16_t padding; + + uint32_t reserved2; + uint32_t reserved3; + + uint16_t prerequisites[]; +} InterfaceBlob; + +/** + * ConstantBlob: + * @blob_type: TODO + * @deprecated: TODO + * @reserved: Reserved for future use. + * @name: TODO + * @type: The type of the value. In most cases this should be a numeric type + * or string. + * @size: The size of the value in bytes. + * @offset: The offset of the value in the typelib. + * @reserved2: Reserved for future use. + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint16_t blob_type; + uint16_t deprecated : 1; + uint16_t reserved :15; + uint32_t name; + + SimpleTypeBlob type; + + uint32_t size; + uint32_t offset; + + uint32_t reserved2; +} ConstantBlob; + +/** + * AttributeBlob: + * @offset: The offset of the typelib entry to which this attribute refers. + * Attributes are kept sorted by offset, so that the attributes of an + * entry can be found by a binary search. + * @name: The name of the attribute, a string. + * @value: The value of the attribute (also a string) + * + * TODO + * + * Since: 2.80 + */ +typedef struct { + uint32_t offset; + uint32_t name; + uint32_t value; +} AttributeBlob; + +struct _GITypelib { + /*< private >*/ + gatomicrefcount ref_count; + const uint8_t *data; /* just a cached pointer to inside @bytes */ + size_t len; + GBytes *bytes; /* (owned) */ + GList *modules; + gboolean open_attempted; + GPtrArray *library_paths; /* (element-type filename) (owned) (nullable) */ +}; + +DirEntry *gi_typelib_get_dir_entry (GITypelib *typelib, + uint16_t index); + +DirEntry *gi_typelib_get_dir_entry_by_name (GITypelib *typelib, + const char *name); + +DirEntry *gi_typelib_get_dir_entry_by_gtype_name (GITypelib *typelib, + const char *gtype_name); + +DirEntry *gi_typelib_get_dir_entry_by_error_domain (GITypelib *typelib, + GQuark error_domain); + +gboolean gi_typelib_matches_gtype_name_prefix (GITypelib *typelib, + const char *gtype_name); + + +/** + * gi_typelib_get_string: + * @typelib: TODO + * @offset: TODO + * + * TODO + * + * Returns: TODO + * Since: 2.80 + */ +#define gi_typelib_get_string(typelib,offset) ((const char*)&(typelib->data)[(offset)]) + + +/** + * GITypelibError: + * @GI_TYPELIB_ERROR_INVALID: the typelib is invalid + * @GI_TYPELIB_ERROR_INVALID_HEADER: the typelib header is invalid + * @GI_TYPELIB_ERROR_INVALID_DIRECTORY: the typelib directory is invalid + * @GI_TYPELIB_ERROR_INVALID_ENTRY: a typelib entry is invalid + * @GI_TYPELIB_ERROR_INVALID_BLOB: a typelib blob is invalid + * + * A error set while validating the #GITypelib + * + * Since: 2.80 + */ +typedef enum +{ + GI_TYPELIB_ERROR_INVALID, + GI_TYPELIB_ERROR_INVALID_HEADER, + GI_TYPELIB_ERROR_INVALID_DIRECTORY, + GI_TYPELIB_ERROR_INVALID_ENTRY, + GI_TYPELIB_ERROR_INVALID_BLOB +} GITypelibError; + +/** + * GI_TYPELIB_ERROR: + * + * TODO + * + * Since: 2.80 + */ +#define GI_TYPELIB_ERROR (gi_typelib_error_quark ()) + +GQuark gi_typelib_error_quark (void); + + +GI_AVAILABLE_IN_ALL +gboolean gi_typelib_validate (GITypelib *typelib, + GError **error); + + +/* defined in gibaseinfo.c */ +AttributeBlob *_attribute_blob_find_first (GIBaseInfo *info, + uint32_t blob_offset); + +/** + * GITypelibHashBuilder: + * + * TODO + * + * Since: 2.80 + */ +typedef struct _GITypelibHashBuilder GITypelibHashBuilder; + +GITypelibHashBuilder * gi_typelib_hash_builder_new (void); + +void gi_typelib_hash_builder_add_string (GITypelibHashBuilder *builder, const char *str, uint16_t value); + +gboolean gi_typelib_hash_builder_prepare (GITypelibHashBuilder *builder); + +uint32_t gi_typelib_hash_builder_get_buffer_size (GITypelibHashBuilder *builder); + +void gi_typelib_hash_builder_pack (GITypelibHashBuilder *builder, uint8_t* mem, uint32_t size); + +void gi_typelib_hash_builder_destroy (GITypelibHashBuilder *builder); + +uint16_t gi_typelib_hash_search (uint8_t* memory, const char *str, uint32_t n_entries); + + +G_END_DECLS diff --git a/girepository/gitypelib.c b/girepository/gitypelib.c new file mode 100644 index 0000000..3c88a79 --- /dev/null +++ b/girepository/gitypelib.c @@ -0,0 +1,2470 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: typelib validation, auxiliary functions + * related to the binary typelib format + * + * Copyright (C) 2005 Matthias Clasen + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include +#include + +#include + +#include "gitypelib-internal.h" +#include "gitypelib.h" + +/** + * GITypelib: + * + * `GITypelib` represents a loaded `.typelib` file, which contains a description + * of a single module’s API. + * + * Since: 2.80 + */ + +G_DEFINE_BOXED_TYPE (GITypelib, gi_typelib, gi_typelib_ref, gi_typelib_unref) + +typedef struct { + GITypelib *typelib; + GSList *context_stack; +} ValidateContext; + +#define ALIGN_VALUE(this, boundary) \ + (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) + +static void +push_context (ValidateContext *ctx, const char *name) +{ + ctx->context_stack = g_slist_prepend (ctx->context_stack, (char*)name); +} + +static void +pop_context (ValidateContext *ctx) +{ + g_assert (ctx->context_stack != NULL); + ctx->context_stack = g_slist_delete_link (ctx->context_stack, + ctx->context_stack); +} + +static gboolean +validate_interface_blob (ValidateContext *ctx, + uint32_t offset, + GError **error); + +static DirEntry * +get_dir_entry_checked (GITypelib *typelib, + uint16_t index, + GError **error) +{ + Header *header = (Header *)typelib->data; + uint32_t offset; + + if (index == 0 || index > header->n_entries) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid directory index %d", index); + return FALSE; + } + + offset = header->directory + (index - 1) * header->entry_blob_size; + + if (typelib->len < offset + sizeof (DirEntry)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + return (DirEntry *)&typelib->data[offset]; +} + + +static CommonBlob * +get_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + if (typelib->len < offset + sizeof (CommonBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + return (CommonBlob *)&typelib->data[offset]; +} + +static InterfaceTypeBlob * +get_type_blob (GITypelib *typelib, + SimpleTypeBlob *simple, + GError **error) +{ + if (simple->offset == 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "Expected blob for type"); + return FALSE; + } + + if (simple->flags.reserved == 0 && simple->flags.reserved2 == 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "Expected non-basic type but got %d", + simple->flags.tag); + return FALSE; + } + + return (InterfaceTypeBlob*) get_blob (typelib, simple->offset, error); +} + +/** + * gi_typelib_get_dir_entry: + * @typelib: a #GITypelib + * @index: index to retrieve + * + * Get the typelib directory entry at the given @index. + * + * Returns: (transfer none): a `DirEntry` + * Since: 2.80 + */ +DirEntry * +gi_typelib_get_dir_entry (GITypelib *typelib, + uint16_t index) +{ + Header *header = (Header *)typelib->data; + + return (DirEntry *)&typelib->data[header->directory + (index - 1) * header->entry_blob_size]; +} + +static Section * +get_section_by_id (GITypelib *typelib, + SectionType section_type) +{ + Header *header = (Header *)typelib->data; + Section *section; + + if (header->sections == 0) + return NULL; + + for (section = (Section*)&typelib->data[header->sections]; + section->id != GI_SECTION_END; + section++) + { + if (section->id == section_type) + return section; + } + return NULL; +} + +/** + * gi_typelib_get_dir_entry_by_name: + * @typelib: a #GITypelib + * @name: name to look up + * + * Get the typelib directory entry which has @name. + * + * Returns: (transfer none) (nullable): entry corresponding to @name, or `NULL` + * if none was found + * Since: 2.80 + */ +DirEntry * +gi_typelib_get_dir_entry_by_name (GITypelib *typelib, + const char *name) +{ + Section *dirindex; + size_t i, n_entries; + const char *entry_name; + DirEntry *entry; + + dirindex = get_section_by_id (typelib, GI_SECTION_DIRECTORY_INDEX); + n_entries = ((Header *)typelib->data)->n_local_entries; + + if (dirindex == NULL) + { + for (i = 1; i <= n_entries; i++) + { + entry = gi_typelib_get_dir_entry (typelib, i); + entry_name = gi_typelib_get_string (typelib, entry->name); + if (strcmp (name, entry_name) == 0) + return entry; + } + return NULL; + } + else + { + uint8_t *hash = (uint8_t *) &typelib->data[dirindex->offset]; + uint16_t index; + + index = gi_typelib_hash_search (hash, name, n_entries); + entry = gi_typelib_get_dir_entry (typelib, index + 1); + entry_name = gi_typelib_get_string (typelib, entry->name); + if (strcmp (name, entry_name) == 0) + return entry; + return NULL; + } +} + +/** + * gi_typelib_get_dir_entry_by_gtype_name: + * @typelib: a #GITypelib + * @gtype_name: name of a [type@GObject.Type] to look up + * + * Get the typelib directory entry for the [type@GObject.Type] with the given + * @gtype_name. + * + * Returns: (transfer none) (nullable): entry corresponding to @gtype_name, or + * `NULL` if none was found + * Since: 2.80 + */ +DirEntry * +gi_typelib_get_dir_entry_by_gtype_name (GITypelib *typelib, + const char *gtype_name) +{ + Header *header = (Header *)typelib->data; + + for (size_t i = 1; i <= header->n_local_entries; i++) + { + RegisteredTypeBlob *blob; + const char *type; + DirEntry *entry = gi_typelib_get_dir_entry (typelib, i); + if (!BLOB_IS_REGISTERED_TYPE (entry)) + continue; + + blob = (RegisteredTypeBlob *)(&typelib->data[entry->offset]); + if (!blob->gtype_name) + continue; + + type = gi_typelib_get_string (typelib, blob->gtype_name); + if (strcmp (type, gtype_name) == 0) + return entry; + } + return NULL; +} + +typedef struct { + const char *s; + const char *separator; + size_t sep_len; + GString buf; +} StrSplitIter; + +static void +strsplit_iter_init (StrSplitIter *iter, + const char *s, + const char *separator) +{ + iter->s = s; + iter->separator = separator; + iter->sep_len = strlen (separator); + iter->buf.str = NULL; + iter->buf.len = 0; + iter->buf.allocated_len = 0; +} + +static gboolean +strsplit_iter_next (StrSplitIter *iter, + const char **out_val) +{ + const char *s = iter->s; + const char *next; + size_t len; + + if (!s) + return FALSE; + next = strstr (s, iter->separator); + if (next) + { + iter->s = next + iter->sep_len; + len = next - s; + } + else + { + iter->s = NULL; + len = strlen (s); + } + if (len == 0) + { + *out_val = ""; + } + else + { + g_string_overwrite_len (&iter->buf, 0, s, (gssize)len); + *out_val = iter->buf.str; + } + return TRUE; +} + +static void +strsplit_iter_clear (StrSplitIter *iter) +{ + g_free (iter->buf.str); +} + +/** + * gi_typelib_matches_gtype_name_prefix: + * @typelib: a #GITypelib + * @gtype_name: name of a [type@GObject.Type] + * + * Check whether the symbol prefix for @typelib is a prefix of the given + * @gtype_name. + * + * Returns: `TRUE` if the prefix for @typelib prefixes @gtype_name + * Since: 2.80 + */ +gboolean +gi_typelib_matches_gtype_name_prefix (GITypelib *typelib, + const char *gtype_name) +{ + Header *header = (Header *)typelib->data; + const char *c_prefix; + const char *prefix; + gboolean ret = FALSE; + StrSplitIter split_iter; + size_t gtype_name_len; + + c_prefix = gi_typelib_get_string (typelib, header->c_prefix); + if (c_prefix == NULL || strlen (c_prefix) == 0) + return FALSE; + + gtype_name_len = strlen (gtype_name); + + /* c_prefix is a comma separated string of supported prefixes + * in the typelib. + * We match the specified gtype_name if the gtype_name starts + * with the prefix, and is followed by a capital letter. + * For example, a typelib offering the 'Gdk' prefix does match + * GdkX11Cursor, however a typelib offering the 'G' prefix does not. + */ + strsplit_iter_init (&split_iter, c_prefix, ","); + while (strsplit_iter_next (&split_iter, &prefix)) + { + size_t len = strlen (prefix); + + if (gtype_name_len < len) + continue; + + if (strncmp (prefix, gtype_name, len) != 0) + continue; + + if (g_ascii_isupper (gtype_name[len])) + { + ret = TRUE; + break; + } + } + strsplit_iter_clear (&split_iter); + return ret; +} + +/** + * gi_typelib_get_dir_entry_by_error_domain: + * @typelib: a #GITypelib + * @error_domain: name of a [type@GLib.Error] domain to look up + * + * Get the typelib directory entry for the [type@GLib.Error] domain with the + * given @error_domain name. + * + * Returns: (transfer none) (nullable): entry corresponding to @error_domain, or + * `NULL` if none was found + * Since: 2.80 + */ +DirEntry * +gi_typelib_get_dir_entry_by_error_domain (GITypelib *typelib, + GQuark error_domain) +{ + Header *header = (Header *)typelib->data; + size_t n_entries = header->n_local_entries; + const char *domain_string = g_quark_to_string (error_domain); + DirEntry *entry; + + for (size_t i = 1; i <= n_entries; i++) + { + EnumBlob *blob; + const char *enum_domain_string; + + entry = gi_typelib_get_dir_entry (typelib, i); + if (entry->blob_type != BLOB_TYPE_ENUM) + continue; + + blob = (EnumBlob *)(&typelib->data[entry->offset]); + if (!blob->error_domain) + continue; + + enum_domain_string = gi_typelib_get_string (typelib, blob->error_domain); + if (strcmp (domain_string, enum_domain_string) == 0) + return entry; + } + return NULL; +} + +/* When changing the size of a typelib structure, you are required to update + * the hardcoded size here. Do NOT change these to use sizeof(); these + * should match whatever is defined in the text specification and serve as + * a sanity check on structure modifications. + * + * Everything else in the code however should be using sizeof(). + */ + +G_STATIC_ASSERT (sizeof (Header) == 112); +G_STATIC_ASSERT (sizeof (DirEntry) == 12); +G_STATIC_ASSERT (sizeof (SimpleTypeBlob) == 4); +G_STATIC_ASSERT (sizeof (ArgBlob) == 16); +G_STATIC_ASSERT (sizeof (SignatureBlob) == 8); +G_STATIC_ASSERT (sizeof (CommonBlob) == 8); +G_STATIC_ASSERT (sizeof (FunctionBlob) == 20); +G_STATIC_ASSERT (sizeof (CallbackBlob) == 12); +G_STATIC_ASSERT (sizeof (InterfaceTypeBlob) == 4); +G_STATIC_ASSERT (sizeof (ArrayTypeBlob) == 8); +G_STATIC_ASSERT (sizeof (ParamTypeBlob) == 4); +G_STATIC_ASSERT (sizeof (ErrorTypeBlob) == 4); +G_STATIC_ASSERT (sizeof (ValueBlob) == 12); +G_STATIC_ASSERT (sizeof (FieldBlob) == 16); +G_STATIC_ASSERT (sizeof (RegisteredTypeBlob) == 16); +G_STATIC_ASSERT (sizeof (StructBlob) == 32); +G_STATIC_ASSERT (sizeof (EnumBlob) == 24); +G_STATIC_ASSERT (sizeof (PropertyBlob) == 16); +G_STATIC_ASSERT (sizeof (SignalBlob) == 16); +G_STATIC_ASSERT (sizeof (VFuncBlob) == 20); +G_STATIC_ASSERT (sizeof (ObjectBlob) == 60); +G_STATIC_ASSERT (sizeof (InterfaceBlob) == 40); +G_STATIC_ASSERT (sizeof (ConstantBlob) == 24); +G_STATIC_ASSERT (sizeof (AttributeBlob) == 12); +G_STATIC_ASSERT (sizeof (UnionBlob) == 40); + +static gboolean +is_aligned (uint32_t offset) +{ + return offset == ALIGN_VALUE (offset, 4); +} + +#define MAX_NAME_LEN 2048 + +static const char * +get_string (GITypelib *typelib, uint32_t offset, GError **error) +{ + if (typelib->len < offset) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "Buffer is too short while looking up name"); + return NULL; + } + + return (const char*)&typelib->data[offset]; +} + +static const char * +get_string_nofail (GITypelib *typelib, uint32_t offset) +{ + const char *ret = get_string (typelib, offset, NULL); + g_assert (ret); + return ret; +} + +static gboolean +validate_name (GITypelib *typelib, + const char *msg, + const uint8_t *data, + uint32_t offset, + GError **error) +{ + const char *name; + + name = get_string (typelib, offset, error); + if (!name) + return FALSE; + + if (!memchr (name, '\0', MAX_NAME_LEN)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The %s is too long: %s", + msg, name); + return FALSE; + } + + if (strspn (name, G_CSET_a_2_z G_CSET_A_2_Z G_CSET_DIGITS "-_") < strlen (name)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The %s contains invalid characters: '%s'", + msg, name); + return FALSE; + } + + return TRUE; +} + +/* Fast path sanity check, operates on a memory blob */ +static gboolean +validate_header_basic (const uint8_t *memory, + size_t len, + GError **error) +{ + Header *header = (Header *)memory; + + if (len < sizeof (Header)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The specified typelib length %zu is too short", len); + return FALSE; + } + + if (strncmp (header->magic, GI_IR_MAGIC, 16) != 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Invalid magic header"); + return FALSE; + + } + + if (header->major_version != 4) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Typelib version mismatch; expected 4, found %d", + header->major_version); + return FALSE; + + } + + if (header->n_entries < header->n_local_entries) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Inconsistent entry counts"); + return FALSE; + } + + if (header->size != len) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Typelib size %zu does not match %zu", + (size_t) header->size, len); + return FALSE; + } + + /* This is a sanity check for a specific typelib; it + * prevents us from loading an incompatible typelib. + * + * The hardcoded static checks to protect against inadvertent + * or buggy changes to the typelib format itself. + */ + + if (header->entry_blob_size != sizeof (DirEntry) || + header->function_blob_size != sizeof (FunctionBlob) || + header->callback_blob_size != sizeof (CallbackBlob) || + header->signal_blob_size != sizeof (SignalBlob) || + header->vfunc_blob_size != sizeof (VFuncBlob) || + header->arg_blob_size != sizeof (ArgBlob) || + header->property_blob_size != sizeof (PropertyBlob) || + header->field_blob_size != sizeof (FieldBlob) || + header->value_blob_size != sizeof (ValueBlob) || + header->constant_blob_size != sizeof (ConstantBlob) || + header->attribute_blob_size != sizeof (AttributeBlob) || + header->signature_blob_size != sizeof (SignatureBlob) || + header->enum_blob_size != sizeof (EnumBlob) || + header->struct_blob_size != sizeof (StructBlob) || + header->object_blob_size != sizeof(ObjectBlob) || + header->interface_blob_size != sizeof (InterfaceBlob) || + header->union_blob_size != sizeof (UnionBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Blob size mismatch"); + return FALSE; + } + + if (!is_aligned (header->directory)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Misaligned directory"); + return FALSE; + } + + if (!is_aligned (header->attributes)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Misaligned attributes"); + return FALSE; + } + + if (header->attributes == 0 && header->n_attributes > 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_HEADER, + "Wrong number of attributes"); + return FALSE; + } + + return TRUE; +} + +static gboolean +validate_header (ValidateContext *ctx, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + + if (!validate_header_basic (typelib->data, typelib->len, error)) + return FALSE; + + { + Header *header = (Header*)typelib->data; + if (!validate_name (typelib, "namespace", typelib->data, header->namespace, error)) + return FALSE; + } + + return TRUE; +} + +static gboolean validate_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + GError **error); + +static gboolean +validate_array_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + GError **error) +{ + /* FIXME validate length */ + + if (!validate_type_blob (typelib, + offset + G_STRUCT_OFFSET (ArrayTypeBlob, type), + 0, FALSE, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_iface_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + GError **error) +{ + InterfaceTypeBlob *blob; + InterfaceBlob *target; + + blob = (InterfaceTypeBlob*)&typelib->data[offset]; + + target = (InterfaceBlob*) get_dir_entry_checked (typelib, blob->interface, error); + + if (!target) + return FALSE; + if (target->blob_type == 0) /* non-local */ + return TRUE; + + return TRUE; +} + +static gboolean +validate_param_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + size_t n_params, + GError **error) +{ + ParamTypeBlob *blob; + + blob = (ParamTypeBlob*)&typelib->data[offset]; + + if (!blob->pointer) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Pointer type exected for tag %d", blob->tag); + return FALSE; + } + + if (blob->n_types != n_params) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Parameter type number mismatch"); + return FALSE; + } + + for (size_t i = 0; i < n_params; i++) + { + if (!validate_type_blob (typelib, + offset + sizeof (ParamTypeBlob) + + i * sizeof (SimpleTypeBlob), + 0, FALSE, error)) + return FALSE; + } + + return TRUE; +} + +static gboolean +validate_error_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + GError **error) +{ + ErrorTypeBlob *blob; + + blob = (ErrorTypeBlob*)&typelib->data[offset]; + + if (!blob->pointer) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Pointer type exected for tag %d", blob->tag); + return FALSE; + } + + return TRUE; +} + +static gboolean +validate_type_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + gboolean return_type, + GError **error) +{ + SimpleTypeBlob *simple; + InterfaceTypeBlob *iface; + + simple = (SimpleTypeBlob *)&typelib->data[offset]; + + if (simple->flags.reserved == 0 && + simple->flags.reserved2 == 0) + { + if (!GI_TYPE_TAG_IS_BASIC(simple->flags.tag)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid non-basic tag %d in simple type", simple->flags.tag); + return FALSE; + } + + if (simple->flags.tag >= GI_TYPE_TAG_UTF8 && + simple->flags.tag != GI_TYPE_TAG_UNICHAR && + !simple->flags.pointer) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Pointer type exected for tag %d", simple->flags.tag); + return FALSE; + } + + return TRUE; + } + + iface = (InterfaceTypeBlob*)&typelib->data[simple->offset]; + + switch (iface->tag) + { + case GI_TYPE_TAG_ARRAY: + if (!validate_array_type_blob (typelib, simple->offset, + signature_offset, return_type, error)) + return FALSE; + break; + case GI_TYPE_TAG_INTERFACE: + if (!validate_iface_type_blob (typelib, simple->offset, + signature_offset, return_type, error)) + return FALSE; + break; + case GI_TYPE_TAG_GLIST: + case GI_TYPE_TAG_GSLIST: + if (!validate_param_type_blob (typelib, simple->offset, + signature_offset, return_type, 1, error)) + return FALSE; + break; + case GI_TYPE_TAG_GHASH: + if (!validate_param_type_blob (typelib, simple->offset, + signature_offset, return_type, 2, error)) + return FALSE; + break; + case GI_TYPE_TAG_ERROR: + if (!validate_error_type_blob (typelib, simple->offset, + signature_offset, return_type, error)) + return FALSE; + break; + default: + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong tag in complex type"); + return FALSE; + } + + return TRUE; +} + +static gboolean +validate_arg_blob (GITypelib *typelib, + uint32_t offset, + uint32_t signature_offset, + GError **error) +{ + ArgBlob *blob; + + if (typelib->len < offset + sizeof (ArgBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (ArgBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "argument", typelib->data, blob->name, error)) + return FALSE; + + if (!validate_type_blob (typelib, + offset + G_STRUCT_OFFSET (ArgBlob, arg_type), + signature_offset, FALSE, error)) + return FALSE; + + return TRUE; +} + +static SimpleTypeBlob * +return_type_from_signature (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + SignatureBlob *blob; + if (typelib->len < offset + sizeof (SignatureBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return NULL; + } + + blob = (SignatureBlob*) &typelib->data[offset]; + if (blob->return_type.offset == 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "No return type found in signature"); + return NULL; + } + + return (SimpleTypeBlob *)&typelib->data[offset + G_STRUCT_OFFSET (SignatureBlob, return_type)]; +} + +static gboolean +validate_signature_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + SignatureBlob *blob; + + if (typelib->len < offset + sizeof (SignatureBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (SignatureBlob*) &typelib->data[offset]; + + if (blob->return_type.offset != 0) + { + if (!validate_type_blob (typelib, + offset + G_STRUCT_OFFSET (SignatureBlob, return_type), + offset, TRUE, error)) + return FALSE; + } + + for (size_t i = 0; i < blob->n_arguments; i++) + { + if (!validate_arg_blob (typelib, + offset + sizeof (SignatureBlob) + + i * sizeof (ArgBlob), + offset, + error)) + return FALSE; + } + + /* FIXME check constraints on return_value */ + /* FIXME check array-length pairs */ + return TRUE; +} + +static gboolean +validate_function_blob (ValidateContext *ctx, + uint32_t offset, + uint16_t container_type, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + FunctionBlob *blob; + + if (typelib->len < offset + sizeof (FunctionBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (FunctionBlob*) &typelib->data[offset]; + + if (blob->blob_type != BLOB_TYPE_FUNCTION) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type %d, expected function", blob->blob_type); + return FALSE; + } + + if (!validate_name (typelib, "function", typelib->data, blob->name, error)) + return FALSE; + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + if (!validate_name (typelib, "function symbol", typelib->data, blob->symbol, error)) + return FALSE; + + if (blob->constructor) + { + switch (container_type) + { + case BLOB_TYPE_BOXED: + case BLOB_TYPE_STRUCT: + case BLOB_TYPE_UNION: + case BLOB_TYPE_OBJECT: + case BLOB_TYPE_INTERFACE: + break; + default: + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Constructor not allowed"); + return FALSE; + } + } + + if (blob->setter || blob->getter || blob->wraps_vfunc) + { + switch (container_type) + { + case BLOB_TYPE_OBJECT: + case BLOB_TYPE_INTERFACE: + break; + default: + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Setter, getter or wrapper not allowed"); + return FALSE; + } + } + + if (blob->index) + { + if (!(blob->setter || blob->getter || blob->wraps_vfunc)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Must be setter, getter or wrapper"); + return FALSE; + } + } + + /* FIXME: validate index range */ + + if (!validate_signature_blob (typelib, blob->signature, error)) + return FALSE; + + if (blob->constructor) + { + SimpleTypeBlob *simple = return_type_from_signature (typelib, + blob->signature, + error); + InterfaceTypeBlob *iface_type; + + if (!simple) + return FALSE; + iface_type = get_type_blob (typelib, simple, error); + if (!iface_type) + return FALSE; + if (iface_type->tag != GI_TYPE_TAG_INTERFACE && + (container_type == BLOB_TYPE_OBJECT || + container_type == BLOB_TYPE_INTERFACE)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "Invalid return type '%s' for constructor '%s'", + gi_type_tag_to_string (iface_type->tag), + get_string_nofail (typelib, blob->symbol)); + return FALSE; + } + } + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_callback_blob (ValidateContext *ctx, + uint32_t offset, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + CallbackBlob *blob; + + if (typelib->len < offset + sizeof (CallbackBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (CallbackBlob*) &typelib->data[offset]; + + if (blob->blob_type != BLOB_TYPE_CALLBACK) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type"); + return FALSE; + } + + if (!validate_name (typelib, "callback", typelib->data, blob->name, error)) + return FALSE; + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + if (!validate_signature_blob (typelib, blob->signature, error)) + return FALSE; + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_constant_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + size_t value_size[] = { + 0, /* VOID */ + 4, /* BOOLEAN */ + 1, /* INT8 */ + 1, /* UINT8 */ + 2, /* INT16 */ + 2, /* UINT16 */ + 4, /* INT32 */ + 4, /* UINT32 */ + 8, /* INT64 */ + 8, /* UINT64 */ + sizeof (float), + sizeof (double), + 0, /* GTYPE */ + 0, /* UTF8 */ + 0, /* FILENAME */ + 0, /* ARRAY */ + 0, /* INTERFACE */ + 0, /* GLIST */ + 0, /* GSLIST */ + 0, /* GHASH */ + 0, /* ERROR */ + 4 /* UNICHAR */ + }; + ConstantBlob *blob; + SimpleTypeBlob *type; + + g_assert (G_N_ELEMENTS (value_size) == GI_TYPE_TAG_N_TYPES); + + if (typelib->len < offset + sizeof (ConstantBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (ConstantBlob*) &typelib->data[offset]; + + if (blob->blob_type != BLOB_TYPE_CONSTANT) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type"); + return FALSE; + } + + if (!validate_name (typelib, "constant", typelib->data, blob->name, error)) + return FALSE; + + if (!validate_type_blob (typelib, offset + G_STRUCT_OFFSET (ConstantBlob, type), + 0, FALSE, error)) + return FALSE; + + if (!is_aligned (blob->offset)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Misaligned constant value"); + return FALSE; + } + + type = (SimpleTypeBlob *)&typelib->data[offset + G_STRUCT_OFFSET (ConstantBlob, type)]; + if (type->flags.reserved == 0 && type->flags.reserved2 == 0) + { + if (type->flags.tag == 0) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Constant value type void"); + return FALSE; + } + + if (value_size[type->flags.tag] != 0 && + blob->size != value_size[type->flags.tag]) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Constant value size mismatch"); + return FALSE; + } + /* FIXME check string values */ + } + + return TRUE; +} + +static gboolean +validate_value_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + ValueBlob *blob; + + if (typelib->len < offset + sizeof (ValueBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (ValueBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "value", typelib->data, blob->name, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_field_blob (ValidateContext *ctx, + uint32_t offset, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + Header *header = (Header *)typelib->data; + FieldBlob *blob; + + if (typelib->len < offset + sizeof (FieldBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (FieldBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "field", typelib->data, blob->name, error)) + return FALSE; + + if (blob->has_embedded_type) + { + if (!validate_callback_blob (ctx, offset + header->field_blob_size, error)) + return FALSE; + } + else if (!validate_type_blob (typelib, + offset + G_STRUCT_OFFSET (FieldBlob, type), + 0, FALSE, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_property_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + PropertyBlob *blob; + + if (typelib->len < offset + sizeof (PropertyBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (PropertyBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "property", typelib->data, blob->name, error)) + return FALSE; + + if (!validate_type_blob (typelib, + offset + G_STRUCT_OFFSET (PropertyBlob, type), + 0, FALSE, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_signal_blob (GITypelib *typelib, + uint32_t offset, + uint32_t container_offset, + GError **error) +{ + SignalBlob *blob; + size_t n_signals; + + if (typelib->len < offset + sizeof (SignalBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (SignalBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "signal", typelib->data, blob->name, error)) + return FALSE; + + if ((blob->run_first != 0) + + (blob->run_last != 0) + + (blob->run_cleanup != 0) != 1) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid signal run flags"); + return FALSE; + } + + if (blob->has_class_closure) + { + if (((CommonBlob*)&typelib->data[container_offset])->blob_type == BLOB_TYPE_OBJECT) + { + ObjectBlob *object; + + object = (ObjectBlob*)&typelib->data[container_offset]; + + n_signals = object->n_signals; + } + else + { + InterfaceBlob *iface; + + iface = (InterfaceBlob*)&typelib->data[container_offset]; + + n_signals = iface->n_signals; + } + + if (blob->class_closure >= n_signals) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid class closure index"); + return FALSE; + } + } + + if (!validate_signature_blob (typelib, blob->signature, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_vfunc_blob (GITypelib *typelib, + uint32_t offset, + uint32_t container_offset, + GError **error) +{ + VFuncBlob *blob; + size_t n_vfuncs; + + if (typelib->len < offset + sizeof (VFuncBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (VFuncBlob*) &typelib->data[offset]; + + if (!validate_name (typelib, "vfunc", typelib->data, blob->name, error)) + return FALSE; + + if (blob->class_closure) + { + if (((CommonBlob*)&typelib->data[container_offset])->blob_type == BLOB_TYPE_OBJECT) + { + ObjectBlob *object; + + object = (ObjectBlob*)&typelib->data[container_offset]; + + n_vfuncs = object->n_vfuncs; + } + else + { + InterfaceBlob *iface; + + iface = (InterfaceBlob*)&typelib->data[container_offset]; + + n_vfuncs = iface->n_vfuncs; + } + + if (blob->class_closure >= n_vfuncs) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid class closure index"); + return FALSE; + } + } + + if (!validate_signature_blob (typelib, blob->signature, error)) + return FALSE; + + return TRUE; +} + +static gboolean +validate_struct_blob (ValidateContext *ctx, + uint32_t offset, + uint16_t blob_type, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + StructBlob *blob; + size_t i; + uint32_t field_offset; + + if (typelib->len < offset + sizeof (StructBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (StructBlob*) &typelib->data[offset]; + + if (blob->blob_type != blob_type) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type"); + return FALSE; + } + + if (!validate_name (typelib, "struct", typelib->data, blob->name, error)) + return FALSE; + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + if (!blob->unregistered) + { + if (!validate_name (typelib, "boxed", typelib->data, blob->gtype_name, error)) + return FALSE; + + if (!validate_name (typelib, "boxed", typelib->data, blob->gtype_init, error)) + return FALSE; + } + else + { + if (blob->gtype_name || blob->gtype_init) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Gtype data in struct"); + return FALSE; + } + } + + if (typelib->len < offset + sizeof (StructBlob) + + blob->n_fields * sizeof (FieldBlob) + + blob->n_methods * sizeof (FunctionBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + field_offset = offset + sizeof (StructBlob); + for (i = 0; i < blob->n_fields; i++) + { + FieldBlob *field_blob = (FieldBlob*) &typelib->data[field_offset]; + + if (!validate_field_blob (ctx, + field_offset, + error)) + return FALSE; + + field_offset += sizeof (FieldBlob); + if (field_blob->has_embedded_type) + field_offset += sizeof (CallbackBlob); + } + + for (i = 0; i < blob->n_methods; i++) + { + if (!validate_function_blob (ctx, + field_offset + + i * sizeof (FunctionBlob), + blob_type, + error)) + return FALSE; + } + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_enum_blob (ValidateContext *ctx, + uint32_t offset, + uint16_t blob_type, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + EnumBlob *blob; + uint32_t offset2; + + if (typelib->len < offset + sizeof (EnumBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (EnumBlob*) &typelib->data[offset]; + + if (blob->blob_type != blob_type) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type"); + return FALSE; + } + + if (!blob->unregistered) + { + if (!validate_name (typelib, "enum", typelib->data, blob->gtype_name, error)) + return FALSE; + + if (!validate_name (typelib, "enum", typelib->data, blob->gtype_init, error)) + return FALSE; + } + else + { + if (blob->gtype_name || blob->gtype_init) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Gtype data in unregistered enum"); + return FALSE; + } + } + + if (!validate_name (typelib, "enum", typelib->data, blob->name, error)) + return FALSE; + + if (typelib->len < offset + sizeof (EnumBlob) + + blob->n_values * sizeof (ValueBlob) + + blob->n_methods * sizeof (FunctionBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + offset2 = offset + sizeof (EnumBlob); + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + for (size_t i = 0; i < blob->n_values; i++, offset2 += sizeof (ValueBlob)) + { + if (!validate_value_blob (typelib, + offset2, + error)) + return FALSE; + +#if 0 + v1 = (ValueBlob *)&typelib->data[offset2]; + for (j = 0; j < i; j++) + { + v2 = (ValueBlob *)&typelib->data[offset2 + + j * sizeof (ValueBlob)]; + + if (v1->value == v2->value) + { + + /* FIXME should this be an error ? */ + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Duplicate enum value"); + return FALSE; + } + } +#endif + } + + for (size_t i = 0; i < blob->n_methods; i++, offset2 += sizeof (FunctionBlob)) + { + if (!validate_function_blob (ctx, offset2, BLOB_TYPE_ENUM, error)) + return FALSE; + } + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_object_blob (ValidateContext *ctx, + uint32_t offset, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + Header *header; + ObjectBlob *blob; + size_t i; + uint32_t offset2; + uint16_t n_field_callbacks; + + header = (Header *)typelib->data; + + if (typelib->len < offset + sizeof (ObjectBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (ObjectBlob*) &typelib->data[offset]; + + if (blob->blob_type != BLOB_TYPE_OBJECT) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type"); + return FALSE; + } + + if (!validate_name (typelib, "object", typelib->data, blob->gtype_name, error)) + return FALSE; + + if (!validate_name (typelib, "object", typelib->data, blob->gtype_init, error)) + return FALSE; + + if (!validate_name (typelib, "object", typelib->data, blob->name, error)) + return FALSE; + + if (blob->parent > header->n_entries) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid parent index"); + return FALSE; + } + + if (blob->parent != 0) + { + DirEntry *entry; + + entry = get_dir_entry_checked (typelib, blob->parent, error); + if (!entry) + return FALSE; + if (entry->blob_type != BLOB_TYPE_OBJECT && + (entry->local || entry->blob_type != 0)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Parent not object"); + return FALSE; + } + } + + if (blob->gtype_struct != 0) + { + DirEntry *entry; + + entry = get_dir_entry_checked (typelib, blob->gtype_struct, error); + if (!entry) + return FALSE; + if (entry->blob_type != BLOB_TYPE_STRUCT && entry->local) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Class struct invalid type or not local"); + return FALSE; + } + } + + if (typelib->len < offset + sizeof (ObjectBlob) + + (blob->n_interfaces + blob->n_interfaces % 2) * 2 + + blob->n_fields * sizeof (FieldBlob) + + blob->n_properties * sizeof (PropertyBlob) + + blob->n_methods * sizeof (FunctionBlob) + + blob->n_signals * sizeof (SignalBlob) + + blob->n_vfuncs * sizeof (VFuncBlob) + + blob->n_constants * sizeof (ConstantBlob)) + + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + offset2 = offset + sizeof (ObjectBlob); + + for (i = 0; i < blob->n_interfaces; i++, offset2 += 2) + { + uint16_t iface; + DirEntry *entry; + + iface = *(uint16_t *)&typelib->data[offset2]; + if (iface == 0 || iface > header->n_entries) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid interface index"); + return FALSE; + } + + entry = get_dir_entry_checked (typelib, iface, error); + if (!entry) + return FALSE; + + if (entry->blob_type != BLOB_TYPE_INTERFACE && + (entry->local || entry->blob_type != 0)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Not an interface"); + return FALSE; + } + } + + offset2 += 2 * (blob->n_interfaces %2); + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + n_field_callbacks = 0; + for (i = 0; i < blob->n_fields; i++) + { + FieldBlob *field_blob = (FieldBlob*) &typelib->data[offset2]; + + if (!validate_field_blob (ctx, offset2, error)) + return FALSE; + + offset2 += sizeof (FieldBlob); + /* Special case fields which are callbacks. */ + if (field_blob->has_embedded_type) { + offset2 += sizeof (CallbackBlob); + n_field_callbacks++; + } + } + + if (blob->n_field_callbacks != n_field_callbacks) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Incorrect number of field callbacks; expected " + "%" G_GUINT16_FORMAT ", got %" G_GUINT16_FORMAT, + blob->n_field_callbacks, n_field_callbacks); + return FALSE; + } + + for (i = 0; i < blob->n_properties; i++, offset2 += sizeof (PropertyBlob)) + { + if (!validate_property_blob (typelib, offset2, error)) + return FALSE; + } + + for (i = 0; i < blob->n_methods; i++, offset2 += sizeof (FunctionBlob)) + { + if (!validate_function_blob (ctx, offset2, BLOB_TYPE_OBJECT, error)) + return FALSE; + } + + for (i = 0; i < blob->n_signals; i++, offset2 += sizeof (SignalBlob)) + { + if (!validate_signal_blob (typelib, offset2, offset, error)) + return FALSE; + } + + for (i = 0; i < blob->n_vfuncs; i++, offset2 += sizeof (VFuncBlob)) + { + if (!validate_vfunc_blob (typelib, offset2, offset, error)) + return FALSE; + } + + for (i = 0; i < blob->n_constants; i++, offset2 += sizeof (ConstantBlob)) + { + if (!validate_constant_blob (typelib, offset2, error)) + return FALSE; + } + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_interface_blob (ValidateContext *ctx, + uint32_t offset, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + Header *header; + InterfaceBlob *blob; + size_t i; + uint32_t offset2; + + header = (Header *)typelib->data; + + if (typelib->len < offset + sizeof (InterfaceBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + blob = (InterfaceBlob*) &typelib->data[offset]; + + if (blob->blob_type != BLOB_TYPE_INTERFACE) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Wrong blob type; expected interface, got %d", blob->blob_type); + return FALSE; + } + + if (!validate_name (typelib, "interface", typelib->data, blob->gtype_name, error)) + return FALSE; + + if (!validate_name (typelib, "interface", typelib->data, blob->gtype_init, error)) + return FALSE; + + if (!validate_name (typelib, "interface", typelib->data, blob->name, error)) + return FALSE; + + if (typelib->len < offset + sizeof (InterfaceBlob) + + (blob->n_prerequisites + blob->n_prerequisites % 2) * 2 + + blob->n_properties * sizeof (PropertyBlob) + + blob->n_methods * sizeof (FunctionBlob) + + blob->n_signals * sizeof (SignalBlob) + + blob->n_vfuncs * sizeof (VFuncBlob) + + blob->n_constants * sizeof (ConstantBlob)) + + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + offset2 = offset + sizeof (InterfaceBlob); + + for (i = 0; i < blob->n_prerequisites; i++, offset2 += 2) + { + DirEntry *entry; + uint16_t req; + + req = *(uint16_t *)&typelib->data[offset2]; + if (req == 0 || req > header->n_entries) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Invalid prerequisite index"); + return FALSE; + } + + entry = gi_typelib_get_dir_entry (typelib, req); + if (entry->blob_type != BLOB_TYPE_INTERFACE && + entry->blob_type != BLOB_TYPE_OBJECT && + (entry->local || entry->blob_type != 0)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_BLOB, + "Not an interface or object"); + return FALSE; + } + } + + offset2 += 2 * (blob->n_prerequisites % 2); + + push_context (ctx, get_string_nofail (typelib, blob->name)); + + for (i = 0; i < blob->n_properties; i++, offset2 += sizeof (PropertyBlob)) + { + if (!validate_property_blob (typelib, offset2, error)) + return FALSE; + } + + for (i = 0; i < blob->n_methods; i++, offset2 += sizeof (FunctionBlob)) + { + if (!validate_function_blob (ctx, offset2, BLOB_TYPE_INTERFACE, error)) + return FALSE; + } + + for (i = 0; i < blob->n_signals; i++, offset2 += sizeof (SignalBlob)) + { + if (!validate_signal_blob (typelib, offset2, offset, error)) + return FALSE; + } + + for (i = 0; i < blob->n_vfuncs; i++, offset2 += sizeof (VFuncBlob)) + { + if (!validate_vfunc_blob (typelib, offset2, offset, error)) + return FALSE; + } + + for (i = 0; i < blob->n_constants; i++, offset2 += sizeof (ConstantBlob)) + { + if (!validate_constant_blob (typelib, offset2, error)) + return FALSE; + } + + pop_context (ctx); + + return TRUE; +} + +static gboolean +validate_union_blob (GITypelib *typelib, + uint32_t offset, + GError **error) +{ + return TRUE; +} + +static gboolean +validate_blob (ValidateContext *ctx, + uint32_t offset, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + CommonBlob *common; + + if (typelib->len < offset + sizeof (CommonBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + common = (CommonBlob*)&typelib->data[offset]; + + switch (common->blob_type) + { + case BLOB_TYPE_FUNCTION: + if (!validate_function_blob (ctx, offset, 0, error)) + return FALSE; + break; + case BLOB_TYPE_CALLBACK: + if (!validate_callback_blob (ctx, offset, error)) + return FALSE; + break; + case BLOB_TYPE_STRUCT: + case BLOB_TYPE_BOXED: + if (!validate_struct_blob (ctx, offset, common->blob_type, error)) + return FALSE; + break; + case BLOB_TYPE_ENUM: + case BLOB_TYPE_FLAGS: + if (!validate_enum_blob (ctx, offset, common->blob_type, error)) + return FALSE; + break; + case BLOB_TYPE_OBJECT: + if (!validate_object_blob (ctx, offset, error)) + return FALSE; + break; + case BLOB_TYPE_INTERFACE: + if (!validate_interface_blob (ctx, offset, error)) + return FALSE; + break; + case BLOB_TYPE_CONSTANT: + if (!validate_constant_blob (typelib, offset, error)) + return FALSE; + break; + case BLOB_TYPE_UNION: + if (!validate_union_blob (typelib, offset, error)) + return FALSE; + break; + default: + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_ENTRY, + "Invalid blob type"); + return FALSE; + } + + return TRUE; +} + +static gboolean +validate_directory (ValidateContext *ctx, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + Header *header = (Header *)typelib->data; + DirEntry *entry; + size_t i; + + if (typelib->len < header->directory + header->n_entries * sizeof (DirEntry)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + for (i = 0; i < header->n_entries; i++) + { + entry = gi_typelib_get_dir_entry (typelib, i + 1); + + if (!validate_name (typelib, "entry", typelib->data, entry->name, error)) + return FALSE; + + if ((entry->local && entry->blob_type == BLOB_TYPE_INVALID) || + entry->blob_type > BLOB_TYPE_UNION) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_DIRECTORY, + "Invalid entry type"); + return FALSE; + } + + if (i < header->n_local_entries) + { + if (!entry->local) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_DIRECTORY, + "Too few local directory entries"); + return FALSE; + } + + if (!is_aligned (entry->offset)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_DIRECTORY, + "Misaligned entry"); + return FALSE; + } + + if (!validate_blob (ctx, entry->offset, error)) + return FALSE; + } + else + { + if (entry->local) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID_DIRECTORY, + "Too many local directory entries"); + return FALSE; + } + + if (!validate_name (typelib, "namespace", typelib->data, entry->offset, error)) + return FALSE; + } + } + + return TRUE; +} + +static gboolean +validate_attributes (ValidateContext *ctx, + GError **error) +{ + GITypelib *typelib = ctx->typelib; + Header *header = (Header *)typelib->data; + + if (header->size < header->attributes + header->n_attributes * sizeof (AttributeBlob)) + { + g_set_error (error, + GI_TYPELIB_ERROR, + GI_TYPELIB_ERROR_INVALID, + "The buffer is too short"); + return FALSE; + } + + return TRUE; +} + +static void +prefix_with_context (GError **error, + const char *section, + ValidateContext *ctx) +{ + GString *str; + GSList *link; + char *buf; + + link = ctx->context_stack; + if (!link) + { + g_prefix_error (error, "In %s:", section); + return; + } + + str = g_string_new (NULL); + + for (; link; link = link->next) + { + g_string_append (str, link->data); + if (link->next) + g_string_append_c (str, '/'); + } + g_string_append_c (str, ')'); + buf = g_string_free (str, FALSE); + g_prefix_error (error, "In %s (Context: %s): ", section, buf); + g_free (buf); +} + +/** + * gi_typelib_validate: + * @typelib: a #GITypelib + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Check whether @typelib is well-formed, i.e. that the file is not corrupt or + * truncated. + * + * Returns: `TRUE` if @typelib is well-formed, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_typelib_validate (GITypelib *typelib, + GError **error) +{ + ValidateContext ctx; + ctx.typelib = typelib; + ctx.context_stack = NULL; + + if (!validate_header (&ctx, error)) + { + prefix_with_context (error, "In header", &ctx); + return FALSE; + } + + if (!validate_directory (&ctx, error)) + { + prefix_with_context (error, "directory", &ctx); + return FALSE; + } + + if (!validate_attributes (&ctx, error)) + { + prefix_with_context (error, "attributes", &ctx); + return FALSE; + } + + return TRUE; +} + +/** + * gi_typelib_error_quark: + * + * Get the quark representing the [type@GIRepository.TypelibError] error domain. + * + * Returns: quark representing the error domain + * Since: 2.80 + */ +GQuark +gi_typelib_error_quark (void) +{ + static GQuark quark = 0; + if (quark == 0) + quark = g_quark_from_static_string ("gi-typelib-error-quark"); + return quark; +} + +/* Note on the GModule flags used by this function: + + * Glade's autoconnect feature and OpenGL's extension mechanism + * as used by Clutter rely on g_module_open(NULL) to work as a means of + * accessing the app's symbols. This keeps us from using + * G_MODULE_BIND_LOCAL. BIND_LOCAL may have other issues as well; + * in general libraries are not expecting multiple copies of + * themselves and are not expecting to be unloaded. So we just + * load modules globally for now. + */ +static GModule * +load_one_shared_library (GITypelib *typelib, + const char *shlib) +{ + GModule *m; + +#ifdef __APPLE__ + /* On macOS, @-prefixed shlib paths (@rpath, @executable_path, @loader_path) + need to be treated as absolute; trying to combine them with a + configured library path produces a mangled path that is unresolvable + and may cause unintended side effects (such as loading the library + from a fall-back location on macOS 12.0.1). + */ + if (!g_path_is_absolute (shlib) && !g_str_has_prefix (shlib, "@")) +#else + if (!g_path_is_absolute (shlib)) +#endif + { + /* First try in configured library paths */ + for (unsigned int i = 0; typelib->library_paths != NULL && i < typelib->library_paths->len; i++) + { + char *path = g_build_filename (typelib->library_paths->pdata[i], shlib, NULL); + + m = g_module_open (path, G_MODULE_BIND_LAZY); + + g_free (path); + if (m != NULL) + return m; + } + } + + /* Then try loading from standard paths */ + /* Do not attempt to fix up shlib to replace .la with .so: + it's done by GModule anyway. + */ + return g_module_open (shlib, G_MODULE_BIND_LAZY); +} + +static void +gi_typelib_do_dlopen (GITypelib *typelib) +{ + Header *header; + const char *shlib_str; + + header = (Header *) typelib->data; + /* note that NULL shlib means to open the main app, which is allowed */ + if (header->shared_library) + shlib_str = gi_typelib_get_string (typelib, header->shared_library); + else + shlib_str = NULL; + + if (shlib_str != NULL && shlib_str[0] != '\0') + { + char **shlibs; + + /* shared-library is a comma-separated list of libraries */ + shlibs = g_strsplit (shlib_str, ",", 0); + + /* We load all passed libs unconditionally as if the same library is loaded + * again with g_module_open(), the same file handle will be returned. See bug: + * http://bugzilla.gnome.org/show_bug.cgi?id=555294 + */ + for (size_t i = 0; shlibs[i]; i++) + { + GModule *module; + + module = load_one_shared_library (typelib, shlibs[i]); + + if (module == NULL) + { + g_warning ("Failed to load shared library '%s' referenced by the typelib: %s", + shlibs[i], g_module_error ()); + } + else + { + typelib->modules = g_list_append (typelib->modules, module); + } + } + + g_strfreev (shlibs); + } + else + { + /* If there's no shared-library entry for this module, assume that + * the module is for the application. Some of the hand-written .gir files + * in gobject-introspection don't have shared-library entries, but no one + * is really going to be calling g_module_symbol on them either. + */ + GModule *module = g_module_open (NULL, 0); + if (module == NULL) + g_warning ("gtypelib.c: Failed to g_module_open (NULL): %s", g_module_error ()); + else + typelib->modules = g_list_prepend (typelib->modules, module); + } +} + +static inline void +gi_typelib_ensure_open (GITypelib *typelib) +{ + if (typelib->open_attempted) + return; + typelib->open_attempted = TRUE; + gi_typelib_do_dlopen (typelib); +} + +/** + * gi_typelib_new_from_bytes: + * @bytes: memory chunk containing the typelib + * @error: a [type@GLib.Error] + * + * Creates a new [type@GIRepository.Typelib] from a [type@GLib.Bytes]. + * + * The [type@GLib.Bytes] can point to a memory location or a mapped file, and + * the typelib will hold a reference to it until the repository is destroyed. + * + * Returns: (transfer full): the new [type@GIRepository.Typelib] + * Since: 2.80 + */ +GITypelib * +gi_typelib_new_from_bytes (GBytes *bytes, + GError **error) +{ + GITypelib *meta; + size_t len; + const uint8_t *data = g_bytes_get_data (bytes, &len); + + if (!validate_header_basic (data, len, error)) + return NULL; + + meta = g_slice_new0 (GITypelib); + g_atomic_ref_count_init (&meta->ref_count); + meta->bytes = g_bytes_ref (bytes); + meta->data = data; + meta->len = len; + meta->modules = NULL; + + return meta; +} + +/** + * gi_typelib_ref: + * @typelib: (transfer none): a #GITypelib + * + * Increment the reference count of a [type@GIRepository.Typelib]. + * + * Returns: (transfer full): the same @typelib pointer + * Since: 2.80 + */ +GITypelib * +gi_typelib_ref (GITypelib *typelib) +{ + g_return_val_if_fail (typelib != NULL, NULL); + + g_atomic_ref_count_inc (&typelib->ref_count); + + return typelib; +} + +/** + * gi_typelib_unref: + * @typelib: (transfer full): a #GITypelib + * + * Decrement the reference count of a [type@GIRepository.Typelib]. + * + * Once the reference count reaches zero, the typelib is freed. + * + * Since: 2.80 + */ +void +gi_typelib_unref (GITypelib *typelib) +{ + g_return_if_fail (typelib != NULL); + + if (g_atomic_ref_count_dec (&typelib->ref_count)) + { + g_clear_pointer (&typelib->bytes, g_bytes_unref); + + g_clear_pointer (&typelib->library_paths, g_ptr_array_unref); + + if (typelib->modules) + { + g_list_foreach (typelib->modules, (GFunc) (void *) g_module_close, NULL); + g_list_free (typelib->modules); + } + g_slice_free (GITypelib, typelib); + } +} + +/** + * gi_typelib_get_namespace: + * @typelib: a #GITypelib + * + * Get the name of the namespace represented by @typelib. + * + * Returns: name of the namespace represented by @typelib + * Since: 2.80 + */ +const char * +gi_typelib_get_namespace (GITypelib *typelib) +{ + return gi_typelib_get_string (typelib, ((Header *) typelib->data)->namespace); +} + +/** + * gi_typelib_symbol: + * @typelib: the typelib + * @symbol_name: name of symbol to be loaded + * @symbol: (out) (nullable): returns a pointer to the symbol value, or `NULL` + * on failure + * + * Loads a symbol from a `GITypelib`. + * + * Returns: `TRUE` on success + * Since: 2.80 + */ +gboolean +gi_typelib_symbol (GITypelib *typelib, const char *symbol_name, void **symbol) +{ + GList *l; + + gi_typelib_ensure_open (typelib); + + /* + * The reason for having multiple modules dates from gir-repository + * when it was desired to inject code (accessors, etc.) into an + * existing library. In that situation, the first module listed + * will be the custom one, which overrides the main one. A bit + * inefficient, but the problem will go away when gir-repository + * does. + * + * For modules with no shared library, we dlopen'd the current + * process above. + */ + for (l = typelib->modules; l; l = l->next) + { + GModule *module = l->data; + + if (g_module_symbol (module, symbol_name, symbol)) + return TRUE; + } + + return FALSE; +} diff --git a/girepository/gitypelib.h b/girepository/gitypelib.h new file mode 100644 index 0000000..add5804 --- /dev/null +++ b/girepository/gitypelib.h @@ -0,0 +1,61 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Public typelib API + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +#include + +G_BEGIN_DECLS + +typedef struct _GITypelib GITypelib; + +#define GI_TYPE_TYPELIB (gi_typelib_get_type ()) +GI_AVAILABLE_IN_ALL +GType gi_typelib_get_type (void) G_GNUC_CONST; + +GI_AVAILABLE_IN_ALL +GITypelib * gi_typelib_new_from_bytes (GBytes *bytes, + GError **error); + +GI_AVAILABLE_IN_ALL +GITypelib * gi_typelib_ref (GITypelib *typelib); +GI_AVAILABLE_IN_ALL +void gi_typelib_unref (GITypelib *typelib); + +GI_AVAILABLE_IN_ALL +gboolean gi_typelib_symbol (GITypelib *typelib, + const char *symbol_name, + void **symbol); + +GI_AVAILABLE_IN_ALL +const char * gi_typelib_get_namespace (GITypelib *typelib); + + +G_END_DECLS diff --git a/girepository/gitypes.h b/girepository/gitypes.h new file mode 100644 index 0000000..21c873b --- /dev/null +++ b/girepository/gitypes.h @@ -0,0 +1,421 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: types + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +#include +#include + +#include "gi-visibility.h" + +G_BEGIN_DECLS + +/* Documented in gibaseinfo.c */ +typedef struct _GIBaseInfo GIBaseInfo; +typedef struct _GIBaseInfoClass GIBaseInfoClass; + +typedef struct +{ + /*< private >*/ + GTypeInstance parent_instance; + + int dummy0; + void *dummy1[3]; + uint32_t dummy2[2]; + void *dummy3[6]; +} GIBaseInfoStack; + +/* Documented in gicallableinfo.c */ +typedef struct _GICallableInfo GICallableInfo; +GI_AVAILABLE_IN_ALL GType gi_callable_info_get_type (void); + +/* Documented in gifunctioninfo.c */ +typedef struct _GIFunctionInfo GIFunctionInfo; +GI_AVAILABLE_IN_ALL GType gi_function_info_get_type (void); + +/* Documented in gicallbackinfo.c */ +typedef struct _GICallbackInfo GICallbackInfo; +GI_AVAILABLE_IN_ALL GType gi_callback_info_get_type (void); + +/* Documented in giregisteredtypeinfo.c */ +typedef struct _GIRegisteredTypeInfo GIRegisteredTypeInfo; +GI_AVAILABLE_IN_ALL GType gi_registered_type_info_get_type (void); + +/* Documented in gistructinfo.c */ +typedef struct _GIStructInfo GIStructInfo; +GI_AVAILABLE_IN_ALL GType gi_struct_info_get_type (void); + +/* Documented in giunioninfo.c */ +typedef struct _GIUnionInfo GIUnionInfo; +GI_AVAILABLE_IN_ALL GType gi_union_info_get_type (void); + +/* Documented in gienuminfo.c */ +typedef struct _GIEnumInfo GIEnumInfo; +GI_AVAILABLE_IN_ALL GType gi_enum_info_get_type (void); + +/* Documented in giflagsinfo.c */ +typedef struct _GIFlagsInfo GIFlagsInfo; +GI_AVAILABLE_IN_ALL GType gi_flags_info_get_type (void); + +/* Documented in giobjectinfo.c */ +typedef struct _GIObjectInfo GIObjectInfo; +GI_AVAILABLE_IN_ALL GType gi_object_info_get_type (void); + +/* Documented in giinterfaceinfo.c */ +typedef struct _GIInterfaceInfo GIInterfaceInfo; +GI_AVAILABLE_IN_ALL GType gi_interface_info_get_type (void); + +/* Documented in giconstantinfo.c */ +typedef struct _GIConstantInfo GIConstantInfo; +GI_AVAILABLE_IN_ALL GType gi_constant_info_get_type (void); + +/* Documented in givalueinfo.c */ +typedef struct _GIValueInfo GIValueInfo; +GI_AVAILABLE_IN_ALL GType gi_value_info_get_type (void); + +/* Documented in gisignalinfo.c */ +typedef struct _GISignalInfo GISignalInfo; +GI_AVAILABLE_IN_ALL GType gi_signal_info_get_type (void); + +/* Documented in givfuncinfo.c */ +typedef struct _GIVFuncInfo GIVFuncInfo; +GI_AVAILABLE_IN_ALL GType gi_vfunc_info_get_type (void); + +/* Documented in gipropertyinfo.c */ +typedef struct _GIPropertyInfo GIPropertyInfo; +GI_AVAILABLE_IN_ALL GType gi_property_info_get_type (void); + +/* Documented in gifieldinfo.c */ +typedef struct _GIFieldInfo GIFieldInfo; +GI_AVAILABLE_IN_ALL GType gi_field_info_get_type (void); + +/* Documented in giarginfo.c */ +typedef struct +{ + /*< private >*/ + GIBaseInfoStack parent; + + void *padding[6]; +} GIArgInfo; +GI_AVAILABLE_IN_ALL GType gi_arg_info_get_type (void); + +/* Documented in gitypeinfo.c */ +typedef struct +{ + /*< private >*/ + GIBaseInfoStack parent; + + void *padding[6]; +} GITypeInfo; +GI_AVAILABLE_IN_ALL GType gi_type_info_get_type (void); + +/* Documented in giunresolvedinfo.c */ +typedef struct _GIUnresolvedInfo GIUnresolvedInfo; +GI_AVAILABLE_IN_ALL GType gi_unresolved_info_get_type (void); + +union _GIArgument +{ + gboolean v_boolean; + int8_t v_int8; + uint8_t v_uint8; + int16_t v_int16; + uint16_t v_uint16; + int32_t v_int32; + uint32_t v_uint32; + int64_t v_int64; + uint64_t v_uint64; + float v_float; + double v_double; + short v_short; + unsigned short v_ushort; + int v_int; + unsigned int v_uint; + long v_long; + unsigned long v_ulong; + gssize v_ssize; + size_t v_size; + char *v_string; + void *v_pointer; +}; + +/** + * GIArgument: + * @v_boolean: boolean value + * @v_int8: 8-bit signed integer value + * @v_uint8: 8-bit unsigned integer value + * @v_int16: 16-bit signed integer value + * @v_uint16: 16-bit unsigned integer value + * @v_int32: 32-bit signed integer value + * @v_uint32: 32-bit unsigned integer value + * @v_int64: 64-bit signed integer value + * @v_uint64: 64-bit unsigned integer value + * @v_float: single float value + * @v_double: double float value + * @v_short: signed short integer value + * @v_ushort: unsigned short integer value + * @v_int: signed integer value + * @v_uint: unsigned integer value + * @v_long: signed long integer value + * @v_ulong: unsigned long integer value + * @v_ssize: sized `size_t` value + * @v_size: unsigned `size_t` value + * @v_string: nul-terminated string value + * @v_pointer: arbitrary pointer value + * + * Stores an argument of varying type. + * + * Since: 2.80 + */ +typedef union _GIArgument GIArgument; + +/** + * GITransfer: + * @GI_TRANSFER_NOTHING: Transfer nothing from the callee (function or the type + * instance the property belongs to) to the caller. The callee retains the + * ownership of the transfer and the caller doesn’t need to do anything to + * free up the resources of this transfer. + * @GI_TRANSFER_CONTAINER: Transfer the container (list, array, hash table) from + * the callee to the caller. The callee retains the ownership of the + * individual items in the container and the caller has to free up the + * container resources ([func@GLib.List.free], + * [func@GLib.HashTable.destroy], etc) of this transfer. + * @GI_TRANSFER_EVERYTHING: Transfer everything, e.g. the container and its + * contents from the callee to the caller. This is the case when the callee + * creates a copy of all the data it returns. The caller is responsible for + * cleaning up the container and item resources of this transfer. + * + * `GITransfer` specifies who’s responsible for freeing the resources after an + * ownership transfer is complete. + * + * The transfer is the exchange of data between two parts, from the callee to + * the caller. + * + * The callee is either a function/method/signal or an object/interface where a + * property is defined. The caller is the side accessing a property or calling a + * function. + * + * In the case of a containing type such as a list, an array or a hash table the + * container itself is specified differently from the items within the + * container. Each container is freed differently, check the documentation for + * the types themselves for information on how to free them. + * + * Since: 2.80 + */ +typedef enum { + GI_TRANSFER_NOTHING, + GI_TRANSFER_CONTAINER, + GI_TRANSFER_EVERYTHING +} GITransfer; + +/** + * GIDirection: + * @GI_DIRECTION_IN: ‘in’ argument. + * @GI_DIRECTION_OUT: ‘out’ argument. + * @GI_DIRECTION_INOUT: ‘in and out’ argument. + * + * The direction of a [class@GIRepository.ArgInfo]. + * + * Since: 2.80 + */ +typedef enum { + GI_DIRECTION_IN, + GI_DIRECTION_OUT, + GI_DIRECTION_INOUT +} GIDirection; + +/** + * GIScopeType: + * @GI_SCOPE_TYPE_INVALID: The argument is not of callback type. + * @GI_SCOPE_TYPE_CALL: The callback and associated `user_data` is only + * used during the call to this function. + * @GI_SCOPE_TYPE_ASYNC: The callback and associated `user_data` is + * only used until the callback is invoked, and the callback. + * is invoked always exactly once. + * @GI_SCOPE_TYPE_NOTIFIED: The callback and associated + * `user_data` is used until the caller is notified via the + * [type@GLib.DestroyNotify]. + * @GI_SCOPE_TYPE_FOREVER: The callback and associated `user_data` is + * used until the process terminates + * + * Scope type of a [class@GIRepository.ArgInfo] representing callback, + * determines how the callback is invoked and is used to decided when the invoke + * structs can be freed. + * + * Since: 2.80 + */ +typedef enum { + GI_SCOPE_TYPE_INVALID, + GI_SCOPE_TYPE_CALL, + GI_SCOPE_TYPE_ASYNC, + GI_SCOPE_TYPE_NOTIFIED, + GI_SCOPE_TYPE_FOREVER +} GIScopeType; + +/** + * GITypeTag: + * @GI_TYPE_TAG_VOID: void + * @GI_TYPE_TAG_BOOLEAN: boolean + * @GI_TYPE_TAG_INT8: 8-bit signed integer + * @GI_TYPE_TAG_UINT8: 8-bit unsigned integer + * @GI_TYPE_TAG_INT16: 16-bit signed integer + * @GI_TYPE_TAG_UINT16: 16-bit unsigned integer + * @GI_TYPE_TAG_INT32: 32-bit signed integer + * @GI_TYPE_TAG_UINT32: 32-bit unsigned integer + * @GI_TYPE_TAG_INT64: 64-bit signed integer + * @GI_TYPE_TAG_UINT64: 64-bit unsigned integer + * @GI_TYPE_TAG_FLOAT: float + * @GI_TYPE_TAG_DOUBLE: double floating point + * @GI_TYPE_TAG_GTYPE: a [type@GObject.Type] + * @GI_TYPE_TAG_UTF8: a UTF-8 encoded string + * @GI_TYPE_TAG_FILENAME: a filename, encoded in the same encoding + * as the native filesystem is using. + * @GI_TYPE_TAG_ARRAY: an array + * @GI_TYPE_TAG_INTERFACE: an extended interface object + * @GI_TYPE_TAG_GLIST: a [type@GLib.List] + * @GI_TYPE_TAG_GSLIST: a [type@GLib.SList] + * @GI_TYPE_TAG_GHASH: a [type@GLib.HashTable] + * @GI_TYPE_TAG_ERROR: a [type@GLib.Error] + * @GI_TYPE_TAG_UNICHAR: Unicode character + * + * The type tag of a [class@GIRepository.TypeInfo]. + * + * Since: 2.80 + */ +typedef enum { + /* Basic types */ + GI_TYPE_TAG_VOID = 0, + GI_TYPE_TAG_BOOLEAN = 1, + GI_TYPE_TAG_INT8 = 2, /* Start of GI_TYPE_TAG_IS_NUMERIC types */ + GI_TYPE_TAG_UINT8 = 3, + GI_TYPE_TAG_INT16 = 4, + GI_TYPE_TAG_UINT16 = 5, + GI_TYPE_TAG_INT32 = 6, + GI_TYPE_TAG_UINT32 = 7, + GI_TYPE_TAG_INT64 = 8, + GI_TYPE_TAG_UINT64 = 9, + GI_TYPE_TAG_FLOAT = 10, + GI_TYPE_TAG_DOUBLE = 11, /* End of numeric types */ + GI_TYPE_TAG_GTYPE = 12, + GI_TYPE_TAG_UTF8 = 13, + GI_TYPE_TAG_FILENAME = 14, + /* Non-basic types; compare with GI_TYPE_TAG_IS_BASIC */ + GI_TYPE_TAG_ARRAY = 15, /* container (see GI_TYPE_TAG_IS_CONTAINER) */ + GI_TYPE_TAG_INTERFACE = 16, + GI_TYPE_TAG_GLIST = 17, /* container */ + GI_TYPE_TAG_GSLIST = 18, /* container */ + GI_TYPE_TAG_GHASH = 19, /* container */ + GI_TYPE_TAG_ERROR = 20, + /* Another basic type */ + GI_TYPE_TAG_UNICHAR = 21 + /* Note - there is currently only room for 32 tags */ +} GITypeTag; + +/** + * GI_TYPE_TAG_N_TYPES: + * + * Number of entries in [enum@GIRepository.TypeTag]. + * + * Since: 2.80 + */ +#define GI_TYPE_TAG_N_TYPES (GI_TYPE_TAG_UNICHAR+1) + +/** + * GIArrayType: + * @GI_ARRAY_TYPE_C: a C array, `char[]` for instance + * @GI_ARRAY_TYPE_ARRAY: a [type@GLib.Array] array + * @GI_ARRAY_TYPE_PTR_ARRAY: a [type@GLib.PtrArray] array + * @GI_ARRAY_TYPE_BYTE_ARRAY: a [type@GLib.ByteArray] array + * + * The type of array in a [class@GIRepository.TypeInfo]. + * + * Since: 2.80 + */ +typedef enum { + GI_ARRAY_TYPE_C, + GI_ARRAY_TYPE_ARRAY, + GI_ARRAY_TYPE_PTR_ARRAY, + GI_ARRAY_TYPE_BYTE_ARRAY +} GIArrayType; + +/** + * GIFieldInfoFlags: + * @GI_FIELD_IS_READABLE: field is readable. + * @GI_FIELD_IS_WRITABLE: field is writable. + * + * Flags for a [class@GIRepository.FieldInfo]. + * + * Since: 2.80 + */ + +typedef enum +{ + GI_FIELD_IS_READABLE = 1 << 0, + GI_FIELD_IS_WRITABLE = 1 << 1 +} GIFieldInfoFlags; + +/** + * GIVFuncInfoFlags: + * @GI_VFUNC_MUST_CHAIN_UP: chains up to the parent type + * @GI_VFUNC_MUST_OVERRIDE: overrides + * @GI_VFUNC_MUST_NOT_OVERRIDE: does not override + * + * Flags of a [class@GIRepository.VFuncInfo] struct. + * + * Since: 2.80 + */ +typedef enum +{ + GI_VFUNC_MUST_CHAIN_UP = 1 << 0, + GI_VFUNC_MUST_OVERRIDE = 1 << 1, + GI_VFUNC_MUST_NOT_OVERRIDE = 1 << 2, +} GIVFuncInfoFlags; + +/** + * GIFunctionInfoFlags: + * @GI_FUNCTION_IS_METHOD: is a method. + * @GI_FUNCTION_IS_CONSTRUCTOR: is a constructor. + * @GI_FUNCTION_IS_GETTER: is a getter of a [class@GIRepository.PropertyInfo]. + * @GI_FUNCTION_IS_SETTER: is a setter of a [class@GIRepository.PropertyInfo]. + * @GI_FUNCTION_WRAPS_VFUNC: represents a virtual function. + * + * Flags for a [class@GIRepository.FunctionInfo] struct. + * + * Since: 2.80 + */ +typedef enum +{ + GI_FUNCTION_IS_METHOD = 1 << 0, + GI_FUNCTION_IS_CONSTRUCTOR = 1 << 1, + GI_FUNCTION_IS_GETTER = 1 << 2, + GI_FUNCTION_IS_SETTER = 1 << 3, + GI_FUNCTION_WRAPS_VFUNC = 1 << 4, +} GIFunctionInfoFlags; + +G_END_DECLS diff --git a/girepository/giunioninfo.c b/girepository/giunioninfo.c new file mode 100644 index 0000000..de9a34b --- /dev/null +++ b/girepository/giunioninfo.c @@ -0,0 +1,367 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Union implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giunioninfo.h" + +/** + * GIUnionInfo: + * + * `GIUnionInfo` represents a union type. + * + * A union has methods and fields. Unions can optionally have a + * discriminator, which is a field deciding what type of real union + * fields is valid for specified instance. + * + * Since: 2.80 + */ + +/** + * gi_union_info_get_n_fields: + * @info: a #GIUnionInfo + * + * Obtain the number of fields this union has. + * + * Returns: number of fields + * Since: 2.80 + */ +unsigned int +gi_union_info_get_n_fields (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_fields; +} + +/** + * gi_union_info_get_field: + * @info: a #GIUnionInfo + * @n: a field index + * + * Obtain the type information for the field with the specified index. + * + * Returns: (transfer full): the [type@GIRepository.FieldInfo], free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFieldInfo * +gi_union_info_get_field (GIUnionInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + + return (GIFieldInfo *) gi_base_info_new (GI_INFO_TYPE_FIELD, (GIBaseInfo*)info, rinfo->typelib, + rinfo->offset + header->union_blob_size + + n * header->field_blob_size); +} + +/** + * gi_union_info_get_n_methods: + * @info: a #GIUnionInfo + * + * Obtain the number of methods this union has. + * + * Returns: number of methods + * Since: 2.80 + */ +unsigned int +gi_union_info_get_n_methods (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->n_functions; +} + +/** + * gi_union_info_get_method: + * @info: a #GIUnionInfo + * @n: a method index + * + * Obtain the type information for the method with the specified index. + * + * Returns: (transfer full): the [type@GIRepository.FunctionInfo], free it + * with [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_union_info_get_method (GIUnionInfo *info, + unsigned int n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + Header *header = (Header *)rinfo->typelib->data; + size_t offset; + + offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size + + n * header->function_blob_size; + return (GIFunctionInfo *) gi_base_info_new (GI_INFO_TYPE_FUNCTION, (GIBaseInfo*)info, + rinfo->typelib, offset); +} + +/** + * gi_union_info_is_discriminated: + * @info: a #GIUnionInfo + * + * Return `TRUE` if this union contains a discriminator field. + * + * Returns: `TRUE` if this is a discriminated union, `FALSE` otherwise + * Since: 2.80 + */ +gboolean +gi_union_info_is_discriminated (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->discriminated; +} + +/** + * gi_union_info_get_discriminator_offset: + * @info: a #GIUnionInfo + * @out_offset: (out) (optional): return location for the offset, in bytes, of + * the discriminator + * + * Obtain the offset of the discriminator field within the structure. + * + * The union must be discriminated, or `FALSE` will be returned. + * + * Returns: `TRUE` if the union is discriminated + * Since: 2.80 + */ +gboolean +gi_union_info_get_discriminator_offset (GIUnionInfo *info, + size_t *out_offset) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + size_t discriminator_offset; + + discriminator_offset = (blob->discriminated) ? blob->discriminator_offset : 0; + + if (out_offset != NULL) + *out_offset = discriminator_offset; + + return blob->discriminated; +} + +/** + * gi_union_info_get_discriminator_type: + * @info: a #GIUnionInfo + * + * Obtain the type information of the union discriminator. + * + * Returns: (transfer full) (nullable): the [type@GIRepository.TypeInfo], or + * `NULL` if the union is not discriminated. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GITypeInfo * +gi_union_info_get_discriminator_type (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (!blob->discriminated) + return NULL; + + return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + 24); +} + +/** + * gi_union_info_get_discriminator: + * @info: a #GIUnionInfo + * @n: a union field index + * + * Obtain the discriminator value assigned for n-th union field, i.e. the n-th + * union field is the active one if the discriminator contains this + * constant. + * + * If the union is not discriminated, `NULL` is returned. + * + * Returns: (transfer full) (nullable): The [type@GIRepository.ConstantInfo], or + * `NULL` if the union is not discriminated. Free it with + * [method@GIRepository.BaseInfo.unref] when done. + * Since: 2.80 + */ +GIConstantInfo * +gi_union_info_get_discriminator (GIUnionInfo *info, + size_t n) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->discriminated) + { + Header *header = (Header *)rinfo->typelib->data; + size_t offset; + + offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size + + blob->n_functions * header->function_blob_size + + n * header->constant_blob_size; + + return (GIConstantInfo *) gi_base_info_new (GI_INFO_TYPE_CONSTANT, (GIBaseInfo*)info, + rinfo->typelib, offset); + } + + return NULL; +} + +/** + * gi_union_info_find_method: + * @info: a #GIUnionInfo + * @name: a method name + * + * Obtain the type information for the method named @name. + * + * Returns: (transfer full) (nullable): The [type@GIRepository.FunctionInfo], or + * `NULL` if none was found. Free it with [method@GIRepository.BaseInfo.unref] + * when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_union_info_find_method (GIUnionInfo *info, + const char *name) +{ + size_t offset; + GIRealInfo *rinfo = (GIRealInfo *)info; + Header *header = (Header *)rinfo->typelib->data; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + offset = rinfo->offset + header->union_blob_size + + blob->n_fields * header->field_blob_size; + + return gi_base_info_find_method ((GIBaseInfo*)info, offset, blob->n_functions, name); +} + +/** + * gi_union_info_get_size: + * @info: a #GIUnionInfo + * + * Obtain the total size of the union. + * + * Returns: size of the union, in bytes + * Since: 2.80 + */ +size_t +gi_union_info_get_size (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->size; +} + +/** + * gi_union_info_get_alignment: + * @info: a #GIUnionInfo + * + * Obtain the required alignment of the union. + * + * Returns: required alignment, in bytes + * Since: 2.80 + */ +size_t +gi_union_info_get_alignment (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->alignment; +} + +/** + * gi_union_info_get_copy_function_name: + * @info: a union information blob + * + * Retrieves the name of the copy function for @info, if any is set. + * + * Returns: (transfer none) (nullable): the name of the copy function, or `NULL` + * if none is set + * Since: 2.80 + */ +const char * +gi_union_info_get_copy_function_name (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_UNION_INFO (info), NULL); + + blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->copy_func) + return gi_typelib_get_string (rinfo->typelib, blob->copy_func); + + return NULL; +} + +/** + * gi_union_info_get_free_function_name: + * @info: a union information blob + * + * Retrieves the name of the free function for @info, if any is set. + * + * Returns: (transfer none) (nullable): the name of the free function, or `NULL` + * if none is set + * Since: 2.80 + */ +const char * +gi_union_info_get_free_function_name (GIUnionInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + UnionBlob *blob; + + g_return_val_if_fail (info != NULL, NULL); + g_return_val_if_fail (GI_IS_UNION_INFO (info), NULL); + + blob = (UnionBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->free_func) + return gi_typelib_get_string (rinfo->typelib, blob->free_func); + + return NULL; +} + +void +gi_union_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_UNION; +} diff --git a/girepository/giunioninfo.h b/girepository/giunioninfo.h new file mode 100644 index 0000000..d227362 --- /dev/null +++ b/girepository/giunioninfo.h @@ -0,0 +1,105 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Union + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_UNION_INFO (gi_union_info_get_type ()) + +/** + * GI_UNION_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.UnionInfo] or derived pointer into a + * `(GIUnionInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_UNION_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_UNION_INFO, GIUnionInfo)) + +/** + * GI_IS_UNION_INFO: + * @info: an info structure + * + * Checks if @info is a [struct@GIRepository.UnionInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_UNION_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_UNION_INFO)) + +GI_AVAILABLE_IN_ALL +unsigned int gi_union_info_get_n_fields (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +GIFieldInfo * gi_union_info_get_field (GIUnionInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +unsigned int gi_union_info_get_n_methods (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_union_info_get_method (GIUnionInfo *info, + unsigned int n); + +GI_AVAILABLE_IN_ALL +gboolean gi_union_info_is_discriminated (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +gboolean gi_union_info_get_discriminator_offset (GIUnionInfo *info, + size_t *out_offset); + +GI_AVAILABLE_IN_ALL +GITypeInfo * gi_union_info_get_discriminator_type (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +GIConstantInfo * gi_union_info_get_discriminator (GIUnionInfo *info, + size_t n); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_union_info_find_method (GIUnionInfo *info, + const char *name); + +GI_AVAILABLE_IN_ALL +size_t gi_union_info_get_size (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +size_t gi_union_info_get_alignment (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_union_info_get_copy_function_name (GIUnionInfo *info); + +GI_AVAILABLE_IN_ALL +const char * gi_union_info_get_free_function_name (GIUnionInfo *info); + +G_END_DECLS diff --git a/girepository/giunresolvedinfo.c b/girepository/giunresolvedinfo.c new file mode 100644 index 0000000..b099f9b --- /dev/null +++ b/girepository/giunresolvedinfo.c @@ -0,0 +1,52 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright 2023 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "giunresolvedinfo.h" + +/** + * GIUnresolvedInfo: + * + * `GIUnresolvedInfo` represents an unresolved symbol. + * + * Since: 2.80 + */ + +void +gi_unresolved_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_UNRESOLVED; +} diff --git a/girepository/giunresolvedinfo.h b/girepository/giunresolvedinfo.h new file mode 100644 index 0000000..9eeb761 --- /dev/null +++ b/girepository/giunresolvedinfo.h @@ -0,0 +1,60 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Callable + * + * Copyright 2023 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_UNRESOLVED_INFO (gi_unresolved_info_get_type ()) + +/** + * GI_UNRESOLVED_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.UnresolvedInfo] or derived pointer into a + * `(GIUnresolvedInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_UNRESOLVED_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_UNRESOLVED_INFO, GIUnresolvedInfo)) + +/** + * GI_IS_UNRESOLVED_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.UnresolvedInfo] or derived from it. + * + * Since: 2.80 + */ +#define GI_IS_UNRESOLVED_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_UNRESOLVED_INFO)) + +G_END_DECLS diff --git a/girepository/givalueinfo.c b/girepository/givalueinfo.c new file mode 100644 index 0000000..b55cf67 --- /dev/null +++ b/girepository/givalueinfo.c @@ -0,0 +1,81 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Enum implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "givalueinfo.h" + +/** + * GIValueInfo: + * + * A `GIValueInfo` represents a value in an enumeration. + * + * The `GIValueInfo` is fetched by calling + * [method@GIRepository.EnumInfo.get_value] on a [class@GIRepository.EnumInfo]. + * + * Since: 2.80 + */ + +/** + * gi_value_info_get_value: + * @info: a #GIValueInfo + * + * Obtain the enumeration value of the `GIValueInfo`. + * + * Returns: the enumeration value. This will always be representable + * as a 32-bit signed or unsigned value. The use of `int64_t` as the + * return type is to allow both. + * Since: 2.80 + */ +int64_t +gi_value_info_get_value (GIValueInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + ValueBlob *blob; + + g_return_val_if_fail (info != NULL, -1); + g_return_val_if_fail (GI_IS_VALUE_INFO (info), -1); + + blob = (ValueBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->unsigned_value) + return (int64_t)(uint32_t)blob->value; + else + return (int64_t)blob->value; +} + +void +gi_value_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_VALUE; +} diff --git a/girepository/givalueinfo.h b/girepository/givalueinfo.h new file mode 100644 index 0000000..7eb7cce --- /dev/null +++ b/girepository/givalueinfo.h @@ -0,0 +1,65 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Enum and Enum values + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_VALUE_INFO (gi_value_info_get_type ()) + +/** + * GI_VALUE_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.ValueInfo] or derived pointer into a + * `(GIValueInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_VALUE_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_VALUE_INFO, GIValueInfo)) + +/** + * GI_IS_VALUE_INFO: + * @info: an info structure + * + * Checks if @info is a [class@GIRepository.ValueInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_VALUE_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_VALUE_INFO)) + + +GI_AVAILABLE_IN_ALL +int64_t gi_value_info_get_value (GIValueInfo *info); + +G_END_DECLS diff --git a/girepository/givfuncinfo.c b/girepository/givfuncinfo.c new file mode 100644 index 0000000..728cca4 --- /dev/null +++ b/girepository/givfuncinfo.c @@ -0,0 +1,380 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Virtual Function implementation + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include "config.h" + +#include + +#include + +#include +#include "gibaseinfo-private.h" +#include "girepository-private.h" +#include "gitypelib-internal.h" +#include "givfuncinfo.h" + +/** + * GIVFuncInfo: + * + * `GIVFuncInfo` represents a virtual function. + * + * A virtual function is a callable object that belongs to either a + * [type@GIRepository.ObjectInfo] or a [type@GIRepository.InterfaceInfo]. + * + * Since: 2.80 + */ + +GIVFuncInfo * +gi_base_info_find_vfunc (GIRealInfo *rinfo, + uint32_t offset, + uint16_t n_vfuncs, + const char *name) +{ + /* FIXME hash */ + Header *header = (Header *)rinfo->typelib->data; + + for (uint16_t i = 0; i < n_vfuncs; i++) + { + VFuncBlob *fblob = (VFuncBlob *)&rinfo->typelib->data[offset]; + const char *fname = (const char *)&rinfo->typelib->data[fblob->name]; + + if (strcmp (name, fname) == 0) + return (GIVFuncInfo *) gi_base_info_new (GI_INFO_TYPE_VFUNC, (GIBaseInfo*) rinfo, + rinfo->typelib, offset); + + offset += header->vfunc_blob_size; + } + + return NULL; +} + +/** + * gi_vfunc_info_get_flags: + * @info: a #GIVFuncInfo + * + * Obtain the flags for this virtual function info. + * + * See [flags@GIRepository.VFuncInfoFlags] for more information about possible + * flag values. + * + * Returns: the flags + * Since: 2.80 + */ +GIVFuncInfoFlags +gi_vfunc_info_get_flags (GIVFuncInfo *info) +{ + GIVFuncInfoFlags flags; + GIRealInfo *rinfo = (GIRealInfo *)info; + VFuncBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_VFUNC_INFO (info), 0); + + blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + flags = 0; + + if (blob->must_chain_up) + flags = flags | GI_VFUNC_MUST_CHAIN_UP; + + if (blob->must_be_implemented) + flags = flags | GI_VFUNC_MUST_OVERRIDE; + + if (blob->must_not_be_implemented) + flags = flags | GI_VFUNC_MUST_NOT_OVERRIDE; + + return flags; +} + +/** + * gi_vfunc_info_get_offset: + * @info: a #GIVFuncInfo + * + * Obtain the offset of the function pointer in the class struct. + * + * The value `0xFFFF` indicates that the struct offset is unknown. + * + * Returns: the struct offset or `0xFFFF` if it’s unknown + * Since: 2.80 + */ +size_t +gi_vfunc_info_get_offset (GIVFuncInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + VFuncBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_VFUNC_INFO (info), 0); + + blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + return blob->struct_offset; +} + +/** + * gi_vfunc_info_get_signal: + * @info: a #GIVFuncInfo + * + * Obtain the signal for the virtual function if one is set. + * + * The signal comes from the object or interface to which + * this virtual function belongs. + * + * Returns: (transfer full) (nullable): the signal, or `NULL` if none is set + * Since: 2.80 + */ +GISignalInfo * +gi_vfunc_info_get_signal (GIVFuncInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + VFuncBlob *blob; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_VFUNC_INFO (info), 0); + + blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + if (blob->class_closure) + return gi_interface_info_get_signal ((GIInterfaceInfo *)rinfo->container, blob->signal); + + return NULL; +} + +/** + * gi_vfunc_info_get_invoker: + * @info: a #GIVFuncInfo + * + * If this virtual function has an associated invoker method, this + * method will return it. An invoker method is a C entry point. + * + * Not all virtuals will have invokers. + * + * Returns: (transfer full) (nullable): The [type@GIRepository.FunctionInfo] or + * `NULL` if none is set. Free it with [method@GIRepository.BaseInfo.unref] + * when done. + * Since: 2.80 + */ +GIFunctionInfo * +gi_vfunc_info_get_invoker (GIVFuncInfo *info) +{ + GIRealInfo *rinfo = (GIRealInfo *)info; + VFuncBlob *blob; + GIBaseInfo *container; + GIInfoType parent_type; + + g_return_val_if_fail (info != NULL, 0); + g_return_val_if_fail (GI_IS_VFUNC_INFO (info), 0); + + blob = (VFuncBlob *)&rinfo->typelib->data[rinfo->offset]; + + /* 1023 = 0x3ff is the maximum of the 10 bits for invoker index */ + if (blob->invoker == 1023) + return NULL; + + container = rinfo->container; + parent_type = gi_base_info_get_info_type (container); + if (parent_type == GI_INFO_TYPE_OBJECT) + return gi_object_info_get_method ((GIObjectInfo*)container, blob->invoker); + else if (parent_type == GI_INFO_TYPE_INTERFACE) + return gi_interface_info_get_method ((GIInterfaceInfo*)container, blob->invoker); + else + g_assert_not_reached (); +} + +/** + * gi_vfunc_info_get_address: + * @info: a #GIVFuncInfo + * @implementor_gtype: [type@GObject.Type] implementing this virtual function + * @error: return location for a [type@GLib.Error], or `NULL` + * + * Looks up where the implementation for @info is inside the type struct of + * @implementor_gtype. + * + * Returns: address to a function + * Since: 2.80 + */ +void * +gi_vfunc_info_get_address (GIVFuncInfo *vfunc_info, + GType implementor_gtype, + GError **error) +{ + GIBaseInfo *container_info; + GIInterfaceInfo *interface_info; + GIObjectInfo *object_info; + GIStructInfo *struct_info; + GIFieldInfo *field_info = NULL; + int length, i, offset; + void *implementor_class, *implementor_vtable; + void *func = NULL; + + g_return_val_if_fail (vfunc_info != NULL, NULL); + g_return_val_if_fail (GI_IS_VFUNC_INFO (vfunc_info), NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + container_info = gi_base_info_get_container ((GIBaseInfo *) vfunc_info); + if (gi_base_info_get_info_type (container_info) == GI_INFO_TYPE_OBJECT) + { + object_info = (GIObjectInfo*) container_info; + interface_info = NULL; + struct_info = gi_object_info_get_class_struct (object_info); + } + else + { + interface_info = (GIInterfaceInfo*) container_info; + object_info = NULL; + struct_info = gi_interface_info_get_iface_struct (interface_info); + } + + length = gi_struct_info_get_n_fields (struct_info); + for (i = 0; i < length; i++) + { + field_info = gi_struct_info_get_field (struct_info, i); + + if (strcmp (gi_base_info_get_name ( (GIBaseInfo*) field_info), + gi_base_info_get_name ( (GIBaseInfo*) vfunc_info)) != 0) { + gi_base_info_unref ((GIBaseInfo *) field_info); + field_info = NULL; + continue; + } + + break; + } + + if (field_info == NULL) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_SYMBOL_NOT_FOUND, + "Couldn't find struct field for this vfunc"); + goto out; + } + + implementor_class = g_type_class_ref (implementor_gtype); + + if (object_info) + { + implementor_vtable = implementor_class; + } + else + { + GType interface_type; + + interface_type = gi_registered_type_info_get_g_type ((GIRegisteredTypeInfo*) interface_info); + implementor_vtable = g_type_interface_peek (implementor_class, interface_type); + } + + offset = gi_field_info_get_offset (field_info); + func = *(void**) G_STRUCT_MEMBER_P (implementor_vtable, offset); + g_type_class_unref (implementor_class); + gi_base_info_unref ((GIBaseInfo *) field_info); + + if (func == NULL) + { + g_set_error (error, + GI_INVOKE_ERROR, + GI_INVOKE_ERROR_SYMBOL_NOT_FOUND, + "Class %s doesn't implement %s", + g_type_name (implementor_gtype), + gi_base_info_get_name ( (GIBaseInfo*) vfunc_info)); + goto out; + } + + out: + gi_base_info_unref ((GIBaseInfo*) struct_info); + + return func; +} + +/** + * gi_vfunc_info_invoke: (skip) + * @info: a #GIVFuncInfo describing the virtual function to invoke + * @implementor: [type@GObject.Type] of the type that implements this virtual + * function + * @in_args: (array length=n_in_args) (nullable): an array of + * [struct@GIRepository.Argument]s, one for each ‘in’ parameter of @info. If + * there are no ‘in’ parameters, @in_args can be `NULL` + * @n_in_args: the length of the @in_args array + * @out_args: (array length=n_out_args) (nullable): an array of + * [struct@GIRepository.Argument]s allocated by the caller, one for each + * ‘out’ parameter of @info. If there are no ‘out’ parameters, @out_args may + * be `NULL` + * @n_out_args: the length of the @out_args array + * @return_value: (out caller-allocates) (not optional) (nullable): return + * location for the return value from the vfunc; `NULL` may be returned if + * the vfunc returns that + * @error: return location for detailed error information, or `NULL` + * + * Invokes the function described in @info with the given + * arguments. + * + * Note that ‘inout’ parameters must appear in both argument lists. + * + * Returns: `TRUE` if the vfunc was executed successfully and didn’t throw + * a [type@GLib.Error]; `FALSE` if @error is set + * Since: 2.80 + */ +gboolean +gi_vfunc_info_invoke (GIVFuncInfo *info, + GType implementor, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error) +{ + void *func; + GError *local_error = NULL; + + g_return_val_if_fail (info != NULL, FALSE); + g_return_val_if_fail (GI_IS_VFUNC_INFO (info), FALSE); + g_return_val_if_fail (in_args != NULL || n_in_args == 0, FALSE); + g_return_val_if_fail (out_args != NULL || n_out_args == 0, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + func = gi_vfunc_info_get_address (info, implementor, &local_error); + if (local_error != NULL) + { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } + + return gi_callable_info_invoke ((GICallableInfo*) info, + func, + in_args, + n_in_args, + out_args, + n_out_args, + return_value, + error); +} + +void +gi_vfunc_info_class_init (gpointer g_class, + gpointer class_data) +{ + GIBaseInfoClass *info_class = g_class; + + info_class->info_type = GI_INFO_TYPE_VFUNC; +} diff --git a/girepository/givfuncinfo.h b/girepository/givfuncinfo.h new file mode 100644 index 0000000..cbb8abe --- /dev/null +++ b/girepository/givfuncinfo.h @@ -0,0 +1,88 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Virtual Functions + * + * Copyright (C) 2005 Matthias Clasen + * Copyright (C) 2008,2009 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#pragma once + +#if !defined (__GIREPOSITORY_H_INSIDE__) && !defined (GI_COMPILATION) +#error "Only can be included directly." +#endif + +#include + +G_BEGIN_DECLS + +#define GI_TYPE_VFUNC_INFO (gi_vfunc_info_get_type ()) + +/** + * GI_VFUNC_INFO: + * @info: Info object which is subject to casting. + * + * Casts a [type@GIRepository.VFuncInfo] or derived pointer into a + * `(GIVFuncInfo*)` pointer. + * + * Depending on the current debugging level, this function may invoke + * certain runtime checks to identify invalid casts. + * + * Since: 2.80 + */ +#define GI_VFUNC_INFO(info) (G_TYPE_CHECK_INSTANCE_CAST ((info), GI_TYPE_VFUNC_INFO, GIVFuncInfo)) + +/** + * GI_IS_VFUNC_INFO: + * @info: an info structure + * + * Checks if @info is a [struct@GIRepository.VFuncInfo] (or a derived type). + * + * Since: 2.80 + */ +#define GI_IS_VFUNC_INFO(info) (G_TYPE_CHECK_INSTANCE_TYPE ((info), GI_TYPE_VFUNC_INFO)) + +GI_AVAILABLE_IN_ALL +GIVFuncInfoFlags gi_vfunc_info_get_flags (GIVFuncInfo *info); + +GI_AVAILABLE_IN_ALL +size_t gi_vfunc_info_get_offset (GIVFuncInfo *info); + +GI_AVAILABLE_IN_ALL +GISignalInfo * gi_vfunc_info_get_signal (GIVFuncInfo *info); + +GI_AVAILABLE_IN_ALL +GIFunctionInfo * gi_vfunc_info_get_invoker (GIVFuncInfo *info); + +GI_AVAILABLE_IN_ALL +void * gi_vfunc_info_get_address (GIVFuncInfo *info, + GType implementor_gtype, + GError **error); + +GI_AVAILABLE_IN_ALL +gboolean gi_vfunc_info_invoke (GIVFuncInfo *info, + GType implementor, + const GIArgument *in_args, + size_t n_in_args, + GIArgument *out_args, + size_t n_out_args, + GIArgument *return_value, + GError **error); + +G_END_DECLS diff --git a/girepository/gthash.c b/girepository/gthash.c new file mode 100644 index 0000000..954cd6f --- /dev/null +++ b/girepository/gthash.c @@ -0,0 +1,230 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Typelib hashing + * + * Copyright (C) 2010 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include + +#include "cmph/cmph.h" +#include "gitypelib-internal.h" + +#define ALIGN_VALUE(this, boundary) \ + (( ((unsigned long)(this)) + (((unsigned long)(boundary)) -1)) & (~(((unsigned long)(boundary))-1))) + +/* + * String hashing in the typelib. We have a set of static (fixed) strings, + * and given one, we need to find its index number. This problem is perfect + * hashing: http://en.wikipedia.org/wiki/Perfect_hashing + * + * I chose CMPH (http://cmph.sourceforge.net/) as it seemed high + * quality, well documented, and easy to embed. + * + * CMPH provides a number of algorithms; I chose BDZ, because while CHD + * appears to be the "best", the simplicitly of BDZ appealed, and really, + * we're only talking about thousands of strings here, not millions, so + * a few microseconds is no big deal. + * + * In memory, the format is: + * INT32 mph_size + * MPH (mph_size bytes) + * (padding for alignment to uint32 if necessary) + * INDEX (array of uint16_t) + * + * Because BDZ is not order preserving, we need a lookaside table which + * maps the hash value into the directory index. + */ + +struct _GITypelibHashBuilder { + gboolean prepared; + gboolean buildable; + cmph_t *c; + GHashTable *strings; + uint32_t dirmap_offset; + uint32_t packed_size; +}; + +GITypelibHashBuilder * +gi_typelib_hash_builder_new (void) +{ + GITypelibHashBuilder *builder = g_slice_new0 (GITypelibHashBuilder); + builder->c = NULL; + builder->strings = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); + return builder; +} + +void +gi_typelib_hash_builder_add_string (GITypelibHashBuilder *builder, + const char *str, + uint16_t value) +{ + g_return_if_fail (builder->c == NULL); + g_hash_table_insert (builder->strings, g_strdup (str), GUINT_TO_POINTER (value)); +} + +gboolean +gi_typelib_hash_builder_prepare (GITypelibHashBuilder *builder) +{ + char **strs; + GHashTableIter hashiter; + void *key, *value; + cmph_io_adapter_t *io; + cmph_config_t *config; + uint32_t num_elts; + uint32_t offset; + unsigned i; + + if (builder->prepared) + return builder->buildable; + g_assert (builder->c == NULL); + + num_elts = g_hash_table_size (builder->strings); + g_assert (num_elts <= 65536); + + strs = (char**) g_new (char *, num_elts + 1); + + i = 0; + g_hash_table_iter_init (&hashiter, builder->strings); + while (g_hash_table_iter_next (&hashiter, &key, &value)) + { + const char *str = key; + + strs[i++] = g_strdup (str); + } + strs[i++] = NULL; + + io = cmph_io_vector_adapter (strs, num_elts); + config = cmph_config_new (io); + cmph_config_set_algo (config, CMPH_BDZ); + + builder->c = cmph_new (config); + builder->prepared = TRUE; + if (!builder->c) + { + builder->buildable = FALSE; + goto out; + } + builder->buildable = TRUE; + g_assert (cmph_size (builder->c) == num_elts); + + /* Pack a size counter at front */ + offset = sizeof (uint32_t) + cmph_packed_size (builder->c); + builder->dirmap_offset = ALIGN_VALUE (offset, 4); + builder->packed_size = builder->dirmap_offset + (num_elts * sizeof (uint16_t)); + out: + g_strfreev (strs); + cmph_config_destroy (config); + cmph_io_vector_adapter_destroy (io); + return builder->buildable; +} + +uint32_t +gi_typelib_hash_builder_get_buffer_size (GITypelibHashBuilder *builder) +{ + g_return_val_if_fail (builder != NULL, 0); + g_return_val_if_fail (builder->prepared, 0); + g_return_val_if_fail (builder->buildable, 0 ); + + return builder->packed_size; +} + +void +gi_typelib_hash_builder_pack (GITypelibHashBuilder *builder, uint8_t* mem, uint32_t len) +{ + uint16_t *table; + GHashTableIter hashiter; + void *key, *value; +#ifndef G_DISABLE_ASSERT + uint32_t num_elts; +#endif + uint8_t *packed_mem; + + g_return_if_fail (builder != NULL); + g_return_if_fail (builder->prepared); + g_return_if_fail (builder->buildable); + + g_assert (len >= builder->packed_size); + g_assert ((((size_t)mem) & 0x3) == 0); + + memset (mem, 0, len); + + *((uint32_t*) mem) = builder->dirmap_offset; + packed_mem = (uint8_t*)(mem + sizeof (uint32_t)); + cmph_pack (builder->c, packed_mem); + + table = (uint16_t*) (mem + builder->dirmap_offset); + +#ifndef G_DISABLE_ASSERT + num_elts = g_hash_table_size (builder->strings); +#endif + g_hash_table_iter_init (&hashiter, builder->strings); + while (g_hash_table_iter_next (&hashiter, &key, &value)) + { + const char *str = key; + uint16_t strval = (uint16_t)GPOINTER_TO_UINT(value); + uint32_t hashv; + + hashv = cmph_search_packed (packed_mem, str, strlen (str)); + g_assert (hashv < num_elts); + table[hashv] = strval; + } +} + +void +gi_typelib_hash_builder_destroy (GITypelibHashBuilder *builder) +{ + if (builder->c) + { + cmph_destroy (builder->c); + builder->c = NULL; + } + g_hash_table_destroy (builder->strings); + g_slice_free (GITypelibHashBuilder, builder); +} + +uint16_t +gi_typelib_hash_search (uint8_t* memory, const char *str, uint32_t n_entries) +{ + uint32_t *mph; + uint16_t *table; + uint32_t dirmap_offset; + uint32_t offset; + + g_assert ((((size_t)memory) & 0x3) == 0); + mph = ((uint32_t*)memory)+1; + + offset = cmph_search_packed (mph, str, strlen (str)); + + /* Make sure that offset always lies in the entries array. cmph + cometimes generates offset larger than number of entries (for + 'str' argument which is not in the hashed list). In this case, + fake the correct result and depend on caller's final check that + the entry is really the one that the caller wanted. */ + if (offset >= n_entries) + offset = 0; + + dirmap_offset = *((uint32_t*)memory); + table = (uint16_t*) (memory + dirmap_offset); + + return table[offset]; +} + diff --git a/girepository/inspector/inspector.c b/girepository/inspector/inspector.c new file mode 100644 index 0000000..69eeb88 --- /dev/null +++ b/girepository/inspector/inspector.c @@ -0,0 +1,134 @@ +/* GObject introspection: typelib inspector + * + * Copyright (C) 2011-2016 Dominique Leuenberger + * Copyright © 2016 Igor Gnatenko + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include +#include + +static void +print_shlibs (GIRepository *repository, + const gchar *namespace) +{ + /* Finding the shared library we depend on (if any) */ + const char * const *shlibs = gi_repository_get_shared_libraries (repository, namespace, NULL); + for (size_t i = 0; shlibs != NULL && shlibs[i] != NULL; i++) + g_print ("shlib: %s\n", shlibs[i]); +} + +static void +print_typelibs (GIRepository *repository, + const gchar *namespace) +{ + guint i = 0; + + /* Finding all the typelib-based Requires */ + GStrv deps = gi_repository_get_dependencies (repository, namespace, NULL); + if (deps) + { + for (i = 0; deps[i]; i++) + g_print ("typelib: %s\n", deps[i]); + g_strfreev (deps); + } +} + +gint +main (gint argc, + gchar *argv[]) +{ + gint status = EXIT_SUCCESS; + + GError *error = NULL; + GIRepository *repository = NULL; + GITypelib *typelib = NULL; + + gchar *version = NULL; + gboolean opt_shlibs = FALSE; + gboolean opt_typelibs = FALSE; + GStrv namespaces = NULL; + const gchar *namespace = NULL; + const GOptionEntry options[] = { + { "typelib-version", 0, 0, G_OPTION_ARG_STRING, &version, N_("Typelib version to inspect"), N_("VERSION") }, + { "print-shlibs", 0, 0, G_OPTION_ARG_NONE, &opt_shlibs, N_("List the shared libraries the typelib requires"), NULL }, + { "print-typelibs", 0, 0, G_OPTION_ARG_NONE, &opt_typelibs, N_("List other typelibs the inspected typelib requires"), NULL }, + { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &namespaces, N_("The typelib to inspect"), N_("NAMESPACE") }, + G_OPTION_ENTRY_NULL + }; + GOptionContext *context = NULL; + + setlocale (LC_ALL, ""); + + context = g_option_context_new (_("- Inspect GI typelib")); + g_option_context_add_main_entries (context, options, NULL); + if (!g_option_context_parse (context, &argc, &argv, &error)) + { + char *message = g_strdup_printf (_("Failed to parse command line options: %s"), error->message); + status = EXIT_FAILURE; + g_printerr ("%s\n", message); + g_free (message); + goto out; + } + + if (!namespaces || g_strv_length (namespaces) > 1) + { + status = EXIT_FAILURE; + g_printerr ("%s\n", _("Please specify exactly one namespace")); + goto out; + } + + namespace = namespaces[0]; + + if (!opt_shlibs && !opt_typelibs) + { + status = EXIT_FAILURE; + g_printerr ("%s\n", _("Please specify --print-shlibs, --print-typelibs or both")); + goto out; + } + + repository = gi_repository_new (); + typelib = gi_repository_require (repository, namespace, version, 0, &error); + if (!typelib) + { + char *message = g_strdup_printf (_("Failed to load typelib: %s"), error->message); + status = EXIT_FAILURE; + g_printerr ("%s\n", message); + g_free (message); + goto out; + } + + if (opt_shlibs) + print_shlibs (repository, namespace); + if (opt_typelibs) + print_typelibs (repository, namespace); + +out: + g_option_context_free (context); + if (error) + g_error_free (error); + g_clear_object (&repository); + g_strfreev (namespaces); + g_free (version); + + return status; +} diff --git a/girepository/inspector/meson.build b/girepository/inspector/meson.build new file mode 100644 index 0000000..8948ced --- /dev/null +++ b/girepository/inspector/meson.build @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# SPDX-FileCopyrightText: 2024 GNOME Foundation + +custom_c_args = [ + '-DG_LOG_DOMAIN="GLib-GirInspector"', +] + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-old-style-definition', + '-Wno-cast-align', + '-Wno-unused-parameter', + '-Wno-duplicated-branches', + ]) +endif + +giinspecttypelib = executable('gi-inspect-typelib', 'inspector.c', + dependencies: [ + libgirepository_dep, + libgio_dep, + ], + install: true, + c_args: custom_c_args, +) diff --git a/girepository/introspection/meson.build b/girepository/introspection/meson.build new file mode 100644 index 0000000..9405686 --- /dev/null +++ b/girepository/introspection/meson.build @@ -0,0 +1,320 @@ + +gi_identifier_prefix = 'G' +gi_symbol_prefix = 'g' + +gi_gen_shared_sources = [ + # Required to compile gdump + gmodule_visibility_h, +] + +gi_gen_env_variables = environment() + +if get_option('b_sanitize') != '' + gi_gen_env_variables.append( + 'ASAN_OPTIONS', 'verify_asan_link_order=0', separator: ',') +endif + +# GLib +glib_gir_sources = [ + gi_gen_shared_sources, + glibconfig_h, + gversionmacros_h, + glib_visibility_h, + glib_headers, + glib_deprecated_headers, + glib_sub_headers, + glib_enumtypes_h, + glib_types_h, + glib_deprecated_sources, + glib_sources, +] + +# For API compatibility reasons, GLib-2.0.gir needs to contain the platform +# specific APIs which are also present in the (newer) GLibUnix-2.0.gir and +# GLibWin32-2.0.gir repositories. +# See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3892#note_2001361 +# These can be dropped when GLib next breaks API (i.e. with GLib-3.0.gir). +if host_system == 'windows' + glib_gir_sources += files('../../glib/gwin32.h') +else + glib_gir_sources += files('../../glib/glib-unix.h') +endif + +glib_gir = gnome.generate_gir(libglib, + sources: glib_gir_sources, + namespace: 'GLib', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: 'glib-2.0', + header: 'glib.h', + install: true, + dependencies: [ + libgobject_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + [ + '-DGLIB_COMPILATION', + '-DGETTEXT_PACKAGE="dummy"', + '--symbol-prefix=glib', + '--library-path=' + meson.current_build_dir(), + '--library=gobject-2.0', + ], +) + +if host_system == 'windows' + glib_win32_gir = gnome.generate_gir(libglib, + sources: [ + gi_gen_shared_sources, + glib_win32_headers, + ], + namespace: 'GLibWin32', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: 'glib-2.0', + header: 'glib.h', + includes: [ glib_gir[0] ], + install: true, + dependencies: [ + libgobject_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + [ + '-DGLIB_COMPILATION', + '-DGETTEXT_PACKAGE="dummy"', + '--symbol-prefix=glib', + '--symbol-prefix=g_win32', + '--identifier-prefix=GWin32', + '--library-path=' + meson.current_build_dir(), + '--library=gobject-2.0', + ], + ) +else + glib_unix_gir = gnome.generate_gir(libglib, + sources: [ + gi_gen_shared_sources, + glib_unix_headers, + ], + namespace: 'GLibUnix', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: 'glib-2.0', + header: 'glib.h', + includes: [ glib_gir[0] ], + install: true, + dependencies: [ + libgobject_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + [ + '-DGLIB_COMPILATION', + '-DGETTEXT_PACKAGE="dummy"', + '--symbol-prefix=glib', + '--symbol-prefix=g_unix', + '--identifier-prefix=GUnix', + '--library-path=' + meson.current_build_dir(), + '--library=gobject-2.0', + '--c-include=glib-unix.h', + ], + ) +endif + +# GObject +gobject_gir = gnome.generate_gir(libgobject, + sources: [ + gi_gen_shared_sources, + gobject_visibility_h, + gobject_install_headers, + gobject_sources, + ], + namespace: 'GObject', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: 'gobject-2.0', + header: 'glib-object.h', + includes: [ glib_gir[0] ], + install: true, + env: gi_gen_env_variables, + extra_args: gir_args + [ + '-DGOBJECT_COMPILATION', + '--symbol-prefix=gobject', + ], +) + +# GModule +gmodule_gir = gnome.generate_gir(libgmodule, + sources: [ + gi_gen_shared_sources, + gmoduleconf_h, + gmodule_h, + gmodule_c, + gmodule_deprecated_c, + gmodule_visibility_h, + ], + namespace: 'GModule', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: 'gmodule-2.0', + header: 'gmodule.h', + includes: [ glib_gir[0] ], + install: true, + dependencies: [ + libglib_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + [ + '-DGMODULE_COMPILATION', + '-DGETTEXT_PACKAGE="dummy"', + '--symbol-prefix=gmodule', + ], +) + +# Gio +gio_gir_sources = [ + gi_gen_shared_sources, + gio_visibility_h, + gioenumtypes_h, + gnetworking_h, + gio_headers, + gio_base_sources, + application_sources, + gdbus_sources, + contenttype_sources, + settings_sources, +] +gio_gir_packages = [ 'gio-2.0' ] +gio_gir_args = [ + '-DGIO_COMPILATION', + '-DG_SETTINGS_ENABLE_BACKEND', + '--symbol-prefix=gio', +] + +# For API compatibility reasons, Gio-2.0.gir needs to contain the platform +# specific APIs which are also present in the (newer) GioUnix-2.0.gir and +# GioWin32-2.0.gir repositories. +# See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/3892#note_2001361 +# These can be dropped when GIO next breaks API (i.e. with Gio-3.0.gir). +if host_system == 'windows' + gio_gir_sources += [ gio_win32_include_headers, win32_sources ] + foreach h: gio_win32_include_headers + gio_gir_args += '--c-include=@0@'.format(h) + endforeach + gio_gir_packages += 'gio-win32-2.0' + gio_gir_args += '--pkg=gio-win32-2.0' +else + gio_gir_sources += [ gio_unix_include_headers, unix_sources ] + foreach h: gio_unix_include_headers + gio_gir_args += '--c-include=@0@'.format(h) + endforeach + gio_gir_packages += 'gio-unix-2.0' + gio_gir_args += '--pkg=gio-unix-2.0' +endif + +gio_gir = gnome.generate_gir(libgio, + sources: gio_gir_sources, + namespace: 'Gio', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: gio_gir_packages, + header: 'gio/gio.h', + includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0] ], + install: true, + dependencies: [ + libglib_dep, + libgobject_dep, + libgmodule_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + gio_gir_args, +) + +if host_system == 'windows' + gio_win32_gir_c_includes = [] + foreach h: gio_win32_include_headers + gio_win32_gir_c_includes += '--c-include=@0@'.format(h) + endforeach + + gio_win32_gir = gnome.generate_gir(libgio, + sources: gio_win32_include_headers + win32_sources, + namespace: 'GioWin32', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: [ 'gio-win32-2.0' ], + header: 'gio/gio.h', + includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ], + install: true, + dependencies: [ + libglib_dep, + libgobject_dep, + libgmodule_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + gio_gir_args + gio_win32_gir_c_includes + [ + '--pkg=gio-win32-2.0', + '--symbol-prefix=g_win32', + '--identifier-prefix=GWin32' + ], + ) +else + gio_unix_gir_c_includes = [] + foreach h: gio_unix_include_headers + gio_unix_gir_c_includes += '--c-include=@0@'.format(h) + endforeach + + gio_unix_gir = gnome.generate_gir(libgio, + sources: gio_unix_include_headers + unix_sources, + namespace: 'GioUnix', + nsversion: '2.0', + identifier_prefix: gi_identifier_prefix, + symbol_prefix: gi_symbol_prefix, + export_packages: [ 'gio-unix-2.0' ], + header: 'gio/gio.h', + includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ], + install: true, + dependencies: [ + libglib_dep, + libgobject_dep, + libgmodule_dep, + ], + env: gi_gen_env_variables, + extra_args: gir_args + gio_gir_args + gio_unix_gir_c_includes + [ + '--pkg=gio-unix-2.0', + '--symbol-prefix=g_unix', + '--identifier-prefix=GUnix' + ], + ) +endif + +# GIRepository +libgirepository_gir_sources = [ + gi_visibility_h, + girepo_headers, + girepo_sources, +] +libgirepository_gir_packages = [ 'girepository-2.0' ] +libgirepository_gir_args = [ + '-DGI_COMPILATION', + '--symbol-prefix=gi', + '--identifier-prefix=GI', +] + +girepository_gir = gnome.generate_gir(libgirepository, + sources: libgirepository_gir_sources, + namespace: 'GIRepository', + nsversion: '3.0', + identifier_prefix: 'GI', + symbol_prefix: 'gi', + export_packages: libgirepository_gir_packages, + header: 'girepository/girepository.h', + includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ], + install: true, + dependencies: [ libglib_dep, libgobject_dep, libgmodule_dep, libgio_dep ], + extra_args: gir_args + libgirepository_gir_args, +) + diff --git a/girepository/meson.build b/girepository/meson.build new file mode 100644 index 0000000..3a17cf5 --- /dev/null +++ b/girepository/meson.build @@ -0,0 +1,253 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# SPDX-FileCopyrightText: 2017 Patrick Griffis +# SPDX-FileCopyrightText: 2017 Danny Forghieri +# SPDX-FileCopyrightText: 2017 Nirbheek Chauhan +# SPDX-FileCopyrightText: 2017, 2021, 2022 Emmanuele Bassi +# SPDX-FileCopyrightText: 2018 Mathieu Duponchelle +# SPDX-FileCopyrightText: 2018, 2019, 2020 Christoph Reiter +# SPDX-FileCopyrightText: 2018 Kai Kang +# SPDX-FileCopyrightText: 2018 Carlos Garnacho +# SPDX-FileCopyrightText: 2018, 2019, 2020 Alexander Kanavin +# SPDX-FileCopyrightText: 2019, 2020 Chun-wei Fan +# SPDX-FileCopyrightText: 2019 Aaron Boxer +# SPDX-FileCopyrightText: 2019 Thibault Saunier +# SPDX-FileCopyrightText: 2019 Joshua Watt +# SPDX-FileCopyrightText: 2020 Xavier Claessens +# SPDX-FileCopyrightText: 2020 Philip Chimento +# SPDX-FileCopyrightText: 2021 John Ericson +# SPDX-FileCopyrightText: 2021 Cimbali +# SPDX-FileCopyrightText: 2021, 2023 Simon McVittie +# SPDX-FileCopyrightText: 2022 Andoni Morales Alastruey + +subdir('cmph') + +gir_dir_prefix = get_option('gir_dir_prefix') +if gir_dir_prefix == '' or gir_dir_prefix == get_option('datadir') + gir_dir_prefix = get_option('datadir') + gir_dir_pc_prefix = '${datadir}' +else + gir_dir_pc_prefix = join_paths('${prefix}', gir_dir_prefix) +endif + +glib_girdir = get_option('prefix') / gir_dir_prefix / 'gir-1.0' + +gir_includedir = glib_includedir / 'girepository' + +gi_visibility_h = custom_target( + output: 'gi-visibility.h', + command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GI', '@OUTPUT@'], + install: true, + install_dir: gir_includedir, + install_tag: 'devel', +) + +girepo_headers = files( + 'giarginfo.h', + 'gibaseinfo.h', + 'gicallableinfo.h', + 'gicallbackinfo.h', + 'giconstantinfo.h', + 'gienuminfo.h', + 'gifieldinfo.h', + 'giflagsinfo.h', + 'gifunctioninfo.h', + 'giinterfaceinfo.h', + 'giobjectinfo.h', + 'gipropertyinfo.h', + 'giregisteredtypeinfo.h', + 'girepository.h', + 'girepository-autocleanups.h', + 'gisignalinfo.h', + 'gistructinfo.h', + 'gitypeinfo.h', + 'gitypelib.h', + 'gitypes.h', + 'giunioninfo.h', + 'giunresolvedinfo.h', + 'givalueinfo.h', + 'givfuncinfo.h', +) + +girepo_ffi_headers = [ + 'girffi.h', +] + +girepo_ffi_sources = files( + 'girffi.c', +) + +install_headers(girepo_headers + girepo_ffi_headers, install_dir: gir_includedir) + +gir_c_args = [ + '-DGI_COMPILATION', + '-DG_LOG_DOMAIN="GLib-GIRepository"', + '-DGIR_SUFFIX="gir-1.0"', + '-DGIR_DIR="@0@"'.format(glib_girdir), + '-DGOBJECT_INTROSPECTION_LIBDIR="@0@"'.format(glib_libdir), + '-DGOBJECT_INTROSPECTION_DATADIR="@0@"'.format(glib_datadir), +] + +custom_c_args = [] + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-old-style-definition', + '-Wno-cast-align', + ]) +endif + +girepo_gthash_lib = static_library('girepository-gthash', + sources: ['gthash.c', gi_visibility_h], + include_directories : [configinc, girepoinc], + c_args: gir_c_args + custom_c_args, + dependencies: [ + cmph_dep, + libglib_dep, + libgmodule_dep, + libgobject_dep, + ], + gnu_symbol_visibility : 'hidden', +) + +girepo_gthash_dep = declare_dependency( + link_with: girepo_gthash_lib, + dependencies: [libglib_dep, libgmodule_dep, libgobject_dep], + include_directories: [girepoinc], +) + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-unused-parameter', + '-Wno-duplicated-branches', + '-Wno-cast-align', + ]) +endif + +libgirepository_internals = static_library('girepository-internals', + sources: [ + 'girmodule.c', + 'girnode.c', + 'giroffsets.c', + 'girparser.c', + 'girwriter.c', + gi_visibility_h, + ], + c_args: gir_c_args + custom_c_args, + gnu_symbol_visibility : 'hidden', + include_directories : [configinc, girepoinc], + dependencies: [girepo_gthash_dep, libffi_dep], +) + +libgirepository_internals_dep = declare_dependency( + link_with: libgirepository_internals, + dependencies: libffi_dep, + include_directories: [girepoinc], +) + +girepo_sources = files( + 'gdump.c', + 'giarginfo.c', + 'gibaseinfo.c', + 'gicallableinfo.c', + 'gicallbackinfo.c', + 'giconstantinfo.c', + 'gienuminfo.c', + 'gifieldinfo.c', + 'giflagsinfo.c', + 'gifunctioninfo.c', + 'ginvoke.c', + 'giinterfaceinfo.c', + 'giobjectinfo.c', + 'gipropertyinfo.c', + 'giregisteredtypeinfo.c', + 'girepository.c', + 'girffi.c', + 'gisignalinfo.c', + 'gistructinfo.c', + 'gitypeinfo.c', + 'gitypelib.c', + 'giunioninfo.c', + 'giunresolvedinfo.c', + 'givalueinfo.c', + 'givfuncinfo.c', +) + +if cc.get_id() != 'msvc' + custom_c_args = cc.get_supported_arguments([ + '-Wno-unused-parameter', + '-Wno-duplicated-branches', + '-Wno-type-limits', + '-Wno-cast-align', + '-Wno-missing-field-initializers', + ]) +endif + +libgirepository = library('girepository-2.0', + sources: girepo_sources + girepo_ffi_sources + [gi_visibility_h], + include_directories: [configinc, girepoinc], + c_args: gir_c_args, + version: library_version, + soversion: soversion, + darwin_versions: darwin_versions, + gnu_symbol_visibility: 'hidden', + link_args: glib_link_flags, + dependencies: [ + libglib_dep, + libgobject_dep, + libgmodule_dep, + libgio_dep, + libgirepository_internals_dep, + ], + install: true, +) + +libgirepository_dep = declare_dependency( + link_with: libgirepository, + dependencies: [libglib_dep, libgobject_dep, libgio_dep, libgmodule_dep], + sources: [gi_visibility_h], + include_directories: [girepoinc], + variables: { + # Export the path for the built GLib-2.0.typelib (etc.) for when GLib is + # used as a subproject. The variable names match those in + # pkgconfig_variables below. + 'girdir': meson.current_build_dir() / 'introspection', + 'typelibdir': meson.current_build_dir() / 'introspection', + }, +) + +executable('gi-dump-types', + sources: 'gi-dump-types.c', + dependencies: [ + libgirepository_dep, + libgiounix_dep, + libgiowin32_dep + ], +) + +pkgconfig_variables = [ + 'gidatadir=${datadir}/gobject-introspection-1.0', + 'girdir=' + gir_dir_pc_prefix / 'gir-1.0', + 'typelibdir=${libdir}/girepository-1.0', +] + +pkg.generate(libgirepository, + name: 'girepository', + version: glib_version, + filebase: 'girepository-2.0', + install_dir: glib_pkgconfigreldir, + description: 'GObject Introspection repository parser', + variables: pkgconfig_variables, + libraries: [libglib_dep, libgobject_dep], +) + +if enable_gir + subdir('introspection') +endif + +if build_tests + subdir('tests') +endif + +subdir('compiler') +subdir('decompiler') +subdir('inspector') \ No newline at end of file diff --git a/girepository/tests/autoptr.c b/girepository/tests/autoptr.c new file mode 100644 index 0000000..8f3a3fc --- /dev/null +++ b/girepository/tests/autoptr.c @@ -0,0 +1,354 @@ +/* + * Copyright 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Author: Philip Withnall + */ + +#include "girepository.h" +#include "girffi.h" +#include "glib.h" +#include "test-common.h" + +static void +test_autoptr_repository (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIRepository) repository = gi_repository_new (); + g_assert_nonnull (repository); +} + +static void +test_autoptr_typelib (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GITypelib) typelib = NULL; + GError *local_error = NULL; + + typelib = gi_repository_require (fx->repository, "Gio", "2.0", + GI_REPOSITORY_LOAD_FLAG_NONE, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (typelib); + + /* gi_repository_require() doesn’t return a reference so let’s add one */ + gi_typelib_ref (typelib); +} + +static void +test_autoptr_base_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIBaseInfo) base_info = gi_repository_find_by_name (fx->repository, "Gio", "Resolver"); + g_assert_nonnull (base_info); +} + +static void +test_autoptr_arg_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIFunctionInfo *method_info = NULL; + g_autoptr(GIArgInfo) arg_info = NULL; + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (method_info), 0); + g_assert_nonnull (arg_info); + + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_autoptr_callable_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GICallableInfo) callable_info = GI_CALLABLE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "tls_server_connection_new")); + g_assert_nonnull (callable_info); +} + +static void +test_autoptr_callback_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GICallbackInfo) callback_info = GI_CALLBACK_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AsyncReadyCallback")); + g_assert_nonnull (callback_info); +} + +static void +test_autoptr_constant_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIConstantInfo) constant_info = GI_CONSTANT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "DBUS_METHOD_INVOCATION_HANDLED")); + g_assert_nonnull (constant_info); +} + +static void +test_autoptr_enum_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIEnumInfo) enum_info = GI_ENUM_INFO (gi_repository_find_by_name (fx->repository, "Gio", "DBusError")); + g_assert_nonnull (enum_info); +} + +static void +test_autoptr_field_info (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *struct_info = NULL; + g_autoptr(GIFieldInfo) field_info = NULL; + + struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "ActionEntry")); + g_assert_nonnull (struct_info); + field_info = gi_struct_info_find_field (struct_info, "name"); + g_assert_nonnull (field_info); + + g_clear_pointer (&struct_info, gi_base_info_unref); +} + +static void +test_autoptr_flags_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIFlagsInfo) flags_info = GI_FLAGS_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppInfoCreateFlags")); + g_assert_nonnull (flags_info); +} + +static void +test_autoptr_function_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIFunctionInfo) function_info = GI_FUNCTION_INFO (gi_repository_find_by_name (fx->repository, "Gio", "tls_server_connection_new")); + g_assert_nonnull (function_info); +} + +static void +test_autoptr_interface_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIInterfaceInfo) interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AsyncInitable")); + g_assert_nonnull (interface_info); +} + +static void +test_autoptr_object_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIObjectInfo) object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "BufferedInputStream")); + g_assert_nonnull (object_info); +} + +static void +test_autoptr_property_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + g_autoptr(GIPropertyInfo) property_info = NULL; + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "BufferedInputStream")); + g_assert_nonnull (object_info); + property_info = gi_object_info_get_property (object_info, 0); + g_assert_nonnull (property_info); + + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_autoptr_registered_type_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIRegisteredTypeInfo) registered_type_info = + GI_REGISTERED_TYPE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "SrvTarget")); + g_assert_nonnull (registered_type_info); +} + +static void +test_autoptr_signal_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + g_autoptr(GISignalInfo) signal_info = NULL; + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "Cancellable")); + g_assert_nonnull (object_info); + signal_info = gi_object_info_find_signal (object_info, "cancelled"); + g_assert_nonnull (signal_info); + + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_autoptr_struct_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIStructInfo) struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "DBusAnnotationInfo")); + g_assert_nonnull (struct_info); +} + +static void +test_autoptr_type_info (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *struct_info = NULL; + GIFieldInfo *field_info = NULL; + g_autoptr(GITypeInfo) type_info = NULL; + + struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "ActionEntry")); + g_assert_nonnull (struct_info); + field_info = gi_struct_info_find_field (struct_info, "name"); + g_assert_nonnull (field_info); + type_info = gi_field_info_get_type_info (field_info); + g_assert_nonnull (type_info); + + g_clear_pointer (&field_info, gi_base_info_unref); + g_clear_pointer (&struct_info, gi_base_info_unref); +} + +static void +test_autoptr_union_info (RepositoryFixture *fx, + const void *unused) +{ + g_autoptr(GIUnionInfo) union_info = GI_UNION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "DoubleIEEE754")); + g_assert_nonnull (union_info); +} + +static void +test_autoptr_value_info (RepositoryFixture *fx, + const void *unused) +{ + GIEnumInfo *enum_info = NULL; + g_autoptr(GIValueInfo) value_info = NULL; + + enum_info = GI_ENUM_INFO (gi_repository_find_by_name (fx->repository, "Gio", "ZlibCompressorFormat")); + g_assert_nonnull (enum_info); + value_info = gi_enum_info_get_value (enum_info, 0); + g_assert_nonnull (value_info); + + g_clear_pointer (&enum_info, gi_base_info_unref); +} + +static void +test_autoptr_vfunc_info (RepositoryFixture *fx, + const void *unused) +{ + GIInterfaceInfo *interface_info = NULL; + g_autoptr(GIVFuncInfo) vfunc_info = NULL; + + interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "Action")); + g_assert_nonnull (interface_info); + vfunc_info = gi_interface_info_find_vfunc (interface_info, "activate"); + g_assert_nonnull (vfunc_info); + + g_clear_pointer (&interface_info, gi_base_info_unref); +} + +static void +test_auto_arg_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIFunctionInfo *method_info = NULL; + g_auto(GIArgInfo) arg_info = { 0, }; + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + gi_callable_info_load_arg (GI_CALLABLE_INFO (method_info), 0, &arg_info); + g_assert_true (GI_IS_ARG_INFO (&arg_info)); + + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_auto_type_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIFunctionInfo *method_info = NULL; + GIArgInfo *arg_info = NULL; + g_auto(GITypeInfo) type_info = { 0, }; + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (method_info), 0); + g_assert_nonnull (arg_info); + gi_arg_info_load_type_info (arg_info, &type_info); + g_assert_true (GI_IS_TYPE_INFO (&type_info)); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_auto_function_invoker (RepositoryFixture *fx, + const void *unused) +{ + GIFunctionInfo *function_info = NULL; + g_auto(GIFunctionInvoker) invoker = { 0, }; + GError *local_error = NULL; + + function_info = GI_FUNCTION_INFO (gi_repository_find_by_name (fx->repository, "Gio", "tls_server_connection_new")); + g_assert_nonnull (function_info); + gi_function_info_prep_invoker (function_info, &invoker, &local_error); + g_assert_no_error (local_error); + + g_clear_pointer (&function_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/autoptr/repository", test_autoptr_repository, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/typelib", test_autoptr_typelib, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/base-info", test_autoptr_base_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/arg-info", test_autoptr_arg_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/callable-info", test_autoptr_callable_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/callback-info", test_autoptr_callback_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/constant-info", test_autoptr_constant_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/enum-info", test_autoptr_enum_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/field-info", test_autoptr_field_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/flags-info", test_autoptr_flags_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/function-info", test_autoptr_function_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/interface-info", test_autoptr_interface_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/object-info", test_autoptr_object_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/property-info", test_autoptr_property_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/registered-type-info", test_autoptr_registered_type_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/signal-info", test_autoptr_signal_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/struct-info", test_autoptr_struct_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/type-info", test_autoptr_type_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/union-info", test_autoptr_union_info, &typelib_load_spec_glib); + /* no easy way to test GIUnresolvedInfo */ + ADD_REPOSITORY_TEST ("/autoptr/value-info", test_autoptr_value_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/autoptr/vfunc-info", test_autoptr_vfunc_info, &typelib_load_spec_gio); + + ADD_REPOSITORY_TEST ("/auto/arg-info", test_auto_arg_info, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/auto/type-info", test_auto_type_info, &typelib_load_spec_gio); + + ADD_REPOSITORY_TEST ("/auto/function-invoker", test_auto_function_invoker, &typelib_load_spec_gio); + + return g_test_run (); +} diff --git a/girepository/tests/cmph-bdz.c b/girepository/tests/cmph-bdz.c new file mode 100644 index 0000000..9c5f052 --- /dev/null +++ b/girepository/tests/cmph-bdz.c @@ -0,0 +1,151 @@ +/* GObject introspection: Test cmph hashing + * + * Copyright (C) 2010 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include "cmph.h" + +static cmph_t * +build (void) +{ + cmph_config_t *config; + cmph_io_adapter_t *io; + char **strings; + cmph_t *c; + uint32_t size; + + strings = g_strsplit ("foo,bar,baz", ",", -1); + + io = cmph_io_vector_adapter (strings, g_strv_length (strings)); + config = cmph_config_new (io); + cmph_config_set_algo (config, CMPH_BDZ); + + c = cmph_new (config); + size = cmph_size (c); + g_assert_cmpuint (size, ==, g_strv_length (strings)); + + cmph_config_destroy (config); + cmph_io_vector_adapter_destroy (io); + g_strfreev (strings); + + return c; +} + +static void +assert_hashes_unique (size_t n_hashes, + uint32_t* hashes) +{ + size_t i; + + for (i = 0; i < n_hashes; i++) + { + for (size_t j = 0; j < n_hashes; j++) + { + if (j != i) + g_assert_cmpuint (hashes[i], !=, hashes[j]); + } + } +} + +static void +test_search (void) +{ + cmph_t *c = build(); + size_t i; + uint32_t hash; + uint32_t hashes[3]; + uint32_t size; + + size = cmph_size (c); + + i = 0; + hash = cmph_search (c, "foo", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + hash = cmph_search (c, "bar", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + hash = cmph_search (c, "baz", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + assert_hashes_unique (G_N_ELEMENTS (hashes), &hashes[0]); + + cmph_destroy (c); +} + +static void +test_search_packed (void) +{ + cmph_t *c = build(); + size_t i; + uint32_t bufsize; + uint32_t hash; + uint32_t hashes[3]; + uint32_t size; + uint8_t *buf; + + bufsize = cmph_packed_size (c); + buf = g_malloc (bufsize); + cmph_pack (c, buf); + + size = cmph_size (c); + + cmph_destroy (c); + c = NULL; + + i = 0; + hash = cmph_search_packed (buf, "foo", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + hash = cmph_search_packed (buf, "bar", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + hash = cmph_search_packed (buf, "baz", 3); + g_assert_cmpuint (hash, >=, 0); + g_assert_cmpuint (hash, <, size); + hashes[i++] = hash; + + assert_hashes_unique (G_N_ELEMENTS (hashes), &hashes[0]); + + g_free (buf); +} + +int +main(int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/cmph-bdz/search", test_search); + g_test_add_func ("/cmph-bdz/search-packed", test_search_packed); + + return g_test_run (); +} + diff --git a/girepository/tests/function-info.c b/girepository/tests/function-info.c new file mode 100644 index 0000000..9645cf4 --- /dev/null +++ b/girepository/tests/function-info.c @@ -0,0 +1,57 @@ +/* + * Copyright 2024 Philip Chimento + * Copyright 2024 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Author: Philip Withnall + */ + +#include "girepository.h" +#include "girffi.h" +#include "glib.h" +#include "test-common.h" + +static void +test_function_info_invoker (RepositoryFixture *fx, + const void *unused) +{ + GIFunctionInfo *function_info = NULL; + GIFunctionInvoker invoker; + GError *local_error = NULL; + + g_test_summary ("Test preparing a function invoker"); + + function_info = GI_FUNCTION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "get_locale_variants")); + g_assert_nonnull (function_info); + + gi_function_info_prep_invoker (function_info, &invoker, &local_error); + g_assert_no_error (local_error); + + gi_function_invoker_clear (&invoker); + g_clear_pointer (&function_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/function-info/invoker", test_function_info_invoker, &typelib_load_spec_glib); + + return g_test_run (); +} diff --git a/girepository/tests/gthash.c b/girepository/tests/gthash.c new file mode 100644 index 0000000..8d92792 --- /dev/null +++ b/girepository/tests/gthash.c @@ -0,0 +1,69 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * GObject introspection: Test typelib hashing + * + * Copyright (C) 2010 Red Hat, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include "gitypelib-internal.h" + +static void +test_build_retrieve (void) +{ + GITypelibHashBuilder *builder; + uint32_t bufsize; + uint8_t* buf; + + builder = gi_typelib_hash_builder_new (); + + gi_typelib_hash_builder_add_string (builder, "Action", 0); + gi_typelib_hash_builder_add_string (builder, "ZLibDecompressor", 42); + gi_typelib_hash_builder_add_string (builder, "VolumeMonitor", 9); + gi_typelib_hash_builder_add_string (builder, "FileMonitorFlags", 31); + + g_assert_true (gi_typelib_hash_builder_prepare (builder)); + + bufsize = gi_typelib_hash_builder_get_buffer_size (builder); + + buf = g_malloc (bufsize); + + gi_typelib_hash_builder_pack (builder, buf, bufsize); + + gi_typelib_hash_builder_destroy (builder); + + g_assert_cmpuint (gi_typelib_hash_search (buf, "Action", 4), ==, 0); + g_assert_cmpuint (gi_typelib_hash_search (buf, "ZLibDecompressor", 4), ==, 42); + g_assert_cmpuint (gi_typelib_hash_search (buf, "VolumeMonitor", 4), ==, 9); + g_assert_cmpuint (gi_typelib_hash_search (buf, "FileMonitorFlags", 4), ==, 31); + + g_free (buf); +} + +int +main(int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/gthash/build-retrieve", test_build_retrieve); + + return g_test_run (); +} + diff --git a/girepository/tests/meson.build b/girepository/tests/meson.build new file mode 100644 index 0000000..7f5b709 --- /dev/null +++ b/girepository/tests/meson.build @@ -0,0 +1,127 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# SPDX-FileCopyrightText: 2024 GNOME Foundation + +girepository_tests = { + 'cmph-bdz': { + 'dependencies': [cmph_dep], + }, + 'gthash' : { + 'dependencies': [girepo_gthash_dep], + }, +} + +# Some tests require GIR files to have been generated +if enable_gir + girepository_tests += { + 'function-info' : { + 'dependencies': [libffi_dep], + 'depends': [glib_gir], + }, + 'object-info' : { + 'depends': [gio_gir], + }, + 'registered-type-info' : { + 'depends': [gobject_gir], + }, + 'repository' : { + 'depends': [glib_gir, gio_gir, gobject_gir], + }, + 'repository-search-paths' : { + 'c_args': '-DGOBJECT_INTROSPECTION_LIBDIR="@0@"'.format(glib_libdir), + 'depends': [glib_gir], + }, + 'struct-info' : { + 'depends': [gobject_gir], + }, + 'throws' : { + 'depends': [glib_gir, gio_gir], + }, + 'union-info' : { + 'depends': [glib_gir], + }, + } + + if cc.get_id() != 'msvc' + girepository_tests += { + 'autoptr-girepository' : { + 'source' : 'autoptr.c', + 'depends': [glib_gir, gio_gir], + }, + } + endif +endif + +test_env = environment() +test_env.set('G_TEST_SRCDIR', meson.current_source_dir()) +test_env.set('G_TEST_BUILDDIR', meson.current_build_dir()) + +test_deps = [libm, thread_dep, libgirepository_dep] +test_cargs = ['-DG_LOG_DOMAIN="GIRepository"', '-UG_DISABLE_ASSERT'] +test_cpp_args = test_cargs + +foreach test_name, extra_args : girepository_tests + source = extra_args.get('source', test_name + '.c') + install = installed_tests_enabled and extra_args.get('install', true) + installed_tests_env = extra_args.get('installed_tests_env', {}) + + if install + test_conf = configuration_data() + test_conf.set('installed_tests_dir', installed_tests_execdir) + test_conf.set('program', test_name) + test_env_override = '' + if installed_tests_env != {} + envs = [] + foreach var, value : installed_tests_env + envs += '@0@=@1@'.format(var, value) + endforeach + test_env_override = '@0@ @1@ '.format(env_program.full_path(), ' '.join(envs)) + endif + test_conf.set('env', test_env_override) + configure_file( + input: installed_tests_template_tap, + output: test_name + '.test', + install_dir: installed_tests_metadir, + install_tag: 'tests', + configuration: test_conf + ) + endif + + exe = executable(test_name, source, 'test-common.c', + c_args: test_cargs + extra_args.get('c_args', []), + cpp_args: test_cpp_args + extra_args.get('cpp_args', []), + link_args: extra_args.get('link_args', []), + override_options: extra_args.get('override_options', []), + dependencies: test_deps + extra_args.get('dependencies', []), + link_with: extra_args.get('link_with', []), + install_dir: installed_tests_execdir, + install_tag: 'tests', + install: install, + ) + + depends = [extra_args.get('depends', [])] + suite = ['girepository', 'core'] + extra_args.get('suite', []) + timeout = suite.contains('slow') ? test_timeout_slow : test_timeout + + if extra_args.get('can_fail', false) + suite += 'failing' + endif + + foreach program : extra_args.get('extra_programs', []) + depends += test_extra_programs_targets[program] + endforeach + + local_test_env = test_env + foreach var, value : extra_args.get('env', {}) + local_test_env.append(var, value) + endforeach + + test(test_name, exe, + args: extra_args.get('args', []), + protocol: extra_args.get('protocol', test_protocol), + depends: depends, + env: local_test_env, + timeout: timeout, + suite: suite, + should_fail: extra_args.get('should_fail', false), + ) +endforeach diff --git a/girepository/tests/object-info.c b/girepository/tests/object-info.c new file mode 100644 index 0000000..7245dae --- /dev/null +++ b/girepository/tests/object-info.c @@ -0,0 +1,82 @@ +/* + * Copyright 2024 Philip Chimento + * Copyright 2024 GNOME Foundation + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "test-common.h" + +static void +test_object_info_find_method_using_interfaces (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *class_info = NULL; + GIFunctionInfo *method_info = NULL; + GIBaseInfo *declarer_info = NULL; + + class_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "DBusProxy")); + g_assert_nonnull (class_info); + + method_info = gi_object_info_find_method_using_interfaces (class_info, "init", &declarer_info); + + g_assert_nonnull (declarer_info); + g_assert_cmpstr (gi_base_info_get_namespace (declarer_info), ==, "Gio"); + g_assert_cmpstr (gi_base_info_get_name (declarer_info), ==, "Initable"); + g_assert_true (GI_IS_INTERFACE_INFO (declarer_info)); + + g_clear_pointer (&class_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&declarer_info, gi_base_info_unref); +} + +static void +test_object_info_find_vfunc_using_interfaces (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *class_info = NULL; + GIVFuncInfo *vfunc_info = NULL; + GIBaseInfo *declarer_info = NULL; + + class_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "Application")); + g_assert_nonnull (class_info); + + vfunc_info = gi_object_info_find_vfunc_using_interfaces (class_info, "after_emit", &declarer_info); + + g_assert_nonnull (declarer_info); + g_assert_cmpstr (gi_base_info_get_namespace (declarer_info), ==, "Gio"); + g_assert_cmpstr (gi_base_info_get_name (declarer_info), ==, "Application"); + g_assert_true (GI_IS_OBJECT_INFO (declarer_info)); + + g_clear_pointer (&class_info, gi_base_info_unref); + g_clear_pointer (&vfunc_info, gi_base_info_unref); + g_clear_pointer (&declarer_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/object-info/find-method-using-interfaces", test_object_info_find_method_using_interfaces, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/object-info/find-vfunc-using-interfaces", test_object_info_find_vfunc_using_interfaces, &typelib_load_spec_gio); + + return g_test_run (); +} diff --git a/girepository/tests/registered-type-info.c b/girepository/tests/registered-type-info.c new file mode 100644 index 0000000..16dbf82 --- /dev/null +++ b/girepository/tests/registered-type-info.c @@ -0,0 +1,137 @@ +/* + * Copyright 2024 GNOME Foundation + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "test-common.h" + +static void +test_boxed (RepositoryFixture *fx, + const void *unused) +{ + const struct + { + const char *name; + GType expect_info_type; + gboolean expect_nonnull_gtype_info; + gboolean expect_is_gtype_struct; + gboolean expect_boxed; + } + types[] = + { + { + /* POD struct */ + .name = "CClosure", + .expect_info_type = GI_TYPE_STRUCT_INFO, + .expect_nonnull_gtype_info = FALSE, + .expect_is_gtype_struct = FALSE, + .expect_boxed = FALSE, + }, + { + /* POD union */ + .name = "TypeCValue", + .expect_info_type = GI_TYPE_UNION_INFO, + .expect_nonnull_gtype_info = FALSE, + .expect_is_gtype_struct = FALSE, + .expect_boxed = FALSE, + }, + { + /* struct for a different non-boxed GType */ + .name = "InitiallyUnownedClass", + .expect_info_type = GI_TYPE_STRUCT_INFO, + .expect_nonnull_gtype_info = FALSE, + .expect_is_gtype_struct = TRUE, + .expect_boxed = FALSE, + }, + { + /* boxed struct */ + .name = "BookmarkFile", + .expect_info_type = GI_TYPE_STRUCT_INFO, + .expect_nonnull_gtype_info = TRUE, + .expect_is_gtype_struct = FALSE, + .expect_boxed = TRUE, + }, + { + /* boxed struct */ + .name = "Closure", + .expect_info_type = GI_TYPE_STRUCT_INFO, + .expect_nonnull_gtype_info = TRUE, + .expect_is_gtype_struct = FALSE, + .expect_boxed = TRUE, + }, + { + /* non-boxed GType */ + .name = "Object", + .expect_info_type = GI_TYPE_OBJECT_INFO, + .expect_nonnull_gtype_info = TRUE, + .expect_is_gtype_struct = FALSE, + .expect_boxed = FALSE, + }, + }; + + g_test_summary ("Test various boxed and non-boxed types for GIRegisteredTypeInfo"); + + for (size_t i = 0; i < G_N_ELEMENTS (types); i++) + { + GIRegisteredTypeInfo *type_info = GI_REGISTERED_TYPE_INFO (gi_repository_find_by_name (fx->repository, "GObject", types[i].name)); + g_assert_nonnull (type_info); + + g_test_message ("Expecting %s to %s", types[i].name, types[i].expect_boxed ? "be boxed" : "not be boxed"); + + g_assert_cmpuint (G_TYPE_FROM_INSTANCE (type_info), ==, types[i].expect_info_type); + + if (types[i].expect_nonnull_gtype_info) + { + g_assert_nonnull (gi_registered_type_info_get_type_name (type_info)); + g_assert_nonnull (gi_registered_type_info_get_type_init_function_name (type_info)); + } + else + { + g_assert_null (gi_registered_type_info_get_type_name (type_info)); + g_assert_null (gi_registered_type_info_get_type_init_function_name (type_info)); + } + + if (GI_IS_STRUCT_INFO (type_info)) + { + if (types[i].expect_is_gtype_struct) + g_assert_true (gi_struct_info_is_gtype_struct (GI_STRUCT_INFO (type_info))); + else + g_assert_false (gi_struct_info_is_gtype_struct (GI_STRUCT_INFO (type_info))); + } + + if (types[i].expect_boxed) + g_assert_true (gi_registered_type_info_is_boxed (type_info)); + else + g_assert_false (gi_registered_type_info_is_boxed (type_info)); + + g_clear_pointer (&type_info, gi_base_info_unref); + } +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/registered-type-info/boxed", test_boxed, &typelib_load_spec_gobject); + + return g_test_run (); +} diff --git a/girepository/tests/repository-search-paths.c b/girepository/tests/repository-search-paths.c new file mode 100644 index 0000000..7bfe14d --- /dev/null +++ b/girepository/tests/repository-search-paths.c @@ -0,0 +1,149 @@ +/* + * Copyright 2023 Canonical Ltd. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Author: Marco Trevisan + */ + +#include "glib.h" +#include "girepository.h" + +static void +test_repository_search_paths_default (void) +{ + const char * const *search_paths; + size_t n_search_paths; + GIRepository *repository = NULL; + + repository = gi_repository_new (); + + search_paths = gi_repository_get_search_path (repository, &n_search_paths); + g_assert_nonnull (search_paths); + g_assert_cmpuint (g_strv_length ((char **) search_paths), ==, 2); + + g_assert_cmpstr (search_paths[0], ==, g_get_tmp_dir ()); + +#ifndef G_PLATFORM_WIN32 + char *expected_path = g_build_filename (GOBJECT_INTROSPECTION_LIBDIR, "girepository-1.0", NULL); + g_assert_cmpstr (search_paths[1], ==, expected_path); + g_clear_pointer (&expected_path, g_free); +#endif + + g_clear_object (&repository); +} + +static void +test_repository_search_paths_prepend (void) +{ + const char * const *search_paths; + size_t n_search_paths; + GIRepository *repository = NULL; + + repository = gi_repository_new (); + + gi_repository_prepend_search_path (repository, g_test_get_dir (G_TEST_BUILT)); + search_paths = gi_repository_get_search_path (repository, &n_search_paths); + g_assert_nonnull (search_paths); + g_assert_cmpuint (g_strv_length ((char **) search_paths), ==, 3); + + g_assert_cmpstr (search_paths[0], ==, g_test_get_dir (G_TEST_BUILT)); + g_assert_cmpstr (search_paths[1], ==, g_get_tmp_dir ()); + +#ifndef G_PLATFORM_WIN32 + char *expected_path = g_build_filename (GOBJECT_INTROSPECTION_LIBDIR, "girepository-1.0", NULL); + g_assert_cmpstr (search_paths[2], ==, expected_path); + g_clear_pointer (&expected_path, g_free); +#endif + + gi_repository_prepend_search_path (repository, g_test_get_dir (G_TEST_DIST)); + search_paths = gi_repository_get_search_path (repository, &n_search_paths); + g_assert_nonnull (search_paths); + g_assert_cmpuint (g_strv_length ((char **) search_paths), ==, 4); + + g_assert_cmpstr (search_paths[0], ==, g_test_get_dir (G_TEST_DIST)); + g_assert_cmpstr (search_paths[1], ==, g_test_get_dir (G_TEST_BUILT)); + g_assert_cmpstr (search_paths[2], ==, g_get_tmp_dir ()); + +#ifndef G_PLATFORM_WIN32 + expected_path = g_build_filename (GOBJECT_INTROSPECTION_LIBDIR, "girepository-1.0", NULL); + g_assert_cmpstr (search_paths[3], ==, expected_path); + g_clear_pointer (&expected_path, g_free); +#endif + + g_clear_object (&repository); +} + +static void +test_repository_library_paths_default (void) +{ + const char * const *library_paths; + size_t n_library_paths; + GIRepository *repository = NULL; + + repository = gi_repository_new (); + + library_paths = gi_repository_get_library_path (repository, &n_library_paths); + g_assert_nonnull (library_paths); + g_assert_cmpuint (g_strv_length ((char **) library_paths), ==, 0); + + g_clear_object (&repository); +} + +static void +test_repository_library_paths_prepend (void) +{ + const char * const *library_paths; + size_t n_library_paths; + GIRepository *repository = NULL; + + repository = gi_repository_new (); + + gi_repository_prepend_library_path (repository, g_test_get_dir (G_TEST_BUILT)); + library_paths = gi_repository_get_library_path (repository, &n_library_paths); + g_assert_nonnull (library_paths); + g_assert_cmpuint (g_strv_length ((char **) library_paths), ==, 1); + + g_assert_cmpstr (library_paths[0], ==, g_test_get_dir (G_TEST_BUILT)); + + gi_repository_prepend_library_path (repository, g_test_get_dir (G_TEST_DIST)); + library_paths = gi_repository_get_library_path (repository, &n_library_paths); + g_assert_nonnull (library_paths); + g_assert_cmpuint (g_strv_length ((char **) library_paths), ==, 2); + + g_assert_cmpstr (library_paths[0], ==, g_test_get_dir (G_TEST_DIST)); + g_assert_cmpstr (library_paths[1], ==, g_test_get_dir (G_TEST_BUILT)); + + g_clear_object (&repository); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); + + /* Isolate from the system typelibs and GIRs. */ + g_setenv ("GI_TYPELIB_PATH", g_get_tmp_dir (), TRUE); + g_setenv ("GI_GIR_PATH", g_get_user_cache_dir (), TRUE); + + g_test_add_func ("/repository/search-paths/default", test_repository_search_paths_default); + g_test_add_func ("/repository/search-paths/prepend", test_repository_search_paths_prepend); + g_test_add_func ("/repository/library-paths/default", test_repository_library_paths_default); + g_test_add_func ("/repository/library-paths/prepend", test_repository_library_paths_prepend); + + return g_test_run (); +} diff --git a/girepository/tests/repository.c b/girepository/tests/repository.c new file mode 100644 index 0000000..5650231 --- /dev/null +++ b/girepository/tests/repository.c @@ -0,0 +1,809 @@ +/* + * Copyright 2008-2011 Colin Walters + * Copyright 2011 Laszlo Pandy + * Copyright 2011 Torsten Schönfeld + * Copyright 2011, 2012 Pavel Holejsovsky + * Copyright 2013 Martin Pitt + * Copyright 2014 Giovanni Campagna + * Copyright 2018 Christoph Reiter + * Copyright 2019, 2024 Philip Chimento + * Copyright 2022 Emmanuele Bassi + * Copyright 2023 GNOME Foundation, Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Author: Philip Withnall + */ + +#include "config.h" + +#include "gio.h" +#include "girepository.h" +#include "glib.h" +#include "test-common.h" + +static void +test_repository_basic (RepositoryFixture *fx, + const void *unused) +{ + const char * const * search_paths; + char **namespaces = NULL; + size_t n_namespaces; + const char *expected_namespaces[] = { "GLib", NULL }; + char **versions; + size_t n_versions; + const char *prefix = NULL; + + g_test_summary ("Test basic opening of a repository and requiring a typelib"); + + versions = gi_repository_enumerate_versions (fx->repository, "SomeInvalidNamespace", &n_versions); + g_assert_nonnull (versions); + g_assert_cmpstrv (versions, ((char *[]){NULL})); + g_assert_cmpuint (n_versions, ==, 0); + g_clear_pointer (&versions, g_strfreev); + + versions = gi_repository_enumerate_versions (fx->repository, "GLib", NULL); + g_assert_nonnull (versions); + g_assert_cmpstrv (versions, ((char *[]){"2.0", NULL})); + g_clear_pointer (&versions, g_strfreev); + + search_paths = gi_repository_get_search_path (fx->repository, NULL); + g_assert_nonnull (search_paths); + g_assert_cmpuint (g_strv_length ((char **) search_paths), >, 0); + g_assert_cmpstr (search_paths[0], ==, fx->gobject_typelib_dir); + + namespaces = gi_repository_get_loaded_namespaces (fx->repository, &n_namespaces); + g_assert_cmpstrv (namespaces, expected_namespaces); + g_assert_cmpuint (n_namespaces, ==, g_strv_length ((char **) expected_namespaces)); + g_strfreev (namespaces); + + prefix = gi_repository_get_c_prefix (fx->repository, "GLib"); + g_assert_nonnull (prefix); + g_assert_cmpstr (prefix, ==, "G"); +} + +static void +test_repository_info (RepositoryFixture *fx, + const void *unused) +{ + GIBaseInfo *not_found_info = NULL; + GIObjectInfo *object_info = NULL, *object_info_by_gtype = NULL; + GISignalInfo *signal_info = NULL; + GIFunctionInfo *method_info = NULL; + GType gtype; + + g_test_summary ("Test retrieving some basic info blobs from a typelib"); + + not_found_info = gi_repository_find_by_name (fx->repository, "GObject", "ThisDoesNotExist"); + g_assert_null (not_found_info); + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + g_assert_true (GI_IS_OBJECT_INFO (object_info)); + g_assert_true (GI_IS_REGISTERED_TYPE_INFO (object_info)); + g_assert_true (GI_IS_BASE_INFO (object_info)); + + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (object_info)), ==, "Object"); + g_assert_cmpstr (gi_base_info_get_namespace (GI_BASE_INFO (object_info)), ==, "GObject"); + + gtype = gi_registered_type_info_get_g_type (GI_REGISTERED_TYPE_INFO (object_info)); + g_assert_true (g_type_is_a (gtype, G_TYPE_OBJECT)); + + object_info_by_gtype = GI_OBJECT_INFO (gi_repository_find_by_gtype (fx->repository, G_TYPE_OBJECT)); + g_assert_nonnull (object_info); + + signal_info = gi_object_info_find_signal (object_info, "notify"); + g_assert_nonnull (signal_info); + g_assert_true (GI_IS_SIGNAL_INFO (signal_info)); + g_assert_true (GI_IS_CALLABLE_INFO (signal_info)); + g_assert_true (GI_IS_BASE_INFO (signal_info)); + + g_assert_cmpint (gi_signal_info_get_flags (signal_info), ==, + G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE | G_SIGNAL_DETAILED | G_SIGNAL_NO_HOOKS | G_SIGNAL_ACTION); + + g_assert_cmpuint (gi_object_info_get_n_methods (object_info), >, 2); + + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + g_assert_true (GI_IS_FUNCTION_INFO (method_info)); + g_assert_true (GI_IS_CALLABLE_INFO (method_info)); + g_assert_true (GI_IS_BASE_INFO (method_info)); + + g_assert_true (gi_callable_info_is_method (GI_CALLABLE_INFO (method_info))); + g_assert_cmpuint (gi_callable_info_get_n_args (GI_CALLABLE_INFO (method_info)), ==, 2); + g_clear_pointer (&method_info, gi_base_info_unref); + + method_info = gi_object_info_get_method (object_info, + gi_object_info_get_n_methods (object_info) - 1); + g_assert_true (gi_callable_info_is_method (GI_CALLABLE_INFO (method_info))); + g_assert_cmpuint (gi_callable_info_get_n_args (GI_CALLABLE_INFO (method_info)), >, 0); + g_clear_pointer (&method_info, gi_base_info_unref); + + gi_base_info_unref (signal_info); + gi_base_info_unref (object_info); + gi_base_info_unref (object_info_by_gtype); +} + +static void +test_repository_dependencies (RepositoryFixture *fx, + const void *unused) +{ + GError *error = NULL; + char **dependencies; + size_t n_dependencies; + + g_test_summary ("Test ensures namespace dependencies are correctly exposed"); + + dependencies = gi_repository_get_dependencies (fx->repository, "GObject", &n_dependencies); + g_assert_cmpuint (g_strv_length (dependencies), ==, 1); + g_assert_cmpuint (n_dependencies, ==, 1); + g_assert_true (g_strv_contains ((const char **) dependencies, "GLib-2.0")); + + g_clear_error (&error); + g_clear_pointer (&dependencies, g_strfreev); +} + +static void +test_repository_base_info_clear (RepositoryFixture *fx, + const void *unused) +{ + GITypeInfo zeroed_type_info = { 0, }; + GITypeInfo idempotent_type_info; + GIObjectInfo *object_info = NULL; + GIFunctionInfo *method_info = NULL; + GIArgInfo *arg_info = NULL; + + g_test_summary ("Test calling gi_base_info_clear() on a zero-filled struct"); + + /* Load a valid #GITypeInfo onto the stack and clear it multiple times to + * check gi_base_info_clear() is idempotent after the first call. */ + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (method_info), 0); + g_assert_nonnull (arg_info); + gi_arg_info_load_type_info (arg_info, &idempotent_type_info); + + gi_base_info_clear (&idempotent_type_info); + gi_base_info_clear (&idempotent_type_info); + gi_base_info_clear (&idempotent_type_info); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); + + /* Try clearing a #GITypeInfo which has always been zero-filled on the stack. */ + gi_base_info_clear (&zeroed_type_info); + gi_base_info_clear (&zeroed_type_info); + gi_base_info_clear (&zeroed_type_info); +} + +static void +test_repository_arg_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIStructInfo *struct_info = NULL; + GIFunctionInfo *method_info = NULL; + GIArgInfo *arg_info = NULL; + GITypeInfo *type_info = NULL; + GITypeInfo type_info_stack; + unsigned int idx; + + g_test_summary ("Test retrieving GIArgInfos from a typelib"); + + /* Test all the methods of GIArgInfo. Here we’re looking at the + * `const char *property_name` argument of g_object_get_property(). (The + * ‘self’ argument is not exposed through gi_callable_info_get_arg().) */ + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + + method_info = gi_object_info_find_method (object_info, "get_property"); + g_assert_nonnull (method_info); + + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (method_info), 0); + g_assert_nonnull (arg_info); + + g_assert_cmpint (gi_arg_info_get_direction (arg_info), ==, GI_DIRECTION_IN); + g_assert_false (gi_arg_info_is_return_value (arg_info)); + g_assert_false (gi_arg_info_is_optional (arg_info)); + g_assert_false (gi_arg_info_is_caller_allocates (arg_info)); + g_assert_false (gi_arg_info_may_be_null (arg_info)); + g_assert_false (gi_arg_info_is_skip (arg_info)); + g_assert_cmpint (gi_arg_info_get_ownership_transfer (arg_info), ==, GI_TRANSFER_NOTHING); + g_assert_cmpint (gi_arg_info_get_scope (arg_info), ==, GI_SCOPE_TYPE_INVALID); + g_assert_false (gi_arg_info_get_closure_index (arg_info, NULL)); + g_assert_false (gi_arg_info_get_closure_index (arg_info, &idx)); + g_assert_cmpuint (idx, ==, 0); + g_assert_false (gi_arg_info_get_destroy_index (arg_info, NULL)); + g_assert_false (gi_arg_info_get_destroy_index (arg_info, &idx)); + g_assert_cmpuint (idx, ==, 0); + + type_info = gi_arg_info_get_type_info (arg_info); + g_assert_nonnull (type_info); + g_assert_true (gi_type_info_is_pointer (type_info)); + g_assert_cmpint (gi_type_info_get_tag (type_info), ==, GI_TYPE_TAG_UTF8); + + gi_arg_info_load_type_info (arg_info, &type_info_stack); + g_assert_true (gi_type_info_is_pointer (&type_info_stack) == gi_type_info_is_pointer (type_info)); + g_assert_cmpint (gi_type_info_get_tag (&type_info_stack), ==, gi_type_info_get_tag (type_info)); + + gi_base_info_clear (&type_info_stack); + g_clear_pointer (&type_info, gi_base_info_unref); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); + + /* Test an (out) argument. Here it’s the `guint *n_properties` from + * g_object_class_list_properties(). */ + struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "ObjectClass")); + g_assert_nonnull (struct_info); + + method_info = gi_struct_info_find_method (struct_info, "list_properties"); + g_assert_nonnull (method_info); + + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (method_info), 0); + g_assert_nonnull (arg_info); + + g_assert_cmpint (gi_arg_info_get_direction (arg_info), ==, GI_DIRECTION_OUT); + g_assert_false (gi_arg_info_is_optional (arg_info)); + g_assert_false (gi_arg_info_is_caller_allocates (arg_info)); + g_assert_cmpint (gi_arg_info_get_ownership_transfer (arg_info), ==, GI_TRANSFER_EVERYTHING); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&struct_info, gi_base_info_unref); +} + +static void +test_repository_callable_info (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIFunctionInfo *method_info = NULL; + GICallableInfo *callable_info; + GITypeInfo *type_info = NULL; + GITypeInfo type_info_stack; + GIAttributeIter iter = GI_ATTRIBUTE_ITER_INIT; + const char *name, *value; + GIArgInfo *arg_info = NULL; + GIArgInfo arg_info_stack; + + g_test_summary ("Test retrieving GICallableInfos from a typelib"); + + /* Test all the methods of GICallableInfo. Here we’re looking at + * g_object_get_qdata(). */ + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + + method_info = gi_object_info_find_method (object_info, "get_qdata"); + g_assert_nonnull (method_info); + + callable_info = GI_CALLABLE_INFO (method_info); + + g_assert_true (gi_callable_info_is_method (callable_info)); + g_assert_false (gi_callable_info_can_throw_gerror (callable_info)); + + type_info = gi_callable_info_get_return_type (callable_info); + g_assert_nonnull (type_info); + g_assert_true (gi_type_info_is_pointer (type_info)); + g_assert_cmpint (gi_type_info_get_tag (type_info), ==, GI_TYPE_TAG_VOID); + + gi_callable_info_load_return_type (callable_info, &type_info_stack); + g_assert_true (gi_type_info_is_pointer (&type_info_stack) == gi_type_info_is_pointer (type_info)); + g_assert_cmpint (gi_type_info_get_tag (&type_info_stack), ==, gi_type_info_get_tag (type_info)); + + gi_base_info_clear (&type_info_stack); + g_clear_pointer (&type_info, gi_base_info_unref); + + /* This method has no attributes */ + g_assert_false (gi_callable_info_iterate_return_attributes (callable_info, &iter, &name, &value)); + + g_assert_null (gi_callable_info_get_return_attribute (callable_info, "doesnt-exist")); + + g_assert_false (gi_callable_info_get_caller_owns (callable_info)); + g_assert_true (gi_callable_info_may_return_null (callable_info)); + g_assert_false (gi_callable_info_skip_return (callable_info)); + + g_assert_cmpuint (gi_callable_info_get_n_args (callable_info), ==, 1); + + arg_info = gi_callable_info_get_arg (callable_info, 0); + g_assert_nonnull (arg_info); + + gi_callable_info_load_arg (callable_info, 0, &arg_info_stack); + g_assert_cmpint (gi_arg_info_get_direction (&arg_info_stack), ==, gi_arg_info_get_direction (arg_info)); + g_assert_true (gi_arg_info_may_be_null (&arg_info_stack) == gi_arg_info_may_be_null (arg_info)); + + gi_base_info_clear (&arg_info_stack); + g_clear_pointer (&arg_info, gi_base_info_unref); + + g_assert_cmpint (gi_callable_info_get_instance_ownership_transfer (callable_info), ==, GI_TRANSFER_NOTHING); + + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_repository_callback_info (RepositoryFixture *fx, + const void *unused) +{ + GICallbackInfo *callback_info = NULL; + + g_test_summary ("Test retrieving GICallbackInfos from a typelib"); + + /* Test all the methods of GICallbackInfo. This is simple, because there are none. */ + callback_info = GI_CALLBACK_INFO (gi_repository_find_by_name (fx->repository, "GObject", "ObjectFinalizeFunc")); + g_assert_nonnull (callback_info); + + g_clear_pointer (&callback_info, gi_base_info_unref); +} + +static void +test_repository_char_types (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *gvalue_info; + GIFunctionInfo *method_info; + GITypeInfo *type_info; + + g_test_summary ("Test that signed and unsigned char GITypeInfo have GITypeTag of INT8 and UINT8 respectively"); + + gvalue_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Value")); + g_assert_nonnull (gvalue_info); + + /* unsigned char */ + method_info = gi_struct_info_find_method (gvalue_info, "get_uchar"); + g_assert_nonnull (method_info); + + type_info = gi_callable_info_get_return_type (GI_CALLABLE_INFO (method_info)); + g_assert_nonnull (type_info); + g_assert_cmpuint (gi_type_info_get_tag (type_info), ==, GI_TYPE_TAG_UINT8); + + g_clear_pointer (&type_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + + /* signed char */ + method_info = gi_struct_info_find_method (gvalue_info, "get_schar"); + g_assert_nonnull (method_info); + + type_info = gi_callable_info_get_return_type (GI_CALLABLE_INFO (method_info)); + g_assert_nonnull (type_info); + g_assert_cmpuint (gi_type_info_get_tag (type_info), ==, GI_TYPE_TAG_INT8); + + g_clear_pointer (&type_info, gi_base_info_unref); + g_clear_pointer (&method_info, gi_base_info_unref); + g_clear_pointer (&gvalue_info, gi_base_info_unref); +} + +static void +test_repository_constructor_return_type (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIFunctionInfo *constructor = NULL; + GITypeInfo *return_type = NULL; + GIBaseInfo *return_info = NULL; + const char *class_name = NULL; + const char *return_name = NULL; + + g_test_summary ("Test the return type of a constructor, g_object_newv()"); + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + + class_name = gi_registered_type_info_get_type_name (GI_REGISTERED_TYPE_INFO (object_info)); + g_assert_nonnull (class_name); + + constructor = gi_object_info_find_method (object_info, "newv"); + g_assert_nonnull (constructor); + + return_type = gi_callable_info_get_return_type (GI_CALLABLE_INFO (constructor)); + g_assert_nonnull (return_type); + g_assert_cmpuint (gi_type_info_get_tag (return_type), ==, GI_TYPE_TAG_INTERFACE); + + return_info = gi_type_info_get_interface (return_type); + g_assert_nonnull (return_info); + + return_name = gi_registered_type_info_get_type_name (GI_REGISTERED_TYPE_INFO (return_info)); + g_assert_nonnull (return_name); + g_assert_cmpstr (class_name, ==, return_name); + + g_clear_pointer (&return_info, gi_base_info_unref); + g_clear_pointer (&return_type, gi_base_info_unref); + g_clear_pointer (&constructor, gi_base_info_unref); + g_clear_pointer (&object_info, gi_base_info_unref); +} + +static void +test_repository_enum_info_c_identifier (RepositoryFixture *fx, + const void *unused) +{ + GIBaseInfo *info = NULL; + GIValueInfo *value_info = NULL; + unsigned n_infos, n_values, ix, jx; + const char *c_identifier = NULL; + + g_test_summary ("Test that every enum member has a C identifier"); + + n_infos = gi_repository_get_n_infos (fx->repository, "GLib"); + + for (ix = 0; ix < n_infos; ix++) + { + info = gi_repository_get_info (fx->repository, "GLib", ix); + + if (GI_IS_ENUM_INFO (info)) + { + n_values = gi_enum_info_get_n_values (GI_ENUM_INFO (info)); + for (jx = 0; jx < n_values; jx++) + { + value_info = gi_enum_info_get_value (GI_ENUM_INFO (info), jx); + c_identifier = gi_base_info_get_attribute (GI_BASE_INFO (value_info), "c:identifier"); + g_assert_nonnull (c_identifier); + + g_clear_pointer (&value_info, gi_base_info_unref); + } + } + + g_clear_pointer (&info, gi_base_info_unref); + } +} + +static void +test_repository_enum_info_static_methods (RepositoryFixture *fx, + const void *unused) +{ + GIEnumInfo *enum_info = NULL; + unsigned n_methods, ix; + GIFunctionInfo *function_info = NULL; + GIFunctionInfoFlags flags; + const char *symbol = NULL; + + g_test_summary ("Test an enum with methods"); + + enum_info = GI_ENUM_INFO (gi_repository_find_by_name (fx->repository, "GLib", "UnicodeScript")); + g_assert_nonnull (enum_info); + + n_methods = gi_enum_info_get_n_methods (enum_info); + g_assert_cmpuint (n_methods, >, 0); + + for (ix = 0; ix < n_methods; ix++) + { + function_info = gi_enum_info_get_method (enum_info, ix); + g_assert_nonnull (function_info); + + flags = gi_function_info_get_flags (function_info); + g_assert_false (flags & GI_FUNCTION_IS_METHOD); /* must be static */ + + symbol = gi_function_info_get_symbol (function_info); + g_assert_nonnull (symbol); + g_assert_true (g_str_has_prefix (symbol, "g_unicode_script_")); + + g_clear_pointer (&function_info, gi_base_info_unref); + } + + g_clear_pointer (&enum_info, gi_base_info_unref); +} + +static void +test_repository_error_quark (RepositoryFixture *fx, + const void *unused) +{ + GIEnumInfo *error_info = NULL; + + g_test_summary ("Test finding an error quark by error domain"); + + error_info = gi_repository_find_by_error_domain (fx->repository, G_RESOLVER_ERROR); + g_assert_nonnull (error_info); + g_assert_true (GI_IS_ENUM_INFO (error_info)); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (error_info)), ==, "ResolverError"); + + g_clear_pointer (&error_info, gi_base_info_unref); +} + +static void +test_repository_flags_info_c_identifier (RepositoryFixture *fx, + const void *unused) +{ + GIBaseInfo *info = NULL; + GIValueInfo *value_info = NULL; + unsigned n_infos, n_values, ix, jx; + const char *c_identifier = NULL; + + g_test_summary ("Test that every flags member has a C identifier"); + + n_infos = gi_repository_get_n_infos (fx->repository, "GLib"); + + for (ix = 0; ix < n_infos; ix++) + { + info = gi_repository_get_info (fx->repository, "GLib", ix); + + if (GI_IS_FLAGS_INFO (info)) + { + n_values = gi_enum_info_get_n_values (GI_ENUM_INFO (info)); + for (jx = 0; jx < n_values; jx++) + { + value_info = gi_enum_info_get_value (GI_ENUM_INFO (info), jx); + c_identifier = gi_base_info_get_attribute (GI_BASE_INFO (value_info), "c:identifier"); + g_assert_nonnull (c_identifier); + + g_clear_pointer (&value_info, gi_base_info_unref); + } + } + + g_clear_pointer (&info, gi_base_info_unref); + } +} + +static void +test_repository_fundamental_ref_func (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *info; + + g_test_summary ("Test getting the ref func of a fundamental type"); + + info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "ParamSpec")); + g_assert_nonnull (info); + + g_assert_nonnull (gi_object_info_get_ref_function_pointer (info)); + + g_clear_pointer (&info, gi_base_info_unref); +} + +static void +test_repository_instance_method_ownership_transfer (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *class_info = NULL; + GIFunctionInfo *func_info = NULL; + GITransfer transfer; + + g_test_summary ("Test two methods of the same object having opposite ownership transfer of the instance parameter"); + + class_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "DBusMethodInvocation")); + g_assert_nonnull (class_info); + + func_info = gi_object_info_find_method (class_info, "get_connection"); + g_assert_nonnull (func_info); + transfer = gi_callable_info_get_instance_ownership_transfer (GI_CALLABLE_INFO (func_info)); + g_assert_cmpint (GI_TRANSFER_NOTHING, ==, transfer); + + g_clear_pointer (&func_info, gi_base_info_unref); + + func_info = gi_object_info_find_method (class_info, "return_error_literal"); + g_assert_nonnull (func_info); + transfer = gi_callable_info_get_instance_ownership_transfer (GI_CALLABLE_INFO (func_info)); + g_assert_cmpint (GI_TRANSFER_EVERYTHING, ==, transfer); + + g_clear_pointer (&func_info, gi_base_info_unref); + g_clear_pointer (&class_info, gi_base_info_unref); +} + +static void +test_repository_object_gtype_interfaces (RepositoryFixture *fx, + const void *unused) +{ + GIInterfaceInfo **interfaces; + size_t n_interfaces, ix; + const char *name; + gboolean found_initable = FALSE, found_async_initable = FALSE; + + g_test_summary ("Test gi_repository_get_object_gtype_interfaces()"); + + gi_repository_get_object_gtype_interfaces (fx->repository, G_TYPE_DBUS_CONNECTION, &n_interfaces, &interfaces); + + g_assert_cmpuint (n_interfaces, ==, 2); + + for (ix = 0; ix < n_interfaces; ix++) + { + name = gi_base_info_get_name (GI_BASE_INFO (*(interfaces + ix))); + if (strcmp (name, "Initable") == 0) + found_initable = TRUE; + else if (strcmp (name, "AsyncInitable") == 0) + found_async_initable = TRUE; + } + + g_assert_true (found_initable); + g_assert_true (found_async_initable); +} + +static void +test_repository_signal_info_with_array_length_arg (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *gsettings_info = NULL; + GISignalInfo *sig_info = NULL; + GIArgInfo *arg_info = NULL; + GITypeInfo *type_info = NULL; + unsigned length_ix; + + g_test_summary ("Test finding the associated array length argument of an array parameter of a signal"); + + gsettings_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "Settings")); + g_assert_nonnull (gsettings_info); + + sig_info = gi_object_info_find_signal (gsettings_info, "change-event"); + g_assert_nonnull (sig_info); + + g_assert_cmpuint (gi_callable_info_get_n_args (GI_CALLABLE_INFO (sig_info)), ==, 2); + + /* verify array argument */ + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (sig_info), 0); + g_assert_nonnull (arg_info); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (arg_info)), ==, "keys"); + + type_info = gi_arg_info_get_type_info (arg_info); + g_assert_nonnull (type_info); + g_assert_cmpint (gi_type_info_get_tag (type_info), ==, GI_TYPE_TAG_ARRAY); + g_assert_cmpint (gi_type_info_get_array_type (type_info), ==, GI_ARRAY_TYPE_C); + g_assert_false (gi_type_info_is_zero_terminated (type_info)); + gboolean ok = gi_type_info_get_array_length_index (type_info, &length_ix); + g_assert_true (ok); + g_assert_cmpuint (length_ix, ==, 1); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&type_info, gi_base_info_unref); + + /* verify array length argument */ + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (sig_info), 1); + g_assert_nonnull (arg_info); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (arg_info)), ==, "n_keys"); + + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&type_info, gi_base_info_unref); + g_clear_pointer (&sig_info, gi_base_info_unref); + g_clear_pointer (&gsettings_info, gi_base_info_unref); +} + +static void +test_repository_type_info_name (RepositoryFixture *fx, + const void *unused) +{ + GIInterfaceInfo *interface_info = NULL; + GIVFuncInfo *vfunc; + GITypeInfo *typeinfo; + + g_test_summary ("Test that gi_base_info_get_name() returns null for GITypeInfo"); + g_test_bug ("https://gitlab.gnome.org/GNOME/gobject-introspection/issues/96"); + + interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "File")); + g_assert_nonnull (interface_info); + vfunc = gi_interface_info_find_vfunc (interface_info, "read_async"); + g_assert_nonnull (vfunc); + + typeinfo = gi_callable_info_get_return_type (GI_CALLABLE_INFO (vfunc)); + g_assert_nonnull (typeinfo); + + g_assert_null (gi_base_info_get_name (GI_BASE_INFO (typeinfo))); + + g_clear_pointer (&interface_info, gi_base_info_unref); + g_clear_pointer (&vfunc, gi_base_info_unref); + g_clear_pointer (&typeinfo, gi_base_info_unref); +} + +static void +test_repository_vfunc_info_with_no_invoker (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIVFuncInfo *vfunc_info = NULL; + GIFunctionInfo *invoker_info = NULL; + + g_test_summary ("Test vfunc with no known invoker on object, such as GObject.dispose"); + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Object")); + g_assert_nonnull (object_info); + + vfunc_info = gi_object_info_find_vfunc (object_info, "dispose"); + g_assert_nonnull (vfunc_info); + + invoker_info = gi_vfunc_info_get_invoker (vfunc_info); + g_assert_null (invoker_info); + + g_clear_pointer (&object_info, gi_base_info_unref); + g_clear_pointer (&vfunc_info, gi_base_info_unref); +} + +static void +test_repository_vfunc_info_with_invoker_on_interface (RepositoryFixture *fx, + const void *unused) +{ + GIInterfaceInfo *interface_info = NULL; + GIVFuncInfo *vfunc_info = NULL; + GIFunctionInfo *invoker_info = NULL; + + g_test_summary ("Test vfunc with invoker on interface, such as GFile.read_async"); + + interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "File")); + g_assert_nonnull (interface_info); + + vfunc_info = gi_interface_info_find_vfunc (interface_info, "read_async"); + g_assert_nonnull (vfunc_info); + + invoker_info = gi_vfunc_info_get_invoker (vfunc_info); + g_assert_nonnull (invoker_info); + + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (invoker_info)), ==, "read_async"); + + g_clear_pointer (&interface_info, gi_base_info_unref); + g_clear_pointer (&vfunc_info, gi_base_info_unref); + g_clear_pointer (&invoker_info, gi_base_info_unref); +} + +static void +test_repository_vfunc_info_with_invoker_on_object (RepositoryFixture *fx, + const void *unused) +{ + GIObjectInfo *object_info = NULL; + GIVFuncInfo *vfunc_info = NULL; + GIFunctionInfo *invoker_info = NULL; + + g_test_summary ("Test vfunc with invoker on object, such as GAppLaunchContext.get_display"); + + object_info = GI_OBJECT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppLaunchContext")); + g_assert_nonnull (object_info); + + vfunc_info = gi_object_info_find_vfunc (object_info, "get_display"); + g_assert_nonnull (vfunc_info); + + invoker_info = gi_vfunc_info_get_invoker (vfunc_info); + g_assert_nonnull (invoker_info); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (invoker_info)), ==, "get_display"); + + /* And let's be sure we can find the method directly */ + g_clear_pointer (&invoker_info, gi_base_info_unref); + + invoker_info = gi_object_info_find_method (object_info, "get_display"); + g_assert_nonnull (invoker_info); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (invoker_info)), ==, "get_display"); + + g_clear_pointer (&object_info, gi_base_info_unref); + g_clear_pointer (&vfunc_info, gi_base_info_unref); + g_clear_pointer (&invoker_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/repository/basic", test_repository_basic, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/repository/info", test_repository_info, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/dependencies", test_repository_dependencies, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/base-info/clear", test_repository_base_info_clear, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/arg-info", test_repository_arg_info, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/callable-info", test_repository_callable_info, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/callback-info", test_repository_callback_info, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/char-types", test_repository_char_types, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/constructor-return-type", test_repository_constructor_return_type, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/enum-info-c-identifier", test_repository_enum_info_c_identifier, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/repository/enum-info-static-methods", test_repository_enum_info_static_methods, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/repository/error-quark", test_repository_error_quark, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/flags-info-c-identifier", test_repository_flags_info_c_identifier, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/fundamental-ref-func", test_repository_fundamental_ref_func, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/instance-method-ownership-transfer", test_repository_instance_method_ownership_transfer, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/object-gtype-interfaces", test_repository_object_gtype_interfaces, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/signal-info-with-array-length-arg", test_repository_signal_info_with_array_length_arg, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/type-info-name", test_repository_type_info_name, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-no-invoker", test_repository_vfunc_info_with_no_invoker, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-invoker-on-interface", test_repository_vfunc_info_with_invoker_on_interface, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-invoker-on-object", test_repository_vfunc_info_with_invoker_on_object, &typelib_load_spec_gio); + + return g_test_run (); +} diff --git a/girepository/tests/struct-info.c b/girepository/tests/struct-info.c new file mode 100644 index 0000000..7ed18c8 --- /dev/null +++ b/girepository/tests/struct-info.c @@ -0,0 +1,136 @@ +/* + * Copyright 2014 Simon Feltman + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "test-common.h" + +static void +test_field_iterators (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *class_info = NULL; + GIFieldInfo *field_info = NULL; + unsigned ix; + + g_test_summary ("Test iterating through a struct's fields with gi_struct_info_get_field()"); + + class_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "ObjectClass")); + g_assert_nonnull (class_info); + + for (ix = 0; ix < gi_struct_info_get_n_fields (class_info); ix++) + { + const char *field_name = NULL; + GIFieldInfo *found = NULL; + + field_info = gi_struct_info_get_field (class_info, ix); + g_assert_nonnull (field_info); + + field_name = gi_base_info_get_name (GI_BASE_INFO (field_info)); + g_assert_nonnull (field_name); + + found = gi_struct_info_find_field (class_info, field_name); + g_assert_nonnull (found); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (found)), ==, field_name); + + g_clear_pointer (&found, gi_base_info_unref); + g_clear_pointer (&field_info, gi_base_info_unref); + } + + field_info = gi_struct_info_find_field (class_info, "not_a_real_field_name"); + g_assert_null (field_info); + + g_clear_pointer (&class_info, gi_base_info_unref); +} + +static void +test_size_of_gvalue (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *struct_info; + + g_test_summary ("Test that gi_struct_info_get_size() reports the correct sizeof GValue"); + + struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "Value")); + g_assert_nonnull (struct_info); + + g_assert_cmpuint (gi_struct_info_get_size (struct_info), ==, sizeof (GValue)); + + g_clear_pointer (&struct_info, gi_base_info_unref); +} + +static void +test_is_pointer_for_struct_method_arg (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *variant_info = NULL; + GIFunctionInfo *equal_info = NULL; + GIArgInfo *arg_info = NULL; + GITypeInfo *type_info = NULL; + + g_test_summary ("Test that a struct method reports the correct type with gi_type_info_is_pointer()"); + + variant_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GLib", "Variant")); + g_assert_nonnull (variant_info); + + equal_info = gi_struct_info_find_method (variant_info, "equal"); + g_assert_nonnull (equal_info); + + arg_info = gi_callable_info_get_arg (GI_CALLABLE_INFO (equal_info), 0); + g_assert_nonnull (arg_info); + + type_info = gi_arg_info_get_type_info (arg_info); + g_assert_nonnull (type_info); + g_assert_true (gi_type_info_is_pointer (type_info)); + + g_clear_pointer (&type_info, gi_base_info_unref); + g_clear_pointer (&arg_info, gi_base_info_unref); + g_clear_pointer (&equal_info, gi_base_info_unref); + g_clear_pointer (&variant_info, gi_base_info_unref); +} + +static void +test_boxed (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *struct_info = NULL; + + g_test_summary ("Test that a boxed struct is recognised as such"); + + struct_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "GObject", "BookmarkFile")); + g_assert_nonnull (struct_info); + g_assert_true (gi_registered_type_info_is_boxed (GI_REGISTERED_TYPE_INFO (struct_info))); + + g_clear_pointer (&struct_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/struct-info/field-iterators", test_field_iterators, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/struct-info/sizeof-gvalue", test_size_of_gvalue, &typelib_load_spec_gobject); + ADD_REPOSITORY_TEST ("/struct-info/is-pointer-for-struct-method-arg", test_is_pointer_for_struct_method_arg, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/struct-info/boxed", test_boxed, &typelib_load_spec_gobject); + + return g_test_run (); +} diff --git a/girepository/tests/test-common.c b/girepository/tests/test-common.c new file mode 100644 index 0000000..3b5ce3e --- /dev/null +++ b/girepository/tests/test-common.c @@ -0,0 +1,67 @@ +/* + * Copyright 2023 GNOME Foundation, Inc. + * Copyright 2024 Philip Chimento + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "glib.h" +#include "test-common.h" + +void +repository_init (int *argc, + char **argv[]) +{ + /* Isolate from the system typelibs and GIRs. */ + g_setenv ("GI_TYPELIB_PATH", "/dev/null", TRUE); + g_setenv ("GI_GIR_PATH", "/dev/null", TRUE); + + g_test_init (argc, argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); +} + +void +repository_setup (RepositoryFixture *fx, + const void *data) +{ + GITypelib *typelib = NULL; + GError *local_error = NULL; + TypelibLoadSpec *load_spec = (TypelibLoadSpec *) data; + + fx->repository = gi_repository_new (); + g_assert_nonnull (fx->repository); + + fx->gobject_typelib_dir = g_test_build_filename (G_TEST_BUILT, "..", "introspection", NULL); + g_test_message ("Using GI_TYPELIB_DIR = %s", fx->gobject_typelib_dir); + gi_repository_prepend_search_path (fx->repository, fx->gobject_typelib_dir); + + if (load_spec) + { + typelib = gi_repository_require (fx->repository, load_spec->name, load_spec->version, 0, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (typelib); + } +} + +void +repository_teardown (RepositoryFixture *fx, + const void *unused) +{ + g_clear_pointer (&fx->gobject_typelib_dir, g_free); + g_clear_object (&fx->repository); +} diff --git a/girepository/tests/test-common.h b/girepository/tests/test-common.h new file mode 100644 index 0000000..9d31998 --- /dev/null +++ b/girepository/tests/test-common.h @@ -0,0 +1,50 @@ +/* + * Copyright 2024 Philip Chimento + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#pragma once + +#include "girepository.h" + +typedef struct +{ + GIRepository *repository; + char *gobject_typelib_dir; +} RepositoryFixture; + +typedef struct +{ + const char *name; + const char *version; +} TypelibLoadSpec; + +static const TypelibLoadSpec typelib_load_spec_glib = { "GLib", "2.0" }; +static const TypelibLoadSpec typelib_load_spec_gobject = { "GObject", "2.0" }; +static const TypelibLoadSpec typelib_load_spec_gio = { "Gio", "2.0" }; + +void repository_init (int *argc, + char **argv[]); + +void repository_setup (RepositoryFixture *fx, + const void *data); + +void repository_teardown (RepositoryFixture *fx, + const void *unused); + +#define ADD_REPOSITORY_TEST(testpath, ftest, load_spec) \ + g_test_add ((testpath), RepositoryFixture, load_spec, repository_setup, (ftest), repository_teardown) diff --git a/girepository/tests/throws.c b/girepository/tests/throws.c new file mode 100644 index 0000000..2849e53 --- /dev/null +++ b/girepository/tests/throws.c @@ -0,0 +1,123 @@ +/* + * Copyright 2008 litl, LLC + * Copyright 2014 Simon Feltman + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "test-common.h" + +static void +test_invoke_gerror (RepositoryFixture *fx, + const void *unused) +{ + GIFunctionInfo *func_info = NULL; + GIArgument in_arg[1]; + GIArgument ret_arg; + GError *error = NULL; + gboolean invoke_return; + + g_test_summary ("Test invoking a function that throws a GError"); + + func_info = GI_FUNCTION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "file_read_link")); + g_assert_nonnull (func_info); + g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (func_info))); + + in_arg[0].v_string = g_strdup ("non-existent-file/hope"); + invoke_return = gi_function_info_invoke (func_info, in_arg, 1, NULL, 0, &ret_arg, &error); + g_clear_pointer (&in_arg[0].v_string, g_free); + + g_assert_false (invoke_return); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT); + + g_clear_error (&error); + g_clear_pointer (&func_info, gi_base_info_unref); +} + +static void +test_vfunc_can_throw_gerror (RepositoryFixture *fx, + const void *unused) +{ + GIInterfaceInfo *interface_info = NULL; + GIFunctionInfo *invoker_info = NULL; + GIVFuncInfo *vfunc_info = NULL; + + g_test_summary ("Test gi_callable_info_can_throw_gerror() on a vfunc"); + + interface_info = GI_INTERFACE_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppInfo")); + g_assert_nonnull (interface_info); + + invoker_info = gi_interface_info_find_method (interface_info, "launch"); + g_assert_nonnull (invoker_info); + g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (invoker_info))); + + vfunc_info = gi_interface_info_find_vfunc (interface_info, "launch"); + g_assert_nonnull (vfunc_info); + g_assert_true (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (vfunc_info))); + + g_clear_pointer (&vfunc_info, gi_base_info_unref); + g_clear_pointer (&invoker_info, gi_base_info_unref); + g_clear_pointer (&interface_info, gi_base_info_unref); +} + +static void +test_callback_can_throw_gerror (RepositoryFixture *fx, + const void *unused) +{ + GIStructInfo *class_info = NULL; + GIFieldInfo *field_info = NULL; + GITypeInfo *field_type = NULL; + GICallbackInfo *callback_info = NULL; + + g_test_summary ("Test gi_callable_info_can_throw_gerror() on a callback"); + + class_info = GI_STRUCT_INFO (gi_repository_find_by_name (fx->repository, "Gio", "AppInfoIface")); + g_assert_nonnull (class_info); + + field_info = gi_struct_info_find_field (class_info, "launch"); + g_assert_nonnull (field_info); + g_assert_true (GI_IS_FIELD_INFO (field_info)); + + field_type = gi_field_info_get_type_info (field_info); + g_assert_nonnull (field_type); + g_assert_true (GI_IS_TYPE_INFO (field_type)); + g_assert_cmpint (gi_type_info_get_tag (field_type), ==, GI_TYPE_TAG_INTERFACE); + + callback_info = GI_CALLBACK_INFO (gi_type_info_get_interface (field_type)); + g_assert_nonnull (callback_info); + g_assert (gi_callable_info_can_throw_gerror (GI_CALLABLE_INFO (callback_info))); + + g_clear_pointer (&callback_info, gi_base_info_unref); + g_clear_pointer (&field_type, gi_base_info_unref); + g_clear_pointer (&field_info, gi_base_info_unref); + g_clear_pointer (&class_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/throws/invoke-gerror", test_invoke_gerror, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/throws/vfunc-can-throw-gerror", test_vfunc_can_throw_gerror, &typelib_load_spec_gio); + ADD_REPOSITORY_TEST ("/throws/callback-can-throw-gerror", test_callback_can_throw_gerror, &typelib_load_spec_gio); + + return g_test_run (); +} diff --git a/girepository/tests/union-info.c b/girepository/tests/union-info.c new file mode 100644 index 0000000..6dfa78b --- /dev/null +++ b/girepository/tests/union-info.c @@ -0,0 +1,100 @@ +/* + * Copyright 2024 GNOME Foundation + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "config.h" + +#include "girepository.h" +#include "test-common.h" + +static void +test_basic (RepositoryFixture *fx, + const void *unused) +{ + GIUnionInfo *double_info = NULL; + GIFieldInfo *field_info = NULL; + size_t offset = 123; + + g_test_summary ("Test basic properties of GIUnionInfo"); + + double_info = GI_UNION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "DoubleIEEE754")); + g_assert_nonnull (double_info); + + g_assert_cmpuint (gi_union_info_get_n_fields (double_info), ==, 1); + + field_info = gi_union_info_get_field (double_info, 0); + g_assert_true (GI_IS_FIELD_INFO (field_info)); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (field_info)), ==, "v_double"); + g_clear_pointer (&field_info, gi_base_info_unref); + + g_assert_cmpuint (gi_union_info_get_n_methods (double_info), ==, 0); + g_assert_null (gi_union_info_find_method (double_info, "not_exist")); + + g_assert_false (gi_union_info_is_discriminated (double_info)); + g_assert_false (gi_union_info_get_discriminator_offset (double_info, &offset)); + g_assert_cmpuint (offset, ==, 0); + g_assert_null (gi_union_info_get_discriminator_type (double_info)); + g_assert_null (gi_union_info_get_discriminator (double_info, 0)); + + g_assert_cmpuint (gi_union_info_get_size (double_info), ==, 8); + g_assert_cmpuint (gi_union_info_get_alignment (double_info), ==, G_ALIGNOF (GDoubleIEEE754)); + + g_assert_null (gi_union_info_get_copy_function_name (double_info)); + g_assert_null (gi_union_info_get_free_function_name (double_info)); + + g_clear_pointer (&double_info, gi_base_info_unref); +} + +static void +test_methods (RepositoryFixture *fx, + const void *unused) +{ + GIUnionInfo *mutex_info = NULL; + GIFunctionInfo *method_info = NULL; + + g_test_summary ("Test retrieving methods from GIUnionInfo"); + + mutex_info = GI_UNION_INFO (gi_repository_find_by_name (fx->repository, "GLib", "Mutex")); + g_assert_nonnull (mutex_info); + + g_assert_cmpuint (gi_union_info_get_n_methods (mutex_info), ==, 5); + + method_info = gi_union_info_get_method (mutex_info, 0); + g_assert_true (GI_IS_FUNCTION_INFO (method_info)); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (method_info)), ==, "clear"); + g_clear_pointer (&method_info, gi_base_info_unref); + + method_info = gi_union_info_find_method (mutex_info, "trylock"); + g_assert_true (GI_IS_FUNCTION_INFO (method_info)); + g_assert_cmpstr (gi_base_info_get_name (GI_BASE_INFO (method_info)), ==, "trylock"); + g_clear_pointer (&method_info, gi_base_info_unref); + + g_clear_pointer (&mutex_info, gi_base_info_unref); +} + +int +main (int argc, + char *argv[]) +{ + repository_init (&argc, &argv); + + ADD_REPOSITORY_TEST ("/union-info/basic", test_basic, &typelib_load_spec_glib); + ADD_REPOSITORY_TEST ("/union-info/methods", test_methods, &typelib_load_spec_glib); + + return g_test_run (); +} diff --git a/glib/deprecated/gcache.c b/glib/deprecated/gcache.c index fb0bb18..d7da83c 100644 --- a/glib/deprecated/gcache.c +++ b/glib/deprecated/gcache.c @@ -42,19 +42,18 @@ #include "gtestutils.h" /** - * SECTION:caches - * @title: Caches - * @short_description: caches allow sharing of complex data structures - * to save resources + * GCache: * - * A #GCache allows sharing of complex data structures, in order to + * A `GCache` allows sharing of complex data structures, in order to * save system resources. * - * GCache uses keys and values. A GCache key describes the properties - * of a particular resource. A GCache value is the actual resource. + * `GCache` uses keys and values. A `GCache` key describes the properties + * of a particular resource. A `GCache` value is the actual resource. * - * GCache has been marked as deprecated, since this API is rarely + * `GCache` has been marked as deprecated, since this API is rarely * used and not very actively maintained. + * + * Deprecated:2.32: Use a #GHashTable instead */ typedef struct _GCacheNode GCacheNode; @@ -66,15 +65,6 @@ struct _GCacheNode gint ref_count; }; -/** - * GCache: - * - * The #GCache struct is an opaque data structure containing - * information about a #GCache. It should only be accessed via the - * following functions. - * - * Deprecated:2.32: Use a #GHashTable instead - */ struct _GCache { /* Called to create a value from a key */ @@ -147,6 +137,7 @@ g_cache_node_destroy (GCacheNode *node) * value corresponding to the key. * * Returns: a new #GCache value corresponding to the key. + * Deprecated:2.32: Use a #GHashTable instead */ /** @@ -157,6 +148,8 @@ g_cache_node_destroy (GCacheNode *node) * functions passed to g_cache_new(). The functions are passed a * pointer to the #GCache key or #GCache value and should free any * memory and other resources associated with it. + * + * Deprecated:2.32: Use a #GHashTable instead */ /** @@ -170,6 +163,7 @@ g_cache_node_destroy (GCacheNode *node) * should return a duplicate of the key. * * Returns: a copy of the #GCache key + * Deprecated:2.32: Use a #GHashTable instead */ GCache* g_cache_new (GCacheNewFunc value_new_func, @@ -306,7 +300,7 @@ g_cache_remove (GCache *cache, /** * g_cache_key_foreach: * @cache: a #GCache - * @func: the function to call with each #GCache key + * @func: (scope call): the function to call with each #GCache key * @user_data: user data to pass to the function * * Calls the given function for each of the keys in the #GCache. @@ -332,7 +326,7 @@ g_cache_key_foreach (GCache *cache, /** * g_cache_value_foreach: * @cache: a #GCache - * @func: the function to call with each #GCache value + * @func: (scope call): the function to call with each #GCache value * @user_data: user data to pass to the function * * Calls the given function for each of the values in the #GCache. diff --git a/glib/deprecated/gcompletion.c b/glib/deprecated/gcompletion.c index 3bc77d3..7319289 100644 --- a/glib/deprecated/gcompletion.c +++ b/glib/deprecated/gcompletion.c @@ -43,34 +43,6 @@ #include -/** - * SECTION:completion - * @title: Automatic String Completion - * @short_description: support for automatic completion using a group - * of target strings - * - * #GCompletion provides support for automatic completion of a string - * using any group of target strings. It is typically used for file - * name completion as is common in many UNIX shells. - * - * A #GCompletion is created using g_completion_new(). Target items are - * added and removed with g_completion_add_items(), - * g_completion_remove_items() and g_completion_clear_items(). A - * completion attempt is requested with g_completion_complete() or - * g_completion_complete_utf8(). When no longer needed, the - * #GCompletion is freed with g_completion_free(). - * - * Items in the completion can be simple strings (e.g. filenames), or - * pointers to arbitrary data structures. If data structures are used - * you must provide a #GCompletionFunc in g_completion_new(), which - * retrieves the item's string from the data structure. You can change - * the way in which strings are compared by setting a different - * #GCompletionStrncmpFunc in g_completion_set_compare(). - * - * GCompletion has been marked as deprecated, since this API is rarely - * used and not very actively maintained. - **/ - /** * GCompletion: * @items: list of target items (strings or data structures). @@ -82,18 +54,41 @@ * @strncmp_func: The function to use when comparing strings. Use * g_completion_set_compare() to modify this function. * - * The data structure used for automatic completion. + * `GCompletion` provides support for automatic completion of a string + * using any group of target strings. It is typically used for file + * name completion as is common in many UNIX shells. + * + * A `GCompletion` is created using [func@GLib.Completion.new]. Target items are + * added and removed with [method@GLib.Completion.add_items], + * [method@GLib.Completion.remove_items] and + * [method@GLib.Completion.clear_items]. A completion attempt is requested with + * [method@GLib.Completion.complete] or [method@GLib.Completion.complete_utf8]. + * When no longer needed, the `GCompletion` is freed with + * [method@GLib.Completion.free]. + * + * Items in the completion can be simple strings (e.g. filenames), or + * pointers to arbitrary data structures. If data structures are used + * you must provide a [type@GLib.CompletionFunc] in [func@GLib.Completion.new], + * which retrieves the item’s string from the data structure. You can change + * the way in which strings are compared by setting a different + * [type@GLib.CompletionStrncmpFunc] in [method@GLib.Completion.set_compare]. + * + * `GCompletion` has been marked as deprecated, since this API is rarely + * used and not very actively maintained. + * + * Deprecated: 2.26: Rarely used API **/ /** * GCompletionFunc: - * @Param1: the completion item. + * @item: the completion item. * * Specifies the type of the function passed to g_completion_new(). It * should return the string corresponding to the given target item. * This is used when you use data structures as #GCompletion items. * * Returns: the string corresponding to the item. + * Deprecated: 2.26: Rarely used API **/ /** @@ -110,6 +105,7 @@ * the first @n bytes of @s1 is found, respectively, to be * less than, to match, or to be greater than the first @n * bytes of @s2. + * Deprecated: 2.26: Rarely used API **/ static void completion_check_cache (GCompletion* cmp, @@ -124,6 +120,7 @@ static void completion_check_cache (GCompletion* cmp, * Creates a new #GCompletion. * * Returns: the new #GCompletion. + * Deprecated: 2.26: Rarely used API **/ GCompletion* g_completion_new (GCompletionFunc func) diff --git a/glib/deprecated/gcompletion.h b/glib/deprecated/gcompletion.h index 2be87d2..7f9f782 100644 --- a/glib/deprecated/gcompletion.h +++ b/glib/deprecated/gcompletion.h @@ -37,7 +37,7 @@ G_BEGIN_DECLS typedef struct _GCompletion GCompletion; -typedef gchar* (*GCompletionFunc) (gpointer); +typedef gchar* (*GCompletionFunc) (gpointer item); /* GCompletion */ diff --git a/glib/deprecated/grel.c b/glib/deprecated/grel.c index bca8266..aae9dc7 100644 --- a/glib/deprecated/grel.c +++ b/glib/deprecated/grel.c @@ -48,61 +48,53 @@ #include /** - * SECTION:relations - * @title: Relations and Tuples - * @short_description: tables of data which can be indexed on any - * number of fields + * GRelation: * - * A #GRelation is a table of data which can be indexed on any number - * of fields, rather like simple database tables. A #GRelation contains + * A `GRelation` is a table of data which can be indexed on any number + * of fields, rather like simple database tables. A `GRelation` contains * a number of records, called tuples. Each record contains a number of * fields. Records are not ordered, so it is not possible to find the * record at a particular index. * - * Note that #GRelation tables are currently limited to 2 fields. + * Note that `GRelation` tables are currently limited to 2 fields. * - * To create a GRelation, use g_relation_new(). + * To create a `GRelation`, use [func@GLib.Relation.new]. * - * To specify which fields should be indexed, use g_relation_index(). + * To specify which fields should be indexed, use [method@GLib.Relation.index]. * Note that this must be called before any tuples are added to the - * #GRelation. + * `GRelation`. * - * To add records to a #GRelation use g_relation_insert(). + * To add records to a `GRelation` use [method@GLib.Relation.insert]. * - * To determine if a given record appears in a #GRelation, use - * g_relation_exists(). Note that fields are compared directly, so + * To determine if a given record appears in a `GRelation`, use + * [method@GLib.Relation.exists]. Note that fields are compared directly, so * pointers must point to the exact same position (i.e. different * copies of the same string will not match.) * * To count the number of records which have a particular value in a - * given field, use g_relation_count(). + * given field, use [method@GLib.Relation.count]. * * To get all the records which have a particular value in a given - * field, use g_relation_select(). To access fields of the resulting - * records, use g_tuples_index(). To free the resulting records use - * g_tuples_destroy(). + * field, use [method@GLib.Relation.select]. To access fields of the resulting + * records, use [method@GLib.Tuples.index]. To free the resulting records use + * [method@GLib.Tuples.destroy]. * * To delete all records which have a particular value in a given - * field, use g_relation_delete(). + * field, use [method@GLib.Relation.delete]. * - * To destroy the #GRelation, use g_relation_destroy(). + * To destroy the `GRelation`, use [method@GLib.Relation.destroy]. * - * To help debug #GRelation objects, use g_relation_print(). + * To help debug `GRelation` objects, use [method@GLib.Relation.print]. * - * GRelation has been marked as deprecated, since this API has never + * `GRelation` has been marked as deprecated, since this API has never * been fully implemented, is not very actively maintained and rarely * used. + * + * Deprecated: 2.26: Rarely used API **/ typedef struct _GRealTuples GRealTuples; -/** - * GRelation: - * - * The #GRelation struct is an opaque data structure to represent a - * [Relation][glib-Relations-and-Tuples]. It should - * only be accessed via the following functions. - **/ struct _GRelation { gint fields; @@ -122,6 +114,8 @@ struct _GRelation * #GRelation by g_relation_select(). It only contains one public * member - the number of records that matched. To access the matched * records, you must use g_tuples_index(). + * + * Deprecated: 2.26: Rarely used API **/ struct _GRealTuples { diff --git a/glib/deprecated/grel.h b/glib/deprecated/grel.h index 071e609..1f29998 100644 --- a/glib/deprecated/grel.h +++ b/glib/deprecated/grel.h @@ -43,29 +43,6 @@ struct _GTuples guint len; }; -/* GRelation - * - * Indexed Relations. Imagine a really simple table in a - * database. Relations are not ordered. This data type is meant for - * maintaining a N-way mapping. - * - * g_relation_new() creates a relation with FIELDS fields - * - * g_relation_destroy() frees all resources - * g_tuples_destroy() frees the result of g_relation_select() - * - * g_relation_index() indexes relation FIELD with the provided - * equality and hash functions. this must be done before any - * calls to insert are made. - * - * g_relation_insert() inserts a new tuple. you are expected to - * provide the right number of fields. - * - * g_relation_delete() deletes all relations with KEY in FIELD - * g_relation_select() returns ... - * g_relation_count() counts ... - */ - GLIB_DEPRECATED_IN_2_26 GRelation* g_relation_new (gint fields); GLIB_DEPRECATED_IN_2_26 diff --git a/glib/deprecated/gthread-deprecated.c b/glib/deprecated/gthread-deprecated.c index 49bcf4f..fb281ac 100644 --- a/glib/deprecated/gthread-deprecated.c +++ b/glib/deprecated/gthread-deprecated.c @@ -41,18 +41,7 @@ /* {{{1 Documentation */ /** - * SECTION:threads-deprecated - * @title: Deprecated thread API - * @short_description: old thread APIs (for reference only) - * @see_also: #GThread - * - * These APIs are deprecated. You should not use them in new code. - * This section remains only to assist with understanding code that was - * written to use these APIs at some point in the past. - **/ - -/** - * GThreadPriority: + * GThreadPriority: (skip): * @G_THREAD_PRIORITY_LOW: a priority lower than normal * @G_THREAD_PRIORITY_NORMAL: the default priority * @G_THREAD_PRIORITY_HIGH: a priority higher than normal @@ -64,7 +53,7 @@ */ /** - * GThreadFunctions: + * GThreadFunctions: (skip): * @mutex_new: virtual function pointer for g_mutex_new() * @mutex_lock: virtual function pointer for g_mutex_lock() * @mutex_trylock: virtual function pointer for g_mutex_trylock() @@ -94,7 +83,7 @@ */ /** - * G_THREADS_IMPL_POSIX: + * G_THREADS_IMPL_POSIX: (skip): * * This macro is defined if POSIX style threads are used. * @@ -103,7 +92,7 @@ */ /** - * G_THREADS_IMPL_WIN32: + * G_THREADS_IMPL_WIN32: (skip): * * This macro is defined if Windows style threads are used. * @@ -155,7 +144,7 @@ guint64 (*g_thread_gettime) (void) = gettime; gboolean g_threads_got_initialized = TRUE; /** - * g_thread_init: + * g_thread_init: (skip): * @vtable: a function table of type #GThreadFunctions, that provides * the entry points to the thread system to be used. Since 2.32, * this parameter is ignored and should always be %NULL @@ -185,7 +174,11 @@ gboolean g_threads_got_initialized = TRUE; */ /** - * g_thread_get_initialized: + * g_thread_init_with_errorcheck_mutexes: (skip): + */ + +/** + * g_thread_get_initialized: (skip): * * Indicates if g_thread_init() has been called. * @@ -216,7 +209,7 @@ G_LOCK_DEFINE_STATIC (g_thread); /* Misc. GThread functions {{{1 */ /** - * g_thread_set_priority: + * g_thread_set_priority: (skip): * @thread: a #GThread. * @priority: ignored * @@ -231,8 +224,8 @@ g_thread_set_priority (GThread *thread, } /** - * g_thread_foreach: - * @thread_func: function to call for all #GThread structures + * g_thread_foreach: (skip): + * @thread_func: (scope call): function to call for all #GThread structures * @user_data: second argument to @thread_func * * Call @thread_func on all #GThreads that have been @@ -315,7 +308,7 @@ g_deprecated_thread_proxy (gpointer data) } /** - * g_thread_create: + * g_thread_create: (skip): * @func: a function to execute in the new thread * @data: an argument to supply to the new thread * @joinable: should this thread be joinable? @@ -348,7 +341,7 @@ g_thread_create (GThreadFunc func, } /** - * g_thread_create_full: + * g_thread_create_full: (skip): * @func: a function to execute in the new thread. * @data: an argument to supply to the new thread. * @stack_size: a stack size for the new thread. @@ -397,7 +390,7 @@ g_once_init_enter_impl (volatile gsize *location) /* GStaticMutex {{{1 ------------------------------------------------------ */ /** - * GStaticMutex: + * GStaticMutex: (skip): * * A #GStaticMutex works like a #GMutex. * @@ -448,7 +441,7 @@ g_once_init_enter_impl (volatile gsize *location) */ /** - * G_STATIC_MUTEX_INIT: + * G_STATIC_MUTEX_INIT: (skip): * * A #GStaticMutex must be initialized with this macro, before it can * be used. This macro can used be to initialize a variable, but it @@ -461,7 +454,7 @@ g_once_init_enter_impl (volatile gsize *location) **/ /** - * g_static_mutex_init: + * g_static_mutex_init: (skip): * @mutex: a #GStaticMutex to be initialized. * * Initializes @mutex. @@ -497,7 +490,7 @@ g_static_mutex_init (GStaticMutex *mutex) */ /** - * g_static_mutex_get_mutex: + * g_static_mutex_get_mutex: (skip): * @mutex: a #GStaticMutex. * * For some operations (like g_cond_wait()) you must have a #GMutex @@ -544,7 +537,7 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex) */ /** - * g_static_mutex_lock: + * g_static_mutex_lock: (skip): * @mutex: a #GStaticMutex. * * Works like g_mutex_lock(), but for a #GStaticMutex. @@ -553,7 +546,7 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex) */ /** - * g_static_mutex_trylock: + * g_static_mutex_trylock: (skip): * @mutex: a #GStaticMutex. * * Works like g_mutex_trylock(), but for a #GStaticMutex. @@ -564,7 +557,7 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex) */ /** - * g_static_mutex_unlock: + * g_static_mutex_unlock: (skip): * @mutex: a #GStaticMutex. * * Works like g_mutex_unlock(), but for a #GStaticMutex. @@ -573,7 +566,7 @@ g_static_mutex_get_mutex_impl (GStaticMutex* mutex) */ /** - * g_static_mutex_free: + * g_static_mutex_free: (skip): * @mutex: a #GStaticMutex to be freed. * * Releases all resources allocated to @mutex. @@ -611,7 +604,7 @@ g_static_mutex_free (GStaticMutex* mutex) /* {{{1 GStaticRecMutex */ /** - * GStaticRecMutex: + * GStaticRecMutex: (skip): * * A #GStaticRecMutex works like a #GStaticMutex, but it can be locked * multiple times by one thread. If you enter it n times, you have to @@ -633,7 +626,7 @@ g_static_mutex_free (GStaticMutex* mutex) */ /** - * G_STATIC_REC_MUTEX_INIT: + * G_STATIC_REC_MUTEX_INIT: (skip): * * A #GStaticRecMutex must be initialized with this macro before it can * be used. This macro can used be to initialize a variable, but it @@ -646,7 +639,7 @@ g_static_mutex_free (GStaticMutex* mutex) */ /** - * g_static_rec_mutex_init: + * g_static_rec_mutex_init: (skip): * @mutex: a #GStaticRecMutex to be initialized. * * A #GStaticRecMutex must be initialized with this function before it @@ -694,7 +687,7 @@ g_static_rec_mutex_get_rec_mutex_impl (GStaticRecMutex* mutex) } /** - * g_static_rec_mutex_lock: + * g_static_rec_mutex_lock: (skip): * @mutex: a #GStaticRecMutex to lock. * * Locks @mutex. If @mutex is already locked by another thread, the @@ -714,7 +707,7 @@ g_static_rec_mutex_lock (GStaticRecMutex* mutex) } /** - * g_static_rec_mutex_trylock: + * g_static_rec_mutex_trylock: (skip): * @mutex: a #GStaticRecMutex to lock. * * Tries to lock @mutex. If @mutex is already locked by another thread, @@ -743,7 +736,7 @@ g_static_rec_mutex_trylock (GStaticRecMutex* mutex) } /** - * g_static_rec_mutex_unlock: + * g_static_rec_mutex_unlock: (skip): * @mutex: a #GStaticRecMutex to unlock. * * Unlocks @mutex. Another thread will be allowed to lock @mutex only @@ -764,7 +757,7 @@ g_static_rec_mutex_unlock (GStaticRecMutex* mutex) } /** - * g_static_rec_mutex_lock_full: + * g_static_rec_mutex_lock_full: (skip): * @mutex: a #GStaticRecMutex to lock. * @depth: number of times this mutex has to be unlocked to be * completely unlocked. @@ -788,7 +781,7 @@ g_static_rec_mutex_lock_full (GStaticRecMutex *mutex, } /** - * g_static_rec_mutex_unlock_full: + * g_static_rec_mutex_unlock_full: (skip): * @mutex: a #GStaticRecMutex to completely unlock. * * Completely unlocks @mutex. If another thread is blocked in a @@ -825,7 +818,7 @@ g_static_rec_mutex_unlock_full (GStaticRecMutex *mutex) } /** - * g_static_rec_mutex_free: + * g_static_rec_mutex_free: (skip): * @mutex: a #GStaticRecMutex to be freed. * * Releases all resources allocated to a #GStaticRecMutex. @@ -854,7 +847,7 @@ g_static_rec_mutex_free (GStaticRecMutex *mutex) /* GStaticRWLock {{{1 ----------------------------------------------------- */ /** - * GStaticRWLock: + * GStaticRWLock: (skip): * * The #GStaticRWLock struct represents a read-write lock. A read-write * lock can be used for protecting data that some portions of code only @@ -933,7 +926,7 @@ g_static_rec_mutex_free (GStaticRecMutex *mutex) **/ /** - * G_STATIC_RW_LOCK_INIT: + * G_STATIC_RW_LOCK_INIT: (skip): * * A #GStaticRWLock must be initialized with this macro before it can * be used. This macro can used be to initialize a variable, but it @@ -946,7 +939,7 @@ g_static_rec_mutex_free (GStaticRecMutex *mutex) */ /** - * g_static_rw_lock_init: + * g_static_rw_lock_init: (skip): * @lock: a #GStaticRWLock to be initialized. * * A #GStaticRWLock must be initialized with this function before it @@ -983,7 +976,7 @@ g_static_rw_lock_signal (GStaticRWLock* lock) } /** - * g_static_rw_lock_reader_lock: + * g_static_rw_lock_reader_lock: (skip): * @lock: a #GStaticRWLock to lock for reading. * * Locks @lock for reading. There may be unlimited concurrent locks for @@ -1018,7 +1011,7 @@ g_static_rw_lock_reader_lock (GStaticRWLock* lock) } /** - * g_static_rw_lock_reader_trylock: + * g_static_rw_lock_reader_trylock: (skip): * @lock: a #GStaticRWLock to lock for reading * * Tries to lock @lock for reading. If @lock is already locked for @@ -1052,7 +1045,7 @@ g_static_rw_lock_reader_trylock (GStaticRWLock* lock) } /** - * g_static_rw_lock_reader_unlock: + * g_static_rw_lock_reader_unlock: (skip): * @lock: a #GStaticRWLock to unlock after reading * * Unlocks @lock. If a thread waits to lock @lock for writing and all @@ -1077,7 +1070,7 @@ g_static_rw_lock_reader_unlock (GStaticRWLock* lock) } /** - * g_static_rw_lock_writer_lock: + * g_static_rw_lock_writer_lock: (skip): * @lock: a #GStaticRWLock to lock for writing * * Locks @lock for writing. If @lock is already locked for writing or @@ -1108,7 +1101,7 @@ g_static_rw_lock_writer_lock (GStaticRWLock* lock) } /** - * g_static_rw_lock_writer_trylock: + * g_static_rw_lock_writer_trylock: (skip): * @lock: a #GStaticRWLock to lock for writing * * Tries to lock @lock for writing. If @lock is already locked (for @@ -1141,7 +1134,7 @@ g_static_rw_lock_writer_trylock (GStaticRWLock* lock) } /** - * g_static_rw_lock_writer_unlock: + * g_static_rw_lock_writer_unlock: (skip): * @lock: a #GStaticRWLock to unlock after writing. * * Unlocks @lock. If a thread is waiting to lock @lock for writing and @@ -1168,7 +1161,7 @@ g_static_rw_lock_writer_unlock (GStaticRWLock* lock) } /** - * g_static_rw_lock_free: + * g_static_rw_lock_free: (skip): * @lock: a #GStaticRWLock to be freed. * * Releases all resources allocated to @lock. @@ -1201,7 +1194,7 @@ g_static_rw_lock_free (GStaticRWLock* lock) /* GPrivate {{{1 ------------------------------------------------------ */ /** - * g_private_new: + * g_private_new: (skip): * @notify: a #GDestroyNotify * * Creates a new #GPrivate. @@ -1252,7 +1245,7 @@ g_static_private_cleanup (gpointer data) GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup); /** - * GStaticPrivate: + * GStaticPrivate: (skip): * * A #GStaticPrivate works almost like a #GPrivate, but it has one * significant advantage. It doesn't need to be created at run-time @@ -1282,7 +1275,7 @@ GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup); */ /** - * G_STATIC_PRIVATE_INIT: + * G_STATIC_PRIVATE_INIT: (skip): * * Every #GStaticPrivate must be initialized with this macro, before it * can be used. @@ -1293,7 +1286,7 @@ GPrivate static_private_private = G_PRIVATE_INIT (g_static_private_cleanup); */ /** - * g_static_private_init: + * g_static_private_init: (skip): * @private_key: a #GStaticPrivate to be initialized * * Initializes @private_key. Alternatively you can initialize it with @@ -1306,7 +1299,7 @@ g_static_private_init (GStaticPrivate *private_key) } /** - * g_static_private_get: + * g_static_private_get: (skip): * @private_key: a #GStaticPrivate * * Works like g_private_get() only for a #GStaticPrivate. @@ -1349,7 +1342,7 @@ g_static_private_get (GStaticPrivate *private_key) } /** - * g_static_private_set: + * g_static_private_set: (skip): * @private_key: a #GStaticPrivate * @data: the new pointer * @notify: a function to be called with the pointer whenever the @@ -1415,7 +1408,7 @@ g_static_private_set (GStaticPrivate *private_key, } /** - * g_static_private_free: + * g_static_private_free: (skip): * @private_key: a #GStaticPrivate to be freed * * Releases all resources allocated to @private_key. @@ -1448,7 +1441,7 @@ g_static_private_free (GStaticPrivate *private_key) /* GMutex {{{1 ------------------------------------------------------ */ /** - * g_mutex_new: + * g_mutex_new: (skip): * * Allocates and initializes a new #GMutex. * @@ -1469,7 +1462,7 @@ g_mutex_new (void) } /** - * g_mutex_free: + * g_mutex_free: (skip): * @mutex: a #GMutex * * Destroys a @mutex that has been created with g_mutex_new(). @@ -1490,7 +1483,7 @@ g_mutex_free (GMutex *mutex) /* GCond {{{1 ------------------------------------------------------ */ /** - * g_cond_new: + * g_cond_new: (skip): * * Allocates and initializes a new #GCond. * @@ -1511,7 +1504,7 @@ g_cond_new (void) } /** - * g_cond_free: + * g_cond_free: (skip): * @cond: a #GCond * * Destroys a #GCond that has been created with g_cond_new(). @@ -1530,7 +1523,7 @@ g_cond_free (GCond *cond) } /** - * g_cond_timed_wait: + * g_cond_timed_wait: (skip): * @cond: a #GCond * @mutex: a #GMutex that is currently locked * @abs_time: a #GTimeVal, determining the final time diff --git a/glib/deprecated/gthread.h b/glib/deprecated/gthread.h index a366136..4988e00 100644 --- a/glib/deprecated/gthread.h +++ b/glib/deprecated/gthread.h @@ -135,10 +135,12 @@ void g_thread_foreach (GFunc thread_func, typedef struct { GMutex *mutex; -#ifndef G_OS_WIN32 +#ifndef __GI_SCANNER__ +# ifndef G_OS_WIN32 /* only for ABI compatibility reasons */ pthread_mutex_t unused; -#endif +# endif /* !G_OS_WIN32 */ +#endif /* !__GI_SCANNER__ */ } GStaticMutex GLIB_DEPRECATED_TYPE_IN_2_32_FOR(GMutex); #define g_static_mutex_lock(mutex) \ @@ -162,15 +164,17 @@ struct _GStaticRecMutex GStaticMutex mutex; guint depth; +#ifndef __GI_SCANNER__ /* ABI compat only */ union { -#ifdef G_OS_WIN32 +# ifdef G_OS_WIN32 void *owner; -#else +# else pthread_t owner; -#endif +# endif /* !G_OS_WIN32 */ gdouble dummy; } unused; +#endif /* !__GI_SCANNER__ */ } GLIB_DEPRECATED_TYPE_IN_2_32_FOR(GRecMutex); #define G_STATIC_REC_MUTEX_INIT { G_STATIC_MUTEX_INIT, 0, { 0 } } GLIB_DEPRECATED_MACRO_IN_2_32_FOR(g_rec_mutex_init) @@ -286,7 +290,7 @@ void g_cond_free (GCond *cond); GLIB_DEPRECATED_IN_2_32 gboolean g_cond_timed_wait (GCond *cond, GMutex *mutex, - GTimeVal *timeval); + GTimeVal *abs_time); G_GNUC_END_IGNORE_DEPRECATIONS diff --git a/glib/docs.c b/glib/docs.c index 450616e..fa803b4 100644 --- a/glib/docs.c +++ b/glib/docs.c @@ -25,1086 +25,8 @@ * files. */ -/* Basic types {{{1 */ - -/** - * SECTION:types - * @title: Basic Types - * @short_description: standard GLib types, defined for ease-of-use - * and portability - * - * GLib defines a number of commonly used types, which can be divided - * into several groups: - * - New types which are not part of standard C (but are defined in - * various C standard library header files) — #gboolean, #gssize. - * - Integer types which are guaranteed to be the same size across - * all platforms — #gint8, #guint8, #gint16, #guint16, #gint32, - * #guint32, #gint64, #guint64. - * - Types which are easier to use than their standard C counterparts - - * #gpointer, #gconstpointer, #guchar, #guint, #gushort, #gulong. - * - Types which correspond exactly to standard C types, but are - * included for completeness — #gchar, #gint, #gshort, #glong, - * #gfloat, #gdouble. - * - Types which correspond exactly to standard C99 types, but are available - * to use even if your compiler does not support C99 — #gsize, #goffset, - * #gintptr, #guintptr. - * - * GLib also defines macros for the limits of some of the standard - * integer and floating point types, as well as macros for suitable - * printf() formats for these types. - * - * Note that depending on the platform and build configuration, the format - * macros might not be compatible with the system provided printf() function, - * because GLib might use a different printf() implementation internally. - * The format macros will always work with GLib API (like g_print()), and with - * any C99 compatible printf() implementation. - */ - -/** - * gboolean: - * - * A standard boolean type. - * Variables of this type should only contain the value - * %TRUE or %FALSE. - * - * Never directly compare the contents of a #gboolean variable with the values - * %TRUE or %FALSE. Use `if (condition)` to check a #gboolean is "true", instead - * of `if (condition == TRUE)`. Likewise use `if (!condition)` to check a - * #gboolean is "false". - * - * There is no validation when assigning to a #gboolean variable and so it could - * contain any value represented by a #gint. This is why the use of `if - * (condition)` is recommended. All non-zero values in C evaluate to "true". - */ - -/** - * gpointer: - * - * An untyped pointer, exactly equivalent to `void *`. - * - * The standard C `void *` type should usually be preferred in - * new code, but `gpointer` can be used in contexts where a type name - * must be a single word, such as in the g_type_name() of %G_TYPE_POINTER - * or when generating a family of function names for multiple types - * using macros. - */ - -/** - * gconstpointer: - * - * An untyped pointer to constant data, exactly equivalent to `const void *`. - * - * The data pointed to should not be changed. - * - * This is typically used in function prototypes to indicate - * that the data pointed to will not be altered by the function. - * - * The standard C `const void *` type should usually be preferred in - * new code, but `gconstpointer` can be used in contexts where a type name - * must be a single word. - */ - -/** - * gchar: - * - * Equivalent to the standard C `char` type. - * - * This type only exists for symmetry with `guchar`. - * The standard C `char` type should be preferred in new code. - */ - -/** - * guchar: - * - * Equivalent to the standard C `unsigned char` type. - * - * The standard C `unsigned char` type should usually be preferred in - * new code, but `guchar` can be used in contexts where a type name - * must be a single word, such as in the g_type_name() of %G_TYPE_UCHAR - * or when generating a family of function names for multiple types - * using macros. - */ - -/** - * gint: - * - * Equivalent to the standard C `int` type. - * - * Values of this type can range from `INT_MIN` to `INT_MAX`, - * or equivalently from %G_MININT to %G_MAXINT. - * - * This type only exists for symmetry with `guint`. - * The standard C `int` type should be preferred in new code. - */ - -/** - * G_MININT: - * - * The minimum value which can be held in a #gint. - * - * This is the same as standard C `INT_MIN`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * G_MAXINT: - * - * The maximum value which can be held in a #gint. - * - * This is the same as standard C `INT_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * guint: - * - * Equivalent to the standard C `unsigned int` type. - * - * Values of this type can range from 0 to `UINT_MAX`, - * or equivalently 0 to %G_MAXUINT. - * - * The standard C `unsigned int` type should usually be preferred in - * new code, but `guint` can be used in contexts where a type name - * must be a single word, such as in the g_type_name() of %G_TYPE_UINT - * or when generating a family of function names for multiple types - * using macros. - */ - -/** - * G_MAXUINT: - * - * The maximum value which can be held in a #guint. - * - * This is the same as standard C `UINT_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gshort: - * - * Equivalent to the standard C `short` type. - * - * Values of this type can range from `SHRT_MIN` to `SHRT_MAX`, - * or equivalently %G_MINSHORT to %G_MAXSHORT. - * - * This type only exists for symmetry with `gushort`. - * The standard C `short` type should be preferred in new code. - */ - -/** - * G_MINSHORT: - * - * The minimum value which can be held in a #gshort. - * - * This is the same as standard C `SHRT_MIN`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * G_MAXSHORT: - * - * The maximum value which can be held in a #gshort. - * - * This is the same as standard C `SHRT_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gushort: - * - * Equivalent to the standard C `unsigned short` type. - * - * Values of this type can range from 0 to `USHRT_MAX`, - * or equivalently from 0 to %G_MAXUSHORT. - * - * The standard C `unsigned short` type should usually be preferred in - * new code, but `gushort` can be used in contexts where a type name - * must be a single word, such as when generating a family of function - * names for multiple types using macros. - */ - -/** - * G_MAXUSHORT: - * - * The maximum value which can be held in a #gushort. - * - * This is the same as standard C `USHRT_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * glong: - * - * Equivalent to the standard C `long` type. - * - * Values of this type can range from `LONG_MIN` to `LONG_MAX`, - * or equivalently %G_MINLONG to %G_MAXLONG. - * - * This type only exists for symmetry with `gulong`. - * The standard C `long` type should be preferred in new code. - */ - -/** - * G_MINLONG: - * - * The minimum value which can be held in a #glong. - * - * This is the same as standard C `LONG_MIN`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * G_MAXLONG: - * - * The maximum value which can be held in a #glong. - * - * This is the same as standard C `ULONG_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gulong: - * - * Equivalent to the standard C `unsigned long` type. - * - * Values of this type can range from 0 to %G_MAXULONG. - * - * The standard C `unsigned long` type should usually be preferred in - * new code, but `gulong` can be used in contexts where a type name - * must be a single word, such as in the g_type_name() of %G_TYPE_ULONG - * or when generating a family of function names for multiple types - * using macros. - */ - -/** - * G_MAXULONG: - * - * The maximum value which can be held in a #gulong. - * - * This is the same as standard C `ULONG_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gint8: - * - * A signed integer guaranteed to be 8 bits on all platforms, - * similar to the standard C `int8_t`. - * - * The `int8_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `gint8` - * (see #gsize for more details). - * - * Values of this type can range from %G_MININT8 (= -128) to - * %G_MAXINT8 (= 127). - */ - -/** - * G_MAXINT8: - * - * The maximum value which can be held in a #gint8. - * - * This is the same as standard C `INT8_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * guint8: - * - * An unsigned integer guaranteed to be 8 bits on all platforms, - * similar to the standard C `uint8_t`. - * - * The `uint8_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `guint8` - * (see #gsize for more details). - * - * Values of this type can range from 0 to %G_MAXUINT8 (= 255). - */ - -/** - * G_MAXUINT8: - * - * The maximum value which can be held in a #guint8. - * - * This is the same as standard C `UINT8_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * gint16: - * - * A signed integer guaranteed to be 16 bits on all platforms, - * similar to the standard C `int16_t`. - * - * The `int16_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `gint16` - * (see #gsize for more details). - * - * Values of this type can range from %G_MININT16 (= -32,768) to - * %G_MAXINT16 (= 32,767). - * - * To print or scan values of this type, use - * %G_GINT16_MODIFIER and/or %G_GINT16_FORMAT. - */ - -/** - * G_MAXINT16: - * - * The maximum value which can be held in a #gint16. - * - * This is the same as standard C `INT16_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * G_GINT16_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gint16 or #guint16. It - * is a string literal, but doesn't include the percent-sign, such - * that you can add precision and length modifiers between percent-sign - * and conversion specifier and append a conversion specifier. - * - * The following example prints "0x7b"; - * |[ - * gint16 value = 123; - * g_print ("%#" G_GINT16_MODIFIER "x", value); - * ]| - * - * This is not necessarily the correct modifier for printing and scanning - * `int16_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId16` and `SCNd16` should be used for `int16_t`. - * - * Since: 2.4 - */ - -/** - * G_GINT16_FORMAT: - * - * This is the platform dependent conversion specifier for scanning and - * printing values of type #gint16. It is a string literal, but doesn't - * include the percent-sign, such that you can add precision and length - * modifiers between percent-sign and conversion specifier. - * - * |[ - * gint16 in; - * gint32 out; - * sscanf ("42", "%" G_GINT16_FORMAT, &in) - * out = in * 1000; - * g_print ("%" G_GINT32_FORMAT, out); - * - * This is not necessarily the correct format for printing and scanning - * `int16_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId16` and `SCNd16` should be used for `int16_t`. - * ]| - */ - -/** - * guint16: - * - * An unsigned integer guaranteed to be 16 bits on all platforms, - * similar to the standard C `uint16_t`. - * - * The `uint16_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `guint16` - * (see #gsize for more details). - * - * Values of this type can range from 0 to %G_MAXUINT16 (= 65,535). - * - * To print or scan values of this type, use - * %G_GINT16_MODIFIER and/or %G_GUINT16_FORMAT. - */ - -/** - * G_MAXUINT16: - * - * The maximum value which can be held in a #guint16. - * - * This is the same as standard C `UINT16_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * G_GUINT16_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #guint16. See also %G_GINT16_FORMAT - * - * This is not necessarily the correct modifier for printing and scanning - * `uint16_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRIu16` and `SCNu16` should be used for `uint16_t`. - */ - -/** - * gint32: - * - * A signed integer guaranteed to be 32 bits on all platforms. - * - * The `int32_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `gint16` - * (see #gsize for more details). - * - * Values of this type can range from %G_MININT32 (= -2,147,483,648) - * to %G_MAXINT32 (= 2,147,483,647). - * - * To print or scan values of this type, use - * %G_GINT32_MODIFIER and/or %G_GINT32_FORMAT. - * - * Note that on platforms with more than one 32-bit standard integer type, - * `gint32` and `int32_t` are not necessarily implemented by the same - * 32-bit integer type. - * For example, on an ILP32 platform where `int` and `long` are both 32-bit, - * it might be the case that one of these types is `int` and the other - * is `long`. - * See #gsize for more details of what this implies. - */ - -/** - * G_MAXINT32: - * - * The maximum value which can be held in a #gint32. - * - * This is the same as standard C `INT32_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * G_GINT32_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gint32 or #guint32. It - * is a string literal. See also %G_GINT16_MODIFIER. - * - * This is not necessarily the correct modifier for printing and scanning - * `int32_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId32` and `SCNd32` should be used for `int32_t`. - * - * Since: 2.4 - */ - -/** - * G_GINT32_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #gint32. See also %G_GINT16_FORMAT. - * - * This is not necessarily the correct modifier for printing and scanning - * `int32_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId32` and `SCNd32` should be used for `int32_t`. - */ - -/** - * guint32: - * - * An unsigned integer guaranteed to be 32 bits on all platforms, - * similar to the standard C `uint32_t`. - * - * The `uint32_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `guint32` - * (see #gsize for more details). - * - * Values of this type can range from 0 to %G_MAXUINT32 (= 4,294,967,295). - * - * To print or scan values of this type, use - * %G_GINT32_MODIFIER and/or %G_GUINT32_FORMAT. - * - * Note that on platforms with more than one 32-bit standard integer type, - * `guint32` and `uint32_t` are not necessarily implemented by the same - * 32-bit integer type. - * See #gsize for more details of what this implies. - */ - -/** - * G_MAXUINT32: - * - * The maximum value which can be held in a #guint32. - * - * This is the same as standard C `UINT32_MAX`, which should be - * preferred in new code. - * - * Since: 2.4 - */ - -/** - * G_GUINT32_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #guint32. See also %G_GINT16_FORMAT. - * - * This is not necessarily the correct modifier for printing and scanning - * `uint32_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRIu32` and `SCNu32` should be used for `uint32_t`. - */ - -/** - * gint64: - * - * A signed integer guaranteed to be 64 bits on all platforms, - * similar to the standard C `int64_t`. - * - * The `int64_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `gint64` - * (see #gsize for more details). - * - * Values of this type can range from %G_MININT64 - * (= -9,223,372,036,854,775,808) to %G_MAXINT64 - * (= 9,223,372,036,854,775,807). - * - * To print or scan values of this type, use - * %G_GINT64_MODIFIER and/or %G_GINT64_FORMAT. - * - * Note that on platforms with more than one 64-bit standard integer type, - * `gint64` and `int64_t` are not necessarily implemented by the same - * 64-bit integer type. - * For example, on a platform where both `long` and `long long` are 64-bit, - * it might be the case that one of those types is used for `gint64` - * and the other is used for `int64_t`. - * See #gsize for more details of what this implies. - */ - -/** - * G_MAXINT64: - * - * The maximum value which can be held in a #gint64. - */ - -/** - * G_GINT64_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gint64 or #guint64. - * It is a string literal. - * - * Some platforms do not support printing 64-bit integers, even - * though the types are supported. On such platforms %G_GINT64_MODIFIER - * is not defined. - * - * This is not necessarily the correct modifier for printing and scanning - * `int64_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId64` and `SCNd64` should be used for `int64_t`. - * - * Since: 2.4 - */ - -/** - * G_GINT64_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #gint64. See also %G_GINT16_FORMAT. - * - * Some platforms do not support scanning and printing 64-bit integers, - * even though the types are supported. On such platforms %G_GINT64_FORMAT - * is not defined. Note that scanf() may not support 64-bit integers, even - * if %G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() - * is not recommended for parsing anyway; consider using g_ascii_strtoull() - * instead. - * - * This is not necessarily the correct format for printing and scanning - * `int64_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRId64` and `SCNd64` should be used for `int64_t`. - */ - -/** - * guint64: - * - * An unsigned integer guaranteed to be 64-bits on all platforms, - * similar to the standard C `uint64_t` type. - * - * The `uint64_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires use of `guint64` - * (see #gsize for more details). - * - * Values of this type can range from 0 to %G_MAXUINT64 - * (= 18,446,744,073,709,551,615). - * - * To print or scan values of this type, use - * %G_GINT64_MODIFIER and/or %G_GUINT64_FORMAT. - * - * Note that on platforms with more than one 64-bit standard integer type, - * `guint64` and `uint64_t` are not necessarily implemented by the same - * 64-bit integer type. - * See #gsize for more details of what this implies. - */ - -/** - * G_MAXUINT64: - * - * The maximum value which can be held in a #guint64. - * - * This is the same as standard C `UINT64_MAX`, which should be - * preferred in new code. - */ - -/** - * G_GUINT64_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #guint64. See also %G_GINT16_FORMAT. - * - * Some platforms do not support scanning and printing 64-bit integers, - * even though the types are supported. On such platforms %G_GUINT64_FORMAT - * is not defined. Note that scanf() may not support 64-bit integers, even - * if %G_GINT64_FORMAT is defined. Due to its weak error handling, scanf() - * is not recommended for parsing anyway; consider using g_ascii_strtoull() - * instead. - * - * This is not necessarily the correct modifier for printing and scanning - * `uint64_t` values, even though the in-memory representation is the same. - * Standard C macros like `PRIu64` and `SCNu64` should be used for `uint64_t`. - */ - -/** - * G_GINT64_CONSTANT: - * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 - * - * This macro is used to insert 64-bit integer literals - * into the source code. - * - * It is similar to the standard C `INT64_C` macro, - * which should be preferred in new code. - */ - -/** - * G_GUINT64_CONSTANT: - * @val: a literal integer value, e.g. 0x1d636b02300a7aa7U - * - * This macro is used to insert 64-bit unsigned integer - * literals into the source code. - * - * It is similar to the standard C `UINT64_C` macro, - * which should be preferred in new code. - * - * Since: 2.10 - */ - -/** - * gfloat: - * - * Equivalent to the standard C `float` type. - * - * Values of this type can range from `-FLT_MAX` to `FLT_MAX`, - * or equivalently from -%G_MAXFLOAT to %G_MAXFLOAT. - */ - -/** - * G_MINFLOAT: - * - * The minimum positive value which can be held in a #gfloat. - * - * If you are interested in the smallest value which can be held - * in a #gfloat, use -%G_MAXFLOAT. - * - * This is the same as standard C `FLT_MIN`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * G_MAXFLOAT: - * - * The maximum value which can be held in a #gfloat. - * - * This is the same as standard C `FLT_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gdouble: - * - * Equivalent to the standard C `double` type. - * - * Values of this type can range from `-DBL_MAX` to `DBL_MAX`, - * or equivalently from -%G_MAXDOUBLE to %G_MAXDOUBLE. - */ - -/** - * G_MINDOUBLE: - * - * The minimum positive value which can be held in a #gdouble. - * - * If you are interested in the smallest value which can be held - * in a #gdouble, use -%G_MAXDOUBLE. - * - * This is the same as standard C `DBL_MIN`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * G_MAXDOUBLE: - * - * The maximum value which can be held in a #gdouble. - * - * This is the same as standard C `DBL_MAX`, which is available since C99 - * and should be preferred in new code. - */ - -/** - * gsize: - * - * An unsigned integer type of the result of the `sizeof` operator, - * corresponding to the `size_t` type defined in C99. - * - * The standard `size_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires `gsize` - * (see below for more details). - * - * `gsize` is usually 32 bit wide on a 32-bit platform and 64 bit wide - * on a 64-bit platform. Values of this type can range from 0 to - * %G_MAXSIZE. - * - * This type is wide enough to hold the size of the largest possible - * memory allocation, but is not guaranteed to be wide enough to hold - * the numeric value of a pointer: on platforms that use tagged pointers, - * such as [CHERI](https://cheri-cpu.org/), pointers can be numerically - * larger than the size of the address space. - * If the numeric value of a pointer needs to be stored in an integer - * without information loss, use the standard C types `intptr_t` or - * `uintptr_t`, or the similar GLib types #gintptr or #guintptr. - * - * To print or scan values of this type, use - * %G_GSIZE_MODIFIER and/or %G_GSIZE_FORMAT. - * - * Note that on platforms where more than one standard integer type is - * the same size, `size_t` and `gsize` are always the same size but are - * not necessarily implemented by the same standard integer type. - * For example, on an ILP32 platform where `int`, `long` and pointers - * are all 32-bit, `size_t` might be `unsigned long` while `gsize` - * might be `unsigned int`. - * This can result in compiler warnings or unexpected C++ name-mangling - * if the two types are used inconsistently. - * - * As a result, changing a type from `gsize` to `size_t` in existing APIs - * might be an incompatible API or ABI change, especially if C++ - * is involved. The safe option is to leave existing APIs using the same type - * that they have historically used, and only use the standard C types in - * new APIs. - * - * Similar considerations apply to all the fixed-size types - * (#gint8, #guint8, #gint16, #guint16, #gint32, #guint32, #gint64, - * #guint64 and #goffset), as well as #gintptr and #guintptr. - * Types that are 32 bits or larger are particularly likely to be - * affected by this. - */ - -/** - * G_MAXSIZE: - * - * The maximum value which can be held in a #gsize. - * - * This is the same as standard C `SIZE_MAX` (available since C99), - * which should be preferred in new code. - * - * Since: 2.4 - */ - -/** - * G_GSIZE_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gsize. It - * is a string literal. - * - * Note that this is not necessarily the correct modifier to scan or - * print a `size_t`, even though the in-memory representation is the - * same. The Standard C `"z"` modifier should be used for `size_t`, - * assuming a C99-compliant `printf` implementation is available. - * - * Since: 2.6 - */ - -/** - * G_GSIZE_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #gsize. See also %G_GINT16_FORMAT. - * - * Note that this is not necessarily the correct format to scan or - * print a `size_t`, even though the in-memory representation is the - * same. The standard C `"zu"` format should be used for `size_t`, - * assuming a C99-compliant `printf` implementation is available. - * - * Since: 2.6 - */ - -/** - * gssize: - * - * A signed variant of #gsize, corresponding to the - * `ssize_t` defined in POSIX or the similar `SSIZE_T` in Windows. - * - * In new platform-specific code, consider using `ssize_t` or `SSIZE_T` - * directly. - * - * Values of this type can range from %G_MINSSIZE - * to %G_MAXSSIZE. - * - * Note that on platforms where `ssize_t` is implemented, `ssize_t` and - * `gssize` might be implemented by different standard integer types - * of the same size. Similarly, on Windows, `SSIZE_T` and `gssize` - * might be implemented by different standard integer types of the same - * size. See #gsize for more details. - * - * This type is also not guaranteed to be the same as standard C - * `ptrdiff_t`, although they are the same on many platforms. - * - * To print or scan values of this type, use - * %G_GSSIZE_MODIFIER and/or %G_GSSIZE_FORMAT. - */ - -/** - * G_MINSSIZE: - * - * The minimum value which can be held in a #gssize. - * - * Since: 2.14 - */ - -/** - * G_MAXSSIZE: - * - * The maximum value which can be held in a #gssize. - * - * Since: 2.14 - */ - -/** - * G_GSSIZE_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #gssize. See also %G_GINT16_FORMAT. - * - * Note that this is not necessarily the correct format to scan or print - * a POSIX `ssize_t` or a Windows `SSIZE_T`, even though the in-memory - * representation is the same. - * On POSIX platforms, the `"zd"` format should be used for `ssize_t`. - * - * Since: 2.6 - */ - -/** - * G_GSSIZE_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gssize. It - * is a string literal. - * - * Note that this is not necessarily the correct modifier to scan or print - * a POSIX `ssize_t` or a Windows `SSIZE_T`, even though the in-memory - * representation is the same. - * On POSIX platforms, the `"z"` modifier should be used for `ssize_t`. - * - * Since: 2.6 - */ - -/** - * goffset: - * - * A signed integer type that is used for file offsets, - * corresponding to the POSIX type `off_t` as if compiling with - * `_FILE_OFFSET_BITS` set to 64. #goffset is always 64 bits wide, even on - * 32-bit architectures, and even if `off_t` is only 32 bits. - * Values of this type can range from %G_MINOFFSET to - * %G_MAXOFFSET. - * - * To print or scan values of this type, use - * %G_GOFFSET_MODIFIER and/or %G_GOFFSET_FORMAT. - * - * On platforms with more than one 64-bit standard integer type, - * even if `off_t` is also 64 bits in size, `goffset` and `off_t` are not - * necessarily implemented by the same 64-bit integer type. - * See #gsize for more details of what this implies. - * - * Since: 2.14 - */ - -/** - * G_MINOFFSET: - * - * The minimum value which can be held in a #goffset. - */ - -/** - * G_MAXOFFSET: - * - * The maximum value which can be held in a #goffset. - */ - -/** - * G_GOFFSET_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #goffset. It is a string - * literal. See also %G_GINT64_MODIFIER. - * - * This modifier should only be used with #goffset values, and not - * with `off_t`, which is not necessarily the same type or even the same size. - * - * Since: 2.20 - */ - -/** - * G_GOFFSET_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #goffset. See also %G_GINT64_FORMAT. - * - * This format should only be used with #goffset values, and not - * with `off_t`, which is not necessarily the same type or even the same size. - * - * Since: 2.20 - */ - -/** - * G_GOFFSET_CONSTANT: - * @val: a literal integer value, e.g. 0x1d636b02300a7aa7 - * - * This macro is used to insert #goffset 64-bit integer literals - * into the source code. - * - * See also G_GINT64_CONSTANT(). - * - * Since: 2.20 - */ - -/** - * gintptr: - * - * Corresponds to the C99 type intptr_t, - * a signed integer type that can hold any pointer. - * - * The standard `intptr_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires `gintptr`. - * Note that `intptr_t` and `gintptr` might be implemented by different - * standard integer types of the same size. See #gsize for more details. - * - * #gintptr is not guaranteed to be the same type or the same size as #gssize, - * even though they are the same on many CPU architectures. - * - * To print or scan values of this type, use - * %G_GINTPTR_MODIFIER and/or %G_GINTPTR_FORMAT. - * - * Since: 2.18 - */ - -/** - * G_GINTPTR_MODIFIER: - * - * The platform dependent length modifier for conversion specifiers - * for scanning and printing values of type #gintptr or #guintptr. - * It is a string literal. - * - * Note that this is not necessarily the correct modifier to scan or - * print an `intptr_t`, even though the in-memory representation is the - * same. - * Standard C macros like `PRIdPTR` and `SCNdPTR` should be used for - * `intptr_t`. - * - * Since: 2.22 - */ - -/** - * G_GINTPTR_FORMAT: - * - * This is the platform dependent conversion specifier for scanning - * and printing values of type #gintptr. - * - * Note that this is not necessarily the correct format to scan or - * print an `intptr_t`, even though the in-memory representation is the - * same. - * Standard C macros like `PRIdPTR` and `SCNdPTR` should be used for - * `intptr_t`. - * - * Since: 2.22 - */ - -/** - * guintptr: - * - * Corresponds to the C99 type uintptr_t, - * an unsigned integer type that can hold any pointer. - * - * The standard `uintptr_t` type should be preferred in new code, unless - * consistency with pre-existing APIs requires `guintptr`. - * Note that `uintptr_t` and `guintptr` might be implemented by different - * standard integer types of the same size. See #gsize for more details. - * - * #guintptr is not guaranteed to be the same type or the same size as #gsize, - * even though they are the same on many CPU architectures. - * - * To print or scan values of this type, use - * %G_GINTPTR_MODIFIER and/or %G_GUINTPTR_FORMAT. - * - * Since: 2.18 - */ - -/** - * G_GUINTPTR_FORMAT: - * - * This is the platform dependent conversion specifier - * for scanning and printing values of type #guintptr. - * - * Note that this is not necessarily the correct format to scan or - * print a `uintptr_t`, even though the in-memory representation is the - * same. - * Standard C macros like `PRIuPTR` and `SCNuPTR` should be used for - * `uintptr_t`. - * - * Since: 2.22 - */ - /* Type conversion {{{1 */ -/** - * SECTION:type_conversion - * @title: Type Conversion Macros - * @short_description: portably storing integers in pointer variables - * - * Many times GLib, GTK, and other libraries allow you to pass "user - * data" to a callback, in the form of a void pointer. From time to time - * you want to pass an integer instead of a pointer. You could allocate - * an integer, with something like: - * |[ - * int *ip = g_new (int, 1); - * *ip = 42; - * ]| - * But this is inconvenient, and it's annoying to have to free the - * memory at some later time. - * - * Pointers are always at least 32 bits in size (on all platforms GLib - * intends to support). Thus you can store at least 32-bit integer values - * in a pointer value. Naively, you might try this, but it's incorrect: - * |[ - * gpointer p; - * int i; - * p = (void*) 42; - * i = (int) p; - * ]| - * Again, that example was not correct, don't copy it. - * The problem is that on some systems you need to do this: - * |[ - * gpointer p; - * int i; - * p = (void*) (long) 42; - * i = (int) (long) p; - * ]| - * The GLib macros GPOINTER_TO_INT(), GINT_TO_POINTER(), etc. take care - * to do the right thing on every platform. - * - * Warning: You may not store pointers in integers. This is not - * portable in any way, shape or form. These macros only allow storing - * integers in pointers, and only preserve 32 bits of the integer; values - * outside the range of a 32-bit integer will be mangled. - */ - /** * GINT_TO_POINTER: * @i: integer to stuff into a pointer @@ -1150,6 +72,12 @@ * @s: #gsize to stuff into the pointer * * Stuffs a #gsize into a pointer type. + * + * Remember, you may not store pointers in integers. This is not portable + * in any way, shape or form. These macros only allow storing integers in + * pointers, and preserve all bits of a pointer (e.g. on CHERI systems). + * The only types that can store pointers as well as integers are #guintptr + * and #gintptr. */ /** @@ -1158,45 +86,18 @@ * * Extracts a #gsize from a pointer. The #gsize must have * been stored in the pointer with GSIZE_TO_POINTER(). + * + * Remember, you may not store pointers in integers. This is not portable + * in any way, shape or form. These macros only allow storing integers in + * pointers, and preserve all bits of a pointer (e.g. on CHERI systems). + * The only types that can store pointers as well as integers are #guintptr + * and #gintptr. + * + * See also GPOINTER_TO_TYPE() for #GType. */ /* Byte order {{{1 */ -/** - * SECTION:byte_order - * @title: Byte Order Macros - * @short_description: a portable way to convert between different byte orders - * - * These macros provide a portable way to determine the host byte order - * and to convert values between different byte orders. - * - * The byte order is the order in which bytes are stored to create larger - * data types such as the #gint and #glong values. - * The host byte order is the byte order used on the current machine. - * - * Some processors store the most significant bytes (i.e. the bytes that - * hold the largest part of the value) first. These are known as big-endian - * processors. Other processors (notably the x86 family) store the most - * significant byte last. These are known as little-endian processors. - * - * Finally, to complicate matters, some other processors store the bytes in - * a rather curious order known as PDP-endian. For a 4-byte word, the 3rd - * most significant byte is stored first, then the 4th, then the 1st and - * finally the 2nd. - * - * Obviously there is a problem when these different processors communicate - * with each other, for example over networks or by using binary file formats. - * This is where these macros come in. They are typically used to convert - * values into a byte order which has been agreed on for use when - * communicating between different processors. The Internet uses what is - * known as 'network byte order' as the standard byte order (which is in - * fact the big-endian byte order). - * - * Note that the byte order conversion macros may evaluate their arguments - * multiple times, thus you should not use them with arguments which have - * side-effects. - */ - /** * G_BYTE_ORDER: * @@ -1765,27 +666,6 @@ */ /* Bounds-checked integer arithmetic {{{1 */ -/** - * SECTION:checkedmath - * @title: Bounds-checking integer arithmetic - * @short_description: a set of helpers for performing checked integer arithmetic - * - * GLib offers a set of macros for doing additions and multiplications - * of unsigned integers, with checks for overflows. - * - * The helpers all have three arguments. A pointer to the destination - * is always the first argument and the operands to the operation are - * the other two. - * - * Following standard GLib convention, the helpers return %TRUE in case - * of success (ie: no overflow). - * - * The helpers may be macros, normal functions or inlines. They may be - * implemented with inline assembly or compiler intrinsics where - * available. - * - * Since: 2.48 - */ /** * g_uint_checked_add @@ -1890,23 +770,6 @@ */ /* Numerical Definitions {{{1 */ -/** - * SECTION:numerical - * @title: Numerical Definitions - * @short_description: mathematical constants, and floating point decomposition - * - * GLib offers mathematical constants such as %G_PI for the value of pi; - * many platforms have these in the C library, but some don't, the GLib - * versions always exist. - * - * The #GFloatIEEE754 and #GDoubleIEEE754 unions are used to access the - * sign, mantissa and exponent of IEEE floats and doubles. These unions are - * defined as appropriate for a given platform. IEEE floats and doubles are - * supported (used for storage) by at least Intel, PPC and Sparc. See - * [IEEE 754-2008](http://en.wikipedia.org/wiki/IEEE_float) - * for more information about IEEE number formats. - */ - /** * G_IEEE754_FLOAT_BIAS: * @@ -1986,16 +849,8 @@ * * Multiplying the base 2 exponent by this number yields the base 10 exponent. */ - -/* Macros {{{1 */ -/** - * SECTION:macros - * @title: Standard Macros - * @short_description: commonly-used macros - * - * These macros provide a few commonly-used features. - */ +/* Macros {{{1 */ /** * G_OS_WIN32: @@ -2201,15 +1056,6 @@ /* Miscellaneous Macros {{{1 */ -/** - * SECTION:macros_misc - * @title: Miscellaneous Macros - * @short_description: specialized macros which are not used often - * - * These macros provide more specialized features which are not - * needed so often by application programmers. - */ - /** * G_STMT_START: * @@ -2978,73 +1824,8 @@ * Since: 2.44 */ -/* Warnings and Assertions {{{1 */ - -/** - * SECTION:warnings - * @title: Warnings and Assertions - * @short_description: warnings and assertions to use in runtime code - * - * GLib defines several warning functions and assertions which can be used to - * warn of programmer errors when calling functions, and print error messages - * from command line programs. - * - * The g_return_if_fail(), g_return_val_if_fail(), g_return_if_reached() and - * g_return_val_if_reached() macros are intended as pre-condition assertions, to - * be used at the top of a public function to check that the function’s - * arguments are acceptable. Any failure of such a pre-condition assertion is - * considered a programming error on the part of the caller of the public API, - * and the program is considered to be in an undefined state afterwards. They - * are similar to the libc assert() function, but provide more context on - * failures. - * - * For example: - * |[ - * gboolean - * g_dtls_connection_shutdown (GDtlsConnection *conn, - * gboolean shutdown_read, - * gboolean shutdown_write, - * GCancellable *cancellable, - * GError **error) - * { - * // local variable declarations - * - * g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), FALSE); - * g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE); - * g_return_val_if_fail (error == NULL || *error == NULL, FALSE); - * - * // function body - * - * return return_val; - * } - * ]| - * - * g_print() and g_printerr() are intended to be used for - * output from command line applications, since they output to standard output - * and standard error by default — whereas functions like g_message() and - * g_log() may be redirected to special purpose message windows, files, or the - * system journal. - * - * If the console encoding is not UTF-8 (as specified by g_get_console_charset()) - * then these functions convert the message first. Any Unicode - * characters not defined by that charset are replaced by `'?'`. On Linux, - * setlocale() must be called early in main() to load the encoding. This behaviour - * can be changed by providing custom handlers to g_set_print_handler(), - * g_set_printerr_handler() and g_log_set_handler(). - */ - /* Windows Compatibility Functions {{{1 */ -/** - * SECTION:windows - * @title: Windows Compatibility Functions - * @short_description: UNIX emulation on Windows - * - * These functions provide some level of UNIX emulation on the - * Windows platform. If your application really needs the POSIX - * APIs, we suggest you try the Cygwin project. - */ - /** * MAXPATHLEN: * diff --git a/glib/garcbox.c b/glib/garcbox.c index d69e75d..da19cd4 100644 --- a/glib/garcbox.c +++ b/glib/garcbox.c @@ -35,131 +35,6 @@ #define G_ARC_BOX(p) (GArcBox *) (((char *) (p)) - G_ARC_BOX_SIZE) -/** - * SECTION:arcbox - * @Title: Atomically reference counted data - * @Short_description: Allocated memory with atomic reference counting semantics - * - * An "atomically reference counted box", or "ArcBox", is an opaque wrapper - * data type that is guaranteed to be as big as the size of a given data type, - * and which augments the given data type with thread safe reference counting - * semantics for its memory management. - * - * ArcBox is useful if you have a plain old data type, like a structure - * typically placed on the stack, and you wish to provide additional API - * to use it on the heap; or if you want to implement a new type to be - * passed around by reference without necessarily implementing copy/free - * semantics or your own reference counting. - * - * The typical use is: - * - * |[ - * typedef struct { - * char *name; - * char *address; - * char *city; - * char *state; - * int age; - * } Person; - * - * Person * - * person_new (void) - * { - * return g_atomic_rc_box_new0 (Person); - * } - * ]| - * - * Every time you wish to acquire a reference on the memory, you should - * call g_atomic_rc_box_acquire(); similarly, when you wish to release a reference - * you should call g_atomic_rc_box_release(): - * - * |[ - * // Add a Person to the Database; the Database acquires ownership - * // of the Person instance - * void - * add_person_to_database (Database *db, Person *p) - * { - * db->persons = g_list_prepend (db->persons, g_atomic_rc_box_acquire (p)); - * } - * - * // Removes a Person from the Database; the reference acquired by - * // add_person_to_database() is released here - * void - * remove_person_from_database (Database *db, Person *p) - * { - * db->persons = g_list_remove (db->persons, p); - * g_atomic_rc_box_release (p); - * } - * ]| - * - * If you have additional memory allocated inside the structure, you can - * use g_atomic_rc_box_release_full(), which takes a function pointer, which - * will be called if the reference released was the last: - * - * |[ - * void - * person_clear (Person *p) - * { - * g_free (p->name); - * g_free (p->address); - * g_free (p->city); - * g_free (p->state); - * } - * - * void - * remove_person_from_database (Database *db, Person *p) - * { - * db->persons = g_list_remove (db->persons, p); - * g_atomic_rc_box_release_full (p, (GDestroyNotify) person_clear); - * } - * ]| - * - * If you wish to transfer the ownership of a reference counted data - * type without increasing the reference count, you can use g_steal_pointer(): - * - * |[ - * Person *p = g_atomic_rc_box_new (Person); - * - * fill_person_details (p); - * - * add_person_to_database (db, g_steal_pointer (&p)); - * ]| - * - * ## Thread safety - * - * The reference counting operations on data allocated using g_atomic_rc_box_alloc(), - * g_atomic_rc_box_new(), and g_atomic_rc_box_dup() are guaranteed to be atomic, and thus - * can be safely be performed by different threads. It is important to note that - * only the reference acquisition and release are atomic; changes to the content - * of the data are your responsibility. - * - * ## Automatic pointer clean up - * - * If you want to add g_autoptr() support to your plain old data type through - * reference counting, you can use the G_DEFINE_AUTOPTR_CLEANUP_FUNC() and - * g_atomic_rc_box_release(): - * - * |[ - * G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, g_atomic_rc_box_release) - * ]| - * - * If you need to clear the contents of the data, you will need to use an - * ancillary function that calls g_rc_box_release_full(): - * - * |[ - * static void - * my_data_struct_release (MyDataStruct *data) - * { - * // my_data_struct_clear() is defined elsewhere - * g_atomic_rc_box_release_full (data, (GDestroyNotify) my_data_struct_clear); - * } - * - * G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, my_data_struct_release) - * ]| - * - * Since: 2.58 - */ - /** * g_atomic_rc_box_alloc: * @block_size: the size of the allocation, must be greater than 0 diff --git a/glib/garray.c b/glib/garray.c index e6cef31..efd031b 100644 --- a/glib/garray.c +++ b/glib/garray.c @@ -47,53 +47,6 @@ #include "grefcount.h" #include "gutilsprivate.h" -/** - * SECTION:arrays - * @title: Arrays - * @short_description: arrays of arbitrary elements which grow - * automatically as elements are added - * - * Arrays are similar to standard C arrays, except that they grow - * automatically as elements are added. - * - * Array elements can be of any size (though all elements of one array - * are the same size), and the array can be automatically cleared to - * '0's and zero-terminated. - * - * To create a new array use g_array_new(). - * - * To add elements to an array with a cost of O(n) at worst, use - * g_array_append_val(), g_array_append_vals(), g_array_prepend_val(), - * g_array_prepend_vals(), g_array_insert_val() and g_array_insert_vals(). - * - * To access an element of an array in O(1) (to read it or to write it), - * use g_array_index(). - * - * To set the size of an array, use g_array_set_size(). - * - * To free an array, use g_array_unref() or g_array_free(). - * - * All the sort functions are internally calling a quick-sort (or similar) - * function with an average cost of O(n log(n)) and a worst case - * cost of O(n^2). - * - * Here is an example that stores integers in a #GArray: - * |[ - * GArray *garray; - * gint i; - * // We create a new array to store gint values. - * // We don't want it zero-terminated or cleared to 0's. - * garray = g_array_new (FALSE, FALSE, sizeof (gint)); - * for (i = 0; i < 10000; i++) - * g_array_append_val (garray, i); - * for (i = 0; i < 10000; i++) - * if (g_array_index (garray, gint, i) != i) - * g_print ("ERROR: got %d instead of %d\n", - * g_array_index (garray, gint, i), i); - * g_array_free (garray, TRUE); - * ]| - */ - #define MIN_ARRAY_SIZE 16 typedef struct _GRealArray GRealArray; @@ -925,6 +878,7 @@ g_array_remove_range (GArray *farray, g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ <= array->len, NULL); + g_return_val_if_fail (index_ <= G_MAXUINT - length, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); if (array->clear_func != NULL) @@ -1126,54 +1080,6 @@ g_array_maybe_expand (GRealArray *array, } } -/** - * SECTION:arrays_pointer - * @title: Pointer Arrays - * @short_description: arrays of pointers to any type of data, which - * grow automatically as new elements are added - * - * Pointer Arrays are similar to Arrays but are used only for storing - * pointers. - * - * If you remove elements from the array, elements at the end of the - * array are moved into the space previously occupied by the removed - * element. This means that you should not rely on the index of particular - * elements remaining the same. You should also be careful when deleting - * elements while iterating over the array. - * - * To create a pointer array, use g_ptr_array_new(). - * - * To add elements to a pointer array, use g_ptr_array_add(). - * - * To remove elements from a pointer array, use g_ptr_array_remove(), - * g_ptr_array_remove_index() or g_ptr_array_remove_index_fast(). - * - * To access an element of a pointer array, use g_ptr_array_index(). - * - * To set the size of a pointer array, use g_ptr_array_set_size(). - * - * To free a pointer array, use g_ptr_array_free(). - * - * An example using a #GPtrArray: - * |[ - * GPtrArray *array; - * gchar *string1 = "one"; - * gchar *string2 = "two"; - * gchar *string3 = "three"; - * - * array = g_ptr_array_new (); - * g_ptr_array_add (array, (gpointer) string1); - * g_ptr_array_add (array, (gpointer) string2); - * g_ptr_array_add (array, (gpointer) string3); - * - * if (g_ptr_array_index (array, 0) != (gpointer) string1) - * g_print ("ERROR: got %p instead of %p\n", - * g_ptr_array_index (array, 0), string1); - * - * g_ptr_array_free (array, TRUE); - * ]| - */ - typedef struct _GRealPtrArray GRealPtrArray; /** @@ -2188,6 +2094,7 @@ g_ptr_array_remove_range (GPtrArray *array, g_return_val_if_fail (rarray != NULL, NULL); g_return_val_if_fail (rarray->len == 0 || (rarray->len != 0 && rarray->pdata != NULL), NULL); g_return_val_if_fail (index_ <= rarray->len, NULL); + g_return_val_if_fail (index_ <= G_MAXUINT - length, NULL); g_return_val_if_fail (length == 0 || index_ + length <= rarray->len, NULL); if (length == 0) @@ -2765,45 +2672,6 @@ g_ptr_array_find_with_equal_func (GPtrArray *haystack, return FALSE; } -/** - * SECTION:arrays_byte - * @title: Byte Arrays - * @short_description: arrays of bytes - * - * #GByteArray is a mutable array of bytes based on #GArray, to provide arrays - * of bytes which grow automatically as elements are added. - * - * To create a new #GByteArray use g_byte_array_new(). To add elements to a - * #GByteArray, use g_byte_array_append(), and g_byte_array_prepend(). - * - * To set the size of a #GByteArray, use g_byte_array_set_size(). - * - * To free a #GByteArray, use g_byte_array_free(). - * - * An example for using a #GByteArray: - * |[ - * GByteArray *gbarray; - * gint i; - * - * gbarray = g_byte_array_new (); - * for (i = 0; i < 10000; i++) - * g_byte_array_append (gbarray, (guint8*) "abcd", 4); - * - * for (i = 0; i < 10000; i++) - * { - * g_assert (gbarray->data[4*i] == 'a'); - * g_assert (gbarray->data[4*i+1] == 'b'); - * g_assert (gbarray->data[4*i+2] == 'c'); - * g_assert (gbarray->data[4*i+3] == 'd'); - * } - * - * g_byte_array_free (gbarray, TRUE); - * ]| - * - * See #GBytes if you are interested in an immutable object representing a - * sequence of bytes. - */ - /** * GByteArray: * @data: a pointer to the element data. The data may be moved as @@ -2895,7 +2763,7 @@ g_byte_array_new_take (guint8 *data, * bytes to the array. Note however that the size of the array is still * 0. * - * Returns: the new #GByteArray + * Returns: (transfer full): the new #GByteArray */ GByteArray* g_byte_array_sized_new (guint reserved_size) @@ -2959,7 +2827,7 @@ g_byte_array_free_to_bytes (GByteArray *array) * Atomically increments the reference count of @array by one. * This function is thread-safe and may be called from any thread. * - * Returns: The passed in #GByteArray + * Returns: (transfer full): The passed in #GByteArray * * Since: 2.22 */ @@ -2995,7 +2863,7 @@ g_byte_array_unref (GByteArray *array) * Adds the given bytes to the end of the #GByteArray. * The array will grow in size automatically if necessary. * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray */ GByteArray* g_byte_array_append (GByteArray *array, @@ -3016,7 +2884,7 @@ g_byte_array_append (GByteArray *array, * Adds the given data to the start of the #GByteArray. * The array will grow in size automatically if necessary. * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray */ GByteArray* g_byte_array_prepend (GByteArray *array, @@ -3035,7 +2903,7 @@ g_byte_array_prepend (GByteArray *array, * * Sets the size of the #GByteArray, expanding it if necessary. * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray */ GByteArray* g_byte_array_set_size (GByteArray *array, @@ -3054,7 +2922,7 @@ g_byte_array_set_size (GByteArray *array, * Removes the byte at the given index from a #GByteArray. * The following bytes are moved down one place. * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray **/ GByteArray* g_byte_array_remove_index (GByteArray *array, @@ -3075,7 +2943,7 @@ g_byte_array_remove_index (GByteArray *array, * does not preserve the order of the #GByteArray. But it is faster * than g_byte_array_remove_index(). * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray */ GByteArray* g_byte_array_remove_index_fast (GByteArray *array, @@ -3095,7 +2963,7 @@ g_byte_array_remove_index_fast (GByteArray *array, * Removes the given number of bytes starting at the given index from a * #GByteArray. The following elements are moved to close the gap. * - * Returns: the #GByteArray + * Returns: (transfer none): the #GByteArray * * Since: 2.4 */ @@ -3106,6 +2974,7 @@ g_byte_array_remove_range (GByteArray *array, { g_return_val_if_fail (array, NULL); g_return_val_if_fail (index_ <= array->len, NULL); + g_return_val_if_fail (index_ <= G_MAXUINT - length, NULL); g_return_val_if_fail (index_ + length <= array->len, NULL); return (GByteArray *)g_array_remove_range ((GArray *)array, index_, length); @@ -3114,7 +2983,7 @@ g_byte_array_remove_range (GByteArray *array, /** * g_byte_array_sort: * @array: a #GByteArray - * @compare_func: comparison function + * @compare_func: (scope call): comparison function * * Sorts a byte array, using @compare_func which should be a * qsort()-style comparison function (returns less than zero for first @@ -3137,7 +3006,7 @@ g_byte_array_sort (GByteArray *array, /** * g_byte_array_sort_with_data: * @array: a #GByteArray - * @compare_func: comparison function + * @compare_func: (scope call): comparison function * @user_data: data to pass to @compare_func * * Like g_byte_array_sort(), but the comparison function takes an extra diff --git a/glib/gasyncqueue.c b/glib/gasyncqueue.c index 0518763..8bb0279 100644 --- a/glib/gasyncqueue.c +++ b/glib/gasyncqueue.c @@ -37,56 +37,6 @@ #include "gthread.h" #include "deprecated/gthread.h" - -/** - * SECTION:async_queues - * @title: Asynchronous Queues - * @short_description: asynchronous communication between threads - * @see_also: #GThreadPool - * - * Often you need to communicate between different threads. In general - * it's safer not to do this by shared memory, but by explicit message - * passing. These messages only make sense asynchronously for - * multi-threaded applications though, as a synchronous operation could - * as well be done in the same thread. - * - * Asynchronous queues are an exception from most other GLib data - * structures, as they can be used simultaneously from multiple threads - * without explicit locking and they bring their own builtin reference - * counting. This is because the nature of an asynchronous queue is that - * it will always be used by at least 2 concurrent threads. - * - * For using an asynchronous queue you first have to create one with - * g_async_queue_new(). #GAsyncQueue structs are reference counted, - * use g_async_queue_ref() and g_async_queue_unref() to manage your - * references. - * - * A thread which wants to send a message to that queue simply calls - * g_async_queue_push() to push the message to the queue. - * - * A thread which is expecting messages from an asynchronous queue - * simply calls g_async_queue_pop() for that queue. If no message is - * available in the queue at that point, the thread is now put to sleep - * until a message arrives. The message will be removed from the queue - * and returned. The functions g_async_queue_try_pop() and - * g_async_queue_timeout_pop() can be used to only check for the presence - * of messages or to only wait a certain time for messages respectively. - * - * For almost every function there exist two variants, one that locks - * the queue and one that doesn't. That way you can hold the queue lock - * (acquire it with g_async_queue_lock() and release it with - * g_async_queue_unlock()) over multiple queue accessing instructions. - * This can be necessary to ensure the integrity of the queue, but should - * only be used when really necessary, as it can make your life harder - * if used unwisely. Normally you should only use the locking function - * variants (those without the _unlocked suffix). - * - * In many cases, it may be more convenient to use #GThreadPool when - * you need to distribute work to a set of worker threads instead of - * using #GAsyncQueue manually. #GThreadPool uses a GAsyncQueue - * internally. - */ - /** * GAsyncQueue: * @@ -111,11 +61,11 @@ typedef struct } SortData; /** - * g_async_queue_new: + * g_async_queue_new: (constructor) * * Creates a new asynchronous queue. * - * Returns: a new #GAsyncQueue. Free with g_async_queue_unref() + * Returns: (transfer full): a new #GAsyncQueue. Free with g_async_queue_unref() */ GAsyncQueue * g_async_queue_new (void) @@ -124,14 +74,14 @@ g_async_queue_new (void) } /** - * g_async_queue_new_full: + * g_async_queue_new_full: (constructor) * @item_free_func: (nullable): function to free queue elements * * Creates a new asynchronous queue and sets up a destroy notify * function that is used to free any remaining queue items when * the queue is destroyed after the final unref. * - * Returns: a new #GAsyncQueue. Free with g_async_queue_unref() + * Returns: (transfer full): a new #GAsyncQueue. Free with g_async_queue_unref() * * Since: 2.16 */ @@ -158,7 +108,7 @@ g_async_queue_new_full (GDestroyNotify item_free_func) * Increases the reference count of the asynchronous @queue by 1. * You do not need to hold the lock to call this function. * - * Returns: the @queue that was passed in (since 2.6) + * Returns: (transfer full): the @queue that was passed in (since 2.6) */ GAsyncQueue * g_async_queue_ref (GAsyncQueue *queue) @@ -212,7 +162,7 @@ g_async_queue_unref_and_unlock (GAsyncQueue *queue) /** * g_async_queue_unref: - * @queue: a #GAsyncQueue. + * @queue: (transfer full): a #GAsyncQueue. * * Decreases the reference count of the asynchronous @queue by 1. * @@ -326,7 +276,7 @@ g_async_queue_push_unlocked (GAsyncQueue *queue, * g_async_queue_push_sorted: * @queue: a #GAsyncQueue * @data: (not nullable): the @data to push into the @queue - * @func: the #GCompareDataFunc is used to sort @queue + * @func: (scope call): the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func. * * Inserts @data into @queue using @func to determine the new @@ -367,7 +317,7 @@ g_async_queue_invert_compare (gpointer v1, * g_async_queue_push_sorted_unlocked: * @queue: a #GAsyncQueue * @data: the data to push into the @queue - * @func: the #GCompareDataFunc is used to sort @queue + * @func: (scope call): the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func. * * Inserts @data into @queue using @func to determine the new @@ -722,7 +672,7 @@ g_async_queue_length_unlocked (GAsyncQueue *queue) /** * g_async_queue_sort: * @queue: a #GAsyncQueue - * @func: the #GCompareDataFunc is used to sort @queue + * @func: (scope call): the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func * * Sorts @queue using @func. @@ -766,7 +716,7 @@ g_async_queue_sort (GAsyncQueue *queue, /** * g_async_queue_sort_unlocked: * @queue: a #GAsyncQueue - * @func: the #GCompareDataFunc is used to sort @queue + * @func: (scope call): the #GCompareDataFunc is used to sort @queue * @user_data: user data passed to @func * * Sorts @queue using @func. diff --git a/glib/gatomic.c b/glib/gatomic.c index 6c1ea76..2d3755e 100644 --- a/glib/gatomic.c +++ b/glib/gatomic.c @@ -23,49 +23,6 @@ #include "gatomic.h" -/** - * SECTION:atomic_operations - * @title: Atomic Operations - * @short_description: basic atomic integer and pointer operations - * @see_also: #GMutex - * - * The following is a collection of compiler macros to provide atomic - * access to integer and pointer-sized values. - * - * The macros that have 'int' in the name will operate on pointers to - * #gint and #guint. The macros with 'pointer' in the name will operate - * on pointers to any pointer-sized value, including #gsize. There is - * no support for 64bit operations on platforms with 32bit pointers - * because it is not generally possible to perform these operations - * atomically. - * - * The get, set and exchange operations for integers and pointers - * nominally operate on #gint and #gpointer, respectively. Of the - * arithmetic operations, the 'add' operation operates on (and returns) - * signed integer values (#gint and #gssize) and the 'and', 'or', and - * 'xor' operations operate on (and return) unsigned integer values - * (#guint and #gsize). - * - * All of the operations act as a full compiler and (where appropriate) - * hardware memory barrier. Acquire and release or producer and - * consumer barrier semantics are not available through this API. - * - * It is very important that all accesses to a particular integer or - * pointer be performed using only this API and that different sizes of - * operation are not mixed or used on overlapping memory regions. Never - * read or assign directly from or to a value -- always use this API. - * - * For simple reference counting purposes you should use - * g_atomic_int_inc() and g_atomic_int_dec_and_test(). Other uses that - * fall outside of simple reference counting patterns are prone to - * subtle bugs and occasionally undefined behaviour. It is also worth - * noting that since all of these operations require global - * synchronisation of the entire machine, they can be quite slow. In - * the case of performing multiple atomic operations it can often be - * faster to simply acquire a mutex lock around the critical area, - * perform the operations normally and then release the lock. - **/ - /** * G_ATOMIC_LOCK_FREE: * @@ -538,11 +495,15 @@ gpointer * While @atomic has a `volatile` qualifier, this is a historical artifact and * the pointer passed to it should not be `volatile`. * + * In GLib 2.80, the return type was changed from #gssize to #gintptr to add + * support for platforms with 128-bit pointers. This should not affect existing + * code. + * * Returns: the value of @atomic before the add, signed * * Since: 2.30 **/ -gssize +gintptr (g_atomic_pointer_add) (volatile void *atomic, gssize val) { @@ -565,11 +526,15 @@ gssize * While @atomic has a `volatile` qualifier, this is a historical artifact and * the pointer passed to it should not be `volatile`. * + * In GLib 2.80, the return type was changed from #gsize to #guintptr to add + * support for platforms with 128-bit pointers. This should not affect existing + * code. + * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ -gsize +guintptr (g_atomic_pointer_and) (volatile void *atomic, gsize val) { @@ -592,11 +557,15 @@ gsize * While @atomic has a `volatile` qualifier, this is a historical artifact and * the pointer passed to it should not be `volatile`. * + * In GLib 2.80, the return type was changed from #gsize to #guintptr to add + * support for platforms with 128-bit pointers. This should not affect existing + * code. + * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ -gsize +guintptr (g_atomic_pointer_or) (volatile void *atomic, gsize val) { @@ -619,11 +588,15 @@ gsize * While @atomic has a `volatile` qualifier, this is a historical artifact and * the pointer passed to it should not be `volatile`. * + * In GLib 2.80, the return type was changed from #gsize to #guintptr to add + * support for platforms with 128-bit pointers. This should not affect existing + * code. + * * Returns: the value of @atomic before the operation, unsigned * * Since: 2.30 **/ -gsize +guintptr (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { @@ -820,7 +793,7 @@ gpointer return InterlockedExchangePointer (atomic, newval); } -gssize +gintptr (g_atomic_pointer_add) (volatile void *atomic, gssize val) { @@ -831,7 +804,7 @@ gssize #endif } -gsize +guintptr (g_atomic_pointer_and) (volatile void *atomic, gsize val) { @@ -842,7 +815,7 @@ gsize #endif } -gsize +guintptr (g_atomic_pointer_or) (volatile void *atomic, gsize val) { @@ -853,7 +826,7 @@ gsize #endif } -gsize +guintptr (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { @@ -1112,12 +1085,12 @@ gpointer return oldval; } -gssize +gintptr (g_atomic_pointer_add) (volatile void *atomic, gssize val) { - gssize *ptr = atomic; - gssize oldval; + gintptr *ptr = atomic; + gintptr oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; @@ -1127,12 +1100,12 @@ gssize return oldval; } -gsize +guintptr (g_atomic_pointer_and) (volatile void *atomic, gsize val) { - gsize *ptr = atomic; - gsize oldval; + guintptr *ptr = atomic; + guintptr oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; @@ -1142,12 +1115,12 @@ gsize return oldval; } -gsize +guintptr (g_atomic_pointer_or) (volatile void *atomic, gsize val) { - gsize *ptr = atomic; - gsize oldval; + guintptr *ptr = atomic; + guintptr oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; @@ -1157,12 +1130,12 @@ gsize return oldval; } -gsize +guintptr (g_atomic_pointer_xor) (volatile void *atomic, gsize val) { - gsize *ptr = atomic; - gsize oldval; + guintptr *ptr = atomic; + guintptr oldval; pthread_mutex_lock (&g_atomic_lock); oldval = *ptr; diff --git a/glib/gatomic.h b/glib/gatomic.h index 148424d..9399888 100644 --- a/glib/gatomic.h +++ b/glib/gatomic.h @@ -83,16 +83,16 @@ GLIB_AVAILABLE_IN_2_74 gpointer g_atomic_pointer_exchange (void *atomic, gpointer newval); GLIB_AVAILABLE_IN_ALL -gssize g_atomic_pointer_add (volatile void *atomic, +gintptr g_atomic_pointer_add (volatile void *atomic, gssize val); GLIB_AVAILABLE_IN_2_30 -gsize g_atomic_pointer_and (volatile void *atomic, +guintptr g_atomic_pointer_and (volatile void *atomic, gsize val); GLIB_AVAILABLE_IN_2_30 -gsize g_atomic_pointer_or (volatile void *atomic, +guintptr g_atomic_pointer_or (volatile void *atomic, gsize val); GLIB_AVAILABLE_IN_ALL -gsize g_atomic_pointer_xor (volatile void *atomic, +guintptr g_atomic_pointer_xor (volatile void *atomic, gsize val); GLIB_DEPRECATED_IN_2_30_FOR(g_atomic_int_add) @@ -280,34 +280,34 @@ G_END_DECLS G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gssize) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST); \ + (gintptr) __atomic_fetch_add ((atomic), (val), __ATOMIC_SEQ_CST); \ })) #define g_atomic_pointer_and(atomic, val) \ (G_GNUC_EXTENSION ({ \ - gsize *gapa_atomic = (gsize *) (atomic); \ + guintptr *gapa_atomic = (guintptr *) (atomic); \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ - G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (guintptr)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __atomic_fetch_and (gapa_atomic, (val), __ATOMIC_SEQ_CST); \ + (guintptr) __atomic_fetch_and (gapa_atomic, (val), __ATOMIC_SEQ_CST); \ })) #define g_atomic_pointer_or(atomic, val) \ (G_GNUC_EXTENSION ({ \ - gsize *gapo_atomic = (gsize *) (atomic); \ + guintptr *gapo_atomic = (guintptr *) (atomic); \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ - G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (guintptr)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __atomic_fetch_or (gapo_atomic, (val), __ATOMIC_SEQ_CST); \ + (guintptr) __atomic_fetch_or (gapo_atomic, (val), __ATOMIC_SEQ_CST); \ })) #define g_atomic_pointer_xor(atomic, val) \ (G_GNUC_EXTENSION ({ \ - gsize *gapx_atomic = (gsize *) (atomic); \ + guintptr *gapx_atomic = (guintptr *) (atomic); \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ - G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gsize)); \ + G_STATIC_ASSERT (sizeof *(atomic) == sizeof (guintptr)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __atomic_fetch_xor (gapx_atomic, (val), __ATOMIC_SEQ_CST); \ + (guintptr) __atomic_fetch_xor (gapx_atomic, (val), __ATOMIC_SEQ_CST); \ })) #else /* defined(__ATOMIC_SEQ_CST) */ @@ -374,7 +374,7 @@ G_END_DECLS (void) (0 ? (gpointer) *(atomic) : NULL); \ __sync_synchronize (); \ __asm__ __volatile__ ("" : : : "memory"); \ - *(atomic) = (glib_typeof (*(atomic))) (gsize) (newval); \ + *(atomic) = (glib_typeof (*(atomic))) (guintptr) (newval); \ })) #else /* if !(defined(glib_typeof) */ #define g_atomic_pointer_set(atomic, newval) \ @@ -383,7 +383,7 @@ G_END_DECLS (void) (0 ? (gpointer) *(atomic) : NULL); \ __sync_synchronize (); \ __asm__ __volatile__ ("" : : : "memory"); \ - *(atomic) = (gpointer) (gsize) (newval); \ + *(atomic) = (gpointer) (guintptr) (newval); \ })) #endif /* if defined(glib_typeof) */ @@ -498,28 +498,28 @@ G_END_DECLS G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gssize) __sync_fetch_and_add ((atomic), (val)); \ + (gintptr) __sync_fetch_and_add ((atomic), (val)); \ })) #define g_atomic_pointer_and(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __sync_fetch_and_and ((atomic), (val)); \ + (guintptr) __sync_fetch_and_and ((atomic), (val)); \ })) #define g_atomic_pointer_or(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __sync_fetch_and_or ((atomic), (val)); \ + (guintptr) __sync_fetch_and_or ((atomic), (val)); \ })) #define g_atomic_pointer_xor(atomic, val) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(atomic) == sizeof (gpointer)); \ (void) (0 ? (gpointer) *(atomic) : NULL); \ (void) (0 ? (val) ^ (val) : 1); \ - (gsize) __sync_fetch_and_xor ((atomic), (val)); \ + (guintptr) __sync_fetch_and_xor ((atomic), (val)); \ })) #endif /* !defined(__ATOMIC_SEQ_CST) */ diff --git a/glib/gbase64.c b/glib/gbase64.c index 3c427f8..043593b 100644 --- a/glib/gbase64.c +++ b/glib/gbase64.c @@ -31,30 +31,6 @@ #include "gtestutils.h" #include "glibintl.h" - -/** - * SECTION:base64 - * @title: Base64 Encoding - * @short_description: encodes and decodes data in Base64 format - * - * Base64 is an encoding that allows a sequence of arbitrary bytes to be - * encoded as a sequence of printable ASCII characters. For the definition - * of Base64, see - * [RFC 1421](http://www.ietf.org/rfc/rfc1421.txt) - * or - * [RFC 2045](http://www.ietf.org/rfc/rfc2045.txt). - * Base64 is most commonly used as a MIME transfer encoding - * for email. - * - * GLib supports incremental encoding using g_base64_encode_step() and - * g_base64_encode_close(). Incremental decoding can be done with - * g_base64_decode_step(). To encode or decode data in one go, use - * g_base64_encode() or g_base64_decode(). To avoid memory allocation when - * decoding, you can use g_base64_decode_inplace(). - * - * Support for Base64 encoding has been added in GLib 2.12. - */ - static const char base64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; diff --git a/glib/gbitlock.c b/glib/gbitlock.c index 9c34de8..f96cae4 100644 --- a/glib/gbitlock.c +++ b/glib/gbitlock.c @@ -174,6 +174,12 @@ g_futex_wake (const gint *address) #define CONTENTION_CLASSES 11 static gint g_bit_lock_contended[CONTENTION_CLASSES]; /* (atomic) */ +G_ALWAYS_INLINE static inline guint +bit_lock_contended_class (gpointer address) +{ + return ((gsize) address) % G_N_ELEMENTS (g_bit_lock_contended); +} + #if (defined (i386) || defined (__amd64__)) #if G_GNUC_CHECK_VERSION(4, 5) #define USE_ASM_GOTO 1 @@ -226,7 +232,7 @@ g_bit_lock (volatile gint *address, v = (guint) g_atomic_int_get (address_nonvolatile); if (v & mask) { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); + guint class = bit_lock_contended_class (address_nonvolatile); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (address_nonvolatile, v); @@ -243,7 +249,7 @@ g_bit_lock (volatile gint *address, if (v & mask) /* already locked */ { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); + guint class = bit_lock_contended_class (address_nonvolatile); g_atomic_int_add (&g_bit_lock_contended[class], +1); g_futex_wait (address_nonvolatile, v); @@ -337,7 +343,7 @@ g_bit_unlock (volatile gint *address, #endif { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); + guint class = bit_lock_contended_class (address_nonvolatile); if (g_atomic_int_get (&g_bit_lock_contended[class])) g_futex_wake (address_nonvolatile); @@ -387,6 +393,101 @@ g_futex_int_address (const void *address) return int_address; } +G_ALWAYS_INLINE static inline gpointer +pointer_bit_lock_mask_ptr (gpointer ptr, guint lock_bit, gboolean set, guintptr preserve_mask, gpointer preserve_ptr) +{ + guintptr x_ptr; + guintptr x_preserve_ptr; + guintptr lock_mask; + + x_ptr = (guintptr) ptr; + + if (preserve_mask != 0) + { + x_preserve_ptr = (guintptr) preserve_ptr; + x_ptr = (x_preserve_ptr & preserve_mask) | (x_ptr & ~preserve_mask); + } + + if (lock_bit == G_MAXUINT) + return (gpointer) x_ptr; + + lock_mask = (guintptr) (1u << lock_bit); + if (set) + return (gpointer) (x_ptr | lock_mask); + else + return (gpointer) (x_ptr & ~lock_mask); +} + +/** + * g_pointer_bit_lock_and_get: + * @address: (not nullable): a pointer to a #gpointer-sized value + * @lock_bit: a bit value between 0 and 31 + * @out_ptr: (out) (optional): returns the set pointer atomically. + * This is the value after setting the lock, it thus always has the + * lock bit set, while previously @address had the lockbit unset. + * You may also use g_pointer_bit_lock_mask_ptr() to clear the lock bit. + * + * This is equivalent to g_bit_lock, but working on pointers (or other + * pointer-sized values). + * + * For portability reasons, you may only lock on the bottom 32 bits of + * the pointer. + * + * Since: 2.80 + **/ +void +(g_pointer_bit_lock_and_get) (gpointer address, + guint lock_bit, + guintptr *out_ptr) +{ + guint class = bit_lock_contended_class (address); + guintptr mask; + guintptr v; + + g_return_if_fail (lock_bit < 32); + + mask = 1u << lock_bit; + +#ifdef USE_ASM_GOTO + if (G_LIKELY (!out_ptr)) + { + while (TRUE) + { + __asm__ volatile goto ("lock bts %1, (%0)\n" + "jc %l[contended]" + : /* no output */ + : "r"(address), "r"((gsize) lock_bit) + : "cc", "memory" + : contended); + return; + + contended: + v = (guintptr) g_atomic_pointer_get ((gpointer *) address); + if (v & mask) + { + g_atomic_int_add (&g_bit_lock_contended[class], +1); + g_futex_wait (g_futex_int_address (address), v); + g_atomic_int_add (&g_bit_lock_contended[class], -1); + } + } + } +#endif + +retry: + v = g_atomic_pointer_or ((gpointer *) address, mask); + if (v & mask) + /* already locked */ + { + g_atomic_int_add (&g_bit_lock_contended[class], +1); + g_futex_wait (g_futex_int_address (address), (guint) v); + g_atomic_int_add (&g_bit_lock_contended[class], -1); + goto retry; + } + + if (out_ptr) + *out_ptr = (v | mask); +} + /** * g_pointer_bit_lock: * @address: (not nullable): a pointer to a #gpointer-sized value @@ -405,60 +506,9 @@ g_futex_int_address (const void *address) **/ void (g_pointer_bit_lock) (volatile void *address, - gint lock_bit) + gint lock_bit) { - void *address_nonvolatile = (void *) address; - - g_return_if_fail (lock_bit < 32); - - { -#ifdef USE_ASM_GOTO - retry: - __asm__ volatile goto ("lock bts %1, (%0)\n" - "jc %l[contended]" - : /* no output */ - : "r" (address), "r" ((gsize) lock_bit) - : "cc", "memory" - : contended); - return; - - contended: - { - gsize *pointer_address = address_nonvolatile; - gsize mask = 1u << lock_bit; - gsize v; - - v = (gsize) g_atomic_pointer_get (pointer_address); - if (v & mask) - { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); - - g_atomic_int_add (&g_bit_lock_contended[class], +1); - g_futex_wait (g_futex_int_address (address_nonvolatile), v); - g_atomic_int_add (&g_bit_lock_contended[class], -1); - } - } - goto retry; -#else - gsize *pointer_address = address_nonvolatile; - gsize mask = 1u << lock_bit; - gsize v; - - retry: - v = g_atomic_pointer_or (pointer_address, mask); - if (v & mask) - /* already locked */ - { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); - - g_atomic_int_add (&g_bit_lock_contended[class], +1); - g_futex_wait (g_futex_int_address (address_nonvolatile), (guint) v); - g_atomic_int_add (&g_bit_lock_contended[class], -1); - - goto retry; - } -#endif - } + g_pointer_bit_lock_and_get ((gpointer *) address, (guint) lock_bit, NULL); } /** @@ -499,15 +549,15 @@ gboolean return result; #else void *address_nonvolatile = (void *) address; - gsize *pointer_address = address_nonvolatile; + gpointer *pointer_address = address_nonvolatile; gsize mask = 1u << lock_bit; - gsize v; + guintptr v; g_return_val_if_fail (lock_bit < 32, FALSE); v = g_atomic_pointer_or (pointer_address, mask); - return ~v & mask; + return (~(gsize) v & mask) != 0; #endif } } @@ -543,16 +593,104 @@ void : "r" (address), "r" ((gsize) lock_bit) : "cc", "memory"); #else - gsize *pointer_address = address_nonvolatile; + gpointer *pointer_address = address_nonvolatile; gsize mask = 1u << lock_bit; g_atomic_pointer_and (pointer_address, ~mask); #endif { - guint class = ((gsize) address_nonvolatile) % G_N_ELEMENTS (g_bit_lock_contended); + guint class = bit_lock_contended_class (address_nonvolatile); + if (g_atomic_int_get (&g_bit_lock_contended[class])) g_futex_wake (g_futex_int_address (address_nonvolatile)); } } } + +/** + * g_pointer_bit_lock_mask_ptr: + * @ptr: (nullable): the pointer to mask + * @lock_bit: the bit to set/clear. If set to `G_MAXUINT`, the + * lockbit is taken from @preserve_ptr or @ptr (depending on @preserve_mask). + * @set: whether to set (lock) the bit or unset (unlock). This + * has no effect, if @lock_bit is set to `G_MAXUINT`. + * @preserve_mask: if non-zero, a bit-mask for @preserve_ptr. The + * @preserve_mask bits from @preserve_ptr are set in the result. + * Note that the @lock_bit bit will be always set according to @set, + * regardless of @preserve_mask and @preserve_ptr (unless @lock_bit is + * `G_MAXUINT`). + * @preserve_ptr: (nullable): if @preserve_mask is non-zero, the bits + * from this pointer are set in the result. + * + * This mangles @ptr as g_pointer_bit_lock() and g_pointer_bit_unlock() + * do. + * + * Returns: the mangled pointer. + * + * Since: 2.80 + **/ +gpointer +g_pointer_bit_lock_mask_ptr (gpointer ptr, guint lock_bit, gboolean set, guintptr preserve_mask, gpointer preserve_ptr) +{ + g_return_val_if_fail (lock_bit < 32u || lock_bit == G_MAXUINT, ptr); + + return pointer_bit_lock_mask_ptr (ptr, lock_bit, set, preserve_mask, preserve_ptr); +} + +/** + * g_pointer_bit_unlock_and_set: + * @address: (not nullable): a pointer to a #gpointer-sized value + * @lock_bit: a bit value between 0 and 31 + * @ptr: the new pointer value to set + * @preserve_mask: if non-zero, those bits of the current pointer in @address + * are preserved. + * Note that the @lock_bit bit will be always set according to @set, + * regardless of @preserve_mask and the currently set value in @address. + * + * This is equivalent to g_pointer_bit_unlock() and atomically setting + * the pointer value. + * + * Note that the lock bit will be cleared from the pointer. If the unlocked + * pointer that was set is not identical to @ptr, an assertion fails. In other + * words, @ptr must have @lock_bit unset. This also means, you usually can + * only use this on the lowest bits. + * + * Since: 2.80 + **/ +void (g_pointer_bit_unlock_and_set) (void *address, + guint lock_bit, + gpointer ptr, + guintptr preserve_mask) +{ + gpointer *pointer_address = address; + guint class = bit_lock_contended_class (address); + gpointer ptr2; + + g_return_if_fail (lock_bit < 32u); + + if (preserve_mask != 0) + { + gpointer old_ptr = g_atomic_pointer_get ((gpointer *) address); + + again: + ptr2 = pointer_bit_lock_mask_ptr (ptr, lock_bit, FALSE, preserve_mask, old_ptr); + if (!g_atomic_pointer_compare_and_exchange_full (pointer_address, old_ptr, ptr2, &old_ptr)) + goto again; + } + else + { + ptr2 = pointer_bit_lock_mask_ptr (ptr, lock_bit, FALSE, 0, NULL); + g_atomic_pointer_set (pointer_address, ptr2); + } + + if (g_atomic_int_get (&g_bit_lock_contended[class]) > 0) + g_futex_wake (g_futex_int_address (address)); + + /* It makes no sense, if unlocking mangles the pointer. Assert against + * that. + * + * Note that based on @preserve_mask, the pointer also gets mangled, which + * can make sense for the caller. We don't assert for that. */ + g_return_if_fail (ptr == pointer_bit_lock_mask_ptr (ptr, lock_bit, FALSE, 0, NULL)); +} diff --git a/glib/gbitlock.h b/glib/gbitlock.h index bef2c09..f44a52c 100644 --- a/glib/gbitlock.h +++ b/glib/gbitlock.h @@ -44,6 +44,12 @@ void g_bit_unlock (volatile gint *address, GLIB_AVAILABLE_IN_ALL void g_pointer_bit_lock (volatile void *address, gint lock_bit); + +GLIB_AVAILABLE_IN_2_80 +void g_pointer_bit_lock_and_get (gpointer address, + guint lock_bit, + guintptr *out_ptr); + GLIB_AVAILABLE_IN_ALL gboolean g_pointer_bit_trylock (volatile void *address, gint lock_bit); @@ -51,6 +57,19 @@ GLIB_AVAILABLE_IN_ALL void g_pointer_bit_unlock (volatile void *address, gint lock_bit); +GLIB_AVAILABLE_IN_2_80 +gpointer g_pointer_bit_lock_mask_ptr (gpointer ptr, + guint lock_bit, + gboolean set, + guintptr preserve_mask, + gpointer preserve_ptr); + +GLIB_AVAILABLE_IN_2_80 +void g_pointer_bit_unlock_and_set (void *address, + guint lock_bit, + gpointer ptr, + guintptr preserve_mask); + #ifdef __GNUC__ #define g_pointer_bit_lock(address, lock_bit) \ @@ -59,6 +78,12 @@ void g_pointer_bit_unlock (volatile void *address, g_pointer_bit_lock ((address), (lock_bit)); \ })) +#define g_pointer_bit_lock_and_get(address, lock_bit, out_ptr) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ + g_pointer_bit_lock_and_get ((address), (lock_bit), (out_ptr)); \ + })) + #define g_pointer_bit_trylock(address, lock_bit) \ (G_GNUC_EXTENSION ({ \ G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ @@ -71,6 +96,12 @@ void g_pointer_bit_unlock (volatile void *address, g_pointer_bit_unlock ((address), (lock_bit)); \ })) +#define g_pointer_bit_unlock_and_set(address, lock_bit, ptr, preserve_mask) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(address) == sizeof (gpointer)); \ + g_pointer_bit_unlock_and_set ((address), (lock_bit), (ptr), (preserve_mask)); \ + })) + #endif G_END_DECLS diff --git a/glib/gbookmarkfile.c b/glib/gbookmarkfile.c index 80e835b..043d0fa 100644 --- a/glib/gbookmarkfile.c +++ b/glib/gbookmarkfile.c @@ -52,51 +52,6 @@ #include "gutils.h" -/** - * SECTION:gbookmarkfile - * @title: Bookmark file parser - * @short_description: parses files containing bookmarks - * - * GBookmarkFile lets you parse, edit or create files containing bookmarks - * to URI, along with some meta-data about the resource pointed by the URI - * like its MIME type, the application that is registering the bookmark and - * the icon that should be used to represent the bookmark. The data is stored - * using the - * [Desktop Bookmark Specification](http://www.gnome.org/~ebassi/bookmark-spec). - * - * The syntax of the bookmark files is described in detail inside the - * Desktop Bookmark Specification, here is a quick summary: bookmark - * files use a sub-class of the XML Bookmark Exchange Language - * specification, consisting of valid UTF-8 encoded XML, under the - * root element; each bookmark is stored inside a - * element, using its URI: no relative paths can - * be used inside a bookmark file. The bookmark may have a user defined - * title and description, to be used instead of the URI. Under the - * element, with its owner attribute set to - * `http://freedesktop.org`, is stored the meta-data about a resource - * pointed by its URI. The meta-data consists of the resource's MIME - * type; the applications that have registered a bookmark; the groups - * to which a bookmark belongs to; a visibility flag, used to set the - * bookmark as "private" to the applications and groups that has it - * registered; the URI and MIME type of an icon, to be used when - * displaying the bookmark inside a GUI. - * - * Here is an example of a bookmark file: - * [bookmarks.xbel](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/bookmarks.xbel) - * - * A bookmark file might contain more than one bookmark; each bookmark - * is accessed through its URI. - * - * The important caveat of bookmark files is that when you add a new - * bookmark you must also add the application that is registering it, using - * g_bookmark_file_add_application() or g_bookmark_file_set_application_info(). - * If a bookmark has no applications then it won't be dumped when creating - * the on disk representation, using g_bookmark_file_to_data() or - * g_bookmark_file_to_file(). - * - * The #GBookmarkFile parser was added in GLib 2.12. - */ - /* XBEL 1.0 standard entities */ #define XBEL_VERSION "1.0" #define XBEL_DTD_NICK "xbel" diff --git a/glib/gbookmarkfile.h b/glib/gbookmarkfile.h index f753420..dbf45a0 100644 --- a/glib/gbookmarkfile.h +++ b/glib/gbookmarkfile.h @@ -75,7 +75,45 @@ GQuark g_bookmark_file_error_quark (void); /** * GBookmarkFile: * - * An opaque data structure representing a set of bookmarks. + * `GBookmarkFile` lets you parse, edit or create files containing bookmarks. + * + * Bookmarks refer to a URI, along with some meta-data about the resource + * pointed by the URI like its MIME type, the application that is registering + * the bookmark and the icon that should be used to represent the bookmark. + * The data is stored using the + * [Desktop Bookmark Specification](http://www.gnome.org/~ebassi/bookmark-spec). + * + * The syntax of the bookmark files is described in detail inside the + * Desktop Bookmark Specification, here is a quick summary: bookmark + * files use a sub-class of the XML Bookmark Exchange Language + * specification, consisting of valid UTF-8 encoded XML, under the + * `` root element; each bookmark is stored inside a + * `` element, using its URI: no relative paths can + * be used inside a bookmark file. The bookmark may have a user defined + * title and description, to be used instead of the URI. Under the + * `` element, with its owner attribute set to + * `http://freedesktop.org`, is stored the meta-data about a resource + * pointed by its URI. The meta-data consists of the resource's MIME + * type; the applications that have registered a bookmark; the groups + * to which a bookmark belongs to; a visibility flag, used to set the + * bookmark as "private" to the applications and groups that has it + * registered; the URI and MIME type of an icon, to be used when + * displaying the bookmark inside a GUI. + * + * Here is an example of a bookmark file: + * [bookmarks.xbel](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/bookmarks.xbel) + * + * A bookmark file might contain more than one bookmark; each bookmark + * is accessed through its URI. + * + * The important caveat of bookmark files is that when you add a new + * bookmark you must also add the application that is registering it, using + * [method@GLib.BookmarkFile.add_application] or [method@GLib.BookmarkFile.set_application_info]. + * If a bookmark has no applications then it won't be dumped when creating + * the on disk representation, using [method@GLib.BookmarkFile.to_data] or + * [method@GLib.BookmarkFile.to_file]. + * + * Since: 2.12 */ typedef struct _GBookmarkFile GBookmarkFile; diff --git a/glib/gcharset.c b/glib/gcharset.c index 82cd0a7..040b499 100644 --- a/glib/gcharset.c +++ b/glib/gcharset.c @@ -500,11 +500,11 @@ unalias_lang (char *lang) char *p; int i; - if (g_once_init_enter (&alias_table)) + if (g_once_init_enter_pointer (&alias_table)) { GHashTable *table = g_hash_table_new (g_str_hash, g_str_equal); read_aliases ("/usr/share/locale/locale.alias", table); - g_once_init_leave (&alias_table, table); + g_once_init_leave_pointer (&alias_table, table); } i = 0; diff --git a/glib/gchecksum.c b/glib/gchecksum.c index fea7803..28de99d 100644 --- a/glib/gchecksum.c +++ b/glib/gchecksum.c @@ -33,25 +33,26 @@ /** - * SECTION:checksum - * @title: Data Checksums - * @short_description: computes the checksum for data + * GChecksum: * - * GLib provides a generic API for computing checksums (or "digests") + * GLib provides a generic API for computing checksums (or ‘digests’) * for a sequence of arbitrary bytes, using various hashing algorithms * like MD5, SHA-1 and SHA-256. Checksums are commonly used in various * environments and specifications. * - * GLib supports incremental checksums using the GChecksum data - * structure, by calling g_checksum_update() as long as there's data - * available and then using g_checksum_get_string() or - * g_checksum_get_digest() to compute the checksum and return it either - * as a string in hexadecimal form, or as a raw sequence of bytes. To - * compute the checksum for binary blobs and NUL-terminated strings in - * one go, use the convenience functions g_compute_checksum_for_data() - * and g_compute_checksum_for_string(), respectively. + * To create a new `GChecksum`, use [ctor@GLib.Checksum.new]. To free + * a `GChecksum`, use [method@GLib.Checksum.free]. * - * Support for checksums has been added in GLib 2.16 + * GLib supports incremental checksums using the `GChecksum` data + * structure, by calling [method@GLib.Checksum.update] as long as there’s data + * available and then using [method@GLib.Checksum.get_string] or + * [method@GLib.Checksum.get_digest] to compute the checksum and return it + * either as a string in hexadecimal form, or as a raw sequence of bytes. To + * compute the checksum for binary blobs and nul-terminated strings in + * one go, use the convenience functions [func@GLib.compute_checksum_for_data] + * and [func@GLib.compute_checksum_for_string], respectively. + * + * Since: 2.16 **/ #define IS_VALID_TYPE(type) ((type) >= G_CHECKSUM_MD5 && (type) <= G_CHECKSUM_SHA384) diff --git a/glib/gchecksum.h b/glib/gchecksum.h index e5c54e7..3dd84fd 100644 --- a/glib/gchecksum.h +++ b/glib/gchecksum.h @@ -54,16 +54,6 @@ typedef enum { G_CHECKSUM_SHA384 } GChecksumType; -/** - * GChecksum: - * - * An opaque structure representing a checksumming operation. - * - * To create a new GChecksum, use g_checksum_new(). To free - * a GChecksum, use g_checksum_free(). - * - * Since: 2.16 - */ typedef struct _GChecksum GChecksum; GLIB_AVAILABLE_IN_ALL diff --git a/glib/gconstructor.h b/glib/gconstructor.h index 9d2554c..ce42492 100644 --- a/glib/gconstructor.h +++ b/glib/gconstructor.h @@ -54,8 +54,7 @@ #define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void); #define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void); -#elif defined (_MSC_VER) && (_MSC_VER >= 1500) -/* Visual studio 2008 and later has _Pragma */ +#elif defined (_MSC_VER) /* * Only try to include gslist.h if not already included via glib.h, @@ -110,28 +109,6 @@ __pragma(section(".CRT$XCU",read)) \ __declspec(allocate(".CRT$XCU")) int (* _array ## _func)(void) = _func ## _constructor; -#elif defined (_MSC_VER) - -#define G_HAS_CONSTRUCTORS 1 - -/* Pre Visual studio 2008 must use #pragma section */ -#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1 -#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1 - -#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \ - section(".CRT$XCU",read) -#define G_DEFINE_CONSTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _wrapper(void) { _func(); return 0; } \ - __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper; - -#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \ - section(".CRT$XCU",read) -#define G_DEFINE_DESTRUCTOR(_func) \ - static void _func(void); \ - static int _func ## _constructor(void) { atexit (_func); return 0; } \ - __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor; - #elif defined(__SUNPRO_C) /* This is not tested, but i believe it should work, based on: diff --git a/glib/gconstructorprivate.h b/glib/gconstructorprivate.h new file mode 100644 index 0000000..1c8e64c --- /dev/null +++ b/glib/gconstructorprivate.h @@ -0,0 +1,69 @@ +/* + * Copyright © 2023 Luca Bacci + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include "gconstructor.h" + +#ifdef _WIN32 +#include +#endif + +#ifdef _WIN32 + +#ifdef __cplusplus +/* const defaults to static (internal visibility) in C++, + * but we want extern instead */ +#define G_EXTERN_CONST extern const +#else +/* Using extern const in C is perfectly valid, but triggers + * a warning in GCC and CLANG, therefore we avoid it */ +#define G_EXTERN_CONST const +#endif + +#ifdef _MSC_VER + +#define G_HAS_TLS_CALLBACKS 1 + +#define G_DEFINE_TLS_CALLBACK(func) \ +__pragma (section (".CRT$XLCE", long, read)) \ + \ +static void NTAPI func (PVOID, DWORD, PVOID); \ + \ +G_BEGIN_DECLS \ +__declspec (allocate (".CRT$XLCE")) \ +G_EXTERN_CONST PIMAGE_TLS_CALLBACK _ptr_##func = func; \ +G_END_DECLS \ + \ +__pragma (comment (linker, "/INCLUDE:" G_MSVC_SYMBOL_PREFIX "_tls_used")) \ +__pragma (comment (linker, "/INCLUDE:" G_MSVC_SYMBOL_PREFIX "_ptr_" #func)) + +#else + +#define G_HAS_TLS_CALLBACKS 1 + +#define G_DEFINE_TLS_CALLBACK(func) \ +static void NTAPI func (PVOID, DWORD, PVOID); \ + \ +G_BEGIN_DECLS \ +__attribute__ ((section (".CRT$XLCE"))) \ +G_EXTERN_CONST PIMAGE_TLS_CALLBACK _ptr_##func = func; \ +G_END_DECLS + +#endif /* _MSC_VER */ + +#endif /* _WIN32 */ diff --git a/glib/gconvert.c b/glib/gconvert.c index 69bcc2f..e7c222f 100644 --- a/glib/gconvert.c +++ b/glib/gconvert.c @@ -56,105 +56,6 @@ #include "glibintl.h" -/** - * SECTION:conversions - * @title: Character Set Conversion - * @short_description: convert strings between different character sets - * - * The g_convert() family of function wraps the functionality of iconv(). - * In addition to pure character set conversions, GLib has functions to - * deal with the extra complications of encodings for file names. - * - * ## File Name Encodings - * - * Historically, UNIX has not had a defined encoding for file names: - * a file name is valid as long as it does not have path separators - * in it ("/"). However, displaying file names may require conversion: - * from the character set in which they were created, to the character - * set in which the application operates. Consider the Spanish file name - * "Presentación.sxi". If the application which created it uses - * ISO-8859-1 for its encoding, - * |[ - * Character: P r e s e n t a c i ó n . s x i - * Hex code: 50 72 65 73 65 6e 74 61 63 69 f3 6e 2e 73 78 69 - * ]| - * However, if the application use UTF-8, the actual file name on - * disk would look like this: - * |[ - * Character: P r e s e n t a c i ó n . s x i - * Hex code: 50 72 65 73 65 6e 74 61 63 69 c3 b3 6e 2e 73 78 69 - * ]| - * GLib uses UTF-8 for its strings, and GUI toolkits like GTK that use - * GLib do the same thing. If you get a file name from the file system, - * for example, from readdir() or from g_dir_read_name(), and you wish - * to display the file name to the user, you will need to convert it - * into UTF-8. The opposite case is when the user types the name of a - * file they wish to save: the toolkit will give you that string in - * UTF-8 encoding, and you will need to convert it to the character - * set used for file names before you can create the file with open() - * or fopen(). - * - * By default, GLib assumes that file names on disk are in UTF-8 - * encoding. This is a valid assumption for file systems which - * were created relatively recently: most applications use UTF-8 - * encoding for their strings, and that is also what they use for - * the file names they create. However, older file systems may - * still contain file names created in "older" encodings, such as - * ISO-8859-1. In this case, for compatibility reasons, you may want - * to instruct GLib to use that particular encoding for file names - * rather than UTF-8. You can do this by specifying the encoding for - * file names in the [`G_FILENAME_ENCODING`][G_FILENAME_ENCODING] - * environment variable. For example, if your installation uses - * ISO-8859-1 for file names, you can put this in your `~/.profile`: - * |[ - * export G_FILENAME_ENCODING=ISO-8859-1 - * ]| - * GLib provides the functions g_filename_to_utf8() and - * g_filename_from_utf8() to perform the necessary conversions. - * These functions convert file names from the encoding specified - * in `G_FILENAME_ENCODING` to UTF-8 and vice-versa. This - * [diagram][file-name-encodings-diagram] illustrates how - * these functions are used to convert between UTF-8 and the - * encoding for file names in the file system. - * - * ## Conversion between file name encodings # {#file-name-encodings-diagram) - * - * ![](file-name-encodings.png) - * - * ## Checklist for Application Writers - * - * This section is a practical summary of the detailed - * things to do to make sure your applications process file - * name encodings correctly. - * - * 1. If you get a file name from the file system from a function - * such as readdir() or gtk_file_chooser_get_filename(), you do - * not need to do any conversion to pass that file name to - * functions like open(), rename(), or fopen() -- those are "raw" - * file names which the file system understands. - * - * 2. If you need to display a file name, convert it to UTF-8 first - * by using g_filename_to_utf8(). If conversion fails, display a - * string like "Unknown file name". Do not convert this string back - * into the encoding used for file names if you wish to pass it to - * the file system; use the original file name instead. - * - * For example, the document window of a word processor could display - * "Unknown file name" in its title bar but still let the user save - * the file, as it would keep the raw file name internally. This - * can happen if the user has not set the `G_FILENAME_ENCODING` - * environment variable even though they have files whose names are - * not encoded in UTF-8. - * - * 3. If your user interface lets the user type a file name for saving - * or renaming, convert it to the encoding used for file names in - * the file system by using g_filename_from_utf8(). Pass the converted - * file name to functions like fopen(). If conversion fails, ask the - * user to enter a different file name. This can happen if the user - * types Japanese characters when `G_FILENAME_ENCODING` is set to - * `ISO-8859-1`, for example. - */ - /* We try to terminate strings in unknown charsets with this many zero bytes * to ensure that multibyte strings really are nul-terminated when we return * them from g_convert() and friends. @@ -172,8 +73,17 @@ try_conversion (const char *to_codeset, if (*cd == (iconv_t)-1 && errno == EINVAL) return FALSE; - else - return TRUE; + +#if defined(__FreeBSD__) && defined(ICONV_SET_ILSEQ_INVALID) + /* On FreeBSD request GNU iconv compatible handling of characters that cannot + * be repesented in the destination character set. + * See https://cgit.freebsd.org/src/commit/?id=7c5b23111c5fd1992047922d4247c4a1ce1bb6c3 + */ + int value = 1; + if (iconvctl (*cd, ICONV_SET_ILSEQ_INVALID, &value) != 0) + return FALSE; +#endif + return TRUE; } static gboolean diff --git a/glib/gdataset.c b/glib/gdataset.c index 452c487..992e173 100644 --- a/glib/gdataset.c +++ b/glib/gdataset.c @@ -40,6 +40,7 @@ #include "gslice.h" #include "gdatasetprivate.h" +#include "gutilsprivate.h" #include "ghash.h" #include "gquark.h" #include "gstrfuncs.h" @@ -48,85 +49,12 @@ #include "glib_trace.h" #include "galloca.h" -/** - * SECTION:datasets - * @title: Datasets - * @short_description: associate groups of data elements with - * particular memory locations - * - * Datasets associate groups of data elements with particular memory - * locations. These are useful if you need to associate data with a - * structure returned from an external library. Since you cannot modify - * the structure, you use its location in memory as the key into a - * dataset, where you can associate any number of data elements with it. - * - * There are two forms of most of the dataset functions. The first form - * uses strings to identify the data elements associated with a - * location. The second form uses #GQuark identifiers, which are - * created with a call to g_quark_from_string() or - * g_quark_from_static_string(). The second form is quicker, since it - * does not require looking up the string in the hash table of #GQuark - * identifiers. - * - * There is no function to create a dataset. It is automatically - * created as soon as you add elements to it. - * - * To add data elements to a dataset use g_dataset_id_set_data(), - * g_dataset_id_set_data_full(), g_dataset_set_data() and - * g_dataset_set_data_full(). - * - * To get data elements from a dataset use g_dataset_id_get_data() and - * g_dataset_get_data(). - * - * To iterate over all data elements in a dataset use - * g_dataset_foreach() (not thread-safe). - * - * To remove data elements from a dataset use - * g_dataset_id_remove_data() and g_dataset_remove_data(). - * - * To destroy a dataset, use g_dataset_destroy(). - **/ - -/** - * SECTION:datalist - * @title: Keyed Data Lists - * @short_description: lists of data elements which are accessible by a - * string or GQuark identifier - * - * Keyed data lists provide lists of arbitrary data elements which can - * be accessed either with a string or with a #GQuark corresponding to - * the string. - * - * The #GQuark methods are quicker, since the strings have to be - * converted to #GQuarks anyway. - * - * Data lists are used for associating arbitrary data with #GObjects, - * using g_object_set_data() and related functions. - * - * To create a datalist, use g_datalist_init(). - * - * To add data elements to a datalist use g_datalist_id_set_data(), - * g_datalist_id_set_data_full(), g_datalist_set_data() and - * g_datalist_set_data_full(). - * - * To get data elements from a datalist use g_datalist_id_get_data() - * and g_datalist_get_data(). - * - * To iterate over all data elements in a datalist use - * g_datalist_foreach() (not thread-safe). - * - * To remove data elements from a datalist use - * g_datalist_id_remove_data() and g_datalist_remove_data(). - * - * To remove all data elements from a datalist, use g_datalist_clear(). - **/ - /** * GData: * * An opaque data structure that represents a keyed data list. * - * See also: [Keyed data lists][glib-Keyed-Data-Lists]. + * See also: [Keyed data lists](datalist-and-dataset.html). **/ /** @@ -140,15 +68,18 @@ #define G_DATALIST_FLAGS_MASK_INTERNAL 0x7 +#define G_DATALIST_CLEAN_POINTER(ptr) \ + ((GData *) ((gpointer) (((guintptr) (ptr)) & ~((guintptr) G_DATALIST_FLAGS_MASK_INTERNAL)))) + /* datalist pointer accesses have to be carried out atomically */ -#define G_DATALIST_GET_POINTER(datalist) \ - ((GData*) ((gsize) g_atomic_pointer_get (datalist) & ~(gsize) G_DATALIST_FLAGS_MASK_INTERNAL)) +#define G_DATALIST_GET_POINTER(datalist) \ + G_DATALIST_CLEAN_POINTER (g_atomic_pointer_get (datalist)) #define G_DATALIST_SET_POINTER(datalist, pointer) G_STMT_START { \ gpointer _oldv = g_atomic_pointer_get (datalist); \ gpointer _newv; \ do { \ - _newv = (gpointer) (((gsize) _oldv & G_DATALIST_FLAGS_MASK_INTERNAL) | (gsize) pointer); \ + _newv = (gpointer) (((guintptr) _oldv & ((guintptr) G_DATALIST_FLAGS_MASK_INTERNAL)) | (guintptr) pointer); \ } while (!g_atomic_pointer_compare_and_exchange_full ((void**) datalist, _oldv, \ _newv, &_oldv)); \ } G_STMT_END @@ -177,7 +108,6 @@ struct _GDataset /* --- prototypes --- */ static inline GDataset* g_dataset_lookup (gconstpointer dataset_location); -static inline void g_datalist_clear_i (GData **datalist); static void g_dataset_destroy_internal (GDataset *dataset); static inline gpointer g_data_set_internal (GData **datalist, GQuark key_id, @@ -207,10 +137,13 @@ static GDataset *g_dataset_cached = NULL; /* should this be #define DATALIST_LOCK_BIT 2 -static void -g_datalist_lock (GData **datalist) +G_ALWAYS_INLINE static inline GData * +g_datalist_lock_and_get (GData **datalist) { - g_pointer_bit_lock ((void **)datalist, DATALIST_LOCK_BIT); + guintptr ptr; + + g_pointer_bit_lock_and_get ((void **) datalist, DATALIST_LOCK_BIT, &ptr); + return G_DATALIST_CLEAN_POINTER (ptr); } static void @@ -219,31 +152,150 @@ g_datalist_unlock (GData **datalist) g_pointer_bit_unlock ((void **)datalist, DATALIST_LOCK_BIT); } -/* Called with the datalist lock held, or the dataset global - * lock for dataset lists - */ static void -g_datalist_clear_i (GData **datalist) +g_datalist_unlock_and_set (GData **datalist, gpointer ptr) { - GData *data; - guint i; + g_pointer_bit_unlock_and_set ((void **) datalist, DATALIST_LOCK_BIT, ptr, G_DATALIST_FLAGS_MASK_INTERNAL); +} - data = G_DATALIST_GET_POINTER (datalist); - G_DATALIST_SET_POINTER (datalist, NULL); +static gboolean +datalist_append (GData **data, GQuark key_id, gpointer new_data, GDestroyNotify destroy_func) +{ + gboolean reallocated; + GData *d; + + d = *data; + if (!d) + { + d = g_malloc (G_STRUCT_OFFSET (GData, data) + 2u * sizeof (GDataElt)); + d->len = 0; + d->alloc = 2u; + *data = d; + reallocated = TRUE; + } + else if (d->len == d->alloc) + { + d->alloc = d->alloc * 2u; +#if G_ENABLE_DEBUG + /* d->alloc is always a power of two. It thus overflows the first time + * when going to (G_MAXUINT32+1), or when requesting 2^31+1 elements. + * + * This is not handled, and we just crash. That's because we track the GData + * in a linear list, which horribly degrades long before we add 2 billion entries. + * Don't ever try to do that. */ + g_assert (d->alloc > d->len); +#endif + d = g_realloc (d, G_STRUCT_OFFSET (GData, data) + d->alloc * sizeof (GDataElt)); + *data = d; + reallocated = TRUE; + } + else + reallocated = FALSE; + + d->data[d->len] = (GDataElt){ + .key = key_id, + .data = new_data, + .destroy = destroy_func, + }; + d->len++; + + return reallocated; +} + +static void +datalist_remove (GData *data, guint32 idx) +{ +#if G_ENABLE_DEBUG + g_assert (idx < data->len); +#endif + + /* g_data_remove_internal() relies on the fact, that this function removes + * the entry similar to g_array_remove_index_fast(). That is, the entries up + * to @idx are left unchanged, and the last entry is moved to position @idx. + * */ + + data->len--; + + if (idx != data->len) + data->data[idx] = data->data[data->len]; +} + +static gboolean +datalist_shrink (GData **data, GData **d_to_free) +{ + guint32 alloc_by_4; + guint32 v; + GData *d; + + d = *data; + + alloc_by_4 = d->alloc / 4u; + + if (G_LIKELY (d->len > alloc_by_4)) + { + /* No shrinking */ + return FALSE; + } + + if (d->len == 0) + { + /* The list became empty. We drop the allocated memory altogether. */ + + /* The caller will free the buffer after releasing the lock, to minimize + * the time we hold the lock. Transfer it out. */ + *d_to_free = d; + *data = NULL; + return TRUE; + } + + /* If the buffer is filled not more than 25%. Shrink to double the current length. */ + + v = d->len; + if (v != alloc_by_4) + { + /* d->alloc is a power of two. Usually, we remove one element at a + * time, then we will just reach reach a quarter of that. + * + * However, with g_datalist_id_remove_multiple(), len can be smaller + * at once. In that case, find first the next power of two. */ + v = g_nearest_pow (v); + } + v *= 2u; + +#if G_ENABLE_DEBUG + g_assert (v > d->len); + g_assert (v <= d->alloc / 2u); +#endif + + d->alloc = v; + d = g_realloc (d, G_STRUCT_OFFSET (GData, data) + (v * sizeof (GDataElt))); + *d_to_free = NULL; + *data = d; + return TRUE; +} + +static GDataElt * +datalist_find (GData *data, GQuark key_id, guint32 *out_idx) +{ + guint32 i; if (data) { - G_UNLOCK (g_dataset_global); for (i = 0; i < data->len; i++) { - if (data->data[i].data && data->data[i].destroy) - data->data[i].destroy (data->data[i].data); + GDataElt *data_elt = &data->data[i]; + + if (data_elt->key == key_id) + { + if (out_idx) + *out_idx = i; + return data_elt; + } } - G_LOCK (g_dataset_global); - - g_free (data); } - + if (out_idx) + *out_idx = G_MAXUINT32; + return NULL; } /** @@ -262,23 +314,23 @@ g_datalist_clear (GData **datalist) g_return_if_fail (datalist != NULL); - g_datalist_lock (datalist); + data = g_datalist_lock_and_get (datalist); - data = G_DATALIST_GET_POINTER (datalist); - G_DATALIST_SET_POINTER (datalist, NULL); - - g_datalist_unlock (datalist); - - if (data) + if (!data) { - for (i = 0; i < data->len; i++) - { - if (data->data[i].data && data->data[i].destroy) - data->data[i].destroy (data->data[i].data); - } - - g_free (data); + g_datalist_unlock (datalist); + return; } + + g_datalist_unlock_and_set (datalist, NULL); + + for (i = 0; i < data->len; i++) + { + if (data->data[i].data && data->data[i].destroy) + data->data[i].destroy (data->data[i].data); + } + + g_free (data); } /* HOLDS: g_dataset_global_lock */ @@ -306,7 +358,12 @@ g_dataset_destroy_internal (GDataset *dataset) dataset_location = dataset->location; while (dataset) { - if (G_DATALIST_GET_POINTER(&dataset->datalist) == NULL) + GData *data; + guint i; + + data = G_DATALIST_GET_POINTER (&dataset->datalist); + + if (!data) { if (dataset == g_dataset_cached) g_dataset_cached = NULL; @@ -314,8 +371,19 @@ g_dataset_destroy_internal (GDataset *dataset) g_slice_free (GDataset, dataset); break; } - - g_datalist_clear_i (&dataset->datalist); + + G_DATALIST_SET_POINTER (&dataset->datalist, NULL); + + G_UNLOCK (g_dataset_global); + + for (i = 0; i < data->len; i++) + { + if (data->data[i].data && data->data[i].destroy) + data->data[i].destroy (data->data[i].data); + } + g_free (data); + + G_LOCK (g_dataset_global); dataset = g_dataset_lookup (dataset_location); } } @@ -352,138 +420,100 @@ g_data_set_internal (GData **datalist, GDestroyNotify new_destroy_func, GDataset *dataset) { - GData *d, *old_d; - GDataElt old, *data, *data_last, *data_end; + GData *d; + GData *new_d = NULL; + GDataElt old, *data; + guint32 idx; - g_datalist_lock (datalist); + d = g_datalist_lock_and_get (datalist); - d = G_DATALIST_GET_POINTER (datalist); + data = datalist_find (d, key_id, &idx); if (new_data == NULL) /* remove */ { - if (d) - { - data = d->data; - data_last = data + d->len - 1; - while (data <= data_last) - { - if (data->key == key_id) - { - old = *data; - if (data != data_last) - *data = *data_last; - d->len--; + if (data) + { + GData *d_to_free; - /* We don't bother to shrink, but if all data are now gone - * we at least free the memory - */ - if (d->len == 0) - { - G_DATALIST_SET_POINTER (datalist, NULL); - g_free (d); - /* datalist may be situated in dataset, so must not be - * unlocked after we free it - */ - g_datalist_unlock (datalist); + old = *data; - /* the dataset destruction *must* be done - * prior to invocation of the data destroy function - */ - if (dataset) - g_dataset_destroy_internal (dataset); - } - else - { - g_datalist_unlock (datalist); - } + datalist_remove (d, idx); + if (datalist_shrink (&d, &d_to_free)) + { + g_datalist_unlock_and_set (datalist, d); - /* We found and removed an old value - * the GData struct *must* already be unlinked - * when invoking the destroy function. - * we use (new_data==NULL && new_destroy_func!=NULL) as - * a special hint combination to "steal" - * data without destroy notification - */ - if (old.destroy && !new_destroy_func) - { - if (dataset) - G_UNLOCK (g_dataset_global); - old.destroy (old.data); - if (dataset) - G_LOCK (g_dataset_global); - old.data = NULL; - } + /* the dataset destruction *must* be done + * prior to invocation of the data destroy function + */ + if (dataset && !d) + g_dataset_destroy_internal (dataset); - return old.data; - } - data++; - } - } + if (d_to_free) + g_free (d_to_free); + } + else + g_datalist_unlock (datalist); + + /* We found and removed an old value + * the GData struct *must* already be unlinked + * when invoking the destroy function. + * we use (new_data==NULL && new_destroy_func!=NULL) as + * a special hint combination to "steal" + * data without destroy notification + */ + if (old.destroy && !new_destroy_func) + { + if (dataset) + G_UNLOCK (g_dataset_global); + old.destroy (old.data); + if (dataset) + G_LOCK (g_dataset_global); + old.data = NULL; + } + + return old.data; + } } else { - old.data = NULL; - if (d) - { - data = d->data; - data_end = data + d->len; - while (data < data_end) - { - if (data->key == key_id) - { - if (!data->destroy) - { - data->data = new_data; - data->destroy = new_destroy_func; - g_datalist_unlock (datalist); - } - else - { - old = *data; - data->data = new_data; - data->destroy = new_destroy_func; + if (data) + { + if (!data->destroy) + { + data->data = new_data; + data->destroy = new_destroy_func; + g_datalist_unlock (datalist); + } + else + { + old = *data; + data->data = new_data; + data->destroy = new_destroy_func; - g_datalist_unlock (datalist); + g_datalist_unlock (datalist); - /* We found and replaced an old value - * the GData struct *must* already be unlinked - * when invoking the destroy function. - */ - if (dataset) - G_UNLOCK (g_dataset_global); - old.destroy (old.data); - if (dataset) - G_LOCK (g_dataset_global); - } - return NULL; - } - data++; - } - } + /* We found and replaced an old value + * the GData struct *must* already be unlinked + * when invoking the destroy function. + */ + if (dataset) + G_UNLOCK (g_dataset_global); + old.destroy (old.data); + if (dataset) + G_LOCK (g_dataset_global); + } + return NULL; + } /* The key was not found, insert it */ - old_d = d; - if (d == NULL) - { - d = g_malloc (sizeof (GData)); - d->len = 0; - d->alloc = 1; - } - else if (d->len == d->alloc) - { - d->alloc = d->alloc * 2; - d = g_realloc (d, sizeof (GData) + (d->alloc - 1) * sizeof (GDataElt)); - } - if (old_d != d) - G_DATALIST_SET_POINTER (datalist, d); - - d->data[d->len].key = key_id; - d->data[d->len].data = new_data; - d->data[d->len].destroy = new_destroy_func; - d->len++; + if (datalist_append (&d, key_id, new_data, new_destroy_func)) + new_d = d; } - g_datalist_unlock (datalist); + if (new_d) + g_datalist_unlock_and_set (datalist, new_d); + else + g_datalist_unlock (datalist); return NULL; @@ -495,87 +525,86 @@ g_data_remove_internal (GData **datalist, gsize n_keys) { GData *d; + GDataElt *old; + GDataElt *old_to_free = NULL; + GData *d_to_free; + gsize found_keys; + gsize i_keys; + guint32 i_data; - g_datalist_lock (datalist); + d = g_datalist_lock_and_get (datalist); - d = G_DATALIST_GET_POINTER (datalist); - - if (d) + if (!d) { - GDataElt *old, *data, *data_end; - gsize found_keys; + g_datalist_unlock (datalist); + return; + } - /* Allocate an array of GDataElt to hold copies of the elements - * that are removed from the datalist. Allow enough space for all - * the keys; if a key is not found, the corresponding element of - * old is not populated, so we initialize them all to NULL to - * detect that case. */ - old = g_newa0 (GDataElt, n_keys); + /* Allocate an array of GDataElt to hold copies of the elements + * that are removed from the datalist. Allow enough space for all + * the keys; if a key is not found, the corresponding element of + * old is not populated, so we initialize them all to NULL to + * detect that case. + * + * At most allocate 400 bytes on the stack. Especially since we call + * out to external code, we don't know how much stack we can use. */ + if (n_keys <= 400u / sizeof (GDataElt)) + old = g_newa0 (GDataElt, n_keys); + else + { + old_to_free = g_new0 (GDataElt, n_keys); + old = old_to_free; + } - data = d->data; - data_end = data + d->len; - found_keys = 0; + i_data = 0; + found_keys = 0; + while (i_data < d->len && found_keys < n_keys) + { + GDataElt *data = &d->data[i_data]; + gboolean remove = FALSE; - while (data < data_end && found_keys < n_keys) + for (i_keys = 0; i_keys < n_keys; i_keys++) { - gboolean remove = FALSE; - - for (gsize i = 0; i < n_keys; i++) + if (data->key == keys[i_keys]) { - if (data->key == keys[i]) - { - old[i] = *data; - remove = TRUE; - break; - } - } - - if (remove) - { - GDataElt *data_last = data_end - 1; - + /* We must invoke the destroy notifications in the order of @keys. + * Hence, build up the list @old at index @i_keys. */ + old[i_keys] = *data; found_keys++; - - if (data < data_last) - *data = *data_last; - - data_end--; - d->len--; - - /* We don't bother to shrink, but if all data are now gone - * we at least free the memory - */ - if (d->len == 0) - { - G_DATALIST_SET_POINTER (datalist, NULL); - g_free (d); - break; - } - } - else - { - data++; + remove = TRUE; + break; } } - if (found_keys > 0) + if (!remove) { - g_datalist_unlock (datalist); + i_data++; + continue; + } - for (gsize i = 0; i < n_keys; i++) - { - /* If keys[i] was not found, then old[i].destroy is NULL. - * Call old[i].destroy() only if keys[i] was found, and - * is associated with a destroy notifier: */ - if (old[i].destroy) - old[i].destroy (old[i].data); - } + datalist_remove (d, i_data); + } - return; + if (found_keys > 0 && datalist_shrink (&d, &d_to_free)) + { + g_datalist_unlock_and_set (datalist, d); + if (d_to_free) + g_free (d_to_free); + } + else + g_datalist_unlock (datalist); + + if (found_keys > 0) + { + for (i_keys = 0; i_keys < n_keys; i_keys++) + { + if (old[i_keys].destroy) + old[i_keys].destroy (old[i_keys].data); } } - g_datalist_unlock (datalist); + if (G_UNLIKELY (old_to_free)) + g_free (old_to_free); } /** @@ -767,13 +796,17 @@ g_datalist_id_set_data_full (GData **datalist, * g_datalist_id_remove_multiple: * @datalist: a datalist * @keys: (array length=n_keys): keys to remove - * @n_keys: length of @keys, must be <= 16 + * @n_keys: length of @keys. * * Removes multiple keys from a datalist. * * This is more efficient than calling g_datalist_id_remove_data() * multiple times in a row. * + * Before 2.80, @n_keys had to be not larger than 16. Now it can be larger, but + * note that GData does a linear search, so an excessive number of keys will + * perform badly. + * * Since: 2.74 */ void @@ -781,8 +814,6 @@ g_datalist_id_remove_multiple (GData **datalist, GQuark *keys, gsize n_keys) { - g_return_if_fail (n_keys <= 16); - g_data_remove_internal (datalist, keys, n_keys); } @@ -858,6 +889,113 @@ g_datalist_id_remove_no_notify (GData **datalist, return ret_data; } +/*< private > + * g_datalist_id_update_atomic: + * @datalist: the data list + * @key_id: the key to add. + * @callback: (scope call): callback to update (set, remove, steal, update) the + * data. + * @user_data: the user data for @callback. + * + * Will call @callback while holding the lock on @datalist. Be careful to not + * end up calling into another data-list function, because the lock is not + * reentrant and deadlock will happen. + * + * The callback receives the current data and destroy function. If @key_id is + * currently not in @datalist, they will be %NULL. The callback can update + * those pointers, and @datalist will be updated with the result. Note that if + * callback modifies a received data, then it MUST steal it and take ownership + * on it. Possibly by freeing it with the provided destroy function. + * + * The point is to atomically access the entry, while holding a lock + * of @datalist. Without this, the user would have to hold their own mutex + * while handling @key_id entry. + * + * The return value of @callback is not used, except it becomes the return + * value of the function. This is an alternative to returning a result via + * @user_data. + * + * Returns: the value returned by @callback. + * + * Since: 2.80 + */ +gpointer +g_datalist_id_update_atomic (GData **datalist, + GQuark key_id, + GDataListUpdateAtomicFunc callback, + gpointer user_data) +{ + GData *d; + GDataElt *data; + gpointer new_data; + gpointer result; + GDestroyNotify new_destroy; + guint32 idx; + gboolean to_unlock = TRUE; + + d = g_datalist_lock_and_get (datalist); + + data = datalist_find (d, key_id, &idx); + + if (data) + { + new_data = data->data; + new_destroy = data->destroy; + } + else + { + new_data = NULL; + new_destroy = NULL; + } + + result = callback (key_id, &new_data, &new_destroy, user_data); + + if (data && !new_data) + { + GData *d_to_free; + + /* Remove. The callback indicates to drop the entry. + * + * The old data->data was stolen by callback(). */ + datalist_remove (d, idx); + if (datalist_shrink (&d, &d_to_free)) + { + g_datalist_unlock_and_set (datalist, d); + if (d_to_free) + g_free (d_to_free); + to_unlock = FALSE; + } + } + else if (data) + { + /* Update. The callback may have provided new pointers to an existing + * entry. + * + * The old data was stolen by callback(). We only update the pointers and + * are done. */ + data->data = new_data; + data->destroy = new_destroy; + } + else if (!data && !new_data) + { + /* Absent. No change. The entry didn't exist and still does not. */ + } + else + { + /* Add. Add a new entry that didn't exist previously. */ + if (datalist_append (&d, key_id, new_data, new_destroy)) + { + g_datalist_unlock_and_set (datalist, d); + to_unlock = FALSE; + } + } + + if (to_unlock) + g_datalist_unlock (datalist); + + return result; +} + /** * g_dataset_id_get_data: * @dataset_location: (not nullable): the location identifying the dataset. @@ -968,26 +1106,13 @@ g_datalist_id_dup_data (GData **datalist, gpointer val = NULL; gpointer retval = NULL; GData *d; - GDataElt *data, *data_end; + GDataElt *data; - g_datalist_lock (datalist); + d = g_datalist_lock_and_get (datalist); - d = G_DATALIST_GET_POINTER (datalist); - if (d) - { - data = d->data; - data_end = data + d->len; - do - { - if (data->key == key_id) - { - val = data->data; - break; - } - data++; - } - while (data < data_end); - } + data = datalist_find (d, key_id, NULL); + if (data) + val = data->data; if (dup_func) retval = dup_func (val, user_data); @@ -1037,7 +1162,10 @@ g_datalist_id_replace_data (GData **datalist, { gpointer val = NULL; GData *d; - GDataElt *data, *data_end; + GDataElt *data; + GData *d_to_free = NULL; + gboolean set_d = FALSE; + guint32 idx; g_return_val_if_fail (datalist != NULL, FALSE); g_return_val_if_fail (key_id != 0, FALSE); @@ -1045,76 +1173,45 @@ g_datalist_id_replace_data (GData **datalist, if (old_destroy) *old_destroy = NULL; - g_datalist_lock (datalist); + d = g_datalist_lock_and_get (datalist); - d = G_DATALIST_GET_POINTER (datalist); - if (d) + data = datalist_find (d, key_id, &idx); + if (data) { - data = d->data; - data_end = data + d->len - 1; - while (data <= data_end) + val = data->data; + if (val == oldval) { - if (data->key == key_id) + if (old_destroy) + *old_destroy = data->destroy; + if (newval != NULL) { - val = data->data; - if (val == oldval) - { - if (old_destroy) - *old_destroy = data->destroy; - if (newval != NULL) - { - data->data = newval; - data->destroy = destroy; - } - else - { - if (data != data_end) - *data = *data_end; - d->len--; - - /* We don't bother to shrink, but if all data are now gone - * we at least free the memory - */ - if (d->len == 0) - { - G_DATALIST_SET_POINTER (datalist, NULL); - g_free (d); - } - } - } - break; + data->data = newval; + data->destroy = destroy; + } + else + { + datalist_remove (d, idx); + if (datalist_shrink (&d, &d_to_free)) + set_d = TRUE; } - data++; } } if (val == NULL && oldval == NULL && newval != NULL) { - GData *old_d; - - /* insert newval */ - old_d = d; - if (d == NULL) - { - d = g_malloc (sizeof (GData)); - d->len = 0; - d->alloc = 1; - } - else if (d->len == d->alloc) + if (datalist_append (&d, key_id, newval, destroy)) { - d->alloc = d->alloc * 2; - d = g_realloc (d, sizeof (GData) + (d->alloc - 1) * sizeof (GDataElt)); + set_d = TRUE; } - if (old_d != d) - G_DATALIST_SET_POINTER (datalist, d); - - d->data[d->len].key = key_id; - d->data[d->len].data = newval; - d->data[d->len].destroy = destroy; - d->len++; } - g_datalist_unlock (datalist); + if (set_d) + g_datalist_unlock_and_set (datalist, d); + else + g_datalist_unlock (datalist); + + if (d_to_free) + g_free (d_to_free); return val == oldval; } @@ -1140,15 +1237,19 @@ g_datalist_get_data (GData **datalist, g_return_val_if_fail (datalist != NULL, NULL); - g_datalist_lock (datalist); - - d = G_DATALIST_GET_POINTER (datalist); + d = g_datalist_lock_and_get (datalist); if (d) { data = d->data; data_end = data + d->len; while (data < data_end) { + /* Here we intentionally compare by strings, instead of calling + * g_quark_try_string() first. + * + * See commit 1cceda49b60b ('Make g_datalist_get_data not look up the + * quark'). + */ if (g_strcmp0 (g_quark_to_string (data->key), key) == 0) { res = data->data; diff --git a/glib/gdatasetprivate.h b/glib/gdatasetprivate.h index f22cf38..c53455a 100644 --- a/glib/gdatasetprivate.h +++ b/glib/gdatasetprivate.h @@ -38,6 +38,29 @@ G_BEGIN_DECLS #define G_DATALIST_GET_FLAGS(datalist) \ ((gsize) g_atomic_pointer_get (datalist) & G_DATALIST_FLAGS_MASK) +/*< private > + * GDataListUpdateAtomicFunc: + * @key_id: ID of the entry to update + * @data: (inout) (nullable) (not optional): the existing data corresponding + * to @key_id, and return location for the new value for it + * @destroy_notify: (inout) (nullable) (not optional): the existing destroy + * notify function for @data, and return location for the destroy notify + * function for the new value for it + * @user_data: user data passed in to [func@GLib.datalist_id_update_atomic] + * + * Callback from [func@GLib.datalist_id_update_atomic]. + * + * Since: 2.80 + */ +typedef gpointer (*GDataListUpdateAtomicFunc) (GQuark key_id, + gpointer *data, + GDestroyNotify *destroy_notify, + gpointer user_data); + +gpointer g_datalist_id_update_atomic (GData **datalist, + GQuark key_id, + GDataListUpdateAtomicFunc callback, + gpointer user_data); G_END_DECLS diff --git a/glib/gdate.c b/glib/gdate.c index f60ec0c..c509bd3 100644 --- a/glib/gdate.c +++ b/glib/gdate.c @@ -60,21 +60,29 @@ #endif /** - * SECTION:date - * @title: Date and Time Functions - * @short_description: calendrical calculations and miscellaneous time stuff + * GDate: + * @julian_days: the Julian representation of the date + * @julian: this bit is set if @julian_days is valid + * @dmy: this is set if @day, @month and @year are valid + * @day: the day of the day-month-year representation of the date, + * as a number between 1 and 31 + * @month: the month of the day-month-year representation of the date, + * as a number between 1 and 12 + * @year: the year of the day-month-year representation of the date * - * The #GDate data structure represents a day between January 1, Year 1, + * `GDate` is a struct for calendrical calculations. + * + * The `GDate` data structure represents a day between January 1, Year 1, * and sometime a few thousand years in the future (right now it will go - * to the year 65535 or so, but g_date_set_parse() only parses up to the - * year 8000 or so - just count on "a few thousand"). #GDate is meant to + * to the year 65535 or so, but [method@GLib.Date.set_parse] only parses up to the + * year 8000 or so - just count on "a few thousand"). `GDate` is meant to * represent everyday dates, not astronomical dates or historical dates * or ISO timestamps or the like. It extrapolates the current Gregorian * calendar forward and backward in time; there is no attempt to change - * the calendar to match time periods or locations. #GDate does not store + * the calendar to match time periods or locations. `GDate` does not store * time information; it represents a day. * - * The #GDate implementation has several nice features; it is only a + * The `GDate` implementation has several nice features; it is only a * 64-bit struct, so storing large numbers of dates is very efficient. It * can keep both a Julian and day-month-year representation of the date, * since some calculations are much easier with one representation or the @@ -84,25 +92,23 @@ * technical sense; technically, Julian dates count from the start of the * Julian period, Jan 1, 4713 BC). * - * #GDate is simple to use. First you need a "blank" date; you can get a - * dynamically allocated date from g_date_new(), or you can declare an - * automatic variable or array and initialize it by - * calling g_date_clear(). A cleared date is safe; it's safe to call - * g_date_set_dmy() and the other mutator functions to initialize the - * value of a cleared date. However, a cleared date is initially - * invalid, meaning that it doesn't represent a day that exists. - * It is undefined to call any of the date calculation routines on an - * invalid date. If you obtain a date from a user or other - * unpredictable source, you should check its validity with the - * g_date_valid() predicate. g_date_valid() is also used to check for - * errors with g_date_set_parse() and other functions that can - * fail. Dates can be invalidated by calling g_date_clear() again. + * `GDate` is simple to use. First you need a "blank" date; you can get a + * dynamically allocated date from [ctor@GLib.Date.new], or you can declare an + * automatic variable or array and initialize it by calling [method@GLib.Date.clear]. + * A cleared date is safe; it's safe to call [method@GLib.Date.set_dmy] and the other + * mutator functions to initialize the value of a cleared date. However, a cleared date + * is initially invalid, meaning that it doesn't represent a day that exists. + * It is undefined to call any of the date calculation routines on an invalid date. + * If you obtain a date from a user or other unpredictable source, you should check + * its validity with the [method@GLib.Date.valid] predicate. [method@GLib.Date.valid] + * is also used to check for errors with [method@GLib.Date.set_parse] and other functions + * that can fail. Dates can be invalidated by calling [method@GLib.Date.clear] again. * - * It is very important to use the API to access the #GDate - * struct. Often only the day-month-year or only the Julian - * representation is valid. Sometimes neither is valid. Use the API. + * It is very important to use the API to access the `GDate` struct. Often only the + * day-month-year or only the Julian representation is valid. Sometimes neither is valid. + * Use the API. * - * GLib also features #GDateTime which represents a precise time. + * GLib also features `GDateTime` which represents a precise time. */ /** @@ -131,30 +137,6 @@ * Deprecated: 2.62: Use #GDateTime or #guint64 instead. */ -/** - * GDate: - * @julian_days: the Julian representation of the date - * @julian: this bit is set if @julian_days is valid - * @dmy: this is set if @day, @month and @year are valid - * @day: the day of the day-month-year representation of the date, - * as a number between 1 and 31 - * @month: the day of the day-month-year representation of the date, - * as a number between 1 and 12 - * @year: the day of the day-month-year representation of the date - * - * Represents a day between January 1, Year 1 and a few thousand years in - * the future. None of its members should be accessed directly. - * - * If the `GDate` is obtained from g_date_new(), it will be safe - * to mutate but invalid and thus not safe for calendrical computations. - * - * If it's declared on the stack, it will contain garbage so must be - * initialized with g_date_clear(). g_date_clear() makes the date invalid - * but safe. An invalid date doesn't represent a day, it's "empty." A date - * becomes valid after you set it to a Julian day or you set a day, month, - * and year. - */ - /** * GTime: * diff --git a/glib/gdate.h b/glib/gdate.h index 5ef21cb..35a2e91 100644 --- a/glib/gdate.h +++ b/glib/gdate.h @@ -38,15 +38,6 @@ G_BEGIN_DECLS -/* GDate - * - * Date calculations (not time for now, to be resolved). These are a - * mutant combination of Steffen Beyer's DateCalc routines - * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's - * date routines (written for in-house software). Written by Havoc - * Pennington - */ - typedef gint32 GTime GLIB_DEPRECATED_TYPE_IN_2_62_FOR(GDateTime); typedef guint16 GDateYear; typedef guint8 GDateDay; /* day of the month */ diff --git a/glib/gdatetime-private.c b/glib/gdatetime-private.c new file mode 100644 index 0000000..b392b62 --- /dev/null +++ b/glib/gdatetime-private.c @@ -0,0 +1,257 @@ +/* + * Copyright 2023 GNOME Foundation Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Authors: + * - Philip Withnall + */ + +#include "glib.h" +#include "gdatetime-private.h" + +/** + * _g_era_date_compare: + * @date1: first date + * @date2: second date + * + * Compare two #GEraDates for ordering, taking into account negative and + * positive infinity. + * + * Returns: strcmp()-style integer, `<0` indicates `date1 < date2`, `0` + * indicates `date1 == date2`, `>0` indicates `date1 > date2` + * Since: 2.80 + */ +int +_g_era_date_compare (const GEraDate *date1, + const GEraDate *date2) +{ + if (date1->type == G_ERA_DATE_SET && + date2->type == G_ERA_DATE_SET) + { + if (date1->year != date2->year) + return date1->year - date2->year; + if (date1->month != date2->month) + return date1->month - date2->month; + return date1->day - date2->day; + } + + if (date1->type == date2->type) + return 0; + + if (date1->type == G_ERA_DATE_MINUS_INFINITY || date2->type == G_ERA_DATE_PLUS_INFINITY) + return -1; + if (date1->type == G_ERA_DATE_PLUS_INFINITY || date2->type == G_ERA_DATE_MINUS_INFINITY) + return 1; + + g_assert_not_reached (); +} + +static gboolean +parse_era_date (const char *str, + const char *endptr, + GEraDate *out_date) +{ + const char *str_endptr = NULL; + int year_multiplier; + guint64 year, month, day; + + year_multiplier = (str[0] == '-') ? -1 : 1; + if (str[0] == '-' || str[0] == '+') + str++; + + year = g_ascii_strtoull (str, (gchar **) &str_endptr, 10); + g_assert (str_endptr <= endptr); + if (str_endptr == endptr || *str_endptr != '/' || year > G_MAXINT) + return FALSE; + str = str_endptr + 1; + + month = g_ascii_strtoull (str, (gchar **) &str_endptr, 10); + g_assert (str_endptr <= endptr); + if (str_endptr == endptr || *str_endptr != '/' || month < 1 || month > 12) + return FALSE; + str = str_endptr + 1; + + day = g_ascii_strtoull (str, (gchar **) &str_endptr, 10); + g_assert (str_endptr <= endptr); + if (str_endptr != endptr || day < 1 || day > 31) + return FALSE; + + /* Success */ + out_date->type = G_ERA_DATE_SET; + out_date->year = year_multiplier * year; + out_date->month = month; + out_date->day = day; + + return TRUE; +} + +/** + * _g_era_description_segment_ref: + * @segment: a #GEraDescriptionSegment + * + * Increase the ref count of @segment. + * + * Returns: (transfer full): @segment + * Since: 2.80 + */ +GEraDescriptionSegment * +_g_era_description_segment_ref (GEraDescriptionSegment *segment) +{ + g_atomic_ref_count_inc (&segment->ref_count); + return segment; +} + +/** + * _g_era_description_segment_unref: + * @segment: (transfer full): a #GEraDescriptionSegment to unref + * + * Decreases the ref count of @segment. + * + * Since: 2.80 + */ +void +_g_era_description_segment_unref (GEraDescriptionSegment *segment) +{ + if (g_atomic_ref_count_dec (&segment->ref_count)) + { + g_free (segment->era_format); + g_free (segment->era_name); + g_free (segment); + } +} + +/** + * _g_era_description_parse: + * @desc: an `ERA` description string from `nl_langinfo()` + * + * Parse an ERA description string. See [`nl_langinfo(3)`](man:nl_langinfo(3)). + * + * Example description string for th_TH.UTF-8: + * ``` + * +:1:-543/01/01:+*:พ.ศ.:%EC %Ey + * ``` + * + * @desc must be in UTF-8, so all conversion from the locale encoding must + * happen before this function is called. The resulting `era_name` and + * `era_format` in the returned segments will be in UTF-8. + * + * Returns: (transfer full) (nullable) (element-type GEraDescriptionSegment): + * array of one or more parsed era segments, or %NULL if parsing failed + * Since: 2.80 + */ +GPtrArray * +_g_era_description_parse (const char *desc) +{ + GPtrArray *segments = g_ptr_array_new_with_free_func ((GDestroyNotify) _g_era_description_segment_unref); + + for (const char *p = desc; *p != '\0';) + { + const char *next_colon, *endptr = NULL; + GEraDescriptionSegment *segment = NULL; + char direction; + guint64 offset; + GEraDate start_date, end_date; + char *era_name = NULL, *era_format = NULL; + + /* direction */ + direction = *p++; + if (direction != '+' && direction != '-') + goto error; + + if (*p++ != ':') + goto error; + + /* offset */ + next_colon = strchr (p, ':'); + if (next_colon == NULL) + goto error; + + offset = g_ascii_strtoull (p, (gchar **) &endptr, 10); + if (endptr != next_colon) + goto error; + p = next_colon + 1; + + /* start_date */ + next_colon = strchr (p, ':'); + if (next_colon == NULL) + goto error; + + if (!parse_era_date (p, next_colon, &start_date)) + goto error; + p = next_colon + 1; + + /* end_date */ + next_colon = strchr (p, ':'); + if (next_colon == NULL) + goto error; + + if (strncmp (p, "-*", 2) == 0) + end_date.type = G_ERA_DATE_MINUS_INFINITY; + else if (strncmp (p, "+*", 2) == 0) + end_date.type = G_ERA_DATE_PLUS_INFINITY; + else if (!parse_era_date (p, next_colon, &end_date)) + goto error; + p = next_colon + 1; + + /* era_name */ + next_colon = strchr (p, ':'); + if (next_colon == NULL) + goto error; + + if (next_colon - p == 0) + goto error; + era_name = g_strndup (p, next_colon - p); + p = next_colon + 1; + + /* era_format; either the final field in the segment (followed by a + * semicolon) or the description (followed by nul) */ + next_colon = strchr (p, ';'); + if (next_colon == NULL) + next_colon = p + strlen (p); + + if (next_colon - p == 0) + { + g_free (era_name); + goto error; + } + era_format = g_strndup (p, next_colon - p); + if (*next_colon == ';') + p = next_colon + 1; + else + p = next_colon; + + /* Successfully parsed that segment. */ + segment = g_new0 (GEraDescriptionSegment, 1); + g_atomic_ref_count_init (&segment->ref_count); + segment->offset = offset; + segment->start_date = start_date; + segment->end_date = end_date; + segment->direction_multiplier = + ((_g_era_date_compare (&segment->start_date, &segment->end_date) <= 0) ? 1 : -1) * + ((direction == '-') ? -1 : 1); + segment->era_name = g_steal_pointer (&era_name); + segment->era_format = g_steal_pointer (&era_format); + + g_ptr_array_add (segments, g_steal_pointer (&segment)); + } + + return g_steal_pointer (&segments); + +error: + g_ptr_array_unref (segments); + return NULL; +} diff --git a/glib/gdatetime-private.h b/glib/gdatetime-private.h new file mode 100644 index 0000000..1513141 --- /dev/null +++ b/glib/gdatetime-private.h @@ -0,0 +1,88 @@ +/* + * Copyright 2023 GNOME Foundation Inc. + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + * + * Authors: + * - Philip Withnall + */ + +#pragma once + +#include "glib.h" + +G_BEGIN_DECLS + +/** + * GEraDate: + * @type: the type of date + * @year: year of the date, in the Gregorian calendar + * @month: month of the date, in the Gregorian calendar + * @day: day of the date, in the Gregorian calendar + * + * A date from a #GEraDescriptionSegment. + * + * If @type is %G_ERA_DATE_SET, @year, @month and @day are valid. Otherwise, + * they are undefined. + * + * Since: 2.80 + */ +typedef struct { + enum { + G_ERA_DATE_SET, + G_ERA_DATE_PLUS_INFINITY, + G_ERA_DATE_MINUS_INFINITY, + } type; + int year; + int month; + int day; +} GEraDate; + +int _g_era_date_compare (const GEraDate *date1, + const GEraDate *date2); + +/** + * GEraDescriptionSegment: + * @ref_count: reference count + * @direction_multiplier: `-1` or `1` depending on the order of @start_date and + * @end_date + * @offset: offset of the first year in the era + * @start_date: start date (in the Gregorian calendar) of the era + * @end_date: end date (in the Gregorian calendar) of the era + * @era_name: (not nullable): name of the era + * @era_format: (not nullable): format string to use for `%EY` + * + * A segment of an `ERA` description string, describing a single era. See + * [`nl_langinfo(3)`](man:nl_langinfo(3)). + * + * Since: 2.80 + */ +typedef struct { + gatomicrefcount ref_count; + int direction_multiplier; + guint64 offset; + GEraDate start_date; /* inclusive */ + GEraDate end_date; /* inclusive */ + char *era_name; /* UTF-8 encoded */ + char *era_format; /* UTF-8 encoded */ +} GEraDescriptionSegment; + +GPtrArray *_g_era_description_parse (const char *desc); + +GEraDescriptionSegment *_g_era_description_segment_ref (GEraDescriptionSegment *segment); +void _g_era_description_segment_unref (GEraDescriptionSegment *segment); + +G_END_DECLS diff --git a/glib/gdatetime.c b/glib/gdatetime.c index 2640e3b..b5372d8 100644 --- a/glib/gdatetime.c +++ b/glib/gdatetime.c @@ -5,6 +5,7 @@ * Copyright (C) 2010 Emmanuele Bassi * Copyright © 2010 Codethink Limited * Copyright © 2018 Tomasz Miąsko + * Copyright 2023 GNOME Foundation Inc. * * SPDX-License-Identifier: LGPL-2.1-or-later * @@ -26,6 +27,7 @@ * Emmanuele Bassi * Ryan Lortie * Robert Ancell + * Philip Withnall */ /* Algorithms within this file are based on the Calendar FAQ by @@ -54,6 +56,7 @@ #define _GNU_SOURCE 1 #endif +#include #include #include #include @@ -68,6 +71,7 @@ #include "gconvert.h" #include "gconvertprivate.h" #include "gdatetime.h" +#include "gdatetime-private.h" #include "gfileutils.h" #include "ghash.h" #include "glibintl.h" @@ -89,39 +93,6 @@ #endif #endif /* !G_OS_WIN32 */ -/** - * SECTION:date-time - * @title: GDateTime - * @short_description: a structure representing Date and Time - * @see_also: #GTimeZone - * - * #GDateTime is a structure that combines a Gregorian date and time - * into a single structure. It provides many conversion and methods to - * manipulate dates and times. Time precision is provided down to - * microseconds and the time can range (proleptically) from 0001-01-01 - * 00:00:00 to 9999-12-31 23:59:59.999999. #GDateTime follows POSIX - * time in the sense that it is oblivious to leap seconds. - * - * #GDateTime is an immutable object; once it has been created it cannot - * be modified further. All modifiers will create a new #GDateTime. - * Nearly all such functions can fail due to the date or time going out - * of range, in which case %NULL will be returned. - * - * #GDateTime is reference counted: the reference count is increased by calling - * g_date_time_ref() and decreased by calling g_date_time_unref(). When the - * reference count drops to 0, the resources allocated by the #GDateTime - * structure are released. - * - * Many parts of the API may produce non-obvious results. As an - * example, adding two months to January 31st will yield March 31st - * whereas adding one month and then one month again will yield either - * March 28th or March 29th. Also note that adding 24 hours is not - * always the same as adding one day (since days containing daylight - * savings time transitions are either 23 or 25 hours in length). - * - * #GDateTime is available since GLib 2.26. - */ - struct _GDateTime { /* Microsecond timekeeping within Day */ @@ -587,6 +558,31 @@ get_month_name_abbr_with_day (gint month) #endif /* HAVE_LANGINFO_ABALTMON */ +/* FIXME: It doesn’t seem to be possible to use ERA on 64-bit big-endian platforms with glibc + * in a POSIX-compliant way right now. + * See https://gitlab.gnome.org/GNOME/glib/-/issues/3225 */ +#if defined(HAVE_LANGINFO_ERA) && (G_BYTE_ORDER == G_LITTLE_ENDIAN || GLIB_SIZEOF_VOID_P == 4) + +#define PREFERRED_ERA_DATE_TIME_FMT nl_langinfo (ERA_D_T_FMT) +#define PREFERRED_ERA_DATE_FMT nl_langinfo (ERA_D_FMT) +#define PREFERRED_ERA_TIME_FMT nl_langinfo (ERA_T_FMT) + +#define ERA_DESCRIPTION nl_langinfo (ERA) +#define ERA_DESCRIPTION_IS_LOCALE TRUE +#define ERA_DESCRIPTION_N_SEGMENTS (int) (gintptr) nl_langinfo (_NL_TIME_ERA_NUM_ENTRIES) + +#else /* if !HAVE_LANGINFO_ERA */ + +#define PREFERRED_ERA_DATE_TIME_FMT PREFERRED_DATE_TIME_FMT +#define PREFERRED_ERA_DATE_FMT PREFERRED_DATE_FMT +#define PREFERRED_ERA_TIME_FMT PREFERRED_TIME_FMT + +#define ERA_DESCRIPTION NULL +#define ERA_DESCRIPTION_IS_LOCALE FALSE +#define ERA_DESCRIPTION_N_SEGMENTS 0 + +#endif /* !HAVE_LANGINFO_ERA */ + /* Format AM/PM indicator if the locale does not have a localized version. */ static const gchar * get_fallback_ampm (gint hour) @@ -1040,15 +1036,41 @@ g_date_time_new_now_utc (void) GDateTime * g_date_time_new_from_unix_local (gint64 t) { - GDateTime *datetime; - GTimeZone *local; - if (t > G_MAXINT64 / USEC_PER_SECOND || t < G_MININT64 / USEC_PER_SECOND) return NULL; + return g_date_time_new_from_unix_local_usec (t * USEC_PER_SECOND); +} + +/** + * g_date_time_new_from_unix_local_usec: (constructor) + * @usecs: the Unix time in microseconds + * + * Creates a [struct@GLib.DateTime] corresponding to the given Unix time @t in the + * local time zone. + * + * Unix time is the number of microseconds that have elapsed since 1970-01-01 + * 00:00:00 UTC, regardless of the local time offset. + * + * This call can fail (returning `NULL`) if @t represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling [method@GLib.DateTime.unref] + * when you are done with it. + * + * Returns: (transfer full) (nullable): a new [struct@GLib.DateTime], or `NULL` + * + * Since: 2.80 + **/ +GDateTime * +g_date_time_new_from_unix_local_usec (gint64 usecs) +{ + GDateTime *datetime; + GTimeZone *local; + local = g_time_zone_new_local (); - datetime = g_date_time_new_from_unix (local, t * USEC_PER_SECOND); + datetime = g_date_time_new_from_unix (local, usecs); g_time_zone_unref (local); return datetime; @@ -1076,15 +1098,40 @@ g_date_time_new_from_unix_local (gint64 t) GDateTime * g_date_time_new_from_unix_utc (gint64 t) { - GDateTime *datetime; - GTimeZone *utc; - if (t > G_MAXINT64 / USEC_PER_SECOND || t < G_MININT64 / USEC_PER_SECOND) return NULL; + return g_date_time_new_from_unix_utc_usec (t * USEC_PER_SECOND); +} + +/** + * g_date_time_new_from_unix_utc_usec: (constructor) + * @usecs: the Unix time in microseconds + * + * Creates a [struct@GLib.DateTime] corresponding to the given Unix time @t in UTC. + * + * Unix time is the number of microseconds that have elapsed since 1970-01-01 + * 00:00:00 UTC. + * + * This call can fail (returning `NULL`) if @t represents a time outside + * of the supported range of #GDateTime. + * + * You should release the return value by calling [method@GLib.DateTime.unref] + * when you are done with it. + * + * Returns: (transfer full) (nullable): a new [struct@GLib.DateTime], or `NULL` + * + * Since: 2.80 + **/ +GDateTime * +g_date_time_new_from_unix_utc_usec (gint64 usecs) +{ + GDateTime *datetime; + GTimeZone *utc; + utc = g_time_zone_new_utc (); - datetime = g_date_time_new_from_unix (utc, t * USEC_PER_SECOND); + datetime = g_date_time_new_from_unix (utc, usecs); g_time_zone_unref (utc); return datetime; @@ -2573,6 +2620,27 @@ g_date_time_to_unix (GDateTime *datetime) return INSTANT_TO_UNIX (g_date_time_to_instant (datetime)); } +/** + * g_date_time_to_unix_usec: + * @datetime: a #GDateTime + * + * Gives the Unix time corresponding to @datetime, in microseconds. + * + * Unix time is the number of microseconds that have elapsed since 1970-01-01 + * 00:00:00 UTC, regardless of the time zone associated with @datetime. + * + * Returns: the Unix time corresponding to @datetime + * + * Since: 2.80 + **/ +gint64 +g_date_time_to_unix_usec (GDateTime *datetime) +{ + g_return_val_if_fail (datetime != NULL, 0); + + return INSTANT_TO_UNIX_USECS (g_date_time_to_instant (datetime)); +} + /** * g_date_time_to_timeval: * @datetime: a #GDateTime @@ -2853,6 +2921,9 @@ format_z (GString *outstr, /* Initializes the array with UTF-8 encoded alternate digits suitable for use * in current locale. Returns NULL when current locale does not use alternate * digits or there was an error converting them to UTF-8. + * + * This needs external locking, so must only be called from within + * format_number(). */ static const gchar * const * initialize_alt_digits (void) @@ -2894,6 +2965,134 @@ initialize_alt_digits (void) } #endif /* HAVE_LANGINFO_OUTDIGIT */ +/* Look up the era which contains @datetime, in the ERA description from libc + * which corresponds to the currently set LC_TIME locale. The ERA is parsed and + * cached the first time this function is called (or when LC_TIME changes). + * See nl_langinfo(3). + * + * The return value is (transfer full). */ +static GEraDescriptionSegment * +date_time_lookup_era (GDateTime *datetime, + gboolean locale_is_utf8) +{ + static GMutex era_mutex; + static GPtrArray *static_era_description = NULL; /* (mutex era_mutex) (element-type GEraDescriptionSegment) */ + static const char *static_era_description_locale = NULL; /* (mutex era_mutex) */ + const char *current_lc_time = setlocale (LC_TIME, NULL); + GPtrArray *local_era_description; /* (element-type GEraDescriptionSegment) */ + GEraDate datetime_date; + + g_mutex_lock (&era_mutex); + + if (static_era_description_locale != current_lc_time) + { + const char *era_description_str; + size_t era_description_str_len; + char *tmp = NULL; + + era_description_str = ERA_DESCRIPTION; + if (era_description_str != NULL) + { + /* FIXME: glibc 2.37 seems to return the era segments nul-separated rather + * than semicolon-separated (which is what nl_langinfo(3) specifies). + * Fix that up before sending it to the parsing code. + * See https://sourceware.org/bugzilla/show_bug.cgi?id=31030*/ + { + /* Work out the length of the whole description string, regardless + * of whether it uses nuls or semicolons as separators. */ + int n_entries = ERA_DESCRIPTION_N_SEGMENTS; + const char *s = era_description_str; + + for (int i = 1; i < n_entries; i++) + { + const char *next_semicolon = strchr (s, ';'); + const char *next_nul = strchr (s, '\0'); + + if (next_semicolon != NULL && next_semicolon < next_nul) + s = next_semicolon + 1; + else + s = next_nul + 1; + } + + era_description_str_len = strlen (s) + (s - era_description_str); + + /* Replace all the nuls with semicolons. */ + era_description_str = tmp = g_memdup2 (era_description_str, era_description_str_len + 1); + s = era_description_str; + + for (int i = 1; i < n_entries; i++) + { + char *next_nul = strchr (s, '\0'); + + if ((size_t) (next_nul - era_description_str) >= era_description_str_len) + break; + + *next_nul = ';'; + s = next_nul + 1; + } + } + + /* Convert from the LC_TIME encoding to UTF-8 if needed. */ + if (!locale_is_utf8 && ERA_DESCRIPTION_IS_LOCALE) + { + char *tmp2 = NULL; + era_description_str = tmp2 = g_locale_to_utf8 (era_description_str, -1, NULL, NULL, NULL); + g_free (tmp); + tmp = g_steal_pointer (&tmp2); + } + + g_clear_pointer (&static_era_description, g_ptr_array_unref); + + if (era_description_str != NULL) + static_era_description = _g_era_description_parse (era_description_str); + if (static_era_description == NULL) + g_warning ("Could not parse ERA description: %s", era_description_str); + } + else + { + g_clear_pointer (&static_era_description, g_ptr_array_unref); + } + + g_free (tmp); + + static_era_description_locale = current_lc_time; + } + + if (static_era_description == NULL) + { + g_mutex_unlock (&era_mutex); + return NULL; + } + + local_era_description = g_ptr_array_ref (static_era_description); + g_mutex_unlock (&era_mutex); + + /* Search through the eras and see if one matches. */ + datetime_date.type = G_ERA_DATE_SET; + datetime_date.year = g_date_time_get_year (datetime); + datetime_date.month = g_date_time_get_month (datetime); + datetime_date.day = g_date_time_get_day_of_month (datetime); + + for (unsigned int i = 0; i < local_era_description->len; i++) + { + GEraDescriptionSegment *segment = g_ptr_array_index (local_era_description, i); + + if ((_g_era_date_compare (&segment->start_date, &datetime_date) <= 0 && + _g_era_date_compare (&datetime_date, &segment->end_date) <= 0) || + (_g_era_date_compare (&segment->end_date, &datetime_date) <= 0 && + _g_era_date_compare (&datetime_date, &segment->start_date) <= 0)) + { + /* @datetime is within this era segment. */ + g_ptr_array_unref (local_era_description); + return _g_era_description_segment_ref (segment); + } + } + + g_ptr_array_unref (local_era_description); + + return NULL; +} + static void format_number (GString *str, gboolean use_alt_digits, @@ -2907,6 +3106,9 @@ format_number (GString *str, const gchar * const *digits = ascii_digits; const gchar *tmp[10]; gint i = 0; +#ifdef HAVE_LANGINFO_OUTDIGIT + static GMutex alt_digits_mutex; +#endif g_return_if_fail (width <= 10); @@ -2914,16 +3116,22 @@ format_number (GString *str, if (use_alt_digits) { static const gchar * const *alt_digits = NULL; - static gsize initialised; + static char *alt_digits_locale = NULL; + const char *current_ctype_locale = setlocale (LC_CTYPE, NULL); - if G_UNLIKELY (g_once_init_enter (&initialised)) + /* Lock so we can initialise (or re-initialise, if the locale has changed) + * and hold access to the digits buffer until done formatting. */ + g_mutex_lock (&alt_digits_mutex); + + if (g_strcmp0 (alt_digits_locale, current_ctype_locale) != 0) { alt_digits = initialize_alt_digits (); if (alt_digits == NULL) alt_digits = ascii_digits; - g_once_init_leave (&initialised, TRUE); + g_free (alt_digits_locale); + alt_digits_locale = g_strdup (current_ctype_locale); } digits = alt_digits; @@ -2940,6 +3148,11 @@ format_number (GString *str, while (pad && i < width) tmp[i++] = *pad == '0' ? digits[0] : pad; +#ifdef HAVE_LANGINFO_OUTDIGIT + if (use_alt_digits) + g_mutex_unlock (&alt_digits_mutex); +#endif + /* should really be impossible */ g_assert (i <= 10); @@ -3013,13 +3226,17 @@ g_date_time_format_locale (GDateTime *datetime, static inline gboolean string_append (GString *string, const gchar *s, + gboolean do_strup, gboolean s_is_utf8) { gchar *utf8; gsize utf8_len; + char *tmp = NULL; if (s_is_utf8) { + if (do_strup) + s = tmp = g_utf8_strup (s, -1); g_string_append (string, s); } else @@ -3027,10 +3244,18 @@ string_append (GString *string, utf8 = _g_time_locale_to_utf8 (s, -1, NULL, &utf8_len, NULL); if (utf8 == NULL) return FALSE; + if (do_strup) + { + tmp = g_utf8_strup (utf8, utf8_len); + g_free (utf8); + utf8 = g_steal_pointer (&tmp); + } g_string_append_len (string, utf8, utf8_len); g_free (utf8); } + g_free (tmp); + return TRUE; } @@ -3047,11 +3272,15 @@ g_date_time_format_utf8 (GDateTime *datetime, guint colons; gunichar c; gboolean alt_digits = FALSE; + gboolean alt_era = FALSE; gboolean pad_set = FALSE; + gboolean mod_case = FALSE; gboolean name_is_utf8; const gchar *pad = ""; + const gchar *mod = ""; const gchar *name; const gchar *tz; + char *tmp = NULL; while (*utf8_format) { @@ -3070,7 +3299,9 @@ g_date_time_format_utf8 (GDateTime *datetime, colons = 0; alt_digits = FALSE; + alt_era = FALSE; pad_set = FALSE; + mod_case = FALSE; next_mod: c = g_utf8_get_char (utf8_format); @@ -3078,24 +3309,24 @@ g_date_time_format_utf8 (GDateTime *datetime, switch (c) { case 'a': - name = WEEKDAY_ABBR (datetime); + name = WEEKDAY_ABBR (datetime); if (g_strcmp0 (name, "") == 0) return FALSE; name_is_utf8 = locale_is_utf8 || !WEEKDAY_ABBR_IS_LOCALE; - if (!string_append (outstr, name, name_is_utf8)) + if (!string_append (outstr, name, mod_case, name_is_utf8)) return FALSE; break; case 'A': - name = WEEKDAY_FULL (datetime); + name = WEEKDAY_FULL (datetime); if (g_strcmp0 (name, "") == 0) return FALSE; name_is_utf8 = locale_is_utf8 || !WEEKDAY_FULL_IS_LOCALE; - if (!string_append (outstr, name, name_is_utf8)) + if (!string_append (outstr, name, mod_case, name_is_utf8)) return FALSE; break; @@ -3109,7 +3340,7 @@ g_date_time_format_utf8 (GDateTime *datetime, ((alt_digits && !MONTH_ABBR_STANDALONE_IS_LOCALE) || (!alt_digits && !MONTH_ABBR_WITH_DAY_IS_LOCALE)); - if (!string_append (outstr, name, name_is_utf8)) + if (!string_append (outstr, name, mod_case, name_is_utf8)) return FALSE; break; @@ -3123,20 +3354,37 @@ g_date_time_format_utf8 (GDateTime *datetime, ((alt_digits && !MONTH_FULL_STANDALONE_IS_LOCALE) || (!alt_digits && !MONTH_FULL_WITH_DAY_IS_LOCALE)); - if (!string_append (outstr, name, name_is_utf8)) + if (!string_append (outstr, name, mod_case, name_is_utf8)) return FALSE; break; case 'c': { - if (g_strcmp0 (PREFERRED_DATE_TIME_FMT, "") == 0) + const char *subformat = alt_era ? PREFERRED_ERA_DATE_TIME_FMT : PREFERRED_DATE_TIME_FMT; + + /* Fallback */ + if (alt_era && g_strcmp0 (subformat, "") == 0) + subformat = PREFERRED_DATE_TIME_FMT; + + if (g_strcmp0 (subformat, "") == 0) return FALSE; - if (!g_date_time_format_locale (datetime, PREFERRED_DATE_TIME_FMT, + if (!g_date_time_format_locale (datetime, subformat, outstr, locale_is_utf8)) return FALSE; } break; case 'C': + if (alt_era) + { + GEraDescriptionSegment *era = date_time_lookup_era (datetime, locale_is_utf8); + if (era != NULL) + { + g_string_append (outstr, era->era_name); + _g_era_description_segment_unref (era); + break; + } + } + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, g_date_time_get_year (datetime) / 100); break; @@ -3176,7 +3424,7 @@ g_date_time_format_utf8 (GDateTime *datetime, ((alt_digits && !MONTH_ABBR_STANDALONE_IS_LOCALE) || (!alt_digits && !MONTH_ABBR_WITH_DAY_IS_LOCALE)); - if (!string_append (outstr, name, name_is_utf8)) + if (!string_append (outstr, name, mod_case, name_is_utf8)) return FALSE; break; @@ -3214,12 +3462,19 @@ g_date_time_format_utf8 (GDateTime *datetime, case 'O': alt_digits = TRUE; goto next_mod; + case 'E': + alt_era = TRUE; + goto next_mod; case 'p': - if (!format_ampm (datetime, outstr, locale_is_utf8, TRUE)) + if (!format_ampm (datetime, outstr, locale_is_utf8, + mod_case && g_strcmp0 (mod, "#") == 0 ? FALSE + : TRUE)) return FALSE; break; case 'P': - if (!format_ampm (datetime, outstr, locale_is_utf8, FALSE)) + if (!format_ampm (datetime, outstr, locale_is_utf8, + mod_case && g_strcmp0 (mod, "^") == 0 ? TRUE + : FALSE)) return FALSE; break; case 'r': @@ -3266,29 +3521,78 @@ g_date_time_format_utf8 (GDateTime *datetime, break; case 'x': { - if (g_strcmp0 (PREFERRED_DATE_FMT, "") == 0) + const char *subformat = alt_era ? PREFERRED_ERA_DATE_FMT : PREFERRED_DATE_FMT; + + /* Fallback */ + if (alt_era && g_strcmp0 (subformat, "") == 0) + subformat = PREFERRED_DATE_FMT; + + if (g_strcmp0 (subformat, "") == 0) return FALSE; - if (!g_date_time_format_locale (datetime, PREFERRED_DATE_FMT, + if (!g_date_time_format_locale (datetime, subformat, outstr, locale_is_utf8)) return FALSE; } break; case 'X': { - if (g_strcmp0 (PREFERRED_TIME_FMT, "") == 0) + const char *subformat = alt_era ? PREFERRED_ERA_TIME_FMT : PREFERRED_TIME_FMT; + + /* Fallback */ + if (alt_era && g_strcmp0 (subformat, "") == 0) + subformat = PREFERRED_TIME_FMT; + + if (g_strcmp0 (subformat, "") == 0) return FALSE; - if (!g_date_time_format_locale (datetime, PREFERRED_TIME_FMT, + if (!g_date_time_format_locale (datetime, subformat, outstr, locale_is_utf8)) return FALSE; } break; case 'y': - format_number (outstr, alt_digits, pad_set ? pad : "0", 2, - g_date_time_get_year (datetime) % 100); + if (alt_era) + { + GEraDescriptionSegment *era = date_time_lookup_era (datetime, locale_is_utf8); + if (era != NULL) + { + int delta = g_date_time_get_year (datetime) - era->start_date.year; + + /* Both these years are in the Gregorian calendar (CE/BCE), + * which has no year zero. So take one from the delta if they + * cross across where year zero would be. */ + if ((g_date_time_get_year (datetime) < 0) != (era->start_date.year < 0)) + delta -= 1; + + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + era->offset + delta * era->direction_multiplier); + _g_era_description_segment_unref (era); + break; + } + } + + format_number (outstr, alt_digits, pad_set ? pad : "0", 2, + g_date_time_get_year (datetime) % 100); break; case 'Y': - format_number (outstr, alt_digits, 0, 0, - g_date_time_get_year (datetime)); + if (alt_era) + { + GEraDescriptionSegment *era = date_time_lookup_era (datetime, locale_is_utf8); + if (era != NULL) + { + if (!g_date_time_format_utf8 (datetime, era->era_format, + outstr, locale_is_utf8)) + { + _g_era_description_segment_unref (era); + return FALSE; + } + + _g_era_description_segment_unref (era); + break; + } + } + + format_number (outstr, alt_digits, 0, 0, + g_date_time_get_year (datetime)); break; case 'z': { @@ -3299,8 +3603,11 @@ g_date_time_format_utf8 (GDateTime *datetime, } break; case 'Z': - tz = g_date_time_get_timezone_abbreviation (datetime); + tz = g_date_time_get_timezone_abbreviation (datetime); + if (mod_case && g_strcmp0 (mod, "#") == 0) + tz = tmp = g_utf8_strdown (tz, -1); g_string_append (outstr, tz); + g_free (tmp); break; case '%': g_string_append_c (outstr, '%'); @@ -3323,9 +3630,17 @@ g_date_time_format_utf8 (GDateTime *datetime, return FALSE; colons++; goto next_mod; - default: - return FALSE; - } + case '^': + mod_case = TRUE; + mod = "^"; + goto next_mod; + case '#': + mod_case = TRUE; + mod = "#"; + goto next_mod; + default: + return FALSE; + } } return TRUE; @@ -3418,8 +3733,9 @@ g_date_time_format_utf8 (GDateTime *datetime, * - `%%`: a literal `%` character * * Some conversion specifications can be modified by preceding the - * conversion specifier by one or more modifier characters. The - * following modifiers are supported for many of the numeric + * conversion specifier by one or more modifier characters. + * + * The following modifiers are supported for many of the numeric * conversions: * * - `O`: Use alternative numeric symbols, if the current locale supports those. @@ -3430,6 +3746,13 @@ g_date_time_format_utf8 (GDateTime *datetime, * - `0`: Pad a numeric result with zeros. This overrides the default padding * for the specifier. * + * The following modifiers are supported for many of the alphabetic conversions: + * + * - `^`: Use upper case if possible. This is a gnulib `strftime()` extension. + * Since: 2.80 + * - `#`: Use opposite case if possible. This is a gnulib `strftime()` + * extension. Since: 2.80 + * * Additionally, when `O` is used with `B`, `b`, or `h`, it produces the alternative * form of a month name. The alternative form should be used when the month * name is used without a day number (e.g., standalone). It is required in @@ -3438,6 +3761,22 @@ g_date_time_format_utf8 (GDateTime *datetime, * `strftime()` extension expected to be added to the future POSIX specification, * `%Ob` and `%Oh` are GNU `strftime()` extensions. Since: 2.56 * + * Since GLib 2.80, when `E` is used with `%c`, `%C`, `%x`, `%X`, `%y` or `%Y`, + * the date is formatted using an alternate era representation specific to the + * locale. This is typically used for the Thai solar calendar or Japanese era + * names, for example. + * + * - `%Ec`: the preferred date and time representation for the current locale, + * using the alternate era representation + * - `%EC`: the name of the era + * - `%Ex`: the preferred date representation for the current locale without + * the time, using the alternate era representation + * - `%EX`: the preferred time representation for the current locale without + * the date, using the alternate era representation + * - `%Ey`: the year since the beginning of the era denoted by the `%EC` + * specifier + * - `%EY`: the full alternative year representation + * * Returns: (transfer full) (nullable): a newly allocated string formatted to * the requested format or %NULL in the case that there was an error (such * as a format specifier not being supported in the current locale). The diff --git a/glib/gdatetime.h b/glib/gdatetime.h index 4312433..846d22c 100644 --- a/glib/gdatetime.h +++ b/glib/gdatetime.h @@ -91,7 +91,31 @@ typedef gint64 GTimeSpan; /** * GDateTime: * - * An opaque structure that represents a date and time, including a time zone. + * `GDateTime` is a structure that combines a Gregorian date and time + * into a single structure. + * + * `GDateTime` provides many conversion and methods to manipulate dates and times. + * Time precision is provided down to microseconds and the time can range + * (proleptically) from 0001-01-01 00:00:00 to 9999-12-31 23:59:59.999999. + * `GDateTime` follows POSIX time in the sense that it is oblivious to leap + * seconds. + * + * `GDateTime` is an immutable object; once it has been created it cannot + * be modified further. All modifiers will create a new `GDateTime`. + * Nearly all such functions can fail due to the date or time going out + * of range, in which case %NULL will be returned. + * + * `GDateTime` is reference counted: the reference count is increased by calling + * [method@GLib.DateTime.ref] and decreased by calling [method@GLib.DateTime.unref]. + * When the reference count drops to 0, the resources allocated by the `GDateTime` + * structure are released. + * + * Many parts of the API may produce non-obvious results. As an + * example, adding two months to January 31st will yield March 31st + * whereas adding one month and then one month again will yield either + * March 28th or March 29th. Also note that adding 24 hours is not + * always the same as adding one day (since days containing daylight + * savings time transitions are either 23 or 25 hours in length). * * Since: 2.26 */ @@ -114,6 +138,11 @@ GDateTime * g_date_time_new_from_unix_local (gint64 GLIB_AVAILABLE_IN_ALL GDateTime * g_date_time_new_from_unix_utc (gint64 t); +GLIB_AVAILABLE_IN_2_80 +GDateTime * g_date_time_new_from_unix_local_usec (gint64 usecs); +GLIB_AVAILABLE_IN_2_80 +GDateTime * g_date_time_new_from_unix_utc_usec (gint64 usecs); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS GLIB_DEPRECATED_IN_2_62_FOR(g_date_time_new_from_unix_local) GDateTime * g_date_time_new_from_timeval_local (const GTimeVal *tv); @@ -241,6 +270,9 @@ gdouble g_date_time_get_seconds (GDateTi GLIB_AVAILABLE_IN_ALL gint64 g_date_time_to_unix (GDateTime *datetime); +GLIB_AVAILABLE_IN_2_80 +gint64 g_date_time_to_unix_usec (GDateTime *datetime); + G_GNUC_BEGIN_IGNORE_DEPRECATIONS GLIB_DEPRECATED_IN_2_62_FOR(g_date_time_to_unix) gboolean g_date_time_to_timeval (GDateTime *datetime, diff --git a/glib/gdir.c b/glib/gdir.c index c9283de..073be6a 100644 --- a/glib/gdir.c +++ b/glib/gdir.c @@ -56,6 +56,7 @@ struct _GDir { + gatomicrefcount ref_count; #ifdef G_OS_WIN32 _WDIR *wdirp; #else @@ -89,10 +90,13 @@ GDir * g_dir_open_with_errno (const gchar *path, guint flags) { - GDir dir; #ifdef G_OS_WIN32 + GDir *dir; + _WDIR *wdirp; gint saved_errno; wchar_t *wpath; +#else + DIR *dirp; #endif g_return_val_if_fail (path != NULL, NULL); @@ -102,25 +106,31 @@ g_dir_open_with_errno (const gchar *path, g_return_val_if_fail (wpath != NULL, NULL); - dir.wdirp = _wopendir (wpath); + wdirp = _wopendir (wpath); saved_errno = errno; g_free (wpath); errno = saved_errno; - if (dir.wdirp == NULL) + if (wdirp == NULL) return NULL; + + dir = g_new0 (GDir, 1); + g_atomic_ref_count_init (&dir->ref_count); + dir->wdirp = wdirp; + + return g_steal_pointer (&dir); #else - dir.dirp = opendir (path); + dirp = opendir (path); - if (dir.dirp == NULL) + if (dirp == NULL) return NULL; -#endif - return g_memdup2 (&dir, sizeof dir); + return g_dir_new_from_dirp (dirp); +#endif } /** - * g_dir_open: + * g_dir_open: (constructor) * @path: the path to the directory you are interested in. On Unix * in the on-disk encoding. On Windows in UTF-8 * @flags: Currently must be set to 0. Reserved for future use. @@ -132,7 +142,7 @@ g_dir_open_with_errno (const gchar *path, * directory can then be retrieved using g_dir_read_name(). Note * that the ordering is not defined. * - * Returns: a newly allocated #GDir on success, %NULL on failure. + * Returns: (transfer full): a newly allocated #GDir on success, %NULL on failure. * If non-%NULL, you must free the result with g_dir_close() * when you are finished with it. **/ @@ -187,7 +197,8 @@ g_dir_new_from_dirp (gpointer dirp) g_return_val_if_fail (dirp != NULL, NULL); - dir = g_new (GDir, 1); + dir = g_new0 (GDir, 1); + g_atomic_ref_count_init (&dir->ref_count); dir->dirp = dirp; return dir; @@ -287,23 +298,84 @@ g_dir_rewind (GDir *dir) #endif } +static void +g_dir_actually_close (GDir *dir) +{ +#ifdef G_OS_WIN32 + g_clear_pointer (&dir->wdirp, _wclosedir); +#else + g_clear_pointer (&dir->dirp, closedir); +#endif +} + /** * g_dir_close: - * @dir: a #GDir* created by g_dir_open() + * @dir: (transfer full): a #GDir* created by g_dir_open() * - * Closes the directory and deallocates all related resources. + * Closes the directory immediately and decrements the reference count. + * + * Once the reference count reaches zero, the `GDir` structure itself will be + * freed. Prior to GLib 2.80, `GDir` was not reference counted. + * + * It is an error to call any of the `GDir` methods other than + * [method@GLib.Dir.ref] and [method@GLib.Dir.unref] on a `GDir` after calling + * [method@GLib.Dir.close] on it. **/ void g_dir_close (GDir *dir) { g_return_if_fail (dir != NULL); -#ifdef G_OS_WIN32 - _wclosedir (dir->wdirp); -#else - closedir (dir->dirp); -#endif - g_free (dir); + g_dir_actually_close (dir); + g_dir_unref (dir); +} + +/** + * g_dir_ref: + * @dir: (transfer none): a `GDir` + * + * Increment the reference count of `dir`. + * + * Returns: (transfer full): the same pointer as `dir` + * Since: 2.80 + */ +GDir * +g_dir_ref (GDir *dir) +{ + g_return_val_if_fail (dir != NULL, NULL); + + g_atomic_ref_count_inc (&dir->ref_count); + return dir; +} + +/** + * g_dir_unref: + * @dir: (transfer full): a `GDir` + * + * Decrements the reference count of `dir`. + * + * Once the reference count reaches zero, the directory will be closed and all + * resources associated with it will be freed. If [method@GLib.Dir.close] is + * called when the reference count is greater than zero, the directory is closed + * but the `GDir` structure will not be freed until its reference count reaches + * zero. + * + * It is an error to call any of the `GDir` methods other than + * [method@GLib.Dir.ref] and [method@GLib.Dir.unref] on a `GDir` after calling + * [method@GLib.Dir.close] on it. + * + * Since: 2.80 + */ +void +g_dir_unref (GDir *dir) +{ + g_return_if_fail (dir != NULL); + + if (g_atomic_ref_count_dec (&dir->ref_count)) + { + g_dir_actually_close (dir); + g_free (dir); + } } #ifdef G_OS_WIN32 diff --git a/glib/gdir.h b/glib/gdir.h index 0d3ee82..1b59b27 100644 --- a/glib/gdir.h +++ b/glib/gdir.h @@ -49,6 +49,11 @@ void g_dir_rewind (GDir *dir); GLIB_AVAILABLE_IN_ALL void g_dir_close (GDir *dir); +GLIB_AVAILABLE_IN_2_80 +GDir * g_dir_ref (GDir *dir); +GLIB_AVAILABLE_IN_2_80 +void g_dir_unref (GDir *dir); + G_END_DECLS #endif /* __G_DIR_H__ */ diff --git a/glib/gen-unicode-tables.pl b/glib/gen-unicode-tables.pl index f4b5bab..e47ef3b 100755 --- a/glib/gen-unicode-tables.pl +++ b/glib/gen-unicode-tables.pl @@ -111,6 +111,9 @@ $FOLDING_MAPPING = 2; ( 'AI' => "G_UNICODE_BREAK_AMBIGUOUS", 'AL' => "G_UNICODE_BREAK_ALPHABETIC", + 'AK' => "G_UNICODE_BREAK_AKSARA", + 'AP' => "G_UNICODE_BREAK_AKSARA_PRE_BASE", + 'AS' => "G_UNICODE_BREAK_AKSARA_START", 'B2' => "G_UNICODE_BREAK_BEFORE_AND_AFTER", 'BA' => "G_UNICODE_BREAK_AFTER", 'BB' => "G_UNICODE_BREAK_BEFORE", @@ -148,6 +151,8 @@ $FOLDING_MAPPING = 2; 'SG' => "G_UNICODE_BREAK_SURROGATE", 'SP' => "G_UNICODE_BREAK_SPACE", 'SY' => "G_UNICODE_BREAK_SYMBOL", + 'VF' => "G_UNICODE_BREAK_VIRAMA_FINAL", + 'VI' => "G_UNICODE_BREAK_VIRAMA", 'WJ' => "G_UNICODE_BREAK_WORD_JOINER", 'XX' => "G_UNICODE_BREAK_UNKNOWN", 'ZW' => "G_UNICODE_BREAK_ZERO_WIDTH_SPACE", @@ -332,7 +337,11 @@ while () next; } - if ($fields[$CODE] =~ /([A-F0-9]{4,6})\.\.([A-F0-9]{4,6})/) + # Trim leading and trailing whitespace + $fields[$CODE] =~ s/^\s+|\s+$//; + $fields[$BREAK_PROPERTY] =~ s/^\s+|\s+$//; + + if ($fields[$CODE] =~ /([A-F0-9]{4,6})\.\.([A-F0-9]{4,6})/) { $start_code = hex ($1); $end_code = hex ($2); @@ -803,7 +812,7 @@ sub print_row print OUT "\n "; $column = 4; } - else + elsif ($i > $start) { print OUT " " } diff --git a/glib/gerror.c b/glib/gerror.c index ea168e0..ea985ac 100644 --- a/glib/gerror.c +++ b/glib/gerror.c @@ -24,481 +24,6 @@ * GLib at ftp://ftp.gtk.org/pub/gtk/. */ -/** - * SECTION:error_reporting - * @Title: Error Reporting - * @Short_description: a system for reporting errors - * - * GLib provides a standard method of reporting errors from a called - * function to the calling code. (This is the same problem solved by - * exceptions in other languages.) It's important to understand that - * this method is both a data type (the #GError struct) and a [set of - * rules][gerror-rules]. If you use #GError incorrectly, then your code will not - * properly interoperate with other code that uses #GError, and users - * of your API will probably get confused. In most cases, [using #GError is - * preferred over numeric error codes][gerror-comparison], but there are - * situations where numeric error codes are useful for performance. - * - * First and foremost: #GError should only be used to report recoverable - * runtime errors, never to report programming errors. If the programmer - * has screwed up, then you should use g_warning(), g_return_if_fail(), - * g_assert(), g_error(), or some similar facility. (Incidentally, - * remember that the g_error() function should only be used for - * programming errors, it should not be used to print any error - * reportable via #GError.) - * - * Examples of recoverable runtime errors are "file not found" or - * "failed to parse input." Examples of programming errors are "NULL - * passed to strcmp()" or "attempted to free the same pointer twice." - * These two kinds of errors are fundamentally different: runtime errors - * should be handled or reported to the user, programming errors should - * be eliminated by fixing the bug in the program. This is why most - * functions in GLib and GTK do not use the #GError facility. - * - * Functions that can fail take a return location for a #GError as their - * last argument. On error, a new #GError instance will be allocated and - * returned to the caller via this argument. For example: - * |[ - * gboolean g_file_get_contents (const gchar *filename, - * gchar **contents, - * gsize *length, - * GError **error); - * ]| - * If you pass a non-%NULL value for the `error` argument, it should - * point to a location where an error can be placed. For example: - * |[ - * gchar *contents; - * GError *err = NULL; - * - * g_file_get_contents ("foo.txt", &contents, NULL, &err); - * g_assert ((contents == NULL && err != NULL) || (contents != NULL && err == NULL)); - * if (err != NULL) - * { - * // Report error to user, and free error - * g_assert (contents == NULL); - * fprintf (stderr, "Unable to read file: %s\n", err->message); - * g_error_free (err); - * } - * else - * { - * // Use file contents - * g_assert (contents != NULL); - * } - * ]| - * Note that `err != NULL` in this example is a reliable indicator - * of whether g_file_get_contents() failed. Additionally, - * g_file_get_contents() returns a boolean which - * indicates whether it was successful. - * - * Because g_file_get_contents() returns %FALSE on failure, if you - * are only interested in whether it failed and don't need to display - * an error message, you can pass %NULL for the @error argument: - * |[ - * if (g_file_get_contents ("foo.txt", &contents, NULL, NULL)) // ignore errors - * // no error occurred - * ; - * else - * // error - * ; - * ]| - * - * The #GError object contains three fields: @domain indicates the module - * the error-reporting function is located in, @code indicates the specific - * error that occurred, and @message is a user-readable error message with - * as many details as possible. Several functions are provided to deal - * with an error received from a called function: g_error_matches() - * returns %TRUE if the error matches a given domain and code, - * g_propagate_error() copies an error into an error location (so the - * calling function will receive it), and g_clear_error() clears an - * error location by freeing the error and resetting the location to - * %NULL. To display an error to the user, simply display the @message, - * perhaps along with additional context known only to the calling - * function (the file being opened, or whatever - though in the - * g_file_get_contents() case, the @message already contains a filename). - * - * Since error messages may be displayed to the user, they need to be valid - * UTF-8 (all GTK widgets expect text to be UTF-8). Keep this in mind in - * particular when formatting error messages with filenames, which are in - * the 'filename encoding', and need to be turned into UTF-8 using - * g_filename_to_utf8(), g_filename_display_name() or g_utf8_make_valid(). - * - * Note, however, that many error messages are too technical to display to the - * user in an application, so prefer to use g_error_matches() to categorize errors - * from called functions, and build an appropriate error message for the context - * within your application. Error messages from a #GError are more appropriate - * to be printed in system logs or on the command line. They are typically - * translated. - * - * When implementing a function that can report errors, the basic - * tool is g_set_error(). Typically, if a fatal error occurs you - * want to g_set_error(), then return immediately. g_set_error() - * does nothing if the error location passed to it is %NULL. - * Here's an example: - * |[ - * gint - * foo_open_file (GError **error) - * { - * gint fd; - * int saved_errno; - * - * g_return_val_if_fail (error == NULL || *error == NULL, -1); - * - * fd = open ("file.txt", O_RDONLY); - * saved_errno = errno; - * - * if (fd < 0) - * { - * g_set_error (error, - * FOO_ERROR, // error domain - * FOO_ERROR_BLAH, // error code - * "Failed to open file: %s", // error message format string - * g_strerror (saved_errno)); - * return -1; - * } - * else - * return fd; - * } - * ]| - * - * Things are somewhat more complicated if you yourself call another - * function that can report a #GError. If the sub-function indicates - * fatal errors in some way other than reporting a #GError, such as - * by returning %TRUE on success, you can simply do the following: - * |[ - * gboolean - * my_function_that_can_fail (GError **err) - * { - * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); - * - * if (!sub_function_that_can_fail (err)) - * { - * // assert that error was set by the sub-function - * g_assert (err == NULL || *err != NULL); - * return FALSE; - * } - * - * // otherwise continue, no error occurred - * g_assert (err == NULL || *err == NULL); - * } - * ]| - * - * If the sub-function does not indicate errors other than by - * reporting a #GError (or if its return value does not reliably indicate - * errors) you need to create a temporary #GError - * since the passed-in one may be %NULL. g_propagate_error() is - * intended for use in this case. - * |[ - * gboolean - * my_function_that_can_fail (GError **err) - * { - * GError *tmp_error; - * - * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); - * - * tmp_error = NULL; - * sub_function_that_can_fail (&tmp_error); - * - * if (tmp_error != NULL) - * { - * // store tmp_error in err, if err != NULL, - * // otherwise call g_error_free() on tmp_error - * g_propagate_error (err, tmp_error); - * return FALSE; - * } - * - * // otherwise continue, no error occurred - * } - * ]| - * - * Error pileups are always a bug. For example, this code is incorrect: - * |[ - * gboolean - * my_function_that_can_fail (GError **err) - * { - * GError *tmp_error; - * - * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); - * - * tmp_error = NULL; - * sub_function_that_can_fail (&tmp_error); - * other_function_that_can_fail (&tmp_error); - * - * if (tmp_error != NULL) - * { - * g_propagate_error (err, tmp_error); - * return FALSE; - * } - * } - * ]| - * @tmp_error should be checked immediately after sub_function_that_can_fail(), - * and either cleared or propagated upward. The rule is: after each error, - * you must either handle the error, or return it to the calling function. - * - * Note that passing %NULL for the error location is the equivalent - * of handling an error by always doing nothing about it. So the - * following code is fine, assuming errors in sub_function_that_can_fail() - * are not fatal to my_function_that_can_fail(): - * |[ - * gboolean - * my_function_that_can_fail (GError **err) - * { - * GError *tmp_error; - * - * g_return_val_if_fail (err == NULL || *err == NULL, FALSE); - * - * sub_function_that_can_fail (NULL); // ignore errors - * - * tmp_error = NULL; - * other_function_that_can_fail (&tmp_error); - * - * if (tmp_error != NULL) - * { - * g_propagate_error (err, tmp_error); - * return FALSE; - * } - * } - * ]| - * - * Note that passing %NULL for the error location ignores errors; - * it's equivalent to - * `try { sub_function_that_can_fail (); } catch (...) {}` - * in C++. It does not mean to leave errors unhandled; it means - * to handle them by doing nothing. - * - * Error domains and codes are conventionally named as follows: - * - * - The error domain is called __ERROR, - * for example %G_SPAWN_ERROR or %G_THREAD_ERROR: - * |[ - * #define G_SPAWN_ERROR g_spawn_error_quark () - * - * G_DEFINE_QUARK (g-spawn-error-quark, g_spawn_error) - * ]| - * - * - The quark function for the error domain is called - * __error_quark, - * for example g_spawn_error_quark() or g_thread_error_quark(). - * - * - The error codes are in an enumeration called - * Error; - * for example, #GThreadError or #GSpawnError. - * - * - Members of the error code enumeration are called - * __ERROR_, - * for example %G_SPAWN_ERROR_FORK or %G_THREAD_ERROR_AGAIN. - * - * - If there's a "generic" or "unknown" error code for unrecoverable - * errors it doesn't make sense to distinguish with specific codes, - * it should be called __ERROR_FAILED, - * for example %G_SPAWN_ERROR_FAILED. In the case of error code - * enumerations that may be extended in future releases, you should - * generally not handle this error code explicitly, but should - * instead treat any unrecognized error code as equivalent to - * FAILED. - * - * ## Comparison of #GError and traditional error handling # {#gerror-comparison} - * - * #GError has several advantages over traditional numeric error codes: - * importantly, tools like - * [gobject-introspection](https://developer.gnome.org/gi/stable/) understand - * #GErrors and convert them to exceptions in bindings; the message includes - * more information than just a code; and use of a domain helps prevent - * misinterpretation of error codes. - * - * #GError has disadvantages though: it requires a memory allocation, and - * formatting the error message string has a performance overhead. This makes it - * unsuitable for use in retry loops where errors are a common case, rather than - * being unusual. For example, using %G_IO_ERROR_WOULD_BLOCK means hitting these - * overheads in the normal control flow. String formatting overhead can be - * eliminated by using g_set_error_literal() in some cases. - * - * These performance issues can be compounded if a function wraps the #GErrors - * returned by the functions it calls: this multiplies the number of allocations - * and string formatting operations. This can be partially mitigated by using - * g_prefix_error(). - * - * ## Rules for use of #GError # {#gerror-rules} - * - * Summary of rules for use of #GError: - * - * - Do not report programming errors via #GError. - * - * - The last argument of a function that returns an error should - * be a location where a #GError can be placed (i.e. `GError **error`). - * If #GError is used with varargs, the `GError**` should be the last - * argument before the `...`. - * - * - The caller may pass %NULL for the `GError**` if they are not interested - * in details of the exact error that occurred. - * - * - If %NULL is passed for the `GError**` argument, then errors should - * not be returned to the caller, but your function should still - * abort and return if an error occurs. That is, control flow should - * not be affected by whether the caller wants to get a #GError. - * - * - If a #GError is reported, then your function by definition had a - * fatal failure and did not complete whatever it was supposed to do. - * If the failure was not fatal, then you handled it and you should not - * report it. If it was fatal, then you must report it and discontinue - * whatever you were doing immediately. - * - * - If a #GError is reported, out parameters are not guaranteed to - * be set to any defined value. - * - * - A `GError*` must be initialized to %NULL before passing its address - * to a function that can report errors. - * - * - #GError structs must not be stack-allocated. - * - * - "Piling up" errors is always a bug. That is, if you assign a - * new #GError to a `GError*` that is non-%NULL, thus overwriting - * the previous error, it indicates that you should have aborted - * the operation instead of continuing. If you were able to continue, - * you should have cleared the previous error with g_clear_error(). - * g_set_error() will complain if you pile up errors. - * - * - By convention, if you return a boolean value indicating success - * then %TRUE means success and %FALSE means failure. Avoid creating - * functions which have a boolean return value and a #GError parameter, - * but where the boolean does something other than signal whether the - * #GError is set. Among other problems, it requires C callers to allocate - * a temporary error. Instead, provide a `gboolean *` out parameter. - * There are functions in GLib itself such as g_key_file_has_key() that - * are hard to use because of this. If %FALSE is returned, the error must - * be set to a non-%NULL value. One exception to this is that in situations - * that are already considered to be undefined behaviour (such as when a - * g_return_val_if_fail() check fails), the error need not be set. - * Instead of checking separately whether the error is set, callers - * should ensure that they do not provoke undefined behaviour, then - * assume that the error will be set on failure. - * - * - A %NULL return value is also frequently used to mean that an error - * occurred. You should make clear in your documentation whether %NULL - * is a valid return value in non-error cases; if %NULL is a valid value, - * then users must check whether an error was returned to see if the - * function succeeded. - * - * - When implementing a function that can report errors, you may want - * to add a check at the top of your function that the error return - * location is either %NULL or contains a %NULL error (e.g. - * `g_return_if_fail (error == NULL || *error == NULL);`). - * - * ## Extended #GError Domains # {#gerror-extended-domains} - * - * Since GLib 2.68 it is possible to extend the #GError type. This is - * done with the G_DEFINE_EXTENDED_ERROR() macro. To create an - * extended #GError type do something like this in the header file: - * |[ - * typedef enum - * { - * MY_ERROR_BAD_REQUEST, - * } MyError; - * #define MY_ERROR (my_error_quark ()) - * GQuark my_error_quark (void); - * int - * my_error_get_parse_error_id (GError *error); - * const char * - * my_error_get_bad_request_details (GError *error); - * ]| - * and in implementation: - * |[ - * typedef struct - * { - * int parse_error_id; - * char *bad_request_details; - * } MyErrorPrivate; - * - * static void - * my_error_private_init (MyErrorPrivate *priv) - * { - * priv->parse_error_id = -1; - * // No need to set priv->bad_request_details to NULL, - * // the struct is initialized with zeros. - * } - * - * static void - * my_error_private_copy (const MyErrorPrivate *src_priv, MyErrorPrivate *dest_priv) - * { - * dest_priv->parse_error_id = src_priv->parse_error_id; - * dest_priv->bad_request_details = g_strdup (src_priv->bad_request_details); - * } - * - * static void - * my_error_private_clear (MyErrorPrivate *priv) - * { - * g_free (priv->bad_request_details); - * } - * - * // This defines the my_error_get_private and my_error_quark functions. - * G_DEFINE_EXTENDED_ERROR (MyError, my_error) - * - * int - * my_error_get_parse_error_id (GError *error) - * { - * MyErrorPrivate *priv = my_error_get_private (error); - * g_return_val_if_fail (priv != NULL, -1); - * return priv->parse_error_id; - * } - * - * const char * - * my_error_get_bad_request_details (GError *error) - * { - * MyErrorPrivate *priv = my_error_get_private (error); - * g_return_val_if_fail (priv != NULL, NULL); - * g_return_val_if_fail (error->code != MY_ERROR_BAD_REQUEST, NULL); - * return priv->bad_request_details; - * } - * - * static void - * my_error_set_bad_request (GError **error, - * const char *reason, - * int error_id, - * const char *details) - * { - * MyErrorPrivate *priv; - * g_set_error (error, MY_ERROR, MY_ERROR_BAD_REQUEST, "Invalid request: %s", reason); - * if (error != NULL && *error != NULL) - * { - * priv = my_error_get_private (error); - * g_return_val_if_fail (priv != NULL, NULL); - * priv->parse_error_id = error_id; - * priv->bad_request_details = g_strdup (details); - * } - * } - * ]| - * An example of use of the error could be: - * |[ - * gboolean - * send_request (GBytes *request, GError **error) - * { - * ParseFailedStatus *failure = validate_request (request); - * if (failure != NULL) - * { - * my_error_set_bad_request (error, failure->reason, failure->error_id, failure->details); - * parse_failed_status_free (failure); - * return FALSE; - * } - * - * return send_one (request, error); - * } - * ]| - * - * Please note that if you are a library author and your library - * exposes an existing error domain, then you can't make this error - * domain an extended one without breaking ABI. This is because - * earlier it was possible to create an error with this error domain - * on the stack and then copy it with g_error_copy(). If the new - * version of your library makes the error domain an extended one, - * then g_error_copy() called by code that allocated the error on the - * stack will try to copy more data than it used to, which will lead - * to undefined behavior. You must not stack-allocate errors with an - * extended error domain, and it is bad practice to stack-allocate any - * other #GErrors. - * - * Extended error domains in unloadable plugins/modules are not - * supported. - */ - #include "config.h" #include "gvalgrind.h" @@ -581,9 +106,9 @@ error_domain_register (GQuark error_quark, * g_error_domain_register_static: * @error_type_name: static string to create a #GQuark from * @error_type_private_size: size of the private error data in bytes - * @error_type_init: function initializing fields of the private error data - * @error_type_copy: function copying fields of the private error data - * @error_type_clear: function freeing fields of the private error data + * @error_type_init: (scope forever): function initializing fields of the private error data + * @error_type_copy: (scope forever): function copying fields of the private error data + * @error_type_clear: (scope forever): function freeing fields of the private error data * * This function registers an extended #GError domain. * @@ -634,9 +159,9 @@ g_error_domain_register_static (const char *error_type_name, * g_error_domain_register: * @error_type_name: string to create a #GQuark from * @error_type_private_size: size of the private error data in bytes - * @error_type_init: function initializing fields of the private error data - * @error_type_copy: function copying fields of the private error data - * @error_type_clear: function freeing fields of the private error data + * @error_type_init: (scope forever): function initializing fields of the private error data + * @error_type_copy: (scope forever): function copying fields of the private error data + * @error_type_clear: (scope forever): function freeing fields of the private error data * * This function registers an extended #GError domain. * @error_type_name will be duplicated. Otherwise does the same as @@ -1106,7 +631,7 @@ g_prefix_error (GError **err, /** * g_prefix_error_literal: - * @err: (allow-none): a return location for a #GError, or %NULL + * @err: (inout) (nullable) (optional): a return location for a #GError, or %NULL * @prefix: string to prefix @err with * * Prefixes @prefix to an existing error message. If @err or *@err is diff --git a/glib/gfileutils.c b/glib/gfileutils.c index 0918a65..2801777 100644 --- a/glib/gfileutils.c +++ b/glib/gfileutils.c @@ -59,43 +59,6 @@ #include "glibintl.h" -/** - * SECTION:fileutils - * @title: File Utilities - * @short_description: various file-related functions - * - * Do not use these APIs unless you are porting a POSIX application to Windows. - * A more high-level file access API is provided as GIO — see the documentation - * for #GFile. - * - * There is a group of functions which wrap the common POSIX functions - * dealing with filenames (g_open(), g_rename(), g_mkdir(), g_stat(), - * g_unlink(), g_remove(), g_fopen(), g_freopen()). The point of these - * wrappers is to make it possible to handle file names with any Unicode - * characters in them on Windows without having to use ifdefs and the - * wide character API in the application code. - * - * On some Unix systems, these APIs may be defined as identical to their POSIX - * counterparts. For this reason, you must check for and include the necessary - * header files (such as `fcntl.h`) before using functions like g_creat(). You - * must also define the relevant feature test macros. - * - * The pathname argument should be in the GLib file name encoding. - * On POSIX this is the actual on-disk encoding which might correspond - * to the locale settings of the process (or the `G_FILENAME_ENCODING` - * environment variable), or not. - * - * On Windows the GLib file name encoding is UTF-8. Note that the - * Microsoft C library does not use UTF-8, but has separate APIs for - * current system code page and wide characters (UTF-16). The GLib - * wrappers call the wide character API if present (on modern Windows - * systems), otherwise convert to/from the system code page. - * - * Another group of functions allows to open and read directories - * in the GLib file name encoding. These are g_dir_open(), - * g_dir_read_name(), g_dir_rewind(), g_dir_close(). - */ - /** * GFileError: * @G_FILE_ERROR_EXIST: Operation not permitted; only the owner of @@ -746,14 +709,19 @@ get_contents_stdio (const gchar *filename, if (tmp == NULL) { + char *display_size = g_format_size_full (total_allocated, G_FORMAT_SIZE_LONG_FORMAT); display_filename = g_filename_display_name (filename); g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, - g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file “%s”", "Could not allocate %lu bytes to read file “%s”", (gulong)total_allocated), - (gulong) total_allocated, - display_filename); + /* Translators: the first %s contains the file size + * (already formatted with units), and the second %s + * contains the file name */ + _("Could not allocate %s to read file “%s”"), + display_size, + display_filename); g_free (display_filename); + g_free (display_size); goto error; } @@ -830,7 +798,19 @@ get_contents_regfile (const gchar *filename, gsize size; gsize alloc_size; gchar *display_filename; - + + if ((G_MAXOFFSET >= G_MAXSIZE) && (stat_buf->st_size > (goffset) (G_MAXSIZE - 1))) + { + display_filename = g_filename_display_name (filename); + g_set_error (error, + G_FILE_ERROR, + G_FILE_ERROR_FAILED, + _("File “%s” is too large"), + display_filename); + g_free (display_filename); + goto error; + } + size = stat_buf->st_size; alloc_size = size + 1; @@ -838,14 +818,19 @@ get_contents_regfile (const gchar *filename, if (buf == NULL) { + char *display_size = g_format_size_full (alloc_size, G_FORMAT_SIZE_LONG_FORMAT); display_filename = g_filename_display_name (filename); g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM, - g_dngettext (GETTEXT_PACKAGE, "Could not allocate %lu byte to read file “%s”", "Could not allocate %lu bytes to read file “%s”", (gulong)alloc_size), - (gulong) alloc_size, - display_filename); + /* Translators: the first %s contains the file size + * (already formatted with units), and the second %s + * contains the file name */ + _("Could not allocate %s to read file “%s”"), + display_size, + display_filename); g_free (display_filename); + g_free (display_size); goto error; } @@ -891,7 +876,7 @@ get_contents_regfile (const gchar *filename, return TRUE; - error: +error: close (fd); @@ -1161,7 +1146,7 @@ truncate_file (int fd, if (error != NULL) set_file_error (error, dest_file, - "Failed to write file “%s”: ftruncate() failed: %s", + _("Failed to write file “%s”: ftruncate() failed: %s"), saved_errno); return FALSE; } diff --git a/glib/ggettext.c b/glib/ggettext.c index 71654fb..21933d9 100644 --- a/glib/ggettext.c +++ b/glib/ggettext.c @@ -462,57 +462,6 @@ g_dngettext (const gchar *domain, return dngettext (domain, msgid, msgid_plural, n); } - -/** - * SECTION:i18n - * @title: Internationalization - * @short_description: gettext support macros - * @see_also: the gettext manual - * - * GLib doesn't force any particular localization method upon its users. - * But since GLib itself is localized using the gettext() mechanism, it seems - * natural to offer the de-facto standard gettext() support macros in an - * easy-to-use form. - * - * In order to use these macros in an application, you must include - * ``. For use in a library, you must include - * `` - * after defining the %GETTEXT_PACKAGE macro suitably for your library: - * |[ - * #define GETTEXT_PACKAGE "gtk20" - * #include - * ]| - * For an application, note that you also have to call bindtextdomain(), - * bind_textdomain_codeset(), textdomain() and setlocale() early on in your - * main() to make gettext() work. For example: - * |[ - * #include - * #include - * - * int - * main (int argc, char **argv) - * { - * setlocale (LC_ALL, ""); - * bindtextdomain (GETTEXT_PACKAGE, DATADIR "/locale"); - * bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - * textdomain (GETTEXT_PACKAGE); - * - * // Rest of your application. - * } - * ]| - * where `DATADIR` is as typically provided by automake or Meson. - * - * For a library, you only have to call bindtextdomain() and - * bind_textdomain_codeset() in your initialization function. If your library - * doesn't have an initialization function, you can call the functions before - * the first translated message. - * - * The - * [gettext manual](http://www.gnu.org/software/gettext/manual/gettext.html#Maintainers) - * covers details of how to integrate gettext into a project’s build system and - * workflow. - */ - /** * _: * @String: the string to be translated diff --git a/glib/ghash.c b/glib/ghash.c index 500d503..e8d8f17 100644 --- a/glib/ghash.c +++ b/glib/ghash.c @@ -63,65 +63,6 @@ #pragma GCC diagnostic ignored "-Wduplicated-branches" #endif -/** - * SECTION:hash_tables - * @title: Hash Tables - * @short_description: associations between keys and values so that - * given a key the value can be found quickly - * - * A #GHashTable provides associations between keys and values which is - * optimized so that given a key, the associated value can be found, - * inserted or removed in amortized O(1). All operations going through - * each element take O(n) time (list all keys/values, table resize, etc.). - * - * Note that neither keys nor values are copied when inserted into the - * #GHashTable, so they must exist for the lifetime of the #GHashTable. - * This means that the use of static strings is OK, but temporary - * strings (i.e. those created in buffers and those returned by GTK - * widgets) should be copied with g_strdup() before being inserted. - * - * If keys or values are dynamically allocated, you must be careful to - * ensure that they are freed when they are removed from the - * #GHashTable, and also when they are overwritten by new insertions - * into the #GHashTable. It is also not advisable to mix static strings - * and dynamically-allocated strings in a #GHashTable, because it then - * becomes difficult to determine whether the string should be freed. - * - * To create a #GHashTable, use g_hash_table_new(). - * - * To insert a key and value into a #GHashTable, use - * g_hash_table_insert(). - * - * To look up a value corresponding to a given key, use - * g_hash_table_lookup() and g_hash_table_lookup_extended(). - * - * g_hash_table_lookup_extended() can also be used to simply - * check if a key is present in the hash table. - * - * To remove a key and value, use g_hash_table_remove(). - * - * To call a function for each key and value pair use - * g_hash_table_foreach() or use an iterator to iterate over the - * key/value pairs in the hash table, see #GHashTableIter. The iteration order - * of a hash table is not defined, and you must not rely on iterating over - * keys/values in the same order as they were inserted. - * - * To destroy a #GHashTable use g_hash_table_destroy(). - * - * A common use-case for hash tables is to store information about a - * set of keys, without associating any particular value with each - * key. GHashTable optimizes one way of doing so: If you store only - * key-value pairs where key == value, then GHashTable does not - * allocate memory to store the values, which can be a considerable - * space saving, if your set is large. The functions - * g_hash_table_add() and g_hash_table_contains() are designed to be - * used when using #GHashTable this way. - * - * #GHashTable is not designed to be statically initialised with keys and - * values known at compile time. To build a static hash table, use a tool such - * as [gperf](https://www.gnu.org/software/gperf/). - */ - /** * GHashTable: * @@ -1029,7 +970,7 @@ g_hash_table_ensure_keyval_fits (GHashTable *hash_table, gpointer key, gpointer * as its first parameter, and the user-provided key to check against as * its second. * - * Returns: a new #GHashTable + * Returns: (transfer full): a new #GHashTable */ GHashTable * g_hash_table_new (GHashFunc hash_func, @@ -1062,7 +1003,7 @@ g_hash_table_new (GHashFunc hash_func, * calling g_hash_table_remove_all() before releasing the last reference using * g_hash_table_unref(). * - * Returns: a new #GHashTable + * Returns: (transfer full): a new #GHashTable */ GHashTable * g_hash_table_new_full (GHashFunc hash_func, @@ -1160,7 +1101,7 @@ g_hash_table_iter_init (GHashTableIter *iter, /** * g_hash_table_iter_next: * @iter: an initialized #GHashTableIter - * @key: (out) (optional): a location to store the key + * @key: (out) (optional) (nullable): a location to store the key * @value: (out) (optional) (nullable): a location to store the value * * Advances @iter and retrieves the key and/or value that are now @@ -1213,7 +1154,7 @@ g_hash_table_iter_next (GHashTableIter *iter, * * Returns the #GHashTable associated with @iter. * - * Returns: the #GHashTable associated with @iter. + * Returns: (transfer none): the #GHashTable associated with @iter. * * Since: 2.16 */ @@ -1457,7 +1398,7 @@ g_hash_table_iter_steal (GHashTableIter *iter) * Atomically increments the reference count of @hash_table by one. * This function is MT-safe and may be called from any thread. * - * Returns: the passed in #GHashTable + * Returns: (transfer full): the passed in #GHashTable * * Since: 2.10 */ @@ -1473,7 +1414,7 @@ g_hash_table_ref (GHashTable *hash_table) /** * g_hash_table_unref: - * @hash_table: a valid #GHashTable + * @hash_table: (transfer full): a valid #GHashTable * * Atomically decrements the reference count of @hash_table by one. * If the reference count drops to 0, all keys and values will be @@ -2078,7 +2019,7 @@ g_hash_table_foreach_remove_or_steal (GHashTable *hash_table, /** * g_hash_table_foreach_remove: * @hash_table: a #GHashTable - * @func: the function to call for each key/value pair + * @func: (scope call): the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each key/value pair in the @@ -2106,7 +2047,7 @@ g_hash_table_foreach_remove (GHashTable *hash_table, /** * g_hash_table_foreach_steal: * @hash_table: a #GHashTable - * @func: the function to call for each key/value pair + * @func: (scope call): the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each key/value pair in the @@ -2133,7 +2074,7 @@ g_hash_table_foreach_steal (GHashTable *hash_table, /** * g_hash_table_foreach: * @hash_table: a #GHashTable - * @func: the function to call for each key/value pair + * @func: (scope call): the function to call for each key/value pair * @user_data: user data to pass to the function * * Calls the given function for each of the key/value pairs in the @@ -2184,7 +2125,7 @@ g_hash_table_foreach (GHashTable *hash_table, /** * g_hash_table_find: * @hash_table: a #GHashTable - * @predicate: function to test the key/value pairs for a certain property + * @predicate: (scope call): function to test the key/value pairs for a certain property * @user_data: user data to pass to the function * * Calls the given function for key/value pairs in the #GHashTable @@ -2611,6 +2552,50 @@ g_int_hash (gconstpointer v) return *(const gint*) v; } +/** + * g_uint_equal: + * @v1: (not nullable): a pointer to a #guint key + * @v2: (not nullable): a pointer to a #guint key to compare with @v1 + * + * Compares the two #guint values being pointed to and returns + * %TRUE if they are equal. + * It can be passed to g_hash_table_new() as the @key_equal_func + * parameter, when using non-%NULL pointers to integers as keys in a + * #GHashTable. + * + * Note that this function acts on pointers to #guint, not on #guint + * directly: if your hash table's keys are of the form + * `GUINT_TO_POINTER (n)`, use g_direct_equal() instead. + * + * Returns: %TRUE if the two keys match. + */ +gboolean +g_uint_equal (gconstpointer v1, + gconstpointer v2) +{ + return *((const guint *) v1) == *((const guint *) v2); +} + +/** + * g_uint_hash: + * @v: (not nullable): a pointer to a #guint key + * + * Converts a pointer to a #guint to a hash value. + * It can be passed to g_hash_table_new() as the @hash_func parameter, + * when using non-%NULL pointers to integer values as keys in a #GHashTable. + * + * Note that this function acts on pointers to #guint, not on #guint + * directly: if your hash table's keys are of the form + * `GUINT_TO_POINTER (n)`, use g_direct_hash() instead. + * + * Returns: a hash value corresponding to the key. + */ +guint +g_uint_hash (gconstpointer v) +{ + return *(const guint *) v; +} + /** * g_int64_equal: * @v1: (not nullable): a pointer to a #gint64 key diff --git a/glib/ghmac.c b/glib/ghmac.c index 7ad28d6..97e2fff 100644 --- a/glib/ghmac.c +++ b/glib/ghmac.c @@ -37,9 +37,7 @@ /** - * SECTION:hmac - * @title: Secure HMAC Digests - * @short_description: computes the HMAC for data + * GHmac: * * HMACs should be used when producing a cookie or hash based on data * and a key. Simple mechanisms for using SHA1 and other algorithms to @@ -53,6 +51,11 @@ * * Support for HMAC Digests has been added in GLib 2.30, and support for SHA-512 * in GLib 2.42. Support for SHA-384 was added in GLib 2.52. + * + * To create a new `GHmac`, use [ctor@GLib.Hmac.new]. To free a `GHmac`, use + * [method@GLib.Hmac.unref]. + * + * Since: 2.30 */ struct _GHmac @@ -64,7 +67,7 @@ struct _GHmac }; /** - * g_hmac_new: + * g_hmac_new: (constructor) * @digest_type: the desired type of digest * @key: (array length=key_len): the key for the HMAC * @key_len: the length of the keys @@ -86,7 +89,7 @@ struct _GHmac * Support for digests of type %G_CHECKSUM_SHA512 has been added in GLib 2.42. * Support for %G_CHECKSUM_SHA384 was added in GLib 2.52. * - * Returns: the newly created #GHmac, or %NULL. + * Returns: (nullable) (transfer full): the newly created #GHmac, or %NULL. * Use g_hmac_unref() to free the memory allocated by it. * * Since: 2.30 @@ -177,7 +180,7 @@ g_hmac_new (GChecksumType digest_type, * g_hmac_get_string() or g_hmac_get_digest(), the copied * HMAC will be closed as well. * - * Returns: the copy of the passed #GHmac. Use g_hmac_unref() + * Returns: (transfer full): the copy of the passed #GHmac. Use g_hmac_unref() * when finished using it. * * Since: 2.30 @@ -206,7 +209,7 @@ g_hmac_copy (const GHmac *hmac) * * This function is MT-safe and may be called from any thread. * - * Returns: the passed in #GHmac. + * Returns: (transfer full): the passed in #GHmac. * * Since: 2.30 **/ @@ -222,7 +225,7 @@ g_hmac_ref (GHmac *hmac) /** * g_hmac_unref: - * @hmac: a #GHmac + * @hmac: (transfer full): a #GHmac * * Atomically decrements the reference count of @hmac by one. * diff --git a/glib/ghmac.h b/glib/ghmac.h index 346b451..79380b6 100644 --- a/glib/ghmac.h +++ b/glib/ghmac.h @@ -30,15 +30,6 @@ G_BEGIN_DECLS -/** - * GHmac: - * - * An opaque structure representing a HMAC operation. - * To create a new GHmac, use g_hmac_new(). To free - * a GHmac, use g_hmac_unref(). - * - * Since: 2.30 - */ typedef struct _GHmac GHmac; GLIB_AVAILABLE_IN_2_30 diff --git a/glib/ghook.c b/glib/ghook.c index 3db2201..2c38dbc 100644 --- a/glib/ghook.c +++ b/glib/ghook.c @@ -38,16 +38,6 @@ #include "gtestutils.h" #include "gslice.h" -/** - * SECTION:hooks - * @title: Hook Functions - * @short_description: support for manipulating lists of hook functions - * - * The #GHookList, #GHook and their related functions provide support for - * lists of hook functions. Functions can be added and removed from the lists, - * and the list of hook functions can be invoked. - */ - /** * GHookList: * @seq_id: the next free #GHook id @@ -597,7 +587,7 @@ g_hook_list_invoke_check (GHookList *hook_list, * @may_recurse: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped - * @marshaller: the function to call for each #GHook + * @marshaller: (scope call): the function to call for each #GHook * @marshal_data: data to pass to @marshaller * * Calls a function on each valid #GHook and destroys it if the @@ -647,7 +637,7 @@ g_hook_list_marshal_check (GHookList *hook_list, * @may_recurse: %TRUE if hooks which are currently running * (e.g. in another thread) are considered valid. If set to %FALSE, * these are skipped - * @marshaller: the function to call for each #GHook + * @marshaller: (scope call): the function to call for each #GHook * @marshal_data: data to pass to @marshaller * * Calls a function on each valid #GHook. @@ -805,7 +795,7 @@ g_hook_get (GHookList *hook_list, * @hook_list: a #GHookList * @need_valids: %TRUE if #GHook elements which have been destroyed * should be skipped - * @func: the function to call for each #GHook, which should return + * @func: (scope call): the function to call for each #GHook, which should return * %TRUE when the #GHook has been found * @data: the data to pass to @func * @@ -982,7 +972,7 @@ g_hook_find_func_data (GHookList *hook_list, * g_hook_insert_sorted: * @hook_list: a #GHookList * @hook: the #GHook to insert - * @func: the comparison function used to sort the #GHook elements + * @func: (scope call): the comparison function used to sort the #GHook elements * * Inserts a #GHook into a #GHookList, sorted by the given function. */ diff --git a/glib/ghostutils.c b/glib/ghostutils.c index db6d687..fbc9b11 100644 --- a/glib/ghostutils.c +++ b/glib/ghostutils.c @@ -41,24 +41,6 @@ #endif -/** - * SECTION:ghostutils - * @short_description: Internet hostname utilities - * - * Functions for manipulating internet hostnames; in particular, for - * converting between Unicode and ASCII-encoded forms of - * Internationalized Domain Names (IDNs). - * - * The - * [Internationalized Domain Names for Applications (IDNA)](http://www.ietf.org/rfc/rfc3490.txt) - * standards allow for the use - * of Unicode domain names in applications, while providing - * backward-compatibility with the old ASCII-only DNS, by defining an - * ASCII-Compatible Encoding of any given Unicode name, which can be - * used with non-IDN-aware applications and protocols. (For example, - * "Παν語.org" maps to "xn--4wa8awb4637h.org".) - **/ - #define IDNA_ACE_PREFIX "xn--" #define IDNA_ACE_PREFIX_LEN 4 diff --git a/glib/giochannel.c b/glib/giochannel.c index 7572c47..b44fff3 100644 --- a/glib/giochannel.c +++ b/glib/giochannel.c @@ -43,56 +43,45 @@ #include "glibintl.h" -/** - * SECTION:iochannels - * @title: IO Channels - * @short_description: portable support for using files, pipes and sockets - * @see_also: g_io_add_watch(), g_io_add_watch_full(), g_source_remove(), - * #GMainLoop - * - * The #GIOChannel data type aims to provide a portable method for - * using file descriptors, pipes, and sockets, and integrating them - * into the [main event loop][glib-The-Main-Event-Loop]. Currently, - * full support is available on UNIX platforms, support for Windows - * is only partially complete. - * - * To create a new #GIOChannel on UNIX systems use - * g_io_channel_unix_new(). This works for plain file descriptors, - * pipes and sockets. Alternatively, a channel can be created for a - * file in a system independent manner using g_io_channel_new_file(). - * - * Once a #GIOChannel has been created, it can be used in a generic - * manner with the functions g_io_channel_read_chars(), - * g_io_channel_write_chars(), g_io_channel_seek_position(), and - * g_io_channel_shutdown(). - * - * To add a #GIOChannel to the [main event loop][glib-The-Main-Event-Loop], - * use g_io_add_watch() or g_io_add_watch_full(). Here you specify which - * events you are interested in on the #GIOChannel, and provide a - * function to be called whenever these events occur. - * - * #GIOChannel instances are created with an initial reference count of 1. - * g_io_channel_ref() and g_io_channel_unref() can be used to - * increment or decrement the reference count respectively. When the - * reference count falls to 0, the #GIOChannel is freed. (Though it - * isn't closed automatically, unless it was created using - * g_io_channel_new_file().) Using g_io_add_watch() or - * g_io_add_watch_full() increments a channel's reference count. - * - * The new functions g_io_channel_read_chars(), - * g_io_channel_read_line(), g_io_channel_read_line_string(), - * g_io_channel_read_to_end(), g_io_channel_write_chars(), - * g_io_channel_seek_position(), and g_io_channel_flush() should not be - * mixed with the deprecated functions g_io_channel_read(), - * g_io_channel_write(), and g_io_channel_seek() on the same channel. - **/ - /** * GIOChannel: * - * A data structure representing an IO Channel. The fields should be - * considered private and should only be accessed with the following - * functions. + * The `GIOChannel` data type aims to provide a portable method for + * using file descriptors, pipes, and sockets, and integrating them + * into the main event loop (see [struct@GLib.MainContext]). Currently, + * full support is available on UNIX platforms; support for Windows + * is only partially complete. + * + * To create a new `GIOChannel` on UNIX systems use + * [ctor@GLib.IOChannel.unix_new]. This works for plain file descriptors, + * pipes and sockets. Alternatively, a channel can be created for a + * file in a system independent manner using [ctor@GLib.IOChannel.new_file]. + * + * Once a `GIOChannel` has been created, it can be used in a generic + * manner with the functions [method@GLib.IOChannel.read_chars], + * [method@GLib.IOChannel.write_chars], [method@GLib.IOChannel.seek_position], + * and [method@GLib.IOChannel.shutdown]. + * + * To add a `GIOChannel` to the main event loop, use [func@GLib.io_add_watch] or + * [func@GLib.io_add_watch_full]. Here you specify which events you are + * interested in on the `GIOChannel`, and provide a function to be called + * whenever these events occur. + * + * `GIOChannel` instances are created with an initial reference count of 1. + * [method@GLib.IOChannel.ref] and [method@GLib.IOChannel.unref] can be used to + * increment or decrement the reference count respectively. When the + * reference count falls to 0, the `GIOChannel` is freed. (Though it + * isn’t closed automatically, unless it was created using + * [ctor@GLib.IOChannel.new_file].) Using [func@GLib.io_add_watch] or + * [func@GLib.io_add_watch_full] increments a channel’s reference count. + * + * The new functions [method@GLib.IOChannel.read_chars], + * [method@GLib.IOChannel.read_line], [method@GLib.IOChannel.read_line_string], + * [method@GLib.IOChannel.read_to_end], [method@GLib.IOChannel.write_chars], + * [method@GLib.IOChannel.seek_position], and [method@GLib.IOChannel.flush] + * should not be mixed with the deprecated functions + * [method@GLib.IOChannel.read], [method@GLib.IOChannel.write], and + * [method@GLib.IOChannel.seek] on the same channel. **/ /** @@ -105,7 +94,7 @@ * various functions such as g_io_channel_write_chars() to * write raw bytes to the channel. Encoding and buffering * issues are dealt with at a higher level. - * @io_seek: (optional) seeks the channel. This is called from + * @io_seek: (optional): seeks the channel. This is called from * g_io_channel_seek() on channels that support it. * @io_close: closes the channel. This is called from * g_io_channel_close() after flushing the buffers. diff --git a/glib/giowin32.c b/glib/giowin32.c index f0e025d..ecc337a 100644 --- a/glib/giowin32.c +++ b/glib/giowin32.c @@ -1661,7 +1661,7 @@ g_io_channel_new_file (const gchar *filename, mode_num |= MODE_PLUS; break; } - /* Fall through */ + G_GNUC_FALLTHROUGH; default: g_warning ("Invalid GIOFileMode %s.", mode); return NULL; diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index d08a485..637ac9c 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -74,23 +74,22 @@ /** - * SECTION:gkeyfile - * @title: Key-value file parser - * @short_description: parses .ini-like config files + * GKeyFile: * - * #GKeyFile lets you parse, edit or create files containing groups of + * `GKeyFile` parses .ini-like config files. + * + * `GKeyFile` lets you parse, edit or create files containing groups of * key-value pairs, which we call "key files" for lack of a better name. * Several freedesktop.org specifications use key files now, e.g the * [Desktop Entry Specification](http://freedesktop.org/Standards/desktop-entry-spec) - * and the - * [Icon Theme Specification](http://freedesktop.org/Standards/icon-theme-spec). + * and the [Icon Theme Specification](http://freedesktop.org/Standards/icon-theme-spec). * * The syntax of key files is described in detail in the * [Desktop Entry Specification](http://freedesktop.org/Standards/desktop-entry-spec), - * here is a quick summary: Key files - * consists of groups of key-value pairs, interspersed with comments. + * here is a quick summary: Key files consists of groups of key-value pairs, interspersed + * with comments. * - * |[ + * ```txt * # this is just an example * # there can be comments before the first group * @@ -103,14 +102,13 @@ * Welcome[de]=Hallo * Welcome[fr_FR]=Bonjour * Welcome[it]=Ciao - * Welcome[be@latin]=Hello * * [Another Group] * * Numbers=2;20;-200;0 * * Booleans=true;false;true;true - * ]| + * ``` * * Lines beginning with a '#' and blank lines are considered comments. * @@ -118,15 +116,13 @@ * in '[' and ']', and ended implicitly by the start of the next group or * the end of the file. Each key-value pair must be contained in a group. * - * Key-value pairs generally have the form `key=value`, with the - * exception of localized strings, which have the form - * `key[locale]=value`, with a locale identifier of the - * form `lang_COUNTRY@MODIFIER` where `COUNTRY` and `MODIFIER` - * are optional. - * Space before and after the '=' character are ignored. Newline, tab, - * carriage return and backslash characters in value are escaped as \n, - * \t, \r, and \\\\, respectively. To preserve leading spaces in values, - * these can also be escaped as \s. + * Key-value pairs generally have the form `key=value`, with the exception + * of localized strings, which have the form `key[locale]=value`, with a + * locale identifier of the form `lang_COUNTRY@MODIFIER` where `COUNTRY` + * and `MODIFIER` are optional. Space before and after the '=' character + * are ignored. Newline, tab, carriage return and backslash characters in + * value are escaped as `\n`, `\t`, `\r`, and `\\\\`, respectively. To preserve + * leading spaces in values, these can also be escaped as `\s`. * * Key files can store strings (possibly with localized variants), integers, * booleans and lists of these. Lists are separated by a separator character, @@ -153,15 +149,14 @@ * * Note that in contrast to the * [Desktop Entry Specification](http://freedesktop.org/Standards/desktop-entry-spec), - * groups in key files may contain the same - * key multiple times; the last entry wins. Key files may also contain - * multiple groups with the same name; they are merged together. - * Another difference is that keys and group names in key files are not + * groups in key files may contain the same key multiple times; the last entry wins. + * Key files may also contain multiple groups with the same name; they are merged + * together. Another difference is that keys and group names in key files are not * restricted to ASCII characters. * * Here is an example of loading a key file and reading a value: * - * |[ + * ```c * g_autoptr(GError) error = NULL; * g_autoptr(GKeyFile) key_file = g_key_file_new (); * @@ -184,11 +179,11 @@ * // Fall back to a default value. * val = g_strdup ("default-value"); * } - * ]| + * ``` * * Here is an example of creating and saving a key file: * - * |[ + * ```c * g_autoptr(GKeyFile) key_file = g_key_file_new (); * const gchar *val = …; * g_autoptr(GError) error = NULL; @@ -211,7 +206,7 @@ * return; * } * g_autoptr(GBytes) bytes = g_bytes_new_take (g_steal_pointer (&data), data_len); - * ]| + * ``` */ /** @@ -499,12 +494,6 @@ typedef struct _GKeyFileGroup GKeyFileGroup; -/** - * GKeyFile: - * - * The GKeyFile struct contains only private data - * and should not be accessed directly. - */ struct _GKeyFile { GList *groups; @@ -4351,7 +4340,6 @@ g_key_file_parse_value_as_string (GKeyFile *key_file, break; case '\0': - g_clear_error (error); g_set_error_literal (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains escape character " @@ -4374,25 +4362,11 @@ g_key_file_parse_value_as_string (GKeyFile *key_file, sequence[1] = *p; sequence[2] = '\0'; - /* FIXME: This should be a fatal error, but there was a - * bug which prevented that being reported for a long - * time, so a lot of applications and in-the-field key - * files use invalid escape sequences without anticipating - * problems. For now (GLib 2.78), message about it; in - * future, the behaviour may become fatal again. - * - * The previous behaviour was to set the #GError but not - * return failure from the function, so the caller could - * explicitly check for invalid escapes, but also ignore - * the error if they want. This is not how #GError is - * meant to be used, but the #GKeyFile code is very old. - * - * See https://gitlab.gnome.org/GNOME/glib/-/issues/3098 */ - g_clear_error (error); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, _("Key file contains invalid escape " "sequence “%s”"), sequence); + goto error; } } break; diff --git a/glib/glib-autocleanups.h b/glib/glib-autocleanups.h index 6adf232..68be87c 100644 --- a/glib/glib-autocleanups.h +++ b/glib/glib-autocleanups.h @@ -23,6 +23,8 @@ #error "Only can be included directly." #endif +#ifndef __GI_SCANNER__ + static inline void g_autoptr_cleanup_generic_gfree (void *p) { @@ -105,3 +107,5 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (GPathBuf, g_path_buf_free) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GPathBuf, g_path_buf_clear) G_GNUC_END_IGNORE_DEPRECATIONS + +#endif /* __GI_SCANNER__ */ diff --git a/glib/glib-init.c b/glib/glib-init.c index 933f891..7d4a4d5 100644 --- a/glib/glib-init.c +++ b/glib/glib-init.c @@ -26,6 +26,7 @@ #include "gtypes.h" #include "gutils.h" /* for GDebugKey */ #include "gconstructor.h" +#include "gconstructorprivate.h" #include "gmem.h" /* for g_mem_gc_friendly */ #include @@ -448,32 +449,60 @@ DllMain (HINSTANCE hinstDLL, return TRUE; } -#elif defined(G_HAS_CONSTRUCTORS) /* && G_PLATFORM_WIN32 && GLIB_STATIC_COMPILATION */ -#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA -#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(glib_init_ctor) -#endif -#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA -#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(glib_init_dtor) +#else + +#ifndef G_HAS_CONSTRUCTORS +#error static compilation on Windows requires constructor support #endif -G_DEFINE_CONSTRUCTOR (glib_init_ctor) +#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(glib_priv_constructor) +#endif + +static gboolean tls_callback_invoked; + +G_DEFINE_CONSTRUCTOR (glib_priv_constructor) static void -glib_init_ctor (void) +glib_priv_constructor (void) { glib_win32_init (); + + if (!tls_callback_invoked) + g_critical ("TLS callback not invoked"); } -G_DEFINE_DESTRUCTOR (glib_init_dtor) +#ifndef G_HAS_TLS_CALLBACKS +#error static compilation on Windows requires TLS callbacks support +#endif -static void -glib_init_dtor (void) +G_DEFINE_TLS_CALLBACK (glib_priv_tls_callback) + +static void NTAPI +glib_priv_tls_callback (LPVOID hinstance, + DWORD reason, + LPVOID reserved) { - glib_win32_deinit (FALSE); + switch (reason) + { + case DLL_PROCESS_ATTACH: + glib_dll = hinstance; + tls_callback_invoked = TRUE; + break; + case DLL_THREAD_DETACH: +#ifdef THREADS_WIN32 + g_thread_win32_thread_detach (); +#endif + break; + case DLL_PROCESS_DETACH: + glib_win32_deinit (reserved == NULL); + break; + + default: + break; + } } -#else /* G_PLATFORM_WIN32 && GLIB_STATIC_COMPILATION && !G_HAS_CONSTRUCTORS */ -#error Your platform/compiler is missing constructor support #endif /* GLIB_STATIC_COMPILATION */ #elif defined(G_HAS_CONSTRUCTORS) /* && !G_PLATFORM_WIN32 */ diff --git a/glib/glib-private.c b/glib/glib-private.c index 9f4887a..15dbc66 100644 --- a/glib/glib-private.c +++ b/glib/glib-private.c @@ -23,6 +23,8 @@ #include "glib-private.h" #include "glib-init.h" +#include "gutilsprivate.h" +#include "gdatasetprivate.h" #ifdef USE_INVALID_PARAMETER_HANDLER #include @@ -35,10 +37,10 @@ * Do not call this function; it is used to share private * API between glib, gobject, and gio. */ -GLibPrivateVTable * +const GLibPrivateVTable * glib__private__ (void) { - static GLibPrivateVTable table = { + static const GLibPrivateVTable table = { g_wakeup_new, g_wakeup_free, g_wakeup_get_pollfd, @@ -71,6 +73,10 @@ glib__private__ (void) g_find_program_for_path, g_uri_get_default_scheme_port, + + g_set_prgname_once, + + g_datalist_id_update_atomic, }; return &table; diff --git a/glib/glib-private.h b/glib/glib-private.h index f49e38f..c24b59d 100644 --- a/glib/glib-private.h +++ b/glib/glib-private.h @@ -23,6 +23,7 @@ #include #include "gwakeup.h" #include "gstdioprivate.h" +#include "gdatasetprivate.h" /* gcc defines __SANITIZE_ADDRESS__, clang sets the address_sanitizer * feature flag. @@ -37,14 +38,63 @@ /* * %_GLIB_ADDRESS_SANITIZER: * - * Private macro defined if the AddressSanitizer is in use. + * Private macro defined if the AddressSanitizer is in use by GLib itself. */ #define _GLIB_ADDRESS_SANITIZER #include +/* If GLib itself is not compiled with ASAN sanitizer we may still want to + * control it in case it's linked by the loading application, so we need to + * do this check dynamically. + * However MinGW doesn't support weak attribute properly (even if it advertises + * it), so we ignore it in such case since it's not convenient to go through + * dlsym(). + * Under MSVC we could use alternatename, but it doesn't seem to be as reliable + * as we'd like: https://stackoverflow.com/a/11529277/210151 and + * https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024 + */ +#elif defined (G_OS_UNIX) && !defined (__APPLE__) && g_macro__has_attribute (weak) + +#define HAS_DYNAMIC_ASAN_LOADING + +void __lsan_enable (void) __attribute__ ((weak)); +void __lsan_disable (void) __attribute__ ((weak)); +void __lsan_ignore_object (const void *p) __attribute__ ((weak)); + #endif +/** + * G_CONTAINER_OF: + * @ptr: a pointer to a member @field of type @type. + * @type: the type of the container in which @field is embedded. + * @field: the name of the field in @type. + * + * Casts away constness of @ptr. + * + * Returns: a pointer to the container, so that "&(@container)->field == (@ptr)" holds. + */ +#define G_CONTAINER_OF(ptr, type, field) ((type *) G_STRUCT_MEMBER_P (ptr, -G_STRUCT_OFFSET (type, field))) + +/* + * g_leak_sanitizer_is_supported: + * + * Checks at runtime if LeakSanitizer is currently supported by the running + * binary. This may imply that GLib itself is not compiled with sanitizer + * but that the loading program is. + */ +static inline gboolean +g_leak_sanitizer_is_supported (void) +{ +#if defined (_GLIB_ADDRESS_SANITIZER) + return TRUE; +#elif defined (HAS_DYNAMIC_ASAN_LOADING) + return __lsan_enable != NULL && __lsan_ignore_object != NULL; +#else + return FALSE; +#endif +} + /* * g_ignore_leak: * @p: any pointer @@ -57,9 +107,12 @@ static inline void g_ignore_leak (gconstpointer p) { -#ifdef _GLIB_ADDRESS_SANITIZER +#if defined (_GLIB_ADDRESS_SANITIZER) if (p != NULL) __lsan_ignore_object (p); +#elif defined (HAS_DYNAMIC_ASAN_LOADING) + if (p != NULL && __lsan_ignore_object != NULL) + __lsan_ignore_object (p); #endif } @@ -73,9 +126,11 @@ g_ignore_leak (gconstpointer p) static inline void g_ignore_strv_leak (GStrv strv) { -#ifdef _GLIB_ADDRESS_SANITIZER gchar **item; + if (!g_leak_sanitizer_is_supported ()) + return; + if (strv) { g_ignore_leak (strv); @@ -83,7 +138,6 @@ g_ignore_strv_leak (GStrv strv) for (item = strv; *item != NULL; item++) g_ignore_leak (*item); } -#endif } /* @@ -98,8 +152,11 @@ g_ignore_strv_leak (GStrv strv) static inline void g_begin_ignore_leaks (void) { -#ifdef _GLIB_ADDRESS_SANITIZER +#if defined (_GLIB_ADDRESS_SANITIZER) __lsan_disable (); +#elif defined (HAS_DYNAMIC_ASAN_LOADING) + if (__lsan_disable != NULL) + __lsan_disable (); #endif } @@ -112,11 +169,16 @@ g_begin_ignore_leaks (void) static inline void g_end_ignore_leaks (void) { -#ifdef _GLIB_ADDRESS_SANITIZER +#if defined (_GLIB_ADDRESS_SANITIZER) __lsan_enable (); +#elif defined (HAS_DYNAMIC_ASAN_LOADING) + if (__lsan_enable != NULL) + __lsan_enable (); #endif } +#undef HAS_DYNAMIC_ASAN_LOADING + GMainContext * g_get_worker_context (void); gboolean g_check_setuid (void); GMainContext * g_main_context_new_with_next_id (guint next_id); @@ -227,11 +289,19 @@ typedef struct { /* See guri.c */ int (* g_uri_get_default_scheme_port) (const char *scheme); + /* See gutils.c */ + gboolean (* g_set_prgname_once) (const gchar *prgname); + + gpointer (*g_datalist_id_update_atomic) (GData **datalist, + GQuark key_id, + GDataListUpdateAtomicFunc callback, + gpointer user_data); + /* Add other private functions here, initialize them in glib-private.c */ } GLibPrivateVTable; GLIB_AVAILABLE_IN_ALL -GLibPrivateVTable *glib__private__ (void); +const GLibPrivateVTable *glib__private__ (void); /* Please see following for the use of ".ACP" over "" * on Windows, although both are accepted at compile-time @@ -254,4 +324,17 @@ GLibPrivateVTable *glib__private__ (void); # define GLIB_DEFAULT_LOCALE "" #endif +gboolean g_uint_equal (gconstpointer v1, gconstpointer v2); +guint g_uint_hash (gconstpointer v); + +#if defined(__GNUC__) +#define G_THREAD_LOCAL __thread +#else +#undef G_THREAD_LOCAL +#endif + +/* Convenience wrapper to call private g_datalist_id_update_atomic() function. */ +#define _g_datalist_id_update_atomic(datalist, key_id, callback, user_data) \ + (GLIB_PRIVATE_CALL (g_datalist_id_update_atomic) ((datalist), (key_id), (callback), (user_data))) + #endif /* __GLIB_PRIVATE_H__ */ diff --git a/glib/glib-unix.c b/glib/glib-unix.c index df5726c..7cb76dd 100644 --- a/glib/glib-unix.c +++ b/glib/glib-unix.c @@ -1,5 +1,20 @@ /* GLIB - Library of useful routines for C programming - * Copyright (C) 2011 Red Hat, Inc. + * Copyright 2000-2022 Red Hat, Inc. + * Copyright 2006-2007 Matthias Clasen + * Copyright 2006 Padraig O'Briain + * Copyright 2007 Lennart Poettering + * Copyright 2018-2022 Endless OS Foundation, LLC + * Copyright 2018 Peter Wu + * Copyright 2019 Ting-Wei Lan + * Copyright 2019 Sebastian Schwarz + * Copyright 2020 Matt Rose + * Copyright 2021 Casper Dik + * Copyright 2022 Alexander Richardson + * Copyright 2022 Ray Strode + * Copyright 2022 Thomas Haller + * Copyright 2023-2024 Collabora Ltd. + * Copyright 2023 Sebastian Wilhelmi + * Copyright 2023 CaiJingLong * * glib-unix.c: UNIX specific API wrappers and convenience functions * @@ -27,9 +42,27 @@ #include "glib-unixprivate.h" #include "gmain-internal.h" +#include +#include +#include +#include /* for fdwalk */ #include #include #include +#include + +#if defined(__linux__) || defined(__DragonFly__) +#include /* for syscall and SYS_getdents64 */ +#endif + +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif /* HAVE_SYS_RESOURCE_H */ + +#if defined(__APPLE__) && defined(HAVE_LIBPROC_H) +#include +#include +#endif G_STATIC_ASSERT (sizeof (ssize_t) == GLIB_SIZEOF_SSIZE_T); G_STATIC_ASSERT (G_ALIGNOF (gssize) == G_ALIGNOF (ssize_t)); @@ -43,21 +76,6 @@ G_STATIC_ASSERT (G_ALIGNOF (GPid) == G_ALIGNOF (pid_t)); * might not be true everywhere. */ G_STATIC_ASSERT (O_NONBLOCK != FD_CLOEXEC); -/** - * SECTION:gunix - * @title: UNIX-specific utilities and integration - * @short_description: pipes, signal handling - * @include: glib-unix.h - * - * Most of GLib is intended to be portable; in contrast, this set of - * functions is designed for programs which explicitly target UNIX, - * or are using it to build higher level abstractions which would be - * conditionally compiled if the platform matches %G_OS_UNIX. - * - * To use these functions, you must explicitly include the - * "glib-unix.h" header. - */ - G_DEFINE_QUARK (g-unix-error-quark, g_unix_error) static gboolean @@ -87,6 +105,9 @@ g_unix_set_error_from_errno (GError **error, * you wanted to configure `O_NONBLOCK` then that had to be done separately with * `fcntl()`. * + * Since GLib 2.80, the constants %G_UNIX_PIPE_END_READ and + * %G_UNIX_PIPE_END_WRITE can be used as mnemonic indexes in @fds. + * * It is a programmer error to call this function with unsupported flags, and a * critical warning will be raised. * @@ -518,3 +539,388 @@ g_unix_get_passwd_entry (const gchar *user_name, return (struct passwd *) g_steal_pointer (&buffer); } + +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ +static int +set_cloexec (void *data, gint fd) +{ + if (fd >= GPOINTER_TO_INT (data)) + fcntl (fd, F_SETFD, FD_CLOEXEC); + + return 0; +} + +/* fdwalk()-compatible callback to close a fd for non-compliant + * implementations of fdwalk() that potentially pass already + * closed fds. + * + * It is not an error to pass an invalid fd to this function. + * + * This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). + */ +G_GNUC_UNUSED static int +close_func_with_invalid_fds (void *data, int fd) +{ + /* We use close and not g_close here because on some platforms, we + * don't know how to close only valid, open file descriptors, so we + * have to pass bad fds to close too. g_close warns if given a bad + * fd. + * + * This function returns no error, because there is nothing that the caller + * could do with that information. That is even the case for EINTR. See + * g_close() about the specialty of EINTR and why that is correct. + * If g_close() ever gets extended to handle EINTR specially, then this place + * should get updated to do the same handling. + */ + if (fd >= GPOINTER_TO_INT (data)) + close (fd); + + return 0; +} + +#ifdef __linux__ +struct linux_dirent64 +{ + guint64 d_ino; /* 64-bit inode number */ + guint64 d_off; /* 64-bit offset to next structure */ + unsigned short d_reclen; /* Size of this dirent */ + unsigned char d_type; /* File type */ + char d_name[]; /* Filename (null-terminated) */ +}; + +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ +static gint +filename_to_fd (const char *p) +{ + char c; + int fd = 0; + const int cutoff = G_MAXINT / 10; + const int cutlim = G_MAXINT % 10; + + if (*p == '\0') + return -1; + + while ((c = *p++) != '\0') + { + if (c < '0' || c > '9') + return -1; + c -= '0'; + + /* Check for overflow. */ + if (fd > cutoff || (fd == cutoff && c > cutlim)) + return -1; + + fd = fd * 10 + c; + } + + return fd; +} +#endif + +static int safe_fdwalk_with_invalid_fds (int (*cb)(void *data, int fd), void *data); + +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ +static int +safe_fdwalk (int (*cb)(void *data, int fd), void *data) +{ +#if 0 + /* Use fdwalk function provided by the system if it is known to be + * async-signal safe. + * + * Currently there are no operating systems known to provide a safe + * implementation, so this section is not used for now. + */ + return fdwalk (cb, data); +#else + /* Fallback implementation of fdwalk. It should be async-signal safe, but it + * may fail on non-Linux operating systems. See safe_fdwalk_with_invalid_fds + * for a slower alternative. + */ + +#ifdef __linux__ + gint fd; + gint res = 0; + + /* Avoid use of opendir/closedir since these are not async-signal-safe. */ + int dir_fd = open ("/proc/self/fd", O_RDONLY | O_DIRECTORY); + if (dir_fd >= 0) + { + /* buf needs to be aligned correctly to receive linux_dirent64. + * C11 has _Alignof for this purpose, but for now a + * union serves the same purpose. */ + union + { + char buf[4096]; + struct linux_dirent64 alignment; + } u; + int pos, nread; + struct linux_dirent64 *de; + + while ((nread = syscall (SYS_getdents64, dir_fd, u.buf, sizeof (u.buf))) > 0) + { + for (pos = 0; pos < nread; pos += de->d_reclen) + { + de = (struct linux_dirent64 *) (u.buf + pos); + + fd = filename_to_fd (de->d_name); + if (fd < 0 || fd == dir_fd) + continue; + + if ((res = cb (data, fd)) != 0) + break; + } + } + + g_close (dir_fd, NULL); + return res; + } + + /* If /proc is not mounted or not accessible we fail here and rely on + * safe_fdwalk_with_invalid_fds to fall back to the old + * rlimit trick. */ + +#endif + +#if defined(__sun__) && defined(F_PREVFD) && defined(F_NEXTFD) +/* + * Solaris 11.4 has a signal-safe way which allows + * us to find all file descriptors in a process. + * + * fcntl(fd, F_NEXTFD, maxfd) + * - returns the first allocated file descriptor <= maxfd > fd. + * + * fcntl(fd, F_PREVFD) + * - return highest allocated file descriptor < fd. + */ + gint fd; + gint res = 0; + + open_max = fcntl (INT_MAX, F_PREVFD); /* find the maximum fd */ + if (open_max < 0) /* No open files */ + return 0; + + for (fd = -1; (fd = fcntl (fd, F_NEXTFD, open_max)) != -1; ) + if ((res = cb (data, fd)) != 0 || fd == open_max) + break; + + return res; +#endif + + return safe_fdwalk_with_invalid_fds (cb, data); +#endif +} + +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ +static int +safe_fdwalk_with_invalid_fds (int (*cb)(void *data, int fd), void *data) +{ + /* Fallback implementation of fdwalk. It should be async-signal safe, but it + * may be slow, especially on systems allowing very high number of open file + * descriptors. + */ + gint open_max = -1; + gint fd; + gint res = 0; + +#if 0 && defined(HAVE_SYS_RESOURCE_H) + struct rlimit rl; + + /* Use getrlimit() function provided by the system if it is known to be + * async-signal safe. + * + * Currently there are no operating systems known to provide a safe + * implementation, so this section is not used for now. + */ + if (getrlimit (RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) + open_max = rl.rlim_max; +#endif +#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) + /* Use sysconf() function provided by the system if it is known to be + * async-signal safe. + * + * FreeBSD: sysconf() is included in the list of async-signal safe functions + * found in https://man.freebsd.org/sigaction(2). + * + * OpenBSD: sysconf() is included in the list of async-signal safe functions + * found in https://man.openbsd.org/sigaction.2. + * + * Apple: sysconf() is included in the list of async-signal safe functions + * found in https://opensource.apple.com/source/xnu/xnu-517.12.7/bsd/man/man2/sigaction.2 + */ + if (open_max < 0) + open_max = sysconf (_SC_OPEN_MAX); +#endif + /* Hardcoded fallback: the default process hard limit in Linux as of 2020 */ + if (open_max < 0) + open_max = 4096; + +#if defined(__APPLE__) && defined(HAVE_LIBPROC_H) + /* proc_pidinfo isn't documented as async-signal-safe but looking at the implementation + * in the darwin tree here: + * + * https://opensource.apple.com/source/Libc/Libc-498/darwin/libproc.c.auto.html + * + * It's just a thin wrapper around a syscall, so it's probably okay. + */ + { + char buffer[4096 * PROC_PIDLISTFD_SIZE]; + ssize_t buffer_size; + + buffer_size = proc_pidinfo (getpid (), PROC_PIDLISTFDS, 0, buffer, sizeof (buffer)); + + if (buffer_size > 0 && + sizeof (buffer) >= (size_t) buffer_size && + (buffer_size % PROC_PIDLISTFD_SIZE) == 0) + { + const struct proc_fdinfo *fd_info = (const struct proc_fdinfo *) buffer; + size_t number_of_fds = (size_t) buffer_size / PROC_PIDLISTFD_SIZE; + + for (size_t i = 0; i < number_of_fds; i++) + if ((res = cb (data, fd_info[i].proc_fd)) != 0) + break; + + return res; + } + } +#endif + + for (fd = 0; fd < open_max; fd++) + if ((res = cb (data, fd)) != 0) + break; + + return res; +} + +/** + * g_fdwalk_set_cloexec: + * @lowfd: Minimum fd to act on, which must be non-negative + * + * Mark every file descriptor equal to or greater than @lowfd to be closed + * at the next `execve()` or similar, as if via the `FD_CLOEXEC` flag. + * + * Typically @lowfd will be 3, to leave standard input, standard output + * and standard error open after exec. + * + * This is the same as Linux `close_range (lowfd, ~0U, CLOSE_RANGE_CLOEXEC)`, + * but portable to other OSs and to older versions of Linux. + * + * This function is async-signal safe, making it safe to call from a + * signal handler or a [callback@GLib.SpawnChildSetupFunc], as long as @lowfd is + * non-negative. + * See [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7)) for more details. + * + * Returns: 0 on success, -1 with errno set on error + * Since: 2.80 + */ +int +g_fdwalk_set_cloexec (int lowfd) +{ + int ret; + + g_return_val_if_fail (lowfd >= 0, (errno = EINVAL, -1)); + +#if defined(HAVE_CLOSE_RANGE) && defined(CLOSE_RANGE_CLOEXEC) + /* close_range() is available in Linux since kernel 5.9, and on FreeBSD at + * around the same time. It was designed for use in async-signal-safe + * situations: https://bugs.python.org/issue38061 + * + * The `CLOSE_RANGE_CLOEXEC` flag was added in Linux 5.11, and is not yet + * present in FreeBSD. + * + * Handle ENOSYS in case it’s supported in libc but not the kernel; if so, + * fall back to safe_fdwalk(). Handle EINVAL in case `CLOSE_RANGE_CLOEXEC` + * is not supported. */ + ret = close_range (lowfd, G_MAXUINT, CLOSE_RANGE_CLOEXEC); + if (ret == 0 || !(errno == ENOSYS || errno == EINVAL)) + return ret; +#endif /* HAVE_CLOSE_RANGE */ + + ret = safe_fdwalk (set_cloexec, GINT_TO_POINTER (lowfd)); + + return ret; +} + +/** + * g_closefrom: + * @lowfd: Minimum fd to close, which must be non-negative + * + * Close every file descriptor equal to or greater than @lowfd. + * + * Typically @lowfd will be 3, to leave standard input, standard output + * and standard error open. + * + * This is the same as Linux `close_range (lowfd, ~0U, 0)`, + * but portable to other OSs and to older versions of Linux. + * Equivalently, it is the same as BSD `closefrom (lowfd)`, but portable, + * and async-signal-safe on all OSs. + * + * This function is async-signal safe, making it safe to call from a + * signal handler or a [callback@GLib.SpawnChildSetupFunc], as long as @lowfd is + * non-negative. + * See [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7)) for more details. + * + * Returns: 0 on success, -1 with errno set on error + * Since: 2.80 + */ +int +g_closefrom (int lowfd) +{ + int ret; + + g_return_val_if_fail (lowfd >= 0, (errno = EINVAL, -1)); + +#if defined(HAVE_CLOSE_RANGE) + /* close_range() is available in Linux since kernel 5.9, and on FreeBSD at + * around the same time. It was designed for use in async-signal-safe + * situations: https://bugs.python.org/issue38061 + * + * Handle ENOSYS in case it’s supported in libc but not the kernel; if so, + * fall back to safe_fdwalk(). */ + ret = close_range (lowfd, G_MAXUINT, 0); + if (ret == 0 || errno != ENOSYS) + return ret; +#endif /* HAVE_CLOSE_RANGE */ + +#if defined(__FreeBSD__) || defined(__OpenBSD__) || \ + (defined(__sun__) && defined(F_CLOSEFROM)) + /* Use closefrom function provided by the system if it is known to be + * async-signal safe. + * + * FreeBSD: closefrom is included in the list of async-signal safe functions + * found in https://man.freebsd.org/sigaction(2). + * + * OpenBSD: closefrom is not included in the list, but a direct system call + * should be safe to use. + * + * In Solaris as of 11.3 SRU 31, closefrom() is also a direct system call. + * On such systems, F_CLOSEFROM is defined. + */ + (void) closefrom (lowfd); + return 0; +#elif defined(__DragonFly__) + /* It is unclear whether closefrom function included in DragonFlyBSD libc_r + * is safe to use because it calls a lot of library functions. It is also + * unclear whether libc_r itself is still being used. Therefore, we do a + * direct system call here ourselves to avoid possible issues. + */ + (void) syscall (SYS_closefrom, lowfd); + return 0; +#elif defined(F_CLOSEM) + /* NetBSD and AIX have a special fcntl command which does the same thing as + * closefrom. NetBSD also includes closefrom function, which seems to be a + * simple wrapper of the fcntl command. + */ + return fcntl (lowfd, F_CLOSEM); +#else + ret = safe_fdwalk (close_func_with_invalid_fds, GINT_TO_POINTER (lowfd)); + + return ret; +#endif +} diff --git a/glib/glib-unix.h b/glib/glib-unix.h index 7cf4f0d..bccbea5 100644 --- a/glib/glib-unix.h +++ b/glib/glib-unix.h @@ -1,5 +1,6 @@ /* glib-unix.h - Unix specific integration * Copyright (C) 2011 Red Hat, Inc. + * Copyright 2023 Collabora Ltd. * * SPDX-License-Identifier: LGPL-2.1-or-later * @@ -33,6 +34,7 @@ #include #include +#include #ifndef G_OS_UNIX #error "This header may only be used on UNIX" @@ -120,6 +122,218 @@ GLIB_AVAILABLE_IN_2_64 struct passwd *g_unix_get_passwd_entry (const gchar *user_name, GError **error); +/** + * GUnixPipe: + * @fds: A pair of file descriptors, each negative if closed or not yet opened. + * The file descriptor with index %G_UNIX_PIPE_END_READ is readable. + * The file descriptor with index %G_UNIX_PIPE_END_WRITE is writable. + * + * A Unix pipe. The advantage of this type over `int[2]` is that it can + * be closed automatically when it goes out of scope, using `g_auto(GUnixPipe)`, + * on compilers that support that feature. + * + * Since: 2.80 + */ +GLIB_AVAILABLE_TYPE_IN_2_80 +typedef struct { + int fds[2]; +} GUnixPipe; + +/** + * GUnixPipeEnd: + * @G_UNIX_PIPE_END_READ: The readable file descriptor 0 + * @G_UNIX_PIPE_END_WRITE: The writable file descriptor 1 + * + * Mnemonic constants for the ends of a Unix pipe. + * + * Since: 2.80 + */ +GLIB_AVAILABLE_TYPE_IN_2_80 +typedef enum +{ + G_UNIX_PIPE_END_READ = 0, + G_UNIX_PIPE_END_WRITE = 1 +} GUnixPipeEnd; + +/** + * G_UNIX_PIPE_INIT: + * + * Initializer for a #GUnixPipe that has not yet been opened. + * Both of its file descriptors are initialized to `-1` (invalid), + * the same as if they had been closed. + * + * Since: 2.80 + */ +#define G_UNIX_PIPE_INIT { { -1, -1 } } GLIB_AVAILABLE_MACRO_IN_2_80 + +/* Suppress "Not available before" warnings when declaring the + * implementations */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + +/** + * g_unix_pipe_open: + * @self: A pair of file descriptors + * @flags: Flags to pass to g_unix_open_pipe(), typically `O_CLOEXEC` + * @error: Used to report an error on failure + * + * Open a pipe. This is the same as g_unix_open_pipe(), but uses the + * #GUnixPipe data structure. + * + * Returns: %TRUE on success + * + * Since: 2.80 + */ +GLIB_AVAILABLE_STATIC_INLINE_IN_2_80 +static inline gboolean +g_unix_pipe_open (GUnixPipe *self, + int flags, + GError **error) +{ + return g_unix_open_pipe (self->fds, flags, error); +} + +/** + * g_unix_pipe_get: + * @self: A pair of file descriptors + * @end: One of the ends of the pipe + * + * Return one of the ends of the pipe. It remains owned by @self. + * + * This function is async-signal safe (see [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7))), making it safe to call from a + * signal handler or a #GSpawnChildSetupFunc. + * + * This function preserves the value of `errno`. + * + * Returns: a non-negative file descriptor owned by @self, which must not + * be closed by the caller, or a negative number if the corresponding + * end of the pipe was already closed or stolen + * + * Since: 2.80 + */ +GLIB_AVAILABLE_STATIC_INLINE_IN_2_80 +static inline int +g_unix_pipe_get (GUnixPipe *self, + GUnixPipeEnd end) +{ + return self->fds[end]; +} + +/** + * g_unix_pipe_steal: + * @self: A pair of file descriptors + * @end: One of the ends of the pipe + * + * Return one of the ends of the pipe. It becomes owned by the caller, + * and the file descriptor in the data structure is set to `-1`, + * similar to g_steal_fd(). + * + * This function is async-signal safe (see [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7))), making it safe to call from a + * signal handler or a #GSpawnChildSetupFunc. + * + * This function preserves the value of `errno`. + * + * Returns: a non-negative file descriptor, which becomes owned by the + * caller and must be closed by the caller if required, or a negative + * number if the corresponding end of the pipe was already closed or stolen + * + * Since: 2.80 + */ +GLIB_AVAILABLE_STATIC_INLINE_IN_2_80 +static inline int +g_unix_pipe_steal (GUnixPipe *self, + GUnixPipeEnd end) +{ + return g_steal_fd (&self->fds[end]); +} + +/** + * g_unix_pipe_close: + * @self: A pair of file descriptors + * @end: One of the ends of the pipe + * @error: Optionally used to report an error on failure + * + * Close one of the ends of the pipe and set the relevant member of @fds + * to `-1` before returning, equivalent to g_clear_fd(). + * + * Like g_close(), if closing the file descriptor fails, the error is + * stored in both %errno and @error. If this function succeeds, + * %errno is undefined. + * + * This function is async-signal safe if @error is %NULL and the relevant + * member of @fds is either negative or a valid open file descriptor. + * This makes it safe to call from a signal handler or a #GSpawnChildSetupFunc + * under those conditions. + * See [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7)) for more details. + * + * To close both file descriptors and ignore any errors, use + * g_unix_pipe_clear() instead. + * + * Returns: %TRUE on success + * + * Since: 2.80 + */ +GLIB_AVAILABLE_STATIC_INLINE_IN_2_80 +static inline gboolean +g_unix_pipe_close (GUnixPipe *self, + GUnixPipeEnd end, + GError **error) +{ + return g_clear_fd (&self->fds[end], error); +} + +/** + * g_unix_pipe_clear: + * @self: a #GUnixPipe + * + * Close both ends of the pipe, unless they have already been closed or + * stolen. Any errors are ignored: use g_unix_pipe_close() or g_clear_fd() + * if error-handling is required. + * + * This function is async-signal safe if @error is %NULL and each member + * of @fds are either negative or a valid open file descriptor. + * As a result, it is safe to call this function or use `g_auto(GUnixPipe)` + * (on compilers that support it) in a signal handler or a + * #GSpawnChildSetupFunc, as long as those conditions are ensured to be true. + * See [`signal(7)`](man:signal(7)) and + * [`signal-safety(7)`](man:signal-safety(7)) for more details. + * + * This function preserves the value of `errno`. + * + * Since: 2.80 + */ +GLIB_AVAILABLE_STATIC_INLINE_IN_2_80 +static inline void +g_unix_pipe_clear (GUnixPipe *self) +{ + /* Don't overwrite thread-local errno if closing the fd fails */ + int errsv = errno; + + if (!g_unix_pipe_close (self, G_UNIX_PIPE_END_READ, NULL)) + { + /* ignore */ + } + + if (!g_unix_pipe_close (self, G_UNIX_PIPE_END_WRITE, NULL)) + { + /* ignore */ + } + + errno = errsv; +} + +G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC (GUnixPipe, g_unix_pipe_clear) + +GLIB_AVAILABLE_IN_2_80 +int g_closefrom (int lowfd); + +GLIB_AVAILABLE_IN_2_80 +int g_fdwalk_set_cloexec (int lowfd); + +G_GNUC_END_IGNORE_DEPRECATIONS + G_END_DECLS #endif /* __G_UNIX_H__ */ diff --git a/glib/glibconfig.h.in b/glib/glibconfig.h.in index 4e018a5..c6f79b2 100644 --- a/glib/glibconfig.h.in +++ b/glib/glibconfig.h.in @@ -16,6 +16,7 @@ #mesondefine GOBJECT_STATIC_COMPILATION #mesondefine GIO_STATIC_COMPILATION #mesondefine GMODULE_STATIC_COMPILATION +#mesondefine GI_STATIC_COMPILATION #mesondefine G_INTL_STATIC_COMPILATION #mesondefine FFI_STATIC_BUILD diff --git a/glib/glist.c b/glib/glist.c index 754a3ec..d56ff7c 100644 --- a/glib/glist.c +++ b/glib/glist.c @@ -36,90 +36,6 @@ #include "gtestutils.h" -/** - * SECTION:linked_lists_double - * @title: Doubly-Linked Lists - * @short_description: linked lists that can be iterated over in both directions - * - * The #GList structure and its associated functions provide a standard - * doubly-linked list data structure. The benefit of this data-structure - * is to provide insertion/deletion operations in O(1) complexity where - * access/search operations are in O(n). The benefit of #GList over - * #GSList (singly linked list) is that the worst case on access/search - * operations is divided by two which comes at a cost in space as we need - * to retain two pointers in place of one. - * - * Each element in the list contains a piece of data, together with - * pointers which link to the previous and next elements in the list. - * Using these pointers it is possible to move through the list in both - * directions (unlike the singly-linked [GSList][glib-Singly-Linked-Lists], - * which only allows movement through the list in the forward direction). - * - * The double linked list does not keep track of the number of items - * and does not keep track of both the start and end of the list. If - * you want fast access to both the start and the end of the list, - * and/or the number of items in the list, use a - * [GQueue][glib-Double-ended-Queues] instead. - * - * The data contained in each element can be either integer values, by - * using one of the [Type Conversion Macros][glib-Type-Conversion-Macros], - * or simply pointers to any type of data. - * - * List elements are allocated from the [slice allocator][glib-Memory-Slices], - * which is more efficient than allocating elements individually. - * - * Note that most of the #GList functions expect to be passed a pointer - * to the first element in the list. The functions which insert - * elements return the new start of the list, which may have changed. - * - * There is no function to create a #GList. %NULL is considered to be - * a valid, empty list so you simply set a #GList* to %NULL to initialize - * it. - * - * To add elements, use g_list_append(), g_list_prepend(), - * g_list_insert() and g_list_insert_sorted(). - * - * To visit all elements in the list, use a loop over the list: - * |[ - * GList *l; - * for (l = list; l != NULL; l = l->next) - * { - * // do something with l->data - * } - * ]| - * - * To call a function for each element in the list, use g_list_foreach(). - * - * To loop over the list and modify it (e.g. remove a certain element) - * a while loop is more appropriate, for example: - * |[ - * GList *l = list; - * while (l != NULL) - * { - * GList *next = l->next; - * if (should_be_removed (l)) - * { - * // possibly free l->data - * list = g_list_delete_link (list, l); - * } - * l = next; - * } - * ]| - * - * To remove elements, use g_list_remove(). - * - * To navigate in a list, use g_list_first(), g_list_last(), - * g_list_next(), g_list_previous(). - * - * To find elements in the list use g_list_nth(), g_list_nth_data(), - * g_list_find() and g_list_find_custom(). - * - * To find the index of an element use g_list_position() and - * g_list_index(). - * - * To free the entire list, use g_list_free() or g_list_free_full(). - */ - /** * GList: * @data: holds the element's data, which can be a pointer to any kind @@ -718,7 +634,7 @@ g_list_copy (GList *list) /** * g_list_copy_deep: * @list: a #GList, this must point to the top of the list - * @func: a copy function used to copy every element in the list + * @func: (scope call): a copy function used to copy every element in the list * @user_data: user data passed to the copy function @func, or %NULL * * Makes a full (deep) copy of a #GList. @@ -905,7 +821,7 @@ g_list_find (GList *list, * g_list_find_custom: * @list: a #GList, this must point to the top of the list * @data: user data passed to the function - * @func: the function to call for each element. + * @func: (scope call): the function to call for each element. * It should return 0 when the desired element is found * * Finds an element in a #GList, using a supplied function to @@ -1065,7 +981,7 @@ g_list_length (GList *list) /** * g_list_foreach: * @list: a #GList, this must point to the top of the list - * @func: the function to call with each element's data + * @func: (scope call): the function to call with each element's data * @user_data: user data to pass to the function * * Calls a function for each element of a #GList. @@ -1151,7 +1067,7 @@ g_list_insert_sorted_real (GList *list, * @list: a pointer to a #GList, this must point to the top of the * already sorted list * @data: the data for the new element - * @func: the function to compare elements in the list. It should + * @func: (scope call): the function to compare elements in the list. It should * return a number > 0 if the first parameter comes after the * second parameter in the sort order. * @@ -1178,7 +1094,7 @@ g_list_insert_sorted (GList *list, * @list: a pointer to a #GList, this must point to the top of the * already sorted list * @data: the data for the new element - * @func: the function to compare elements in the list. It should + * @func: (scope call): the function to compare elements in the list. It should * return a number > 0 if the first parameter comes after the * second parameter in the sort order. * @user_data: user data to pass to comparison function @@ -1273,7 +1189,7 @@ g_list_sort_real (GList *list, /** * g_list_sort: * @list: a #GList, this must point to the top of the list - * @compare_func: the comparison function used to sort the #GList. + * @compare_func: (scope call): the comparison function used to sort the #GList. * This function is passed the data from 2 elements of the #GList * and should return 0 if they are equal, a negative value if the * first element comes before the second, or a positive value if @@ -1307,7 +1223,7 @@ g_list_sort (GList *list, /** * g_list_sort_with_data: * @list: a #GList, this must point to the top of the list - * @compare_func: comparison function + * @compare_func: (scope call): comparison function * @user_data: user data to pass to comparison function * * Like g_list_sort(), but the comparison function accepts diff --git a/glib/gmacros.h b/glib/gmacros.h index 1be50a4..2d66c2f 100644 --- a/glib/gmacros.h +++ b/glib/gmacros.h @@ -185,6 +185,7 @@ #define g_macro__has_attribute___pure__ G_GNUC_CHECK_VERSION (2, 96) #define g_macro__has_attribute___sentinel__ G_GNUC_CHECK_VERSION (4, 0) #define g_macro__has_attribute___unused__ G_GNUC_CHECK_VERSION (2, 4) +#define g_macro__has_attribute___weak__ G_GNUC_CHECK_VERSION (2, 8) #define g_macro__has_attribute_cleanup G_GNUC_CHECK_VERSION (3, 3) #define g_macro__has_attribute_fallthrough G_GNUC_CHECK_VERSION (6, 0) #define g_macro__has_attribute_may_alias G_GNUC_CHECK_VERSION (3, 3) diff --git a/glib/gmain.c b/glib/gmain.c index 8400e97..6d56ab3 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -127,134 +127,6 @@ #include "glib-init.h" #include "glib-private.h" -/** - * SECTION:main - * @title: The Main Event Loop - * @short_description: manages all available sources of events - * - * The main event loop manages all the available sources of events for - * GLib and GTK applications. These events can come from any number of - * different types of sources such as file descriptors (plain files, - * pipes or sockets) and timeouts. New types of event sources can also - * be added using g_source_attach(). - * - * To allow multiple independent sets of sources to be handled in - * different threads, each source is associated with a #GMainContext. - * A #GMainContext can only be running in a single thread, but - * sources can be added to it and removed from it from other threads. All - * functions which operate on a #GMainContext or a built-in #GSource are - * thread-safe. - * - * Each event source is assigned a priority. The default priority, - * %G_PRIORITY_DEFAULT, is 0. Values less than 0 denote higher priorities. - * Values greater than 0 denote lower priorities. Events from high priority - * sources are always processed before events from lower priority sources: if - * several sources are ready to dispatch, the ones with equal-highest priority - * will be dispatched on the current #GMainContext iteration, and the rest wait - * until a subsequent #GMainContext iteration when they have the highest - * priority of the sources which are ready for dispatch. - * - * Idle functions can also be added, and assigned a priority. These will - * be run whenever no events with a higher priority are ready to be dispatched. - * - * The #GMainLoop data type represents a main event loop. A GMainLoop is - * created with g_main_loop_new(). After adding the initial event sources, - * g_main_loop_run() is called. This continuously checks for new events from - * each of the event sources and dispatches them. Finally, the processing of - * an event from one of the sources leads to a call to g_main_loop_quit() to - * exit the main loop, and g_main_loop_run() returns. - * - * It is possible to create new instances of #GMainLoop recursively. - * This is often used in GTK applications when showing modal dialog - * boxes. Note that event sources are associated with a particular - * #GMainContext, and will be checked and dispatched for all main - * loops associated with that GMainContext. - * - * GTK contains wrappers of some of these functions, e.g. gtk_main(), - * gtk_main_quit() and gtk_events_pending(). - * - * ## Creating new source types - * - * One of the unusual features of the #GMainLoop functionality - * is that new types of event source can be created and used in - * addition to the builtin type of event source. A new event source - * type is used for handling GDK events. A new source type is created - * by "deriving" from the #GSource structure. The derived type of - * source is represented by a structure that has the #GSource structure - * as a first element, and other elements specific to the new source - * type. To create an instance of the new source type, call - * g_source_new() passing in the size of the derived structure and - * a table of functions. These #GSourceFuncs determine the behavior of - * the new source type. - * - * New source types basically interact with the main context - * in two ways. Their prepare function in #GSourceFuncs can set a timeout - * to determine the maximum amount of time that the main loop will sleep - * before checking the source again. In addition, or as well, the source - * can add file descriptors to the set that the main context checks using - * g_source_add_poll(). - * - * ## Customizing the main loop iteration - * - * Single iterations of a #GMainContext can be run with - * g_main_context_iteration(). In some cases, more detailed control - * of exactly how the details of the main loop work is desired, for - * instance, when integrating the #GMainLoop with an external main loop. - * In such cases, you can call the component functions of - * g_main_context_iteration() directly. These functions are - * g_main_context_prepare(), g_main_context_query(), - * g_main_context_check() and g_main_context_dispatch(). - * - * If the event loop thread releases #GMainContext ownership until the results - * required by g_main_context_check() are ready you must create a context with - * the flag %G_MAIN_CONTEXT_FLAGS_OWNERLESS_POLLING or else you'll lose - * g_source_attach() notifications. This happens for instance when you integrate - * the GLib event loop into implementations that follow the proactor pattern - * (i.e. in these contexts the `poll()` implementation will reclaim the thread for - * other tasks until the results are ready). One example of the proactor pattern - * is the Boost.Asio library. - * - * ## State of a Main Context # {#mainloop-states} - * - * The operation of these functions can best be seen in terms - * of a state diagram, as shown in this image. - * - * ![](mainloop-states.gif) - * - * On UNIX, the GLib mainloop is incompatible with fork(). Any program - * using the mainloop must either exec() or exit() from the child - * without returning to the mainloop. - * - * ## Memory management of sources # {#mainloop-memory-management} - * - * There are two options for memory management of the user data passed to a - * #GSource to be passed to its callback on invocation. This data is provided - * in calls to g_timeout_add(), g_timeout_add_full(), g_idle_add(), etc. and - * more generally, using g_source_set_callback(). This data is typically an - * object which ‘owns’ the timeout or idle callback, such as a widget or a - * network protocol implementation. In many cases, it is an error for the - * callback to be invoked after this owning object has been destroyed, as that - * results in use of freed memory. - * - * The first, and preferred, option is to store the source ID returned by - * functions such as g_timeout_add() or g_source_attach(), and explicitly - * remove that source from the main context using g_source_remove() when the - * owning object is finalized. This ensures that the callback can only be - * invoked while the object is still alive. - * - * The second option is to hold a strong reference to the object in the - * callback, and to release it in the callback’s #GDestroyNotify. This ensures - * that the object is kept alive until after the source is finalized, which is - * guaranteed to be after it is invoked for the final time. The #GDestroyNotify - * is another callback passed to the ‘full’ variants of #GSource functions (for - * example, g_timeout_add_full()). It is called when the source is finalized, - * and is designed for releasing references like this. - * - * One important caveat of this second approach is that it will keep the object - * alive indefinitely if the main loop is stopped before the #GSource is - * invoked, which may be undesirable. - */ - /* Types */ typedef struct _GIdleSource GIdleSource; @@ -275,6 +147,7 @@ typedef struct _GSourceList GSourceList; struct _GSourceList { + GList link; GSource *head, *tail; gint priority; }; @@ -319,7 +192,7 @@ struct _GMainContext gint timeout; /* Timeout for current iteration */ guint next_id; - GList *source_lists; + GQueue source_lists; gint in_check_or_prepare; GPollRec *poll_records; @@ -669,12 +542,13 @@ g_main_context_unref (GMainContext *context) g_source_destroy_internal (source, context, TRUE); } - for (sl_iter = context->source_lists; sl_iter; sl_iter = sl_iter->next) + sl_iter = context->source_lists.head; + while (sl_iter != NULL) { list = sl_iter->data; + sl_iter = sl_iter->next; g_slice_free (GSourceList, list); } - g_list_free (context->source_lists); g_hash_table_destroy (context->sources); @@ -763,7 +637,7 @@ g_main_context_new_with_flags (GMainContextFlags flags) g_mutex_init (&context->mutex); g_cond_init (&context->cond); - context->sources = g_hash_table_new (NULL, NULL); + context->sources = g_hash_table_new (g_uint_hash, g_uint_equal); context->owner = NULL; context->flags = flags; context->waiters = NULL; @@ -771,9 +645,7 @@ g_main_context_new_with_flags (GMainContextFlags flags) context->ref_count = 1; context->next_id = 1; - - context->source_lists = NULL; - + context->poll_func = g_poll; context->cached_poll_array = NULL; @@ -815,7 +687,7 @@ g_main_context_default (void) { static GMainContext *default_main_context = NULL; - if (g_once_init_enter (&default_main_context)) + if (g_once_init_enter_pointer (&default_main_context)) { GMainContext *context; @@ -828,7 +700,7 @@ g_main_context_default (void) g_print ("global-default main context=%p\n", context); #endif - g_once_init_leave (&default_main_context, context); + g_once_init_leave_pointer (&default_main_context, context); } return default_main_context; @@ -1126,7 +998,7 @@ g_source_iter_next (GSourceIter *iter, GSource **source) if (iter->current_list) iter->current_list = iter->current_list->next; else - iter->current_list = iter->context->source_lists; + iter->current_list = iter->context->source_lists.head; if (iter->current_list) { @@ -1176,11 +1048,10 @@ find_source_list_for_priority (GMainContext *context, gint priority, gboolean create) { - GList *iter, *last; + GList *iter; GSourceList *source_list; - last = NULL; - for (iter = context->source_lists; iter != NULL; last = iter, iter = iter->next) + for (iter = context->source_lists.head; iter; iter = iter->next) { source_list = iter->data; @@ -1193,10 +1064,11 @@ find_source_list_for_priority (GMainContext *context, return NULL; source_list = g_slice_new0 (GSourceList); + source_list->link.data = source_list; source_list->priority = priority; - context->source_lists = g_list_insert_before (context->source_lists, - iter, - source_list); + g_queue_insert_before_link (&context->source_lists, + iter, + &source_list->link); return source_list; } } @@ -1205,18 +1077,10 @@ find_source_list_for_priority (GMainContext *context, return NULL; source_list = g_slice_new0 (GSourceList); + source_list->link.data = source_list; source_list->priority = priority; + g_queue_push_tail_link (&context->source_lists, &source_list->link); - if (!last) - context->source_lists = g_list_append (NULL, source_list); - else - { - /* This just appends source_list to the end of - * context->source_lists without having to walk the list again. - */ - last = g_list_append (last, source_list); - (void) last; - } return source_list; } @@ -1284,7 +1148,7 @@ source_remove_from_context (GSource *source, if (source_list->head == NULL) { - context->source_lists = g_list_remove (context->source_lists, source_list); + g_queue_unlink (&context->source_lists, &source_list->link); g_slice_free (GSourceList, source_list); } } @@ -1302,13 +1166,13 @@ g_source_attach_unlocked (GSource *source, */ do id = context->next_id++; - while (id == 0 || g_hash_table_contains (context->sources, GUINT_TO_POINTER (id))); + while (id == 0 || g_hash_table_contains (context->sources, &id)); source->context = context; source->source_id = id; g_source_ref (source); - g_hash_table_insert (context->sources, GUINT_TO_POINTER (id), source); + g_hash_table_add (context->sources, &source->source_id); source_add_to_context (source, context); @@ -2088,8 +1952,8 @@ g_source_set_ready_time (GSource *source, * Gets the "ready time" of @source, as set by * g_source_set_ready_time(). * - * Any time before the current monotonic time (including 0) is an - * indication that the source will fire immediately. + * Any time before or equal to the current monotonic time (including 0) + * is an indication that the source will fire immediately. * * Returns: the monotonic ready time, -1 for "never" **/ @@ -2375,7 +2239,7 @@ g_source_unref_internal (GSource *source, g_warning (G_STRLOC ": ref_count == 0, but source was still attached to a context!"); source_remove_from_context (source, context); - g_hash_table_remove (context->sources, GUINT_TO_POINTER (source->source_id)); + g_hash_table_remove (context->sources, &source->source_id); } if (source->source_funcs->finalize) @@ -2484,7 +2348,8 @@ GSource * g_main_context_find_source_by_id (GMainContext *context, guint source_id) { - GSource *source; + GSource *source = NULL; + gconstpointer ptr; g_return_val_if_fail (source_id > 0, NULL); @@ -2492,12 +2357,15 @@ g_main_context_find_source_by_id (GMainContext *context, context = g_main_context_default (); LOCK_CONTEXT (context); - source = g_hash_table_lookup (context->sources, GUINT_TO_POINTER (source_id)); + ptr = g_hash_table_lookup (context->sources, &source_id); + if (ptr) + { + source = G_CONTAINER_OF (ptr, GSource, source_id); + if (SOURCE_DESTROYED (source)) + source = NULL; + } UNLOCK_CONTEXT (context); - if (source && SOURCE_DESTROYED (source)) - source = NULL; - return source; } diff --git a/glib/gmarkup.c b/glib/gmarkup.c index 9422abd..f838ab0 100644 --- a/glib/gmarkup.c +++ b/glib/gmarkup.c @@ -38,60 +38,6 @@ #include "glibintl.h" #include "gthread.h" -/** - * SECTION:markup - * @Title: Simple XML Subset Parser - * @Short_description: parses a subset of XML - * @See_also: [XML Specification](http://www.w3.org/TR/REC-xml/) - * - * The "GMarkup" parser is intended to parse a simple markup format - * that's a subset of XML. This is a small, efficient, easy-to-use - * parser. It should not be used if you expect to interoperate with - * other applications generating full-scale XML, and must not be used if you - * expect to parse untrusted input. However, it's very - * useful for application data files, config files, etc. where you - * know your application will be the only one writing the file. - * Full-scale XML parsers should be able to parse the subset used by - * GMarkup, so you can easily migrate to full-scale XML at a later - * time if the need arises. - * - * GMarkup is not guaranteed to signal an error on all invalid XML; - * the parser may accept documents that an XML parser would not. - * However, XML documents which are not well-formed (which is a - * weaker condition than being valid. See the - * [XML specification](http://www.w3.org/TR/REC-xml/) - * for definitions of these terms.) are not considered valid GMarkup - * documents. - * - * Simplifications to XML include: - * - * - Only UTF-8 encoding is allowed - * - * - No user-defined entities - * - * - Processing instructions, comments and the doctype declaration - * are "passed through" but are not interpreted in any way - * - * - No DTD or validation - * - * The markup format does support: - * - * - Elements - * - * - Attributes - * - * - 5 standard entities: & < > " ' - * - * - Character references - * - * - Sections marked as CDATA - - * ## An example parser # {#example} - * - * Here is an example for a markup parser: - * [markup-example.c](https://gitlab.gnome.org/GNOME/glib/-/blob/HEAD/glib/tests/markup-example.c) - */ - G_DEFINE_QUARK (g-markup-error-quark, g_markup_error) typedef enum @@ -1939,7 +1885,7 @@ g_markup_parse_context_get_element (GMarkupParseContext *context) * would merely return the name of the element that is being * processed. * - * Returns: the element stack, which must not be modified + * Returns: (element-type utf8): the element stack, which must not be modified * * Since: 2.16 */ diff --git a/glib/gmem.c b/glib/gmem.c index 07e23af..c72c9cc 100644 --- a/glib/gmem.c +++ b/glib/gmem.c @@ -77,36 +77,6 @@ static GMemVTable glib_mem_vtable = { realloc, }; -/** - * SECTION:memory - * @Short_Description: general memory-handling - * @Title: Memory Allocation - * - * These functions provide support for allocating and freeing memory. - * - * If any call to allocate memory using functions g_new(), g_new0(), g_renew(), - * g_malloc(), g_malloc0(), g_malloc0_n(), g_realloc(), and g_realloc_n() - * fails, the application is terminated. This also means that there is no - * need to check if the call succeeded. On the other hand, the `g_try_...()` family - * of functions returns %NULL on failure that can be used as a check - * for unsuccessful memory allocation. The application is not terminated - * in this case. - * - * As all GLib functions and data structures use `g_malloc()` internally, unless - * otherwise specified, any allocation failure will result in the application - * being terminated. - * - * It's important to match g_malloc() (and wrappers such as g_new()) with - * g_free(), g_slice_alloc() (and wrappers such as g_slice_new()) with - * g_slice_free(), plain malloc() with free(), and (if you're using C++) - * new with delete and new[] with delete[]. Otherwise bad things can happen, - * since these allocators may use different memory pools (and new/delete call - * constructors and destructors). - * - * Since GLib 2.46 g_malloc() is hardcoded to always use the system malloc - * implementation. - */ - /* --- functions --- */ /** * g_malloc: diff --git a/glib/gmessages.c b/glib/gmessages.c index 5460dcf..06437f6 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -28,146 +28,6 @@ * MT safe */ -/** - * SECTION:messages - * @Title: Message Output and Debugging Functions - * @Short_description: functions to output messages and help debug applications - * - * These functions provide support for outputting messages. - * - * The g_return family of macros (g_return_if_fail(), - * g_return_val_if_fail(), g_return_if_reached(), - * g_return_val_if_reached()) should only be used for programming - * errors, a typical use case is checking for invalid parameters at - * the beginning of a public function. They should not be used if - * you just mean "if (error) return", they should only be used if - * you mean "if (bug in program) return". The program behavior is - * generally considered undefined after one of these checks fails. - * They are not intended for normal control flow, only to give a - * perhaps-helpful warning before giving up. - * - * Structured logging output is supported using g_log_structured(). This differs - * from the traditional g_log() API in that log messages are handled as a - * collection of key–value pairs representing individual pieces of information, - * rather than as a single string containing all the information in an arbitrary - * format. - * - * The convenience macros g_info(), g_message(), g_debug(), g_warning() and g_error() - * will use the traditional g_log() API unless you define the symbol - * %G_LOG_USE_STRUCTURED before including `glib.h`. But note that even messages - * logged through the traditional g_log() API are ultimatively passed to - * g_log_structured(), so that all log messages end up in same destination. - * If %G_LOG_USE_STRUCTURED is defined, g_test_expect_message() will become - * ineffective for the wrapper macros g_warning() and friends (see - * [Testing for Messages][testing-for-messages]). - * - * The support for structured logging was motivated by the following needs (some - * of which were supported previously; others weren’t): - * * Support for multiple logging levels. - * * Structured log support with the ability to add `MESSAGE_ID`s (see - * g_log_structured()). - * * Moving the responsibility for filtering log messages from the program to - * the log viewer — instead of libraries and programs installing log handlers - * (with g_log_set_handler()) which filter messages before output, all log - * messages are outputted, and the log viewer program (such as `journalctl`) - * must filter them. This is based on the idea that bugs are sometimes hard - * to reproduce, so it is better to log everything possible and then use - * tools to analyse the logs than it is to not be able to reproduce a bug to - * get additional log data. Code which uses logging in performance-critical - * sections should compile out the g_log_structured() calls in - * release builds, and compile them in in debugging builds. - * * A single writer function which handles all log messages in a process, from - * all libraries and program code; rather than multiple log handlers with - * poorly defined interactions between them. This allows a program to easily - * change its logging policy by changing the writer function, for example to - * log to an additional location or to change what logging output fallbacks - * are used. The log writer functions provided by GLib are exposed publicly - * so they can be used from programs’ log writers. This allows log writer - * policy and implementation to be kept separate. - * * If a library wants to add standard information to all of its log messages - * (such as library state) or to redact private data (such as passwords or - * network credentials), it should use a wrapper function around its - * g_log_structured() calls or implement that in the single log writer - * function. - * * If a program wants to pass context data from a g_log_structured() call to - * its log writer function so that, for example, it can use the correct - * server connection to submit logs to, that user data can be passed as a - * zero-length #GLogField to g_log_structured_array(). - * * Color output needed to be supported on the terminal, to make reading - * through logs easier. - * - * ## Using Structured Logging ## {#using-structured-logging} - * - * To use structured logging (rather than the old-style logging), either use - * the g_log_structured() and g_log_structured_array() functions; or define - * `G_LOG_USE_STRUCTURED` before including any GLib header, and use the - * g_message(), g_debug(), g_error() (etc.) macros. - * - * You do not need to define `G_LOG_USE_STRUCTURED` to use g_log_structured(), - * but it is a good idea to avoid confusion. - * - * ## Log Domains ## {#log-domains} - * - * Log domains may be used to broadly split up the origins of log messages. - * Typically, there are one or a few log domains per application or library. - * %G_LOG_DOMAIN should be used to define the default log domain for the current - * compilation unit — it is typically defined at the top of a source file, or in - * the preprocessor flags for a group of source files. - * - * Log domains must be unique, and it is recommended that they are the - * application or library name, optionally followed by a hyphen and a sub-domain - * name. For example, `bloatpad` or `bloatpad-io`. - * - * ## Debug Message Output ## {#debug-message-output} - * - * The default log functions (g_log_default_handler() for the old-style API and - * g_log_writer_default() for the structured API) both drop debug and - * informational messages by default, unless the log domains of those messages - * are listed in the `G_MESSAGES_DEBUG` environment variable (or it is set to - * `all`). - * - * It is recommended that custom log writer functions re-use the - * `G_MESSAGES_DEBUG` environment variable, rather than inventing a custom one, - * so that developers can re-use the same debugging techniques and tools across - * projects. Since GLib 2.68, this can be implemented by dropping messages - * for which g_log_writer_default_would_drop() returns %TRUE. - * - * ## Testing for Messages ## {#testing-for-messages} - * - * With the old g_log() API, g_test_expect_message() and - * g_test_assert_expected_messages() could be used in simple cases to check - * whether some code under test had emitted a given log message. These - * functions have been deprecated with the structured logging API, for several - * reasons: - * * They relied on an internal queue which was too inflexible for many use - * cases, where messages might be emitted in several orders, some - * messages might not be emitted deterministically, or messages might be - * emitted by unrelated log domains. - * * They do not support structured log fields. - * * Examining the log output of code is a bad approach to testing it, and - * while it might be necessary for legacy code which uses g_log(), it should - * be avoided for new code using g_log_structured(). - * - * They will continue to work as before if g_log() is in use (and - * %G_LOG_USE_STRUCTURED is not defined). They will do nothing if used with the - * structured logging API. - * - * Examining the log output of code is discouraged: libraries should not emit to - * `stderr` during defined behaviour, and hence this should not be tested. If - * the log emissions of a library during undefined behaviour need to be tested, - * they should be limited to asserting that the library aborts and prints a - * suitable error message before aborting. This should be done with - * g_test_trap_assert_stderr(). - * - * If it is really necessary to test the structured log messages emitted by a - * particular piece of code – and the code cannot be restructured to be more - * suitable to more conventional unit testing – you should write a custom log - * writer function (see g_log_set_writer_func()) which appends all log messages - * to a queue. When you want to check the log messages, examine and clear the - * queue, ignoring irrelevant log messages (for example, from log domains other - * than the one under test). - */ - #include "config.h" #include @@ -204,6 +64,10 @@ #include "gthreadprivate.h" #include "gutilsprivate.h" +#ifdef HAVE_SYSLOG_H +#include +#endif + #if defined(__linux__) && !defined(__BIONIC__) #include "gjournal-private.h" #endif @@ -260,83 +124,83 @@ * GLib log levels that are considered fatal by default. * * This is not used if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). */ /** * GLogFunc: * @log_domain: the log domain of the message * @log_level: the log level of the message (including the - * fatal and recursion flags) + * fatal and recursion flags) * @message: the message to process - * @user_data: user data, set in g_log_set_handler() + * @user_data: user data, set in [func@GLib.log_set_handler] * * Specifies the prototype of log handler functions. * - * The default log handler, g_log_default_handler(), automatically appends a + * The default log handler, [func@GLib.log_default_handler], automatically appends a * new-line character to @message when printing it. It is advised that any * custom log handler functions behave similarly, so that logging calls in user * code do not need modifying to add a new-line character to the message if the * log handler is changed. * * This is not used if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). */ /** * GLogLevelFlags: * @G_LOG_FLAG_RECURSION: internal flag * @G_LOG_FLAG_FATAL: internal flag - * @G_LOG_LEVEL_ERROR: log level for errors, see g_error(). - * This level is also used for messages produced by g_assert(). + * @G_LOG_LEVEL_ERROR: log level for errors, see [func@GLib.error]. + * This level is also used for messages produced by [func@GLib.assert]. * @G_LOG_LEVEL_CRITICAL: log level for critical warning messages, see - * g_critical(). - * This level is also used for messages produced by g_return_if_fail() - * and g_return_val_if_fail(). - * @G_LOG_LEVEL_WARNING: log level for warnings, see g_warning() - * @G_LOG_LEVEL_MESSAGE: log level for messages, see g_message() - * @G_LOG_LEVEL_INFO: log level for informational messages, see g_info() - * @G_LOG_LEVEL_DEBUG: log level for debug messages, see g_debug() + * [func@GLib.critical]. This level is also used for messages produced by + * [func@GLib.return_if_fail] and [func@GLib.return_val_if_fail]. + * @G_LOG_LEVEL_WARNING: log level for warnings, see [func@GLib.warning] + * @G_LOG_LEVEL_MESSAGE: log level for messages, see [func@GLib.message] + * @G_LOG_LEVEL_INFO: log level for informational messages, see [func@GLib.info] + * @G_LOG_LEVEL_DEBUG: log level for debug messages, see [func@GLib.debug] * @G_LOG_LEVEL_MASK: a mask including all log levels * * Flags specifying the level of log messages. * * It is possible to change how GLib treats messages of the various - * levels using g_log_set_handler() and g_log_set_fatal_mask(). + * levels using [func@GLib.log_set_handler] and [func@GLib.log_set_fatal_mask]. */ /** * G_LOG_LEVEL_USER_SHIFT: * - * Log levels below 1< + * ```c * g_log_set_handler (NULL, G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); - * ]| + * ``` * * This example adds a log handler for all critical messages from GTK: * - * |[ + * ```c * g_log_set_handler ("Gtk", G_LOG_LEVEL_CRITICAL | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); - * ]| + * ``` * * This example adds a log handler for all messages from GLib: * - * |[ + * ```c * g_log_set_handler ("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL * | G_LOG_FLAG_RECURSION, my_log_handler, NULL); - * ]| + * ``` * * Returns: the id of the new handler */ @@ -859,22 +710,22 @@ g_log_set_handler (const gchar *log_domain, /** * g_log_set_handler_full: (rename-to g_log_set_handler) - * @log_domain: (nullable): the log domain, or %NULL for the default "" + * @log_domain: (nullable): the log domain, or `NULL` for the default `""` * application domain * @log_levels: the log levels to apply the log handler for. * To handle fatal and recursive messages as well, combine - * the log levels with the %G_LOG_FLAG_FATAL and - * %G_LOG_FLAG_RECURSION bit flags. + * the log levels with the [flags@GLib.LogLevelFlags.FLAG_FATAL] and + * [flags@GLib.LogLevelFlags.FLAG_RECURSION] bit flags. * @log_func: the log handler function * @user_data: data passed to the log handler - * @destroy: destroy notify for @user_data, or %NULL + * @destroy: destroy notify for @user_data, or `NULL` * - * Like g_log_set_handler(), but takes a destroy notify for the @user_data. + * Like [func@GLib.log_set_handler], but takes a destroy notify for the @user_data. * * This has no effect if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). * - * Returns: the id of the new handler + * Returns: the ID of the new handler * * Since: 2.46 */ @@ -923,11 +774,12 @@ g_log_set_handler_full (const gchar *log_domain, * * Installs a default log handler which is used if no * log handler has been set for the particular log domain - * and log level combination. By default, GLib uses - * g_log_default_handler() as default log handler. + * and log level combination. + * + * By default, GLib uses [func@GLib.log_default_handler] as default log handler. * * This has no effect if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). * * Returns: the previous default log handler * @@ -970,10 +822,10 @@ g_log_set_default_handler (GLogFunc log_func, * This handler has no effect on g_error messages. * * This handler also has no effect on structured log messages (using - * g_log_structured() or g_log_structured_array()). To change the fatal + * [func@GLib.log_structured] or [func@GLib.log_structured_array]). To change the fatal * behaviour for specific log messages, programs must install a custom log - * writer function using g_log_set_writer_func().See - * [Using Structured Logging][using-structured-logging]. + * writer function using [func@GLib.log_set_writer_func].See + * [Using Structured Logging](logging.html#using-structured-logging). * * Since: 2.22 **/ @@ -990,13 +842,13 @@ g_test_log_set_fatal_handler (GTestLogFatalFunc log_func, /** * g_log_remove_handler: * @log_domain: the log domain - * @handler_id: the id of the handler, which was returned - * in g_log_set_handler() + * @handler_id: the ID of the handler, which was returned + * in [func@GLib.log_set_handler] * * Removes the log handler. * * This has no effect if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). */ void g_log_remove_handler (const gchar *log_domain, @@ -1179,16 +1031,18 @@ static gboolean gmessages_use_stderr = FALSE; /** * g_log_writer_default_set_use_stderr: - * @use_stderr: If %TRUE, use `stderr` for log messages that would + * @use_stderr: If `TRUE`, use `stderr` for log messages that would * normally have appeared on `stdout` * - * Configure whether the built-in log functions - * (g_log_default_handler() for the old-style API, and both - * g_log_writer_default() and g_log_writer_standard_streams() for the - * structured API) will output all log messages to `stderr`. + * Configure whether the built-in log functions will output all log messages to + * `stderr`. * - * By default, log messages of levels %G_LOG_LEVEL_INFO and - * %G_LOG_LEVEL_DEBUG are sent to `stdout`, and other log messages are + * The built-in log functions are [func@GLib.log_default_handler] for the + * old-style API, and both [func@GLib.log_writer_default] and + * [func@GLib.log_writer_standard_streams] for the structured API. + * + * By default, log messages of levels [flags@GLib.LogLevelFlags.LEVEL_INFO] and + * [flags@GLib.LogLevelFlags.LEVEL_DEBUG] are sent to `stdout`, and other log messages are * sent to `stderr`. This is problematic for applications that intend * to reserve `stdout` for structured output such as JSON or XML. * @@ -1269,24 +1123,24 @@ static GSList *expected_messages = NULL; /** * g_logv: - * @log_domain: (nullable): the log domain, or %NULL for the default "" - * application domain + * @log_domain: (nullable): the log domain, or `NULL` for the default `""` + * application domain * @log_level: the log level - * @format: the message format. See the printf() documentation + * @format: the message format. See the `printf()` documentation * @args: the parameters to insert into the format string * * Logs an error or debugging message. * - * If the log level has been set as fatal, G_BREAKPOINT() is called - * to terminate the program. See the documentation for G_BREAKPOINT() for + * If the log level has been set as fatal, [func@GLib.BREAKPOINT] is called + * to terminate the program. See the documentation for [func@GLib.BREAKPOINT] for * details of the debugging options this provides. * - * If g_log_default_handler() is used as the log handler function, a new-line + * If [func@GLib.log_default_handler] is used as the log handler function, a new-line * character will automatically be appended to @..., and need not be entered * manually. * - * If [structured logging is enabled][using-structured-logging] this will - * output via the structured log writer function (see g_log_set_writer_func()). + * If [structured logging is enabled](logging.html#using-structured-logging) this will + * output via the structured log writer function (see [func@GLib.log_set_writer_func]). */ void g_logv (const gchar *log_domain, @@ -1429,25 +1283,25 @@ g_logv (const gchar *log_domain, /** * g_log: - * @log_domain: (nullable): the log domain, usually %G_LOG_DOMAIN, or %NULL + * @log_domain: (nullable): the log domain, usually `G_LOG_DOMAIN`, or `NULL` * for the default - * @log_level: the log level, either from #GLogLevelFlags + * @log_level: the log level, either from [type@GLib.LogLevelFlags] * or a user-defined level * @format: the message format. See the `printf()` documentation * @...: the parameters to insert into the format string * * Logs an error or debugging message. * - * If the log level has been set as fatal, G_BREAKPOINT() is called - * to terminate the program. See the documentation for G_BREAKPOINT() for + * If the log level has been set as fatal, [func@GLib.BREAKPOINT] is called + * to terminate the program. See the documentation for [func@GLib.BREAKPOINT] for * details of the debugging options this provides. * - * If g_log_default_handler() is used as the log handler function, a new-line + * If [func@GLib.log_default_handler] is used as the log handler function, a new-line * character will automatically be appended to @..., and need not be entered * manually. * - * If [structured logging is enabled][using-structured-logging] this will - * output via the structured log writer function (see g_log_set_writer_func()). + * If [structured logging is enabled](logging.html#using-structured-logging) this will + * output via the structured log writer function (see [func@GLib.log_set_writer_func]). */ void g_log (const gchar *log_domain, @@ -1485,6 +1339,25 @@ log_level_to_priority (GLogLevelFlags log_level) return "5"; } +#ifdef HAVE_SYSLOG_H +static int +str_to_syslog_facility (const gchar *syslog_facility_str) +{ + int syslog_facility = LOG_USER; + + if (g_strcmp0 (syslog_facility_str, "auth") == 0) + { + syslog_facility = LOG_AUTH; + } + else if (g_strcmp0 (syslog_facility_str, "daemon") == 0) + { + syslog_facility = LOG_DAEMON; + } + + return syslog_facility; +} +#endif + static inline FILE * log_level_to_file (GLogLevelFlags log_level) { @@ -1614,27 +1487,27 @@ done_query: /** * g_log_structured: - * @log_domain: log domain, usually %G_LOG_DOMAIN - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_domain: log domain, usually `G_LOG_DOMAIN` + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @...: key-value pairs of structured data to add to the log entry, followed - * by the key "MESSAGE", followed by a printf()-style message format, + * by the key `MESSAGE`, followed by a `printf()`-style message format, * followed by parameters to insert in the format string * * Log a message with structured data. * * The message will be passed through to the log writer set by the application - * using g_log_set_writer_func(). If the message is fatal (i.e. its log level - * is %G_LOG_LEVEL_ERROR), the program will be aborted by calling - * G_BREAKPOINT() at the end of this function. If the log writer returns - * %G_LOG_WRITER_UNHANDLED (failure), no other fallback writers will be tried. - * See the documentation for #GLogWriterFunc for information on chaining + * using [func@GLib.log_set_writer_func]. If the message is fatal (i.e. its log level + * is [flags@GLib.LogLevelFlags.LEVEL_ERROR]), the program will be aborted by calling + * [func@GLib.BREAKPOINT] at the end of this function. If the log writer returns + * [enum@GLib.LogWriterOutput.UNHANDLED] (failure), no other fallback writers will be tried. + * See the documentation for [type@GLib.LogWriterFunc] for information on chaining * writers. * * The structured data is provided as key–value pairs, where keys are UTF-8 * strings, and values are arbitrary pointers — typically pointing to UTF-8 * strings, but that is not a requirement. To pass binary (non-nul-terminated) - * structured data, use g_log_structured_array(). The keys for structured data + * structured data, use [func@GLib.log_structured_array]. The keys for structured data * should follow the [systemd journal * fields](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html) * specification. It is suggested that custom keys are namespaced according to @@ -1642,10 +1515,10 @@ done_query: * `GLIB_` prefix. * * Note that keys that expect UTF-8 strings (specifically `"MESSAGE"` and - * `"GLIB_DOMAIN"`) must be passed as NUL-terminated UTF-8 strings until GLib + * `"GLIB_DOMAIN"`) must be passed as nul-terminated UTF-8 strings until GLib * version 2.74.1 because the default log handler did not consider the length of * the `GLogField`. Starting with GLib 2.74.1 this is fixed and - * non-NUL-terminated UTF-8 strings can be passed with their correct length. + * non-nul-terminated UTF-8 strings can be passed with their correct length. * * The @log_domain will be converted into a `GLIB_DOMAIN` field. @log_level will * be converted into a @@ -1664,19 +1537,19 @@ done_query: * * [`ERRNO`](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html#ERRNO=) * * Note that `CODE_FILE`, `CODE_LINE` and `CODE_FUNC` are automatically set by - * the logging macros, G_DEBUG_HERE(), g_message(), g_warning(), g_critical(), - * g_error(), etc, if the symbols `G_LOG_USE_STRUCTURED` is defined before including + * the logging macros, [func@GLib.DEBUG_HERE], [func@GLib.message], [func@GLib.warning], [func@GLib.critical], + * [func@GLib.error], etc, if the symbol `G_LOG_USE_STRUCTURED` is defined before including * `glib.h`. * * For example: * - * |[ + * ```c * g_log_structured (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, * "MESSAGE_ID", "06d4df59e6c24647bfe69d2c27ef0b4e", * "MY_APPLICATION_CUSTOM_FIELD", "some debug string", * "MESSAGE", "This is a debug message about pointer %p and integer %u.", * some_pointer, some_integer); - * ]| + * ``` * * Note that each `MESSAGE_ID` must be [uniquely and randomly * generated](https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html#MESSAGE_ID=). @@ -1685,13 +1558,13 @@ done_query: * your software. * * To pass a user data pointer to the log writer function which is specific to - * this logging call, you must use g_log_structured_array() and pass the pointer - * as a field with #GLogField.length set to zero, otherwise it will be + * this logging call, you must use [func@GLib.log_structured_array] and pass the pointer + * as a field with `GLogField.length` set to zero, otherwise it will be * interpreted as a string. * * For example: * - * |[ + * ```c * const GLogField fields[] = { * { "MESSAGE", "This is a debug message.", -1 }, * { "MESSAGE_ID", "fcfb2e1e65c3494386b74878f1abf893", -1 }, @@ -1699,12 +1572,12 @@ done_query: * { "MY_APPLICATION_STATE", state_object, 0 }, * }; * g_log_structured_array (G_LOG_LEVEL_DEBUG, fields, G_N_ELEMENTS (fields)); - * ]| + * ``` * * Note also that, even if no other structured fields are specified, there * must always be a `MESSAGE` key before the format string. The `MESSAGE`-format * pair has to be the last of the key-value pairs, and `MESSAGE` is the only - * field for which printf()-style formatting is supported. + * field for which `printf()`-style formatting is supported. * * The default writer function for `stdout` and `stderr` will automatically * append a new-line character after the message, so you should not add one @@ -1818,30 +1691,30 @@ g_log_structured (const gchar *log_domain, /** * g_log_variant: - * @log_domain: (nullable): log domain, usually %G_LOG_DOMAIN - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_domain: (nullable): log domain, usually `G_LOG_DOMAIN` + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level - * @fields: a dictionary (#GVariant of the type %G_VARIANT_TYPE_VARDICT) + * @fields: a dictionary ([type@GLib.Variant] of the type `G_VARIANT_TYPE_VARDICT`) * containing the key-value pairs of message data. * - * Log a message with structured data, accepting the data within a #GVariant. This - * version is especially useful for use in other languages, via introspection. + * Log a message with structured data, accepting the data within a [type@GLib.Variant]. * - * The only mandatory item in the @fields dictionary is the "MESSAGE" which must + * This version is especially useful for use in other languages, via introspection. + * + * The only mandatory item in the @fields dictionary is the `"MESSAGE"` which must * contain the text shown to the user. * - * The values in the @fields dictionary are likely to be of type String - * (%G_VARIANT_TYPE_STRING). Array of bytes (%G_VARIANT_TYPE_BYTESTRING) is also + * The values in the @fields dictionary are likely to be of type `G_VARIANT_TYPE_STRING`. + * Array of bytes (`G_VARIANT_TYPE_BYTESTRING`) is also * supported. In this case the message is handled as binary and will be forwarded * to the log writer as such. The size of the array should not be higher than - * %G_MAXSSIZE. Otherwise it will be truncated to this size. For other types - * g_variant_print() will be used to convert the value into a string. + * `G_MAXSSIZE`. Otherwise it will be truncated to this size. For other types + * [method@GLib.Variant.print] will be used to convert the value into a string. * - * For more details on its usage and about the parameters, see g_log_structured(). + * For more details on its usage and about the parameters, see [func@GLib.log_structured]. * * Since: 2.50 */ - void g_log_variant (const gchar *log_domain, GLogLevelFlags log_level, @@ -1935,18 +1808,20 @@ static GLogWriterOutput _g_log_writer_fallback (GLogLevelFlags log_level, /** * g_log_structured_array: - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @fields: (array length=n_fields): key–value pairs of structured data to add * to the log message * @n_fields: number of elements in the @fields array * - * Log a message with structured data. The message will be passed through to the - * log writer set by the application using g_log_set_writer_func(). If the - * message is fatal (i.e. its log level is %G_LOG_LEVEL_ERROR), the program will + * Log a message with structured data. + * + * The message will be passed through to the log writer set by the application + * using [func@GLib.log_set_writer_func]. If the + * message is fatal (i.e. its log level is [flags@GLib.LogLevelFlags.LEVEL_ERROR]), the program will * be aborted at the end of this function. * - * See g_log_structured() for more documentation. + * See [func@GLib.log_structured] for more documentation. * * This assumes that @log_level is already present in @fields (typically as the * `PRIORITY` field). @@ -2045,14 +1920,16 @@ g_log_structured_standard (const gchar *log_domain, /** * g_log_set_writer_func: - * @func: log writer function, which must not be %NULL + * @func: log writer function, which must not be `NULL` * @user_data: (closure func): user data to pass to @func * @user_data_free: (destroy func): function to free @user_data once it’s - * finished with, if non-%NULL + * finished with, if non-`NULL` * * Set a writer function which will be called to format and write out each log - * message. Each program should set a writer function, or the default writer - * (g_log_writer_default()) will be used. + * message. + * + * Each program should set a writer function, or the default writer + * ([func@GLib.log_writer_default]) will be used. * * Libraries **must not** call this function — only programs are allowed to * install a writer function, as there must be a single, central point where @@ -2089,11 +1966,12 @@ g_log_set_writer_func (GLogWriterFunc func, * g_log_writer_supports_color: * @output_fd: output file descriptor to check * - * Check whether the given @output_fd file descriptor supports ANSI color - * escape sequences. If so, they can safely be used when formatting log - * messages. + * Check whether the given @output_fd file descriptor supports + * [ANSI color escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code). * - * Returns: %TRUE if ANSI color escapes are supported, %FALSE otherwise + * If so, they can safely be used when formatting log messages. + * + * Returns: `TRUE` if ANSI color escapes are supported, `FALSE` otherwise * Since: 2.50 */ gboolean @@ -2168,6 +2046,13 @@ reset_invalid_param_handler: #endif } +#ifdef HAVE_SYSLOG_H +static gboolean syslog_opened = FALSE; +#ifndef __linux__ +G_LOCK_DEFINE_STATIC (syslog_opened); +#endif +#endif + #if defined(__linux__) && !defined(__BIONIC__) static int journal_fd = -1; @@ -2201,13 +2086,13 @@ open_journal (void) * systemd journal, or something else (like a log file or `stdout` or * `stderr`). * - * Invalid file descriptors are accepted and return %FALSE, which allows for + * Invalid file descriptors are accepted and return `FALSE`, which allows for * the following construct without needing any additional error handling: - * |[ - * is_journald = g_log_writer_is_journald (fileno (stderr)); - * ]| + * ```c + * is_journald = g_log_writer_is_journald (fileno (stderr)); + * ``` * - * Returns: %TRUE if @output_fd points to the journal, %FALSE otherwise + * Returns: `TRUE` if @output_fd points to the journal, `FALSE` otherwise * Since: 2.50 */ gboolean @@ -2224,18 +2109,21 @@ static void escape_string (GString *string); /** * g_log_writer_format_fields: - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @fields: (array length=n_fields): key–value pairs of structured data forming * the log message * @n_fields: number of elements in the @fields array - * @use_color: %TRUE to use ANSI color escape sequences when formatting the - * message, %FALSE to not + * @use_color: `TRUE` to use + * [ANSI color escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code) + * when formatting the message, `FALSE` to not * * Format a structured log message as a string suitable for outputting to the - * terminal (or elsewhere). This will include the values of all fields it knows + * terminal (or elsewhere). + * + * This will include the values of all fields it knows * how to interpret, which includes `MESSAGE` and `GLIB_DOMAIN` (see the - * documentation for g_log_structured()). It does not include values from + * documentation for [func@GLib.log_structured]). It does not include values from * unknown fields. * * The returned string does **not** have a trailing new-line character. It is @@ -2354,6 +2242,113 @@ g_log_writer_format_fields (GLogLevelFlags log_level, return g_string_free (gstring, FALSE); } +/** + * g_log_writer_syslog: + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined + * level + * @fields: (array length=n_fields): key–value pairs of structured data forming + * the log message + * @n_fields: number of elements in the @fields array + * @user_data: user data passed to [func@GLib.log_set_writer_func] + * + * Format a structured log message and send it to the syslog daemon. Only fields + * which are understood by this function are included in the formatted string + * which is printed. + * + * Log facility will be defined via the SYSLOG_FACILITY field and accepts the following + * values: "auth", "daemon", and "user". If SYSLOG_FACILITY is not specified, LOG_USER + * facility will be used. + * + * This is suitable for use as a [type@GLib.LogWriterFunc]. + * + * If syslog is not supported, this function is still defined, but will always + * return [enum@GLib.LogWriterOutput.UNHANDLED]. + * + * Returns: [enum@GLib.LogWriterOutput.HANDLED] on success, [enum@GLib.LogWriterOutput.UNHANDLED] otherwise + * Since: 2.80 + */ +GLogWriterOutput +g_log_writer_syslog (GLogLevelFlags log_level, + const GLogField *fields, + gsize n_fields, + gpointer user_data) +{ +#ifdef HAVE_SYSLOG_H + gsize i; + const char *message = NULL; + const char *log_domain = NULL; + int syslog_facility = 0; + int syslog_level; + gssize message_length = -1; + gssize log_domain_length = -1; + GString *gstring; + + g_return_val_if_fail (fields != NULL, G_LOG_WRITER_UNHANDLED); + g_return_val_if_fail (n_fields > 0, G_LOG_WRITER_UNHANDLED); + +/* As not all man pages provide sufficient information about the thread safety + * of the openlog() routine or even describe alternative routines like logopen_r() + * intended for multi-threaded applications, use locking on non-Linux platforms till + * the situation can be cleared. See the following links for more information: + * FreeBSD: https://man.freebsd.org/cgi/man.cgi?query=openlog + * NetBSD: https://man.netbsd.org/openlog.3 + * POSIX: https://pubs.opengroup.org/onlinepubs/9699919799.2008edition/functions/openlog.html# + */ +#ifndef __linux__ + G_LOCK (syslog_opened); +#endif + + if (!syslog_opened) + { + openlog (NULL, 0, 0); + syslog_opened = TRUE; + } + +#ifndef __linux__ + G_UNLOCK (syslog_opened); +#endif + + for (i = 0; i < n_fields; i++) + { + const GLogField *field = &fields[i]; + + if (g_strcmp0 (field->key, "MESSAGE") == 0) + { + message = field->value; + message_length = field->length; + } + else if (g_strcmp0 (field->key, "GLIB_DOMAIN") == 0) + { + log_domain = field->value; + log_domain_length = field->length; + } + else if (g_strcmp0 (field->key, "SYSLOG_FACILITY") == 0) + { + syslog_facility = str_to_syslog_facility (field->value); + } + } + + gstring = g_string_new (NULL); + + if (log_domain != NULL) + { + g_string_append_len (gstring, log_domain, log_domain_length); + g_string_append (gstring, ": "); + } + + g_string_append_len (gstring, message, message_length); + + syslog_level = atoi (log_level_to_priority (log_level)); + syslog (syslog_level | syslog_facility, "%s", gstring->str); + + g_string_free (gstring, TRUE); + + return G_LOG_WRITER_HANDLED; +#else + return G_LOG_WRITER_UNHANDLED; +#endif /* HAVE_SYSLOG_H */ +} + /* Enable support for the journal if we're on a recent enough Linux */ #if defined(__linux__) && !defined(__BIONIC__) && defined(HAVE_MKOSTEMP) && defined(O_CLOEXEC) #define ENABLE_JOURNAL_SENDV @@ -2447,24 +2442,26 @@ retry2: /** * g_log_writer_journald: - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @fields: (array length=n_fields): key–value pairs of structured data forming * the log message * @n_fields: number of elements in the @fields array - * @user_data: user data passed to g_log_set_writer_func() + * @user_data: user data passed to [func@GLib.log_set_writer_func] * * Format a structured log message and send it to the systemd journal as a set - * of key–value pairs. All fields are sent to the journal, but if a field has + * of key–value pairs. + * + * All fields are sent to the journal, but if a field has * length zero (indicating program-specific data) then only its key will be * sent. * - * This is suitable for use as a #GLogWriterFunc. + * This is suitable for use as a [type@GLib.LogWriterFunc]. * * If GLib has been compiled without systemd support, this function is still - * defined, but will always return %G_LOG_WRITER_UNHANDLED. + * defined, but will always return [enum@GLib.LogWriterOutput.UNHANDLED]. * - * Returns: %G_LOG_WRITER_HANDLED on success, %G_LOG_WRITER_UNHANDLED otherwise + * Returns: [enum@GLib.LogWriterOutput.HANDLED] on success, [enum@GLib.LogWriterOutput.UNHANDLED] otherwise * Since: 2.50 */ GLogWriterOutput @@ -2558,29 +2555,33 @@ g_log_writer_journald (GLogLevelFlags log_level, /** * g_log_writer_standard_streams: - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @fields: (array length=n_fields): key–value pairs of structured data forming * the log message * @n_fields: number of elements in the @fields array - * @user_data: user data passed to g_log_set_writer_func() + * @user_data: user data passed to [func@GLib.log_set_writer_func] * * Format a structured log message and print it to either `stdout` or `stderr`, - * depending on its log level. %G_LOG_LEVEL_INFO and %G_LOG_LEVEL_DEBUG messages + * depending on its log level. + * + * [flags@GLib.LogLevelFlags.LEVEL_INFO] and [flags@GLib.LogLevelFlags.LEVEL_DEBUG] messages * are sent to `stdout`, or to `stderr` if requested by - * g_log_writer_default_set_use_stderr(); + * [func@GLib.log_writer_default_set_use_stderr]; * all other log levels are sent to `stderr`. Only fields * which are understood by this function are included in the formatted string * which is printed. * - * If the output stream supports ANSI color escape sequences, they will be used - * in the output. + * If the output stream supports + * [ANSI color escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code), + * they will be used in the output. * * A trailing new-line character is added to the log message when it is printed. * - * This is suitable for use as a #GLogWriterFunc. + * This is suitable for use as a [type@GLib.LogWriterFunc]. * - * Returns: %G_LOG_WRITER_HANDLED on success, %G_LOG_WRITER_UNHANDLED otherwise + * Returns: [enum@GLib.LogWriterOutput.HANDLED] on success, + * [enum@GLib.LogWriterOutput.UNHANDLED] otherwise * Since: 2.50 */ GLogWriterOutput @@ -2626,6 +2627,58 @@ log_is_old_api (const GLogField *fields, g_strcmp0 (fields[0].value, "1") == 0); } +static gboolean +domain_found (const gchar *domains, + const char *log_domain) +{ + guint len; + const gchar *found; + + len = strlen (log_domain); + + for (found = strstr (domains, log_domain); found; + found = strstr (found + 1, log_domain)) + { + if ((found == domains || found[-1] == ' ') + && (found[len] == 0 || found[len] == ' ')) + return TRUE; + } + + return FALSE; +} + +static struct { + GRWLock lock; + gchar *domains; + gboolean domains_set; +} g_log_global; + +/** + * g_log_writer_default_set_debug_domains: + * @domains: (nullable) (transfer none): `NULL`-terminated array with domains to be printed. + * `NULL` or an array with no values means none. Array with a single value `"all"` means all. + * + * Reset the list of domains to be logged, that might be initially set by the + * `G_MESSAGES_DEBUG` environment variable. + * + * This function is thread-safe. + * + * Since: 2.80 + */ +void +g_log_writer_default_set_debug_domains (const gchar * const *domains) +{ + g_rw_lock_writer_lock (&g_log_global.lock); + + g_free (g_log_global.domains); + g_log_global.domains = domains ? + g_strjoinv (" ", (gchar **)domains) : NULL; + + g_log_global.domains_set = TRUE; + + g_rw_lock_writer_unlock (&g_log_global.lock); +} + /* * Internal version of g_log_writer_default_would_drop(), which can * read from either a log_domain or an array of fields. This avoids @@ -2643,14 +2696,22 @@ should_drop_message (GLogLevelFlags log_level, !(log_level >> G_LOG_LEVEL_USER_SHIFT) && !g_log_get_debug_enabled ()) { - const gchar *domains; gsize i; - domains = g_getenv ("G_MESSAGES_DEBUG"); + g_rw_lock_reader_lock (&g_log_global.lock); + + if (G_UNLIKELY (!g_log_global.domains_set)) + { + g_log_global.domains = g_strdup (g_getenv ("G_MESSAGES_DEBUG")); + g_log_global.domains_set = TRUE; + } if ((log_level & INFO_LEVELS) == 0 || - domains == NULL) - return TRUE; + g_log_global.domains == NULL) + { + g_rw_lock_reader_unlock (&g_log_global.lock); + return TRUE; + } if (log_domain == NULL) { @@ -2664,9 +2725,14 @@ should_drop_message (GLogLevelFlags log_level, } } - if (strcmp (domains, "all") != 0 && - (log_domain == NULL || !strstr (domains, log_domain))) - return TRUE; + if (strcmp (g_log_global.domains, "all") != 0 && + (log_domain == NULL || !domain_found (g_log_global.domains, log_domain))) + { + g_rw_lock_reader_unlock (&g_log_global.lock); + return TRUE; + } + + g_rw_lock_reader_unlock (&g_log_global.lock); } return FALSE; @@ -2675,39 +2741,38 @@ should_drop_message (GLogLevelFlags log_level, /** * g_log_writer_default_would_drop: * @log_domain: (nullable): log domain - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * - * Check whether g_log_writer_default() and g_log_default_handler() would + * Check whether [func@GLib.log_writer_default] and [func@GLib.log_default_handler] would * ignore a message with the given domain and level. * - * As with g_log_default_handler(), this function drops debug and informational + * As with [func@GLib.log_default_handler], this function drops debug and informational * messages unless their log domain (or `all`) is listed in the space-separated - * `G_MESSAGES_DEBUG` environment variable. + * `G_MESSAGES_DEBUG` environment variable, or by [func@GLib.log_writer_default_set_debug_domains]. * * This can be used when implementing log writers with the same filtering * behaviour as the default, but a different destination or output format: * - * |[ - * if (g_log_writer_default_would_drop (log_level, log_domain)) - * return G_LOG_WRITER_HANDLED; + * ```c + * if (g_log_writer_default_would_drop (log_level, log_domain)) + * return G_LOG_WRITER_HANDLED; * ]| * * or to skip an expensive computation if it is only needed for a debugging * message, and `G_MESSAGES_DEBUG` is not set: * - * |[ - * if (!g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, G_LOG_DOMAIN)) - * { - * gchar *result = expensive_computation (my_object); + * ```c + * if (!g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, G_LOG_DOMAIN)) + * { + * g_autofree gchar *result = expensive_computation (my_object); * - * g_debug ("my_object result: %s", result); - * g_free (result); - * } - * ]| + * g_debug ("my_object result: %s", result); + * } + * ``` * - * Returns: %TRUE if the log message would be dropped by GLib's - * default log handlers + * Returns: `TRUE` if the log message would be dropped by GLib’s + * default log handlers * Since: 2.68 */ gboolean @@ -2719,15 +2784,17 @@ g_log_writer_default_would_drop (GLogLevelFlags log_level, /** * g_log_writer_default: - * @log_level: log level, either from #GLogLevelFlags, or a user-defined + * @log_level: log level, either from [type@GLib.LogLevelFlags], or a user-defined * level * @fields: (array length=n_fields): key–value pairs of structured data forming * the log message * @n_fields: number of elements in the @fields array - * @user_data: user data passed to g_log_set_writer_func() + * @user_data: user data passed to [func@GLib.log_set_writer_func] * * Format a structured log message and output it to the default log destination - * for the platform. On Linux, this is typically the systemd journal, falling + * for the platform. + * + * On Linux, this is typically the systemd journal, falling * back to `stdout` or `stderr` if running from the terminal or if output is * being redirected to a file. * @@ -2735,18 +2802,19 @@ g_log_writer_default_would_drop (GLogLevelFlags log_level, * future. Distributors of GLib may modify this function to impose their own * (documented) platform-specific log writing policies. * - * This is suitable for use as a #GLogWriterFunc, and is the default writer used - * if no other is set using g_log_set_writer_func(). + * This is suitable for use as a [type@GLib.LogWriterFunc], and is the default writer used + * if no other is set using [func@GLib.log_set_writer_func]. * - * As with g_log_default_handler(), this function drops debug and informational + * As with [func@GLib.log_default_handler], this function drops debug and informational * messages unless their log domain (or `all`) is listed in the space-separated - * `G_MESSAGES_DEBUG` environment variable. + * `G_MESSAGES_DEBUG` environment variable, or set at runtime by [func@GLib.log_writer_default_set_debug_domains]. * - * g_log_writer_default() uses the mask set by g_log_set_always_fatal() to - * determine which messages are fatal. When using a custom writer func instead it is + * [func@GLib.log_writer_default] uses the mask set by [func@GLib.log_set_always_fatal] to + * determine which messages are fatal. When using a custom writer function instead it is * up to the writer function to determine which log messages are fatal. * - * Returns: %G_LOG_WRITER_HANDLED on success, %G_LOG_WRITER_UNHANDLED otherwise + * Returns: [enum@GLib.LogWriterOutput.HANDLED] on success, + * [enum@GLib.LogWriterOutput.UNHANDLED] otherwise * Since: 2.50 */ GLogWriterOutput @@ -2877,14 +2945,14 @@ _g_log_writer_fallback (GLogLevelFlags log_level, * * Return whether debug output from the GLib logging system is enabled. * - * Note that this should not be used to conditionalise calls to g_debug() or - * other logging functions; it should only be used from %GLogWriterFunc + * Note that this should not be used to conditionalise calls to [func@GLib.debug] or + * other logging functions; it should only be used from [type@GLib.LogWriterFunc] * implementations. * - * Note also that the value of this does not depend on `G_MESSAGES_DEBUG`; see - * the docs for g_log_set_debug_enabled(). + * Note also that the value of this does not depend on `G_MESSAGES_DEBUG`, nor + * [func@GLib.log_writer_default_set_debug_domains]; see the docs for [func@GLib.log_set_debug_enabled]. * - * Returns: %TRUE if debug output is enabled, %FALSE otherwise + * Returns: `TRUE` if debug output is enabled, `FALSE` otherwise * * Since: 2.72 */ @@ -2896,11 +2964,13 @@ g_log_get_debug_enabled (void) /** * g_log_set_debug_enabled: - * @enabled: %TRUE to enable debug output, %FALSE otherwise + * @enabled: `TRUE` to enable debug output, `FALSE` otherwise * * Enable or disable debug output from the GLib logging system for all domains. - * This value interacts disjunctively with `G_MESSAGES_DEBUG` — if either of - * them would allow a debug message to be outputted, it will be. + * + * This value interacts disjunctively with `G_MESSAGES_DEBUG` and + * [func@GLib.log_writer_default_set_debug_domains] — if any of them would allow + * a debug message to be outputted, it will be. * * Note that this should not be used from within library code to enable debug * output — it is intended for external use. @@ -2919,8 +2989,8 @@ g_log_set_debug_enabled (gboolean enabled) * @pretty_function: function containing the assertion * @expression: (nullable): expression which failed * - * Internal function used to print messages from the public g_return_if_fail() - * and g_return_val_if_fail() macros. + * Internal function used to print messages from the public [func@GLib.return_if_fail] + * and [func@GLib.return_val_if_fail] macros. */ void g_return_if_fail_warning (const char *log_domain, @@ -2942,8 +3012,8 @@ g_return_if_fail_warning (const char *log_domain, * @func: function containing the warning * @warnexpr: (nullable): expression which failed * - * Internal function used to print messages from the public g_warn_if_reached() - * and g_warn_if_fail() macros. + * Internal function used to print messages from the public [func@GLib.warn_if_reached] + * and [func@GLib.warn_if_fail] macros. */ void g_warn_message (const char *domain, @@ -2996,42 +3066,43 @@ g_assert_warning (const char *log_domain, * g_test_expect_message: * @log_domain: (nullable): the log domain of the message * @log_level: the log level of the message - * @pattern: a glob-style [pattern][glib-Glob-style-pattern-matching] + * @pattern: a glob-style pattern (see [type@GLib.PatternSpec]) * * Indicates that a message with the given @log_domain and @log_level, - * with text matching @pattern, is expected to be logged. When this - * message is logged, it will not be printed, and the test case will + * with text matching @pattern, is expected to be logged. + * + * When this message is logged, it will not be printed, and the test case will * not abort. * - * This API may only be used with the old logging API (g_log() without - * %G_LOG_USE_STRUCTURED defined). It will not work with the structured logging - * API. See [Testing for Messages][testing-for-messages]. + * This API may only be used with the old logging API ([func@GLib.log] without + * `G_LOG_USE_STRUCTURED` defined). It will not work with the structured logging + * API. See [Testing for Messages](logging.html#testing-for-messages). * - * Use g_test_assert_expected_messages() to assert that all + * Use [func@GLib.test_assert_expected_messages] to assert that all * previously-expected messages have been seen and suppressed. * * You can call this multiple times in a row, if multiple messages are * expected as a result of a single call. (The messages must appear in - * the same order as the calls to g_test_expect_message().) + * the same order as the calls to [func@GLib.test_expect_message].) * * For example: * - * |[ - * // g_main_context_push_thread_default() should fail if the - * // context is already owned by another thread. - * g_test_expect_message (G_LOG_DOMAIN, - * G_LOG_LEVEL_CRITICAL, - * "assertion*acquired_context*failed"); - * g_main_context_push_thread_default (bad_context); - * g_test_assert_expected_messages (); - * ]| + * ```c + * // g_main_context_push_thread_default() should fail if the + * // context is already owned by another thread. + * g_test_expect_message (G_LOG_DOMAIN, + * G_LOG_LEVEL_CRITICAL, + * "assertion*acquired_context*failed"); + * g_main_context_push_thread_default (bad_context); + * g_test_assert_expected_messages (); + * ``` * - * Note that you cannot use this to test g_error() messages, since - * g_error() intentionally never returns even if the program doesn't - * abort; use g_test_trap_subprocess() in this case. + * Note that you cannot use this to test [func@GLib.error] messages, since + * [func@GLib.error] intentionally never returns even if the program doesn’t + * abort; use [func@GLib.test_trap_subprocess] in this case. * - * If messages at %G_LOG_LEVEL_DEBUG are emitted, but not explicitly - * expected via g_test_expect_message() then they will be ignored. + * If messages at [flags@GLib.LogLevelFlags.LEVEL_DEBUG] are emitted, but not explicitly + * expected via [func@GLib.test_expect_message] then they will be ignored. * * Since: 2.34 */ @@ -3081,14 +3152,14 @@ g_test_assert_expected_messages_internal (const char *domain, * g_test_assert_expected_messages: * * Asserts that all messages previously indicated via - * g_test_expect_message() have been seen and suppressed. + * [func@GLib.test_expect_message] have been seen and suppressed. * - * This API may only be used with the old logging API (g_log() without - * %G_LOG_USE_STRUCTURED defined). It will not work with the structured logging - * API. See [Testing for Messages][testing-for-messages]. + * This API may only be used with the old logging API ([func@GLib.log] without + * `G_LOG_USE_STRUCTURED` defined). It will not work with the structured logging + * API. See [Testing for Messages](logging.html#testing-for-messages). * - * If messages at %G_LOG_LEVEL_DEBUG are emitted, but not explicitly - * expected via g_test_expect_message() then they will be ignored. + * If messages at [flags@GLib.LogLevelFlags.LEVEL_DEBUG] are emitted, but not explicitly + * expected via [func@GLib.test_expect_message] then they will be ignored. * * Since: 2.34 */ @@ -3204,38 +3275,40 @@ escape_string (GString *string) /** * g_log_default_handler: - * @log_domain: (nullable): the log domain of the message, or %NULL for the - * default "" application domain + * @log_domain: (nullable): the log domain of the message, or `NULL` for the + * default `""` application domain * @log_level: the level of the message * @message: (nullable): the message - * @unused_data: (nullable): data passed from g_log() which is unused + * @unused_data: (nullable): data passed from [func@GLib.log] which is unused * - * The default log handler set up by GLib; g_log_set_default_handler() + * The default log handler set up by GLib; [func@GLib.log_set_default_handler] * allows to install an alternate default log handler. + * * This is used if no log handler has been set for the particular log - * domain and log level combination. It outputs the message to stderr - * or stdout and if the log level is fatal it calls G_BREAKPOINT(). It automatically + * domain and log level combination. It outputs the message to `stderr` + * or `stdout` and if the log level is fatal it calls [func@GLib.BREAKPOINT]. It automatically * prints a new-line character after the message, so one does not need to be * manually included in @message. * * The behavior of this log handler can be influenced by a number of * environment variables: * - * - `G_MESSAGES_PREFIXED`: A :-separated list of log levels for which - * messages should be prefixed by the program name and PID of the - * application. + * - `G_MESSAGES_PREFIXED`: A `:`-separated list of log levels for which + * messages should be prefixed by the program name and PID of the + * application. + * - `G_MESSAGES_DEBUG`: A space-separated list of log domains for + * which debug and informational messages are printed. By default + * these messages are not printed. If you need to set the allowed + * domains at runtime, use [func@GLib.log_writer_default_set_debug_domains]. * - * - `G_MESSAGES_DEBUG`: A space-separated list of log domains for - * which debug and informational messages are printed. By default - * these messages are not printed. - * - * stderr is used for levels %G_LOG_LEVEL_ERROR, %G_LOG_LEVEL_CRITICAL, - * %G_LOG_LEVEL_WARNING and %G_LOG_LEVEL_MESSAGE. stdout is used for - * the rest, unless stderr was requested by - * g_log_writer_default_set_use_stderr(). + * `stderr` is used for levels [flags@GLib.LogLevelFlags.LEVEL_ERROR], + * [flags@GLib.LogLevelFlags.LEVEL_CRITICAL], [flags@GLib.LogLevelFlags.LEVEL_WARNING] and + * [flags@GLib.LogLevelFlags.LEVEL_MESSAGE]. `stdout` is used for + * the rest, unless `stderr` was requested by + * [func@GLib.log_writer_default_set_use_stderr]. * * This has no effect if structured logging is enabled; see - * [Using Structured Logging][using-structured-logging]. + * [Using Structured Logging](logging.html#using-structured-logging). */ void g_log_default_handler (const gchar *log_domain, @@ -3286,24 +3359,24 @@ g_log_default_handler (const gchar *log_domain, /** * g_set_print_handler: - * @func: (nullable): the new print handler or %NULL to + * @func: (nullable): the new print handler or `NULL` to * reset to the default * * Sets the print handler to @func, or resets it to the - * default GLib handler if %NULL. + * default GLib handler if `NULL`. * - * Any messages passed to g_print() will be output via + * Any messages passed to [func@GLib.print] will be output via * the new handler. The default handler outputs - * the encoded message to stdout. By providing your own handler + * the encoded message to `stdout`. By providing your own handler * you can redirect the output, to a GTK widget or a * log file for example. * * Since 2.76 this functions always returns a valid - * #GPrintFunc, and never returns %NULL. If no custom + * [type@GLib.PrintFunc], and never returns `NULL`. If no custom * print handler was set, it will return the GLib * default print handler and that can be re-used to - * decorate its output and/or to write to stderr - * in all platforms. Before GLib 2.76, this was %NULL. + * decorate its output and/or to write to `stderr` + * in all platforms. Before GLib 2.76, this was `NULL`. * * Returns: (not nullable): the old print handler */ @@ -3379,19 +3452,20 @@ g_default_printerr_func (const gchar *string) /** * g_print: - * @format: the message format. See the printf() documentation + * @format: the message format. See the `printf()` documentation * @...: the parameters to insert into the format string * * Outputs a formatted message via the print handler. - * The default print handler outputs the encoded message to stdout, without + * + * The default print handler outputs the encoded message to `stdout`, without * appending a trailing new-line character. Typically, @format should end with * its own new-line character. * - * g_print() should not be used from within libraries for debugging + * This function should not be used from within libraries for debugging * messages, since it may be redirected by applications to special * purpose message windows or even files. Instead, libraries should - * use g_log(), g_log_structured(), or the convenience macros g_message(), - * g_warning() and g_error(). + * use [func@GLib.log], [func@GLib.log_structured], or the convenience macros + * [func@GLib.message], [func@GLib.warning] and [func@GLib.error]. */ void g_print (const gchar *format, @@ -3415,24 +3489,24 @@ g_print (const gchar *format, /** * g_set_printerr_handler: - * @func: (nullable): he new error message handler or %NULL - * to reset to the default + * @func: (nullable): he new error message handler or `NULL` + * to reset to the default * * Sets the handler for printing error messages to @func, - * or resets it to the default GLib handler if %NULL. + * or resets it to the default GLib handler if `NULL`. * - * Any messages passed to g_printerr() will be output via + * Any messages passed to [func@GLib.printerr] will be output via * the new handler. The default handler outputs the encoded - * message to stderr. By providing your own handler you can + * message to `stderr`. By providing your own handler you can * redirect the output, to a GTK widget or a log file for * example. * * Since 2.76 this functions always returns a valid - * #GPrintFunc, and never returns %NULL. If no custom error + * [type@GLib.PrintFunc], and never returns `NULL`. If no custom error * print handler was set, it will return the GLib default * error print handler and that can be re-used to decorate - * its output and/or to write to stderr in all platforms. - * Before GLib 2.76, this was %NULL. + * its output and/or to write to `stderr` in all platforms. + * Before GLib 2.76, this was `NULL`. * * Returns: (not nullable): the old error message handler */ @@ -3445,17 +3519,18 @@ g_set_printerr_handler (GPrintFunc func) /** * g_printerr: - * @format: the message format. See the printf() documentation + * @format: the message format. See the `printf()` documentation * @...: the parameters to insert into the format string * * Outputs a formatted message via the error message handler. - * The default handler outputs the encoded message to stderr, without appending + * + * The default handler outputs the encoded message to `stderr`, without appending * a trailing new-line character. Typically, @format should end with its own * new-line character. * - * g_printerr() should not be used from within libraries. - * Instead g_log() or g_log_structured() should be used, or the convenience - * macros g_message(), g_warning() and g_error(). + * This function should not be used from within libraries. + * Instead [func@GLib.log] or [func@GLib.log_structured] should be used, or the convenience + * macros [func@GLib.message], [func@GLib.warning] and [func@GLib.error]. */ void g_printerr (const gchar *format, @@ -3479,18 +3554,31 @@ g_printerr (const gchar *format, /** * g_printf_string_upper_bound: - * @format: the format string. See the printf() documentation + * @format: the format string. See the `printf()` documentation * @args: the parameters to be inserted into the format string * * Calculates the maximum space needed to store the output - * of the sprintf() function. + * of the `sprintf()` function. * - * Returns: the maximum space needed to store the formatted string + * If @format or @args are invalid, `0` is returned. This could happen if, for + * example, @format contains an `%lc` or `%ls` placeholder and @args contains a + * wide character which cannot be represented in multibyte encoding. `0` + * can also be returned legitimately if, for example, @format is `%s` and @args + * is an empty string. The caller is responsible for differentiating these two + * return cases if necessary. It is recommended to not use `%lc` or `%ls` + * placeholders in any case, as their behaviour is locale-dependent. + * + * Returns: the maximum space needed to store the formatted string, or `0` on error */ gsize g_printf_string_upper_bound (const gchar *format, va_list args) { gchar c; - return _g_vsnprintf (&c, 1, format, args) + 1; + int count = _g_vsnprintf (&c, 1, format, args); + + if (count < 0) + return 0; + + return count + 1; } diff --git a/glib/gmessages.h b/glib/gmessages.h index eab6d06..4867cdc 100644 --- a/glib/gmessages.h +++ b/glib/gmessages.h @@ -229,6 +229,11 @@ gchar *g_log_writer_format_fields (GLogLevelFlags log_level, gsize n_fields, gboolean use_color); +GLIB_AVAILABLE_IN_2_80 +GLogWriterOutput g_log_writer_syslog (GLogLevelFlags log_level, + const GLogField *fields, + gsize n_fields, + gpointer user_data); GLIB_AVAILABLE_IN_2_50 GLogWriterOutput g_log_writer_journald (GLogLevelFlags log_level, const GLogField *fields, @@ -250,6 +255,9 @@ void g_log_writer_default_set_use_stderr (gboolean use_stderr); GLIB_AVAILABLE_IN_2_68 gboolean g_log_writer_default_would_drop (GLogLevelFlags log_level, const char *log_domain); +GLIB_AVAILABLE_IN_2_80 +void g_log_writer_default_set_debug_domains (const gchar * const *domains); + /* G_MESSAGES_DEBUG enablement */ GLIB_AVAILABLE_IN_2_72 @@ -544,6 +552,9 @@ GPrintFunc g_set_printerr_handler (GPrintFunc func); * * Logs a warning if the expression is not true. * + * Unlike g_return_if_fail(), the expression is always evaluated, even if + * checks and assertions are disabled. + * * Since: 2.16 */ #define g_warn_if_fail(expr) \ diff --git a/glib/gnode.c b/glib/gnode.c index b9a68c2..8e0187f 100644 --- a/glib/gnode.c +++ b/glib/gnode.c @@ -39,43 +39,6 @@ #include "gtestutils.h" -/** - * SECTION:trees-nary - * @title: N-ary Trees - * @short_description: trees of data with any number of branches - * - * The #GNode struct and its associated functions provide a N-ary tree - * data structure, where nodes in the tree can contain arbitrary data. - * - * To create a new tree use g_node_new(). - * - * To insert a node into a tree use g_node_insert(), - * g_node_insert_before(), g_node_append() and g_node_prepend(). - * - * To create a new node and insert it into a tree use - * g_node_insert_data(), g_node_insert_data_after(), - * g_node_insert_data_before(), g_node_append_data() - * and g_node_prepend_data(). - * - * To reverse the children of a node use g_node_reverse_children(). - * - * To find a node use g_node_get_root(), g_node_find(), - * g_node_find_child(), g_node_child_index(), g_node_child_position(), - * g_node_first_child(), g_node_last_child(), g_node_nth_child(), - * g_node_first_sibling(), g_node_prev_sibling(), g_node_next_sibling() - * or g_node_last_sibling(). - * - * To get information about a node or tree use G_NODE_IS_LEAF(), - * G_NODE_IS_ROOT(), g_node_depth(), g_node_n_nodes(), - * g_node_n_children(), g_node_is_ancestor() or g_node_max_height(). - * - * To traverse a tree, calling a function for each node visited in the - * traversal, use g_node_traverse() or g_node_children_foreach(). - * - * To remove a node or subtree from a tree use g_node_unlink() or - * g_node_destroy(). - **/ - /** * GNode: * @data: contains the actual data of the node. @@ -170,8 +133,8 @@ g_node_unlink (GNode *node) /** * g_node_copy_deep: * @node: a #GNode - * @copy_func: the function which is called to copy the data inside each node, - * or %NULL to use the original data. + * @copy_func: (scope call): the function which is called to copy the data + * inside each node, or %NULL to use the original data. * @data: data to pass to @copy_func * * Recursively copies a #GNode and its data. @@ -812,7 +775,7 @@ g_node_depth_traverse_level (GNode *node, * depth will not be visited. If max_depth is -1 all nodes in * the tree are visited. If depth is 1, only the root is visited. * If depth is 2, the root and its children are visited. And so on. - * @func: the function to call for each visited #GNode + * @func: (scope call): the function to call for each visited #GNode * @data: user data to pass to the function * * Traverses a tree starting at the given root #GNode. @@ -1235,7 +1198,7 @@ g_node_last_sibling (GNode *node) * @node: a #GNode * @flags: which types of children are to be visited, one of * %G_TRAVERSE_ALL, %G_TRAVERSE_LEAVES and %G_TRAVERSE_NON_LEAVES - * @func: the function to call for each visited node + * @func: (scope call): the function to call for each visited node * @data: user data to pass to the function * * Calls a function for each of the children of a #GNode. Note that it diff --git a/glib/gnulib/gl_cv_func_frexpl_works/meson.build b/glib/gnulib/gl_cv_func_frexpl_works/meson.build index 68af202..bff9cad 100644 --- a/glib/gnulib/gl_cv_func_frexpl_works/meson.build +++ b/glib/gnulib/gl_cv_func_frexpl_works/meson.build @@ -86,6 +86,7 @@ int main() long double y = frexpl (x, &exp); /* On machines with IEEE854 arithmetic: x = 1.68105e-4932, exp = -16382, y = 0.5. On Mac OS X 10.5: exp = -16384, y = 0.5. */ + (void) y; if (exp != LDBL_MIN_EXP - 1) result |= 8; } diff --git a/glib/gnulib/gl_cv_func_printf_directive_a/meson.build b/glib/gnulib/gl_cv_func_printf_directive_a/meson.build index 3283c98..6cb2964 100644 --- a/glib/gnulib/gl_cv_func_printf_directive_a/meson.build +++ b/glib/gnulib/gl_cv_func_printf_directive_a/meson.build @@ -16,27 +16,27 @@ static double zero = 0.0; int main () { int result = 0; - if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0 + if (sprintf (buf, "%a %d", 3.1416015625, 33) < 0 || (strcmp (buf, "0x1.922p+1 33") != 0 && strcmp (buf, "0x3.244p+0 33") != 0 && strcmp (buf, "0x6.488p-1 33") != 0 && strcmp (buf, "0xc.91p-2 33") != 0)) result |= 1; - if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0 + if (sprintf (buf, "%A %d", -3.1416015625, 33) < 0 || (strcmp (buf, "-0X1.922P+1 33") != 0 && strcmp (buf, "-0X3.244P+0 33") != 0 && strcmp (buf, "-0X6.488P-1 33") != 0 && strcmp (buf, "-0XC.91P-2 33") != 0)) result |= 2; /* This catches a FreeBSD 6.1 bug: it doesn't round. */ - if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0 + if (sprintf (buf, "%.2a %d", 1.51, 33) < 0 || (strcmp (buf, "0x1.83p+0 33") != 0 && strcmp (buf, "0x3.05p-1 33") != 0 && strcmp (buf, "0x6.0ap-2 33") != 0 && strcmp (buf, "0xc.14p-3 33") != 0)) result |= 4; /* This catches a Mac OS X 10.12.4 (Darwin 16.5) bug: it doesn't round. */ - if (sprintf (buf, "%.0a %d", 1.51, 33, 44, 55) < 0 + if (sprintf (buf, "%.0a %d", 1.51, 33) < 0 || (strcmp (buf, "0x2p+0 33") != 0 && strcmp (buf, "0x3p-1 33") != 0 && strcmp (buf, "0x6p-2 33") != 0 @@ -44,7 +44,7 @@ int main () result |= 4; /* This catches a FreeBSD 6.1 bug. See */ - if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0 + if (sprintf (buf, "%010a %d", 1.0 / zero, 33) < 0 || buf[0] == '0') result |= 8; /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug. */ diff --git a/glib/gnulib/gl_cv_func_printf_directive_f/meson.build b/glib/gnulib/gl_cv_func_printf_directive_f/meson.build index afde78b..5137e98 100644 --- a/glib/gnulib/gl_cv_func_printf_directive_f/meson.build +++ b/glib/gnulib/gl_cv_func_printf_directive_f/meson.build @@ -15,7 +15,7 @@ static double zero = 0.0; int main () { int result = 0; - if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0 + if (sprintf (buf, "%F %d", 1234567.0, 33) < 0 || strcmp (buf, "1234567.000000 33") != 0) result |= 1; if (sprintf (buf, "%F", 1.0 / zero) < 0 diff --git a/glib/gnulib/gl_cv_func_printf_flag_zero/meson.build b/glib/gnulib/gl_cv_func_printf_flag_zero/meson.build index 2cb00a8..eea5dbb 100644 --- a/glib/gnulib/gl_cv_func_printf_flag_zero/meson.build +++ b/glib/gnulib/gl_cv_func_printf_flag_zero/meson.build @@ -15,7 +15,7 @@ static char buf[100]; static double zero = 0.0; int main () { - if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0 + if (sprintf (buf, "%010f", 1.0 / zero) < 0 || (strcmp (buf, " inf") != 0 && strcmp (buf, " infinity") != 0)) return 1; diff --git a/glib/gnulib/gl_cv_func_printf_long_double/meson.build b/glib/gnulib/gl_cv_func_printf_long_double/meson.build index 3d0e019..2659ca3 100644 --- a/glib/gnulib/gl_cv_func_printf_long_double/meson.build +++ b/glib/gnulib/gl_cv_func_printf_long_double/meson.build @@ -15,15 +15,15 @@ int main () { int result = 0; buf[0] = '\0'; - if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0 + if (sprintf (buf, "%Lf %d", 1.75L, 33) < 0 || strcmp (buf, "1.750000 33") != 0) result |= 1; buf[0] = '\0'; - if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0 + if (sprintf (buf, "%Le %d", 1.75L, 33) < 0 || strcmp (buf, "1.750000e+00 33") != 0) result |= 2; buf[0] = '\0'; - if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0 + if (sprintf (buf, "%Lg %d", 1.75L, 33) < 0 || strcmp (buf, "1.75 33") != 0) result |= 4; return result; diff --git a/glib/gnulib/gl_cv_func_printf_precision/meson.build b/glib/gnulib/gl_cv_func_printf_precision/meson.build index 35290c5..bd39094 100644 --- a/glib/gnulib/gl_cv_func_printf_precision/meson.build +++ b/glib/gnulib/gl_cv_func_printf_precision/meson.build @@ -23,14 +23,14 @@ int main () /* On BeOS, this would crash and show a dialog box. Avoid the crash. */ return 1; #endif - if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3) + if (sprintf (buf, "%.4000d %d", 1, 33) < 4000 + 3) result |= 1; - if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5) + if (sprintf (buf, "%.4000f %d", 1.0, 33) < 4000 + 5) result |= 2; - if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5 + if (sprintf (buf, "%.511f %d", 1.0, 33) < 511 + 5 || buf[0] != '1') result |= 4; - if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5 + if (sprintf (buf, "%.999f %d", 1.0, 33) < 999 + 5 || buf[0] != '1') result |= 4; return result; diff --git a/glib/goption.c b/glib/goption.c index 0f6f331..530e0cd 100644 --- a/glib/goption.c +++ b/glib/goption.c @@ -19,166 +19,6 @@ * along with this library; if not, see . */ -/** - * SECTION:goptioncontext - * @Short_description: parses commandline options - * @Title: Commandline option parser - * - * The GOption commandline parser is intended to be a simpler replacement - * for the popt library. It supports short and long commandline options, - * as shown in the following example: - * - * `testtreemodel -r 1 --max-size 20 --rand --display=:1.0 -vb -- file1 file2` - * - * The example demonstrates a number of features of the GOption - * commandline parser: - * - * - Options can be single letters, prefixed by a single dash. - * - * - Multiple short options can be grouped behind a single dash. - * - * - Long options are prefixed by two consecutive dashes. - * - * - Options can have an extra argument, which can be a number, a string or - * a filename. For long options, the extra argument can be appended with - * an equals sign after the option name, which is useful if the extra - * argument starts with a dash, which would otherwise cause it to be - * interpreted as another option. - * - * - Non-option arguments are returned to the application as rest arguments. - * - * - An argument consisting solely of two dashes turns off further parsing, - * any remaining arguments (even those starting with a dash) are returned - * to the application as rest arguments. - * - * Another important feature of GOption is that it can automatically - * generate nicely formatted help output. Unless it is explicitly turned - * off with g_option_context_set_help_enabled(), GOption will recognize - * the `--help`, `-?`, `--help-all` and `--help-groupname` options - * (where `groupname` is the name of a #GOptionGroup) and write a text - * similar to the one shown in the following example to stdout. - * - * |[ - * Usage: - * testtreemodel [OPTION...] - test tree model performance - * - * Help Options: - * -h, --help Show help options - * --help-all Show all help options - * --help-gtk Show GTK Options - * - * Application Options: - * -r, --repeats=N Average over N repetitions - * -m, --max-size=M Test up to 2^M items - * --display=DISPLAY X display to use - * -v, --verbose Be verbose - * -b, --beep Beep when done - * --rand Randomize the data - * ]| - * - * GOption groups options in #GOptionGroups, which makes it easy to - * incorporate options from multiple sources. The intended use for this is - * to let applications collect option groups from the libraries it uses, - * add them to their #GOptionContext, and parse all options by a single call - * to g_option_context_parse(). See gtk_get_option_group() for an example. - * - * If an option is declared to be of type string or filename, GOption takes - * care of converting it to the right encoding; strings are returned in - * UTF-8, filenames are returned in the GLib filename encoding. Note that - * this only works if setlocale() has been called before - * g_option_context_parse(). - * - * Here is a complete example of setting up GOption to parse the example - * commandline above and produce the example help output. - * |[ - * static gint repeats = 2; - * static gint max_size = 8; - * static gboolean verbose = FALSE; - * static gboolean beep = FALSE; - * static gboolean randomize = FALSE; - * - * static GOptionEntry entries[] = - * { - * { "repeats", 'r', 0, G_OPTION_ARG_INT, &repeats, "Average over N repetitions", "N" }, - * { "max-size", 'm', 0, G_OPTION_ARG_INT, &max_size, "Test up to 2^M items", "M" }, - * { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, - * { "beep", 'b', 0, G_OPTION_ARG_NONE, &beep, "Beep when done", NULL }, - * { "rand", 0, 0, G_OPTION_ARG_NONE, &randomize, "Randomize the data", NULL }, - * G_OPTION_ENTRY_NULL - * }; - * - * int - * main (int argc, char *argv[]) - * { - * GError *error = NULL; - * GOptionContext *context; - * - * context = g_option_context_new ("- test tree model performance"); - * g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); - * g_option_context_add_group (context, gtk_get_option_group (TRUE)); - * if (!g_option_context_parse (context, &argc, &argv, &error)) - * { - * g_print ("option parsing failed: %s\n", error->message); - * exit (1); - * } - * - * ... - * - * } - * ]| - * - * On UNIX systems, the argv that is passed to main() has no particular - * encoding, even to the extent that different parts of it may have - * different encodings. In general, normal arguments and flags will be - * in the current locale and filenames should be considered to be opaque - * byte strings. Proper use of %G_OPTION_ARG_FILENAME vs - * %G_OPTION_ARG_STRING is therefore important. - * - * Note that on Windows, filenames do have an encoding, but using - * #GOptionContext with the argv as passed to main() will result in a - * program that can only accept commandline arguments with characters - * from the system codepage. This can cause problems when attempting to - * deal with filenames containing Unicode characters that fall outside - * of the codepage. - * - * A solution to this is to use g_win32_get_command_line() and - * g_option_context_parse_strv() which will properly handle full Unicode - * filenames. If you are using #GApplication, this is done - * automatically for you. - * - * The following example shows how you can use #GOptionContext directly - * in order to correctly deal with Unicode filenames on Windows: - * - * |[ - * int - * main (int argc, char **argv) - * { - * GError *error = NULL; - * GOptionContext *context; - * gchar **args; - * - * #ifdef G_OS_WIN32 - * args = g_win32_get_command_line (); - * #else - * args = g_strdupv (argv); - * #endif - * - * // set up context - * - * if (!g_option_context_parse_strv (context, &args, &error)) - * { - * // error happened - * } - * - * ... - * - * g_strfreev (args); - * - * ... - * } - * ]| - */ - #include "config.h" #include @@ -195,6 +35,7 @@ #include "gprintf.h" #include "glibintl.h" +#include "gutilsprivate.h" #if defined G_OS_WIN32 #include @@ -328,7 +169,7 @@ _g_utf8_strwidth (const gchar *p) G_DEFINE_QUARK (g-option-context-error-quark, g_option_error) /** - * g_option_context_new: + * g_option_context_new: (constructor) * @parameter_string: (nullable): a string which is displayed in * the first line of `--help` output, after the usage summary * `programname [OPTION...]` @@ -353,7 +194,7 @@ G_DEFINE_QUARK (g-option-context-error-quark, g_option_error) * function set with g_option_context_set_translate_func(), so * it should normally be passed untranslated. * - * Returns: a newly created #GOptionContext, which must be + * Returns: (transfer full): a newly created #GOptionContext, which must be * freed with g_option_context_free() after use. * * Since: 2.6 @@ -381,7 +222,7 @@ g_option_context_new (const gchar *parameter_string) /** * g_option_context_free: - * @context: a #GOptionContext + * @context: (transfer full): a #GOptionContext * * Frees context and all the groups which have been * added to it. @@ -1973,10 +1814,7 @@ g_option_context_parse (GOptionContext *context, else prgname = platform_get_argv0 (); - if (prgname) - g_set_prgname (prgname); - else - g_set_prgname (""); + g_set_prgname_once (prgname ? prgname : ""); g_free (prgname); } diff --git a/glib/gpathbuf.c b/glib/gpathbuf.c index c7cf048..e51f3f1 100644 --- a/glib/gpathbuf.c +++ b/glib/gpathbuf.c @@ -15,15 +15,13 @@ #include "gstrfuncs.h" /** - * SECTION:gpathbuf - * @Title: GPathBuf - * @Short_description: A mutable path builder + * GPathBuf: * * `GPathBuf` is a helper type that allows you to easily build paths from * individual elements, using the platform specific conventions for path * separators. * - * |[ + * ```c * g_auto (GPathBuf) path; * * g_path_buf_init (&path); @@ -34,11 +32,11 @@ * * g_autofree char *echo = g_path_buf_to_path (&path); * g_assert_cmpstr (echo, ==, "/usr/bin/echo"); - * ]| + * ``` * * You can also load a full path and then operate on its components: * - * |[ + * ```c * g_auto (GPathBuf) path; * * g_path_buf_init_from_path (&path, "/usr/bin/echo"); @@ -48,9 +46,9 @@ * * g_autofree char *sh = g_path_buf_to_path (&path); * g_assert_cmpstr (sh, ==, "/usr/bin/sh"); - * ]| + * ``` * - * `GPathBuf` is available since GLib 2.76. + * Since: 2.76 */ typedef struct { diff --git a/glib/gpathbuf.h b/glib/gpathbuf.h index b423419..1ea01f0 100644 --- a/glib/gpathbuf.h +++ b/glib/gpathbuf.h @@ -16,13 +16,6 @@ G_BEGIN_DECLS typedef struct _GPathBuf GPathBuf; -/** - * GPathBuf: (copy-func g_path_buf_copy) (free-func g_path_buf_free) - * - * A mutable path builder. - * - * Since: 2.76 - */ struct _GPathBuf { /*< private >*/ diff --git a/glib/gpattern.c b/glib/gpattern.c index 09bdd5a..bf61da3 100644 --- a/glib/gpattern.c +++ b/glib/gpattern.c @@ -31,32 +31,24 @@ #include "gutils.h" /** - * SECTION:patterns - * @title: Glob-style pattern matching - * @short_description: matches strings against patterns containing '*' - * (wildcard) and '?' (joker) + * GPatternSpec: * - * The g_pattern_match* functions match a string - * against a pattern containing '*' and '?' wildcards with similar - * semantics as the standard glob() function: '*' matches an arbitrary, + * A `GPatternSpec` struct is the 'compiled' form of a glob-style pattern. + * + * The [func@GLib.pattern_match_simple] and [method@GLib.PatternSpec.match] functions + * match a string against a pattern containing '*' and '?' wildcards with similar + * semantics as the standard `glob()` function: '*' matches an arbitrary, * possibly empty, string, '?' matches an arbitrary character. * - * Note that in contrast to glob(), the '/' character can be matched by + * Note that in contrast to `glob()`, the '/' character can be matched by * the wildcards, there are no '[...]' character ranges and '*' and '?' * can not be escaped to include them literally in a pattern. * - * When multiple strings must be matched against the same pattern, it - * is better to compile the pattern to a #GPatternSpec using - * g_pattern_spec_new() and use g_pattern_match_string() instead of - * g_pattern_match_simple(). This avoids the overhead of repeated + * When multiple strings must be matched against the same pattern, it is better + * to compile the pattern to a [struct@GLib.PatternSpec] using + * [ctor@GLib.PatternSpec.new] and use [method@GLib.PatternSpec.match_string] + * instead of [func@GLib.pattern_match_simple]. This avoids the overhead of repeated * pattern compilation. - **/ - -/** - * GPatternSpec: - * - * A GPatternSpec struct is the 'compiled' form of a pattern. This - * structure is opaque and its fields cannot be accessed directly. */ /* keep enum and structure of gpattern.c and patterntest.c in sync */ diff --git a/glib/gprintf.c b/glib/gprintf.c index a0ccef9..c9a9914 100644 --- a/glib/gprintf.c +++ b/glib/gprintf.c @@ -30,20 +30,20 @@ /** * g_printf: - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @...: the arguments to insert in the output. + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @...: the arguments to insert in the output * - * An implementation of the standard printf() function which supports + * An implementation of the standard `printf()` function which supports * positional parameters, as specified in the Single Unix Specification. * - * As with the standard printf(), this does not automatically append a trailing + * As with the standard `printf()`, this does not automatically append a trailing * new-line character to the message, so typically @format should end with its * own new-line character. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -63,17 +63,17 @@ g_printf (gchar const *format, /** * g_fprintf: - * @file: (not nullable): the stream to write to. - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @...: the arguments to insert in the output. + * @file: (not nullable): the stream to write to + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @...: the arguments to insert in the output * - * An implementation of the standard fprintf() function which supports + * An implementation of the standard `fprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -95,23 +95,23 @@ g_fprintf (FILE *file, /** * g_sprintf: * @string: A pointer to a memory buffer to contain the resulting string. It - * is up to the caller to ensure that the allocated buffer is large - * enough to hold the formatted result - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @...: the arguments to insert in the output. + * is up to the caller to ensure that the allocated buffer is large + * enough to hold the formatted result. + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @...: the arguments to insert in the output * - * An implementation of the standard sprintf() function which supports + * An implementation of the standard `sprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. * - * Note that it is usually better to use g_snprintf(), to avoid the + * Note that it is usually better to use [func@GLib.snprintf], to avoid the * risk of buffer overflow. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * See also g_strdup_printf(). + * See also [func@GLib.strdup_printf]. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -132,18 +132,18 @@ g_sprintf (gchar *string, /** * g_snprintf: - * @string: the buffer to hold the output. + * @string: the buffer to hold the output * @n: the maximum number of bytes to produce (including the - * terminating nul character). - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @...: the arguments to insert in the output. + * terminating nul character) + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @...: the arguments to insert in the output * * A safer form of the standard sprintf() function. The output is guaranteed * to not exceed @n characters (including the terminating nul character), so * it is easy to ensure that a buffer overflow cannot occur. * - * See also g_strdup_printf(). + * See also [func@GLib.strdup_printf]. * * In versions of GLib prior to 1.2.3, this function may return -1 if the * output was truncated, and the truncated string may not be nul-terminated. @@ -152,13 +152,13 @@ g_sprintf (gchar *string, * * The return value of g_snprintf() conforms to the snprintf() * function as standardized in ISO C99. Note that this is different from - * traditional snprintf(), which returns the length of the output string. + * traditional `snprintf()`, which returns the length of the output string. * * The format string may contain positional parameters, as specified in * the Single Unix Specification. * - * Returns: the number of bytes which would be produced if the buffer - * was large enough. + * Returns: the number of bytes which would be produced if the buffer + * was large enough **/ gint g_snprintf (gchar *string, @@ -178,16 +178,16 @@ g_snprintf (gchar *string, /** * g_vprintf: - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @args: the list of arguments to insert in the output. + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @args: the list of arguments to insert in the output * - * An implementation of the standard vprintf() function which supports + * An implementation of the standard `vprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -202,17 +202,17 @@ g_vprintf (gchar const *format, /** * g_vfprintf: - * @file: (not nullable): the stream to write to. - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @args: the list of arguments to insert in the output. + * @file: (not nullable): the stream to write to + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @args: the list of arguments to insert in the output * - * An implementation of the standard fprintf() function which supports + * An implementation of the standard `fprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -228,17 +228,17 @@ g_vfprintf (FILE *file, /** * g_vsprintf: - * @string: the buffer to hold the output. - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @args: the list of arguments to insert in the output. + * @string: the buffer to hold the output + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @args: the list of arguments to insert in the output * - * An implementation of the standard vsprintf() function which supports + * An implementation of the standard `vsprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed. + * Returns: the number of bytes printed * * Since: 2.2 **/ @@ -253,35 +253,35 @@ g_vsprintf (gchar *string, return _g_vsprintf (string, format, args); } -/** +/** * g_vsnprintf: - * @string: the buffer to hold the output. - * @n: the maximum number of bytes to produce (including the - * terminating nul character). - * @format: a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @args: the list of arguments to insert in the output. + * @string: the buffer to hold the output + * @n: the maximum number of bytes to produce (including the + * terminating nul character) + * @format: a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @args: the list of arguments to insert in the output * - * A safer form of the standard vsprintf() function. The output is guaranteed - * to not exceed @n characters (including the terminating nul character), so + * A safer form of the standard `vsprintf()` function. The output is guaranteed + * to not exceed @n characters (including the terminating nul character), so * it is easy to ensure that a buffer overflow cannot occur. * - * See also g_strdup_vprintf(). + * See also [func@GLib.strdup_vprintf]. * - * In versions of GLib prior to 1.2.3, this function may return -1 if the + * In versions of GLib prior to 1.2.3, this function may return -1 if the * output was truncated, and the truncated string may not be nul-terminated. - * In versions prior to 1.3.12, this function returns the length of the output + * In versions prior to 1.3.12, this function returns the length of the output * string. * - * The return value of g_vsnprintf() conforms to the vsnprintf() function - * as standardized in ISO C99. Note that this is different from traditional - * vsnprintf(), which returns the length of the output string. + * The return value of `g_vsnprintf()` conforms to the `vsnprintf()` function + * as standardized in ISO C99. Note that this is different from traditional + * `vsnprintf()`, which returns the length of the output string. * - * The format string may contain positional parameters, as specified in + * The format string may contain positional parameters, as specified in * the Single Unix Specification. * - * Returns: the number of bytes which would be produced if the buffer - * was large enough. + * Returns: the number of bytes which would be produced if the buffer + * was large enough */ gint g_vsnprintf (gchar *string, @@ -297,25 +297,26 @@ g_vsnprintf (gchar *string, /** * g_vasprintf: - * @string: (not optional) (nullable): the return location for the newly-allocated string, - * which will be %NULL if (and only if) this function fails - * @format: (not nullable): a standard printf() format string, but notice - * [string precision pitfalls][string-precision] - * @args: the list of arguments to insert in the output. + * @string: (out) (not optional) (nullable): the return location for the + * newly-allocated string, which will be `NULL` if (and only if) + * this function fails + * @format: (not nullable): a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) + * @args: the list of arguments to insert in the output * - * An implementation of the GNU vasprintf() function which supports + * An implementation of the GNU `vasprintf()` function which supports * positional parameters, as specified in the Single Unix Specification. - * This function is similar to g_vsprintf(), except that it allocates a - * string to hold the output, instead of putting the output in a buffer + * This function is similar to [func@GLib.vsprintf], except that it allocates a + * string to hold the output, instead of putting the output in a buffer * you allocate in advance. * - * The returned value in @string is guaranteed to be non-NULL, unless + * The returned value in @string is guaranteed to be non-`NULL`, unless * @format contains `%lc` or `%ls` conversions, which can fail if no * multibyte representation is available for the given character. * * `glib/gprintf.h` must be explicitly included in order to use this function. * - * Returns: the number of bytes printed, or `-1` on failure + * Returns: the number of bytes printed, or -1 on failure * * Since: 2.4 **/ @@ -359,19 +360,29 @@ g_vasprintf (gchar **string, { va_list args2; + char c; + int max_len; va_copy (args2, args); - *string = g_new (gchar, g_printf_string_upper_bound (format, args)); + max_len = _g_vsnprintf (&c, 1, format, args); + if (max_len < 0) + { + /* This can happen if @format contains `%ls` or `%lc` and @args contains + * something not representable in the current locale’s encoding (which + * should be UTF-8, but ymmv). Basically: don’t use `%ls` or `%lc`. */ + va_end (args2); + *string = NULL; + return -1; + } + + *string = g_new (gchar, (size_t) max_len + 1); len = _g_vsprintf (*string, format, args2); va_end (args2); - if (len < 0) - { - g_free (*string); - *string = NULL; - } + /* _g_vsprintf() should have exactly the same failure modes as _g_vsnprintf() */ + g_assert (len >= 0); } #endif diff --git a/glib/gqsort.c b/glib/gqsort.c index a0edcd4..9d6bb1e 100644 --- a/glib/gqsort.c +++ b/glib/gqsort.c @@ -286,7 +286,7 @@ msort_r (void *b, size_t n, size_t s, GCompareDataFunc cmp, void *arg) * @pbase: (not nullable): start of array to sort * @total_elems: elements in the array * @size: size of each element - * @compare_func: function to compare elements + * @compare_func: (scope call): function to compare elements * @user_data: data to pass to @compare_func * * This is just like the standard C qsort() function, but diff --git a/glib/gquark.c b/glib/gquark.c index 12ec34c..0b6863a 100644 --- a/glib/gquark.c +++ b/glib/gquark.c @@ -67,41 +67,35 @@ g_quark_init (void) quark_seq_id = 1; } -/** - * SECTION:quarks - * @title: Quarks - * @short_description: a 2-way association between a string and a - * unique integer identifier - * - * Quarks are associations between strings and integer identifiers. - * Given either the string or the #GQuark identifier it is possible to - * retrieve the other. - * - * Quarks are used for both [datasets][glib-Datasets] and - * [keyed data lists][glib-Keyed-Data-Lists]. - * - * To create a new quark from a string, use g_quark_from_string() or - * g_quark_from_static_string(). - * - * To find the string corresponding to a given #GQuark, use - * g_quark_to_string(). - * - * To find the #GQuark corresponding to a given string, use - * g_quark_try_string(). - * - * Another use for the string pool maintained for the quark functions - * is string interning, using g_intern_string() or - * g_intern_static_string(). An interned string is a canonical - * representation for a string. One important advantage of interned - * strings is that they can be compared for equality by a simple - * pointer comparison, rather than using strcmp(). - */ - /** * GQuark: * * A GQuark is a non-zero integer which uniquely identifies a - * particular string. A GQuark value of zero is associated to %NULL. + * particular string. + * + * A GQuark value of zero is associated to `NULL`. + * + * Given either the string or the `GQuark` identifier it is possible to + * retrieve the other. + * + * Quarks are used for both + * [datasets and keyed data lists](datalist-and-dataset.html). + * + * To create a new quark from a string, use [func@GLib.quark_from_string] + * or [func@GLib.quark_from_static_string]. + * + * To find the string corresponding to a given `GQuark`, use + * [func@GLib.quark_to_string]. + * + * To find the `GQuark` corresponding to a given string, use + * [func@GLib.quark_try_string]. + * + * Another use for the string pool maintained for the quark functions + * is string interning, using [func@GLib.intern_string] or + * [func@GLib.intern_static_string]. An interned string is a canonical + * representation for a string. One important advantage of interned + * strings is that they can be compared for equality by a simple + * pointer comparison, rather than using `strcmp()`. */ /** diff --git a/glib/gqueue.c b/glib/gqueue.c index a5c4f18..07805ff 100644 --- a/glib/gqueue.c +++ b/glib/gqueue.c @@ -24,35 +24,6 @@ * MT safe */ -/** - * SECTION:queue - * @Title: Double-ended Queues - * @Short_description: double-ended queue data structure - * - * The #GQueue structure and its associated functions provide a standard - * queue data structure. Internally, GQueue uses the same data structure - * as #GList to store elements with the same complexity over - * insertion/deletion (O(1)) and access/search (O(n)) operations. - * - * The data contained in each element can be either integer values, by - * using one of the [Type Conversion Macros][glib-Type-Conversion-Macros], - * or simply pointers to any type of data. - * - * As with all other GLib data structures, #GQueue is not thread-safe. - * For a thread-safe queue, use #GAsyncQueue. - * - * To create a new GQueue, use g_queue_new(). - * - * To initialize a statically-allocated GQueue, use %G_QUEUE_INIT or - * g_queue_init(). - * - * To add elements, use g_queue_push_head(), g_queue_push_head_link(), - * g_queue_push_tail() and g_queue_push_tail_link(). - * - * To remove elements, use g_queue_pop_head() and g_queue_pop_tail(). - * - * To free the entire queue, use g_queue_free(). - */ #include "config.h" #include "gqueue.h" @@ -256,7 +227,7 @@ g_queue_copy (GQueue *queue) /** * g_queue_foreach: * @queue: a #GQueue - * @func: the function to call for each element's data + * @func: (scope call): the function to call for each element's data * @user_data: user data to pass to @func * * Calls @func for each element in the queue passing @user_data to the @@ -310,7 +281,7 @@ g_queue_find (GQueue *queue, * g_queue_find_custom: * @queue: a #GQueue * @data: user data passed to @func - * @func: a #GCompareFunc to call for each element. It should return 0 + * @func: (scope call): a #GCompareFunc to call for each element. It should return 0 * when the desired element is found * * Finds an element in a #GQueue, using a supplied function to find the @@ -337,7 +308,7 @@ g_queue_find_custom (GQueue *queue, /** * g_queue_sort: * @queue: a #GQueue - * @compare_func: the #GCompareDataFunc used to sort @queue. This function + * @compare_func: (scope call): the #GCompareDataFunc used to sort @queue. This function * is passed two elements of the queue and should return 0 if they are * equal, a negative value if the first comes before the second, and * a positive value if the second comes before the first. @@ -1150,7 +1121,7 @@ g_queue_insert_after_link (GQueue *queue, * g_queue_insert_sorted: * @queue: a #GQueue * @data: the data to insert - * @func: the #GCompareDataFunc used to compare elements in the queue. It is + * @func: (scope call): the #GCompareDataFunc used to compare elements in the queue. It is * called with two elements of the @queue and @user_data. It should * return 0 if the elements are equal, a negative value if the first * element comes before the second, and a positive value if the second diff --git a/glib/grand.c b/glib/grand.c index 5fb4457..302b74b 100644 --- a/glib/grand.c +++ b/glib/grand.c @@ -62,57 +62,6 @@ #include /* For getpid() */ #endif -/** - * SECTION:random_numbers - * @title: Random Numbers - * @short_description: pseudo-random number generator - * - * The following functions allow you to use a portable, fast and good - * pseudo-random number generator (PRNG). - * - * Do not use this API for cryptographic purposes such as key - * generation, nonces, salts or one-time pads. - * - * This PRNG is suitable for non-cryptographic use such as in games - * (shuffling a card deck, generating levels), generating data for - * a test suite, etc. If you need random data for cryptographic - * purposes, it is recommended to use platform-specific APIs such - * as `/dev/random` on UNIX, or CryptGenRandom() on Windows. - * - * GRand uses the Mersenne Twister PRNG, which was originally - * developed by Makoto Matsumoto and Takuji Nishimura. Further - * information can be found at - * [this page](http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html). - * - * If you just need a random number, you simply call the g_random_* - * functions, which will create a globally used #GRand and use the - * according g_rand_* functions internally. Whenever you need a - * stream of reproducible random numbers, you better create a - * #GRand yourself and use the g_rand_* functions directly, which - * will also be slightly faster. Initializing a #GRand with a - * certain seed will produce exactly the same series of random - * numbers on all platforms. This can thus be used as a seed for - * e.g. games. - * - * The g_rand*_range functions will return high quality equally - * distributed random numbers, whereas for example the - * `(g_random_int()%max)` approach often - * doesn't yield equally distributed numbers. - * - * GLib changed the seeding algorithm for the pseudo-random number - * generator Mersenne Twister, as used by #GRand. This was necessary, - * because some seeds would yield very bad pseudo-random streams. - * Also the pseudo-random integers generated by g_rand*_int_range() - * will have a slightly better equal distribution with the new - * version of GLib. - * - * The original seeding and generation algorithms, as found in - * GLib 2.0.x, can be used instead of the new ones by setting the - * environment variable `G_RANDOM_VERSION` to the value of '2.0'. - * Use the GLib-2.0 algorithms only if you have sequences of numbers - * generated with Glib-2.0 that you need to reproduce exactly. - */ - /** * GRand: * @@ -170,12 +119,12 @@ struct _GRand }; /** - * g_rand_new_with_seed: + * g_rand_new_with_seed: (constructor) * @seed: a value to initialize the random number generator * * Creates a new random number generator initialized with @seed. * - * Returns: the new #GRand + * Returns: (transfer full): the new #GRand **/ GRand* g_rand_new_with_seed (guint32 seed) @@ -186,14 +135,14 @@ g_rand_new_with_seed (guint32 seed) } /** - * g_rand_new_with_seed_array: + * g_rand_new_with_seed_array: (constructor) * @seed: an array of seeds to initialize the random number generator * @seed_length: an array of seeds to initialize the random number * generator * * Creates a new random number generator initialized with @seed. * - * Returns: the new #GRand + * Returns: (transfer full): the new #GRand * * Since: 2.4 */ @@ -207,7 +156,7 @@ g_rand_new_with_seed_array (const guint32 *seed, } /** - * g_rand_new: + * g_rand_new: (constructor) * * Creates a new random number generator initialized with a seed taken * either from `/dev/urandom` (if existing) or from the current time @@ -215,7 +164,7 @@ g_rand_new_with_seed_array (const guint32 *seed, * * On Windows, the seed is taken from rand_s(). * - * Returns: the new #GRand + * Returns: (transfer full): the new #GRand */ GRand* g_rand_new (void) @@ -310,7 +259,7 @@ g_rand_free (GRand *rand) * This way you can take a snapshot of the random number generator for * replaying later. * - * Returns: the new #GRand + * Returns: (transfer full): the new #GRand * * Since: 2.4 */ diff --git a/glib/grcbox.c b/glib/grcbox.c index 2538157..4238247 100644 --- a/glib/grcbox.c +++ b/glib/grcbox.c @@ -34,136 +34,6 @@ #include -/** - * SECTION:rcbox - * @Title: Reference counted data - * @Short_description: Allocated memory with reference counting semantics - * - * A "reference counted box", or "RcBox", is an opaque wrapper data type - * that is guaranteed to be as big as the size of a given data type, and - * which augments the given data type with reference counting semantics - * for its memory management. - * - * RcBox is useful if you have a plain old data type, like a structure - * typically placed on the stack, and you wish to provide additional API - * to use it on the heap; or if you want to implement a new type to be - * passed around by reference without necessarily implementing copy/free - * semantics or your own reference counting. - * - * The typical use is: - * - * |[ - * typedef struct { - * char *name; - * char *address; - * char *city; - * char *state; - * int age; - * } Person; - * - * Person * - * person_new (void) - * { - * return g_rc_box_new0 (Person); - * } - * ]| - * - * Every time you wish to acquire a reference on the memory, you should - * call g_rc_box_acquire(); similarly, when you wish to release a reference - * you should call g_rc_box_release(): - * - * |[ - * // Add a Person to the Database; the Database acquires ownership - * // of the Person instance - * void - * add_person_to_database (Database *db, Person *p) - * { - * db->persons = g_list_prepend (db->persons, g_rc_box_acquire (p)); - * } - * - * // Removes a Person from the Database; the reference acquired by - * // add_person_to_database() is released here - * void - * remove_person_from_database (Database *db, Person *p) - * { - * db->persons = g_list_remove (db->persons, p); - * g_rc_box_release (p); - * } - * ]| - * - * If you have additional memory allocated inside the structure, you can - * use g_rc_box_release_full(), which takes a function pointer, which - * will be called if the reference released was the last: - * - * |[ - * void - * person_clear (Person *p) - * { - * g_free (p->name); - * g_free (p->address); - * g_free (p->city); - * g_free (p->state); - * } - * - * void - * remove_person_from_database (Database *db, Person *p) - * { - * db->persons = g_list_remove (db->persons, p); - * g_rc_box_release_full (p, (GDestroyNotify) person_clear); - * } - * ]| - * - * If you wish to transfer the ownership of a reference counted data - * type without increasing the reference count, you can use g_steal_pointer(): - * - * |[ - * Person *p = g_rc_box_new (Person); - * - * // fill_person_details() is defined elsewhere - * fill_person_details (p); - * - * // add_person_to_database_no_ref() is defined elsewhere; it adds - * // a Person to the Database without taking a reference - * add_person_to_database_no_ref (db, g_steal_pointer (&p)); - * ]| - * - * ## Thread safety - * - * The reference counting operations on data allocated using g_rc_box_alloc(), - * g_rc_box_new(), and g_rc_box_dup() are not thread safe; it is your code's - * responsibility to ensure that references are acquired are released on the - * same thread. - * - * If you need thread safe reference counting, see the [atomic reference counted - * data][arcbox] API. - * - * ## Automatic pointer clean up - * - * If you want to add g_autoptr() support to your plain old data type through - * reference counting, you can use the G_DEFINE_AUTOPTR_CLEANUP_FUNC() and - * g_rc_box_release(): - * - * |[ - * G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, g_rc_box_release) - * ]| - * - * If you need to clear the contents of the data, you will need to use an - * ancillary function that calls g_rc_box_release_full(): - * - * |[ - * static void - * my_data_struct_release (MyDataStruct *data) - * { - * // my_data_struct_clear() is defined elsewhere - * g_rc_box_release_full (data, (GDestroyNotify) my_data_struct_clear); - * } - * - * G_DEFINE_AUTOPTR_CLEANUP_FUNC (MyDataStruct, my_data_struct_release) - * ]| - * - * Since: 2.58 - */ - /* We use the same alignment as GTypeInstance and GNU libc's malloc */ #define ALIGN_STRUCT(offset) ((offset + (STRUCT_ALIGNMENT - 1)) & -STRUCT_ALIGNMENT) diff --git a/glib/grefcount.c b/glib/grefcount.c index f682de7..aac7887 100644 --- a/glib/grefcount.c +++ b/glib/grefcount.c @@ -18,29 +18,6 @@ * License along with this library; if not, see . */ -/** - * SECTION:refcount - * @Title: Reference counting - * @Short_description: Reference counting types and functions - * - * Reference counting is a garbage collection mechanism that is based on - * assigning a counter to a data type, or any memory area; the counter is - * increased whenever a new reference to that data type is acquired, and - * decreased whenever the reference is released. Once the last reference - * is released, the resources associated to that data type are freed. - * - * GLib uses reference counting in many of its data types, and provides - * the #grefcount and #gatomicrefcount types to implement safe and atomic - * reference counting semantics in new data types. - * - * It is important to note that #grefcount and #gatomicrefcount should be - * considered completely opaque types; you should always use the provided - * API to increase and decrease the counters, and you should never check - * their content directly, or compare their content with other values. - * - * Since: 2.58 - */ - #include "config.h" #include "grefcount.h" diff --git a/glib/grefstring.c b/glib/grefstring.c index f201897..167c24a 100644 --- a/glib/grefstring.c +++ b/glib/grefstring.c @@ -18,74 +18,6 @@ * License along with this library; if not, see . */ -/** - * SECTION:refstring - * @Title: Reference counted strings - * @Short_description: Strings with reference counted memory management - * - * Reference counted strings are normal C strings that have been augmented - * with a reference counter to manage their resources. You allocate a new - * reference counted string and acquire and release references as needed, - * instead of copying the string among callers; when the last reference on - * the string is released, the resources allocated for it are freed. - * - * Typically, reference counted strings can be used when parsing data from - * files and storing them into data structures that are passed to various - * callers: - * - * |[ - * PersonDetails * - * person_details_from_data (const char *data) - * { - * // Use g_autoptr() to simplify error cases - * g_autoptr(GRefString) full_name = NULL; - * g_autoptr(GRefString) address = NULL; - * g_autoptr(GRefString) city = NULL; - * g_autoptr(GRefString) state = NULL; - * g_autoptr(GRefString) zip_code = NULL; - * - * // parse_person_details() is defined elsewhere; returns refcounted strings - * if (!parse_person_details (data, &full_name, &address, &city, &state, &zip_code)) - * return NULL; - * - * if (!validate_zip_code (zip_code)) - * return NULL; - * - * // add_address_to_cache() and add_full_name_to_cache() are defined - * // elsewhere; they add strings to various caches, using refcounted - * // strings to avoid copying data over and over again - * add_address_to_cache (address, city, state, zip_code); - * add_full_name_to_cache (full_name); - * - * // person_details_new() is defined elsewhere; it takes a reference - * // on each string - * PersonDetails *res = person_details_new (full_name, - * address, - * city, - * state, - * zip_code); - * - * return res; - * } - * ]| - * - * In the example above, we have multiple functions taking the same strings - * for different uses; with typical C strings, we'd have to copy the strings - * every time the life time rules of the data differ from the life time of - * the string parsed from the original buffer. With reference counted strings, - * each caller can take a reference on the data, and keep it as long as it - * needs to own the string. - * - * Reference counted strings can also be "interned" inside a global table - * owned by GLib; while an interned string has at least a reference, creating - * a new interned reference counted string with the same contents will return - * a reference to the existing string instead of creating a new reference - * counted string instance. Once the string loses its last reference, it will - * be automatically removed from the global interned strings table. - * - * Since: 2.58 - */ - #include "config.h" #include "grefstring.h" diff --git a/glib/gregex.c b/glib/gregex.c index b37a5e0..d1633a8 100644 --- a/glib/gregex.c +++ b/glib/gregex.c @@ -40,14 +40,13 @@ #include "gthread.h" /** - * SECTION:gregex - * @title: Perl-compatible regular expressions - * @short_description: matches strings against regular expressions - * @see_also: [Regular expression syntax][glib-regex-syntax] + * GRegex: * - * The g_regex_*() functions implement regular - * expression pattern matching using syntax and semantics similar to - * Perl regular expression. + * A `GRegex` is the "compiled" form of a regular expression pattern. + * + * `GRegex` implements regular expression pattern matching using syntax and + * semantics similar to Perl regular expression. See the + * [PCRE documentation](man:pcrepattern(3)) for the syntax definition. * * Some functions accept a @start_position argument, setting it differs * from just passing over a shortened string and setting %G_REGEX_MATCH_NOTBOL @@ -81,23 +80,23 @@ * The behaviour of the dot, circumflex, and dollar metacharacters are * affected by newline characters, the default is to recognize any newline * character (the same characters recognized by "\R"). This can be changed - * with %G_REGEX_NEWLINE_CR, %G_REGEX_NEWLINE_LF and %G_REGEX_NEWLINE_CRLF - * compile options, and with %G_REGEX_MATCH_NEWLINE_ANY, - * %G_REGEX_MATCH_NEWLINE_CR, %G_REGEX_MATCH_NEWLINE_LF and - * %G_REGEX_MATCH_NEWLINE_CRLF match options. These settings are also - * relevant when compiling a pattern if %G_REGEX_EXTENDED is set, and an + * with `G_REGEX_NEWLINE_CR`, `G_REGEX_NEWLINE_LF` and `G_REGEX_NEWLINE_CRLF` + * compile options, and with `G_REGEX_MATCH_NEWLINE_ANY`, + * `G_REGEX_MATCH_NEWLINE_CR`, `G_REGEX_MATCH_NEWLINE_LF` and + * `G_REGEX_MATCH_NEWLINE_CRLF` match options. These settings are also + * relevant when compiling a pattern if `G_REGEX_EXTENDED` is set, and an * unescaped "#" outside a character class is encountered. This indicates * a comment that lasts until after the next newline. * - * Creating and manipulating the same #GRegex structure from different - * threads is not a problem as #GRegex does not modify its internal - * state between creation and destruction, on the other hand #GMatchInfo + * Creating and manipulating the same `GRegex` structure from different + * threads is not a problem as `GRegex` does not modify its internal + * state between creation and destruction, on the other hand `GMatchInfo` * is not threadsafe. * * The regular expressions low-level functionalities are obtained through - * the excellent - * [PCRE](http://www.pcre.org/) - * library written by Philip Hazel. + * the excellent [PCRE](http://www.pcre.org/) library written by Philip Hazel. + * + * Since: 2.14 */ #define G_REGEX_PCRE_GENERIC_MASK (PCRE2_ANCHORED | \ @@ -253,6 +252,13 @@ struct _GRegex GRegexMatchFlags orig_match_opts; /* options used as default match options, gregex values */ uint32_t jit_options; /* options which were enabled for jit compiler */ JITStatus jit_status; /* indicates the status of jit compiler for this compiled regex */ + /* The jit_status here does _not_ correspond to whether we used the JIT in the last invocation, + * which may be affected by match_options or a JIT_STACK_LIMIT error, but whether it was ever + * enabled for the current regex AND current set of jit_options. + * JIT_STATUS_DEFAULT means enablement was never tried, + * JIT_STATUS_ENABLED means it was tried and successful (even if we're not currently using it), + * and JIT_STATUS_DISABLED means it was tried and failed (so we shouldn't try again). + */ }; /* TRUE if ret is an error code, FALSE otherwise. */ @@ -919,35 +925,47 @@ enable_jit_with_match_options (GMatchInfo *match_info, /* no new options enabled */ if (new_jit_options == old_jit_options) - return match_info->regex->jit_status; + { + g_assert (match_info->regex->jit_status != JIT_STATUS_DEFAULT); + return match_info->regex->jit_status; + } retval = pcre2_jit_compile (match_info->regex->pcre_re, new_jit_options); - switch (retval) + if (retval == 0) { - case 0: /* JIT enabled successfully */ + match_info->regex->jit_status = JIT_STATUS_ENABLED; + match_info->regex->jit_options = new_jit_options; /* Set min stack size for JIT to 32KiB and max to 512KiB */ match_info->jit_stack = pcre2_jit_stack_create (1 << 15, 1 << 19, NULL); pcre2_jit_stack_assign (match_info->match_context, NULL, match_info->jit_stack); - return JIT_STATUS_ENABLED; - case PCRE2_ERROR_NOMEMORY: - g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " - "but JIT was unable to allocate executable memory for the " - "compiler. Falling back to interpretive code."); - return JIT_STATUS_DISABLED; - case PCRE2_ERROR_JIT_BADOPTION: - g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " - "but JIT support is not available. Falling back to " - "interpretive code."); - return JIT_STATUS_DISABLED; - break; - default: - g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " - "but request for JIT support had unexpectedly failed (error %d). " - "Falling back to interpretive code.", retval); - return JIT_STATUS_DISABLED; - break; } + else + { + match_info->regex->jit_status = JIT_STATUS_DISABLED; + + switch (retval) + { + case PCRE2_ERROR_NOMEMORY: + g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " + "but JIT was unable to allocate executable memory for the " + "compiler. Falling back to interpretive code."); + break; + case PCRE2_ERROR_JIT_BADOPTION: + g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " + "but JIT support is not available. Falling back to " + "interpretive code."); + break; + default: + g_debug ("JIT compilation was requested with G_REGEX_OPTIMIZE, " + "but request for JIT support had unexpectedly failed (error %d). " + "Falling back to interpretive code.", + retval); + break; + } + } + + return match_info->regex->jit_status; g_assert_not_reached (); } @@ -3377,7 +3395,7 @@ g_regex_replace_literal (const GRegex *regex, * @string_len: the length of @string, in bytes, or -1 if @string is nul-terminated * @start_position: starting index of the string to match, in bytes * @match_options: options for the match - * @eval: a function to call for each match + * @eval: (scope call): a function to call for each match * @user_data: user data to pass to the function * @error: location to store the error occurring, or %NULL to ignore errors * diff --git a/glib/gregex.h b/glib/gregex.h index 30eb387..fd2bf81 100644 --- a/glib/gregex.h +++ b/glib/gregex.h @@ -413,14 +413,6 @@ typedef enum G_REGEX_MATCH_NOTEMPTY_ATSTART = 1 << 28 } GRegexMatchFlags; -/** - * GRegex: - * - * A GRegex is the "compiled" form of a regular expression pattern. - * This structure is opaque and its fields cannot be accessed directly. - * - * Since: 2.14 - */ typedef struct _GRegex GRegex; diff --git a/glib/gscanner.c b/glib/gscanner.c index 451feb6..cb7e811 100644 --- a/glib/gscanner.c +++ b/glib/gscanner.c @@ -54,15 +54,6 @@ #endif -/** - * SECTION:scanner - * @title: Lexical Scanner - * @short_description: a general purpose lexical scanner - * - * The #GScanner and its associated functions provide a - * general purpose lexical scanner. - */ - /** * GScannerMsgFunc: * @scanner: a #GScanner @@ -196,7 +187,7 @@ * @next_position: char number of the last token from g_scanner_peek_next_token() * @msg_handler: handler function for _warn and _error * - * The data structure representing a lexical scanner. + * `GScanner` provides a general-purpose lexical scanner. * * You should set @input_name after creating the scanner, since * it is used by the default message handler when displaying @@ -904,7 +895,7 @@ g_scanner_foreach_internal (gpointer _key, * g_scanner_scope_foreach_symbol: * @scanner: a #GScanner * @scope_id: the scope id - * @func: the function to call for each symbol/value pair + * @func: (scope call): the function to call for each symbol/value pair * @user_data: user data to pass to the function * * Calls the given function for each of the symbol/value pairs diff --git a/glib/gscripttable.h b/glib/gscripttable.h index 2cf4fd2..f639a04 100644 --- a/glib/gscripttable.h +++ b/glib/gscripttable.h @@ -2799,8 +2799,7 @@ static const struct { { 0x2e80, 26, G_UNICODE_SCRIPT_HAN }, { 0x2e9b, 89, G_UNICODE_SCRIPT_HAN }, { 0x2f00, 214, G_UNICODE_SCRIPT_HAN }, - { 0x2ff0, 12, G_UNICODE_SCRIPT_COMMON }, - { 0x3000, 5, G_UNICODE_SCRIPT_COMMON }, + { 0x2ff0, 21, G_UNICODE_SCRIPT_COMMON }, { 0x3005, 1, G_UNICODE_SCRIPT_HAN }, { 0x3006, 1, G_UNICODE_SCRIPT_COMMON }, { 0x3007, 1, G_UNICODE_SCRIPT_HAN }, @@ -2824,6 +2823,7 @@ static const struct { { 0x3190, 16, G_UNICODE_SCRIPT_COMMON }, { 0x31a0, 32, G_UNICODE_SCRIPT_BOPOMOFO }, { 0x31c0, 36, G_UNICODE_SCRIPT_COMMON }, + { 0x31ef, 1, G_UNICODE_SCRIPT_COMMON }, { 0x31f0, 16, G_UNICODE_SCRIPT_KATAKANA }, { 0x3200, 31, G_UNICODE_SCRIPT_HANGUL }, { 0x3220, 64, G_UNICODE_SCRIPT_COMMON }, @@ -3341,6 +3341,7 @@ static const struct { { 0x2b740, 222, G_UNICODE_SCRIPT_HAN }, { 0x2b820, 5762, G_UNICODE_SCRIPT_HAN }, { 0x2ceb0, 7473, G_UNICODE_SCRIPT_HAN }, + { 0x2ebf0, 622, G_UNICODE_SCRIPT_HAN }, { 0x2f800, 542, G_UNICODE_SCRIPT_HAN }, { 0x30000, 4939, G_UNICODE_SCRIPT_HAN }, { 0x31350, 4192, G_UNICODE_SCRIPT_HAN }, diff --git a/glib/gsequence.c b/glib/gsequence.c index ead827d..81f0d08 100644 --- a/glib/gsequence.c +++ b/glib/gsequence.c @@ -25,54 +25,6 @@ #include "gmem.h" #include "gtestutils.h" #include "gslice.h" -/** - * SECTION:sequence - * @title: Sequences - * @short_description: scalable lists - * - * The #GSequence data structure has the API of a list, but is - * implemented internally with a balanced binary tree. This means that - * most of the operations (access, search, insertion, deletion, ...) on - * #GSequence are O(log(n)) in average and O(n) in worst case for time - * complexity. But, note that maintaining a balanced sorted list of n - * elements is done in time O(n log(n)). - * The data contained in each element can be either integer values, by using - * of the [Type Conversion Macros][glib-Type-Conversion-Macros], or simply - * pointers to any type of data. - * - * A #GSequence is accessed through "iterators", represented by a - * #GSequenceIter. An iterator represents a position between two - * elements of the sequence. For example, the "begin" iterator - * represents the gap immediately before the first element of the - * sequence, and the "end" iterator represents the gap immediately - * after the last element. In an empty sequence, the begin and end - * iterators are the same. - * - * Some methods on #GSequence operate on ranges of items. For example - * g_sequence_foreach_range() will call a user-specified function on - * each element with the given range. The range is delimited by the - * gaps represented by the passed-in iterators, so if you pass in the - * begin and end iterators, the range in question is the entire - * sequence. - * - * The function g_sequence_get() is used with an iterator to access the - * element immediately following the gap that the iterator represents. - * The iterator is said to "point" to that element. - * - * Iterators are stable across most operations on a #GSequence. For - * example an iterator pointing to some element of a sequence will - * continue to point to that element even after the sequence is sorted. - * Even moving an element to another sequence using for example - * g_sequence_move_range() will not invalidate the iterators pointing - * to it. The only operation that will invalidate an iterator is when - * the element it points to is removed from any sequence. - * - * To sort the data, either use g_sequence_insert_sorted() or - * g_sequence_insert_sorted_iter() to add data to the #GSequence or, if - * you want to add a large amount of data, it is more efficient to call - * g_sequence_sort() or g_sequence_sort_iter() after doing unsorted - * insertions. - */ /** * GSequenceIter: @@ -303,7 +255,7 @@ g_sequence_free (GSequence *seq) * g_sequence_foreach_range: * @begin: a #GSequenceIter * @end: a #GSequenceIter - * @func: a #GFunc + * @func: (scope call): a #GFunc * @user_data: user data passed to @func * * Calls @func for each item in the range (@begin, @end) passing @@ -345,7 +297,7 @@ g_sequence_foreach_range (GSequenceIter *begin, /** * g_sequence_foreach: * @seq: a #GSequence - * @func: the function to call for each item in @seq + * @func: (scope call): the function to call for each item in @seq * @user_data: user data passed to @func * * Calls @func for each item in the sequence passing @user_data @@ -675,7 +627,7 @@ g_sequence_move_range (GSequenceIter *dest, /** * g_sequence_sort: * @seq: a #GSequence - * @cmp_func: the function used to sort the sequence + * @cmp_func: (scope call): the function used to sort the sequence * @cmp_data: user data passed to @cmp_func * * Sorts @seq using @cmp_func. @@ -707,7 +659,7 @@ g_sequence_sort (GSequence *seq, * g_sequence_insert_sorted: * @seq: a #GSequence * @data: the data to insert - * @cmp_func: the function used to compare items in the sequence + * @cmp_func: (scope call): the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Inserts @data into @seq using @cmp_func to determine the new @@ -749,7 +701,7 @@ g_sequence_insert_sorted (GSequence *seq, /** * g_sequence_sort_changed: * @iter: A #GSequenceIter - * @cmp_func: the function used to compare items in the sequence + * @cmp_func: (scope call): the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func. * * Moves the data pointed to by @iter to a new position as indicated by @@ -790,7 +742,7 @@ g_sequence_sort_changed (GSequenceIter *iter, * g_sequence_search: * @seq: a #GSequence * @data: data for the new item - * @cmp_func: the function used to compare items in the sequence + * @cmp_func: (scope call): the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func * * Returns an iterator pointing to the position where @data would @@ -834,7 +786,7 @@ g_sequence_search (GSequence *seq, * g_sequence_lookup: * @seq: a #GSequence * @data: data to look up - * @cmp_func: the function used to compare items in the sequence + * @cmp_func: (scope call): the function used to compare items in the sequence * @cmp_data: user data passed to @cmp_func * * Returns an iterator pointing to the position of the first item found @@ -878,7 +830,7 @@ g_sequence_lookup (GSequence *seq, /** * g_sequence_sort_iter: * @seq: a #GSequence - * @cmp_func: the function used to compare iterators in the sequence + * @cmp_func: (scope call): the function used to compare iterators in the sequence * @cmp_data: user data passed to @cmp_func * * Like g_sequence_sort(), but uses a #GSequenceIterCompareFunc instead @@ -932,7 +884,7 @@ g_sequence_sort_iter (GSequence *seq, /** * g_sequence_sort_changed_iter: * @iter: a #GSequenceIter - * @iter_cmp: the function used to compare iterators in the sequence + * @iter_cmp: (scope call): the function used to compare iterators in the sequence * @cmp_data: user data passed to @cmp_func * * Like g_sequence_sort_changed(), but uses @@ -997,7 +949,7 @@ g_sequence_sort_changed_iter (GSequenceIter *iter, * g_sequence_insert_sorted_iter: * @seq: a #GSequence * @data: data for the new item - * @iter_cmp: the function used to compare iterators in the sequence + * @iter_cmp: (scope call): the function used to compare iterators in the sequence * @cmp_data: user data passed to @iter_cmp * * Like g_sequence_insert_sorted(), but uses @@ -1064,7 +1016,7 @@ g_sequence_insert_sorted_iter (GSequence *seq, * g_sequence_search_iter: * @seq: a #GSequence * @data: data for the new item - * @iter_cmp: the function used to compare iterators in the sequence + * @iter_cmp: (scope call): the function used to compare iterators in the sequence * @cmp_data: user data passed to @iter_cmp * * Like g_sequence_search(), but uses a #GSequenceIterCompareFunc @@ -1122,7 +1074,7 @@ g_sequence_search_iter (GSequence *seq, * g_sequence_lookup_iter: * @seq: a #GSequence * @data: data to look up - * @iter_cmp: the function used to compare iterators in the sequence + * @iter_cmp: (scope call): the function used to compare iterators in the sequence * @cmp_data: user data passed to @iter_cmp * * Like g_sequence_lookup(), but uses a #GSequenceIterCompareFunc diff --git a/glib/gshell.c b/glib/gshell.c index 82e7bd7..040e2e4 100644 --- a/glib/gshell.c +++ b/glib/gshell.c @@ -33,20 +33,6 @@ #include "glibintl.h" #include "gthread.h" -/** - * SECTION:shell - * @title: Shell-related Utilities - * @short_description: shell-like commandline handling - * - * GLib provides the functions g_shell_quote() and g_shell_unquote() - * to handle shell-like quoting in strings. The function g_shell_parse_argv() - * parses a string similar to the way a POSIX shell (/bin/sh) would. - * - * Note that string handling in shells has many obscure and historical - * corner-cases which these functions do not necessarily reproduce. They - * are good enough in practice, though. - */ - /** * G_SHELL_ERROR: * diff --git a/glib/gslice.c b/glib/gslice.c index 6bcb202..83b6708 100644 --- a/glib/gslice.c +++ b/glib/gslice.c @@ -30,65 +30,6 @@ #include "glib_trace.h" #include "gprintf.h" -/** - * SECTION:memory_slices - * @title: Memory Slices - * @short_description: efficient way to allocate groups of equal-sized - * chunks of memory - * - * GSlice was a space-efficient and multi-processing scalable way to allocate - * equal sized pieces of memory. Since GLib 2.76, its implementation has been - * removed and it calls g_malloc() and g_free_sized(), because the performance - * of the system-default allocators has improved on all platforms since GSlice - * was written. - * - * The GSlice APIs have not been deprecated, as they are widely in use and doing - * so would be very disruptive for little benefit. - * - * New code should be written using g_new()/g_malloc() and g_free_sized() or - * g_free(). There is no particular benefit in porting existing code away from - * g_slice_new()/g_slice_free() unless it’s being rewritten anyway. - * - * Here is an example for using the slice allocator: - * |[ - * gchar *mem[10000]; - * gint i; - * - * // Allocate 10000 blocks. - * for (i = 0; i < 10000; i++) - * { - * mem[i] = g_slice_alloc (50); - * - * // Fill in the memory with some junk. - * for (j = 0; j < 50; j++) - * mem[i][j] = i * j; - * } - * - * // Now free all of the blocks. - * for (i = 0; i < 10000; i++) - * g_slice_free1 (50, mem[i]); - * ]| - * - * And here is an example for using the using the slice allocator - * with data structures: - * |[ - * GRealArray *array; - * - * // Allocate one block, using the g_slice_new() macro. - * array = g_slice_new (GRealArray); - * - * // We can now use array just like a normal pointer to a structure. - * array->data = NULL; - * array->len = 0; - * array->alloc = 0; - * array->zero_terminated = (zero_terminated ? 1 : 0); - * array->clear = (clear ? 1 : 0); - * array->elt_size = elt_size; - * - * // We can free the block, so it can be reused. - * g_slice_free (GRealArray, array); - * ]| - */ /* --- auxiliary functions --- */ void diff --git a/glib/gslice.h b/glib/gslice.h index eb67786..cfa528e 100644 --- a/glib/gslice.h +++ b/glib/gslice.h @@ -107,10 +107,12 @@ gint64 g_slice_get_config (GSliceConfig ckey); GLIB_DEPRECATED_IN_2_34 gint64* g_slice_get_config_state (GSliceConfig ckey, gint64 address, guint *n_values); +#ifndef __GI_SCANNER__ #ifdef G_ENABLE_DEBUG GLIB_AVAILABLE_IN_ALL void g_slice_debug_tree_statistics (void); #endif +#endif G_END_DECLS diff --git a/glib/gslist.c b/glib/gslist.c index 7d4051c..68c0e40 100644 --- a/glib/gslist.c +++ b/glib/gslist.c @@ -35,57 +35,6 @@ #include "gtestutils.h" #include "gslice.h" -/** - * SECTION:linked_lists_single - * @title: Singly-Linked Lists - * @short_description: linked lists that can be iterated in one direction - * - * The #GSList structure and its associated functions provide a - * standard singly-linked list data structure. The benefit of this - * data-structure is to provide insertion/deletion operations in O(1) - * complexity where access/search operations are in O(n). The benefit - * of #GSList over #GList (doubly linked list) is that they are lighter - * in space as they only need to retain one pointer but it double the - * cost of the worst case access/search operations. - * - * Each element in the list contains a piece of data, together with a - * pointer which links to the next element in the list. Using this - * pointer it is possible to move through the list in one direction - * only (unlike the [double-linked lists][glib-Doubly-Linked-Lists], - * which allow movement in both directions). - * - * The data contained in each element can be either integer values, by - * using one of the [Type Conversion Macros][glib-Type-Conversion-Macros], - * or simply pointers to any type of data. - * - * List elements are allocated from the [slice allocator][glib-Memory-Slices], - * which is more efficient than allocating elements individually. - * - * Note that most of the #GSList functions expect to be passed a - * pointer to the first element in the list. The functions which insert - * elements return the new start of the list, which may have changed. - * - * There is no function to create a #GSList. %NULL is considered to be - * the empty list so you simply set a #GSList* to %NULL. - * - * To add elements, use g_slist_append(), g_slist_prepend(), - * g_slist_insert() and g_slist_insert_sorted(). - * - * To remove elements, use g_slist_remove(). - * - * To find elements in the list use g_slist_last(), g_slist_next(), - * g_slist_nth(), g_slist_nth_data(), g_slist_find() and - * g_slist_find_custom(). - * - * To find the index of an element use g_slist_position() and - * g_slist_index(). - * - * To call a function for each element in the list use - * g_slist_foreach(). - * - * To free the entire list, use g_slist_free(). - **/ - /** * GSList: * @data: holds the element's data, which can be a pointer to any kind @@ -572,7 +521,7 @@ g_slist_copy (GSList *list) /** * g_slist_copy_deep: * @list: a #GSList - * @func: a copy function used to copy every element in the list + * @func: (scope call): a copy function used to copy every element in the list * @user_data: user data passed to the copy function @func, or #NULL * * Makes a full (deep) copy of a #GSList. @@ -728,7 +677,7 @@ g_slist_find (GSList *list, * g_slist_find_custom: * @list: a #GSList * @data: user data passed to the function - * @func: the function to call for each element. + * @func: (scope call): the function to call for each element. * It should return 0 when the desired element is found * * Finds an element in a #GSList, using a supplied function to @@ -868,7 +817,7 @@ g_slist_length (GSList *list) /** * g_slist_foreach: * @list: a #GSList - * @func: the function to call with each element's data + * @func: (scope call): the function to call with each element's data * @user_data: user data to pass to the function * * Calls a function for each element of a #GSList. @@ -947,7 +896,7 @@ g_slist_insert_sorted_real (GSList *list, * g_slist_insert_sorted: * @list: a #GSList * @data: the data for the new element - * @func: the function to compare elements in the list. + * @func: (scope call): the function to compare elements in the list. * It should return a number > 0 if the first parameter * comes after the second parameter in the sort order. * @@ -968,7 +917,7 @@ g_slist_insert_sorted (GSList *list, * g_slist_insert_sorted_with_data: * @list: a #GSList * @data: the data for the new element - * @func: the function to compare elements in the list. + * @func: (scope call): the function to compare elements in the list. * It should return a number > 0 if the first parameter * comes after the second parameter in the sort order. * @user_data: data to pass to comparison function @@ -1053,7 +1002,7 @@ g_slist_sort_real (GSList *list, /** * g_slist_sort: * @list: a #GSList - * @compare_func: the comparison function used to sort the #GSList. + * @compare_func: (scope call): the comparison function used to sort the #GSList. * This function is passed the data from 2 elements of the #GSList * and should return 0 if they are equal, a negative value if the * first element comes before the second, or a positive value if @@ -1074,7 +1023,7 @@ g_slist_sort (GSList *list, /** * g_slist_sort_with_data: * @list: a #GSList - * @compare_func: comparison function + * @compare_func: (scope call): comparison function * @user_data: data to pass to comparison function * * Like g_slist_sort(), but the sort function accepts a user data argument. diff --git a/glib/gspawn.c b/glib/gspawn.c index 2f7465b..0ddd532 100644 --- a/glib/gspawn.c +++ b/glib/gspawn.c @@ -70,7 +70,7 @@ #include "glibintl.h" #include "glib-unix.h" -#ifdef __APPLE__ +#if defined(__APPLE__) && defined(HAVE_LIBPROC_H) #include #include #endif @@ -110,67 +110,6 @@ extern char **environ; #define HAVE_O_CLOEXEC 1 #endif -/** - * SECTION:spawn - * @Short_description: process launching - * @Title: Spawning Processes - * - * GLib supports spawning of processes with an API that is more - * convenient than the bare UNIX fork() and exec(). - * - * The g_spawn family of functions has synchronous (g_spawn_sync()) - * and asynchronous variants (g_spawn_async(), g_spawn_async_with_pipes()), - * as well as convenience variants that take a complete shell-like - * commandline (g_spawn_command_line_sync(), g_spawn_command_line_async()). - * - * See #GSubprocess in GIO for a higher-level API that provides - * stream interfaces for communication with child processes. - * - * An example of using g_spawn_async_with_pipes(): - * |[ - * const gchar * const argv[] = { "my-favourite-program", "--args", NULL }; - * gint child_stdout, child_stderr; - * GPid child_pid; - * g_autoptr(GError) error = NULL; - * - * // Spawn child process. - * g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, - * NULL, &child_pid, NULL, &child_stdout, - * &child_stderr, &error); - * if (error != NULL) - * { - * g_error ("Spawning child failed: %s", error->message); - * return; - * } - * - * // Add a child watch function which will be called when the child process - * // exits. - * g_child_watch_add (child_pid, child_watch_cb, NULL); - * - * // You could watch for output on @child_stdout and @child_stderr using - * // #GUnixInputStream or #GIOChannel here. - * - * static void - * child_watch_cb (GPid pid, - * gint status, - * gpointer user_data) - * { - * g_message ("Child %" G_PID_FORMAT " exited %s", pid, - * g_spawn_check_wait_status (status, NULL) ? "normally" : "abnormally"); - * - * // Free any resources associated with the child here, such as I/O channels - * // on its stdout and stderr FDs. If you have no code to put in the - * // child_watch_cb() callback, you can remove it and the g_child_watch_add() - * // call, but you must also remove the G_SPAWN_DO_NOT_REAP_CHILD flag, - * // otherwise the child process will stay around as a zombie until this - * // process exits. - * - * g_spawn_close_pid (pid); - * } - * ]| - */ - - static gint g_execute (const gchar *file, gchar **argv, gchar **argv_buffer, @@ -263,23 +202,6 @@ g_spawn_async (const gchar *working_directory, error); } -/* Avoids a danger in threaded situations (calling close() - * on a file descriptor twice, and another thread has - * re-opened it since the first close) - * - * This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). - */ -static void -close_and_invalidate (gint *fd) -{ - if (*fd < 0) - return; - - g_close (*fd, NULL); - *fd = -1; -} - /* Some versions of OS X define READ_OK in public headers */ #undef READ_OK @@ -484,8 +406,7 @@ g_spawn_sync (const gchar *working_directory, failed = TRUE; break; case READ_EOF: - close_and_invalidate (&outpipe); - outpipe = -1; + g_clear_fd (&outpipe, NULL); break; default: break; @@ -503,8 +424,7 @@ g_spawn_sync (const gchar *working_directory, failed = TRUE; break; case READ_EOF: - close_and_invalidate (&errpipe); - errpipe = -1; + g_clear_fd (&errpipe, NULL); break; default: break; @@ -516,12 +436,9 @@ g_spawn_sync (const gchar *working_directory, } /* These should only be open still if we had an error. */ - - if (outpipe >= 0) - close_and_invalidate (&outpipe); - if (errpipe >= 0) - close_and_invalidate (&errpipe); - + g_clear_fd (&outpipe, NULL); + g_clear_fd (&errpipe, NULL); + /* Wait for child to exit, even if we have * an error pending. */ @@ -1277,13 +1194,10 @@ write_err_and_exit (gint fd, gint msg) /* This function is called between fork() and exec() and hence must be * async-signal-safe (see signal-safety(7)). */ -static int -set_cloexec (void *data, gint fd) +static void +set_cloexec (int fd) { - if (fd >= GPOINTER_TO_INT (data)) - fcntl (fd, F_SETFD, FD_CLOEXEC); - - return 0; + fcntl (fd, F_SETFD, FD_CLOEXEC); } /* This function is called between fork() and exec() and hence must be @@ -1348,337 +1262,6 @@ dupfd_cloexec (int old_fd, int new_fd_min) return fd; } -/* fdwalk()-compatible callback to close a fd for non-compliant - * implementations of fdwalk() that potentially pass already - * closed fds. - * - * It is not an error to pass an invalid fd to this function. - * - * This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). - */ -G_GNUC_UNUSED static int -close_func_with_invalid_fds (void *data, int fd) -{ - /* We use close and not g_close here because on some platforms, we - * don't know how to close only valid, open file descriptors, so we - * have to pass bad fds to close too. g_close warns if given a bad - * fd. - * - * This function returns no error, because there is nothing that the caller - * could do with that information. That is even the case for EINTR. See - * g_close() about the specialty of EINTR and why that is correct. - * If g_close() ever gets extended to handle EINTR specially, then this place - * should get updated to do the same handling. - */ - if (fd >= GPOINTER_TO_INT (data)) - close (fd); - - return 0; -} - -#ifdef __linux__ -struct linux_dirent64 -{ - guint64 d_ino; /* 64-bit inode number */ - guint64 d_off; /* 64-bit offset to next structure */ - unsigned short d_reclen; /* Size of this dirent */ - unsigned char d_type; /* File type */ - char d_name[]; /* Filename (null-terminated) */ -}; - -/* This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). */ -static gint -filename_to_fd (const char *p) -{ - char c; - int fd = 0; - const int cutoff = G_MAXINT / 10; - const int cutlim = G_MAXINT % 10; - - if (*p == '\0') - return -1; - - while ((c = *p++) != '\0') - { - if (c < '0' || c > '9') - return -1; - c -= '0'; - - /* Check for overflow. */ - if (fd > cutoff || (fd == cutoff && c > cutlim)) - return -1; - - fd = fd * 10 + c; - } - - return fd; -} -#endif - -static int safe_fdwalk_with_invalid_fds (int (*cb)(void *data, int fd), void *data); - -/* This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). */ -static int -safe_fdwalk (int (*cb)(void *data, int fd), void *data) -{ -#if 0 - /* Use fdwalk function provided by the system if it is known to be - * async-signal safe. - * - * Currently there are no operating systems known to provide a safe - * implementation, so this section is not used for now. - */ - return fdwalk (cb, data); -#else - /* Fallback implementation of fdwalk. It should be async-signal safe, but it - * may fail on non-Linux operating systems. See safe_fdwalk_with_invalid_fds - * for a slower alternative. - */ - -#ifdef __linux__ - gint fd; - gint res = 0; - - /* Avoid use of opendir/closedir since these are not async-signal-safe. */ - int dir_fd = open ("/proc/self/fd", O_RDONLY | O_DIRECTORY); - if (dir_fd >= 0) - { - /* buf needs to be aligned correctly to receive linux_dirent64. - * C11 has _Alignof for this purpose, but for now a - * union serves the same purpose. */ - union - { - char buf[4096]; - struct linux_dirent64 alignment; - } u; - int pos, nread; - struct linux_dirent64 *de; - - while ((nread = syscall (SYS_getdents64, dir_fd, u.buf, sizeof (u.buf))) > 0) - { - for (pos = 0; pos < nread; pos += de->d_reclen) - { - de = (struct linux_dirent64 *) (u.buf + pos); - - fd = filename_to_fd (de->d_name); - if (fd < 0 || fd == dir_fd) - continue; - - if ((res = cb (data, fd)) != 0) - break; - } - } - - g_close (dir_fd, NULL); - return res; - } - - /* If /proc is not mounted or not accessible we fail here and rely on - * safe_fdwalk_with_invalid_fds to fall back to the old - * rlimit trick. */ - -#endif - -#if defined(__sun__) && defined(F_PREVFD) && defined(F_NEXTFD) -/* - * Solaris 11.4 has a signal-safe way which allows - * us to find all file descriptors in a process. - * - * fcntl(fd, F_NEXTFD, maxfd) - * - returns the first allocated file descriptor <= maxfd > fd. - * - * fcntl(fd, F_PREVFD) - * - return highest allocated file descriptor < fd. - */ - gint fd; - gint res = 0; - - open_max = fcntl (INT_MAX, F_PREVFD); /* find the maximum fd */ - if (open_max < 0) /* No open files */ - return 0; - - for (fd = -1; (fd = fcntl (fd, F_NEXTFD, open_max)) != -1; ) - if ((res = cb (data, fd)) != 0 || fd == open_max) - break; - - return res; -#endif - - return safe_fdwalk_with_invalid_fds (cb, data); -#endif -} - -/* This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). */ -static int -safe_fdwalk_with_invalid_fds (int (*cb)(void *data, int fd), void *data) -{ - /* Fallback implementation of fdwalk. It should be async-signal safe, but it - * may be slow, especially on systems allowing very high number of open file - * descriptors. - */ - gint open_max = -1; - gint fd; - gint res = 0; - -#if 0 && defined(HAVE_SYS_RESOURCE_H) - struct rlimit rl; - - /* Use getrlimit() function provided by the system if it is known to be - * async-signal safe. - * - * Currently there are no operating systems known to provide a safe - * implementation, so this section is not used for now. - */ - if (getrlimit (RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) - open_max = rl.rlim_max; -#endif -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__APPLE__) - /* Use sysconf() function provided by the system if it is known to be - * async-signal safe. - * - * FreeBSD: sysconf() is included in the list of async-signal safe functions - * found in https://man.freebsd.org/sigaction(2). - * - * OpenBSD: sysconf() is included in the list of async-signal safe functions - * found in https://man.openbsd.org/sigaction.2. - * - * Apple: sysconf() is included in the list of async-signal safe functions - * found in https://opensource.apple.com/source/xnu/xnu-517.12.7/bsd/man/man2/sigaction.2 - */ - if (open_max < 0) - open_max = sysconf (_SC_OPEN_MAX); -#endif - /* Hardcoded fallback: the default process hard limit in Linux as of 2020 */ - if (open_max < 0) - open_max = 4096; - -#if defined(__APPLE__) - /* proc_pidinfo isn't documented as async-signal-safe but looking at the implementation - * in the darwin tree here: - * - * https://opensource.apple.com/source/Libc/Libc-498/darwin/libproc.c.auto.html - * - * It's just a thin wrapper around a syscall, so it's probably okay. - */ - { - char buffer[4096 * PROC_PIDLISTFD_SIZE]; - ssize_t buffer_size; - - buffer_size = proc_pidinfo (getpid (), PROC_PIDLISTFDS, 0, buffer, sizeof (buffer)); - - if (buffer_size > 0 && - sizeof (buffer) >= (size_t) buffer_size && - (buffer_size % PROC_PIDLISTFD_SIZE) == 0) - { - const struct proc_fdinfo *fd_info = (const struct proc_fdinfo *) buffer; - size_t number_of_fds = (size_t) buffer_size / PROC_PIDLISTFD_SIZE; - - for (size_t i = 0; i < number_of_fds; i++) - if ((res = cb (data, fd_info[i].proc_fd)) != 0) - break; - - return res; - } - } -#endif - - for (fd = 0; fd < open_max; fd++) - if ((res = cb (data, fd)) != 0) - break; - - return res; -} - -/* This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). */ -static int -safe_fdwalk_set_cloexec (int lowfd) -{ - int ret; - -#if defined(HAVE_CLOSE_RANGE) && defined(CLOSE_RANGE_CLOEXEC) - /* close_range() is available in Linux since kernel 5.9, and on FreeBSD at - * around the same time. It was designed for use in async-signal-safe - * situations: https://bugs.python.org/issue38061 - * - * The `CLOSE_RANGE_CLOEXEC` flag was added in Linux 5.11, and is not yet - * present in FreeBSD. - * - * Handle ENOSYS in case it’s supported in libc but not the kernel; if so, - * fall back to safe_fdwalk(). Handle EINVAL in case `CLOSE_RANGE_CLOEXEC` - * is not supported. */ - ret = close_range (lowfd, G_MAXUINT, CLOSE_RANGE_CLOEXEC); - if (ret == 0 || !(errno == ENOSYS || errno == EINVAL)) - return ret; -#endif /* HAVE_CLOSE_RANGE */ - - ret = safe_fdwalk (set_cloexec, GINT_TO_POINTER (lowfd)); - - return ret; -} - -/* This function is called between fork() and exec() and hence must be - * async-signal-safe (see signal-safety(7)). - * - * On failure, `-1` will be returned and errno will be set. */ -static int -safe_closefrom (int lowfd) -{ - int ret; - -#if defined(HAVE_CLOSE_RANGE) - /* close_range() is available in Linux since kernel 5.9, and on FreeBSD at - * around the same time. It was designed for use in async-signal-safe - * situations: https://bugs.python.org/issue38061 - * - * Handle ENOSYS in case it’s supported in libc but not the kernel; if so, - * fall back to safe_fdwalk(). */ - ret = close_range (lowfd, G_MAXUINT, 0); - if (ret == 0 || errno != ENOSYS) - return ret; -#endif /* HAVE_CLOSE_RANGE */ - -#if defined(__FreeBSD__) || defined(__OpenBSD__) || \ - (defined(__sun__) && defined(F_CLOSEFROM)) - /* Use closefrom function provided by the system if it is known to be - * async-signal safe. - * - * FreeBSD: closefrom is included in the list of async-signal safe functions - * found in https://man.freebsd.org/sigaction(2). - * - * OpenBSD: closefrom is not included in the list, but a direct system call - * should be safe to use. - * - * In Solaris as of 11.3 SRU 31, closefrom() is also a direct system call. - * On such systems, F_CLOSEFROM is defined. - */ - (void) closefrom (lowfd); - return 0; -#elif defined(__DragonFly__) - /* It is unclear whether closefrom function included in DragonFlyBSD libc_r - * is safe to use because it calls a lot of library functions. It is also - * unclear whether libc_r itself is still being used. Therefore, we do a - * direct system call here ourselves to avoid possible issues. - */ - (void) syscall (SYS_closefrom, lowfd); - return 0; -#elif defined(F_CLOSEM) - /* NetBSD and AIX have a special fcntl command which does the same thing as - * closefrom. NetBSD also includes closefrom function, which seems to be a - * simple wrapper of the fcntl command. - */ - return fcntl (lowfd, F_CLOSEM); -#else - ret = safe_fdwalk (close_func_with_invalid_fds, GINT_TO_POINTER (lowfd)); - - return ret; -#endif -} - /* This function is called between fork() and exec() and hence must be * async-signal-safe (see signal-safety(7)). */ static gint @@ -1810,7 +1393,7 @@ do_exec (gint child_err_report_fd, write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - set_cloexec (GINT_TO_POINTER(0), stdin_fd); + set_cloexec (stdin_fd); } else if (!child_inherits_stdin) { @@ -1822,7 +1405,7 @@ do_exec (gint child_err_report_fd, if (safe_dup2 (read_null, 0) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - close_and_invalidate (&read_null); + g_clear_fd (&read_null, NULL); } /* Like with stdin above, it's possible the caller assigned @@ -1848,7 +1431,7 @@ do_exec (gint child_err_report_fd, write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - set_cloexec (GINT_TO_POINTER(0), stdout_fd); + set_cloexec (stdout_fd); } else if (stdout_to_null) { @@ -1859,7 +1442,7 @@ do_exec (gint child_err_report_fd, if (safe_dup2 (write_null, 1) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - close_and_invalidate (&write_null); + g_clear_fd (&write_null, NULL); } if (IS_STD_FILENO (stderr_fd) && stderr_fd != STDERR_FILENO) @@ -1880,7 +1463,7 @@ do_exec (gint child_err_report_fd, write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - set_cloexec (GINT_TO_POINTER(0), stderr_fd); + set_cloexec (stderr_fd); } else if (stderr_to_null) { @@ -1891,7 +1474,7 @@ do_exec (gint child_err_report_fd, if (safe_dup2 (write_null, 2) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - close_and_invalidate (&write_null); + g_clear_fd (&write_null, NULL); } /* Close all file descriptors but stdin, stdout and stderr, and any of source_fds, @@ -1905,21 +1488,21 @@ do_exec (gint child_err_report_fd, { if (safe_dup2 (child_err_report_fd, 3) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - set_cloexec (GINT_TO_POINTER (0), 3); - if (safe_closefrom (4) < 0) + set_cloexec (3); + if (g_closefrom (4) < 0) write_err_and_exit (child_err_report_fd, CHILD_CLOSE_FAILED); child_err_report_fd = 3; } else { - if (safe_fdwalk_set_cloexec (3) < 0) + if (g_fdwalk_set_cloexec (3) < 0) write_err_and_exit (child_err_report_fd, CHILD_CLOSE_FAILED); } } else { /* We need to do child_err_report_fd anyway */ - set_cloexec (GINT_TO_POINTER (0), child_err_report_fd); + set_cloexec (child_err_report_fd); } /* @@ -1982,7 +1565,7 @@ do_exec (gint child_err_report_fd, if (safe_dup2 (source_fds[i], target_fds[i]) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUPFD_FAILED); - close_and_invalidate (&source_fds[i]); + g_clear_fd (&source_fds[i], NULL); } } } @@ -2272,12 +1855,12 @@ do_posix_spawn (const gchar * const *argv, out_close_fds: for (i = 0; i < num_parent_close_fds; i++) - close_and_invalidate (&parent_close_fds [i]); + g_clear_fd (&parent_close_fds[i], NULL); if (duped_source_fds != NULL) { for (i = 0; i < n_fds; i++) - close_and_invalidate (&duped_source_fds[i]); + g_clear_fd (&duped_source_fds[i], NULL); g_free (duped_source_fds); } @@ -2290,6 +1873,16 @@ out_free_spawnattr: } #endif /* POSIX_SPAWN_AVAILABLE */ +static gboolean +source_fds_collide_with_pipe (const GUnixPipe *pipefd, + const int *source_fds, + gsize n_fds, + GError **error) +{ + return (_g_spawn_invalid_source_fd (pipefd->fds[G_UNIX_PIPE_END_READ], source_fds, n_fds, error) || + _g_spawn_invalid_source_fd (pipefd->fds[G_UNIX_PIPE_END_WRITE], source_fds, n_fds, error)); +} + static gboolean fork_exec (gboolean intermediate_child, const gchar *working_directory, @@ -2318,9 +1911,9 @@ fork_exec (gboolean intermediate_child, GError **error) { GPid pid = -1; - gint child_err_report_pipe[2] = { -1, -1 }; - gint child_pid_report_pipe[2] = { -1, -1 }; - guint pipe_flags = cloexec_pipes ? FD_CLOEXEC : 0; + GUnixPipe child_err_report_pipe = G_UNIX_PIPE_INIT; + GUnixPipe child_pid_report_pipe = G_UNIX_PIPE_INIT; + guint pipe_flags = cloexec_pipes ? O_CLOEXEC : 0; gint status; const gchar *chosen_search_path; gchar *search_path_buffer = NULL; @@ -2329,9 +1922,9 @@ fork_exec (gboolean intermediate_child, gchar **argv_buffer = NULL; gchar **argv_buffer_heap = NULL; gsize argv_buffer_len = 0; - gint stdin_pipe[2] = { -1, -1 }; - gint stdout_pipe[2] = { -1, -1 }; - gint stderr_pipe[2] = { -1, -1 }; + GUnixPipe stdin_pipe = G_UNIX_PIPE_INIT; + GUnixPipe stdout_pipe = G_UNIX_PIPE_INIT; + GUnixPipe stderr_pipe = G_UNIX_PIPE_INIT; gint child_close_fds[4] = { -1, -1, -1, -1 }; gint n_child_close_fds = 0; gint *source_fds_copy = NULL; @@ -2344,35 +1937,32 @@ fork_exec (gboolean intermediate_child, /* If pipes have been requested, open them */ if (stdin_pipe_out != NULL) { - if (!g_unix_open_pipe (stdin_pipe, pipe_flags, error)) + if (!g_unix_pipe_open (&stdin_pipe, pipe_flags, error)) goto cleanup_and_fail; - if (_g_spawn_invalid_source_fd (stdin_pipe[0], source_fds, n_fds, error) || - _g_spawn_invalid_source_fd (stdin_pipe[1], source_fds, n_fds, error)) + if (source_fds_collide_with_pipe (&stdin_pipe, source_fds, n_fds, error)) goto cleanup_and_fail; - child_close_fds[n_child_close_fds++] = stdin_pipe[1]; - stdin_fd = stdin_pipe[0]; + child_close_fds[n_child_close_fds++] = g_unix_pipe_get (&stdin_pipe, G_UNIX_PIPE_END_WRITE); + stdin_fd = g_unix_pipe_get (&stdin_pipe, G_UNIX_PIPE_END_READ); } if (stdout_pipe_out != NULL) { - if (!g_unix_open_pipe (stdout_pipe, pipe_flags, error)) + if (!g_unix_pipe_open (&stdout_pipe, pipe_flags, error)) goto cleanup_and_fail; - if (_g_spawn_invalid_source_fd (stdout_pipe[0], source_fds, n_fds, error) || - _g_spawn_invalid_source_fd (stdout_pipe[1], source_fds, n_fds, error)) + if (source_fds_collide_with_pipe (&stdout_pipe, source_fds, n_fds, error)) goto cleanup_and_fail; - child_close_fds[n_child_close_fds++] = stdout_pipe[0]; - stdout_fd = stdout_pipe[1]; + child_close_fds[n_child_close_fds++] = g_unix_pipe_get (&stdout_pipe, G_UNIX_PIPE_END_READ); + stdout_fd = g_unix_pipe_get (&stdout_pipe, G_UNIX_PIPE_END_WRITE); } if (stderr_pipe_out != NULL) { - if (!g_unix_open_pipe (stderr_pipe, pipe_flags, error)) + if (!g_unix_pipe_open (&stderr_pipe, pipe_flags, error)) goto cleanup_and_fail; - if (_g_spawn_invalid_source_fd (stderr_pipe[0], source_fds, n_fds, error) || - _g_spawn_invalid_source_fd (stderr_pipe[1], source_fds, n_fds, error)) + if (source_fds_collide_with_pipe (&stderr_pipe, source_fds, n_fds, error)) goto cleanup_and_fail; - child_close_fds[n_child_close_fds++] = stderr_pipe[0]; - stderr_fd = stderr_pipe[1]; + child_close_fds[n_child_close_fds++] = g_unix_pipe_get (&stderr_pipe, G_UNIX_PIPE_END_READ); + stderr_fd = g_unix_pipe_get (&stderr_pipe, G_UNIX_PIPE_END_WRITE); } child_close_fds[n_child_close_fds++] = -1; @@ -2510,18 +2100,16 @@ fork_exec (gboolean intermediate_child, if (n_fds > 0) memcpy (source_fds_copy, source_fds, sizeof (*source_fds) * n_fds); - if (!g_unix_open_pipe (child_err_report_pipe, pipe_flags, error)) + if (!g_unix_pipe_open (&child_err_report_pipe, pipe_flags, error)) goto cleanup_and_fail; - if (_g_spawn_invalid_source_fd (child_err_report_pipe[0], source_fds, n_fds, error) || - _g_spawn_invalid_source_fd (child_err_report_pipe[1], source_fds, n_fds, error)) + if (source_fds_collide_with_pipe (&child_err_report_pipe, source_fds, n_fds, error)) goto cleanup_and_fail; if (intermediate_child) { - if (!g_unix_open_pipe (child_pid_report_pipe, pipe_flags, error)) + if (!g_unix_pipe_open (&child_pid_report_pipe, pipe_flags, error)) goto cleanup_and_fail; - if (_g_spawn_invalid_source_fd (child_pid_report_pipe[0], source_fds, n_fds, error) || - _g_spawn_invalid_source_fd (child_pid_report_pipe[1], source_fds, n_fds, error)) + if (source_fds_collide_with_pipe (&child_pid_report_pipe, source_fds, n_fds, error)) goto cleanup_and_fail; } @@ -2560,13 +2148,13 @@ fork_exec (gboolean intermediate_child, * not needed in the close_descriptors case, * though */ - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_pid_report_pipe[0]); + g_unix_pipe_close (&child_err_report_pipe, G_UNIX_PIPE_END_READ, NULL); + g_unix_pipe_close (&child_pid_report_pipe, G_UNIX_PIPE_END_READ, NULL); if (child_close_fds[0] != -1) { int i = -1; while (child_close_fds[++i] != -1) - close_and_invalidate (&child_close_fds[i]); + g_clear_fd (&child_close_fds[i], NULL); } if (intermediate_child) @@ -2583,16 +2171,16 @@ fork_exec (gboolean intermediate_child, if (grandchild_pid < 0) { /* report -1 as child PID */ - write_all (child_pid_report_pipe[1], &grandchild_pid, - sizeof(grandchild_pid)); + write_all (g_unix_pipe_get (&child_pid_report_pipe, G_UNIX_PIPE_END_WRITE), + &grandchild_pid, sizeof(grandchild_pid)); - write_err_and_exit (child_err_report_pipe[1], + write_err_and_exit (g_unix_pipe_get (&child_err_report_pipe, G_UNIX_PIPE_END_WRITE), CHILD_FORK_FAILED); } else if (grandchild_pid == 0) { - close_and_invalidate (&child_pid_report_pipe[1]); - do_exec (child_err_report_pipe[1], + g_unix_pipe_close (&child_pid_report_pipe, G_UNIX_PIPE_END_WRITE, NULL); + do_exec (g_unix_pipe_get (&child_err_report_pipe, G_UNIX_PIPE_END_WRITE), stdin_fd, stdout_fd, stderr_fd, @@ -2617,8 +2205,9 @@ fork_exec (gboolean intermediate_child, } else { - write_all (child_pid_report_pipe[1], &grandchild_pid, sizeof(grandchild_pid)); - close_and_invalidate (&child_pid_report_pipe[1]); + write_all (g_unix_pipe_get (&child_pid_report_pipe, G_UNIX_PIPE_END_WRITE), + &grandchild_pid, sizeof(grandchild_pid)); + g_unix_pipe_close (&child_pid_report_pipe, G_UNIX_PIPE_END_WRITE, NULL); _exit (0); } @@ -2628,7 +2217,7 @@ fork_exec (gboolean intermediate_child, /* Just run the child. */ - do_exec (child_err_report_pipe[1], + do_exec (g_unix_pipe_get (&child_err_report_pipe, G_UNIX_PIPE_END_WRITE), stdin_fd, stdout_fd, stderr_fd, @@ -2660,8 +2249,8 @@ fork_exec (gboolean intermediate_child, gint n_ints = 0; /* Close the uncared-about ends of the pipes */ - close_and_invalidate (&child_err_report_pipe[1]); - close_and_invalidate (&child_pid_report_pipe[1]); + g_unix_pipe_close (&child_err_report_pipe, G_UNIX_PIPE_END_WRITE, NULL); + g_unix_pipe_close (&child_pid_report_pipe, G_UNIX_PIPE_END_WRITE, NULL); /* If we had an intermediate child, reap it */ if (intermediate_child) @@ -2679,7 +2268,7 @@ fork_exec (gboolean intermediate_child, } - if (!read_ints (child_err_report_pipe[0], + if (!read_ints (g_unix_pipe_get (&child_err_report_pipe, G_UNIX_PIPE_END_READ), buf, 2, &n_ints, error)) goto cleanup_and_fail; @@ -2760,7 +2349,7 @@ fork_exec (gboolean intermediate_child, { n_ints = 0; - if (!read_ints (child_pid_report_pipe[0], + if (!read_ints (g_unix_pipe_get (&child_pid_report_pipe, G_UNIX_PIPE_END_READ), buf, 1, &n_ints, error)) goto cleanup_and_fail; @@ -2783,8 +2372,8 @@ fork_exec (gboolean intermediate_child, } /* Success against all odds! return the information */ - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_pid_report_pipe[0]); + g_unix_pipe_close (&child_err_report_pipe, G_UNIX_PIPE_END_READ, NULL); + g_unix_pipe_close (&child_pid_report_pipe, G_UNIX_PIPE_END_READ, NULL); g_free (search_path_buffer_heap); g_free (argv_buffer_heap); @@ -2798,18 +2387,18 @@ fork_exec (gboolean intermediate_child, success: /* Close the uncared-about ends of the pipes */ - close_and_invalidate (&stdin_pipe[0]); - close_and_invalidate (&stdout_pipe[1]); - close_and_invalidate (&stderr_pipe[1]); + g_unix_pipe_close (&stdin_pipe, G_UNIX_PIPE_END_READ, NULL); + g_unix_pipe_close (&stdout_pipe, G_UNIX_PIPE_END_WRITE, NULL); + g_unix_pipe_close (&stderr_pipe, G_UNIX_PIPE_END_WRITE, NULL); if (stdin_pipe_out != NULL) - *stdin_pipe_out = g_steal_fd (&stdin_pipe[1]); + *stdin_pipe_out = g_unix_pipe_steal (&stdin_pipe, G_UNIX_PIPE_END_WRITE); if (stdout_pipe_out != NULL) - *stdout_pipe_out = g_steal_fd (&stdout_pipe[0]); + *stdout_pipe_out = g_unix_pipe_steal (&stdout_pipe, G_UNIX_PIPE_END_READ); if (stderr_pipe_out != NULL) - *stderr_pipe_out = g_steal_fd (&stderr_pipe[0]); + *stderr_pipe_out = g_unix_pipe_steal (&stderr_pipe, G_UNIX_PIPE_END_READ); return TRUE; @@ -2833,17 +2422,11 @@ success: } } - close_and_invalidate (&stdin_pipe[0]); - close_and_invalidate (&stdin_pipe[1]); - close_and_invalidate (&stdout_pipe[0]); - close_and_invalidate (&stdout_pipe[1]); - close_and_invalidate (&stderr_pipe[0]); - close_and_invalidate (&stderr_pipe[1]); - - close_and_invalidate (&child_err_report_pipe[0]); - close_and_invalidate (&child_err_report_pipe[1]); - close_and_invalidate (&child_pid_report_pipe[0]); - close_and_invalidate (&child_pid_report_pipe[1]); + g_unix_pipe_clear (&stdin_pipe); + g_unix_pipe_clear (&stdout_pipe); + g_unix_pipe_clear (&stderr_pipe); + g_unix_pipe_clear (&child_err_report_pipe); + g_unix_pipe_clear (&child_pid_report_pipe); g_clear_pointer (&search_path_buffer_heap, g_free); g_clear_pointer (&argv_buffer_heap, g_free); diff --git a/glib/gstdio.h b/glib/gstdio.h index 7acdb9c..42c177b 100644 --- a/glib/gstdio.h +++ b/glib/gstdio.h @@ -57,7 +57,7 @@ typedef struct stat GStatBuf; #endif -#if defined(G_OS_UNIX) && !defined(G_STDIO_WRAP_ON_UNIX) +#if defined(G_OS_UNIX) && !defined(G_STDIO_WRAP_ON_UNIX) && !defined(__GI_SCANNER__) /* Just pass on to the system functions, so there's no potential for data * format mismatches, especially with large file interfaces. diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 22a608d..c6faa03 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -57,59 +57,20 @@ #include "gprintfint.h" #include "glibintl.h" - -/** - * SECTION:string_utils - * @title: String Utility Functions - * @short_description: various string-related functions - * - * This section describes a number of utility functions for creating, - * duplicating, and manipulating strings. - * - * Note that the functions g_printf(), g_fprintf(), g_sprintf(), - * g_vprintf(), g_vfprintf(), g_vsprintf() and g_vasprintf() - * are declared in the header `gprintf.h` which is not included in `glib.h` - * (otherwise using `glib.h` would drag in `stdio.h`), so you'll have to - * explicitly include `` in order to use the GLib - * printf() functions. - * - * ## String precision pitfalls # {#string-precision} - * - * While you may use the printf() functions to format UTF-8 strings, - * notice that the precision of a \%Ns parameter is interpreted - * as the number of bytes, not characters to print. On top of that, - * the GNU libc implementation of the printf() functions has the - * "feature" that it checks that the string given for the \%Ns - * parameter consists of a whole number of characters in the current - * encoding. So, unless you are sure you are always going to be in an - * UTF-8 locale or your know your text is restricted to ASCII, avoid - * using \%Ns. If your intention is to format strings for a - * certain number of columns, then \%Ns is not a correct solution - * anyway, since it fails to take wide characters (see g_unichar_iswide()) - * into account. - * - * Note also that there are various printf() parameters which are platform - * dependent. GLib provides platform independent macros for these parameters - * which should be used instead. A common example is %G_GUINT64_FORMAT, which - * should be used instead of `%llu` or similar parameters for formatting - * 64-bit integers. These macros are all named `G_*_FORMAT`; see - * [Basic Types][glib-Basic-Types]. - */ - /** * g_ascii_isalnum: * @c: any character * * Determines whether a character is alphanumeric. * - * Unlike the standard C library isalnum() function, this only + * Unlike the standard C library `isalnum()` function, this only * recognizes standard ASCII letters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII alphanumeric character + * Returns: true if @c is an ASCII alphanumeric character */ /** @@ -118,14 +79,14 @@ * * Determines whether a character is alphabetic (i.e. a letter). * - * Unlike the standard C library isalpha() function, this only + * Unlike the standard C library `isalpha()` function, this only * recognizes standard ASCII letters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII alphabetic character + * Returns: true if @c is an ASCII alphabetic character */ /** @@ -134,14 +95,14 @@ * * Determines whether a character is a control character. * - * Unlike the standard C library iscntrl() function, this only + * Unlike the standard C library `iscntrl()` function, this only * recognizes standard ASCII control characters and ignores the - * locale, returning %FALSE for all non-ASCII characters. Also, - * unlike the standard library function, this takes a char, not - * an int, so don't call it on %EOF, but no need to cast to #guchar + * locale, returning false for all non-ASCII characters. Also, + * unlike the standard library function, this takes a `char`, not + * an `int`, so don't call it on `EOF`, but no need to cast to `guchar` * before passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII control character. + * Returns: true if @c is an ASCII control character */ /** @@ -150,11 +111,11 @@ * * Determines whether a character is digit (0-9). * - * Unlike the standard C library isdigit() function, this takes - * a char, not an int, so don't call it on %EOF, but no need to - * cast to #guchar before passing a possibly non-ASCII character in. + * Unlike the standard C library `isdigit()` function, this takes + * a `char`, not an `int`, so don't call it on `EOF`, but no need to + * cast to `guchar` before passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII digit. + * Returns: true if @c is an ASCII digit */ /** @@ -163,14 +124,14 @@ * * Determines whether a character is a printing character and not a space. * - * Unlike the standard C library isgraph() function, this only + * Unlike the standard C library `isgraph()` function, this only * recognizes standard ASCII characters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII printing character other than space. + * Returns: true if @c is an ASCII printing character other than space */ /** @@ -179,14 +140,14 @@ * * Determines whether a character is an ASCII lower case letter. * - * Unlike the standard C library islower() function, this only + * Unlike the standard C library `islower()` function, this only * recognizes standard ASCII letters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to worry about casting - * to #guchar before passing a possibly non-ASCII character in. + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to worry about casting + * to `guchar` before passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII lower case letter + * Returns: true if @c is an ASCII lower case letter */ /** @@ -195,14 +156,14 @@ * * Determines whether a character is a printing character. * - * Unlike the standard C library isprint() function, this only + * Unlike the standard C library `isprint()` function, this only * recognizes standard ASCII characters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII printing character. + * Returns: true if @c is an ASCII printing character */ /** @@ -211,14 +172,14 @@ * * Determines whether a character is a punctuation character. * - * Unlike the standard C library ispunct() function, this only + * Unlike the standard C library `ispunct()` function, this only * recognizes standard ASCII letters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII punctuation character. + * Returns: true if @c is an ASCII punctuation character */ /** @@ -227,14 +188,14 @@ * * Determines whether a character is a white-space character. * - * Unlike the standard C library isspace() function, this only + * Unlike the standard C library `isspace()` function, this only * recognizes standard ASCII white-space and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to cast to #guchar before + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to cast to `guchar` before * passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII white-space character + * Returns: true if @c is an ASCII white-space character */ /** @@ -243,14 +204,14 @@ * * Determines whether a character is an ASCII upper case letter. * - * Unlike the standard C library isupper() function, this only + * Unlike the standard C library `isupper()` function, this only * recognizes standard ASCII letters and ignores the locale, - * returning %FALSE for all non-ASCII characters. Also, unlike - * the standard library function, this takes a char, not an int, - * so don't call it on %EOF, but no need to worry about casting - * to #guchar before passing a possibly non-ASCII character in. + * returning false for all non-ASCII characters. Also, unlike + * the standard library function, this takes a `char`, not an `int`, + * so don't call it on `EOF`, but no need to worry about casting + * to `guchar` before passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII upper case letter + * Returns: true if @c is an ASCII upper case letter */ /** @@ -259,26 +220,26 @@ * * Determines whether a character is a hexadecimal-digit character. * - * Unlike the standard C library isxdigit() function, this takes - * a char, not an int, so don't call it on %EOF, but no need to - * cast to #guchar before passing a possibly non-ASCII character in. + * Unlike the standard C library `isxdigit()` function, this takes + * a `char`, not an `int`, so don't call it on `EOF`, but no need to + * cast to `guchar` before passing a possibly non-ASCII character in. * - * Returns: %TRUE if @c is an ASCII hexadecimal-digit character. + * Returns: true if @c is an ASCII hexadecimal-digit character */ /** * G_ASCII_DTOSTR_BUF_SIZE: * - * A good size for a buffer to be passed into g_ascii_dtostr(). + * A good size for a buffer to be passed into [func@GLib.ascii_dtostr]. * It is guaranteed to be enough for all output of that function * on systems with 64bit IEEE-compatible doubles. * * The typical usage would be something like: - * |[ - * char buf[G_ASCII_DTOSTR_BUF_SIZE]; + * ```C + * char buf[G_ASCII_DTOSTR_BUF_SIZE]; * - * fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value)); - * ]| + * fprintf (out, "value=%s\n", g_ascii_dtostr (buf, sizeof (buf), value)); + * ``` */ /** @@ -286,7 +247,8 @@ * @string: a string to remove the leading and trailing whitespace from * * Removes leading and trailing whitespace from a string. - * See g_strchomp() and g_strchug(). + * + * See [func@GLib.strchomp] and [func@GLib.strchug]. * * Returns: @string */ @@ -294,7 +256,7 @@ /** * G_STR_DELIMITERS: * - * The standard delimiters, used in g_strdelimit(). + * The standard delimiters, used in [func@GLib.strdelimit]. */ static const guint16 ascii_table_data[256] = { @@ -345,9 +307,7 @@ get_C_locale (void) * g_strdup: * @str: (nullable): the string to duplicate * - * Duplicates a string. If @str is %NULL it returns %NULL. - * The returned string should be freed with g_free() - * when no longer needed. + * Duplicates a string. If @str is `NULL` it returns `NULL`. * * Returns: a newly-allocated copy of @str */ @@ -371,17 +331,17 @@ gchar* /** * g_memdup: - * @mem: the memory to copy. - * @byte_size: the number of bytes to copy. + * @mem: the memory to copy + * @byte_size: the number of bytes to copy * * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it - * from @mem. If @mem is %NULL it returns %NULL. + * from @mem. If @mem is `NULL` it returns `NULL`. * - * Returns: a pointer to the newly-allocated copy of the memory, or %NULL if @mem - * is %NULL. - * Deprecated: 2.68: Use g_memdup2() instead, as it accepts a #gsize argument - * for @byte_size, avoiding the possibility of overflow in a #gsize → #guint - * conversion + * Returns: (transfer full) (nullable): a pointer to the newly-allocated copy of the memory + * + * Deprecated: 2.68: Use [func@GLib.memdup2] instead, as it accepts a gsize argument + * for @byte_size, avoiding the possibility of overflow in a `gsize` → `guint` + * conversion */ gpointer g_memdup (gconstpointer mem, @@ -402,17 +362,17 @@ g_memdup (gconstpointer mem, /** * g_memdup2: - * @mem: (nullable): the memory to copy. - * @byte_size: the number of bytes to copy. + * @mem: (nullable): the memory to copy + * @byte_size: the number of bytes to copy * * Allocates @byte_size bytes of memory, and copies @byte_size bytes into it - * from @mem. If @mem is %NULL it returns %NULL. + * from @mem. If @mem is `NULL` it returns `NULL`. * - * This replaces g_memdup(), which was prone to integer overflows when - * converting the argument from a #gsize to a #guint. + * This replaces [func@GLib.memdup], which was prone to integer overflows when + * converting the argument from a `gsize` to a `guint`. + * + * Returns: (transfer full) (nullable): a pointer to the newly-allocated copy of the memory * - * Returns: (nullable): a pointer to the newly-allocated copy of the memory, - * or %NULL if @mem is %NULL. * Since: 2.68 */ gpointer @@ -434,20 +394,19 @@ g_memdup2 (gconstpointer mem, /** * g_strndup: - * @str: the string to duplicate + * @str: (nullable): the string to duplicate * @n: the maximum number of bytes to copy from @str * * Duplicates the first @n bytes of a string, returning a newly-allocated * buffer @n + 1 bytes long which will always be nul-terminated. If @str * is less than @n bytes long the buffer is padded with nuls. If @str is - * %NULL it returns %NULL. The returned value should be freed when no longer - * needed. + * `NULL` it returns `NULL`. * * To copy a number of characters from a UTF-8 encoded string, - * use g_utf8_strncpy() instead. + * use [func@GLib.utf8_strncpy] instead. * - * Returns: a newly-allocated buffer containing the first @n bytes - * of @str, nul-terminated + * Returns: (nullable): a newly-allocated buffer containing the first + * @n bytes of @str */ gchar* g_strndup (const gchar *str, @@ -473,9 +432,8 @@ g_strndup (const gchar *str, * @fill_char: the byte to fill the string with * * Creates a new string @length bytes long filled with @fill_char. - * The returned string should be freed when no longer needed. * - * Returns: a newly-allocated string filled the @fill_char + * Returns: a newly-allocated string filled with @fill_char */ gchar* g_strnfill (gsize length, @@ -492,15 +450,15 @@ g_strnfill (gsize length, /** * g_stpcpy: - * @dest: destination buffer. - * @src: source string. + * @dest: destination buffer + * @src: source string * * Copies a nul-terminated string into the destination buffer, including * the trailing nul byte, and returns a pointer to the trailing nul byte * in `dest`. The return value is useful for concatenating multiple * strings without having to repeatedly scan for the end. * - * Returns: a pointer to the trailing nul byte in `dest`. + * Returns: a pointer to the trailing nul byte in `dest` **/ gchar * g_stpcpy (gchar *dest, @@ -526,23 +484,23 @@ g_stpcpy (gchar *dest, /** * g_strdup_vprintf: - * @format: (not nullable): a standard printf() format string, but notice - * [string precision pitfalls][string-precision] + * @format: (not nullable): a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) * @args: the list of parameters to insert into the format string * - * Similar to the standard C vsprintf() function but safer, since it + * Similar to the standard C `vsprintf()` function but safer, since it * calculates the maximum space required and allocates memory to hold - * the result. The returned string should be freed with g_free() when - * no longer needed. + * the result. * * The returned string is guaranteed to be non-NULL, unless @format * contains `%lc` or `%ls` conversions, which can fail if no multibyte * representation is available for the given character. * - * See also g_vasprintf(), which offers the same functionality, but + * See also [func@GLib.vasprintf], which offers the same functionality, but * additionally returns the length of the allocated string. * - * Returns: a newly-allocated string holding the result + * Returns: (nullable) (transfer full): a newly-allocated string holding the + * result */ gchar* g_strdup_vprintf (const gchar *format, @@ -557,20 +515,20 @@ g_strdup_vprintf (const gchar *format, /** * g_strdup_printf: - * @format: (not nullable): a standard printf() format string, but notice - * [string precision pitfalls][string-precision] + * @format: (not nullable): a standard `printf()` format string, but notice + * [string precision pitfalls](string-utils.html#string-precision-pitfalls) * @...: the parameters to insert into the format string * - * Similar to the standard C sprintf() function but safer, since it + * Similar to the standard C `sprintf()` function but safer, since it * calculates the maximum space required and allocates memory to hold - * the result. The returned string should be freed with g_free() when no - * longer needed. + * the result. * * The returned string is guaranteed to be non-NULL, unless @format * contains `%lc` or `%ls` conversions, which can fail if no multibyte * representation is available for the given character. * - * Returns: a newly-allocated string holding the result + * Returns: (nullable) (transfer full): a newly-allocated string holding the + * result */ gchar* g_strdup_printf (const gchar *format, @@ -588,14 +546,13 @@ g_strdup_printf (const gchar *format, /** * g_strconcat: - * @string1: the first string to add, which must not be %NULL - * @...: a %NULL-terminated list of strings to append to the string + * @string1: the first string to add, which must not be `NULL` + * @...: a `NULL`-terminated list of strings to append to the string * - * Concatenates all of the given strings into one long string. The - * returned string should be freed with g_free() when no longer needed. + * Concatenates all of the given strings into one long string. * - * The variable argument list must end with %NULL. If you forget the %NULL, - * g_strconcat() will start appending random memory junk to your string. + * The variable argument list must end with `NULL`. If you forget the `NULL`, + * `g_strconcat()` will start appending random memory junk to your string. * * Note that this function is usually not the right function to use to * assemble a translated message from pieces, since proper translation @@ -643,23 +600,24 @@ g_strconcat (const gchar *string1, ...) /** * g_strtod: - * @nptr: the string to convert to a numeric value. - * @endptr: (out) (transfer none) (optional): if non-%NULL, it returns the - * character after the last character used in the conversion. + * @nptr: the string to convert to a numeric value + * @endptr: (out) (transfer none) (optional): if non-`NULL`, it returns the + * character after the last character used in the conversion * - * Converts a string to a #gdouble value. - * It calls the standard strtod() function to handle the conversion, but + * Converts a string to a floating point value. + * + * It calls the standard `strtod()` function to handle the conversion, but * if the string is not completely converted it attempts the conversion - * again with g_ascii_strtod(), and returns the best match. + * again with [func@GLib.ascii_strtod], and returns the best match. * * This function should seldom be used. The normal situation when reading - * numbers not for human consumption is to use g_ascii_strtod(). Only when + * numbers not for human consumption is to use [func@GLib.ascii_strtod]. Only when * you know that you must expect both locale formatted and C formatted numbers * should you use this. Make sure that you don't pass strings such as comma * separated lists of values, since the commas may be interpreted as a decimal * point in some locales, causing unexpected results. * - * Returns: the #gdouble value. + * Returns: the converted value **/ gdouble g_strtod (const gchar *nptr, @@ -696,13 +654,13 @@ g_strtod (const gchar *nptr, /** * g_ascii_strtod: - * @nptr: the string to convert to a numeric value. - * @endptr: (out) (transfer none) (optional): if non-%NULL, it returns the - * character after the last character used in the conversion. + * @nptr: the string to convert to a numeric value + * @endptr: (out) (transfer none) (optional): if non-`NULL`, it returns the + * character after the last character used in the conversion * - * Converts a string to a #gdouble value. + * Converts a string to a floating point value. * - * This function behaves like the standard strtod() function + * This function behaves like the standard `strtod()` function * does in the C locale. It does this without actually changing * the current locale, since that would not be thread-safe. * A limitation of the implementation is that this function @@ -711,20 +669,20 @@ g_strtod (const gchar *nptr, * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the - * locale-sensitive system strtod() function. + * locale-sensitive system `strtod()` function. * - * To convert from a #gdouble to a string in a locale-insensitive - * way, use g_ascii_dtostr(). + * To convert from a gdouble to a string in a locale-insensitive + * way, use [func@GLib.ascii_dtostr]. * - * If the correct value would cause overflow, plus or minus %HUGE_VAL - * is returned (according to the sign of the value), and %ERANGE is - * stored in %errno. If the correct value would cause underflow, - * zero is returned and %ERANGE is stored in %errno. + * If the correct value would cause overflow, plus or minus `HUGE_VAL` + * is returned (according to the sign of the value), and `ERANGE` is + * stored in `errno`. If the correct value would cause underflow, + * zero is returned and `ERANGE` is stored in `errno`. * - * This function resets %errno before calling strtod() so that + * This function resets `errno` before calling `strtod()` so that * you can reliably detect overflow and underflow. * - * Returns: the #gdouble value. + * Returns: the converted value */ gdouble g_ascii_strtod (const gchar *nptr, @@ -897,21 +855,21 @@ g_ascii_strtod (const gchar *nptr, /** * g_ascii_dtostr: - * @buffer: A buffer to place the resulting string in - * @buf_len: The length of the buffer. - * @d: The #gdouble to convert + * @buffer: a buffer to place the resulting string in + * @buf_len: the length of the buffer + * @d: the value to convert * - * Converts a #gdouble to a string, using the '.' as + * Converts a `gdouble` to a string, using the '.' as * decimal point. * * This function generates enough precision that converting - * the string back using g_ascii_strtod() gives the same machine-number + * the string back using [func@GLib.ascii_strtod] gives the same machine-number * (on machines with IEEE compatible 64bit doubles). It is * guaranteed that the size of the resulting string will never - * be larger than %G_ASCII_DTOSTR_BUF_SIZE bytes, including the terminating + * be larger than [const@GLib.ASCII_DTOSTR_BUF_SIZE] bytes, including the terminating * nul character, which is always added. * - * Returns: The pointer to the buffer with the converted string. + * Returns: the pointer to the buffer with the converted string **/ gchar * g_ascii_dtostr (gchar *buffer, @@ -926,26 +884,26 @@ g_ascii_dtostr (gchar *buffer, /** * g_ascii_formatd: - * @buffer: A buffer to place the resulting string in - * @buf_len: The length of the buffer. - * @format: The printf()-style format to use for the + * @buffer: a buffer to place the resulting string in + * @buf_len: the length of the buffer + * @format: the `printf()`-style format to use for the * code to use for converting - * @d: The #gdouble to convert + * @d: the value to convert * - * Converts a #gdouble to a string, using the '.' as + * Converts a `gdouble` to a string, using the '.' as * decimal point. To format the number you pass in - * a printf()-style format string. Allowed conversion + * a `printf()`-style format string. Allowed conversion * specifiers are 'e', 'E', 'f', 'F', 'g' and 'G'. * * The @format must just be a single format specifier - * starting with `%`, expecting a #gdouble argument. + * starting with `%`, expecting a `gdouble` argument. * * The returned buffer is guaranteed to be nul-terminated. * * If you just want to want to serialize the value into a - * string, use g_ascii_dtostr(). + * string, use [func@GLib.ascii_dtostr]. * - * Returns: The pointer to the buffer with the converted string. + * Returns: the pointer to the buffer with the converted string */ gchar * g_ascii_formatd (gchar *buffer, @@ -1179,35 +1137,36 @@ g_parse_long_long (const gchar *nptr, /** * g_ascii_strtoull: - * @nptr: the string to convert to a numeric value. - * @endptr: (out) (transfer none) (optional): if non-%NULL, it returns the - * character after the last character used in the conversion. - * @base: to be used for the conversion, 2..36 or 0 + * @nptr: the string to convert to a numeric value + * @endptr: (out) (transfer none) (optional): if non-`NULL`, it returns the + * character after the last character used in the conversion + * @base: to be used for the conversion, 2..36 or 0 * - * Converts a string to a #guint64 value. - * This function behaves like the standard strtoull() function + * Converts a string to a `guint64` value. + * + * This function behaves like the standard `strtoull()` function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. * * Note that input with a leading minus sign (`-`) is accepted, and will return - * the negation of the parsed number, unless that would overflow a #guint64. + * the negation of the parsed number, unless that would overflow a `guint64`. * Critically, this means you cannot assume that a short fixed length input will - * never result in a low return value, as the input could have a leading `-`. + * result in a low return value, as the input could have a leading `-`. * * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the - * locale-sensitive system strtoull() function. + * locale-sensitive system `strtoull()` function. * - * If the correct value would cause overflow, %G_MAXUINT64 + * If the correct value would cause overflow, [const@GLib.MAXUINT64] * is returned, and `ERANGE` is stored in `errno`. * If the base is outside the valid range, zero is returned, and * `EINVAL` is stored in `errno`. * If the string conversion fails, zero is returned, and @endptr returns - * @nptr (if @endptr is non-%NULL). + * @nptr (if @endptr is non-`NULL`). * - * Returns: the #guint64 value or zero on error. + * Returns: the converted value, or zero on error * * Since: 2.2 */ @@ -1231,13 +1190,14 @@ g_ascii_strtoull (const gchar *nptr, /** * g_ascii_strtoll: - * @nptr: the string to convert to a numeric value. - * @endptr: (out) (transfer none) (optional): if non-%NULL, it returns the - * character after the last character used in the conversion. - * @base: to be used for the conversion, 2..36 or 0 + * @nptr: the string to convert to a numeric value + * @endptr: (out) (transfer none) (optional): if non-`NULL`, it returns the + * character after the last character used in the conversion + * @base: to be used for the conversion, 2..36 or 0 * - * Converts a string to a #gint64 value. - * This function behaves like the standard strtoll() function + * Converts a string to a `gint64` value. + * + * This function behaves like the standard `strtoll()` function * does in the C locale. It does this without actually * changing the current locale, since that would not be * thread-safe. @@ -1245,16 +1205,16 @@ g_ascii_strtoull (const gchar *nptr, * This function is typically used when reading configuration * files or other non-user input that should be locale independent. * To handle input from the user you should normally use the - * locale-sensitive system strtoll() function. + * locale-sensitive system `strtoll()` function. * - * If the correct value would cause overflow, %G_MAXINT64 or %G_MININT64 - * is returned, and `ERANGE` is stored in `errno`. + * If the correct value would cause overflow, [const@GLib.MAXINT64] or + * [const@GLib.MININT64] is returned, and `ERANGE` is stored in `errno`. * If the base is outside the valid range, zero is returned, and * `EINVAL` is stored in `errno`. If the * string conversion fails, zero is returned, and @endptr returns @nptr - * (if @endptr is non-%NULL). + * (if @endptr is non-`NULL`). * - * Returns: the #gint64 value or zero on error. + * Returns: the converted value, or zero on error * * Since: 2.12 */ @@ -1290,30 +1250,31 @@ g_ascii_strtoll (const gchar *nptr, /** * g_strerror: - * @errnum: the system error number. See the standard C %errno - * documentation + * @errnum: the system error number. See the standard C `errno` documentation * * Returns a string corresponding to the given error code, e.g. "no - * such process". Unlike strerror(), this always returns a string in + * such process". + * + * Unlike `strerror()`, this always returns a string in * UTF-8 encoding, and the pointer is guaranteed to remain valid for - * the lifetime of the process. + * the lifetime of the process. If the error code is unknown, it returns a + * string like “Unknown error ”. * * Note that the string may be translated according to the current locale. * - * The value of %errno will not be changed by this function. However, it may + * The value of `errno` will not be changed by this function. However, it may * be changed by intermediate function calls, so you should save its value * as soon as the call returns: - * |[ - * int saved_errno; + * ```C + * int saved_errno; * - * ret = read (blah); - * saved_errno = errno; + * ret = read (blah); + * saved_errno = errno; * - * g_strerror (saved_errno); - * ]| + * g_strerror (saved_errno); + * ``` * - * Returns: a UTF-8 string describing the error code. If the error code - * is unknown, it returns a string like "Unknown error: ". + * Returns: the string describing the error code */ const gchar * g_strerror (gint errnum) @@ -1390,12 +1351,13 @@ g_strerror (gint errnum) * @signum: the signal number. See the `signal` documentation * * Returns a string describing the given signal, e.g. "Segmentation fault". - * You should use this function in preference to strsignal(), because it - * returns a string in UTF-8 encoding, and since not all platforms support - * the strsignal() function. + * If the signal is unknown, it returns “unknown signal ()”. * - * Returns: a UTF-8 string describing the signal. If the signal is unknown, - * it returns "unknown signal ()". + * You should use this function in preference to `strsignal()`, because it + * returns a string in UTF-8 encoding, and since not all platforms support + * the `strsignal()` function. + * + * Returns: the string describing the signal */ const gchar * g_strsignal (gint signum) @@ -1422,7 +1384,7 @@ g_strsignal (gint signum) /* Functions g_strlcpy and g_strlcat were originally developed by * Todd C. Miller to simplify writing secure code. - * See http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy + * See http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy * for more information. */ @@ -1457,19 +1419,19 @@ g_strlcat (gchar *dest, * @src: source buffer * @dest_size: length of @dest in bytes * - * Portability wrapper that calls strlcpy() on systems which have it, - * and emulates strlcpy() otherwise. Copies @src to @dest; @dest is + * Portability wrapper that calls `strlcpy()` on systems which have it, + * and emulates `strlcpy()` otherwise. Copies @src to @dest; @dest is * guaranteed to be nul-terminated; @src must be nul-terminated; * @dest_size is the buffer size, not the number of bytes to copy. * * At most @dest_size - 1 characters will be copied. Always nul-terminates * (unless @dest_size is 0). This function does not allocate memory. Unlike - * strncpy(), this function doesn't pad @dest (so it's often faster). It - * returns the size of the attempted result, strlen (src), so if + * `strncpy()`, this function doesn't pad @dest (so it's often faster). It + * returns the size of the attempted result, `strlen (src)`, so if * @retval >= @dest_size, truncation occurred. * - * Caveat: strlcpy() is supposedly more secure than strcpy() or strncpy(), - * but if you really want to avoid screwups, g_strdup() is an even better + * Caveat: `strlcpy()` is supposedly more secure than `strcpy()` or `strncpy()`, + * but if you really want to avoid screwups, [func@GLib.strdup] is an even better * idea. * * Returns: length of @src @@ -1515,25 +1477,25 @@ g_strlcpy (gchar *dest, * @dest: destination buffer, already containing one nul-terminated string * @src: source buffer * @dest_size: length of @dest buffer in bytes (not length of existing string - * inside @dest) + * inside @dest) * - * Portability wrapper that calls strlcat() on systems which have it, + * Portability wrapper that calls `strlcat()` on systems which have it, * and emulates it otherwise. Appends nul-terminated @src string to @dest, * guaranteeing nul-termination for @dest. The total size of @dest won't * exceed @dest_size. * - * At most @dest_size - 1 characters will be copied. Unlike strncat(), + * At most @dest_size - 1 characters will be copied. Unlike `strncat()`, * @dest_size is the full size of dest, not the space left over. This * function does not allocate memory. It always nul-terminates (unless * @dest_size == 0 or there were no nul characters in the @dest_size * characters of dest to start with). * - * Caveat: this is supposedly a more secure alternative to strcat() or - * strncat(), but for real security g_strconcat() is harder to mess up. + * Caveat: this is supposedly a more secure alternative to `strcat()` or + * `strncat()`, but for real security [func@GLib.strconcat] is harder to mess up. * - * Returns: size of attempted result, which is MIN (dest_size, strlen - * (original dest)) + strlen (src), so if retval >= dest_size, - * truncation occurred. + * Returns: size of attempted result, which is `MIN (dest_size, strlen + * (original dest)) + strlen (src)`, so if @retval >= @dest_size, + * truncation occurred */ gsize g_strlcat (gchar *dest, @@ -1575,14 +1537,14 @@ g_strlcat (gchar *dest, /** * g_ascii_strdown: * @str: a string - * @len: length of @str in bytes, or -1 if @str is nul-terminated + * @len: length of @str in bytes, or `-1` if @str is nul-terminated * - * Converts all upper case ASCII letters to lower case ASCII letters. + * Converts all upper case ASCII letters to lower case ASCII letters, with + * semantics that exactly match [func@GLib.ascii_tolower]. * - * Returns: a newly-allocated string, with all the upper case - * characters in @str converted to lower case, with semantics that - * exactly match g_ascii_tolower(). (Note that this is unlike the - * old g_strdown(), which modified the string in place.) + * Returns: a newly-allocated string, with all the upper case characters in + * @str converted to lower case. (Note that this is unlike the old + * [func@GLib.strdown], which modified the string in place.) */ gchar* g_ascii_strdown (const gchar *str, @@ -1593,9 +1555,10 @@ g_ascii_strdown (const gchar *str, g_return_val_if_fail (str != NULL, NULL); if (len < 0) - len = (gssize) strlen (str); + result = g_strdup (str); + else + result = g_strndup (str, (gsize) len); - result = g_strndup (str, (gsize) len); for (s = result; *s; s++) *s = g_ascii_tolower (*s); @@ -1605,14 +1568,14 @@ g_ascii_strdown (const gchar *str, /** * g_ascii_strup: * @str: a string - * @len: length of @str in bytes, or -1 if @str is nul-terminated + * @len: length of @str in bytes, or `-1` if @str is nul-terminated * - * Converts all lower case ASCII letters to upper case ASCII letters. + * Converts all lower case ASCII letters to upper case ASCII letters, with + * semantics that exactly match [func@GLib.ascii_toupper]. * - * Returns: a newly allocated string, with all the lower case - * characters in @str converted to upper case, with semantics that - * exactly match g_ascii_toupper(). (Note that this is unlike the - * old g_strup(), which modified the string in place.) + * Returns: a newly-allocated string, with all the lower case characters + * in @str converted to upper case. (Note that this is unlike the old + * [func@GLib.strup], which modified the string in place.) */ gchar* g_ascii_strup (const gchar *str, @@ -1623,9 +1586,10 @@ g_ascii_strup (const gchar *str, g_return_val_if_fail (str != NULL, NULL); if (len < 0) - len = (gssize) strlen (str); + result = g_strdup (str); + else + result = g_strndup (str, (gsize) len); - result = g_strndup (str, (gsize) len); for (s = result; *s; s++) *s = g_ascii_toupper (*s); @@ -1639,7 +1603,7 @@ g_ascii_strup (const gchar *str, * Determines if a string is pure ASCII. A string is pure ASCII if it * contains no bytes with the high bit set. * - * Returns: %TRUE if @str is ASCII + * Returns: true if @str is ASCII * * Since: 2.40 */ @@ -1657,15 +1621,15 @@ g_str_is_ascii (const gchar *str) /** * g_strdown: - * @string: the string to convert. + * @string: the string to convert * * Converts a string to lower case. * * Returns: the string * - * Deprecated:2.2: This function is totally broken for the reasons discussed - * in the g_strncasecmp() docs - use g_ascii_strdown() or g_utf8_strdown() - * instead. + * Deprecated: 2.2: This function is totally broken for the reasons discussed + * in the [func@GLib.strncasecmp] docs — use [func@GLib.ascii_strdown] or + * [func@GLib.utf8_strdown] instead. **/ gchar* g_strdown (gchar *string) @@ -1694,9 +1658,9 @@ g_strdown (gchar *string) * * Returns: the string * - * Deprecated:2.2: This function is totally broken for the reasons - * discussed in the g_strncasecmp() docs - use g_ascii_strup() - * or g_utf8_strup() instead. + * Deprecated: 2.2: This function is totally broken for the reasons discussed + * in the [func@GLib.strncasecmp] docs — use [func@GLib.ascii_strup] or + * [func@GLib.utf8_strup] instead. */ gchar* g_strup (gchar *string) @@ -1724,11 +1688,11 @@ g_strup (gchar *string) * Reverses all of the bytes in a string. For example, * `g_strreverse ("abcdef")` will result in "fedcba". * - * Note that g_strreverse() doesn't work on UTF-8 strings + * Note that `g_strreverse()` doesn't work on UTF-8 strings * containing multibyte characters. For that purpose, use - * g_utf8_strreverse(). + * [func@GLib.utf8_strreverse]. * - * Returns: the same pointer passed in as @string + * Returns: the @string, reversed in place */ gchar* g_strreverse (gchar *string) @@ -1761,18 +1725,18 @@ g_strreverse (gchar *string) * g_ascii_tolower: * @c: any character * - * Convert a character to ASCII lower case. + * Convert a character to ASCII lower case. If the character is not an + * ASCII upper case letter, it is returned unchanged. * - * Unlike the standard C library tolower() function, this only + * Unlike the standard C library `tolower()` function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are lower case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so - * don't call it on %EOF but no need to worry about casting to #guchar + * don't call it on `EOF` but no need to worry about casting to `guchar` * before passing a possibly non-ASCII character in. * - * Returns: the result of converting @c to lower case. If @c is - * not an ASCII upper case letter, @c is returned unchanged. + * Returns: the result of the conversion */ gchar g_ascii_tolower (gchar c) @@ -1784,18 +1748,18 @@ g_ascii_tolower (gchar c) * g_ascii_toupper: * @c: any character * - * Convert a character to ASCII upper case. + * Convert a character to ASCII upper case. If the character is not an + * ASCII lower case letter, it is returned unchanged. * - * Unlike the standard C library toupper() function, this only + * Unlike the standard C library `toupper()` function, this only * recognizes standard ASCII letters and ignores the locale, returning * all non-ASCII characters unchanged, even if they are upper case * letters in a particular character set. Also unlike the standard * library function, this takes and returns a char, not an int, so - * don't call it on %EOF but no need to worry about casting to #guchar + * don't call it on `EOF` but no need to worry about casting to `guchar` * before passing a possibly non-ASCII character in. * - * Returns: the result of converting @c to upper case. If @c is not - * an ASCII lower case letter, @c is returned unchanged. + * Returns: the result of the conversion */ gchar g_ascii_toupper (gchar c) @@ -1807,12 +1771,14 @@ g_ascii_toupper (gchar c) * g_ascii_digit_value: * @c: an ASCII character * - * Determines the numeric value of a character as a decimal digit. - * Differs from g_unichar_digit_value() because it takes a char, so + * Determines the numeric value of a character as a decimal digit. If the + * character is not a decimal digit according to [func@GLib.ascii_isdigit], + * `-1` is returned. + * + * Differs from [func@GLib.unichar_digit_value] because it takes a char, so * there's no worry about sign extension if characters are signed. * - * Returns: If @c is a decimal digit (according to g_ascii_isdigit()), - * its numeric value. Otherwise, -1. + * Returns: the numerical value of @c if it is a decimal digit, `-1` otherwise */ int g_ascii_digit_value (gchar c) @@ -1824,15 +1790,19 @@ g_ascii_digit_value (gchar c) /** * g_ascii_xdigit_value: - * @c: an ASCII character. + * @c: an ASCII character * - * Determines the numeric value of a character as a hexadecimal - * digit. Differs from g_unichar_xdigit_value() because it takes - * a char, so there's no worry about sign extension if characters - * are signed. + * Determines the numeric value of a character as a hexadecimal digit. If the + * character is not a hex digit according to [func@GLib.ascii_isxdigit], + * `-1` is returned. * - * Returns: If @c is a hex digit (according to g_ascii_isxdigit()), - * its numeric value. Otherwise, -1. + * Differs from [func@GLib.unichar_xdigit_value] because it takes a char, so + * there's no worry about sign extension if characters are signed. + * + * Differs from [func@GLib.unichar_xdigit_value] because it takes a char, so + * there's no worry about sign extension if characters are signed. + * + * Returns: the numerical value of @c if it is a hex digit, `-1` otherwise */ int g_ascii_xdigit_value (gchar c) @@ -1851,7 +1821,7 @@ g_ascii_xdigit_value (gchar c) * * Compare two strings, ignoring the case of ASCII characters. * - * Unlike the BSD strcasecmp() function, this only recognizes standard + * Unlike the BSD `strcasecmp()` function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * bytes as if they are not letters. * @@ -1863,10 +1833,10 @@ g_ascii_xdigit_value (gchar c) * characters include all ASCII letters. If you compare two CP932 * strings using this function, you will get false matches. * - * Both @s1 and @s2 must be non-%NULL. + * Both @s1 and @s2 must be non-`NULL`. * * Returns: 0 if the strings match, a negative value if @s1 < @s2, - * or a positive value if @s1 > @s2. + * or a positive value if @s1 > @s2 */ gint g_ascii_strcasecmp (const gchar *s1, @@ -1900,16 +1870,16 @@ g_ascii_strcasecmp (const gchar *s1, * less than @n bytes long, comparison will stop at the first nul byte * encountered. * - * Unlike the BSD strcasecmp() function, this only recognizes standard + * Unlike the BSD `strncasecmp()` function, this only recognizes standard * ASCII letters and ignores the locale, treating all non-ASCII * characters as if they are not letters. * - * The same warning as in g_ascii_strcasecmp() applies: Use this + * The same warning as in [func@GLib.ascii_strcasecmp] applies: Use this * function only on strings known to be in encodings where bytes * corresponding to ASCII letters always represent themselves. * * Returns: 0 if the strings match, a negative value if @s1 < @s2, - * or a positive value if @s1 > @s2. + * or a positive value if @s1 > @s2 */ gint g_ascii_strncasecmp (const gchar *s1, @@ -1939,17 +1909,17 @@ g_ascii_strncasecmp (const gchar *s1, /** * g_strcasecmp: - * @s1: a string - * @s2: a string to compare with @s1 + * @s1: string to compare with @s2 + * @s2: string to compare with @s1 * * A case-insensitive string comparison, corresponding to the standard - * strcasecmp() function on platforms which support it. + * `strcasecmp()` function on platforms which support it. * * Returns: 0 if the strings match, a negative value if @s1 < @s2, - * or a positive value if @s1 > @s2. + * or a positive value if @s1 > @s2 * - * Deprecated:2.2: See g_strncasecmp() for a discussion of why this - * function is deprecated and how to replace it. + * Deprecated: 2.2: See [func@GLib.strncasecmp] for a discussion of why this + * function is deprecated and how to replace it. */ gint g_strcasecmp (const gchar *s1, @@ -1984,32 +1954,32 @@ g_strcasecmp (const gchar *s1, /** * g_strncasecmp: - * @s1: a string - * @s2: a string to compare with @s1 + * @s1: string to compare with @s2 + * @s2: string to compare with @s1 * @n: the maximum number of characters to compare * * A case-insensitive string comparison, corresponding to the standard - * strncasecmp() function on platforms which support it. It is similar - * to g_strcasecmp() except it only compares the first @n characters of + * `strncasecmp()` function on platforms which support it. It is similar + * to [func@GLib.strcasecmp] except it only compares the first @n characters of * the strings. * * Returns: 0 if the strings match, a negative value if @s1 < @s2, - * or a positive value if @s1 > @s2. + * or a positive value if @s1 > @s2 * - * Deprecated:2.2: The problem with g_strncasecmp() is that it does - * the comparison by calling toupper()/tolower(). These functions - * are locale-specific and operate on single bytes. However, it is - * impossible to handle things correctly from an internationalization - * standpoint by operating on bytes, since characters may be multibyte. - * Thus g_strncasecmp() is broken if your string is guaranteed to be - * ASCII, since it is locale-sensitive, and it's broken if your string - * is localized, since it doesn't work on many encodings at all, - * including UTF-8, EUC-JP, etc. + * Deprecated: 2.2: The problem with `g_strncasecmp()` is that it does + * the comparison by calling `toupper()`/`tolower()`. These functions + * are locale-specific and operate on single bytes. However, it is + * impossible to handle things correctly from an internationalization + * standpoint by operating on bytes, since characters may be multibyte. + * Thus `g_strncasecmp()` is broken if your string is guaranteed to be + * ASCII, since it is locale-sensitive, and it's broken if your string + * is localized, since it doesn't work on many encodings at all, + * including UTF-8, EUC-JP, etc. * - * There are therefore two replacement techniques: g_ascii_strncasecmp(), - * which only works on ASCII and is not locale-sensitive, and - * g_utf8_casefold() followed by strcmp() on the resulting strings, - * which is good for case-insensitive sorting of UTF-8. + * There are therefore two replacement techniques: [func@GLib.ascii_strncasecmp], + * which only works on ASCII and is not locale-sensitive, and + * [func@GLib.utf8_casefold] followed by `strcmp()` on the resulting strings, + * which is good for case-insensitive sorting of UTF-8. */ gint g_strncasecmp (const gchar *s1, @@ -2047,8 +2017,8 @@ g_strncasecmp (const gchar *s1, /** * g_strdelimit: * @string: the string to convert - * @delimiters: (nullable): a string containing the current delimiters, - * or %NULL to use the standard delimiters defined in %G_STR_DELIMITERS + * @delimiters: (nullable): a string containing the current delimiters, or + * `NULL` to use the standard delimiters defined in [const@GLib.STR_DELIMITERS] * @new_delimiter: the new delimiter character * * Converts any delimiter characters in @string to @new_delimiter. @@ -2058,18 +2028,16 @@ g_strncasecmp (const gchar *s1, * and returns @string itself, not a copy. * * The return value is to allow nesting such as: + * ```C + * g_ascii_strup (g_strdelimit (str, "abc", '?')) + * ``` * - * |[ - * g_ascii_strup (g_strdelimit (str, "abc", '?')) - * ]| - * - * In order to modify a copy, you may use g_strdup(): - * - * |[ - * reformatted = g_strdelimit (g_strdup (const_str), "abc", '?'); - * ... - * g_free (reformatted); - * ]| + * In order to modify a copy, you may use [func@GLib.strdup]: + * ```C + * reformatted = g_strdelimit (g_strdup (const_str), "abc", '?'); + * … + * g_free (reformatted); + * ``` * * Returns: the modified @string */ @@ -2105,18 +2073,16 @@ g_strdelimit (gchar *string, * * Modifies @string in place, and return @string itself, not a copy. The * return value is to allow nesting such as: + * ```C + * g_ascii_strup (g_strcanon (str, "abc", '?')) + * ``` * - * |[ - * g_ascii_strup (g_strcanon (str, "abc", '?')) - * ]| - * - * In order to modify a copy, you may use g_strdup(): - * - * |[ - * reformatted = g_strcanon (g_strdup (const_str), "abc", '?'); - * ... - * g_free (reformatted); - * ]| + * In order to modify a copy, you may use [func@GLib.strdup]: + * ```C + * reformatted = g_strcanon (g_strdup (const_str), "abc", '?'); + * … + * g_free (reformatted); + * ``` * * Returns: the modified @string */ @@ -2145,10 +2111,10 @@ g_strcanon (gchar *string, * * Replaces all escaped characters with their one byte equivalent. * - * This function does the reverse conversion of g_strescape(). + * This function does the reverse conversion of [func@GLib.strescape]. * * Returns: a newly-allocated copy of @source with all escaped - * character compressed + * character compressed */ gchar * g_strcompress (const gchar *source) @@ -2229,10 +2195,9 @@ out: * replaced with a '\' followed by their octal representation. * Characters supplied in @exceptions are not escaped. * - * g_strcompress() does the reverse conversion. + * [func@GLib.strcompress] does the reverse conversion. * - * Returns: a newly-allocated copy of @source with certain - * characters escaped. See above. + * Returns: a newly-allocated copy of @source with special characters escaped */ gchar * g_strescape (const gchar *source, @@ -2333,9 +2298,9 @@ g_strescape (const gchar *source, * * The pointer to @string is returned to allow the nesting of functions. * - * Also see g_strchomp() and g_strstrip(). + * Also see [func@GLib.strchomp] and [func@GLib.strstrip]. * - * Returns: @string + * Returns: the modified @string */ gchar * g_strchug (gchar *string) @@ -2364,9 +2329,9 @@ g_strchug (gchar *string) * * The pointer to @string is returned to allow the nesting of functions. * - * Also see g_strchug() and g_strstrip(). + * Also see [func@GLib.strchug] and [func@GLib.strstrip]. * - * Returns: @string + * Returns: the modified @string */ gchar * g_strchomp (gchar *string) @@ -2391,28 +2356,27 @@ g_strchomp (gchar *string) * g_strsplit: * @string: a string to split * @delimiter: a string which specifies the places at which to split - * the string. The delimiter is not included in any of the resulting - * strings, unless @max_tokens is reached. - * @max_tokens: the maximum number of pieces to split @string into. - * If this is less than 1, the string is split completely. + * the string. The delimiter is not included in any of the resulting + * strings, unless @max_tokens is reached. + * @max_tokens: the maximum number of pieces to split @string into + * If this is less than 1, the string is split completely * * Splits a string into a maximum of @max_tokens pieces, using the given * @delimiter. If @max_tokens is reached, the remainder of @string is * appended to the last token. * - * As an example, the result of g_strsplit (":a:bc::d:", ":", -1) is a - * %NULL-terminated vector containing the six strings "", "a", "bc", "", "d" - * and "". + * As an example, the result of `g_strsplit (":a:bc::d:", ":", -1)` is an array + * containing the six strings "", "a", "bc", "", "d" and "". * * As a special case, the result of splitting the empty string "" is an empty - * vector, not a vector containing a single string. The reason for this - * special case is that being able to represent an empty vector is typically + * array, not an array containing a single string. The reason for this + * special case is that being able to represent an empty array is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string - * before calling g_strsplit(). + * before calling `g_strsplit()`. * - * Returns: (transfer full): a newly-allocated %NULL-terminated array of - * strings. Use g_strfreev() to free it. + * Returns: (transfer full): a newly-allocated array of strings, freed with + * [func@GLib.strfreev] */ gchar** g_strsplit (const gchar *string, @@ -2463,37 +2427,35 @@ g_strsplit (const gchar *string, /** * g_strsplit_set: - * @string: The string to be tokenized - * @delimiters: A nul-terminated string containing bytes that are used - * to split the string (it can accept an empty string, which will result - * in no string splitting). - * @max_tokens: The maximum number of tokens to split @string into. - * If this is less than 1, the string is split completely + * @string: a string to split + * @delimiters: a string containing characters that are used to split the + * string. Can be empty, which will result in no string splitting + * @max_tokens: the maximum number of tokens to split @string into. + * If this is less than 1, the string is split completely * * Splits @string into a number of tokens not containing any of the characters - * in @delimiter. A token is the (possibly empty) longest string that does not + * in @delimiters. A token is the (possibly empty) longest string that does not * contain any of the characters in @delimiters. If @max_tokens is reached, the * remainder is appended to the last token. * - * For example the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is a - * %NULL-terminated vector containing the three strings "abc", "def", - * and "ghi". + * For example, the result of g_strsplit_set ("abc:def/ghi", ":/", -1) is an + * array containing the three strings "abc", "def", and "ghi". * - * The result of g_strsplit_set (":def/ghi:", ":/", -1) is a %NULL-terminated - * vector containing the four strings "", "def", "ghi", and "". + * The result of g_strsplit_set (":def/ghi:", ":/", -1) is an array containing + * the four strings "", "def", "ghi", and "". * * As a special case, the result of splitting the empty string "" is an empty - * vector, not a vector containing a single string. The reason for this - * special case is that being able to represent an empty vector is typically + * array, not an array containing a single string. The reason for this + * special case is that being able to represent an empty array is typically * more useful than consistent handling of empty elements. If you do need * to represent empty elements, you'll need to check for the empty string - * before calling g_strsplit_set(). + * before calling `g_strsplit_set()`. * * Note that this function works on bytes not characters, so it can't be used * to delimit UTF-8 strings for anything but ASCII characters. * - * Returns: (transfer full): a newly-allocated %NULL-terminated array of - * strings. Use g_strfreev() to free it. + * Returns: (transfer full): a newly-allocated array of strings. Use + * [func@GLib.strfreev] to free it. * * Since: 2.4 **/ @@ -2567,17 +2529,17 @@ g_strsplit_set (const gchar *string, * GStrv: * * A typedef alias for gchar**. This is mostly useful when used together with - * g_auto(). + * `g_auto()`. */ /** * g_strfreev: - * @str_array: (nullable): a %NULL-terminated array of strings to free + * @str_array: (array zero-terminated=1) (nullable) (transfer full): an + * array of strings to free * - * Frees a %NULL-terminated array of strings, as well as each - * string it contains. + * Frees an array of strings, as well as each string it contains. * - * If @str_array is %NULL, this function simply returns. + * If @str_array is `NULL`, this function simply returns. */ void g_strfreev (gchar **str_array) @@ -2595,14 +2557,15 @@ g_strfreev (gchar **str_array) /** * g_strdupv: - * @str_array: (nullable): a %NULL-terminated array of strings + * @str_array: (array zero-terminated=1) (nullable): an array of strings to copy * - * Copies %NULL-terminated array of strings. The copy is a deep copy; - * the new array should be freed by first freeing each string, then - * the array itself. g_strfreev() does this for you. If called - * on a %NULL value, g_strdupv() simply returns %NULL. + * Copies an array of strings. The copy is a deep copy; each string is also + * copied. * - * Returns: (nullable): a new %NULL-terminated array of strings. + * If called on a `NULL` value, `g_strdupv()` simply returns `NULL`. + * + * Returns: (array zero-terminated=1) (nullable) (transfer full): a + * newly-allocated array of strings. Use [func@GLib.strfreev] to free it. */ gchar** g_strdupv (gchar **str_array) @@ -2634,20 +2597,18 @@ g_strdupv (gchar **str_array) /** * g_strjoinv: - * @separator: (nullable): a string to insert between each of the - * strings, or %NULL - * @str_array: a %NULL-terminated array of strings to join + * @separator: (nullable): a string to insert between each of the strings + * @str_array: (array zero-terminated=1): an array of strings to join * - * Joins a number of strings together to form one long string, with the - * optional @separator inserted between each of them. The returned string - * should be freed with g_free(). + * Joins an array of strings together to form one long string, with the + * optional @separator inserted between each of them. * * If @str_array has no items, the return value will be an * empty string. If @str_array contains a single item, @separator will not * appear in the resulting string. * * Returns: a newly-allocated string containing all of the strings joined - * together, with @separator between them + * together, with @separator between them */ gchar* g_strjoinv (const gchar *separator, @@ -2691,16 +2652,14 @@ g_strjoinv (const gchar *separator, /** * g_strjoin: - * @separator: (nullable): a string to insert between each of the - * strings, or %NULL - * @...: a %NULL-terminated list of strings to join + * @separator: (nullable): a string to insert between each of the strings + * @...: a `NULL`-terminated list of strings to join * * Joins a number of strings together to form one long string, with the - * optional @separator inserted between each of them. The returned string - * should be freed with g_free(). + * optional @separator inserted between each of them. * * Returns: a newly-allocated string containing all of the strings joined - * together, with @separator between them + * together, with @separator between them */ gchar* g_strjoin (const gchar *separator, @@ -2761,17 +2720,19 @@ g_strjoin (const gchar *separator, /** * g_strstr_len: - * @haystack: a nul-terminated string - * @haystack_len: the maximum length of @haystack in bytes. A length of -1 - * can be used to mean "search the entire string", like `strstr()`. + * @haystack: a string to search in + * @haystack_len: the maximum length of @haystack in bytes, or `-1` to + * search it entirely * @needle: the string to search for * * Searches the string @haystack for the first occurrence * of the string @needle, limiting the length of the search * to @haystack_len or a nul terminator byte (whichever is reached first). * - * Returns: a pointer to the found occurrence, or - * %NULL if not found. + * A length of `-1` can be used to mean “search the entire string”, like + * `strstr()`. + * + * Returns: a pointer to the found occurrence, or `NULL` if not found */ gchar * g_strstr_len (const gchar *haystack, @@ -2817,14 +2778,13 @@ g_strstr_len (const gchar *haystack, /** * g_strrstr: - * @haystack: a nul-terminated string - * @needle: the nul-terminated string to search for + * @haystack: a string to search in + * @needle: the string to search for * * Searches the string @haystack for the last occurrence * of the string @needle. * - * Returns: a pointer to the found occurrence, or - * %NULL if not found. + * Returns: a pointer to the found occurrence, or `NULL` if not found */ gchar * g_strrstr (const gchar *haystack, @@ -2866,17 +2826,16 @@ g_strrstr (const gchar *haystack, /** * g_strrstr_len: - * @haystack: a nul-terminated string - * @haystack_len: the maximum length of @haystack in bytes. A length of -1 - * can be used to mean "search the entire string", like g_strrstr(). - * @needle: the nul-terminated string to search for + * @haystack: a string to search in + * @haystack_len: the maximum length of @haystack in bytes. A length of `-1` + * can be used to mean "search the entire string", like [func@GLib.strrstr] + * @needle: the string to search for * * Searches the string @haystack for the last occurrence * of the string @needle, limiting the length of the search * to @haystack_len. * - * Returns: a pointer to the found occurrence, or - * %NULL if not found. + * Returns: a pointer to the found occurrence, or `NULL` if not found */ gchar * g_strrstr_len (const gchar *haystack, @@ -2922,12 +2881,12 @@ g_strrstr_len (const gchar *haystack, /** * g_str_has_suffix: - * @str: a nul-terminated string - * @suffix: the nul-terminated suffix to look for + * @str: a string to look in + * @suffix: the suffix to look for * - * Looks whether the string @str ends with @suffix. + * Looks whether a string ends with @suffix. * - * Returns: %TRUE if @str end with @suffix, %FALSE otherwise. + * Returns: true if @str ends with @suffix, false otherwise * * Since: 2.2 */ @@ -2951,12 +2910,12 @@ gboolean (g_str_has_suffix) (const gchar *str, /** * g_str_has_prefix: - * @str: a nul-terminated string - * @prefix: the nul-terminated prefix to look for + * @str: a string to look in + * @prefix: the prefix to look for * * Looks whether the string @str begins with @prefix. * - * Returns: %TRUE if @str begins with @prefix, %FALSE otherwise. + * Returns: true if @str begins with @prefix, false otherwise * * Since: 2.2 */ @@ -2971,12 +2930,11 @@ gboolean (g_str_has_prefix) (const gchar *str, /** * g_strv_length: - * @str_array: a %NULL-terminated array of strings + * @str_array: (array zero-terminated=1): an array of strings * - * Returns the length of the given %NULL-terminated - * string array @str_array. @str_array must not be %NULL. + * Returns the length of an array of strings. @str_array must not be `NULL`. * - * Returns: length of @str_array. + * Returns: length of @str_array * * Since: 2.6 */ @@ -3080,21 +3038,21 @@ split_words (const gchar *value) /** * g_str_tokenize_and_fold: - * @string: a string + * @string: a string to tokenize * @translit_locale: (nullable): the language code (like 'de' or * 'en_GB') from which @string originates - * @ascii_alternates: (out) (transfer full) (array zero-terminated=1): a - * return location for ASCII alternates + * @ascii_alternates: (out) (optional) (transfer full) (array zero-terminated=1): + * a return location for ASCII alternates * - * Tokenises @string and performs folding on each token. + * Tokenizes @string and performs folding on each token. * * A token is a non-empty sequence of alphanumeric characters in the * source string, separated by non-alphanumeric characters. An * "alphanumeric" character for this purpose is one that matches - * g_unichar_isalnum() or g_unichar_ismark(). + * [func@GLib.unichar_isalnum] or [func@GLib.unichar_ismark]. * * Each token is then (Unicode) normalised and case-folded. If - * @ascii_alternates is non-%NULL and some of the returned tokens + * @ascii_alternates is non-`NULL` and some of the returned tokens * contain non-ASCII characters, ASCII alternatives will be generated. * * The number of ASCII alternatives that are generated and the method @@ -3168,13 +3126,13 @@ g_str_tokenize_and_fold (const gchar *string, * g_str_match_string: * @search_term: the search term from the user * @potential_hit: the text that may be a hit - * @accept_alternates: %TRUE to accept ASCII alternates + * @accept_alternates: if true, ASCII alternates are accepted * * Checks if a search conducted for @search_term should match * @potential_hit. * - * This function calls g_str_tokenize_and_fold() on both - * @search_term and @potential_hit. ASCII alternates are never taken + * This function calls [func@GLib.str_tokenize_and_fold] on both + * @search_term and @potential_hit. ASCII alternates are never taken * for @search_term but will be taken for @potential_hit according to * the value of @accept_alternates. * @@ -3182,9 +3140,9 @@ g_str_tokenize_and_fold (const gchar *string, * folded token from @potential_hit. * * Depending on how you're performing the search, it will typically be - * faster to call g_str_tokenize_and_fold() on each string in + * faster to call `g_str_tokenize_and_fold()` on each string in * your corpus and build an index on the returned folded tokens, then - * call g_str_tokenize_and_fold() on the search term and + * call `g_str_tokenize_and_fold()` on the search term and * perform lookups into that index. * * As some examples, searching for ‘fred’ would match the potential hit @@ -3193,7 +3151,7 @@ g_str_tokenize_and_fold (const gchar *string, * accent matching). Searching ‘fo’ would match ‘Foo’ and ‘Bar Foo * Baz’, but not ‘SFO’ (because no word has ‘fo’ as a prefix). * - * Returns: %TRUE if @potential_hit is a hit + * Returns: true if @potential_hit is a hit * * Since: 2.40 **/ @@ -3243,12 +3201,13 @@ one_matched: /** * g_strv_contains: - * @strv: a %NULL-terminated array of strings - * @str: a string + * @strv: (array zero-terminated=1): an array of strings to search in + * @str: the string to search for * - * Checks if @strv contains @str. @strv must not be %NULL. + * Checks if an array of strings contains the string @str according to + * [func@GLib.str_equal]. @strv must not be `NULL`. * - * Returns: %TRUE if @str is an element of @strv, according to g_str_equal(). + * Returns: true if @str is an element of @strv * * Since: 2.44 */ @@ -3270,17 +3229,24 @@ g_strv_contains (const gchar * const *strv, /** * g_strv_equal: - * @strv1: a %NULL-terminated array of strings - * @strv2: another %NULL-terminated array of strings + * @strv1: (array zero-terminated=1): an array of strings to compare to @strv2 + * @strv2: (array zero-terminated=1): an array of strings to compare to @strv1 * - * Checks if @strv1 and @strv2 contain exactly the same elements in exactly the - * same order. Elements are compared using g_str_equal(). To match independently - * of order, sort the arrays first (using g_qsort_with_data() or similar). + * Checks if two arrays of strings contain exactly the same elements in + * exactly the same order. * - * Two empty arrays are considered equal. Neither @strv1 not @strv2 may be - * %NULL. + * Elements are compared using [func@GLib.str_equal]. To match independently + * of order, sort the arrays first (using [func@GLib.qsort_with_data] + * or similar). * - * Returns: %TRUE if @strv1 and @strv2 are equal + * Elements are compared using [func@GLib.str_equal]. To match independently + * of order, sort the arrays first (using [func@GLib.qsort_with_data] + * or similar). + * + * Two empty arrays are considered equal. Neither @strv1 nor @strv2 may be + * `NULL`. + * + * Returns: true if @strv1 and @strv2 are equal * Since: 2.60 */ gboolean @@ -3316,7 +3282,7 @@ str_has_hex_prefix (const gchar *str) /** * g_ascii_string_to_signed: - * @str: a string + * @str: a string to convert * @base: base of a parsed number * @min: a lower bound (inclusive) * @max: an upper bound (inclusive) @@ -3336,16 +3302,16 @@ str_has_hex_prefix (const gchar *str) * for octal numbers, since they were usually prefixed with a zero * which does not change the value of the parsed number. * - * Parsing failures result in an error with the %G_NUMBER_PARSER_ERROR + * Parsing failures result in an error with the `G_NUMBER_PARSER_ERROR` * domain. If the input is invalid, the error code will be - * %G_NUMBER_PARSER_ERROR_INVALID. If the parsed number is out of - * bounds - %G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS. + * [error@GLib.NumberParserError.INVALID]. If the parsed number is out of + * bounds - [error@GLib.NumberParserError.OUT_OF_BOUNDS]. * - * See g_ascii_strtoll() if you have more complex needs such as + * See [func@GLib.ascii_strtoll] if you have more complex needs such as * parsing a string which starts with a number, but then has other * characters. * - * Returns: %TRUE if @str was a number, otherwise %FALSE. + * Returns: true if @str was a number, false otherwise * * Since: 2.54 */ @@ -3438,16 +3404,16 @@ g_ascii_string_to_signed (const gchar *str, * for octal numbers, since they were usually prefixed with a zero * which does not change the value of the parsed number. * - * Parsing failures result in an error with the %G_NUMBER_PARSER_ERROR + * Parsing failures result in an error with the `G_NUMBER_PARSER_ERROR` * domain. If the input is invalid, the error code will be - * %G_NUMBER_PARSER_ERROR_INVALID. If the parsed number is out of - * bounds - %G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS. + * [error@GLib.NumberParserError.INVALID]. If the parsed number is out of + * bounds - [error@GLib.NumberParserError.OUT_OF_BOUNDS]. * - * See g_ascii_strtoull() if you have more complex needs such as + * See [func@GLib.ascii_strtoull] if you have more complex needs such as * parsing a string which starts with a number, but then has other * characters. * - * Returns: %TRUE if @str was a number, otherwise %FALSE. + * Returns: true if @str was a number, false otherwise * * Since: 2.54 */ diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h index cb021b6..bd6a2c1 100644 --- a/glib/gstrfuncs.h +++ b/glib/gstrfuncs.h @@ -412,8 +412,8 @@ gboolean g_strv_equal (const gchar * const *strv1, /** * GNumberParserError: - * @G_NUMBER_PARSER_ERROR_INVALID: String was not a valid number. - * @G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS: String was a number, but out of bounds. + * @G_NUMBER_PARSER_ERROR_INVALID: string was not a valid number + * @G_NUMBER_PARSER_ERROR_OUT_OF_BOUNDS: string was a number, but out of bounds * * Error codes returned by functions converting a string to a number. * @@ -456,28 +456,34 @@ gboolean g_ascii_string_to_unsigned (const gchar *str, /** * g_set_str: (skip) - * @str_pointer: (inout) (not optional) (nullable): a pointer to either a string or %NULL - * @new_str: (nullable): a string to assign to @str_pointer, or %NULL + * @str_pointer: (inout) (not optional) (nullable): a pointer to either + * a string or `NULL` + * @new_str: (nullable): a string to assign to @str_pointer * - * Updates a pointer to a string to a copy of @new_str. The previous string - * pointed to by @str_pointer will be freed with g_free(). + * Updates a pointer to a string to a copy of @new_str and returns whether the + * string was changed. * - * @str_pointer must not be %NULL, but can point to a %NULL value. + * If @new_str matches the previous string, this function is a no-op. If + * @new_str is different, a copy of it will be assigned to @str_pointer and + * the previous string pointed to by @str_pointer will be freed with + * [func@GLib.free]. + * + * @str_pointer must not be `NULL`, but can point to a `NULL` value. * * One convenient usage of this function is in implementing property settings: - * |[ - * void - * foo_set_bar (Foo *foo, - * const char *new_bar) - * { - * g_return_if_fail (IS_FOO (foo)); + * ```C + * void + * foo_set_bar (Foo *foo, + * const char *new_bar) + * { + * g_return_if_fail (IS_FOO (foo)); * - * if (g_set_str (&foo->bar, new_bar)) - * g_object_notify (foo, "bar"); - * } - * ]| + * if (g_set_str (&foo->bar, new_bar)) + * g_object_notify (foo, "bar"); + * } + * ``` * - * Returns: %TRUE if the value of @str_pointer changed, %FALSE otherwise + * Returns: true if the value of @str_pointer changed, false otherwise * * Since: 2.76 */ diff --git a/glib/gstring.c b/glib/gstring.c index 9f04144..463bfec 100644 --- a/glib/gstring.c +++ b/glib/gstring.c @@ -42,25 +42,6 @@ #include "gutilsprivate.h" -/** - * SECTION:strings - * @title: Strings - * @short_description: text buffers which grow automatically - * as text is added - * - * A #GString is an object that handles the memory management of a C - * string for you. The emphasis of #GString is on text, typically - * UTF-8. Crucially, the "str" member of a #GString is guaranteed to - * have a trailing nul character, and it is therefore always safe to - * call functions such as strchr() or g_strdup() on it. - * - * However, a #GString can also hold arbitrary binary data, because it - * has a "len" member, which includes any possible embedded nul - * characters in the data. Conceptually then, #GString is like a - * #GByteArray with the addition of many convenience methods for text, - * and a guaranteed nul terminator. - */ - /** * GString: * @str: points to the character data. It may move as text is added. @@ -71,7 +52,16 @@ * @allocated_len: the number of bytes that can be stored in the * string before it needs to be reallocated. May be larger than @len. * - * The GString struct contains the public fields of a GString. + * A `GString` is an object that handles the memory management of a C string. + * + * The emphasis of `GString` is on text, typically UTF-8. Crucially, the "str" member + * of a `GString` is guaranteed to have a trailing nul character, and it is therefore + * always safe to call functions such as `strchr()` or `strdup()` on it. + * + * However, a `GString` can also hold arbitrary binary data, because it has a "len" member, + * which includes any possible embedded nul characters in the data. Conceptually then, + * `GString` is like a `GByteArray` with the addition of many convenience methods for + * text, and a guaranteed nul terminator. */ static void @@ -1231,6 +1221,10 @@ g_string_append_vprintf (GString *string, string->len += len; g_free (buf); } + else + { + g_critical ("Failed to append to string: invalid format/args passed to g_vasprintf()"); + } } /** diff --git a/glib/gstringchunk.c b/glib/gstringchunk.c index f4cf6cf..fb95146 100644 --- a/glib/gstringchunk.c +++ b/glib/gstringchunk.c @@ -42,40 +42,33 @@ #include "gutilsprivate.h" /** - * SECTION:string_chunks - * @title: String Chunks - * @short_description: efficient storage of groups of strings + * GStringChunk: + * + * `GStringChunk` provides efficient storage of groups of strings * * String chunks are used to store groups of strings. Memory is - * allocated in blocks, and as strings are added to the #GStringChunk + * allocated in blocks, and as strings are added to the `GStringChunk` * they are copied into the next free position in a block. When a block * is full a new block is allocated. * * When storing a large number of strings, string chunks are more - * efficient than using g_strdup() since fewer calls to malloc() are - * needed, and less memory is wasted in memory allocation overheads. + * efficient than using [func@GLib.strdup] since fewer calls to `malloc()` + * are needed, and less memory is wasted in memory allocation overheads. * - * By adding strings with g_string_chunk_insert_const() it is also + * By adding strings with [method@GLib.StringChunk.insert_const] it is also * possible to remove duplicates. * - * To create a new #GStringChunk use g_string_chunk_new(). + * To create a new `GStringChunk` use [func@GLib.StringChunk.new]. * - * To add strings to a #GStringChunk use g_string_chunk_insert(). + * To add strings to a `GStringChunk` use [method@GLib.StringChunk.insert]. * - * To add strings to a #GStringChunk, but without duplicating strings - * which are already in the #GStringChunk, use - * g_string_chunk_insert_const(). + * To add strings to a `GStringChunk`, but without duplicating strings + * which are already in the `GStringChunk`, use [method@GLib.StringChunk.insert_const]. * - * To free the entire #GStringChunk use g_string_chunk_free(). It is - * not possible to free individual strings. + * To free the entire `GStringChunk` use [method@GLib.StringChunk.free]. + * It is not possible to free individual strings. */ -/** - * GStringChunk: - * - * An opaque data structure representing String Chunks. - * It should only be accessed by using the following functions. - */ struct _GStringChunk { GHashTable *const_table; @@ -86,7 +79,7 @@ struct _GStringChunk }; /** - * g_string_chunk_new: + * g_string_chunk_new: (constructor) * @size: the default size of the blocks of memory which are * allocated to store the strings. If a particular string * is larger than this default size, a larger block of @@ -94,7 +87,7 @@ struct _GStringChunk * * Creates a new #GStringChunk. * - * Returns: a new #GStringChunk + * Returns: (transfer full): a new #GStringChunk */ GStringChunk * g_string_chunk_new (gsize size) @@ -115,7 +108,7 @@ g_string_chunk_new (gsize size) /** * g_string_chunk_free: - * @chunk: a #GStringChunk + * @chunk: (transfer full): a #GStringChunk * * Frees all memory allocated by the #GStringChunk. * After calling g_string_chunk_free() it is not safe to diff --git a/glib/gstrvbuilder.c b/glib/gstrvbuilder.c index 5ef7dcc..12d6a29 100644 --- a/glib/gstrvbuilder.c +++ b/glib/gstrvbuilder.c @@ -27,21 +27,18 @@ #include "gmessages.h" /** - * SECTION:gstrvbuilder - * @title: GStrvBuilder - * @short_description: Helper to create NULL-terminated string arrays. + * GStrvBuilder: * - * #GStrvBuilder is a method of easily building dynamically sized - * NULL-terminated string arrays. + * `GStrvBuilder` is a helper object to build a %NULL-terminated string arrays. * * The following example shows how to build a two element array: * - * |[ + * ```c * g_autoptr(GStrvBuilder) builder = g_strv_builder_new (); * g_strv_builder_add (builder, "hello"); * g_strv_builder_add (builder, "world"); * g_auto(GStrv) array = g_strv_builder_end (builder); - * ]| + * ``` * * Since: 2.68 */ @@ -159,6 +156,24 @@ g_strv_builder_add_many (GStrvBuilder *builder, va_end (var_args); } +/** + * g_strv_builder_take: + * @builder: a #GStrvBuilder + * @value: (transfer full): a string. + * Ownership of the string is transferred to the #GStrvBuilder + * + * Add a string to the end of the array. After @value belongs to the + * #GStrvBuilder and may no longer be modified by the caller. + * + * Since 2.80 + */ +void +g_strv_builder_take (GStrvBuilder *builder, + char *value) +{ + g_ptr_array_add (&builder->array, value); +} + /** * g_strv_builder_end: * @builder: a #GStrvBuilder diff --git a/glib/gstrvbuilder.h b/glib/gstrvbuilder.h index c8acbaa..f96df30 100644 --- a/glib/gstrvbuilder.h +++ b/glib/gstrvbuilder.h @@ -30,14 +30,6 @@ G_BEGIN_DECLS -/** - * GStrvBuilder: - * - * A helper object to build a %NULL-terminated string array - * by appending. See g_strv_builder_new(). - * - * Since: 2.68 - */ typedef struct _GStrvBuilder GStrvBuilder; GLIB_AVAILABLE_IN_2_68 @@ -61,6 +53,10 @@ GLIB_AVAILABLE_IN_2_70 void g_strv_builder_add_many (GStrvBuilder *builder, ...) G_GNUC_NULL_TERMINATED; +GLIB_AVAILABLE_IN_2_80 +void g_strv_builder_take (GStrvBuilder *builder, + char *value); + GLIB_AVAILABLE_IN_2_68 GStrv g_strv_builder_end (GStrvBuilder *builder); diff --git a/glib/gtestutils.c b/glib/gtestutils.c index 483275a..5c5f905 100644 --- a/glib/gtestutils.c +++ b/glib/gtestutils.c @@ -67,193 +67,6 @@ * See https://gitlab.gnome.org/GNOME/glib/-/issues/2885 */ #define TAP_SUBTEST_PREFIX "# " /* a 4-space indented line */ -/** - * SECTION:testing - * @title: Testing - * @short_description: a test framework - * - * GLib provides a framework for writing and maintaining unit tests - * in parallel to the code they are testing. The API is designed according - * to established concepts found in the other test frameworks (JUnit, NUnit, - * RUnit), which in turn is based on smalltalk unit testing concepts. - * - * - Test case: Tests (test methods) are grouped together with their - * fixture into test cases. - * - * - Fixture: A test fixture consists of fixture data and setup and - * teardown methods to establish the environment for the test - * functions. We use fresh fixtures, i.e. fixtures are newly set - * up and torn down around each test invocation to avoid dependencies - * between tests. - * - * - Test suite: Test cases can be grouped into test suites, to allow - * subsets of the available tests to be run. Test suites can be - * grouped into other test suites as well. - * - * The API is designed to handle creation and registration of test suites - * and test cases implicitly. A simple call like - * |[ - * g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); - * - * g_test_add_func ("/misc/assertions", test_assertions); - * ]| - * creates a test suite called "misc" with a single test case named - * "assertions", which consists of running the test_assertions function. - * - * g_test_init() should be called before calling any other test functions. - * - * In addition to the traditional g_assert_true(), the test framework provides - * an extended set of assertions for comparisons: g_assert_cmpfloat(), - * g_assert_cmpfloat_with_epsilon(), g_assert_cmpint(), g_assert_cmpuint(), - * g_assert_cmphex(), g_assert_cmpstr(), g_assert_cmpmem() and - * g_assert_cmpvariant(). The - * advantage of these variants over plain g_assert_true() is that the assertion - * messages can be more elaborate, and include the values of the compared - * entities. - * - * Note that g_assert() should not be used in unit tests, since it is a no-op - * when compiling with `G_DISABLE_ASSERT`. Use g_assert() in production code, - * and g_assert_true() in unit tests. - * - * A full example of creating a test suite with two tests using fixtures: - * |[ - * #include - * #include - * - * typedef struct { - * MyObject *obj; - * OtherObject *helper; - * } MyObjectFixture; - * - * static void - * my_object_fixture_set_up (MyObjectFixture *fixture, - * gconstpointer user_data) - * { - * fixture->obj = my_object_new (); - * my_object_set_prop1 (fixture->obj, "some-value"); - * my_object_do_some_complex_setup (fixture->obj, user_data); - * - * fixture->helper = other_object_new (); - * } - * - * static void - * my_object_fixture_tear_down (MyObjectFixture *fixture, - * gconstpointer user_data) - * { - * g_clear_object (&fixture->helper); - * g_clear_object (&fixture->obj); - * } - * - * static void - * test_my_object_test1 (MyObjectFixture *fixture, - * gconstpointer user_data) - * { - * g_assert_cmpstr (my_object_get_property (fixture->obj), ==, "initial-value"); - * } - * - * static void - * test_my_object_test2 (MyObjectFixture *fixture, - * gconstpointer user_data) - * { - * my_object_do_some_work_using_helper (fixture->obj, fixture->helper); - * g_assert_cmpstr (my_object_get_property (fixture->obj), ==, "updated-value"); - * } - * - * int - * main (int argc, char *argv[]) - * { - * setlocale (LC_ALL, ""); - * - * g_test_init (&argc, &argv, NULL); - * - * // Define the tests. - * g_test_add ("/my-object/test1", MyObjectFixture, "some-user-data", - * my_object_fixture_set_up, test_my_object_test1, - * my_object_fixture_tear_down); - * g_test_add ("/my-object/test2", MyObjectFixture, "some-user-data", - * my_object_fixture_set_up, test_my_object_test2, - * my_object_fixture_tear_down); - * - * return g_test_run (); - * } - * ]| - * - * ## Integrating GTest in your project - * - * If you are using the [Meson](http://mesonbuild.com) build system, you will - * typically use the provided `test()` primitive to call the test binaries, - * e.g.: - * - * |[ - * test( - * 'foo', - * executable('foo', 'foo.c', dependencies: deps), - * env: [ - * 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - * 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), - * ], - * ) - * - * test( - * 'bar', - * executable('bar', 'bar.c', dependencies: deps), - * env: [ - * 'G_TEST_SRCDIR=@0@'.format(meson.current_source_dir()), - * 'G_TEST_BUILDDIR=@0@'.format(meson.current_build_dir()), - * ], - * ) - * ]| - * - * If you are using Autotools, you're strongly encouraged to use the Automake - * [TAP](https://testanything.org/) harness; GLib provides template files for - * easily integrating with it: - * - * - [glib-tap.mk](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/glib-tap.mk) - * - [tap-test](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/tap-test) - * - [tap-driver.sh](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/tap-driver.sh) - * - * You can copy these files in your own project's root directory, and then - * set up your `Makefile.am` file to reference them, for instance: - * - * |[ - * include $(top_srcdir)/glib-tap.mk - * - * # test binaries - * test_programs = \ - * foo \ - * bar - * - * # data distributed in the tarball - * dist_test_data = \ - * foo.data.txt \ - * bar.data.txt - * - * # data not distributed in the tarball - * test_data = \ - * blah.data.txt - * ]| - * - * Make sure to distribute the TAP files, using something like the following - * in your top-level `Makefile.am`: - * - * |[ - * EXTRA_DIST += \ - * tap-driver.sh \ - * tap-test - * ]| - * - * `glib-tap.mk` will be distributed implicitly due to being included in a - * `Makefile.am`. All three files should be added to version control. - * - * If you don't have access to the Autotools TAP harness, you can use the - * [gtester][gtester] and [gtester-report][gtester-report] tools, and use - * the [glib.mk](https://gitlab.gnome.org/GNOME/glib/blob/glib-2-58/glib.mk) - * Automake template provided by GLib. Note, however, that since GLib 2.62, - * [gtester][gtester] and [gtester-report][gtester-report] have been deprecated - * in favour of using TAP. The `--tap` argument to tests is enabled by default - * as of GLib 2.62. - */ - /** * g_test_initialized: * @@ -1102,10 +915,10 @@ g_test_log (GTestLogType lbit, unsigned subtest_level; gdouble timing; - if (g_once_init_enter (&g_default_print_func)) + if (g_once_init_enter_pointer (&g_default_print_func)) { - g_once_init_leave (&g_default_print_func, - g_set_print_handler (g_test_print_handler)); + g_once_init_leave_pointer (&g_default_print_func, + g_set_print_handler (g_test_print_handler)); g_assert_nonnull (g_default_print_func); } @@ -1844,8 +1657,8 @@ void test_run_seedstr = seedstr; } - if (!g_get_prgname() && !no_g_set_prgname) - g_set_prgname ((*argv)[0]); + if (!g_get_prgname () && !no_g_set_prgname) + g_set_prgname_once ((*argv)[0]); if (g_getenv ("G_TEST_ROOT_PROCESS")) { @@ -3072,12 +2885,13 @@ g_test_queue_free (gpointer gfree_pointer) * @destroy_func: Destroy callback for teardown phase. * @destroy_data: Destroy callback data. * - * This function enqueus a callback @destroy_func to be executed - * during the next test case teardown phase. This is most useful - * to auto destruct allocated test resources at the end of a test run. - * Resources are released in reverse queue order, that means enqueueing - * callback A before callback B will cause B() to be called before - * A() during teardown. + * Enqueues a callback @destroy_func to be executed during the next test case + * teardown phase. + * + * This is most useful to auto destroy allocated test resources at the end of a + * test run. Resources are released in reverse queue order, that means + * enqueueing callback `A` before callback `B` will cause `B()` to be called + * before `A()` during teardown. * * Since: 2.16 */ @@ -3112,17 +2926,30 @@ test_has_prefix (gconstpointer a, return g_strcmp0 (test_run_name_local, test_path_skipped_local); } +static gboolean test_should_run (const char *test_path, + const char *cmp_path); + static gboolean -test_case_run (GTestCase *tc) +test_case_run (GTestCase *tc, + const char *test_run_name, + const char *path) { - gchar *old_base = g_strdup (test_uri_base); + gchar *old_base = NULL; GSList **old_free_list, *filename_free_list = NULL; gboolean success = G_TEST_RUN_SUCCESS; + gboolean free_test_data = TRUE; + old_base = g_strdup (test_uri_base); old_free_list = test_filename_free_list; test_filename_free_list = &filename_free_list; - if (++test_run_count <= test_startup_skip_count) + if (!test_should_run (test_run_name, path)) + { + /* Silently skip the test and return success. This happens if it’s a + * /subprocess path. */ + success = G_TEST_RUN_SKIPPED; + } + else if (++test_run_count <= test_startup_skip_count) g_test_log (G_TEST_LOG_SKIP_CASE, test_run_name, NULL, 0, NULL); else if (test_run_list) { @@ -3169,6 +2996,7 @@ test_case_run (GTestCase *tc) } if (tc->fixture_teardown) tc->fixture_teardown (fixture, tc->test_data); + free_test_data = FALSE; if (tc->fixture_size) g_free (fixture); g_timer_stop (test_run_timer); @@ -3186,6 +3014,13 @@ test_case_run (GTestCase *tc) g_timer_destroy (test_run_timer); } + /* In case the test didn’t run (due to being skipped or an error), the test + * data may still need to be freed, as the client’s main() function may have + * passed ownership of it into g_test_add_data_func_full() with a + * #GDestroyNotify. */ + if (free_test_data && tc->fixture_size == 0 && tc->fixture_teardown != NULL) + tc->fixture_teardown (tc->test_data, tc->test_data); + g_slist_free_full (filename_free_list, g_free); test_filename_free_list = old_free_list; g_free (test_uri_base); @@ -3251,11 +3086,10 @@ g_test_run_suite_internal (GTestSuite *suite, test_run_name = g_build_path ("/", old_name, tc->name, NULL); test_run_name_path = g_build_path (G_DIR_SEPARATOR_S, old_name_path, tc->name, NULL); - if (test_should_run (test_run_name, path)) - { - if (!test_case_run (tc)) - n_bad++; - } + + if (!test_case_run (tc, test_run_name, path)) + n_bad++; + g_free (test_run_name); g_free (test_run_name_path); } @@ -4037,6 +3871,32 @@ G_GNUC_END_IGNORE_DEPRECATIONS * @test_flags: Flags to modify subprocess behaviour. * * Respawns the test program to run only @test_path in a subprocess. + * + * This is equivalent to calling g_test_trap_subprocess_with_envp() with `envp` + * set to %NULL. See the documentation for that function for full details. + * + * Since: 2.38 + */ +void +g_test_trap_subprocess (const char *test_path, + guint64 usec_timeout, + GTestSubprocessFlags test_flags) +{ + g_test_trap_subprocess_with_envp (test_path, NULL, usec_timeout, test_flags); +} + +/** + * g_test_trap_subprocess_with_envp: + * @test_path: (nullable): Test to run in a subprocess + * @envp: (array zero-terminated=1) (nullable) (element-type filename): Environment + * to run the test in, or %NULL to inherit the parent’s environment. This must + * be in the GLib filename encoding. + * @usec_timeout: Timeout for the subprocess test in micro seconds. + * @test_flags: Flags to modify subprocess behaviour. + * + * Respawns the test program to run only @test_path in a subprocess with the + * given @envp environment. + * * This can be used for a test case that might not return, or that * might abort. * @@ -4050,6 +3910,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS * tests with names of this form will automatically be skipped in the * parent process. * + * If @envp is %NULL, the parent process’ environment will be inherited. + * * If @usec_timeout is non-0, the test subprocess is aborted and * considered failing if its run time exceeds it. * @@ -4092,23 +3954,44 @@ G_GNUC_END_IGNORE_DEPRECATIONS * g_test_trap_assert_stderr ("*ERROR*too large*"); * } * + * static void + * test_different_username (void) + * { + * if (g_test_subprocess ()) + * { + * // Code under test goes here + * g_message ("Username is now simulated as %s", g_getenv ("USER")); + * return; + * } + * + * // Reruns this same test in a subprocess + * g_autoptr(GStrv) envp = g_get_environ (); + * envp = g_environ_setenv (g_steal_pointer (&envp), "USER", "charlie", TRUE); + * g_test_trap_subprocess_with_envp (NULL, envp, 0, G_TEST_SUBPROCESS_DEFAULT); + * g_test_trap_assert_passed (); + * g_test_trap_assert_stdout ("Username is now simulated as charlie"); + * } + * * int * main (int argc, char **argv) * { * g_test_init (&argc, &argv, NULL); * - * g_test_add_func ("/myobject/create_large_object", + * g_test_add_func ("/myobject/create-large-object", * test_create_large_object); + * g_test_add_func ("/myobject/different-username", + * test_different_username); * return g_test_run (); * } * ]| * - * Since: 2.38 + * Since: 2.80 */ void -g_test_trap_subprocess (const char *test_path, - guint64 usec_timeout, - GTestSubprocessFlags test_flags) +g_test_trap_subprocess_with_envp (const char *test_path, + const char * const *envp, + guint64 usec_timeout, + GTestSubprocessFlags test_flags) { GError *error = NULL; GPtrArray *argv; @@ -4167,7 +4050,7 @@ g_test_trap_subprocess (const char *test_path, if (!g_spawn_async_with_pipes (test_initial_cwd, (char **)argv->pdata, - NULL, flags, + (char **) envp, flags, NULL, NULL, &pid, NULL, &stdout_fd, &stderr_fd, &error)) diff --git a/glib/gtestutils.h b/glib/gtestutils.h index 30ede25..69ca9c9 100644 --- a/glib/gtestutils.h +++ b/glib/gtestutils.h @@ -515,6 +515,11 @@ GLIB_AVAILABLE_IN_2_38 void g_test_trap_subprocess (const char *test_path, guint64 usec_timeout, GTestSubprocessFlags test_flags); +GLIB_AVAILABLE_IN_2_80 +void g_test_trap_subprocess_with_envp (const char *test_path, + const char * const *envp, + guint64 usec_timeout, + GTestSubprocessFlags test_flags); GLIB_AVAILABLE_IN_ALL gboolean g_test_trap_has_passed (void); diff --git a/glib/gthread-win32.c b/glib/gthread-win32.c index 58e244e..fc5697d 100644 --- a/glib/gthread-win32.c +++ b/glib/gthread-win32.c @@ -424,28 +424,6 @@ g_system_thread_free (GRealThread *thread) void g_system_thread_exit (void) { - /* In static compilation, DllMain doesn't exist and so DLL_THREAD_DETACH - * case is never called and thread destroy notifications are not triggered. - * To ensure that notifications are correctly triggered in static - * compilation mode, we call directly the "detach" function here right - * before terminating the thread. - * As all win32 threads initialized through the glib API are run through - * the same proxy function g_thread_win32_proxy() which calls systematically - * g_system_thread_exit() when finishing, we obtain the same behavior as - * with dynamic compilation. - * - * WARNING: unfortunately this mechanism cannot work with threads created - * directly from the Windows API using CreateThread() or _beginthread/ex(). - * It only works with threads created by using the glib API with - * g_system_thread_new(). If users need absolutely to use a thread NOT - * created with glib API under Windows and in static compilation mode, they - * should not use glib functions within their thread or they may encounter - * memory leaks when the thread finishes. - */ -#ifdef GLIB_STATIC_COMPILATION - g_thread_win32_thread_detach (); -#endif - _endthreadex (0); } @@ -593,7 +571,7 @@ SetThreadName (DWORD dwThreadID, info.dwThreadID = dwThreadID; info.dwFlags = 0; - infosize = sizeof (info) / sizeof (DWORD); + infosize = sizeof (info) / sizeof (ULONG_PTR); #ifdef _MSC_VER __try @@ -601,14 +579,12 @@ SetThreadName (DWORD dwThreadID, RaiseException (EXCEPTION_SET_THREAD_NAME, 0, infosize, (const ULONG_PTR *) &info); } - __except (EXCEPTION_EXECUTE_HANDLER) + __except (GetExceptionCode () == EXCEPTION_SET_THREAD_NAME ? + EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { } #else - /* Without a debugger we *must* have an exception handler, - * otherwise raising an exception will crash the process. - */ - if ((!IsDebuggerPresent ()) && (SetThreadName_VEH_handle == NULL)) + if ((!IsDebuggerPresent ()) || (SetThreadName_VEH_handle == NULL)) return; RaiseException (EXCEPTION_SET_THREAD_NAME, 0, infosize, (const ULONG_PTR *) &info); @@ -681,11 +657,15 @@ g_thread_win32_init (void) InitializeCriticalSection (&g_private_lock); #ifndef _MSC_VER - SetThreadName_VEH_handle = AddVectoredExceptionHandler (1, &SetThreadName_VEH); + /* Set the handler as last to not interfere with ASAN runtimes. + * Many ASAN implementations (currently all three of GCC, CLANG + * and MSVC) install a Vectored Exception Handler that must be + * first in the sequence to work well + */ + SetThreadName_VEH_handle = AddVectoredExceptionHandler (0, &SetThreadName_VEH); if (SetThreadName_VEH_handle == NULL) - { - /* This is bad, but what can we do? */ - } + g_critical ("%s failed with error code %u", + "AddVectoredExceptionHandler", (unsigned int) GetLastError ()); #endif } diff --git a/glib/gthread.c b/glib/gthread.c index eed7595..b39acc4 100644 --- a/glib/gthread.c +++ b/glib/gthread.c @@ -47,7 +47,11 @@ #ifdef G_OS_UNIX #include + +#if defined(THREADS_POSIX) && defined(HAVE_PTHREAD_GETAFFINITY_NP) +#include #endif +#endif /* G_OS_UNIX */ #ifndef G_OS_WIN32 #include @@ -62,104 +66,6 @@ #include "glib_trace.h" #include "gtrace-private.h" -/** - * SECTION:threads - * @title: Threads - * @short_description: portable support for threads, mutexes, locks, - * conditions and thread private data - * @see_also: #GThreadPool, #GAsyncQueue - * - * Threads act almost like processes, but unlike processes all threads - * of one process share the same memory. This is good, as it provides - * easy communication between the involved threads via this shared - * memory, and it is bad, because strange things (so called - * "Heisenbugs") might happen if the program is not carefully designed. - * In particular, due to the concurrent nature of threads, no - * assumptions on the order of execution of code running in different - * threads can be made, unless order is explicitly forced by the - * programmer through synchronization primitives. - * - * The aim of the thread-related functions in GLib is to provide a - * portable means for writing multi-threaded software. There are - * primitives for mutexes to protect the access to portions of memory - * (#GMutex, #GRecMutex and #GRWLock). There is a facility to use - * individual bits for locks (g_bit_lock()). There are primitives - * for condition variables to allow synchronization of threads (#GCond). - * There are primitives for thread-private data - data that every - * thread has a private instance of (#GPrivate). There are facilities - * for one-time initialization (#GOnce, g_once_init_enter()). Finally, - * there are primitives to create and manage threads (#GThread). - * - * The GLib threading system used to be initialized with g_thread_init(). - * This is no longer necessary. Since version 2.32, the GLib threading - * system is automatically initialized at the start of your program, - * and all thread-creation functions and synchronization primitives - * are available right away. - * - * Note that it is not safe to assume that your program has no threads - * even if you don't call g_thread_new() yourself. GLib and GIO can - * and will create threads for their own purposes in some cases, such - * as when using g_unix_signal_source_new() or when using GDBus. - * - * Originally, UNIX did not have threads, and therefore some traditional - * UNIX APIs are problematic in threaded programs. Some notable examples - * are - * - * - C library functions that return data in statically allocated - * buffers, such as strtok() or strerror(). For many of these, - * there are thread-safe variants with a _r suffix, or you can - * look at corresponding GLib APIs (like g_strsplit() or g_strerror()). - * - * - The functions setenv() and unsetenv() manipulate the process - * environment in a not thread-safe way, and may interfere with getenv() - * calls in other threads. Note that getenv() calls may be hidden behind - * other APIs. For example, GNU gettext() calls getenv() under the - * covers. In general, it is best to treat the environment as readonly. - * If you absolutely have to modify the environment, do it early in - * main(), when no other threads are around yet. - * - * - The setlocale() function changes the locale for the entire process, - * affecting all threads. Temporary changes to the locale are often made - * to change the behavior of string scanning or formatting functions - * like scanf() or printf(). GLib offers a number of string APIs - * (like g_ascii_formatd() or g_ascii_strtod()) that can often be - * used as an alternative. Or you can use the uselocale() function - * to change the locale only for the current thread. - * - * - The fork() function only takes the calling thread into the child's - * copy of the process image. If other threads were executing in critical - * sections they could have left mutexes locked which could easily - * cause deadlocks in the new child. For this reason, you should - * call exit() or exec() as soon as possible in the child and only - * make signal-safe library calls before that. - * - * - The daemon() function uses fork() in a way contrary to what is - * described above. It should not be used with GLib programs. - * - * GLib itself is internally completely thread-safe (all global data is - * automatically locked), but individual data structure instances are - * not automatically locked for performance reasons. For example, - * you must coordinate accesses to the same #GHashTable from multiple - * threads. The two notable exceptions from this rule are #GMainLoop - * and #GAsyncQueue, which are thread-safe and need no further - * application-level locking to be accessed from multiple threads. - * Most refcounting functions such as g_object_ref() are also thread-safe. - * - * A common use for #GThreads is to move a long-running blocking operation out - * of the main thread and into a worker thread. For GLib functions, such as - * single GIO operations, this is not necessary, and complicates the code. - * Instead, the `…_async()` version of the function should be used from the main - * thread, eliminating the need for locking and synchronisation between multiple - * threads. If an operation does need to be moved to a worker thread, consider - * using g_task_run_in_thread(), or a #GThreadPool. #GThreadPool is often a - * better choice than #GThread, as it handles thread reuse and task queueing; - * #GTask uses this internally. - * - * However, if multiple blocking operations need to be performed in sequence, - * and it is not possible to use #GTask for them, moving them to a worker thread - * can clarify the code. - */ - /* G_LOCK Documentation {{{1 ---------------------------------------------- */ /** @@ -236,6 +142,20 @@ * %G_LOCK_DEFINE. */ +/** + * G_AUTO_LOCK: + * @name: the name of the lock + * + * Works like [func@GLib.MUTEX_AUTO_LOCK], but for a lock defined with + * [func@GLib.LOCK_DEFINE]. + * + * This feature is only supported on GCC and clang. This macro is not defined on + * other compilers and should not be used in programs that are intended to be + * portable to those compilers. + * + * Since: 2.80 + */ + /* GMutex Documentation {{{1 ------------------------------------------ */ /** @@ -663,7 +583,7 @@ g_once_impl (GOnce *once, /** * g_once_init_enter: - * @location: (not nullable): location of a static initializable variable + * @location: (inout) (not optional): location of a static initializable variable * containing 0 * * Function to be called when starting a critical initialization @@ -720,8 +640,56 @@ gboolean } /** - * g_once_init_leave: + * g_once_init_enter_pointer: * @location: (not nullable): location of a static initializable variable + * containing `NULL` + * + * This functions behaves in the same way as g_once_init_enter(), but can + * can be used to initialize pointers (or #guintptr) instead of #gsize. + * + * |[ + * static MyStruct *interesting_struct = NULL; + * + * if (g_once_init_enter_pointer (&interesting_struct)) + * { + * MyStruct *setup_value = allocate_my_struct (); // initialization code here + * + * g_once_init_leave_pointer (&interesting_struct, g_steal_pointer (&setup_value)); + * } + * + * // use interesting_struct here + * ]| + * + * Returns: %TRUE if the initialization section should be entered, + * %FALSE and blocks otherwise + * + * Since: 2.80 + */ +gboolean +(g_once_init_enter_pointer) (gpointer location) +{ + gpointer *value_location = (gpointer *) location; + gboolean need_init = FALSE; + g_mutex_lock (&g_once_mutex); + if (g_atomic_pointer_get (value_location) == 0) + { + if (!g_slist_find (g_once_init_list, (void *) value_location)) + { + need_init = TRUE; + g_once_init_list = g_slist_prepend (g_once_init_list, (void *) value_location); + } + else + do + g_cond_wait (&g_once_cond, &g_once_mutex); + while (g_slist_find (g_once_init_list, (void *) value_location)); + } + g_mutex_unlock (&g_once_mutex); + return need_init; +} + +/** + * g_once_init_leave: + * @location: (inout) (not optional): location of a static initializable variable * containing 0 * @result: new non-0 value for *@value_location * @@ -755,6 +723,42 @@ void g_mutex_unlock (&g_once_mutex); } +/** + * g_once_init_leave_pointer: + * @location: (not nullable): location of a static initializable variable + * containing `NULL` + * @result: new non-`NULL` value for `*location` + * + * Counterpart to g_once_init_enter_pointer(). Expects a location of a static + * `NULL`-initialized initialization variable, and an initialization value + * other than `NULL`. Sets the variable to the initialization value, and + * releases concurrent threads blocking in g_once_init_enter_pointer() on this + * initialization variable. + * + * This functions behaves in the same way as g_once_init_leave(), but + * can be used to initialize pointers (or #guintptr) instead of #gsize. + * + * Since: 2.80 + */ +void +(g_once_init_leave_pointer) (gpointer location, + gpointer result) +{ + gpointer *value_location = (gpointer *) location; + gpointer old_value; + + g_return_if_fail (result != 0); + + old_value = g_atomic_pointer_exchange (value_location, result); + g_return_if_fail (old_value == 0); + + g_mutex_lock (&g_once_mutex); + g_return_if_fail (g_once_init_list != NULL); + g_once_init_list = g_slist_remove (g_once_init_list, (void *) value_location); + g_cond_broadcast (&g_once_cond); + g_mutex_unlock (&g_once_mutex); +} + /* GThread {{{1 -------------------------------------------------------- */ /** @@ -1086,6 +1090,22 @@ g_get_num_processors (void) if (count > 0) return count; +#elif defined(_SC_NPROCESSORS_ONLN) && defined(THREADS_POSIX) && defined(HAVE_PTHREAD_GETAFFINITY_NP) + { + int idx; + int ncores = MIN (sysconf (_SC_NPROCESSORS_ONLN), CPU_SETSIZE); + cpu_set_t cpu_mask; + CPU_ZERO (&cpu_mask); + + int af_count = 0; + int err = pthread_getaffinity_np (pthread_self (), sizeof (cpu_mask), &cpu_mask); + if (!err) + for (idx = 0; idx < ncores && idx < CPU_SETSIZE; ++idx) + af_count += CPU_ISSET (idx, &cpu_mask); + + int count = (af_count > 0) ? af_count : ncores; + return count; + } #elif defined(_SC_NPROCESSORS_ONLN) { int count; diff --git a/glib/gthread.h b/glib/gthread.h index 14bb5a0..3cfa28f 100644 --- a/glib/gthread.h +++ b/glib/gthread.h @@ -139,6 +139,10 @@ struct _GOnce # define G_TRYLOCK(name) g_mutex_trylock (&G_LOCK_NAME (name)) #endif /* !G_DEBUG_LOCKS */ +#ifdef g_autoptr +#define G_AUTO_LOCK(name) G_MUTEX_AUTO_LOCK (&G_LOCK_NAME (name), g__##name##_locker) +#endif /* g_autoptr */ + GLIB_AVAILABLE_IN_2_32 GThread * g_thread_ref (GThread *thread); GLIB_AVAILABLE_IN_2_32 @@ -236,6 +240,12 @@ GLIB_AVAILABLE_IN_ALL void g_once_init_leave (volatile void *location, gsize result); +GLIB_AVAILABLE_IN_2_80 +gboolean g_once_init_enter_pointer (void *location); +GLIB_AVAILABLE_IN_2_80 +void g_once_init_leave_pointer (void *location, + gpointer result); + /* Use C11-style atomic extensions to check the fast path for status=ready. If * they are not available, fall back to using a mutex and condition variable in * g_once_impl(). @@ -268,11 +278,30 @@ void g_once_init_leave (volatile void *location, 0 ? (void) (*(location) = (result)) : (void) 0; \ g_once_init_leave ((location), (gsize) (result)); \ })) +# define g_once_init_enter_pointer(location) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ + (void) (0 ? (gpointer) * (location) : NULL); \ + (!g_atomic_pointer_get (location) && \ + g_once_init_enter_pointer (location)); \ + })) GLIB_AVAILABLE_MACRO_IN_2_80 +# define g_once_init_leave_pointer(location, result) \ + (G_GNUC_EXTENSION ({ \ + G_STATIC_ASSERT (sizeof *(location) == sizeof (gpointer)); \ + 0 ? (void) (*(location) = (result)) : (void) 0; \ + g_once_init_leave_pointer ((location), (gpointer) (guintptr) (result)); \ + })) GLIB_AVAILABLE_MACRO_IN_2_80 #else # define g_once_init_enter(location) \ (g_once_init_enter((location))) # define g_once_init_leave(location, result) \ (g_once_init_leave((location), (gsize) (result))) +# define g_once_init_enter_pointer(location) \ + (g_once_init_enter_pointer((location))) \ + GLIB_AVAILABLE_MACRO_IN_2_80 +# define g_once_init_leave_pointer(location, result) \ + (g_once_init_leave_pointer((location), (gpointer) (guintptr) (result))) \ + GLIB_AVAILABLE_MACRO_IN_2_80 #endif GLIB_AVAILABLE_IN_2_36 @@ -314,7 +343,7 @@ typedef void GMutexLocker; * * // Code with mutex locked here * - * if (cond) + * if (condition) * // No need to unlock * return; * @@ -325,6 +354,10 @@ typedef void GMutexLocker; * } * ]| * + * Note that it is common for the declared variable to not be used in the scope, + * which causes some compilers to warn. That can be avoided by using + * `G_GNUC_UNUSED` or, since 2.80, [func@GLib.MUTEX_AUTO_LOCK]. + * * Returns: a #GMutexLocker * Since: 2.44 */ @@ -353,6 +386,49 @@ g_mutex_locker_free (GMutexLocker *locker) g_mutex_unlock ((GMutex *) locker); } +/** + * G_MUTEX_AUTO_LOCK: + * @mutex: a [type@GLib.Mutex] + * @var: a variable name to be declared + * + * Declare a [type@GLib.MutexLocker] variable with `g_autoptr()` and lock the + * mutex. The mutex will be unlocked automatically when leaving the scope. The + * variable is declared with `G_GNUC_UNUSED` to avoid compiler warning if it is + * not used in the scope. + * + * This feature is only supported on GCC and clang. This macro is not defined on + * other compilers and should not be used in programs that are intended to be + * portable to those compilers. + * + * Note that this should be used in a place where it is allowed to declare a + * variable, which could be before any statement in the case + * `-Wdeclaration-after-statement` is used, or C standard prior to C99. + * + * ```c + * { + * G_MUTEX_AUTO_LOCK (&obj->mutex, locker); + * + * obj->stuff_with_lock (); + * if (condition) + * { + * // No need to unlock + * return; + * } + * + * // Unlock before end of scope + * g_clear_pointer (&locker, g_mutex_locker_free); + * obj->stuff_without_lock (); + * } + * ``` + * + * Since: 2.80.0 + */ +#ifdef g_autoptr +#define G_MUTEX_AUTO_LOCK(mutex, var) \ + GLIB_AVAILABLE_MACRO_IN_2_80 g_autoptr (GMutexLocker) \ + G_GNUC_UNUSED var = g_mutex_locker_new (mutex) +#endif /* g_autoptr */ + /** * GRecMutexLocker: * @@ -389,7 +465,7 @@ typedef void GRecMutexLocker; * * // Code with rec_mutex locked here * - * if (cond) + * if (condition) * // No need to unlock * return; * @@ -400,6 +476,10 @@ typedef void GRecMutexLocker; * } * ]| * + * Note that it is common for the declared variable to not be used in the scope, + * which causes some compilers to warn. That can be avoided by using + * `G_GNUC_UNUSED` or, since 2.80, [func@GLib.REC_MUTEX_AUTO_LOCK]. + * * Returns: a #GRecMutexLocker * Since: 2.60 */ @@ -432,6 +512,49 @@ g_rec_mutex_locker_free (GRecMutexLocker *locker) } G_GNUC_END_IGNORE_DEPRECATIONS +/** + * G_REC_MUTEX_AUTO_LOCK: + * @mutex: a [type@GLib.RecMutex] + * @var: a variable name to be declared + * + * Declare a [type@GLib.RecMutexLocker] variable with `g_autoptr()` and lock the + * mutex. The mutex will be unlocked automatically when leaving the scope. The + * variable is declared with `G_GNUC_UNUSED` to avoid compiler warning if it is + * not used in the scope. + * + * This feature is only supported on GCC and clang. This macro is not defined on + * other compilers and should not be used in programs that are intended to be + * portable to those compilers. + * + * Note that this should be used in a place where it is allowed to declare a + * variable, which could be before any statement in the case + * `-Wdeclaration-after-statement` is used, or C standard prior to C99. + * + * ```c + * { + * G_REC_MUTEX_AUTO_LOCK (&obj->rec_mutex, locker); + * + * obj->stuff_with_lock (); + * if (condition) + * { + * // No need to unlock + * return; + * } + * + * // Unlock before end of scope + * g_clear_pointer (&locker, g_rec_mutex_locker_free); + * obj->stuff_without_lock (); + * } + * ``` + * + * Since: 2.80.0 + */ +#ifdef g_autoptr +#define G_REC_MUTEX_AUTO_LOCK(mutex, var) \ + GLIB_AVAILABLE_MACRO_IN_2_80 g_autoptr (GRecMutexLocker) \ + G_GNUC_UNUSED var = g_rec_mutex_locker_new (mutex) +#endif /* g_autoptr */ + /** * GRWLockWriterLocker: * @@ -495,7 +618,7 @@ typedef void GRWLockWriterLocker; * if (self->array == NULL) * self->array = g_ptr_array_new (); * - * if (cond) + * if (condition) * // No need to unlock * return; * @@ -510,6 +633,10 @@ typedef void GRWLockWriterLocker; * } * ]| * + * Note that it is common for the declared variable to not be used in the scope, + * which causes some compilers to warn. That can be avoided by using + * `G_GNUC_UNUSED` or, since 2.80, [func@GLib.RW_LOCK_WRITER_AUTO_LOCK]. + * * Returns: a #GRWLockWriterLocker * Since: 2.62 */ @@ -543,6 +670,49 @@ g_rw_lock_writer_locker_free (GRWLockWriterLocker *locker) } G_GNUC_END_IGNORE_DEPRECATIONS +/** + * G_RW_LOCK_WRITER_AUTO_LOCK: + * @mutex: a [type@GLib.RWLock] + * @var: a variable name to be declared + * + * Declare a [type@GLib.RWLockWriterLocker] variable with `g_autoptr()` and lock + * for writing. The mutex will be unlocked automatically when leaving the scope. + * The variable is declared with `G_GNUC_UNUSED` to avoid compiler warning if it + * is not used in the scope. + * + * This feature is only supported on GCC and clang. This macro is not defined on + * other compilers and should not be used in programs that are intended to be + * portable to those compilers. + * + * Note that this should be used in a place where it is allowed to declare a + * variable, which could be before any statement in the case + * `-Wdeclaration-after-statement` is used, or C standard prior to C99. + * + * ```c + * { + * G_RW_LOCK_WRITER_AUTO_LOCK (&obj->rw_lock, locker); + * + * obj->stuff_with_lock (); + * if (condition) + * { + * // No need to unlock + * return; + * } + * + * // Unlock before end of scope + * g_clear_pointer (&locker, g_rw_lock_writer_locker_free); + * obj->stuff_without_lock (); + * } + * ``` + * + * Since: 2.80.0 + */ +#ifdef g_autoptr +#define G_RW_LOCK_WRITER_AUTO_LOCK(mutex, var) \ + GLIB_AVAILABLE_MACRO_IN_2_80 g_autoptr (GRWLockWriterLocker) \ + G_GNUC_UNUSED var = g_rw_lock_writer_locker_new (mutex) +#endif /* g_autoptr */ + /** * GRWLockReaderLocker: * @@ -598,6 +768,49 @@ g_rw_lock_reader_locker_free (GRWLockReaderLocker *locker) } G_GNUC_END_IGNORE_DEPRECATIONS +/** + * G_RW_LOCK_READER_AUTO_LOCK: + * @mutex: a [type@GLib.RWLock] + * @var: a variable name to be declared + * + * Declare a [type@GLib.RWLockReaderLocker] variable with `g_autoptr()` and lock + * for reading. The mutex will be unlocked automatically when leaving the scope. + * The variable is declared with `G_GNUC_UNUSED` to avoid compiler warning if it + * is not used in the scope. + * + * This feature is only supported on GCC and clang. This macro is not defined on + * other compilers and should not be used in programs that are intended to be + * portable to those compilers. + * + * Note that this should be used in a place where it is allowed to declare a + * variable, which could be before any statement in the case + * `-Wdeclaration-after-statement` is used, or C standard prior to C99. + * + * ```c + * { + * G_RW_LOCK_READER_AUTO_LOCK (&obj->rw_lock, locker); + * + * obj->stuff_with_lock (); + * if (condition) + * { + * // No need to unlock + * return; + * } + * + * // Unlock before end of scope + * g_clear_pointer (&locker, g_rw_lock_reader_locker_free); + * obj->stuff_without_lock (); + * } + * ``` + * + * Since: 2.80.0 + */ +#ifdef g_autoptr +#define G_RW_LOCK_READER_AUTO_LOCK(mutex, var) \ + GLIB_AVAILABLE_MACRO_IN_2_80 g_autoptr (GRWLockReaderLocker) \ + G_GNUC_UNUSED var = g_rw_lock_reader_locker_new (mutex) +#endif /* g_autoptr */ + G_END_DECLS #endif /* __G_THREAD_H__ */ diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c index c18de89..6ca051e 100644 --- a/glib/gthreadpool.c +++ b/glib/gthreadpool.c @@ -37,43 +37,6 @@ #include "gtimer.h" #include "gutils.h" -/** - * SECTION:thread_pools - * @title: Thread Pools - * @short_description: pools of threads to execute work concurrently - * @see_also: #GThread - * - * Sometimes you wish to asynchronously fork out the execution of work - * and continue working in your own thread. If that will happen often, - * the overhead of starting and destroying a thread each time might be - * too high. In such cases reusing already started threads seems like a - * good idea. And it indeed is, but implementing this can be tedious - * and error-prone. - * - * Therefore GLib provides thread pools for your convenience. An added - * advantage is, that the threads can be shared between the different - * subsystems of your program, when they are using GLib. - * - * To create a new thread pool, you use g_thread_pool_new(). - * It is destroyed by g_thread_pool_free(). - * - * If you want to execute a certain task within a thread pool, - * you call g_thread_pool_push(). - * - * To get the current number of running threads you call - * g_thread_pool_get_num_threads(). To get the number of still - * unprocessed tasks you call g_thread_pool_unprocessed(). To control - * the maximal number of threads for a thread pool, you use - * g_thread_pool_get_max_threads() and g_thread_pool_set_max_threads(). - * - * Finally you can control the number of unused threads, that are kept - * alive by GLib for future use. The current number can be fetched with - * g_thread_pool_get_num_unused_threads(). The maximal number can be - * controlled by g_thread_pool_get_max_unused_threads() and - * g_thread_pool_set_max_unused_threads(). All currently unused threads - * can be stopped by calling g_thread_pool_stop_unused_threads(). - */ - #define DEBUG_MSG(x) /* #define DEBUG_MSG(args) g_printerr args ; g_printerr ("\n"); */ @@ -85,9 +48,32 @@ typedef struct _GRealThreadPool GRealThreadPool; * @user_data: the user data for the threads of this pool * @exclusive: are all threads exclusive to this pool * - * The #GThreadPool struct represents a thread pool. It has three - * public read-only members, but the underlying struct is bigger, - * so you must not copy this struct. + * The `GThreadPool` struct represents a thread pool. + * + * A thread pool is useful when you wish to asynchronously fork out the execution of work + * and continue working in your own thread. If that will happen often, the overhead of starting + * and destroying a thread each time might be too high. In such cases reusing already started + * threads seems like a good idea. And it indeed is, but implementing this can be tedious + * and error-prone. + * + * Therefore GLib provides thread pools for your convenience. An added advantage is, that the + * threads can be shared between the different subsystems of your program, when they are using GLib. + * + * To create a new thread pool, you use [func@GLib.ThreadPool.new]. + * It is destroyed by [method@GLib.ThreadPool.free]. + * + * If you want to execute a certain task within a thread pool, use [method@GLib.ThreadPool.push]. + * + * To get the current number of running threads you call [method@GLib.ThreadPool.get_num_threads]. + * To get the number of still unprocessed tasks you call [method@GLib.ThreadPool.unprocessed]. + * To control the maximum number of threads for a thread pool, you use + * [method@GLib.ThreadPool.get_max_threads]. and [method@GLib.ThreadPool.set_max_threads]. + * + * Finally you can control the number of unused threads, that are kept alive by GLib for future use. + * The current number can be fetched with [func@GLib.ThreadPool.get_num_unused_threads]. + * The maximum number can be controlled by [func@GLib.ThreadPool.get_max_unused_threads] and + * [func@GLib.ThreadPool.set_max_unused_threads]. All currently unused threads + * can be stopped by calling [func@GLib.ThreadPool.stop_unused_threads]. */ struct _GRealThreadPool { diff --git a/glib/gtimer.c b/glib/gtimer.c index dde502a..be6d829 100644 --- a/glib/gtimer.c +++ b/glib/gtimer.c @@ -56,22 +56,15 @@ #include "gtestutils.h" #include "gmain.h" -/** - * SECTION:timers - * @title: Timers - * @short_description: keep track of elapsed time - * - * #GTimer records a start time, and counts microseconds elapsed since - * that time. This is done somewhat differently on different platforms, - * and can be tricky to get exactly right, so #GTimer provides a - * portable/convenient interface. - **/ - /** * GTimer: * - * Opaque datatype that records a start time. - **/ + * `GTimer` records a start time, and counts microseconds elapsed since + * that time. + * + * This is done somewhat differently on different platforms, and can be + * tricky to get exactly right, so `GTimer` provides a portable/convenient interface. + */ struct _GTimer { guint64 start; @@ -81,12 +74,12 @@ struct _GTimer }; /** - * g_timer_new: + * g_timer_new: (constructor) * * Creates a new timer, and starts timing (i.e. g_timer_start() is * implicitly called for you). * - * Returns: a new #GTimer. + * Returns: (transfer full): a new #GTimer. **/ GTimer* g_timer_new (void) diff --git a/glib/gtimezone.c b/glib/gtimezone.c index 4a4a2d0..0c3cae3 100644 --- a/glib/gtimezone.c +++ b/glib/gtimezone.c @@ -53,25 +53,23 @@ #endif /** - * SECTION:timezone - * @title: GTimeZone - * @short_description: a structure representing a time zone - * @see_also: #GDateTime + * GTimeZone: * - * #GTimeZone is a structure that represents a time zone, at no - * particular point in time. It is refcounted and immutable. + * A `GTimeZone` represents a time zone, at no particular point in time. + * + * The `GTimeZone` struct is refcounted and immutable. * * Each time zone has an identifier (for example, ‘Europe/London’) which is - * platform dependent. See g_time_zone_new() for information on the identifier - * formats. The identifier of a time zone can be retrieved using - * g_time_zone_get_identifier(). + * platform dependent. See [ctor@GLib.TimeZone.new] for information on the + * identifier formats. The identifier of a time zone can be retrieved using + * [method@GLib.TimeZone.get_identifier]. * - * A time zone contains a number of intervals. Each interval has - * an abbreviation to describe it (for example, ‘PDT’), an offset to UTC and a - * flag indicating if the daylight savings time is in effect during that - * interval. A time zone always has at least one interval — interval 0. Note - * that interval abbreviations are not the same as time zone identifiers - * (apart from ‘UTC’), and cannot be passed to g_time_zone_new(). + * A time zone contains a number of intervals. Each interval has an abbreviation + * to describe it (for example, ‘PDT’), an offset to UTC and a flag indicating + * if the daylight savings time is in effect during that interval. A time zone + * always has at least one interval — interval 0. Note that interval abbreviations + * are not the same as time zone identifiers (apart from ‘UTC’), and cannot be + * passed to [ctor@GLib.TimeZone.new]. * * Every UTC time is contained within exactly one interval, but a given * local time may be contained within zero, one or two intervals (due to @@ -84,17 +82,8 @@ * that some properties (like the abbreviation) change between intervals * without other properties changing. * - * #GTimeZone is available since GLib 2.26. - */ - -/** - * GTimeZone: - * - * #GTimeZone is an opaque structure whose members cannot be accessed - * directly. - * * Since: 2.26 - **/ + */ /* IANA zoneinfo file format {{{1 */ @@ -103,6 +92,8 @@ typedef struct { gchar bytes[8]; } gint64_be; typedef struct { gchar bytes[4]; } gint32_be; typedef struct { gchar bytes[4]; } guint32_be; +#ifdef G_OS_UNIX + static inline gint64 gint64_from_be (const gint64_be be) { gint64 tmp; memcpy (&tmp, &be, sizeof tmp); return GINT64_FROM_BE (tmp); } @@ -115,6 +106,8 @@ static inline guint32 guint32_from_be (const guint32_be be) { guint32 tmp; memcpy (&tmp, &be, sizeof tmp); return GUINT32_FROM_BE (tmp); } +#endif + /* The layout of an IANA timezone file header */ struct tzhead { diff --git a/glib/gtrace.c b/glib/gtrace.c index 0ca1bb4..b59ee7d 100644 --- a/glib/gtrace.c +++ b/glib/gtrace.c @@ -20,10 +20,6 @@ */ /* - * SECTION:trace - * @Title: Performance tracing - * @Short_description: Functions for measuring and tracing performance - * * The performance tracing functions allow for the performance of code using * GLib to be measured by passing metrics from the current process to an * external measurement process such as `sysprof-cli` or `sysprofd`. diff --git a/glib/gtrashstack.c b/glib/gtrashstack.c index f734e24..3d94cc6 100644 --- a/glib/gtrashstack.c +++ b/glib/gtrashstack.c @@ -33,35 +33,27 @@ #include "gtrashstack.h" -/** - * SECTION:trash_stack - * @title: Trash Stacks - * @short_description: maintain a stack of unused allocated memory chunks - * - * A #GTrashStack is an efficient way to keep a stack of unused allocated - * memory chunks. Each memory chunk is required to be large enough to hold - * a #gpointer. This allows the stack to be maintained without any space - * overhead, since the stack pointers can be stored inside the memory chunks. - * - * There is no function to create a #GTrashStack. A %NULL #GTrashStack* - * is a perfectly valid empty stack. - * - * There is no longer any good reason to use #GTrashStack. If you have - * extra pieces of memory, free() them and allocate them again later. - * - * Deprecated: 2.48: #GTrashStack is deprecated without replacement - */ - /** * GTrashStack: * @next: pointer to the previous element of the stack, * gets stored in the first `sizeof (gpointer)` * bytes of the element * - * Each piece of memory that is pushed onto the stack - * is cast to a GTrashStack*. + * A `GTrashStack` is an efficient way to keep a stack of unused allocated + * memory chunks. Each memory chunk is required to be large enough to hold + * a `gpointer`. This allows the stack to be maintained without any space + * overhead, since the stack pointers can be stored inside the memory chunks. * - * Deprecated: 2.48: #GTrashStack is deprecated without replacement + * There is no function to create a `GTrashStack`. A `NULL` `GTrashStack*` + * is a perfectly valid empty stack. + * + * Each piece of memory that is pushed onto the stack is cast to a + * `GTrashStack*`. + * + * There is no longer any good reason to use `GTrashStack`. If you have + * extra pieces of memory, `free()` them and allocate them again later. + * + * Deprecated: 2.48: `GTrashStack` is deprecated without replacement */ /** diff --git a/glib/gtree.c b/glib/gtree.c index bfae639..b8d3877 100644 --- a/glib/gtree.c +++ b/glib/gtree.c @@ -36,38 +36,6 @@ #include "gtestutils.h" #include "gslice.h" -/** - * SECTION:trees-binary - * @title: Balanced Binary Trees - * @short_description: a sorted collection of key/value pairs optimized - * for searching and traversing in order - * - * The #GTree structure and its associated functions provide a sorted - * collection of key/value pairs optimized for searching and traversing - * in order. This means that most of the operations (access, search, - * insertion, deletion, ...) on #GTree are O(log(n)) in average and O(n) - * in worst case for time complexity. But, note that maintaining a - * balanced sorted #GTree of n elements is done in time O(n log(n)). - * - * To create a new #GTree use g_tree_new(). - * - * To insert a key/value pair into a #GTree use g_tree_insert() - * (O(n log(n))). - * - * To remove a key/value pair use g_tree_remove() (O(n log(n))). - * - * To look up the value corresponding to a given key, use - * g_tree_lookup() and g_tree_lookup_extended(). - * - * To find out the number of nodes in a #GTree, use g_tree_nnodes(). To - * get the height of a #GTree, use g_tree_height(). - * - * To traverse a #GTree, calling a function for each node visited in - * the traversal, use g_tree_foreach(). - * - * To destroy a #GTree, use g_tree_destroy(). - **/ - #define MAX_GTREE_HEIGHT 40 /* G_MAXUINT nodes will be covered by tree height of log2(G_MAXUINT) + 2. */ G_STATIC_ASSERT ((G_GUINT64_CONSTANT (1) << (MAX_GTREE_HEIGHT - 2)) >= G_MAXUINT); @@ -152,7 +120,7 @@ g_tree_node_new (gpointer key, } /** - * g_tree_new: + * g_tree_new: (constructor) * @key_compare_func: the function used to order the nodes in the #GTree. * It should return values similar to the standard strcmp() function - * 0 if the two arguments are equal, a negative value if the first argument @@ -1138,7 +1106,7 @@ g_tree_lookup_extended (GTree *tree, /** * g_tree_foreach: * @tree: a #GTree - * @func: the function to call for each node visited. + * @func: (scope call): the function to call for each node visited. * If this function returns %TRUE, the traversal is stopped. * @user_data: user data to pass to the function * @@ -1177,7 +1145,7 @@ g_tree_foreach (GTree *tree, /** * g_tree_foreach_node: * @tree: a #GTree - * @func: the function to call for each node visited. + * @func: (scope call): the function to call for each node visited. * If this function returns %TRUE, the traversal is stopped. * @user_data: user data to pass to the function * @@ -1218,7 +1186,7 @@ g_tree_foreach_node (GTree *tree, /** * g_tree_traverse: * @tree: a #GTree - * @traverse_func: the function to call for each node visited. If this + * @traverse_func: (scope call): the function to call for each node visited. If this * function returns %TRUE, the traversal is stopped. * @traverse_type: the order in which nodes are visited, one of %G_IN_ORDER, * %G_PRE_ORDER and %G_POST_ORDER @@ -1278,7 +1246,7 @@ g_tree_traverse (GTree *tree, /** * g_tree_search_node: * @tree: a #GTree - * @search_func: a function used to search the #GTree + * @search_func: (scope call): a function used to search the #GTree * @user_data: the data passed as the second argument to @search_func * * Searches a #GTree using @search_func. @@ -1312,7 +1280,7 @@ g_tree_search_node (GTree *tree, /** * g_tree_search: * @tree: a #GTree - * @search_func: a function used to search the #GTree + * @search_func: (scope call): a function used to search the #GTree * @user_data: the data passed as the second argument to @search_func * * Searches a #GTree using @search_func. diff --git a/glib/gunibreak.h b/glib/gunibreak.h index dc3151a..6a3e731 100644 --- a/glib/gunibreak.h +++ b/glib/gunibreak.h @@ -7,7 +7,7 @@ #include #include -#define G_UNICODE_DATA_VERSION "15.0.0" +#define G_UNICODE_DATA_VERSION "15.1.0" #define G_UNICODE_LAST_CHAR 0x10FFFF @@ -18,7 +18,7 @@ static const gint8 break_property_data[][256] = { { /* page 0, index 0 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -148,7 +148,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC }, { /* page 2, index 1 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -278,7 +278,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 3, index 2 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -408,7 +408,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 4, index 3 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -538,7 +538,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 5, index 4 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -668,9 +668,9 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 6, index 5 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, @@ -778,7 +778,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -798,7 +798,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 7, index 6 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -928,7 +928,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_PREFIX }, { /* page 8, index 7 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1000,7 +1000,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -1041,7 +1041,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -1058,7 +1058,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 9, index 8 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1188,7 +1188,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 10, index 9 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1318,7 +1318,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 11, index 10 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1448,7 +1448,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 12, index 11 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1578,7 +1578,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 13, index 12 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -1708,7 +1708,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 14, index 13 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, @@ -1837,7 +1837,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 15, index 14 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_NON_BREAKING_GLUE, @@ -1965,7 +1965,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 16, index 15 */ - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, @@ -2095,7 +2095,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC }, { /* page 17, index 16 */ - G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, + G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, G_UNICODE_BREAK_HANGUL_L_JAMO, @@ -2225,7 +2225,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_T_JAMO, G_UNICODE_BREAK_HANGUL_T_JAMO }, { /* page 18, index 17 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -2355,7 +2355,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 19, index 18 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -2485,7 +2485,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 20, index 19 */ - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -2615,7 +2615,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 22, index 20 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -2745,7 +2745,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 23, index 21 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -2875,7 +2875,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 24, index 22 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_EXCLAMATION, @@ -3005,7 +3005,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 25, index 23 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -3135,7 +3135,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 26, index 24 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -3265,32 +3265,25 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 27, index 25 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -3298,34 +3291,33 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_VIRAMA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, @@ -3359,32 +3351,32 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_VIRAMA_FINAL, G_UNICODE_BREAK_VIRAMA_FINAL, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -3393,7 +3385,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 28, index 26 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -3522,7 +3514,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 29, index 27 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -3652,7 +3644,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 31, index 28 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -3782,7 +3774,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN }, { /* page 32, index 29 */ - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, @@ -3901,7 +3893,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 33, index 30 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -4031,7 +4023,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 34, index 31 */ - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, @@ -4161,7 +4153,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 35, index 32 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -4291,7 +4283,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 36, index 33 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -4421,7 +4413,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC }, { /* page 37, index 34 */ - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, @@ -4551,7 +4543,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 38, index 35 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_ALPHABETIC, @@ -4681,7 +4673,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 39, index 36 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -4811,7 +4803,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 41, index 37 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -4941,7 +4933,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 43, index 38 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -5071,7 +5063,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 44, index 39 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -5201,7 +5193,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_AFTER }, { /* page 45, index 40 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -5331,7 +5323,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK }, { /* page 46, index 41 */ - G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, + G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, G_UNICODE_BREAK_QUOTATION, @@ -5455,7 +5447,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 47, index 42 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -5581,11 +5573,11 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 48, index 43 */ - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_CLOSE_PUNCTUATION, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_CLOSE_PUNCTUATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_NON_STARTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -5736,7 +5728,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 49, index 44 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -5855,7 +5847,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER, @@ -5874,7 +5866,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_CONDITIONAL_JAPANESE_STARTER }, { /* page 50, index 45 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -6004,7 +5996,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 77, index 46 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -6134,7 +6126,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 160, index 47 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -6264,7 +6256,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 164, index 48 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -6394,7 +6386,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER }, { /* page 166, index 49 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -6523,7 +6515,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 167, index 50 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -6653,7 +6645,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 168, index 51 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, @@ -6782,7 +6774,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 169, index 52 */ - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, @@ -6847,52 +6839,45 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_VIRAMA, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, @@ -6911,27 +6896,27 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN }, { /* page 170, index 53 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -6942,96 +6927,94 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -7041,7 +7024,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 171, index 54 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, @@ -7171,7 +7154,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 172, index 55 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7301,7 +7284,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 173, index 56 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7431,7 +7414,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 174, index 57 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7561,7 +7544,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 175, index 58 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7691,7 +7674,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 176, index 59 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7821,7 +7804,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 177, index 60 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -7951,7 +7934,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 178, index 61 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8081,7 +8064,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 179, index 62 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8211,7 +8194,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 180, index 63 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8341,7 +8324,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 181, index 64 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8471,7 +8454,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 182, index 65 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8601,7 +8584,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 183, index 66 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8731,7 +8714,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 184, index 67 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8861,7 +8844,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 185, index 68 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -8991,7 +8974,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 186, index 69 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9121,7 +9104,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 187, index 70 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9251,7 +9234,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 188, index 71 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9381,7 +9364,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 189, index 72 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9511,7 +9494,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 190, index 73 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9641,7 +9624,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 191, index 74 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9771,7 +9754,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 192, index 75 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -9901,7 +9884,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 193, index 76 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10031,7 +10014,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 194, index 77 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10161,7 +10144,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 195, index 78 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10291,7 +10274,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 196, index 79 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10421,7 +10404,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 197, index 80 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10551,7 +10534,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 198, index 81 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10681,7 +10664,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 199, index 82 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10811,7 +10794,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 200, index 83 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -10941,7 +10924,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 201, index 84 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11071,7 +11054,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 202, index 85 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11201,7 +11184,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 203, index 86 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11331,7 +11314,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 204, index 87 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11461,7 +11444,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 205, index 88 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11591,7 +11574,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 206, index 89 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11721,7 +11704,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 207, index 90 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11851,7 +11834,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 208, index 91 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -11981,7 +11964,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 209, index 92 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12111,7 +12094,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 210, index 93 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12241,7 +12224,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 211, index 94 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12371,7 +12354,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 212, index 95 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12501,7 +12484,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 213, index 96 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12631,7 +12614,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 214, index 97 */ - G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LV_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12761,7 +12744,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE }, { /* page 215, index 98 */ - G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, + G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE, @@ -12891,7 +12874,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 251, index 99 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, @@ -13021,7 +13004,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 253, index 100 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -13151,7 +13134,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 254, index 101 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -13281,7 +13264,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_WORD_JOINER }, { /* page 255, index 102 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_EXCLAMATION, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_PREFIX, G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -13416,7 +13399,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 256, index 103 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -13546,7 +13529,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 257, index 104 */ - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -13676,7 +13659,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 258, index 105 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -13806,7 +13789,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 259, index 106 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -13936,7 +13919,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 260, index 107 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14066,7 +14049,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 261, index 108 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14196,7 +14179,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 263, index 109 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14326,7 +14309,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 264, index 110 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -14456,7 +14439,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 265, index 111 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14586,7 +14569,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 266, index 112 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, @@ -14714,7 +14697,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 267, index 113 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14843,7 +14826,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 268, index 114 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -14973,7 +14956,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 269, index 115 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15103,7 +15086,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 270, index 116 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -15233,7 +15216,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK }, { /* page 271, index 117 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15363,34 +15346,26 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 272, index 118 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AKSARA_PRE_BASE, + G_UNICODE_BREAK_AKSARA_PRE_BASE, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -15398,35 +15373,34 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_VIRAMA, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15457,7 +15431,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -15465,7 +15439,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15493,7 +15467,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 273, index 119 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15621,7 +15595,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 274, index 120 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -15750,37 +15724,28 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 275, index 121 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -15788,17 +15753,17 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_VIRAMA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -15880,7 +15845,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 276, index 122 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -16009,7 +15974,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 277, index 123 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -16137,7 +16102,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 278, index 124 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -16265,7 +16230,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 279, index 125 */ - G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, + G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, G_UNICODE_BREAK_COMPLEX_CONTEXT, @@ -16395,7 +16360,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 280, index 126 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -16525,30 +16490,22 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC }, { /* page 281, index 127 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -16556,20 +16513,20 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_VIRAMA, G_UNICODE_BREAK_AKSARA_PRE_BASE, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AKSARA_PRE_BASE, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -16655,7 +16612,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 282, index 128 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -16783,7 +16740,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 283, index 129 */ - G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, + G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_BEFORE, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -16911,7 +16868,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 284, index 130 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -17040,7 +16997,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 285, index 131 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, @@ -17170,7 +17127,6 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 286, index 132 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -17282,50 +17238,43 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, + G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN + G_UNICODE_BREAK_UNKNOWN }, { /* page 287, index 133 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA_PRE_BASE, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_AKSARA, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -17333,18 +17282,18 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_AFTER, - G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_VIRAMA, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_AFTER, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, - G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_AKSARA_START, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -17387,50 +17336,49 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_POSTFIX, - G_UNICODE_BREAK_POSTFIX, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_AFTER }, { /* page 291, index 134 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -17560,7 +17508,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 292, index 135 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -17689,7 +17637,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 293, index 136 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -17819,7 +17767,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 303, index 137 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -17949,7 +17897,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 306, index 138 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18079,7 +18027,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 307, index 139 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18209,7 +18157,6 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 308, index 140 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18233,6 +18180,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_OPEN_PUNCTUATION, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, G_UNICODE_BREAK_NON_BREAKING_GLUE, @@ -18339,7 +18287,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 325, index 141 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18469,7 +18417,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 326, index 142 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18599,7 +18547,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 362, index 143 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18728,7 +18676,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 363, index 144 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -18858,7 +18806,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 366, index 145 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -18988,7 +18936,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN }, { /* page 367, index 146 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -19118,7 +19066,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 391, index 147 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -19248,7 +19196,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 396, index 148 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -19378,7 +19326,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 397, index 149 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -19508,7 +19456,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 431, index 150 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -19638,7 +19586,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN }, { /* page 433, index 151 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -19771,7 +19719,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 434, index 152 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -19901,7 +19849,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 444, index 153 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20031,7 +19979,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 463, index 154 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -20161,7 +20109,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 464, index 155 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20291,7 +20239,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 465, index 156 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20421,7 +20369,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 466, index 157 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20551,7 +20499,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 467, index 158 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20681,7 +20629,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 468, index 159 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -20811,7 +20759,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 469, index 160 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, @@ -20941,7 +20889,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 470, index 161 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -21071,7 +21019,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC }, { /* page 471, index 162 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -21201,7 +21149,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_NUMERIC, G_UNICODE_BREAK_NUMERIC }, { /* page 474, index 163 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, @@ -21330,7 +21278,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 479, index 164 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -21460,7 +21408,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 480, index 165 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, @@ -21590,7 +21538,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 481, index 166 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -21720,7 +21668,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 482, index 167 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -21850,7 +21798,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_PREFIX }, { /* page 484, index 168 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -21980,7 +21928,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 487, index 169 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -22110,7 +22058,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN }, { /* page 488, index 170 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -22240,7 +22188,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 489, index 171 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -22370,7 +22318,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 492, index 172 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -22500,7 +22448,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 493, index 173 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -22630,7 +22578,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 494, index 174 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -22760,7 +22708,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 497, index 175 */ - G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, + G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, G_UNICODE_BREAK_AMBIGUOUS, @@ -22890,7 +22838,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_REGIONAL_INDICATOR }, { /* page 499, index 176 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -23020,7 +22968,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_EMOJI_MODIFIER, G_UNICODE_BREAK_EMOJI_MODIFIER }, { /* page 500, index 177 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -23150,7 +23098,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 501, index 178 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -23280,7 +23228,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 502, index 179 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -23410,7 +23358,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 503, index 180 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -23540,7 +23488,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 504, index 181 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -23670,7 +23618,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 505, index 182 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -23800,7 +23748,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 506, index 183 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -23930,7 +23878,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC }, { /* page 507, index 184 */ - G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, + G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, G_UNICODE_BREAK_ALPHABETIC, @@ -24060,7 +24008,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 511, index 185 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -24190,7 +24138,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 767, index 186 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -24320,7 +24268,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 1023, index 187 */ - G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, + G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, G_UNICODE_BREAK_IDEOGRAPHIC, @@ -24450,7 +24398,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 3584, index 188 */ - G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN, @@ -24580,7 +24528,7 @@ static const gint8 break_property_data[][256] = { G_UNICODE_BREAK_UNKNOWN, G_UNICODE_BREAK_UNKNOWN }, { /* page 3585, index 189 */ - G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, + G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, G_UNICODE_BREAK_COMBINING_MARK, diff --git a/glib/gunichartables.h b/glib/gunichartables.h index dde72ad..8beeab0 100644 --- a/glib/gunichartables.h +++ b/glib/gunichartables.h @@ -4,7 +4,7 @@ #ifndef CHARTABLES_H #define CHARTABLES_H -#define G_UNICODE_DATA_VERSION "15.0.0" +#define G_UNICODE_DATA_VERSION "15.1.0" #define G_UNICODE_LAST_CHAR 0x10ffff @@ -16,7 +16,7 @@ static const char type_data[][256] = { { /* page 0, index 0 */ - G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, + G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, G_UNICODE_CONTROL, @@ -134,7 +134,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 1, index 1 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -264,7 +264,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 2, index 2 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -394,7 +394,7 @@ static const char type_data[][256] = { G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL }, { /* page 3, index 3 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -522,7 +522,7 @@ static const char type_data[][256] = { G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER }, { /* page 4, index 4 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, @@ -652,7 +652,7 @@ static const char type_data[][256] = { G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 5, index 5 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -772,7 +772,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 6, index 6 */ - G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, + G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_FORMAT, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -877,7 +877,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 7, index 7 */ - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -978,7 +978,7 @@ static const char type_data[][256] = { G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_CURRENCY_SYMBOL }, { /* page 8, index 8 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1084,7 +1084,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK }, { /* page 9, index 9 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1183,7 +1183,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED }, { /* page 10, index 10 */ - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1279,7 +1279,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK }, { /* page 11, index 11 */ - G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1372,7 +1372,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 12, index 12 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1468,7 +1468,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 13, index 13 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1561,7 +1561,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 14, index 14 */ - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1659,7 +1659,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 15, index 15 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -1768,7 +1768,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 16, index 16 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1882,7 +1882,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 18, index 17 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -1970,7 +1970,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 19, index 18 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2075,7 +2075,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 20, index 19 */ - G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_LETTER, + G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2163,7 +2163,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 22, index 20 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2253,7 +2253,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 23, index 21 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2349,7 +2349,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 24, index 22 */ - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_DASH_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -2441,7 +2441,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 25, index 23 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2534,7 +2534,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL }, { /* page 26, index 24 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2639,7 +2639,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 27, index 25 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2741,7 +2741,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION }, { /* page 28, index 26 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -2852,7 +2852,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 29, index 27 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -2982,7 +2982,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK }, { /* page 30, index 28 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -3112,7 +3112,7 @@ static const char type_data[][256] = { G_UNICODE_UPPERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER }, { /* page 31, index 29 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -3238,7 +3238,7 @@ static const char type_data[][256] = { G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_UNASSIGNED }, { /* page 32, index 30 */ - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, G_UNICODE_SPACE_SEPARATOR, @@ -3353,7 +3353,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 33, index 31 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_OTHER_SYMBOL, @@ -3457,7 +3457,7 @@ static const char type_data[][256] = { G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL }, { /* page 35, index 32 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OPEN_PUNCTUATION, G_UNICODE_CLOSE_PUNCTUATION, @@ -3546,7 +3546,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL }, { /* page 36, index 33 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -3634,7 +3634,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_NUMBER }, { /* page 37, index 34 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -3722,7 +3722,7 @@ static const char type_data[][256] = { G_UNICODE_MATH_SYMBOL }, { /* page 38, index 35 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -3810,7 +3810,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL }, { /* page 39, index 36 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -3903,7 +3903,7 @@ static const char type_data[][256] = { G_UNICODE_MATH_SYMBOL }, { /* page 41, index 37 */ - G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, + G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, G_UNICODE_MATH_SYMBOL, @@ -3996,7 +3996,7 @@ static const char type_data[][256] = { G_UNICODE_MATH_SYMBOL }, { /* page 43, index 38 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -4084,7 +4084,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL }, { /* page 44, index 39 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, @@ -4213,7 +4213,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_PUNCTUATION }, { /* page 45, index 40 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -4313,7 +4313,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK }, { /* page 46, index 41 */ - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_INITIAL_PUNCTUATION, G_UNICODE_FINAL_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -4416,7 +4416,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 47, index 42 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -4500,11 +4500,11 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL }, { /* page 48, index 43 */ - G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_SPACE_SEPARATOR, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_SYMBOL, G_UNICODE_MODIFIER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_LETTER_NUMBER, @@ -4604,7 +4604,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 49, index 44 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -4683,7 +4683,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -4692,7 +4692,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 50, index 45 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -4780,7 +4780,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL }, { /* page 77, index 46 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -4868,7 +4868,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL }, { /* page 160, index 47 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -4956,7 +4956,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 164, index 48 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5045,7 +5045,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION }, { /* page 166, index 49 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5154,7 +5154,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 167, index 50 */ - G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, + G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, G_UNICODE_MODIFIER_SYMBOL, @@ -5278,7 +5278,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 168, index 51 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, @@ -5375,7 +5375,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK }, { /* page 169, index 52 */ - G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, + G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, G_UNICODE_DECIMAL_NUMBER, @@ -5478,7 +5478,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 170, index 53 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5577,7 +5577,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 171, index 54 */ - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5691,7 +5691,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 215, index 55 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5779,7 +5779,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 250, index 56 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -5867,7 +5867,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 251, index 57 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -5960,7 +5960,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 253, index 58 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -6049,7 +6049,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL }, { /* page 254, index 59 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -6153,7 +6153,7 @@ static const char type_data[][256] = { G_UNICODE_FORMAT }, { /* page 255, index 60 */ - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_CURRENCY_SYMBOL, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -6260,7 +6260,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 256, index 61 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -6348,7 +6348,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 257, index 62 */ - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, @@ -6444,7 +6444,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 258, index 63 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -6532,7 +6532,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 259, index 64 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -6622,7 +6622,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 260, index 65 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, @@ -6736,7 +6736,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 261, index 66 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -6837,7 +6837,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 263, index 67 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -6934,7 +6934,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 264, index 68 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7022,7 +7022,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER }, { /* page 265, index 69 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7110,7 +7110,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER }, { /* page 266, index 70 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -7203,7 +7203,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 267, index 71 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7293,7 +7293,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 268, index 72 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7398,7 +7398,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_NUMBER }, { /* page 269, index 73 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7488,7 +7488,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 270, index 74 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -7576,7 +7576,7 @@ static const char type_data[][256] = { G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK }, { /* page 271, index 75 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7668,7 +7668,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 272, index 76 */ - G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7766,7 +7766,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 273, index 77 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7867,7 +7867,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 274, index 78 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -7962,7 +7962,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 275, index 79 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_SPACING_MARK, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8053,7 +8053,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 276, index 80 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8151,7 +8151,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 277, index 81 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -8245,7 +8245,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 278, index 82 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8343,7 +8343,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 279, index 83 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8435,7 +8435,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 280, index 84 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8537,7 +8537,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER }, { /* page 281, index 85 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -8629,7 +8629,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 282, index 86 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_OTHER_LETTER, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -8728,7 +8728,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 283, index 87 */ - G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, + G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, G_UNICODE_OTHER_PUNCTUATION, @@ -8817,7 +8817,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 284, index 88 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -8916,7 +8916,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 285, index 89 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, @@ -9009,7 +9009,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 286, index 90 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -9098,7 +9098,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 287, index 91 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_SPACING_MARK, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9192,7 +9192,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_PUNCTUATION }, { /* page 291, index 92 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9280,7 +9280,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 292, index 93 */ - G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, + G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, G_UNICODE_LETTER_NUMBER, @@ -9387,7 +9387,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, { /* page 293, index 94 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9475,7 +9475,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 303, index 95 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -9563,7 +9563,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 308, index 96 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9652,7 +9652,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 326, index 97 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9740,7 +9740,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 362, index 98 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9832,7 +9832,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 363, index 99 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -9924,7 +9924,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 366, index 100 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -10023,7 +10023,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 367, index 101 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10114,7 +10114,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 391, index 102 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10202,7 +10202,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 396, index 103 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10290,7 +10290,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 397, index 104 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -10378,7 +10378,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 431, index 105 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -10468,7 +10468,7 @@ static const char type_data[][256] = { G_UNICODE_MODIFIER_LETTER, G_UNICODE_UNASSIGNED }, { /* page 433, index 106 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10556,7 +10556,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 434, index 107 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10644,7 +10644,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 444, index 108 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -10732,7 +10732,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 463, index 109 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -10831,7 +10831,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 464, index 110 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -10919,7 +10919,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 465, index 111 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -11011,7 +11011,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 466, index 112 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -11099,7 +11099,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 467, index 113 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -11187,7 +11187,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 468, index 114 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, @@ -11316,7 +11316,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 469, index 115 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UPPERCASE_LETTER, @@ -11445,7 +11445,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 470, index 116 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -11575,7 +11575,7 @@ static const char type_data[][256] = { G_UNICODE_LOWERCASE_LETTER }, { /* page 471, index 117 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -11705,7 +11705,7 @@ static const char type_data[][256] = { G_UNICODE_DECIMAL_NUMBER }, { /* page 474, index 118 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -11816,7 +11816,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 479, index 119 */ - G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, + G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, G_UNICODE_LOWERCASE_LETTER, @@ -11910,7 +11910,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 480, index 120 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_UNASSIGNED, @@ -12014,7 +12014,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 481, index 121 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -12105,7 +12105,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 482, index 122 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -12195,7 +12195,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_CURRENCY_SYMBOL }, { /* page 484, index 123 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -12285,7 +12285,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 487, index 124 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -12373,7 +12373,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 488, index 125 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -12462,7 +12462,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 489, index 126 */ - G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, + G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, G_UNICODE_UPPERCASE_LETTER, @@ -12564,7 +12564,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 492, index 127 */ - G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -12652,7 +12652,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 493, index 128 */ - G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, @@ -12740,7 +12740,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 494, index 129 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -12828,7 +12828,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 496, index 130 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -12916,7 +12916,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 497, index 131 */ - G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, + G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, G_UNICODE_OTHER_NUMBER, @@ -13004,7 +13004,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_SYMBOL }, { /* page 498, index 132 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -13092,7 +13092,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 499, index 133 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13181,7 +13181,7 @@ static const char type_data[][256] = { G_UNICODE_MODIFIER_SYMBOL }, { /* page 502, index 134 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13269,7 +13269,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 503, index 135 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13357,7 +13357,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 504, index 136 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13445,7 +13445,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 506, index 137 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13533,7 +13533,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 507, index 138 */ - G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, + G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, G_UNICODE_OTHER_SYMBOL, @@ -13622,7 +13622,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, { /* page 678, index 139 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -13710,7 +13710,7 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED }, { /* page 695, index 140 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -13798,7 +13798,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 696, index 141 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -13886,7 +13886,7 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 718, index 142 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -13974,7 +13974,6 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER }, { /* page 747, index 143 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -14049,6 +14048,95 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER + }, + { /* page 750, index 144 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + G_UNICODE_OTHER_LETTER, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, + G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -14061,8 +14149,8 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 762, index 144 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + { /* page 762, index 145 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -14149,8 +14237,8 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 787, index 145 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + { /* page 787, index 146 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -14237,8 +14325,8 @@ static const char type_data[][256] = { G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER }, - { /* page 803, index 146 */ - G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, + { /* page 803, index 147 */ + G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, G_UNICODE_OTHER_LETTER, @@ -14325,8 +14413,8 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 3584, index 147 */ - G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, + { /* page 3584, index 148 */ + G_UNICODE_UNASSIGNED, G_UNICODE_FORMAT, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, @@ -14405,8 +14493,8 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 3585, index 148 */ - G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, + { /* page 3585, index 149 */ + G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, G_UNICODE_NON_SPACING_MARK, @@ -14533,8 +14621,8 @@ static const char type_data[][256] = { G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 4095, index 149 */ - G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + { /* page 4095, index 150 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, @@ -14621,8 +14709,8 @@ static const char type_data[][256] = { G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_UNASSIGNED, G_UNICODE_UNASSIGNED }, - { /* page 4351, index 150 */ - G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, + { /* page 4351, index 151 */ + G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, G_UNICODE_PRIVATE_USE, @@ -15461,9 +15549,9 @@ static const gint16 type_table_part1[804] = { G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, 143 /* page 747 */, - G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, - G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, - G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, + 144 /* page 750 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, @@ -15475,7 +15563,7 @@ static const gint16 type_table_part1[804] = { G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, - 144 /* page 762 */, + 145 /* page 762 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, @@ -15500,7 +15588,7 @@ static const gint16 type_table_part1[804] = { G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, - 145 /* page 787 */, + 146 /* page 787 */, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, @@ -15516,13 +15604,13 @@ static const gint16 type_table_part1[804] = { G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_OTHER_LETTER + G_UNICODE_MAX_TABLE_INDEX, - 146 /* page 803 */ + 147 /* page 803 */ }; /* U+E0000 through U+10FFFF */ static const gint16 type_table_part2[768] = { - 147 /* page 3584 */, - 148 /* page 3585 */, + 148 /* page 3584 */, + 149 /* page 3585 */, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_UNASSIGNED + G_UNICODE_MAX_TABLE_INDEX, @@ -16032,7 +16120,7 @@ static const gint16 type_table_part2[768] = { G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, - 149 /* page 4095 */, + 150 /* page 4095 */, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, @@ -16288,12 +16376,12 @@ static const gint16 type_table_part2[768] = { G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, G_UNICODE_PRIVATE_USE + G_UNICODE_MAX_TABLE_INDEX, - 150 /* page 4351 */ + 151 /* page 4351 */ }; static const gunichar attr_data[][256] = { { /* page 0, index 0 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16324,7 +16412,7 @@ static const gunichar attr_data[][256] = { 0x00db, 0x00dc, 0x00dd, 0x00de, 0x0178 }, { /* page 1, index 1 */ - 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x0107, 0x0106, 0x0109, + 0x0101, 0x0100, 0x0103, 0x0102, 0x0105, 0x0104, 0x0107, 0x0106, 0x0109, 0x0108, 0x010b, 0x010a, 0x010d, 0x010c, 0x010f, 0x010e, 0x0111, 0x0110, 0x0113, 0x0112, 0x0115, 0x0114, 0x0117, 0x0116, 0x0119, 0x0118, 0x011b, 0x011a, 0x011d, 0x011c, 0x011f, 0x011e, 0x0121, 0x0120, 0x0123, 0x0122, @@ -16355,7 +16443,7 @@ static const gunichar attr_data[][256] = { 0x01f9, 0x01f8, 0x01fb, 0x01fa, 0x01fd, 0x01fc, 0x01ff, 0x01fe }, { /* page 2, index 2 */ - 0x0201, 0x0200, 0x0203, 0x0202, 0x0205, 0x0204, 0x0207, 0x0206, 0x0209, + 0x0201, 0x0200, 0x0203, 0x0202, 0x0205, 0x0204, 0x0207, 0x0206, 0x0209, 0x0208, 0x020b, 0x020a, 0x020d, 0x020c, 0x020f, 0x020e, 0x0211, 0x0210, 0x0213, 0x0212, 0x0215, 0x0214, 0x0217, 0x0216, 0x0219, 0x0218, 0x021b, 0x021a, 0x021d, 0x021c, 0x021f, 0x021e, 0x019e, 0x0000, 0x0223, 0x0222, @@ -16386,7 +16474,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 3, index 3 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16417,7 +16505,7 @@ static const gunichar attr_data[][256] = { 0x03fb, 0x03fa, 0x0000, 0x037b, 0x037c, 0x037d }, { /* page 4, index 4 */ - 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, + 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442, 0x0443, @@ -16448,7 +16536,7 @@ static const gunichar attr_data[][256] = { 0x04fd, 0x04fc, 0x04ff, 0x04fe }, { /* page 5, index 5 */ - 0x0501, 0x0500, 0x0503, 0x0502, 0x0505, 0x0504, 0x0507, 0x0506, 0x0509, + 0x0501, 0x0500, 0x0503, 0x0502, 0x0505, 0x0504, 0x0507, 0x0506, 0x0509, 0x0508, 0x050b, 0x050a, 0x050d, 0x050c, 0x050f, 0x050e, 0x0511, 0x0510, 0x0513, 0x0512, 0x0515, 0x0514, 0x0517, 0x0516, 0x0519, 0x0518, 0x051b, 0x051a, 0x051d, 0x051c, 0x051f, 0x051e, 0x0521, 0x0520, 0x0523, 0x0522, @@ -16479,7 +16567,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 6, index 6 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16510,7 +16598,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 7, index 7 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16541,7 +16629,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 9, index 8 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16572,7 +16660,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 10, index 9 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16603,7 +16691,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 11, index 10 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16634,7 +16722,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 12, index 11 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16665,7 +16753,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 13, index 12 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16696,7 +16784,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 14, index 13 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16727,7 +16815,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 15, index 14 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, @@ -16758,7 +16846,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 16, index 15 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16789,7 +16877,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x1cbd, 0x1cbe, 0x1cbf }, { /* page 19, index 16 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16820,7 +16908,7 @@ static const gunichar attr_data[][256] = { 0x13f4, 0x13f5, 0x0000, 0x0000 }, { /* page 23, index 17 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16851,7 +16939,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 24, index 18 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16882,7 +16970,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 25, index 19 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16913,7 +17001,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 26, index 20 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16944,7 +17032,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 27, index 21 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -16975,7 +17063,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 28, index 22 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17006,7 +17094,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 29, index 23 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17037,7 +17125,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 30, index 24 */ - 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, 0x1e09, + 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06, 0x1e09, 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e, 0x1e11, 0x1e10, 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16, 0x1e19, 0x1e18, 0x1e1b, 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e, 0x1e21, 0x1e20, 0x1e23, 0x1e22, @@ -17068,7 +17156,7 @@ static const gunichar attr_data[][256] = { 0x1efb, 0x1efa, 0x1efd, 0x1efc, 0x1eff, 0x1efe }, { /* page 31, index 25 */ - 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f00, + 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f, 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07, 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0x0000, 0x0000, 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0x0000, 0x0000, 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, @@ -17103,7 +17191,7 @@ static const gunichar attr_data[][256] = { 0x1000415, 0x0000, 0x0000, 0x0000 }, { /* page 33, index 26 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17134,7 +17222,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 44, index 27 */ - 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38, + 0x2c30, 0x2c31, 0x2c32, 0x2c33, 0x2c34, 0x2c35, 0x2c36, 0x2c37, 0x2c38, 0x2c39, 0x2c3a, 0x2c3b, 0x2c3c, 0x2c3d, 0x2c3e, 0x2c3f, 0x2c40, 0x2c41, 0x2c42, 0x2c43, 0x2c44, 0x2c45, 0x2c46, 0x2c47, 0x2c48, 0x2c49, 0x2c4a, 0x2c4b, 0x2c4c, 0x2c4d, 0x2c4e, 0x2c4f, 0x2c50, 0x2c51, 0x2c52, 0x2c53, @@ -17165,7 +17253,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 45, index 28 */ - 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, + 0x10a0, 0x10a1, 0x10a2, 0x10a3, 0x10a4, 0x10a5, 0x10a6, 0x10a7, 0x10a8, 0x10a9, 0x10aa, 0x10ab, 0x10ac, 0x10ad, 0x10ae, 0x10af, 0x10b0, 0x10b1, 0x10b2, 0x10b3, 0x10b4, 0x10b5, 0x10b6, 0x10b7, 0x10b8, 0x10b9, 0x10ba, 0x10bb, 0x10bc, 0x10bd, 0x10be, 0x10bf, 0x10c0, 0x10c1, 0x10c2, 0x10c3, @@ -17196,7 +17284,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 166, index 29 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, @@ -17227,7 +17315,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 167, index 30 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xa723, 0xa722, @@ -17258,7 +17346,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 168, index 31 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17289,7 +17377,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 169, index 32 */ - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17320,7 +17408,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 170, index 33 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17351,7 +17439,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 171, index 34 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17382,7 +17470,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 251, index 35 */ - 0x100000f, 0x1000016, 0x100001d, 0x1000024, 0x100002d, 0x1000036, + 0x100000f, 0x1000016, 0x100001d, 0x1000024, 0x100002d, 0x1000036, 0x100003d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x100004f, 0x100005a, 0x1000065, 0x1000070, 0x100007b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17414,7 +17502,7 @@ static const gunichar attr_data[][256] = { 0x0000 }, { /* page 255, index 36 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xff41, 0xff42, 0xff43, @@ -17445,7 +17533,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 260, index 37 */ - 0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f, + 0x10428, 0x10429, 0x1042a, 0x1042b, 0x1042c, 0x1042d, 0x1042e, 0x1042f, 0x10430, 0x10431, 0x10432, 0x10433, 0x10434, 0x10435, 0x10436, 0x10437, 0x10438, 0x10439, 0x1043a, 0x1043b, 0x1043c, 0x1043d, 0x1043e, 0x1043f, 0x10440, 0x10441, 0x10442, 0x10443, 0x10444, 0x10445, 0x10446, 0x10447, @@ -17478,7 +17566,7 @@ static const gunichar attr_data[][256] = { 0x104d2, 0x104d3, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 261, index 38 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17510,7 +17598,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 268, index 39 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17542,7 +17630,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 269, index 40 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17573,7 +17661,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 272, index 41 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17604,7 +17692,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 273, index 42 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17635,7 +17723,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 274, index 43 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17666,7 +17754,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 276, index 44 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17697,7 +17785,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 278, index 45 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17728,7 +17816,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 279, index 46 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17759,7 +17847,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 280, index 47 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17791,7 +17879,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000 }, { /* page 281, index 48 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17822,7 +17910,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 284, index 49 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17853,7 +17941,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 285, index 50 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17884,7 +17972,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 287, index 51 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17915,7 +18003,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 362, index 52 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17946,7 +18034,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 363, index 53 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -17977,7 +18065,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 366, index 54 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -18009,7 +18097,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000 }, { /* page 471, index 55 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -18040,7 +18128,7 @@ static const gunichar attr_data[][256] = { 0x0006, 0x0007, 0x0008, 0x0009 }, { /* page 481, index 56 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -18071,7 +18159,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 482, index 57 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -18102,7 +18190,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 484, index 58 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -18133,7 +18221,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 489, index 59 */ - 0x1e922, 0x1e923, 0x1e924, 0x1e925, 0x1e926, 0x1e927, 0x1e928, 0x1e929, + 0x1e922, 0x1e923, 0x1e924, 0x1e925, 0x1e926, 0x1e927, 0x1e928, 0x1e929, 0x1e92a, 0x1e92b, 0x1e92c, 0x1e92d, 0x1e92e, 0x1e92f, 0x1e930, 0x1e931, 0x1e932, 0x1e933, 0x1e934, 0x1e935, 0x1e936, 0x1e937, 0x1e938, 0x1e939, 0x1e93a, 0x1e93b, 0x1e93c, 0x1e93d, 0x1e93e, 0x1e93f, 0x1e940, 0x1e941, @@ -18165,7 +18253,7 @@ static const gunichar attr_data[][256] = { 0x0000, 0x0000, 0x0000, 0x0000 }, { /* page 507, index 60 */ - 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -20232,14 +20320,13 @@ static const struct Interval g_unicode_width_table_wide[] = { {0x2E80, 0x2E99}, {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, -{0x2FF0, 0x2FFB}, -{0x3000, 0x303E}, +{0x2FF0, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, {0x3105, 0x312F}, {0x3131, 0x318E}, {0x3190, 0x31E3}, -{0x31F0, 0x321E}, +{0x31EF, 0x321E}, {0x3220, 0x3247}, {0x3250, 0x4DBF}, {0x4E00, 0xA48C}, @@ -20319,6 +20406,7 @@ static const struct Interval g_unicode_width_table_wide[] = { {0x2B740, 0x2B81D}, {0x2B820, 0x2CEA1}, {0x2CEB0, 0x2EBE0}, +{0x2EBF0, 0x2EE5D}, {0x2F800, 0x2FA1D}, {0x30000, 0x3134A}, {0x31350, 0x323AF}, diff --git a/glib/gunicode.h b/glib/gunicode.h index 85b3e09..6f359e1 100644 --- a/glib/gunicode.h +++ b/glib/gunicode.h @@ -204,10 +204,15 @@ typedef enum * @G_UNICODE_BREAK_EMOJI_BASE: Emoji Base (EB). Since: 2.50 * @G_UNICODE_BREAK_EMOJI_MODIFIER: Emoji Modifier (EM). Since: 2.50 * @G_UNICODE_BREAK_ZERO_WIDTH_JOINER: Zero Width Joiner (ZWJ). Since: 2.50 + * @G_UNICODE_BREAK_AKSARA: Aksara (AK). Since: 2.80 + * @G_UNICODE_BREAK_AKSARA_PRE_BASE (AP). Since: 2.80 + * @G_UNICODE_BREAK_AKSARA_START (AS). Since: 2.80 + * @G_UNICODE_BREAK_VIRAMA_FINAL (VF). Since: 2.80 + * @G_UNICODE_BREAK_VIRAMA (VI). Since: 2.80 * * These are the possible line break classifications. * - * Since new unicode versions may add new types here, applications should be ready + * Since new Unicode versions may add new types here, applications should be ready * to handle unknown values. They may be regarded as %G_UNICODE_BREAK_UNKNOWN. * * See [Unicode Line Breaking Algorithm](https://www.unicode.org/reports/tr14/). @@ -257,7 +262,12 @@ typedef enum G_UNICODE_BREAK_REGIONAL_INDICATOR, G_UNICODE_BREAK_EMOJI_BASE, G_UNICODE_BREAK_EMOJI_MODIFIER, - G_UNICODE_BREAK_ZERO_WIDTH_JOINER + G_UNICODE_BREAK_ZERO_WIDTH_JOINER, + G_UNICODE_BREAK_AKSARA, + G_UNICODE_BREAK_AKSARA_PRE_BASE, + G_UNICODE_BREAK_AKSARA_START, + G_UNICODE_BREAK_VIRAMA_FINAL, + G_UNICODE_BREAK_VIRAMA } GUnicodeBreakType; /** diff --git a/glib/gunicomp.h b/glib/gunicomp.h index f2fd759..90fffb3 100644 --- a/glib/gunicomp.h +++ b/glib/gunicomp.h @@ -7,7 +7,7 @@ static const guint16 compose_data[][256] = { { /* page 0, index 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, 149, 150, 151, 0, 0, 1, 2, 3, 4, 5, 152, 6, 7, 8, 153, 9, 10, 11, 12, 13, 14, 0, 15, 16, 17, 18, 19, 20, 21, @@ -21,7 +21,7 @@ static const guint16 compose_data[][256] = { 164, 0, 0, 0, 0, 58, 59, 165, 0, 166, 0, 0, 0, 60, 0, 0, 0 }, { /* page 1, index 1 */ - 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 0, 0, 0, + 0, 0, 61, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 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, 65, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 168, 0, @@ -35,7 +35,7 @@ static const guint16 compose_data[][256] = { 0 }, { /* page 2, index 2 */ - 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, 179, 180, 181, 182, 0, 0, 0, 0, 183, 184, 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, @@ -48,7 +48,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 3, index 3 */ - 378, 379, 380, 381, 382, 0, 383, 384, 385, 386, 387, 388, 389, 0, 0, 390, + 378, 379, 380, 381, 382, 0, 383, 384, 385, 386, 387, 388, 389, 0, 0, 390, 0, 391, 0, 392, 393, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 395, 396, 397, 398, 399, 400, 0, 0, 0, 0, 401, 402, 0, 403, 404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 405, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, @@ -62,7 +62,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 4, index 4 */ - 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 191, 0, 90, + 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 191, 0, 90, 91, 192, 92, 0, 193, 0, 0, 0, 194, 0, 0, 0, 0, 93, 0, 0, 0, 195, 0, 0, 0, 196, 0, 197, 0, 0, 94, 0, 0, 198, 0, 95, 96, 199, 97, 0, 200, 0, 0, 0, 201, 0, 0, 0, 0, 98, 0, 0, 0, 202, 0, 0, 0, 203, 0, 204, 0, 0, 0, 0, 0, @@ -76,7 +76,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 6, index 5 */ - 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, 99, 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, 212, 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, 409, 410, 411, 0, 0, 0, 0, 0, 0, 0, @@ -89,7 +89,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 9, index 6 */ - 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, 217, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 219, 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, @@ -102,7 +102,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 11, index 7 */ - 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, 414, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 415, 416, 0, 0, 0, 0, 0, @@ -115,7 +115,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 12, index 8 */ - 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, 222, 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, @@ -128,7 +128,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 13, index 9 */ - 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, 422, 0, 0, 0, 0, 0, 0, 0, 104, 225, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 423, 0, 0, 0, 0, 0, 0, @@ -141,7 +141,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 16, index 10 */ - 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, 227, 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, @@ -154,7 +154,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 27, index 11 */ - 0, 0, 0, 0, 0, 228, 0, 229, 0, 230, 0, 231, 0, 232, 0, 0, 0, 233, 0, 0, + 0, 0, 0, 0, 0, 228, 0, 229, 0, 230, 0, 231, 0, 232, 0, 0, 0, 233, 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, 234, 0, 235, 0, 236, 237, 0, 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -167,7 +167,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 30, index 12 */ - 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, 239, 240, 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, 241, 242, 0, 0, @@ -180,7 +180,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 31, index 13 */ - 108, 109, 249, 250, 251, 252, 253, 254, 110, 111, 255, 256, 257, 258, + 108, 109, 249, 250, 251, 252, 253, 254, 110, 111, 255, 256, 257, 258, 259, 260, 112, 113, 0, 0, 0, 0, 0, 0, 114, 115, 0, 0, 0, 0, 0, 0, 116, 117, 261, 262, 263, 264, 265, 266, 118, 119, 267, 268, 269, 270, 271, 272, 120, 121, 0, 0, 0, 0, 0, 0, 122, 123, 0, 0, 0, 0, 0, 0, 124, 125, 0, @@ -195,7 +195,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 136, 0 }, { /* page 33, index 14 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -208,7 +208,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 34, index 15 */ - 0, 0, 0, 297, 0, 0, 0, 0, 298, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 297, 0, 0, 0, 0, 298, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 301, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 303, 0, 304, 0, 0, 305, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -222,7 +222,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 48, index 16 */ - 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, 332, 0, 0, 0, 0, 333, 0, 334, 0, 335, 0, 336, 0, 337, 0, 338, 0, 339, 0, 340, 0, @@ -236,7 +236,7 @@ static const guint16 compose_data[][256] = { 0, 0, 365, 366, 367, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 369, 0, 0 }, { /* page 272, index 17 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -249,7 +249,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 273, index 18 */ - 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, 373, 374, 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, @@ -262,7 +262,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 275, index 19 */ - 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, 427, 0, 0, 0, 0, 0, 0, 0, 0, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, 0, 0, @@ -275,7 +275,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 276, index 20 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -288,7 +288,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 277, index 21 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -301,7 +301,7 @@ static const guint16 compose_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 281, index 22 */ - 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, 377, 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, diff --git a/glib/gunidecomp.c b/glib/gunidecomp.c index f149443..5c2d41b 100644 --- a/glib/gunidecomp.c +++ b/glib/gunidecomp.c @@ -19,43 +19,6 @@ * along with this library; if not, see . */ -/** - * SECTION:unicode - * @Title: Unicode Manipulation - * @Short_description: functions operating on Unicode characters and - * UTF-8 strings - * @See_also: g_locale_to_utf8(), g_locale_from_utf8() - * - * This section describes a number of functions for dealing with - * Unicode characters and strings. There are analogues of the - * traditional `ctype.h` character classification and case conversion - * functions, UTF-8 analogues of some string utility functions, - * functions to perform normalization, case conversion and collation - * on UTF-8 strings and finally functions to convert between the UTF-8, - * UTF-16 and UCS-4 encodings of Unicode. - * - * The implementations of the Unicode functions in GLib are based - * on the Unicode Character Data tables, which are available from - * [www.unicode.org](http://www.unicode.org/). - * - * * Unicode 4.0 was added in GLib 2.8 - * * Unicode 4.1 was added in GLib 2.10 - * * Unicode 5.0 was added in GLib 2.12 - * * Unicode 5.1 was added in GLib 2.16.3 - * * Unicode 6.0 was added in GLib 2.30 - * * Unicode 6.1 was added in GLib 2.32 - * * Unicode 6.2 was added in GLib 2.36 - * * Unicode 6.3 was added in GLib 2.40 - * * Unicode 7.0 was added in GLib 2.42 - * * Unicode 8.0 was added in GLib 2.48 - * * Unicode 9.0 was added in GLib 2.50.1 - * * Unicode 10.0 was added in GLib 2.54 - * * Unicode 11.10 was added in GLib 2.58 - * * Unicode 12.0 was added in GLib 2.62 - * * Unicode 12.1 was added in GLib 2.62 - * * Unicode 13.0 was added in GLib 2.66 - */ - #include "config.h" #include diff --git a/glib/gunidecomp.h b/glib/gunidecomp.h index a33d068..1c742fa 100644 --- a/glib/gunidecomp.h +++ b/glib/gunidecomp.h @@ -15,7 +15,7 @@ static const guchar cclass_data[][256] = { { /* page 3, index 0 */ - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, @@ -31,7 +31,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 4, index 1 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -44,7 +44,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 5, index 2 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -58,7 +58,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 6, index 3 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 32, 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, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, @@ -72,7 +72,7 @@ static const guchar cclass_data[][256] = { 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 7, index 4 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 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, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, 0, 0, 0, @@ -86,7 +86,7 @@ static const guchar cclass_data[][256] = { 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0 }, { /* page 8, index 5 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 0, 230, 230, 230, 230, 230, 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, @@ -101,7 +101,7 @@ static const guchar cclass_data[][256] = { 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230, 230 }, { /* page 9, index 6 */ - 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -114,7 +114,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0 }, { /* page 10, index 7 */ - 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -127,7 +127,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 11, index 8 */ - 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -140,7 +140,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 12, index 9 */ - 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -153,7 +153,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 13, index 10 */ - 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, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -166,7 +166,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 14, index 11 */ - 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, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -179,7 +179,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 15, index 12 */ - 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, 220, 220, 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, 220, 0, 220, 0, 216, 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, @@ -193,7 +193,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0 }, { /* page 16, index 13 */ - 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, 7, 0, 9, 9, 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, @@ -206,7 +206,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 19, index 14 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, @@ -219,7 +219,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 23, index 15 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 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, 9, 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, @@ -232,7 +232,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 24, index 16 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -245,7 +245,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 25, index 17 */ - 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, 222, 230, 220, 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, @@ -258,7 +258,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 26, index 18 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 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, @@ -272,7 +272,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 27, index 19 */ - 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, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 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, @@ -285,7 +285,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 28, index 20 */ - 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, 7, 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, @@ -299,7 +299,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0 }, { /* page 29, index 21 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -314,7 +314,7 @@ static const guchar cclass_data[][256] = { 228, 220, 218, 230, 233, 220, 230, 220 }, { /* page 32, index 22 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -328,7 +328,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0 }, { /* page 44, index 23 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -341,7 +341,7 @@ static const guchar cclass_data[][256] = { 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 45, index 24 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -355,7 +355,7 @@ static const guchar cclass_data[][256] = { 230, 230, 230, 230, 230, 230, 230, 230 }, { /* page 48, index 25 */ - 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, 218, 228, 232, 222, 224, 224, 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, @@ -368,7 +368,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 166, index 26 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -382,7 +382,7 @@ static const guchar cclass_data[][256] = { 0 }, { /* page 168, index 27 */ - 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 9, 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, 9, 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, @@ -396,7 +396,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0 }, { /* page 169, index 28 */ - 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, 220, 220, 220, 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -409,7 +409,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 170, index 29 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -422,7 +422,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 171, index 30 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -435,7 +435,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 251, index 31 */ - 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, 26, 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, @@ -448,7 +448,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 254, index 32 */ - 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, 230, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, 220, 230, 230, 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, @@ -462,7 +462,7 @@ static const guchar cclass_data[][256] = { 0, 0 }, { /* page 257, index 33 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -475,7 +475,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0 }, { /* page 258, index 34 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -488,7 +488,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 259, index 35 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -501,7 +501,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 266, index 36 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 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, 230, 1, 220, 0, 0, 0, 0, 9, 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, @@ -514,7 +514,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 269, index 37 */ - 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, 230, 230, 230, 230, 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, @@ -527,7 +527,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 270, index 38 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -540,7 +540,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220 }, { /* page 271, index 39 */ - 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, 220, 220, 230, 230, 230, 220, 230, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, @@ -554,7 +554,7 @@ static const guchar cclass_data[][256] = { 0 }, { /* page 272, index 40 */ - 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, 9, 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, @@ -567,7 +567,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 273, index 41 */ - 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 230, 230, 230, 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, 9, 9, 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, @@ -580,7 +580,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 274, index 42 */ - 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, 9, 7, 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, @@ -593,7 +593,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 275, index 43 */ - 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, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -606,7 +606,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 276, index 44 */ - 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, 9, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, @@ -619,7 +619,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 277, index 45 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -632,7 +632,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 278, index 46 */ - 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, 9, 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, @@ -645,7 +645,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 279, index 47 */ - 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, 9, 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, @@ -658,7 +658,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 280, index 48 */ - 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, 9, 7, 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, @@ -671,7 +671,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 281, index 49 */ - 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, 9, 9, 0, 0, 0, 0, 7, 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, @@ -684,7 +684,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 282, index 50 */ - 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, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -697,7 +697,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 284, index 51 */ - 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, 9, 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, @@ -710,7 +710,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 285, index 52 */ - 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, 7, 0, 9, 9, 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, @@ -723,7 +723,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 287, index 53 */ - 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, 9, 9, 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, @@ -736,7 +736,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 362, index 54 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -749,7 +749,7 @@ static const guchar cclass_data[][256] = { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 363, index 55 */ - 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, 230, 230, 230, 230, 230, 230, 230, 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, @@ -762,7 +762,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 367, index 56 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -775,7 +775,7 @@ static const guchar cclass_data[][256] = { 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 444, index 57 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -788,7 +788,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 465, index 58 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -802,7 +802,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 466, index 59 */ - 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, 230, 230, 230, 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, @@ -815,7 +815,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 480, index 60 */ - 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 0, 230, 230, 230, 230, 230, 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, @@ -829,7 +829,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 481, index 61 */ - 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, 230, 230, 230, 230, 230, 230, 230, 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, @@ -842,7 +842,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 482, index 62 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -855,7 +855,7 @@ static const guchar cclass_data[][256] = { 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 484, index 63 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -868,7 +868,7 @@ static const guchar cclass_data[][256] = { 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 488, index 64 */ - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -881,7 +881,7 @@ static const guchar cclass_data[][256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { /* page 489, index 65 */ - 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, 230, 230, 230, 230, 230, 230, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, diff --git a/glib/guri.c b/glib/guri.c index 5872550..592b762 100644 --- a/glib/guri.c +++ b/glib/guri.c @@ -29,23 +29,74 @@ #include "guriprivate.h" /** - * SECTION:guri - * @short_description: URI-handling utilities - * @include: glib.h + * GUri: * - * The #GUri type and related functions can be used to parse URIs into + * The `GUri` type and related functions can be used to parse URIs into * their components, and build valid URIs from individual components. * - * Note that #GUri scope is to help manipulate URIs in various applications, + * Since `GUri` only represents absolute URIs, all `GUri`s will have a + * URI scheme, so [method@GLib.Uri.get_scheme] will always return a non-`NULL` + * answer. Likewise, by definition, all URIs have a path component, so + * [method@GLib.Uri.get_path] will always return a non-`NULL` string (which may + * be empty). + * + * If the URI string has an + * [‘authority’ component](https://tools.ietf.org/html/rfc3986#section-3) (that + * is, if the scheme is followed by `://` rather than just `:`), then the + * `GUri` will contain a hostname, and possibly a port and ‘userinfo’. + * Additionally, depending on how the `GUri` was constructed/parsed (for example, + * using the `G_URI_FLAGS_HAS_PASSWORD` and `G_URI_FLAGS_HAS_AUTH_PARAMS` flags), + * the userinfo may be split out into a username, password, and + * additional authorization-related parameters. + * + * Normally, the components of a `GUri` will have all `%`-encoded + * characters decoded. However, if you construct/parse a `GUri` with + * `G_URI_FLAGS_ENCODED`, then the `%`-encoding will be preserved instead in + * the userinfo, path, and query fields (and in the host field if also + * created with `G_URI_FLAGS_NON_DNS`). In particular, this is necessary if + * the URI may contain binary data or non-UTF-8 text, or if decoding + * the components might change the interpretation of the URI. + * + * For example, with the encoded flag: + * + * ```c + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_ENCODED, &err); + * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue"); + * ``` + * + * While the default `%`-decoding behaviour would give: + * + * ```c + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_NONE, &err); + * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http://host/path?param=value"); + * ``` + * + * During decoding, if an invalid UTF-8 string is encountered, parsing will fail + * with an error indicating the bad string location: + * + * ```c + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fbad%3D%00alue", G_URI_FLAGS_NONE, &err); + * g_assert_error (err, G_URI_ERROR, G_URI_ERROR_BAD_QUERY); + * ``` + * + * You should pass `G_URI_FLAGS_ENCODED` or `G_URI_FLAGS_ENCODED_QUERY` if you + * need to handle that case manually. In particular, if the query string + * contains `=` characters that are `%`-encoded, you should let + * [func@GLib.Uri.parse_params] do the decoding once of the query. + * + * `GUri` is immutable once constructed, and can safely be accessed from + * multiple threads. Its reference counting is atomic. + * + * Note that the scope of `GUri` is to help manipulate URIs in various applications, * following [RFC 3986](https://tools.ietf.org/html/rfc3986). In particular, - * it doesn't intend to cover web browser needs, and doesn't implement the + * it doesn't intend to cover web browser needs, and doesn’t implement the * [WHATWG URL](https://url.spec.whatwg.org/) standard. No APIs are provided to * help prevent * [homograph attacks](https://en.wikipedia.org/wiki/IDN_homograph_attack), so - * #GUri is not suitable for formatting URIs for display to the user for making + * `GUri` is not suitable for formatting URIs for display to the user for making * security-sensitive decisions. * - * ## Relative and absolute URIs # {#relative-absolute-uris} + * ## Relative and absolute URIs * * As defined in [RFC 3986](https://tools.ietf.org/html/rfc3986#section-4), the * hierarchical nature of URIs means that they can either be ‘relative @@ -65,145 +116,85 @@ * * Absolute URIs have a scheme specified. Any other components of the URI which * are missing are specified as explicitly unset in the URI, rather than being - * resolved relative to a base URI using g_uri_parse_relative(). + * resolved relative to a base URI using [method@GLib.Uri.parse_relative]. * * For example, a valid absolute URI is `file:///home/bob` or * `https://search.com?query=string`. * - * A #GUri instance is always an absolute URI. A string may be an absolute URI + * A `GUri` instance is always an absolute URI. A string may be an absolute URI * or a relative reference; see the documentation for individual functions as to * what forms they accept. * * ## Parsing URIs * - * The most minimalist APIs for parsing URIs are g_uri_split() and - * g_uri_split_with_user(). These split a URI into its component + * The most minimalist APIs for parsing URIs are [func@GLib.Uri.split] and + * [func@GLib.Uri.split_with_user]. These split a URI into its component * parts, and return the parts; the difference between the two is that - * g_uri_split() treats the ‘userinfo’ component of the URI as a - * single element, while g_uri_split_with_user() can (depending on the - * #GUriFlags you pass) treat it as containing a username, password, - * and authentication parameters. Alternatively, g_uri_split_network() + * [func@GLib.Uri.split] treats the ‘userinfo’ component of the URI as a + * single element, while [func@GLib.Uri.split_with_user] can (depending on the + * [flags@GLib.UriFlags] you pass) treat it as containing a username, password, + * and authentication parameters. Alternatively, [func@GLib.Uri.split_network] * can be used when you are only interested in the components that are * needed to initiate a network connection to the service (scheme, * host, and port). * - * g_uri_parse() is similar to g_uri_split(), but instead of returning - * individual strings, it returns a #GUri structure (and it requires + * [func@GLib.Uri.parse] is similar to [func@GLib.Uri.split], but instead of + * returning individual strings, it returns a `GUri` structure (and it requires * that the URI be an absolute URI). * - * g_uri_resolve_relative() and g_uri_parse_relative() allow you to - * resolve a relative URI relative to a base URI. - * g_uri_resolve_relative() takes two strings and returns a string, - * and g_uri_parse_relative() takes a #GUri and a string and returns a - * #GUri. + * [func@GLib.Uri.resolve_relative] and [method@GLib.Uri.parse_relative] allow + * you to resolve a relative URI relative to a base URI. + * [func@GLib.Uri.resolve_relative] takes two strings and returns a string, + * and [method@GLib.Uri.parse_relative] takes a `GUri` and a string and returns a + * `GUri`. * - * All of the parsing functions take a #GUriFlags argument describing + * All of the parsing functions take a [flags@GLib.UriFlags] argument describing * exactly how to parse the URI; see the documentation for that type * for more details on the specific flags that you can pass. If you * need to choose different flags based on the type of URI, you can - * use g_uri_peek_scheme() on the URI string to check the scheme + * use [func@GLib.Uri.peek_scheme] on the URI string to check the scheme * first, and use that to decide what flags to parse it with. * - * For example, you might want to use %G_URI_PARAMS_WWW_FORM when parsing the - * params for a web URI, so compare the result of g_uri_peek_scheme() against - * `http` and `https`. + * For example, you might want to use `G_URI_PARAMS_WWW_FORM` when parsing the + * params for a web URI, so compare the result of [func@GLib.Uri.peek_scheme] + * against `http` and `https`. * * ## Building URIs * - * g_uri_join() and g_uri_join_with_user() can be used to construct + * [func@GLib.Uri.join] and [func@GLib.Uri.join_with_user] can be used to construct * valid URI strings from a set of component strings. They are the - * inverse of g_uri_split() and g_uri_split_with_user(). + * inverse of [func@GLib.Uri.split] and [func@GLib.Uri.split_with_user]. * - * Similarly, g_uri_build() and g_uri_build_with_user() can be used to - * construct a #GUri from a set of component strings. + * Similarly, [func@GLib.Uri.build] and [func@GLib.Uri.build_with_user] can be + * used to construct a `GUri` from a set of component strings. * * As with the parsing functions, the building functions take a - * #GUriFlags argument. In particular, it is important to keep in mind + * [flags@GLib.UriFlags] argument. In particular, it is important to keep in mind * whether the URI components you are using are already `%`-encoded. If so, - * you must pass the %G_URI_FLAGS_ENCODED flag. + * you must pass the `G_URI_FLAGS_ENCODED` flag. * * ## `file://` URIs * * Note that Windows and Unix both define special rules for parsing * `file://` URIs (involving non-UTF-8 character sets on Unix, and the - * interpretation of path separators on Windows). #GUri does not - * implement these rules. Use g_filename_from_uri() and - * g_filename_to_uri() if you want to properly convert between + * interpretation of path separators on Windows). `GUri` does not + * implement these rules. Use [func@GLib.filename_from_uri] and + * [func@GLib.filename_to_uri] if you want to properly convert between * `file://` URIs and local filenames. * * ## URI Equality * * Note that there is no `g_uri_equal ()` function, because comparing - * URIs usefully requires scheme-specific knowledge that #GUri does - * not have. #GUri can help with normalization if you use the various - * encoded #GUriFlags as well as %G_URI_FLAGS_SCHEME_NORMALIZE however - * it is not comprehensive. + * URIs usefully requires scheme-specific knowledge that `GUri` does + * not have. `GUri` can help with normalization if you use the various + * encoded [flags@GLib.UriFlags] as well as `G_URI_FLAGS_SCHEME_NORMALIZE` + * however it is not comprehensive. * For example, `data:,foo` and `data:;base64,Zm9v` resolve to the same * thing according to the `data:` URI specification which GLib does not * handle. * * Since: 2.66 */ - -/** - * GUri: - * - * A parsed absolute URI. - * - * Since #GUri only represents absolute URIs, all #GUris will have a - * URI scheme, so g_uri_get_scheme() will always return a non-%NULL - * answer. Likewise, by definition, all URIs have a path component, so - * g_uri_get_path() will always return a non-%NULL string (which may be empty). - * - * If the URI string has an - * [‘authority’ component](https://tools.ietf.org/html/rfc3986#section-3) (that - * is, if the scheme is followed by `://` rather than just `:`), then the - * #GUri will contain a hostname, and possibly a port and ‘userinfo’. - * Additionally, depending on how the #GUri was constructed/parsed (for example, - * using the %G_URI_FLAGS_HAS_PASSWORD and %G_URI_FLAGS_HAS_AUTH_PARAMS flags), - * the userinfo may be split out into a username, password, and - * additional authorization-related parameters. - * - * Normally, the components of a #GUri will have all `%`-encoded - * characters decoded. However, if you construct/parse a #GUri with - * %G_URI_FLAGS_ENCODED, then the `%`-encoding will be preserved instead in - * the userinfo, path, and query fields (and in the host field if also - * created with %G_URI_FLAGS_NON_DNS). In particular, this is necessary if - * the URI may contain binary data or non-UTF-8 text, or if decoding - * the components might change the interpretation of the URI. - * - * For example, with the encoded flag: - * - * |[ - * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_ENCODED, &err); - * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue"); - * ]| - * - * While the default `%`-decoding behaviour would give: - * - * |[ - * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_NONE, &err); - * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http://host/path?param=value"); - * ]| - * - * During decoding, if an invalid UTF-8 string is encountered, parsing will fail - * with an error indicating the bad string location: - * - * |[ - * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fbad%3D%00alue", G_URI_FLAGS_NONE, &err); - * g_assert_error (err, G_URI_ERROR, G_URI_ERROR_BAD_QUERY); - * ]| - * - * You should pass %G_URI_FLAGS_ENCODED or %G_URI_FLAGS_ENCODED_QUERY if you - * need to handle that case manually. In particular, if the query string - * contains `=` characters that are `%`-encoded, you should let - * g_uri_parse_params() do the decoding once of the query. - * - * #GUri is immutable once constructed, and can safely be accessed from - * multiple threads. Its reference counting is atomic. - * - * Since: 2.66 - */ struct _GUri { gchar *scheme; gchar *userinfo; @@ -1072,7 +1063,7 @@ g_uri_split_internal (const gchar *uri_string, * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_ref (which can be an - * [absolute or relative URI][relative-absolute-uris]) according to @flags, and + * [absolute or relative URI](#relative-and-absolute-uris)) according to @flags, and * returns the pieces. Any component that doesn't appear in @uri_ref will be * returned as %NULL (but note that all URIs always have a path component, * though it may be the empty string). @@ -1139,7 +1130,7 @@ g_uri_split (const gchar *uri_ref, * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_ref (which can be an - * [absolute or relative URI][relative-absolute-uris]) according to @flags, and + * [absolute or relative URI](#relative-and-absolute-uris)) according to @flags, and * returns the pieces. Any component that doesn't appear in @uri_ref will be * returned as %NULL (but note that all URIs always have a path component, * though it may be the empty string). @@ -1191,7 +1182,7 @@ g_uri_split_with_user (const gchar *uri_ref, * port, or `-1` * @error: #GError for error reporting, or %NULL to ignore. * - * Parses @uri_string (which must be an [absolute URI][relative-absolute-uris]) + * Parses @uri_string (which must be an [absolute URI](#relative-and-absolute-uris)) * according to @flags, and returns the pieces relevant to connecting to a host. * See the documentation for g_uri_split() for more details; this is * mostly a wrapper around that function with simpler arguments. @@ -1260,7 +1251,7 @@ g_uri_split_network (const gchar *uri_string, * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_string according to @flags, to determine whether it is a valid - * [absolute URI][relative-absolute-uris], i.e. it does not need to be resolved + * [absolute URI](#relative-and-absolute-uris), i.e. it does not need to be resolved * relative to another URI using g_uri_parse_relative(). * * If it’s not a valid URI, an error is returned explaining how it’s invalid. @@ -1398,7 +1389,7 @@ remove_dot_segments (gchar *path) * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_string according to @flags. If the result is not a - * valid [absolute URI][relative-absolute-uris], it will be discarded, and an + * valid [absolute URI](#relative-and-absolute-uris), it will be discarded, and an * error returned. * * Return value: (transfer full): a new #GUri, or NULL on error. @@ -1424,7 +1415,7 @@ g_uri_parse (const gchar *uri_string, * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_ref according to @flags and, if it is a - * [relative URI][relative-absolute-uris], resolves it relative to @base_uri. + * [relative URI](#relative-and-absolute-uris), resolves it relative to @base_uri. * If the result is not a valid absolute URI, it will be discarded, and an error * returned. * @@ -1555,7 +1546,7 @@ g_uri_parse_relative (GUri *base_uri, * @error: #GError for error reporting, or %NULL to ignore. * * Parses @uri_ref according to @flags and, if it is a - * [relative URI][relative-absolute-uris], resolves it relative to + * [relative URI](#relative-and-absolute-uris), resolves it relative to * @base_uri_string. If the result is not a valid absolute URI, it will be * discarded, and an error returned. * diff --git a/glib/gutils.c b/glib/gutils.c index 362c55a..bb88c76 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -79,14 +79,6 @@ #endif -/** - * SECTION:misc_utils - * @title: Miscellaneous Utility Functions - * @short_description: a selection of portable utility functions - * - * These are portable utility functions. - */ - #ifdef G_PLATFORM_WIN32 # include # ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS @@ -663,7 +655,7 @@ g_get_user_database_entry (void) { static UserDatabaseEntry *entry; - if (g_once_init_enter (&entry)) + if (g_once_init_enter_pointer (&entry)) { static UserDatabaseEntry e; @@ -672,12 +664,12 @@ g_get_user_database_entry (void) struct passwd *pw = NULL; gpointer buffer = NULL; gint error; - gchar *logname; + const char *logname; # if defined (HAVE_GETPWUID_R) struct passwd pwd; # ifdef _SC_GETPW_R_SIZE_MAX - /* This reurns the maximum length */ + /* This returns the maximum length */ glong bufsize = sysconf (_SC_GETPW_R_SIZE_MAX); if (bufsize < 0) @@ -686,7 +678,7 @@ g_get_user_database_entry (void) glong bufsize = 64; # endif /* _SC_GETPW_R_SIZE_MAX */ - logname = (gchar *) g_getenv ("LOGNAME"); + logname = g_getenv ("LOGNAME"); do { @@ -787,7 +779,7 @@ g_get_user_database_entry (void) if (!e.real_name) e.real_name = g_strdup ("Unknown"); - g_once_init_leave (&entry, &e); + g_once_init_leave_pointer (&entry, &e); } return entry; @@ -1065,7 +1057,7 @@ g_get_host_name (void) { static gchar *hostname; - if (g_once_init_enter (&hostname)) + if (g_once_init_enter_pointer (&hostname)) { gboolean failed; gchar *utmp = NULL; @@ -1122,13 +1114,12 @@ g_get_host_name (void) failed = TRUE; #endif - g_once_init_leave (&hostname, failed ? g_strdup ("localhost") : utmp); + g_once_init_leave_pointer (&hostname, failed ? g_strdup ("localhost") : utmp); } return hostname; } -G_LOCK_DEFINE_STATIC (g_prgname); static const gchar *g_prgname = NULL; /* always a quark */ /** @@ -1150,13 +1141,7 @@ static const gchar *g_prgname = NULL; /* always a quark */ const gchar* g_get_prgname (void) { - const gchar* retval; - - G_LOCK (g_prgname); - retval = g_prgname; - G_UNLOCK (g_prgname); - - return retval; + return g_atomic_pointer_get (&g_prgname); } /** @@ -1179,13 +1164,29 @@ g_get_prgname (void) void g_set_prgname (const gchar *prgname) { - GQuark qprgname = g_quark_from_string (prgname); - G_LOCK (g_prgname); - g_prgname = g_quark_to_string (qprgname); - G_UNLOCK (g_prgname); + prgname = g_intern_string (prgname); + g_atomic_pointer_set (&g_prgname, prgname); +} + +/** + * g_set_prgname_once: + * @prgname: the name of the program. + * + * If g_get_prgname() is not set, this is the same as setting + * the name via g_set_prgname() and %TRUE is returned. Otherwise, + * does nothing and returns %FALSE. This is thread-safe. + * + * Returns: whether g_prgname was initialized by the call. + */ +gboolean +g_set_prgname_once (const gchar *prgname) +{ + /* if @prgname is NULL, then this has the same effect as calling + * (g_get_prgname()==NULL). */ + prgname = g_intern_string (prgname); + return g_atomic_pointer_compare_and_exchange (&g_prgname, NULL, prgname); } -G_LOCK_DEFINE_STATIC (g_application_name); static gchar *g_application_name = NULL; /** @@ -1207,16 +1208,14 @@ static gchar *g_application_name = NULL; const gchar * g_get_application_name (void) { - gchar* retval; + const char *retval; - G_LOCK (g_application_name); - retval = g_application_name; - G_UNLOCK (g_application_name); + retval = g_atomic_pointer_get (&g_application_name); - if (retval == NULL) - return g_get_prgname (); - - return retval; + if (retval) + return retval; + + return g_get_prgname (); } /** @@ -1240,17 +1239,17 @@ g_get_application_name (void) void g_set_application_name (const gchar *application_name) { - gboolean already_set = FALSE; - - G_LOCK (g_application_name); - if (g_application_name) - already_set = TRUE; - else - g_application_name = g_strdup (application_name); - G_UNLOCK (g_application_name); + char *name; - if (already_set) - g_warning ("g_set_application_name() called multiple times"); + g_return_if_fail (application_name); + + name = g_strdup (application_name); + + if (!g_atomic_pointer_compare_and_exchange (&g_application_name, NULL, name)) + { + g_warning ("g_set_application_name() called multiple times"); + g_free (name); + } } #ifdef G_OS_WIN32 @@ -1876,6 +1875,7 @@ g_build_user_data_dir (void) if (!data_dir || !data_dir[0]) { gchar *home_dir = g_build_home_dir (); + g_free (data_dir); data_dir = g_build_filename (home_dir, ".local", "share", NULL); g_free (home_dir); } @@ -2913,7 +2913,7 @@ g_format_size (guint64 size) * a strong "power of 2" basis, like RAM sizes or RAID stripe sizes. * Network and storage sizes should be reported in the normal SI units. * @G_FORMAT_SIZE_BITS: set the size as a quantity in bits, rather than - * bytes, and return units in bits. For example, ‘Mb’ rather than ‘MB’. + * bytes, and return units in bits. For example, ‘Mbit’ rather than ‘MB’. * @G_FORMAT_SIZE_ONLY_VALUE: return only value, without unit; this should * not be used together with @G_FORMAT_SIZE_LONG_FORMAT * nor @G_FORMAT_SIZE_ONLY_UNIT. Since: 2.74 @@ -2990,32 +2990,32 @@ g_format_size_full (guint64 size, { EXBIBYTE_FACTOR, N_("EiB") } }, { - /* Translators: A unit symbol for size formatting, showing for example: "13.0 kb" */ - { KILOBYTE_FACTOR, N_("kb") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" */ - { MEGABYTE_FACTOR, N_("Mb") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" */ - { GIGABYTE_FACTOR, N_("Gb") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" */ - { TERABYTE_FACTOR, N_("Tb") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" */ - { PETABYTE_FACTOR, N_("Pb") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" */ - { EXABYTE_FACTOR, N_("Eb") } + /* Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" */ + { KILOBYTE_FACTOR, N_("kbit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" */ + { MEGABYTE_FACTOR, N_("Mbit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" */ + { GIGABYTE_FACTOR, N_("Gbit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" */ + { TERABYTE_FACTOR, N_("Tbit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" */ + { PETABYTE_FACTOR, N_("Pbit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" */ + { EXABYTE_FACTOR, N_("Ebit") } }, { - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" */ - { KIBIBYTE_FACTOR, N_("Kib") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" */ - { MEBIBYTE_FACTOR, N_("Mib") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" */ - { GIBIBYTE_FACTOR, N_("Gib") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" */ - { TEBIBYTE_FACTOR, N_("Tib") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" */ - { PEBIBYTE_FACTOR, N_("Pib") }, - /* Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" */ - { EXBIBYTE_FACTOR, N_("Eib") } + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" */ + { KIBIBYTE_FACTOR, N_("Kibit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" */ + { MEBIBYTE_FACTOR, N_("Mibit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" */ + { GIBIBYTE_FACTOR, N_("Gibit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" */ + { TEBIBYTE_FACTOR, N_("Tibit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" */ + { PEBIBYTE_FACTOR, N_("Pibit") }, + /* Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" */ + { EXBIBYTE_FACTOR, N_("Eibit") } } }; diff --git a/glib/gutilsprivate.h b/glib/gutilsprivate.h index b4f1b98..7bbde71 100644 --- a/glib/gutilsprivate.h +++ b/glib/gutilsprivate.h @@ -59,6 +59,8 @@ void _g_unset_cached_tmp_dir (void); gboolean _g_localtime (time_t timet, struct tm *tm); +gboolean g_set_prgname_once (const gchar *prgname); + G_END_DECLS #endif /* __G_UTILS_PRIVATE_H__ */ diff --git a/glib/guuid.c b/glib/guuid.c index 5368465..f2d632b 100644 --- a/glib/guuid.c +++ b/glib/guuid.c @@ -35,28 +35,6 @@ typedef struct { guint8 bytes[16]; } GUuid; -/** - * SECTION:uuid - * @title: GUuid - * @short_description: a universally unique identifier - * - * A UUID, or Universally unique identifier, is intended to uniquely - * identify information in a distributed environment. For the - * definition of UUID, see [RFC 4122](https://tools.ietf.org/html/rfc4122.html). - * - * The creation of UUIDs does not require a centralized authority. - * - * UUIDs are of relatively small size (128 bits, or 16 bytes). The - * common string representation (ex: - * 1d6c0810-2bd6-45f3-9890-0268422a6f14) needs 37 bytes. - * - * The UUID specification defines 5 versions, and calling - * g_uuid_string_random() will generate a unique (or rather random) - * UUID of the most common version, version 4. - * - * Since: 2.52 - */ - /* * g_uuid_to_string: * @uuid: a #GUuid diff --git a/glib/gvariant-core.c b/glib/gvariant-core.c index 06e857b..eb25d76 100644 --- a/glib/gvariant-core.c +++ b/glib/gvariant-core.c @@ -49,14 +49,6 @@ * Most GVariant API functions are in gvariant.c. */ -/** - * GVariant: - * - * #GVariant is an opaque data structure and can only be accessed - * using the following functions. - * - * Since: 2.24 - **/ struct _GVariant /* see below for field member documentation */ { @@ -633,8 +625,14 @@ g_variant_new_from_bytes (const GVariantType *type, /* posix_memalign() requires the alignment to be a multiple of * sizeof(void*), and a power of 2. See g_variant_type_info_query() for - * details on the alignment format. */ - if (posix_memalign (&aligned_data, MAX (sizeof (void *), alignment + 1), + * details on the alignment format. + * + * While calling posix_memalign() with aligned_size==0 is safe on glibc, + * POSIX specifies that the behaviour is implementation-defined, so avoid + * that and leave aligned_data==NULL in that case. + * See https://pubs.opengroup.org/onlinepubs/9699919799/functions/posix_memalign.html */ + if (aligned_size != 0 && + posix_memalign (&aligned_data, MAX (sizeof (void *), alignment + 1), aligned_size) != 0) g_error ("posix_memalign failed"); diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c index 7973ecf..112d89d 100644 --- a/glib/gvariant-parser.c +++ b/glib/gvariant-parser.c @@ -2476,7 +2476,7 @@ parse (TokenStream *stream, * * A single #GVariant is parsed from the content of @text. * - * The format is described [here][gvariant-text]. + * The format is described [here](gvariant-text-format.html). * * The memory at @limit will never be accessed and the parser behaves as * if the character at @limit is the nul terminator. This has the @@ -2496,13 +2496,14 @@ parse (TokenStream *stream, * * In the event that the parsing is successful, the resulting #GVariant * is returned. It is never floating, and must be freed with - * g_variant_unref(). + * [method@GLib.Variant.unref]. * * In case of any error, %NULL will be returned. If @error is non-%NULL * then it will be set to reflect the error that occurred. * - * Officially, the language understood by the parser is "any string - * produced by g_variant_print()". + * Officially, the language understood by the parser is “any string + * produced by [method@GLib.Variant.print]”. This explicitly includes + * `g_variant_print()`’s annotated types like `int64 -1000`. * * There may be implementation specific restrictions on deeply nested values, * which would result in a %G_VARIANT_PARSE_ERROR_RECURSION error. #GVariant is diff --git a/glib/gvariant.c b/glib/gvariant.c index b7e4241..651771b 100644 --- a/glib/gvariant.c +++ b/glib/gvariant.c @@ -36,115 +36,114 @@ #include /** - * SECTION:gvariant - * @title: GVariant - * @short_description: strongly typed value datatype - * @see_also: GVariantType + * GVariant: * - * #GVariant is a variant datatype; it can contain one or more values + * `GVariant` is a variant datatype; it can contain one or more values * along with information about the type of the values. * - * A #GVariant may contain simple types, like an integer, or a boolean value; + * A `GVariant` may contain simple types, like an integer, or a boolean value; * or complex types, like an array of two strings, or a dictionary of key - * value pairs. A #GVariant is also immutable: once it's been created neither + * value pairs. A `GVariant` is also immutable: once it’s been created neither * its type nor its content can be modified further. * - * GVariant is useful whenever data needs to be serialized, for example when - * sending method parameters in D-Bus, or when saving settings using GSettings. + * `GVariant` is useful whenever data needs to be serialized, for example when + * sending method parameters in D-Bus, or when saving settings using + * [`GSettings`](../gio/class.Settings.html). * - * When creating a new #GVariant, you pass the data you want to store in it + * When creating a new `GVariant`, you pass the data you want to store in it * along with a string representing the type of data you wish to pass to it. * - * For instance, if you want to create a #GVariant holding an integer value you + * For instance, if you want to create a `GVariant` holding an integer value you * can use: * - * |[ - * GVariant *v = g_variant_new ("u", 40); - * ]| + * ```c + * GVariant *v = g_variant_new ("u", 40); + * ``` * - * The string "u" in the first argument tells #GVariant that the data passed to - * the constructor (40) is going to be an unsigned integer. + * The string `u` in the first argument tells `GVariant` that the data passed to + * the constructor (`40`) is going to be an unsigned integer. * - * More advanced examples of #GVariant in use can be found in documentation for - * [GVariant format strings][gvariant-format-strings-pointers]. + * More advanced examples of `GVariant` in use can be found in documentation for + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * The range of possible values is determined by the type. * - * The type system used by #GVariant is #GVariantType. + * The type system used by `GVariant` is [type@GLib.VariantType]. * - * #GVariant instances always have a type and a value (which are given - * at construction time). The type and value of a #GVariant instance - * can never change other than by the #GVariant itself being - * destroyed. A #GVariant cannot contain a pointer. + * `GVariant` instances always have a type and a value (which are given + * at construction time). The type and value of a `GVariant` instance + * can never change other than by the `GVariant` itself being + * destroyed. A `GVariant` cannot contain a pointer. * - * #GVariant is reference counted using g_variant_ref() and - * g_variant_unref(). #GVariant also has floating reference counts -- - * see g_variant_ref_sink(). + * `GVariant` is reference counted using [method@GLib.Variant.ref] and + * [method@GLib.Variant.unref]. `GVariant` also has floating reference counts — + * see [method@GLib.Variant.ref_sink]. * - * #GVariant is completely threadsafe. A #GVariant instance can be + * `GVariant` is completely threadsafe. A `GVariant` instance can be * concurrently accessed in any way from any number of threads without * problems. * - * #GVariant is heavily optimised for dealing with data in serialized + * `GVariant` is heavily optimised for dealing with data in serialized * form. It works particularly well with data located in memory-mapped * files. It can perform nearly all deserialization operations in a * small constant time, usually touching only a single memory page. - * Serialized #GVariant data can also be sent over the network. + * Serialized `GVariant` data can also be sent over the network. * - * #GVariant is largely compatible with D-Bus. Almost all types of - * #GVariant instances can be sent over D-Bus. See #GVariantType for - * exceptions. (However, #GVariant's serialization format is not the same - * as the serialization format of a D-Bus message body: use #GDBusMessage, - * in the gio library, for those.) + * `GVariant` is largely compatible with D-Bus. Almost all types of + * `GVariant` instances can be sent over D-Bus. See [type@GLib.VariantType] for + * exceptions. (However, `GVariant`’s serialization format is not the same + * as the serialization format of a D-Bus message body: use + * [GDBusMessage](../gio/class.DBusMessage.html), in the GIO library, for those.) * - * For space-efficiency, the #GVariant serialization format does not - * automatically include the variant's length, type or endianness, + * For space-efficiency, the `GVariant` serialization format does not + * automatically include the variant’s length, type or endianness, * which must either be implied from context (such as knowledge that a * particular file format always contains a little-endian - * %G_VARIANT_TYPE_VARIANT which occupies the whole length of the file) + * `G_VARIANT_TYPE_VARIANT` which occupies the whole length of the file) * or supplied out-of-band (for instance, a length, type and/or endianness * indicator could be placed at the beginning of a file, network message * or network stream). * - * A #GVariant's size is limited mainly by any lower level operating - * system constraints, such as the number of bits in #gsize. For + * A `GVariant`’s size is limited mainly by any lower level operating + * system constraints, such as the number of bits in `gsize`. For * example, it is reasonable to have a 2GB file mapped into memory - * with #GMappedFile, and call g_variant_new_from_data() on it. + * with [struct@GLib.MappedFile], and call [ctor@GLib.Variant.new_from_data] on + * it. * - * For convenience to C programmers, #GVariant features powerful + * For convenience to C programmers, `GVariant` features powerful * varargs-based value construction and destruction. This feature is * designed to be embedded in other libraries. * - * There is a Python-inspired text language for describing #GVariant - * values. #GVariant includes a printer for this language and a parser + * There is a Python-inspired text language for describing `GVariant` + * values. `GVariant` includes a printer for this language and a parser * with type inferencing. * * ## Memory Use * - * #GVariant tries to be quite efficient with respect to memory use. + * `GVariant` tries to be quite efficient with respect to memory use. * This section gives a rough idea of how much memory is used by the * current implementation. The information here is subject to change * in the future. * - * The memory allocated by #GVariant can be grouped into 4 broad + * The memory allocated by `GVariant` can be grouped into 4 broad * purposes: memory for serialized data, memory for the type * information cache, buffer management memory and memory for the - * #GVariant structure itself. + * `GVariant` structure itself. * * ## Serialized Data Memory * - * This is the memory that is used for storing GVariant data in + * This is the memory that is used for storing `GVariant` data in * serialized form. This is what would be sent over the network or * what would end up on disk, not counting any indicator of the * endianness, or of the length or type of the top-level variant. * * The amount of memory required to store a boolean is 1 byte. 16, * 32 and 64 bit integers and double precision floating point numbers - * use their "natural" size. Strings (including object path and + * use their ‘natural’ size. Strings (including object path and * signature strings) are stored with a nul terminator, and as such * use the length of the string plus 1 byte. * - * Maybe types use no space at all to represent the null value and + * ‘Maybe’ types use no space at all to represent the null value and * use the same amount of space (sometimes plus one byte) as the * equivalent non-maybe-typed value to represent the non-null case. * @@ -170,39 +169,39 @@ * In the case that the dictionary is empty, 0 bytes are required for * the serialization. * - * If we add an item "width" that maps to the int32 value of 500 then - * we will use 4 byte to store the int32 (so 6 for the variant + * If we add an item ‘width’ that maps to the int32 value of 500 then + * we will use 4 bytes to store the int32 (so 6 for the variant * containing it) and 6 bytes for the string. The variant must be - * aligned to 8 after the 6 bytes of the string, so that's 2 extra + * aligned to 8 after the 6 bytes of the string, so that’s 2 extra * bytes. 6 (string) + 2 (padding) + 6 (variant) is 14 bytes used * for the dictionary entry. An additional 1 byte is added to the * array as a framing offset making a total of 15 bytes. * - * If we add another entry, "title" that maps to a nullable string + * If we add another entry, ‘title’ that maps to a nullable string * that happens to have a value of null, then we use 0 bytes for the * null value (and 3 bytes for the variant to contain it along with * its type string) plus 6 bytes for the string. Again, we need 2 * padding bytes. That makes a total of 6 + 2 + 3 = 11 bytes. * * We now require extra padding between the two items in the array. - * After the 14 bytes of the first item, that's 2 bytes required. + * After the 14 bytes of the first item, that’s 2 bytes required. * We now require 2 framing offsets for an extra two * bytes. 14 + 2 + 11 + 2 = 29 bytes to encode the entire two-item * dictionary. * * ## Type Information Cache * - * For each GVariant type that currently exists in the program a type + * For each `GVariant` type that currently exists in the program a type * information structure is kept in the type information cache. The * type information structure is required for rapid deserialization. * - * Continuing with the above example, if a #GVariant exists with the - * type "a{sv}" then a type information struct will exist for - * "a{sv}", "{sv}", "s", and "v". Multiple uses of the same type + * Continuing with the above example, if a `GVariant` exists with the + * type `a{sv}` then a type information struct will exist for + * `a{sv}`, `{sv}`, `s`, and `v`. Multiple uses of the same type * will share the same type information. Additionally, all * single-digit types are stored in read-only static memory and do * not contribute to the writable memory footprint of a program using - * #GVariant. + * `GVariant`. * * Aside from the type information structures stored in read-only * memory, there are two forms of type information. One is used for @@ -210,23 +209,23 @@ * maybe types. The other is used for container types where there * are multiple element types: tuples and dictionary entries. * - * Array type info structures are 6 * sizeof (void *), plus the + * Array type info structures are `6 * sizeof (void *)`, plus the * memory required to store the type string itself. This means that - * on 32-bit systems, the cache entry for "a{sv}" would require 30 - * bytes of memory (plus malloc overhead). + * on 32-bit systems, the cache entry for `a{sv}` would require 30 + * bytes of memory (plus allocation overhead). * - * Tuple type info structures are 6 * sizeof (void *), plus 4 * - * sizeof (void *) for each item in the tuple, plus the memory + * Tuple type info structures are `6 * sizeof (void *)`, plus `4 * + * sizeof (void *)` for each item in the tuple, plus the memory * required to store the type string itself. A 2-item tuple, for * example, would have a type information structure that consumed - * writable memory in the size of 14 * sizeof (void *) (plus type + * writable memory in the size of `14 * sizeof (void *)` (plus type * string) This means that on 32-bit systems, the cache entry for - * "{sv}" would require 61 bytes of memory (plus malloc overhead). + * `{sv}` would require 61 bytes of memory (plus allocation overhead). * - * This means that in total, for our "a{sv}" example, 91 bytes of + * This means that in total, for our `a{sv}` example, 91 bytes of * type information would be allocated. * - * The type information cache, additionally, uses a #GHashTable to + * The type information cache, additionally, uses a [struct@GLib.HashTable] to * store and look up the cached items and stores a pointer to this * hash table in static storage. The hash table is freed when there * are zero items in the type cache. @@ -238,34 +237,34 @@ * * ## Buffer Management Memory * - * #GVariant uses an internal buffer management structure to deal + * `GVariant` uses an internal buffer management structure to deal * with the various different possible sources of serialized data * that it uses. The buffer is responsible for ensuring that the * correct call is made when the data is no longer in use by - * #GVariant. This may involve a g_free() or a g_slice_free() or - * even g_mapped_file_unref(). + * `GVariant`. This may involve a [func@GLib.free] or + * even [method@GLib.MappedFile.unref]. * * One buffer management structure is used for each chunk of * serialized data. The size of the buffer management structure - * is 4 * (void *). On 32-bit systems, that's 16 bytes. + * is `4 * (void *)`. On 32-bit systems, that’s 16 bytes. * * ## GVariant structure * - * The size of a #GVariant structure is 6 * (void *). On 32-bit - * systems, that's 24 bytes. + * The size of a `GVariant` structure is `6 * (void *)`. On 32-bit + * systems, that’s 24 bytes. * - * #GVariant structures only exist if they are explicitly created - * with API calls. For example, if a #GVariant is constructed out of + * `GVariant` structures only exist if they are explicitly created + * with API calls. For example, if a `GVariant` is constructed out of * serialized data for the example given above (with the dictionary) * then although there are 9 individual values that comprise the * entire dictionary (two keys, two values, two variants containing * the values, two dictionary entries, plus the dictionary itself), - * only 1 #GVariant instance exists -- the one referring to the + * only 1 `GVariant` instance exists — the one referring to the * dictionary. * * If calls are made to start accessing the other values then - * #GVariant instances will exist for those values only for as long - * as they are in use (ie: until you call g_variant_unref()). The + * `GVariant` instances will exist for those values only for as long + * as they are in use (ie: until you call [method@GLib.Variant.unref]). The * type information is shared. The serialized data and the buffer * management structure for that serialized data is shared by the * child. @@ -276,13 +275,15 @@ * strings to variants (with two entries, as given above), we are * using 91 bytes of memory for type information, 29 bytes of memory * for the serialized data, 16 bytes for buffer management and 24 - * bytes for the #GVariant instance, or a total of 160 bytes, plus - * malloc overhead. If we were to use g_variant_get_child_value() to - * access the two dictionary entries, we would use an additional 48 + * bytes for the `GVariant` instance, or a total of 160 bytes, plus + * allocation overhead. If we were to use [method@GLib.Variant.get_child_value] + * to access the two dictionary entries, we would use an additional 48 * bytes. If we were to have other dictionaries of the same type, we * would use more memory for the serialized data and buffer * management for those dictionaries, but the type information would * be shared. + * + * Since: 2.24 */ /* definition of GVariant structure is in gvariant-core.c */ @@ -964,7 +965,7 @@ g_variant_new_dict_entry (GVariant *key, * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * This function is currently implemented with a linear scan. If you * plan to do many lookups then #GVariantDict may be more efficient. @@ -4045,7 +4046,7 @@ g_variant_dict_init (GVariantDict *dict, * * @format_string determines the C types that are used for unpacking the * values and also determines if the values are copied or borrowed, see the - * section on [GVariant format strings][gvariant-format-strings-pointers]. + * section on [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Returns: %TRUE if a value was unpacked * @@ -5505,7 +5506,7 @@ g_variant_new_va (const gchar *format_string, * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Since: 2.24 **/ @@ -5559,7 +5560,7 @@ g_variant_get (GVariant *value, * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Since: 2.24 **/ @@ -5654,7 +5655,7 @@ g_variant_builder_add (GVariantBuilder *builder, * @format_string determines the C types that are used for unpacking * the values and also determines if the values are copied or borrowed, * see the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Since: 2.24 **/ @@ -5727,7 +5728,7 @@ g_variant_get_child (GVariant *value, * the values and also determines if the values are copied or borrowed. * * See the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Returns: %TRUE if a value was unpacked, or %FALSE if there as no value * @@ -5826,7 +5827,7 @@ g_variant_iter_next (GVariantIter *iter, * the values and also determines if the values are copied or borrowed. * * See the section on - * [GVariant format strings][gvariant-format-strings-pointers]. + * [`GVariant` format strings](gvariant-format-strings.html#pointers). * * Returns: %TRUE if a value was unpacked, or %FALSE if there was no * value diff --git a/glib/gvarianttype.c b/glib/gvarianttype.c index 58a4a59..3d8c0ae 100644 --- a/glib/gvarianttype.c +++ b/glib/gvarianttype.c @@ -32,158 +32,161 @@ /** - * SECTION:gvarianttype - * @title: GVariantType - * @short_description: introduction to the GVariant type system - * @see_also: #GVariantType, #GVariant + * GVariantType: * - * This section introduces the GVariant type system. It is based, in + * A type in the [type@GLib.Variant] type system. + * + * This section introduces the [type@GLib.Variant] type system. It is based, in * large part, on the D-Bus type system, with two major changes and * some minor lifting of restrictions. The * [D-Bus specification](http://dbus.freedesktop.org/doc/dbus-specification.html), * therefore, provides a significant amount of - * information that is useful when working with GVariant. + * information that is useful when working with [type@GLib.Variant]. * * The first major change with respect to the D-Bus type system is the - * introduction of maybe (or "nullable") types. Any type in GVariant can be - * converted to a maybe type, in which case, "nothing" (or "null") becomes a - * valid value. Maybe types have been added by introducing the - * character "m" to type strings. + * introduction of maybe (or ‘nullable’) types. Any type in [type@GLib.Variant] + * can be converted to a maybe type, in which case, `nothing` (or `null`) + * becomes a valid value. Maybe types have been added by introducing the + * character `m` to type strings. * - * The second major change is that the GVariant type system supports the - * concept of "indefinite types" -- types that are less specific than + * The second major change is that the [type@GLib.Variant] type system supports + * the concept of ‘indefinite types’ — types that are less specific than * the normal types found in D-Bus. For example, it is possible to speak - * of "an array of any type" in GVariant, where the D-Bus type system - * would require you to speak of "an array of integers" or "an array of - * strings". Indefinite types have been added by introducing the - * characters "*", "?" and "r" to type strings. + * of ‘an array of any type’ in [type@GLib.Variant], where the D-Bus type system + * would require you to speak of ‘an array of integers’ or ‘an array of + * strings’. Indefinite types have been added by introducing the + * characters `*`, `?` and `r` to type strings. * * Finally, all arbitrary restrictions relating to the complexity of * types are lifted along with the restriction that dictionary entries * may only appear nested inside of arrays. * - * Just as in D-Bus, GVariant types are described with strings ("type - * strings"). Subject to the differences mentioned above, these strings + * Just as in D-Bus, [type@GLib.Variant] types are described with strings (‘type + * strings’). Subject to the differences mentioned above, these strings * are of the same form as those found in D-Bus. Note, however: D-Bus * always works in terms of messages and therefore individual type - * strings appear nowhere in its interface. Instead, "signatures" + * strings appear nowhere in its interface. Instead, ‘signatures’ * are a concatenation of the strings of the type of each argument in a - * message. GVariant deals with single values directly so GVariant type - * strings always describe the type of exactly one value. This means - * that a D-Bus signature string is generally not a valid GVariant type - * string -- except in the case that it is the signature of a message - * containing exactly one argument. + * message. [type@GLib.Variant] deals with single values directly so + * [type@GLib.Variant] type strings always describe the type of exactly one + * value. This means that a D-Bus signature string is generally not a valid + * [type@GLib.Variant] type string — except in the case that it is the signature + * of a message containing exactly one argument. * * An indefinite type is similar in spirit to what may be called an * abstract type in other type systems. No value can exist that has an * indefinite type as its type, but values can exist that have types * that are subtypes of indefinite types. That is to say, - * g_variant_get_type() will never return an indefinite type, but - * calling g_variant_is_of_type() with an indefinite type may return - * %TRUE. For example, you cannot have a value that represents "an - * array of no particular type", but you can have an "array of integers" - * which certainly matches the type of "an array of no particular type", - * since "array of integers" is a subtype of "array of no particular - * type". + * [method@GLib.Variant.get_type] will never return an indefinite type, but + * calling [method@GLib.Variant.is_of_type] with an indefinite type may return + * true. For example, you cannot have a value that represents ‘an + * array of no particular type’, but you can have an ‘array of integers’ + * which certainly matches the type of ‘an array of no particular type’, + * since ‘array of integers’ is a subtype of ‘array of no particular + * type’. * * This is similar to how instances of abstract classes may not * directly exist in other type systems, but instances of their * non-abstract subtypes may. For example, in GTK, no object that has - * the type of #GtkBin can exist (since #GtkBin is an abstract class), - * but a #GtkWindow can certainly be instantiated, and you would say - * that the #GtkWindow is a #GtkBin (since #GtkWindow is a subclass of - * #GtkBin). + * the type of [`GtkWidget`](https://docs.gtk.org/gtk4/class.Widget.html) can + * exist (since `GtkWidget` is an abstract class), but a [`GtkWindow`](https://docs.gtk.org/gtk4/class.Window.html) + * can certainly be instantiated, and you would say that a `GtkWindow` is a + * `GtkWidget` (since `GtkWindow` is a subclass of `GtkWidget`). + * + * Two types may not be compared by value; use [method@GLib.VariantType.equal] + * or [method@GLib.VariantType.is_subtype_of] May be copied using + * [method@GLib.VariantType.copy] and freed using [method@GLib.VariantType.free]. * * ## GVariant Type Strings * - * A GVariant type string can be any of the following: + * A [type@GLib.Variant] type string can be any of the following: * * - any basic type string (listed below) - * - * - "v", "r" or "*" - * - * - one of the characters 'a' or 'm', followed by another type string - * - * - the character '(', followed by a concatenation of zero or more other - * type strings, followed by the character ')' - * - * - the character '{', followed by a basic type string (see below), - * followed by another type string, followed by the character '}' + * - `v`, `r` or `*` + * - one of the characters `a` or `m`, followed by another type string + * - the character `(`, followed by a concatenation of zero or more other + * type strings, followed by the character `)` + * - the character `{`, followed by a basic type string (see below), + * followed by another type string, followed by the character `}` * * A basic type string describes a basic type (as per - * g_variant_type_is_basic()) and is always a single character in length. - * The valid basic type strings are "b", "y", "n", "q", "i", "u", "x", "t", - * "h", "d", "s", "o", "g" and "?". + * [method@GLib.VariantType.is_basic]) and is always a single character in + * length. The valid basic type strings are `b`, `y`, `n`, `q`, `i`, `u`, `x`, + * `t`, `h`, `d`, `s`, `o`, `g` and `?`. * - * The above definition is recursive to arbitrary depth. "aaaaai" and - * "(ui(nq((y)))s)" are both valid type strings, as is - * "a(aa(ui)(qna{ya(yd)}))". In order to not hit memory limits, #GVariant - * imposes a limit on recursion depth of 65 nested containers. This is the - * limit in the D-Bus specification (64) plus one to allow a #GDBusMessage to - * be nested in a top-level tuple. + * The above definition is recursive to arbitrary depth. `aaaaai` and + * `(ui(nq((y)))s)` are both valid type strings, as is + * `a(aa(ui)(qna{ya(yd)}))`. In order to not hit memory limits, + * [type@GLib.Variant] imposes a limit on recursion depth of 65 nested + * containers. This is the limit in the D-Bus specification (64) plus one to + * allow a [`GDBusMessage`](../gio/class.DBusMessage.html) to be nested in + * a top-level tuple. * * The meaning of each of the characters is as follows: - * - `b`: the type string of %G_VARIANT_TYPE_BOOLEAN; a boolean value. - * - `y`: the type string of %G_VARIANT_TYPE_BYTE; a byte. - * - `n`: the type string of %G_VARIANT_TYPE_INT16; a signed 16 bit integer. - * - `q`: the type string of %G_VARIANT_TYPE_UINT16; an unsigned 16 bit integer. - * - `i`: the type string of %G_VARIANT_TYPE_INT32; a signed 32 bit integer. - * - `u`: the type string of %G_VARIANT_TYPE_UINT32; an unsigned 32 bit integer. - * - `x`: the type string of %G_VARIANT_TYPE_INT64; a signed 64 bit integer. - * - `t`: the type string of %G_VARIANT_TYPE_UINT64; an unsigned 64 bit integer. - * - `h`: the type string of %G_VARIANT_TYPE_HANDLE; a signed 32 bit value + * + * - `b`: the type string of `G_VARIANT_TYPE_BOOLEAN`; a boolean value. + * - `y`: the type string of `G_VARIANT_TYPE_BYTE`; a byte. + * - `n`: the type string of `G_VARIANT_TYPE_INT16`; a signed 16 bit integer. + * - `q`: the type string of `G_VARIANT_TYPE_UINT16`; an unsigned 16 bit integer. + * - `i`: the type string of `G_VARIANT_TYPE_INT32`; a signed 32 bit integer. + * - `u`: the type string of `G_VARIANT_TYPE_UINT32`; an unsigned 32 bit integer. + * - `x`: the type string of `G_VARIANT_TYPE_INT64`; a signed 64 bit integer. + * - `t`: the type string of `G_VARIANT_TYPE_UINT64`; an unsigned 64 bit integer. + * - `h`: the type string of `G_VARIANT_TYPE_HANDLE`; a signed 32 bit value * that, by convention, is used as an index into an array of file * descriptors that are sent alongside a D-Bus message. - * - `d`: the type string of %G_VARIANT_TYPE_DOUBLE; a double precision + * - `d`: the type string of `G_VARIANT_TYPE_DOUBLE`; a double precision * floating point value. - * - `s`: the type string of %G_VARIANT_TYPE_STRING; a string. - * - `o`: the type string of %G_VARIANT_TYPE_OBJECT_PATH; a string in the form + * - `s`: the type string of `G_VARIANT_TYPE_STRING`; a string. + * - `o`: the type string of `G_VARIANT_TYPE_OBJECT_PATH`; a string in the form * of a D-Bus object path. - * - `g`: the type string of %G_VARIANT_TYPE_SIGNATURE; a string in the form of + * - `g`: the type string of `G_VARIANT_TYPE_SIGNATURE`; a string in the form of * a D-Bus type signature. - * - `?`: the type string of %G_VARIANT_TYPE_BASIC; an indefinite type that + * - `?`: the type string of `G_VARIANT_TYPE_BASIC`; an indefinite type that * is a supertype of any of the basic types. - * - `v`: the type string of %G_VARIANT_TYPE_VARIANT; a container type that + * - `v`: the type string of `G_VARIANT_TYPE_VARIANT`; a container type that * contain any other type of value. * - `a`: used as a prefix on another type string to mean an array of that - * type; the type string "ai", for example, is the type of an array of + * type; the type string `ai`, for example, is the type of an array of * signed 32-bit integers. - * - `m`: used as a prefix on another type string to mean a "maybe", or - * "nullable", version of that type; the type string "ms", for example, + * - `m`: used as a prefix on another type string to mean a ‘maybe’, or + * ‘nullable’, version of that type; the type string `ms`, for example, * is the type of a value that maybe contains a string, or maybe contains * nothing. * - `()`: used to enclose zero or more other concatenated type strings to - * create a tuple type; the type string "(is)", for example, is the type of + * create a tuple type; the type string `(is)`, for example, is the type of * a pair of an integer and a string. - * - `r`: the type string of %G_VARIANT_TYPE_TUPLE; an indefinite type that is + * - `r`: the type string of `G_VARIANT_TYPE_TUPLE`; an indefinite type that is * a supertype of any tuple type, regardless of the number of items. * - `{}`: used to enclose a basic type string concatenated with another type * string to create a dictionary entry type, which usually appears inside of - * an array to form a dictionary; the type string "a{sd}", for example, is + * an array to form a dictionary; the type string `a{sd}`, for example, is * the type of a dictionary that maps strings to double precision floating * point values. * * The first type (the basic type) is the key type and the second type is * the value type. The reason that the first type is restricted to being a * basic type is so that it can easily be hashed. - * - `*`: the type string of %G_VARIANT_TYPE_ANY; the indefinite type that is + * - `*`: the type string of `G_VARIANT_TYPE_ANY`; the indefinite type that is * a supertype of all types. Note that, as with all type strings, this * character represents exactly one type. It cannot be used inside of tuples - * to mean "any number of items". + * to mean ‘any number of items’. * * Any type string of a container that contains an indefinite type is, - * itself, an indefinite type. For example, the type string "a*" - * (corresponding to %G_VARIANT_TYPE_ARRAY) is an indefinite type - * that is a supertype of every array type. "(*s)" is a supertype + * itself, an indefinite type. For example, the type string `a*` + * (corresponding to `G_VARIANT_TYPE_ARRAY`) is an indefinite type + * that is a supertype of every array type. `(*s)` is a supertype * of all tuples that contain exactly two items where the second * item is a string. * - * "a{?*}" is an indefinite type that is a supertype of all arrays + * `a{?*}` is an indefinite type that is a supertype of all arrays * containing dictionary entries where the key is any basic type and * the value is any type at all. This is, by definition, a dictionary, - * so this type string corresponds to %G_VARIANT_TYPE_DICTIONARY. Note + * so this type string corresponds to `G_VARIANT_TYPE_DICTIONARY`. Note * that, due to the restriction that the key of a dictionary entry must - * be a basic type, "{**}" is not a valid type string. + * be a basic type, `{**}` is not a valid type string. + * + * Since: 2.24 */ diff --git a/glib/gvarianttype.h b/glib/gvarianttype.h index 6374957..0fc751b 100644 --- a/glib/gvarianttype.h +++ b/glib/gvarianttype.h @@ -31,15 +31,6 @@ G_BEGIN_DECLS -/** - * GVariantType: - * - * A type in the GVariant type system. - * - * Two types may not be compared by value; use g_variant_type_equal() or - * g_variant_type_is_subtype_of(). May be copied using - * g_variant_type_copy() and freed using g_variant_type_free(). - **/ typedef struct _GVariantType GVariantType; /** @@ -375,7 +366,7 @@ GVariantType * g_variant_type_new_dict_entry (const G /*< private >*/ GLIB_AVAILABLE_IN_ALL -const GVariantType * g_variant_type_checked_ (const gchar *); +const GVariantType * g_variant_type_checked_ (const gchar *type_string); GLIB_AVAILABLE_IN_2_60 gsize g_variant_type_string_get_depth_ (const gchar *type_string); diff --git a/glib/gversion.c b/glib/gversion.c index b12929b..ade16fc 100644 --- a/glib/gversion.c +++ b/glib/gversion.c @@ -28,28 +28,6 @@ #include "gversion.h" -/** - * SECTION:version - * @Title: Version Information - * @Short_description: variables and functions to check the GLib version - * - * GLib provides version information, primarily useful in configure - * checks for builds that have a configure script. Applications will - * not typically use the features described here. - * - * The GLib headers annotate deprecated APIs in a way that produces - * compiler warnings if these deprecated APIs are used. The warnings - * can be turned off by defining the macro %GLIB_DISABLE_DEPRECATION_WARNINGS - * before including the glib.h header. - * - * GLib also provides support for building applications against - * defined subsets of deprecated or new GLib APIs. Define the macro - * %GLIB_VERSION_MIN_REQUIRED to specify up to what version of GLib - * you want to receive warnings about deprecated APIs. Define the - * macro %GLIB_VERSION_MAX_ALLOWED to specify the newest version of - * GLib whose API you want to use. - */ - /** * glib_major_version: * diff --git a/glib/gwakeup.c b/glib/gwakeup.c index 6ce401e..8208042 100644 --- a/glib/gwakeup.c +++ b/glib/gwakeup.c @@ -38,11 +38,9 @@ #include "gwakeup.h" /*< private > - * SECTION:gwakeup - * @title: GWakeup - * @short_description: portable cross-thread event signal mechanism + * GWakeup: * - * #GWakeup is a simple and portable way of signaling events between + * `GWakeup` is a simple and portable way of signaling events between * different threads in a way that integrates nicely with g_poll(). * GLib uses it internally for cross-thread signalling in the * implementation of #GMainContext and #GCancellable. @@ -59,7 +57,7 @@ * is implemented with a pair of pipes. * * Since: 2.30 - **/ + */ #ifdef _WIN32 #include @@ -124,7 +122,7 @@ struct _GWakeup gint fds[2]; }; -/** +/*< private > * g_wakeup_new: * * Creates a new #GWakeup. @@ -170,7 +168,7 @@ g_wakeup_new (void) return wakeup; } -/** +/*< private > * g_wakeup_get_pollfd: * @wakeup: a #GWakeup * @poll_fd: a #GPollFD @@ -190,7 +188,7 @@ g_wakeup_get_pollfd (GWakeup *wakeup, poll_fd->events = G_IO_IN; } -/** +/*< private > * g_wakeup_acknowledge: * @wakeup: a #GWakeup * @@ -229,7 +227,7 @@ g_wakeup_acknowledge (GWakeup *wakeup) } } -/** +/*< private > * g_wakeup_signal: * @wakeup: a #GWakeup * @@ -270,7 +268,7 @@ g_wakeup_signal (GWakeup *wakeup) } } -/** +/*< private > * g_wakeup_free: * @wakeup: a #GWakeup * diff --git a/glib/meson.build b/glib/meson.build index c26a35e..d2efeba 100644 --- a/glib/meson.build +++ b/glib/meson.build @@ -145,19 +145,19 @@ endif glib_headers = files( 'glib.h', - 'glib-unix.h', 'glib-object.h', ) install_headers(glib_headers, install_dir : glib_includedir) +if host_system != 'windows' + glib_unix_headers = files('glib-unix.h') + install_headers(glib_unix_headers, install_dir : glib_includedir) +endif + if host_system == 'windows' install_headers([ 'msvc_recommended_pragmas.h' ], install_dir : glib_includedir) endif -# Expose as variable to be used by gobject-introspection -# when it includes GLib as a subproject -glib_unix_h = files('glib-unix.h') - glib_deprecated_headers = files( 'deprecated/gallocator.h', 'deprecated/gcache.h', @@ -247,13 +247,17 @@ glib_sub_headers = files( 'gvarianttype.h', 'gvariant.h', 'gversion.h', - 'gwin32.h', 'gprintf.h', ) install_headers(glib_sub_headers, install_dir : glib_sub_includedir) -deprecated_sources = files( +if host_system == 'windows' + glib_win32_headers = files('gwin32.h') + install_headers(glib_win32_headers, install_dir : glib_sub_includedir) +endif + +glib_deprecated_sources = files( 'deprecated/gallocator.c', 'deprecated/gcache.c', 'deprecated/gcompletion.c', @@ -277,6 +281,7 @@ glib_sources += files( 'gdataset.c', 'gdate.c', 'gdatetime.c', + 'gdatetime-private.c', 'gdir.c', 'genviron.c', 'gerror.c', @@ -326,7 +331,6 @@ glib_sources += files( 'gtimer.c', 'gtimezone.c', 'gtrace.c', - 'gtrace-private.h', 'gtranslit.c', 'gtrashstack.c', 'gtree.c', @@ -336,9 +340,7 @@ glib_sources += files( 'gunicollate.c', 'gunidecomp.c', 'guri.c', - 'guriprivate.h', 'gutils.c', - 'gutilsprivate.h', 'guuid.c', 'gvariant.c', 'gvariant-core.c', @@ -369,7 +371,7 @@ if host_system == 'windows' glib_sources += files('dirent/wdirent.c') endif else - glib_sources += files('glib-unix.c', 'glib-unixprivate.h', 'gspawn.c', 'giounix.c') + glib_sources += files('glib-unix.c', 'gspawn.c', 'giounix.c') platform_deps = [] endif @@ -407,7 +409,7 @@ endif glib_c_args = ['-DG_LOG_DOMAIN="GLib"'] + glib_c_args_internal + pcre2_static_args libglib = library('glib-2.0', glib_dtrace_obj, glib_dtrace_hdr, - sources : [deprecated_sources, glib_sources], + sources : [glib_deprecated_sources, glib_sources], version : library_version, soversion : soversion, darwin_versions : darwin_versions, @@ -445,8 +447,6 @@ pkg.generate(libglib, subdirs : ['glib-2.0'], extra_cflags : ['-I${libdir}/glib-2.0/include'] + win32_cflags, variables : [ - 'bindir=' + '${prefix}' / get_option('bindir'), - 'datadir=' + '${prefix}' / get_option('datadir'), 'glib_genmarshal=' + '${bindir}' / 'glib-genmarshal', 'gobject_query=' + '${bindir}' / 'gobject-query', 'glib_mkenums=' + '${bindir}' / 'glib-mkenums', diff --git a/glib/tests/1bit-mutex.c b/glib/tests/1bit-mutex.c index 607e3b1..f6a90f0 100644 --- a/glib/tests/1bit-mutex.c +++ b/glib/tests/1bit-mutex.c @@ -41,15 +41,20 @@ defining our own version of the g_bit_*lock symbols */ #undef g_pointer_bit_lock + #undef g_pointer_bit_lock_and_get #undef g_pointer_bit_trylock #undef g_pointer_bit_unlock + #undef g_pointer_bit_unlock_and_set - #define g_bit_lock _emufutex_g_bit_lock - #define g_bit_trylock _emufutex_g_bit_trylock - #define g_bit_unlock _emufutex_g_bit_unlock - #define g_pointer_bit_lock _emufutex_g_pointer_bit_lock - #define g_pointer_bit_trylock _emufutex_g_pointer_bit_trylock - #define g_pointer_bit_unlock _emufutex_g_pointer_bit_unlock + #define g_bit_lock _emufutex_g_bit_lock + #define g_bit_trylock _emufutex_g_bit_trylock + #define g_bit_unlock _emufutex_g_bit_unlock + #define g_pointer_bit_lock _emufutex_g_pointer_bit_lock + #define g_pointer_bit_lock_and_get _emufutex_g_pointer_bit_lock_and_get + #define g_pointer_bit_trylock _emufutex_g_pointer_bit_trylock + #define g_pointer_bit_unlock _emufutex_g_pointer_bit_unlock + #define g_pointer_bit_lock_mask_ptr _emufutex_g_pointer_bit_lock_mask_ptr + #define g_pointer_bit_unlock_and_set _emufutex_g_pointer_bit_unlock_and_set #define G_BIT_LOCK_FORCE_FUTEX_EMULATION diff --git a/glib/tests/array-test.c b/glib/tests/array-test.c index da6cb29..70f56e8 100644 --- a/glib/tests/array-test.c +++ b/glib/tests/array-test.c @@ -2202,7 +2202,7 @@ pointer_array_extend_and_steal (void) GPtrArray *ptr_array, *ptr_array2, *ptr_array3; gsize i; const gsize array_size = 100; - gsize *array_test = g_malloc (array_size * sizeof (gsize)); + guintptr *array_test = g_malloc (array_size * sizeof (guintptr)); /* Initializing array_test */ for (i = 0; i < array_size; i++) @@ -2221,7 +2221,7 @@ pointer_array_extend_and_steal (void) g_ptr_array_extend_and_steal (ptr_array, ptr_array2); for (i = 0; i < array_size; i++) - g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array, i)), ==, i); + g_assert_cmpuint (*((guintptr *) g_ptr_array_index (ptr_array, i)), ==, i); g_ptr_array_free (ptr_array, TRUE); @@ -2240,7 +2240,7 @@ pointer_array_extend_and_steal (void) g_ptr_array_extend_and_steal (ptr_array, ptr_array2); for (i = 0; i < array_size; i++) - g_assert_cmpuint (*((gsize *) g_ptr_array_index (ptr_array, i)), ==, i); + g_assert_cmpuint (*((guintptr *) g_ptr_array_index (ptr_array, i)), ==, i); g_assert_cmpuint (ptr_array3->len, ==, 0); g_assert_null (ptr_array3->pdata); diff --git a/glib/tests/atomic.c b/glib/tests/atomic.c index 614d5aa..9d57d21 100644 --- a/glib/tests/atomic.c +++ b/glib/tests/atomic.c @@ -31,7 +31,7 @@ test_types (void) const char *str = "Hello"; const char *old_str; int *ip, *ip2; - gsize gs, gs2; + guintptr gu, gu2; gboolean res; csp = &s; @@ -158,36 +158,36 @@ test_types (void) res = g_atomic_pointer_compare_and_exchange_full (&ip, NULL, &s, &ip2); g_assert_true (res); g_assert_true (ip == &s); - g_assert_cmpuint ((gsize) ip2, ==, 0); + g_assert_cmpuint ((guintptr) ip2, ==, 0); res = g_atomic_pointer_compare_and_exchange_full (&ip, NULL, NULL, &ip2); g_assert_false (res); g_assert_true (ip == &s); g_assert_true (ip2 == &s); - g_atomic_pointer_set (&gs, 0); - vp2 = (gpointer) g_atomic_pointer_get (&gs); - gs2 = (gsize) vp2; - g_assert_cmpuint (gs2, ==, 0); - res = g_atomic_pointer_compare_and_exchange (&gs, NULL, (gsize) NULL); + g_atomic_pointer_set (&gu, 0); + vp2 = (gpointer) g_atomic_pointer_get (&gu); + gu2 = (guintptr) vp2; + g_assert_cmpuint (gu2, ==, 0); + res = g_atomic_pointer_compare_and_exchange (&gu, NULL, (guintptr) NULL); g_assert_true (res); - g_assert_cmpuint (gs, ==, 0); - res = g_atomic_pointer_compare_and_exchange_full (&gs, (gsize) NULL, (gsize) NULL, &gs2); + g_assert_cmpuint (gu, ==, 0); + res = g_atomic_pointer_compare_and_exchange_full (&gu, (guintptr) NULL, (guintptr) NULL, &gu2); g_assert_true (res); - g_assert_cmpuint (gs, ==, 0); - g_assert_cmpuint (gs2, ==, 0); - gs2 = (gsize) g_atomic_pointer_add (&gs, 5); - g_assert_cmpuint (gs2, ==, 0); - g_assert_cmpuint (gs, ==, 5); - gs2 = g_atomic_pointer_and (&gs, 6); - g_assert_cmpuint (gs2, ==, 5); - g_assert_cmpuint (gs, ==, 4); - gs2 = g_atomic_pointer_or (&gs, 8); - g_assert_cmpuint (gs2, ==, 4); - g_assert_cmpuint (gs, ==, 12); - gs2 = g_atomic_pointer_xor (&gs, 4); - g_assert_cmpuint (gs2, ==, 12); - g_assert_cmpuint (gs, ==, 8); + g_assert_cmpuint (gu, ==, 0); + g_assert_cmpuint (gu2, ==, 0); + gu2 = (guintptr) g_atomic_pointer_add (&gu, 5); + g_assert_cmpuint (gu2, ==, 0); + g_assert_cmpuint (gu, ==, 5); + gu2 = g_atomic_pointer_and (&gu, 6); + g_assert_cmpuint (gu2, ==, 5); + g_assert_cmpuint (gu, ==, 4); + gu2 = g_atomic_pointer_or (&gu, 8); + g_assert_cmpuint (gu2, ==, 4); + g_assert_cmpuint (gu, ==, 12); + gu2 = g_atomic_pointer_xor (&gu, 4); + g_assert_cmpuint (gu2, ==, 12); + g_assert_cmpuint (gu, ==, 8); vp_str2 = g_atomic_pointer_exchange (&vp_str, str); g_assert_cmpstr (vp_str, ==, str); g_assert_null (vp_str2); @@ -340,41 +340,41 @@ G_GNUC_END_IGNORE_DEPRECATIONS res = g_atomic_pointer_compare_and_exchange_full (&ip, NULL, (gpointer) 1, &cp); g_assert_true (res); - g_assert_cmpint ((gsize) ip, ==, 1); - g_assert_cmpuint ((gsize) cp, ==, 0); + g_assert_cmpint ((guintptr) ip, ==, 1); + g_assert_cmpuint ((guintptr) cp, ==, 0); res = g_atomic_pointer_compare_and_exchange_full (&ip, NULL, NULL, &cp); g_assert_false (res); - g_assert_cmpuint ((gsize) ip, ==, 1); - g_assert_cmpuint ((gsize) cp, ==, 1); + g_assert_cmpuint ((guintptr) ip, ==, 1); + g_assert_cmpuint ((guintptr) cp, ==, 1); - g_atomic_pointer_set (&gs, 0); - vp = g_atomic_pointer_get (&gs); - gs2 = (gsize) vp; - g_assert_cmpuint (gs2, ==, 0); - res = g_atomic_pointer_compare_and_exchange (&gs, NULL, NULL); + g_atomic_pointer_set (&gu, 0); + vp = g_atomic_pointer_get (&gu); + gu2 = (guintptr) vp; + g_assert_cmpuint (gu2, ==, 0); + res = g_atomic_pointer_compare_and_exchange (&gu, NULL, NULL); g_assert_true (res); - g_assert_cmpuint (gs, ==, 0); - res = g_atomic_pointer_compare_and_exchange_full (&gs, NULL, NULL, &cp); + g_assert_cmpuint (gu, ==, 0); + res = g_atomic_pointer_compare_and_exchange_full (&gu, NULL, NULL, &cp); g_assert_true (res); - g_assert_cmpuint (gs, ==, 0); - g_assert_cmpuint ((gsize) cp, ==, 0); - gs2 = (gsize) g_atomic_pointer_add (&gs, 5); - g_assert_cmpuint (gs2, ==, 0); - g_assert_cmpuint (gs, ==, 5); - gs2 = g_atomic_pointer_and (&gs, 6); - g_assert_cmpuint (gs2, ==, 5); - g_assert_cmpuint (gs, ==, 4); - gs2 = g_atomic_pointer_or (&gs, 8); - g_assert_cmpuint (gs2, ==, 4); - g_assert_cmpuint (gs, ==, 12); - gs2 = g_atomic_pointer_xor (&gs, 4); - g_assert_cmpuint (gs2, ==, 12); - g_assert_cmpuint (gs, ==, 8); - vp2 = g_atomic_pointer_exchange (&gs, NULL); - gs2 = (gsize) vp2; - g_assert_cmpuint (gs2, ==, 8); - g_assert_null ((gpointer) gs); + g_assert_cmpuint (gu, ==, 0); + g_assert_cmpuint ((guintptr) cp, ==, 0); + gu2 = (guintptr) g_atomic_pointer_add (&gu, 5); + g_assert_cmpuint (gu2, ==, 0); + g_assert_cmpuint (gu, ==, 5); + gu2 = g_atomic_pointer_and (&gu, 6); + g_assert_cmpuint (gu2, ==, 5); + g_assert_cmpuint (gu, ==, 4); + gu2 = g_atomic_pointer_or (&gu, 8); + g_assert_cmpuint (gu2, ==, 4); + g_assert_cmpuint (gu, ==, 12); + gu2 = g_atomic_pointer_xor (&gu, 4); + g_assert_cmpuint (gu2, ==, 12); + g_assert_cmpuint (gu, ==, 8); + vp2 = g_atomic_pointer_exchange (&gu, NULL); + gu2 = (guintptr) vp2; + g_assert_cmpuint (gu2, ==, 8); + g_assert_null ((gpointer) gu); g_assert_cmpint (g_atomic_int_get (csp), ==, s); g_assert_true (g_atomic_pointer_get (cspp) == csp); diff --git a/glib/tests/autoptr.c b/glib/tests/autoptr.c index e10c95c..4ed27f5 100644 --- a/glib/tests/autoptr.c +++ b/glib/tests/autoptr.c @@ -399,6 +399,12 @@ test_g_mutex_locker (void) g_mutex_init (&mutex); + if (TRUE) + { + /* val is unused in this scope but compiler should not warn. */ + G_MUTEX_AUTO_LOCK (&mutex, val); + } + if (TRUE) { g_autoptr(GMutexLocker) val = g_mutex_locker_new (&mutex); @@ -442,6 +448,12 @@ test_g_rec_mutex_locker (void) g_rec_mutex_init (&rec_mutex); + if (TRUE) + { + /* val is unused in this scope but compiler should not warn. */ + G_REC_MUTEX_AUTO_LOCK (&rec_mutex, val); + } + if (TRUE) { g_autoptr(GRecMutexLocker) val = g_rec_mutex_locker_new (&rec_mutex); @@ -492,6 +504,18 @@ test_g_rw_lock_lockers (void) g_rw_lock_init (&lock); + if (TRUE) + { + /* val is unused in this scope but compiler should not warn. */ + G_RW_LOCK_WRITER_AUTO_LOCK (&lock, val); + } + + if (TRUE) + { + /* val is unused in this scope but compiler should not warn. */ + G_RW_LOCK_READER_AUTO_LOCK (&lock, val); + } + if (TRUE) { g_autoptr(GRWLockWriterLocker) val = g_rw_lock_writer_locker_new (&lock); @@ -533,6 +557,27 @@ test_g_rw_lock_lockers (void) g_rw_lock_clear (&lock); } +G_LOCK_DEFINE (test_g_auto_lock); + +static void +test_g_auto_lock (void) +{ + GThread *thread; + + if (TRUE) + { + G_AUTO_LOCK (test_g_auto_lock); + + /* Verify that the mutex is actually locked */ + thread = g_thread_new ("mutex locked", mutex_locked_thread, &G_LOCK_NAME (test_g_auto_lock)); + g_thread_join (thread); + } + + /* Verify that the mutex is unlocked again */ + thread = g_thread_new ("mutex unlocked", mutex_unlocked_thread, &G_LOCK_NAME (test_g_auto_lock)); + g_thread_join (thread); +} + static void test_g_cond (void) { @@ -785,6 +830,7 @@ main (int argc, gchar *argv[]) g_test_add_func ("/autoptr/g_mutex_locker", test_g_mutex_locker); g_test_add_func ("/autoptr/g_rec_mutex_locker", test_g_rec_mutex_locker); g_test_add_func ("/autoptr/g_rw_lock_lockers", test_g_rw_lock_lockers); + g_test_add_func ("/autoptr/g_auto_lock", test_g_auto_lock); g_test_add_func ("/autoptr/g_cond", test_g_cond); g_test_add_func ("/autoptr/g_timer", test_g_timer); g_test_add_func ("/autoptr/g_time_zone", test_g_time_zone); diff --git a/glib/tests/casefold.txt b/glib/tests/casefold.txt index bcfa515..c9fa68b 100644 --- a/glib/tests/casefold.txt +++ b/glib/tests/casefold.txt @@ -1,4 +1,4 @@ -# Test cases generated from Unicode 15.0.0 data +# Test cases generated from Unicode 15.1.0 data # by gen-casefold-txt.py. Do not edit. # # Some special hand crafted tests diff --git a/glib/tests/casemap.txt b/glib/tests/casemap.txt index b4dce7b..6fe7020 100644 --- a/glib/tests/casemap.txt +++ b/glib/tests/casemap.txt @@ -1,4 +1,4 @@ -# Test cases generated from Unicode 15.0.0 data +# Test cases generated from Unicode 15.1.0 data # by gen-casemap-txt.py. Do not edit. # # Some special hand crafted tests diff --git a/glib/tests/constructor-helper.c b/glib/tests/constructor-helper.c new file mode 100644 index 0000000..33e2c7d --- /dev/null +++ b/glib/tests/constructor-helper.c @@ -0,0 +1,239 @@ +/* constructor-helpers.c - Helper library for the constructor test + * + * Copyright © 2023 Luca Bacci + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +/* This helper library manages a set of strings. Strings can be added, + * removed and checked for presence. This library does not call into + * libc, so can be used from module constructors in a safe manner on + * a wide range of operating systems. + * + * GLib is used only for assertions or hard errors; in such cases we + * don't really care about supported libc calls, as the test ought to + * fail anyway. + */ + +#include /* for size_t */ + +#include + +#if defined (_MSC_VER) +# pragma optimize ("", off) +#else +# if defined (__clang__) +# pragma clang optimize off +# elif defined (__GNUC__) +# pragma GCC optimize ("O0") +# endif +#endif + +#if defined(_WIN32) + #define MODULE_EXPORT \ + __declspec (dllexport) +#elif defined (__GNUC__) + #define MODULE_EXPORT \ + __attribute__((visibility("default"))) +#else + #define MODULE_EXPORT +#endif + +char buffer[500]; +size_t position; + +MODULE_EXPORT +void string_add (const char *string); + +MODULE_EXPORT +void string_add_exclusive (const char *string); + +MODULE_EXPORT +int string_remove (const char *string); + +MODULE_EXPORT +int string_find (const char *string); + +MODULE_EXPORT +void string_check (const char *string); + +static size_t +strlen_ (const char *string) +{ + size_t i = 0; + + g_assert_nonnull (string); + + while (string[i] != 0) + i++; + + return i; +} + +static void +memmove_ (char *buf, + size_t from, + size_t size, + size_t to) +{ + g_assert_true (to <= from); + + for (size_t i = 0; i < size; i++) + buffer[to + i] = buffer[from + i]; +} + +static void +memcpy_ (char *dst, + const char *src, + size_t size) +{ + for (size_t i = 0; i < size; i++) + dst[i] = src[i]; +} + +static void +memset_ (char *dst, + char val, + size_t size) +{ + for (size_t i = 0; i < size; i++) + dst[i] = val; +} + +static size_t +string_find_index_ (const char *string) +{ + size_t string_len; + size_t i = 0; + + g_assert_nonnull (string); + g_assert_true ((string_len = strlen_ (string)) > 0); + + for (i = 0; (i < sizeof (buffer) - position) && (buffer[i] != 0);) + { + const char *iter = &buffer[i]; + size_t len = strlen_ (iter); + + if (len == string_len && strcmp (iter, string) == 0) + return i; + + i += len + 1; + } + + return sizeof (buffer); +} + +/**< private > + * string_add: + * + * @string: NULL-terminated string. Must not be empty + * + * Adds @string to the set + */ +MODULE_EXPORT +void +string_add (const char *string) +{ + size_t len, size; + + g_assert_nonnull (string); + g_assert_true ((len = strlen_ (string)) > 0); + + size = len + 1; + + if (size > sizeof (buffer) - position) + g_error ("Not enough space in the buffer"); + + memcpy_ (buffer + position, string, size); + + position += size; +} + +/**< private > + * string_add_exclusive: + * + * @string: NULL-terminated string. Must not be empty + * + * Adds @string to the set, asserting that it's not already present. + */ +MODULE_EXPORT +void +string_add_exclusive (const char *string) +{ + if (string_find_index_ (string) < sizeof (buffer)) + g_error ("string %s already set", string); + + string_add (string); +} + +/**< private > + * string_remove: + * + * @string: NULL-terminated string. Must not be empty + * + * Removes the first occurrence of @string from the set. + * + * Returns: 1 if the string was removed, 0 otherwise. + */ +MODULE_EXPORT +int +string_remove (const char *string) +{ + size_t index = string_find_index_ (string); + size_t len, size; + + if (index >= sizeof (buffer)) + return 0; + + g_assert_true ((len = strlen_ (string)) > 0); + size = len + 1; + + memmove_ (buffer, index + size, index, position - (index + size)); + + position -= size; + + memset_ (buffer + position, 0, size); + + return 1; +} + +/**< private > + * string_find: + * + * @string: NULL-terminated string. Must not be empty + * + * Returns 1 if the string is present, 0 otherwise + */ +MODULE_EXPORT +int string_find (const char *string) +{ + return string_find_index_ (string) < sizeof (buffer); +} + +/**< private > + * string_check: + * + * @string: NULL-terminated string. Must not be empty + * + * Asserts that @string is present in the set + */ +MODULE_EXPORT +void +string_check (const char *string) +{ + if (string_find_index_ (string) >= sizeof (buffer)) + g_error ("String %s not present", string); +} diff --git a/glib/tests/constructor.c b/glib/tests/constructor.c new file mode 100644 index 0000000..001d754 --- /dev/null +++ b/glib/tests/constructor.c @@ -0,0 +1,260 @@ +/* constructor.c - Test for constructors + * + * Copyright © 2023 Luca Bacci + * + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * 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.1 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, see . + */ + +#include +#include "../gconstructorprivate.h" + +#ifndef _WIN32 +#include +#else +#include +#endif + +#if defined(_WIN32) + #define MODULE_IMPORT \ + __declspec (dllimport) +#else + #define MODULE_IMPORT +#endif + +MODULE_IMPORT +void string_add_exclusive (const char *string); + +MODULE_IMPORT +void string_check (const char *string); + +MODULE_IMPORT +int string_find (const char *string); + +#if G_HAS_CONSTRUCTORS + +#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS (ctor) +#endif + +G_DEFINE_CONSTRUCTOR (ctor) + +static void +ctor (void) +{ + string_add_exclusive (G_STRINGIFY (PREFIX) "_" "ctor"); +} + +#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA +#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS (dtor) +#endif + +G_DEFINE_DESTRUCTOR (dtor) + +static void +dtor (void) +{ + string_add_exclusive (G_STRINGIFY (PREFIX) "_" "dtor"); + + if (string_find ("app_dtor") && string_find ("lib_dtor")) + { + /* All destructors were invoked, this is the last. + * Call _Exit (EXIT_SUCCESS) to exit immediately + * with a success code */ + _Exit (EXIT_SUCCESS); + } +} + +#endif /* G_HAS_CONSTRUCTORS */ + + +#if defined (_WIN32) && defined (G_HAS_TLS_CALLBACKS) + +extern IMAGE_DOS_HEADER __ImageBase; + +static inline HMODULE +this_module (void) +{ + return (HMODULE) &__ImageBase; +} + +G_DEFINE_TLS_CALLBACK (tls_callback) + +static void NTAPI +tls_callback (PVOID hInstance, + DWORD dwReason, + LPVOID lpvReserved) +{ + /* The HINSTANCE we get must match the address of __ImageBase */ + g_assert_true (hInstance == this_module ()); + +#ifdef BUILD_TEST_EXECUTABLE + /* Yes, we can call GetModuleHandle (NULL) with the loader lock */ + g_assert_true (hInstance == GetModuleHandle (NULL)); +#endif + + switch (dwReason) + { + case DLL_PROCESS_ATTACH: + { +#ifndef BUILD_TEST_EXECUTABLE + /* the library is explicitly loaded */ + g_assert_null (lpvReserved); +#endif + string_add_exclusive (G_STRINGIFY (PREFIX) "_" "tlscb_process_attach"); + } + break; + + case DLL_THREAD_ATTACH: + break; + + case DLL_THREAD_DETACH: + break; + + case DLL_PROCESS_DETACH: + { +#ifndef BUILD_TEST_EXECUTABLE + /* the library is explicitly unloaded */ + g_assert_null (lpvReserved); +#endif + string_add_exclusive (G_STRINGIFY (PREFIX) "_" "tlscb_process_detach"); + } + break; + + default: + g_assert_not_reached (); + break; + } +} + +#endif /* _WIN32 && G_HAS_TLS_CALLBACKS */ + +#ifdef BUILD_TEST_EXECUTABLE + +void *library; + +static void +load_library (const char *path) +{ +#ifndef _WIN32 + library = dlopen (path, RTLD_NOW); + if (!library) + { + g_error ("%s (%s) failed: %s", "dlopen", path, dlerror ()); + } +#else + wchar_t *path_utf16 = g_utf8_to_utf16 (path, -1, NULL, NULL, NULL); + g_assert_nonnull (path_utf16); + + library = LoadLibraryW (path_utf16); + if (!library) + { + g_error ("%s (%s) failed with error code %u", + "FreeLibrary", path, (unsigned int) GetLastError ()); + } + + g_free (path_utf16); +#endif +} + +static void +unload_library (void) +{ +#ifndef _WIN32 + if (dlclose (library) != 0) + { + g_error ("%s failed: %s", "dlclose", dlerror ()); + } +#else + if (!FreeLibrary (library)) + { + g_error ("%s failed with error code %u", + "FreeLibrary", (unsigned int) GetLastError ()); + } +#endif +} + +static void +test_app (void) +{ +#if G_HAS_CONSTRUCTORS + string_check ("app_" "ctor"); +#endif +#if defined (_WIN32) && defined (G_HAS_TLS_CALLBACKS) + string_check ("app_" "tlscb_process_attach"); +#endif +} + +static void +test_lib (gconstpointer data) +{ + const char *library_path = (const char*) data; + + /* Constructors */ + load_library (library_path); + +#if G_HAS_CONSTRUCTORS + string_check ("lib_" "ctor"); +#endif +#if defined (_WIN32) && defined (G_HAS_TLS_CALLBACKS) + string_check ("lib_" "tlscb_process_attach"); +#endif + + /* Destructors */ + unload_library (); + +#if G_HAS_DESTRUCTORS + /* Destructors in dynamically-loaded libraries do not + * necessarily run on dlclose. On some systems dlclose + * is effectively a no-op (e.g with the Musl LibC) and + * destructors run at program exit */ + g_test_message ("Destructors run on module unload: %s\n", + string_find ("lib_" "dtor") ? "yes" : "no"); +#endif +#if defined (_WIN32) && defined (G_HAS_TLS_CALLBACKS) + string_check ("lib_" "tlscb_process_detach"); +#endif +} + +int +main (int argc, char *argv[]) +{ + + const char *libname = G_STRINGIFY (LIB_NAME); + const char *builddir; + char *path; + int ret; + + g_assert_nonnull ((builddir = g_getenv ("G_TEST_BUILDDIR"))); + + path = g_build_filename (builddir, libname, NULL); + + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/constructor/application", test_app); + g_test_add_data_func ("/constructor/library", path, test_lib); + + ret = g_test_run (); + g_assert_cmpint (ret, ==, 0); + + g_free (path); + + /* Return EXIT_FAILURE from main. The last destructor will + * call _Exit (EXIT_SUCCESS) if everything went well. This + * is a way to test that destructors get invoked */ + return EXIT_FAILURE; +} + +#endif /* BUILD_TEST_EXECUTABLE */ diff --git a/glib/tests/convert.c b/glib/tests/convert.c index 6a7bfaf..6cf19ad 100644 --- a/glib/tests/convert.c +++ b/glib/tests/convert.c @@ -950,35 +950,42 @@ test_no_conv (void) } static void -test_filename_from_uri_query_is_ignored (void) +test_filename_from_uri_helper (const gchar *uri, + const gchar *expected_filename) { gchar *filename; + gchar *expected_platform_filename; GError *error = NULL; - filename = g_filename_from_uri ("file:///tmp/foo?bar", NULL, &error); - g_assert_no_error (error); + expected_platform_filename = g_strdup (expected_filename); #ifdef G_OS_WIN32 - g_assert_cmpstr (filename, ==, "\\tmp\\foo"); -#else - g_assert_cmpstr (filename, ==, "/tmp/foo"); + for (gchar *p = expected_platform_filename; *p; p++) + { + if (*p == '/') + *p = '\\'; + } #endif + + filename = g_filename_from_uri (uri, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (filename, ==, expected_platform_filename); g_free (filename); + g_free (expected_platform_filename); +} + +static void +test_filename_from_uri_query_is_ignored (void) +{ + test_filename_from_uri_helper ("file:///tmp/foo?bar", "/tmp/foo"); + test_filename_from_uri_helper ("file:///tmp/foo?bar#baz", "/tmp/foo"); } static void test_filename_from_uri_fragment_is_ignored (void) { - gchar *filename; - GError *error = NULL; - - filename = g_filename_from_uri ("file:///tmp/foo#bar", NULL, &error); - g_assert_no_error (error); -#ifdef G_OS_WIN32 - g_assert_cmpstr (filename, ==, "\\tmp\\foo"); -#else - g_assert_cmpstr (filename, ==, "/tmp/foo"); -#endif - g_free (filename); + test_filename_from_uri_helper ("file:///tmp/foo#bar", "/tmp/foo"); + /* this doesn't have a query, only a bizarre anchor */ + test_filename_from_uri_helper ("file:///tmp/foo#bar?baz", "/tmp/foo"); } int diff --git a/glib/tests/cxx.cpp b/glib/tests/cxx.cpp index bc7967c..5198621 100644 --- a/glib/tests/cxx.cpp +++ b/glib/tests/cxx.cpp @@ -536,7 +536,7 @@ int main (int argc, char *argv[]) { #if G_CXX_STD_CHECK_VERSION (11) - g_test_init (&argc, &argv, NULL); + g_test_init (&argc, &argv, nullptr); #else g_test_init (&argc, &argv, static_cast(NULL)); #endif diff --git a/glib/tests/dataset.c b/glib/tests/dataset.c index 7541268..8c47985 100644 --- a/glib/tests/dataset.c +++ b/glib/tests/dataset.c @@ -1,6 +1,8 @@ #include #include +#include "glib/glib-private.h" + static void test_quark_basic (void) { @@ -283,6 +285,83 @@ test_datalist_id_remove_multiple (void) g_assert_cmpint (destroy_count, ==, 0); } +static void +test_datalist_id_remove_multiple_resize (void) +{ + GQuark *quarks; + GQuark *quarks2; + const guint N = 1000; + const guint PRIME = 1048583u; + guint i; + char sbuf[100]; + GData *list = NULL; + guint i_run; + + quarks = g_new (GQuark, N); + quarks2 = g_new (GQuark, N); + + for (i = 0; i < N; i++) + { + g_snprintf (sbuf, sizeof (sbuf), "%d", i); + quarks[i] = g_quark_from_string (sbuf); + } + + for (i = 0; i < N; i++) + g_datalist_id_set_data (&list, quarks[i], GINT_TO_POINTER (i)); + + /* Now we perform a list of random operations (remove/add quarks). */ + for (i_run = 0; TRUE; i_run++) + { + int MODE = ((guint) g_test_rand_int ()) % 4; + guint n; + guint j; + + n = ((guint) g_test_rand_int ()) % (N + 1); + j = ((guint) g_test_rand_int ()) % N; + + if (i_run > 20) + { + /* After a few runs, we only remove elements, until the list + * is empty. */ + if (!list) + break; + MODE = 0; + if (i_run > 30) + n = N; + } + + switch (MODE) + { + case 0: + case 1: + case 2: + /* Mode: add or remove a number of random quarks. */ + for (i = 0; i < n; i++) + { + j = (j + PRIME) % N; + if (MODE == 0) + g_datalist_id_remove_data (&list, quarks[j]); + else + g_datalist_id_set_data (&list, quarks[j], GINT_TO_POINTER (j)); + } + break; + case 3: + /* Mode: remove a list of (random) quarks. */ + for (i = 0; i < n; i++) + { + j = (j + PRIME) % N; + quarks2[i] = quarks[j]; + } + + g_datalist_id_remove_multiple (&list, quarks2, n); + break; + } + } + + g_free (quarks); + g_free (quarks2); +} + static void destroy_func (gpointer data) { @@ -319,6 +398,58 @@ test_datalist_id_remove_multiple_destroy_order (void) g_assert_cmpint (destroy_count, ==, 3); } +static gpointer +_update_atomic_cb (GQuark key_id, + gpointer *data, + GDestroyNotify *destroy_notify, + gpointer user_data) +{ + const char *op = user_data; + char *data_entry = *data; + + g_assert_nonnull (op); + + if (strcmp (op, "create") == 0) + { + g_assert_cmpstr (data_entry, ==, NULL); + g_assert_null (*destroy_notify); + + *data = g_strdup ("hello"); + *destroy_notify = g_free; + } + else if (strcmp (op, "remove") == 0) + { + g_assert_cmpstr (data_entry, ==, "hello"); + g_assert_true (*destroy_notify == g_free); + + g_free (data_entry); + *data = NULL; + } + else + g_assert_not_reached (); + + return "result"; +} + +static void +test_datalist_update_atomic (void) +{ + GQuark one = g_quark_from_static_string ("one"); + GData *list = NULL; + const char *result; + + result = _g_datalist_id_update_atomic (&list, one, _update_atomic_cb, "create"); + g_assert_cmpstr (result, ==, "result"); + g_assert_cmpstr ((const char *) g_datalist_id_get_data (&list, one), ==, "hello"); + + g_datalist_id_set_data_full (&list, one, g_strdup ("hello"), g_free); + + result = _g_datalist_id_update_atomic (&list, one, _update_atomic_cb, "remove"); + g_assert_cmpstr (result, ==, "result"); + + g_assert_null (list); +} + int main (int argc, char *argv[]) { @@ -335,8 +466,10 @@ main (int argc, char *argv[]) g_test_add_func ("/datalist/id", test_datalist_id); g_test_add_func ("/datalist/recursive-clear", test_datalist_clear); g_test_add_func ("/datalist/id-remove-multiple", test_datalist_id_remove_multiple); + g_test_add_func ("/datalist/id-remove-multiple/resize", test_datalist_id_remove_multiple_resize); g_test_add_func ("/datalist/id-remove-multiple-destroy-order", test_datalist_id_remove_multiple_destroy_order); + g_test_add_func ("/datalist/update-atomic", test_datalist_update_atomic); return g_test_run (); } diff --git a/glib/tests/dir.c b/glib/tests/dir.c index 74dbe14..641cee8 100644 --- a/glib/tests/dir.c +++ b/glib/tests/dir.c @@ -41,6 +41,29 @@ test_dir_nonexisting (void) g_error_free (error); } +static void +test_dir_refcounting (void) +{ + GDir *dir; + GError *local_error = NULL; + + g_test_summary ("Test refcounting interactions with g_dir_close()"); + + /* Try keeping the `GDir` struct alive after closing it. */ + dir = g_dir_open (".", 0, &local_error); + g_assert_no_error (local_error); + + g_dir_ref (dir); + g_dir_close (dir); + g_dir_unref (dir); + + /* Test that dropping the last ref closes it. Any leak here should be caught + * when the test is run under valgrind. */ + dir = g_dir_open (".", 0, &local_error); + g_assert_no_error (local_error); + g_dir_unref (dir); +} + int main (int argc, char *argv[]) { @@ -48,6 +71,7 @@ main (int argc, char *argv[]) g_test_add_func ("/dir/read", test_dir_read); g_test_add_func ("/dir/nonexisting", test_dir_nonexisting); + g_test_add_func ("/dir/refcounting", test_dir_refcounting); return g_test_run (); } diff --git a/glib/tests/fileutils.c b/glib/tests/fileutils.c index 8f5a482..56be804 100644 --- a/glib/tests/fileutils.c +++ b/glib/tests/fileutils.c @@ -60,6 +60,8 @@ #define G_TEST_DIR_MODE (S_IWRITE | S_IREAD) #endif +#include "testutils.h" + #define S G_DIR_SEPARATOR_S static void @@ -979,17 +981,17 @@ test_format_size_for_display (void) check_string (g_format_size_full (2, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_ONLY_VALUE), "2"); check_string (g_format_size_full (2, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_ONLY_UNIT), "bits"); - check_string (g_format_size_full (2000ULL, G_FORMAT_SIZE_BITS), "2.0\302\240kb"); - check_string (g_format_size_full (2000ULL * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Mb"); - check_string (g_format_size_full (2000ULL * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Gb"); - check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Tb"); - check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Pb"); - check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Eb"); + check_string (g_format_size_full (2000ULL, G_FORMAT_SIZE_BITS), "2.0\302\240kbit"); + check_string (g_format_size_full (2000ULL * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Mbit"); + check_string (g_format_size_full (2000ULL * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Gbit"); + check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Tbit"); + check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Pbit"); + check_string (g_format_size_full (2000ULL * 1000 * 1000 * 1000 * 1000 * 1000, G_FORMAT_SIZE_BITS), "2.0\302\240Ebit"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS), "238.5\302\240Mb"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_LONG_FORMAT), "238.5\302\240Mb (238472938 bits)"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS), "238.5\302\240Mbit"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_LONG_FORMAT), "238.5\302\240Mbit (238472938 bits)"); check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_ONLY_VALUE), "238.5"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_ONLY_UNIT), "Mb"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_ONLY_UNIT), "Mbit"); check_string (g_format_size_full (0, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "0 bits"); @@ -1002,17 +1004,17 @@ test_format_size_for_display (void) check_string (g_format_size_full (2, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_ONLY_VALUE), "2"); check_string (g_format_size_full (2, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_ONLY_UNIT), "bits"); - check_string (g_format_size_full (2048ULL, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Kib"); - check_string (g_format_size_full (2048ULL * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Mib"); - check_string (g_format_size_full (2048ULL * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Gib"); - check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Tib"); - check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Pib"); - check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Eib"); + check_string (g_format_size_full (2048ULL, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Kibit"); + check_string (g_format_size_full (2048ULL * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Mibit"); + check_string (g_format_size_full (2048ULL * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Gibit"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Tibit"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Pibit"); + check_string (g_format_size_full (2048ULL * 1024 * 1024 * 1024 * 1024 * 1024, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "2.0\302\240Eibit"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "227.4\302\240Mib"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_LONG_FORMAT), "227.4\302\240Mib (238472938 bits)"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS), "227.4\302\240Mibit"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_LONG_FORMAT), "227.4\302\240Mibit (238472938 bits)"); check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_ONLY_VALUE), "227.4"); - check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_ONLY_UNIT), "Mib"); + check_string (g_format_size_full (238472938, G_FORMAT_SIZE_BITS | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_ONLY_UNIT), "Mibit"); } static void @@ -1472,6 +1474,124 @@ test_get_contents (void) g_remove (filename); } +static gboolean +resize_file (const gchar *filename, + gint64 size) +{ + int fd; + int retval; + + fd = g_open (filename, O_CREAT | O_RDWR | O_TRUNC, 0666); + g_assert_cmpint (fd, >=, 0); + +#ifdef G_OS_WIN32 + retval = _chsize_s (fd, size); +#elif HAVE_FTRUNCATE64 + retval = ftruncate64 (fd, size); +#else + errno = ENOSYS; + retval = -1; +#endif + if (retval != 0) + { + g_test_message ("Error trying to resize file (%s)", strerror (errno)); + close (fd); + return FALSE; + } + + close (fd); + return TRUE; +} + +static gboolean +is_error_in_list (GFileError error_code, + const GFileError ok_list[], + size_t ok_count) +{ + for (size_t i = 0; i < ok_count; i++) + { + if (ok_list[i] == error_code) + return TRUE; + } + return FALSE; +} + +static void +get_largefile_check_len (const gchar *filename, + gint64 large_len, + const GFileError ok_list[], + size_t ok_count) +{ + gboolean get_ok; + gsize len; + gchar *contents; + GError *error = NULL; + + get_ok = g_file_get_contents (filename, &contents, &len, &error); + if (get_ok) + { + g_assert_cmpint ((gint64) len, ==, large_len); + g_free (contents); + } + else + { + g_assert_cmpint (error->domain, ==, G_FILE_ERROR); + if (is_error_in_list ((GFileError)error->code, ok_list, ok_count)) + { + g_test_message ("Error reading file of size 0x%" G_GINT64_MODIFIER "x, but with acceptable error type (%s)", large_len, error->message); + } + else + { + /* fail for other errors */ + g_assert_no_error (error); + } + g_clear_error (&error); + } +} + +static void +test_get_contents_largefile (void) +{ + if (!g_test_slow ()) + { + g_test_skip ("Skipping slow largefile test"); + return; + } + + const gchar *filename = "file-test-get-contents-large"; + gint64 large_len; + + /* error OK if couldn't allocate large buffer, or if file is too large */ + const GFileError too_large_errors[] = { G_FILE_ERROR_NOMEM, G_FILE_ERROR_FAILED }; + /* error OK if couldn't allocate large buffer */ + const GFileError nomem_errors[] = { G_FILE_ERROR_NOMEM }; + + /* OK to fail to read this, but don't silently under-read */ + large_len = (G_GINT64_CONSTANT (1) << 32) + 16; + if (!resize_file (filename, large_len)) + goto failed_resize; + get_largefile_check_len (filename, large_len, too_large_errors, G_N_ELEMENTS (too_large_errors)); + + /* OK to fail to read this size, but don't silently under-read */ + large_len = (G_GINT64_CONSTANT (1) << 32) - 1; + if (!resize_file (filename, large_len)) + goto failed_resize; + get_largefile_check_len (filename, large_len, too_large_errors, G_N_ELEMENTS (too_large_errors)); + + /* OK to fail memory allocation, but don't otherwise fail this size */ + large_len = (G_GINT64_CONSTANT (1) << 31) - 1; + if (!resize_file (filename, large_len)) + goto failed_resize; + get_largefile_check_len (filename, large_len, nomem_errors, G_N_ELEMENTS (nomem_errors)); + + g_remove (filename); + return; + +failed_resize: + g_test_incomplete ("Failed to resize large file, unable to complete large file tests."); + g_remove (filename); +} + static void test_file_test (void) { @@ -2475,26 +2595,6 @@ test_win32_zero_terminate_symlink (void) #endif -static void -assert_fd_was_closed (int fd) -{ - /* We can't tell a fd was really closed without behaving as though it - * was still valid */ - if (g_test_undefined ()) - { - int result, errsv; - GWin32InvalidParameterHandler handler; - - GLIB_PRIVATE_CALL (g_win32_push_empty_invalid_parameter_handler) (&handler); - result = g_fsync (fd); - errsv = errno; - GLIB_PRIVATE_CALL (g_win32_pop_invalid_parameter_handler) (&handler); - - g_assert_cmpint (result, !=, 0); - g_assert_cmpint (errsv, ==, EBADF); - } -} - static void test_clear_fd_ebadf (void) { @@ -2666,6 +2766,7 @@ main (int argc, g_test_add_func ("/fileutils/mkstemp", test_mkstemp); g_test_add_func ("/fileutils/mkdtemp", test_mkdtemp); g_test_add_func ("/fileutils/get-contents", test_get_contents); + g_test_add_func ("/fileutils/get-contents-large-file", test_get_contents_largefile); g_test_add_func ("/fileutils/set-contents", test_set_contents); g_test_add_func ("/fileutils/set-contents-full", test_set_contents_full); g_test_add_func ("/fileutils/set-contents-full/read-only-file", test_set_contents_full_read_only_file); diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c index 49390c9..d46f653 100644 --- a/glib/tests/gdatetime.c +++ b/glib/tests/gdatetime.c @@ -1,6 +1,7 @@ /* gdatetime-tests.c * * Copyright (C) 2009-2010 Christian Hergert + * Copyright 2023 GNOME Foundation Inc. * * SPDX-License-Identifier: LGPL-2.1-or-later * @@ -16,6 +17,10 @@ * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, see . + * + * Authors: + * - Christian Hergert + * - Philip Withnall */ #include "config.h" @@ -28,6 +33,8 @@ #include #include +#include "gdatetime-private.h" + #ifdef G_OS_WIN32 #define WIN32_LEAN_AND_MEAN #include @@ -1536,15 +1543,8 @@ test_GDateTime_get_day_of_year (void) static void test_GDateTime_printf (void) { -/* 64 seems big, but one zoneinfo file, Factory, has an abbreviation - * that long, and it will cause the test to fail if dst isn't big - * enough. - */ gchar *old_lc_all; gchar *old_lc_messages; - gchar dst[64]; - struct tm tt; - time_t t; #ifdef G_OS_WIN32 gchar *current_tz = NULL; @@ -1552,29 +1552,38 @@ test_GDateTime_printf (void) #endif #define TEST_PRINTF(f,o) G_STMT_START { \ -GDateTime *__dt = g_date_time_new_local (2009, 10, 24, 0, 0, 0);\ - gchar *__p = g_date_time_format (__dt, (f)); \ - g_assert_cmpstr (__p, ==, (o)); \ + const char *expected = (o); \ + GDateTime *__dt = g_date_time_new_utc (2009, 10, 24, 0, 0, 0);\ + gchar *actual = g_date_time_format (__dt, (f)); \ + g_test_message ("%s -> expected: %s", (f), expected); \ + g_test_message ("%s -> actual: %s", (f), actual); \ + g_assert_cmpstr (actual, ==, expected); \ g_date_time_unref (__dt); \ - g_free (__p); } G_STMT_END + g_free (actual); } G_STMT_END #define TEST_PRINTF_DATE(y,m,d,f,o) G_STMT_START { \ - GDateTime *dt = g_date_time_new_local (y, m, d, 0, 0, 0); \ - gchar *p = g_date_time_format (dt, (f)); \ - gchar *o_casefold = g_utf8_casefold (o, -1); \ - gchar *p_casefold = g_utf8_casefold (p, -1); \ - g_assert_cmpstr (p_casefold, ==, (o_casefold)); \ + const char *expected = (o); \ + GDateTime *dt = g_date_time_new_utc (y, m, d, 0, 0, 0); \ + gchar *actual = g_date_time_format (dt, (f)); \ + gchar *expected_casefold = g_utf8_casefold (expected, -1); \ + gchar *actual_casefold = g_utf8_casefold (actual, -1); \ + g_test_message ("%s -> expected: %s", (f), expected); \ + g_test_message ("%s -> actual: %s", (f), actual); \ + g_assert_cmpstr (expected_casefold, ==, (actual_casefold)); \ g_date_time_unref (dt); \ - g_free (p_casefold); \ - g_free (o_casefold); \ - g_free (p); } G_STMT_END + g_free (expected_casefold); \ + g_free (actual_casefold); \ + g_free (actual); } G_STMT_END #define TEST_PRINTF_TIME(h,m,s,f,o) G_STMT_START { \ - GDateTime *dt = g_date_time_new_local (2009, 10, 24, (h), (m), (s)); \ - gchar *p = g_date_time_format (dt, (f)); \ - g_assert_cmpstr (p, ==, (o)); \ + GDateTime *dt = g_date_time_new_utc (2009, 10, 24, (h), (m), (s)); \ + const char *expected = (o); \ + gchar *actual = g_date_time_format (dt, (f)); \ + g_test_message ("%s -> expected: %s", (f), expected); \ + g_test_message ("%s -> actual: %s", (f), actual); \ + g_assert_cmpstr (actual, ==, expected); \ g_date_time_unref (dt); \ - g_free (p); } G_STMT_END + g_free (actual); } G_STMT_END old_lc_all = g_strdup (g_getenv ("LC_ALL")); g_unsetenv ("LC_ALL"); @@ -1582,22 +1591,6 @@ GDateTime *__dt = g_date_time_new_local (2009, 10, 24, 0, 0, 0);\ old_lc_messages = g_strdup (g_getenv ("LC_MESSAGES")); g_setenv ("LC_MESSAGES", "C", TRUE); - /* - * This is a little helper to make sure we can compare timezones to - * that of the generated timezone. - */ - t = time (NULL); - g_assert_cmpint (t, !=, (time_t) -1); - memset (&tt, 0, sizeof(tt)); - get_localtime_tm (t, &tt); - tt.tm_year = 2009 - 1900; - tt.tm_mon = 9; /* 0 indexed */ - tt.tm_mday = 24; - t = mktime (&tt); - memset (&tt, 0, sizeof(tt)); - get_localtime_tm (t, &tt); - strftime (dst, sizeof(dst), "%Z", &tt); - TEST_PRINTF ("%a", "Sat"); TEST_PRINTF ("%A", "Saturday"); TEST_PRINTF ("%b", "Oct"); @@ -1642,7 +1635,7 @@ GDateTime *__dt = g_date_time_new_local (2009, 10, 24, 0, 0, 0);\ TEST_PRINTF ("%", ""); TEST_PRINTF ("%9", NULL); #ifdef G_OS_UNIX - TEST_PRINTF ("%Z", dst); + TEST_PRINTF ("%Z", "UTC"); #elif defined G_OS_WIN32 g_assert (GetDynamicTimeZoneInformation (&dtz_info) != TIME_ZONE_ID_INVALID); if (wcscmp (dtz_info.StandardName, L"") != 0) @@ -1698,6 +1691,8 @@ test_non_utf8_printf (void) TEST_PRINTF ("%b", "10\346\234\210"); #endif TEST_PRINTF ("%B", "10\346\234\210"); + TEST_PRINTF ("%c", "2009年10月24日 00時00分00秒"); + TEST_PRINTF ("%C", "20"); TEST_PRINTF ("%d", "24"); TEST_PRINTF_DATE (2009, 1, 1, "%d", "01"); TEST_PRINTF ("%e", "24"); // fixme @@ -1741,6 +1736,21 @@ test_non_utf8_printf (void) TEST_PRINTF ("%%", "%"); TEST_PRINTF ("%", ""); TEST_PRINTF ("%9", NULL); +#if defined(HAVE_LANGINFO_ERA) && (G_BYTE_ORDER == G_LITTLE_ENDIAN || GLIB_SIZEOF_VOID_P == 4) + TEST_PRINTF ("%Ec", "平成21年10月24日 00時00分00秒"); + TEST_PRINTF ("%EC", "平成"); + TEST_PRINTF ("%Ex", "平成21年10月24日"); + TEST_PRINTF ("%EX", "00時00分00秒"); + TEST_PRINTF ("%Ey", "21"); + TEST_PRINTF ("%EY", "平成21年"); +#else + TEST_PRINTF ("%Ec", "2009年10月24日 00時00分00秒"); + TEST_PRINTF ("%EC", "20"); + TEST_PRINTF ("%Ex", "2009\345\271\26410\346\234\21024\346\227\245"); + TEST_PRINTF ("%EX", "00\346\231\20200\345\210\20600\347\247\222"); + TEST_PRINTF ("%Ey", "09"); + TEST_PRINTF ("%EY", "2009"); +#endif setlocale (LC_ALL, oldlocale); g_free (oldlocale); @@ -1792,6 +1802,30 @@ test_modifiers (void) TEST_PRINTF_DATE (2009, 1, 21, "%-e", "21"); TEST_PRINTF_DATE (2009, 1, 21, "%0e", "21"); + TEST_PRINTF_DATE (2009, 1, 1, "%a", "Thu"); + TEST_PRINTF_DATE (2009, 1, 1, "%^a", "THU"); + TEST_PRINTF_DATE (2009, 1, 1, "%#a", "THU"); + + TEST_PRINTF_DATE (2009, 1, 1, "%A", "Thursday"); + TEST_PRINTF_DATE (2009, 1, 1, "%^A", "THURSDAY"); + TEST_PRINTF_DATE (2009, 1, 1, "%#A", "THURSDAY"); + + TEST_PRINTF_DATE (2009, 1, 1, "%b", "Jan"); + TEST_PRINTF_DATE (2009, 1, 1, "%^b", "JAN"); + TEST_PRINTF_DATE (2009, 1, 1, "%#b", "JAN"); + + TEST_PRINTF_DATE (2009, 1, 1, "%B", "January"); + TEST_PRINTF_DATE (2009, 1, 1, "%^B", "JANUARY"); + TEST_PRINTF_DATE (2009, 1, 1, "%#B", "JANUARY"); + + TEST_PRINTF_DATE (2009, 1, 1, "%h", "Jan"); + TEST_PRINTF_DATE (2009, 1, 1, "%^h", "JAN"); + TEST_PRINTF_DATE (2009, 1, 1, "%#h", "JAN"); + + TEST_PRINTF_DATE (2009, 1, 1, "%Z", "UTC"); + TEST_PRINTF_DATE (2009, 1, 1, "%^Z", "UTC"); + TEST_PRINTF_DATE (2009, 1, 1, "%#Z", "utc"); + TEST_PRINTF_TIME ( 1, 0, 0, "%H", "01"); TEST_PRINTF_TIME ( 1, 0, 0, "%_H", " 1"); TEST_PRINTF_TIME ( 1, 0, 0, "%-H", "1"); @@ -1824,7 +1858,16 @@ test_modifiers (void) TEST_PRINTF_TIME (23, 0, 0, "%-l", "11"); TEST_PRINTF_TIME (23, 0, 0, "%0l", "11"); + TEST_PRINTF_TIME (1, 0, 0, "%p", "AM"); + TEST_PRINTF_TIME (1, 0, 0, "%^p", "AM"); + TEST_PRINTF_TIME (1, 0, 0, "%#p", "am"); + + TEST_PRINTF_TIME (1, 0, 0, "%P", "am"); + TEST_PRINTF_TIME (1, 0, 0, "%^P", "AM"); + TEST_PRINTF_TIME (1, 0, 0, "%#P", "am"); + oldlocale = g_strdup (setlocale (LC_ALL, NULL)); + setlocale (LC_ALL, "fa_IR.utf-8"); #ifdef HAVE_LANGINFO_OUTDIGIT if (strstr (setlocale (LC_ALL, NULL), "fa_IR") != NULL) @@ -1843,6 +1886,61 @@ test_modifiers (void) #else g_test_skip ("langinfo not available, skipping O modifier tests"); #endif + + setlocale (LC_ALL, "gu_IN.utf-8"); +#ifdef HAVE_LANGINFO_OUTDIGIT + if (strstr (setlocale (LC_ALL, NULL), "gu_IN") != NULL) + { + TEST_PRINTF_TIME (23, 0, 0, "%OH", "૨૩"); /* '23' */ + TEST_PRINTF_TIME (23, 0, 0, "%OI", "૧૧"); /* '11' */ + TEST_PRINTF_TIME (23, 0, 0, "%OM", "૦૦"); /* '00' */ + + TEST_PRINTF_DATE (2011, 7, 1, "%Om", "૦૭"); /* '07' */ + TEST_PRINTF_DATE (2011, 7, 1, "%0Om", "૦૭"); /* '07' */ + TEST_PRINTF_DATE (2011, 7, 1, "%-Om", "૭"); /* '7' */ + TEST_PRINTF_DATE (2011, 7, 1, "%_Om", " ૭"); /* ' 7' */ + } + else + g_test_skip ("locale gu_IN not available, skipping O modifier tests"); +#else + g_test_skip ("langinfo not available, skipping O modifier tests"); +#endif + + setlocale (LC_ALL, "en_GB.utf-8"); + if (strstr (setlocale (LC_ALL, NULL), "en_GB") != NULL) + { +#ifndef __APPLE__ + TEST_PRINTF_DATE (2009, 1, 1, "%c", "thu 01 jan 2009 00:00:00 utc"); + TEST_PRINTF_DATE (2009, 1, 1, "%Ec", "thu 01 jan 2009 00:00:00 utc"); +#else + /* macOS uses a figure space (U+2007) to pad the day */ + TEST_PRINTF_DATE (2009, 1, 1, "%c", "thu " "\xe2\x80\x87" "1 jan 00:00:00 2009"); + TEST_PRINTF_DATE (2009, 1, 1, "%Ec", "thu " "\xe2\x80\x87" "1 jan 00:00:00 2009"); +#endif + + TEST_PRINTF_DATE (2009, 1, 1, "%C", "20"); + TEST_PRINTF_DATE (2009, 1, 1, "%EC", "20"); + +#ifndef __APPLE__ + TEST_PRINTF_DATE (2009, 1, 2, "%x", "02/01/09"); + TEST_PRINTF_DATE (2009, 1, 2, "%Ex", "02/01/09"); +#else + TEST_PRINTF_DATE (2009, 1, 2, "%x", "02/01/2009"); + TEST_PRINTF_DATE (2009, 1, 2, "%Ex", "02/01/2009"); +#endif + + TEST_PRINTF_TIME (1, 2, 3, "%X", "01:02:03"); + TEST_PRINTF_TIME (1, 2, 3, "%EX", "01:02:03"); + + TEST_PRINTF_DATE (2009, 1, 1, "%y", "09"); + TEST_PRINTF_DATE (2009, 1, 1, "%Ey", "09"); + + TEST_PRINTF_DATE (2009, 1, 1, "%Y", "2009"); + TEST_PRINTF_DATE (2009, 1, 1, "%EY", "2009"); + } + else + g_test_skip ("locale en_GB not available, skipping E modifier tests"); + setlocale (LC_ALL, oldlocale); g_free (oldlocale); } @@ -2182,6 +2280,172 @@ test_all_dates (void) g_time_zone_unref (timezone); } +static void +test_date_time_eras_japan (void) +{ +#if defined(HAVE_LANGINFO_ERA) && (G_BYTE_ORDER == G_LITTLE_ENDIAN || GLIB_SIZEOF_VOID_P == 4) + gchar *oldlocale; + + oldlocale = g_strdup (setlocale (LC_ALL, NULL)); + setlocale (LC_ALL, "ja_JP.utf-8"); + if (strstr (setlocale (LC_ALL, NULL), "ja_JP") == NULL) + { + g_test_skip ("locale ja_JP.utf-8 not available, skipping Japanese era tests"); + g_free (oldlocale); + return; + } + + /* See https://en.wikipedia.org/wiki/Japanese_era_name + * First test the Reiwa era (令和) */ + TEST_PRINTF_DATE (2023, 06, 01, "%Ec", "令和05年06月01日 00時00分00秒"); + TEST_PRINTF_DATE (2023, 06, 01, "%EC", "令和"); + TEST_PRINTF_DATE (2023, 06, 01, "%Ex", "令和05年06月01日"); + TEST_PRINTF_DATE (2023, 06, 01, "%EX", "00時00分00秒"); + TEST_PRINTF_DATE (2023, 06, 01, "%Ey", "05"); + TEST_PRINTF_DATE (2023, 06, 01, "%EY", "令和05年"); + + /* Heisei era (平成) */ + TEST_PRINTF_DATE (2019, 04, 30, "%Ec", "平成31年04月30日 00時00分00秒"); + TEST_PRINTF_DATE (2019, 04, 30, "%EC", "平成"); + TEST_PRINTF_DATE (2019, 04, 30, "%Ex", "平成31年04月30日"); + TEST_PRINTF_DATE (2019, 04, 30, "%EX", "00時00分00秒"); + TEST_PRINTF_DATE (2019, 04, 30, "%Ey", "31"); + TEST_PRINTF_DATE (2019, 04, 30, "%EY", "平成31年"); + + /* Shōwa era (昭和) */ + TEST_PRINTF_DATE (1926, 12, 25, "%Ec", "昭和元年12月25日 00時00分00秒"); + TEST_PRINTF_DATE (1926, 12, 25, "%EC", "昭和"); + TEST_PRINTF_DATE (1926, 12, 25, "%Ex", "昭和元年12月25日"); + TEST_PRINTF_DATE (1926, 12, 25, "%EX", "00時00分00秒"); + TEST_PRINTF_DATE (1926, 12, 25, "%Ey", "01"); + TEST_PRINTF_DATE (1926, 12, 25, "%EY", "昭和元年"); + + setlocale (LC_ALL, oldlocale); + g_free (oldlocale); +#else + g_test_skip ("nl_langinfo(ERA) not supported, skipping era tests"); +#endif +} + +static void +test_date_time_eras_thailand (void) +{ +#if defined(HAVE_LANGINFO_ERA) && (G_BYTE_ORDER == G_LITTLE_ENDIAN || GLIB_SIZEOF_VOID_P == 4) + gchar *oldlocale; + + oldlocale = g_strdup (setlocale (LC_ALL, NULL)); + setlocale (LC_ALL, "th_TH.utf-8"); + if (strstr (setlocale (LC_ALL, NULL), "th_TH") == NULL) + { + g_test_skip ("locale th_TH.utf-8 not available, skipping Thai era tests"); + g_free (oldlocale); + return; + } + + /* See https://en.wikipedia.org/wiki/Thai_solar_calendar */ + TEST_PRINTF_DATE (2023, 06, 01, "%Ec", "วันพฤหัสบดีที่  1 มิถุนายน พ.ศ. 2566, 00.00.00 น."); + TEST_PRINTF_DATE (2023, 06, 01, "%EC", "พ.ศ."); + TEST_PRINTF_DATE (2023, 06, 01, "%Ex", " 1 มิ.ย. 2566"); + TEST_PRINTF_DATE (2023, 06, 01, "%EX", "00.00.00 น."); + TEST_PRINTF_DATE (2023, 06, 01, "%Ey", "2566"); + TEST_PRINTF_DATE (2023, 06, 01, "%EY", "พ.ศ. 2566"); + + TEST_PRINTF_DATE (01, 06, 01, "%Ex", " 1 มิ.ย. 544"); + + setlocale (LC_ALL, oldlocale); + g_free (oldlocale); +#else + g_test_skip ("nl_langinfo(ERA) not supported, skipping era tests"); +#endif +} + +static void +test_date_time_eras_parsing (void) +{ + struct + { + const char *desc; + gboolean expected_success; + size_t expected_n_segments; + } + vectors[] = + { + /* Some successful parsing: */ + { "", TRUE, 0 }, + /* From https://github.com/bminor/glibc/blob/9fd3409842b3e2d31cff5dbd6f96066c430f0aa2/localedata/locales/th_TH#L233: */ + { "+:1:-543/01/01:+*:พ.ศ.:%EC %Ey", TRUE, 1 }, + /* From https://github.com/bminor/glibc/blob/9fd3409842b3e2d31cff5dbd6f96066c430f0aa2/localedata/locales/ja_JP#L14967C5-L14977C60: */ + { "+:2:2020/01/01:+*:令和:%EC%Ey年;" + "+:1:2019/05/01:2019/12/31:令和:%EC元年;" + "+:2:1990/01/01:2019/04/30:平成:%EC%Ey年;" + "+:1:1989/01/08:1989/12/31:平成:%EC元年;" + "+:2:1927/01/01:1989/01/07:昭和:%EC%Ey年;" + "+:1:1926/12/25:1926/12/31:昭和:%EC元年;" + "+:2:1913/01/01:1926/12/24:大正:%EC%Ey年;" + "+:1:1912/07/30:1912/12/31:大正:%EC元年;" + "+:6:1873/01/01:1912/07/29:明治:%EC%Ey年;" + "+:1:0001/01/01:1872/12/31:西暦:%EC%Ey年;" + "+:1:-0001/12/31:-*:紀元前:%EC%Ey年", TRUE, 11 }, + { "-:2:2020/01/01:-*:令和:%EC%Ey年", TRUE, 1 }, + { "+:2:2020/01/01:2020/01/01:令和:%EC%Ey年", TRUE, 1 }, + { "+:2:+2020/01/01:+*:令和:%EC%Ey年", TRUE, 1 }, + /* Some errors: */ + { ".:2:2020/01/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+.2:2020/01/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+", FALSE, 0 }, + { "+:", FALSE, 0 }, + { "+::", FALSE, 0 }, + { "+:200", FALSE, 0 }, + { "+:2nonsense", FALSE, 0 }, + { "+:2nonsense:", FALSE, 0 }, + { "+:2:", FALSE, 0 }, + { "+:2::", FALSE, 0 }, + { "+:2:2020-01/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020nonsense/01/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:18446744073709551615/01/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01-01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01nonsense/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/00/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/13/01:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01/00:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01/32:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01/01nonsense:+*:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01/01", FALSE, 0 }, + { "+:2:2020/01/01:", FALSE, 0 }, + { "+:2:2020/01/01::", FALSE, 0 }, + { "+:2:2020/01/01:2021-01-01:令和:%EC%Ey年", FALSE, 0 }, + { "+:2:2020/01/01:+*", FALSE, 0 }, + { "+:2:2020/01/01:+*:", FALSE, 0 }, + { "+:2:2020/01/01:+*::", FALSE, 0 }, + { "+:2:2020/01/01:+*:令和", FALSE, 0 }, + { "+:2:2020/01/01:+*:令和:", FALSE, 0 }, + { "+:2:2020/01/01:+*:令和:;", FALSE, 0 }, + }; + + for (size_t i = 0; i < G_N_ELEMENTS (vectors); i++) + { + GPtrArray *segments = NULL; + + g_test_message ("Vector %" G_GSIZE_FORMAT ": %s", i, vectors[i].desc); + + segments = _g_era_description_parse (vectors[i].desc); + + if (vectors[i].expected_success) + { + g_assert_nonnull (segments); + g_assert_cmpuint (segments->len, ==, vectors[i].expected_n_segments); + } + else + { + g_assert_null (segments); + } + + g_clear_pointer (&segments, g_ptr_array_unref); + } +} + static void test_z (void) { @@ -3139,6 +3403,38 @@ test_time_zone_caching (void) g_assert_true (tz1 == tz2); } +static void +test_date_time_unix_usec (void) +{ + gint64 usecs = g_get_real_time (); + gint64 secs = usecs / G_USEC_PER_SEC; + GDateTime *dt; + GDateTime *local; + + dt = g_date_time_new_from_unix_utc (secs); + g_assert_cmpint (g_date_time_to_unix_usec (dt), ==, secs * G_USEC_PER_SEC); + g_assert_cmpint (g_date_time_to_unix (dt), ==, secs); + g_date_time_unref (dt); + + dt = g_date_time_new_from_unix_utc_usec (usecs); + g_assert_cmpint (g_date_time_to_unix_usec (dt), ==, usecs); + g_assert_cmpint (g_date_time_to_unix (dt), ==, secs); + g_date_time_unref (dt); + + local = g_date_time_new_from_unix_local (secs); + dt = g_date_time_to_utc (local); + g_assert_cmpint (g_date_time_to_unix_usec (dt), ==, secs * G_USEC_PER_SEC); + g_assert_cmpint (g_date_time_to_unix (dt), ==, secs); + g_date_time_unref (dt); + g_date_time_unref (local); + + local = g_date_time_new_from_unix_local_usec (usecs); + dt = g_date_time_to_utc (local); + g_assert_cmpint (g_date_time_to_unix_usec (dt), ==, usecs); + g_assert_cmpint (g_date_time_to_unix (dt), ==, secs); + g_date_time_unref (dt); + g_date_time_unref (local); +} gint main (gint argc, @@ -3152,6 +3448,7 @@ main (gint argc, * categories. Unset it to avoid interference with tests. */ g_unsetenv ("CHARSET"); + setlocale (LC_ALL, "C.UTF-8"); g_test_init (&argc, &argv, NULL); /* GDateTime Tests */ @@ -3219,6 +3516,11 @@ main (gint argc, g_test_add_func ("/GDateTime/dst", test_GDateTime_dst); g_test_add_func ("/GDateTime/test_z", test_z); g_test_add_func ("/GDateTime/test-all-dates", test_all_dates); + g_test_add_func ("/GDateTime/eras/japan", test_date_time_eras_japan); + g_test_add_func ("/GDateTime/eras/thailand", test_date_time_eras_thailand); + g_test_add_func ("/GDateTime/eras/parsing", test_date_time_eras_parsing); + g_test_add_func ("/GDateTime/unix_usec", test_date_time_unix_usec); + g_test_add_func ("/GTimeZone/find-interval", test_find_interval); g_test_add_func ("/GTimeZone/adjust-time", test_adjust_time); g_test_add_func ("/GTimeZone/no-header", test_no_header); diff --git a/glib/tests/gvariant.c b/glib/tests/gvariant.c index c8f1336..c24cd2f 100644 --- a/glib/tests/gvariant.c +++ b/glib/tests/gvariant.c @@ -1337,19 +1337,22 @@ flavoured_free (gpointer data, static gpointer align_malloc (gsize size) { - gpointer mem; + gpointer mem = NULL; #ifdef HAVE_POSIX_MEMALIGN /* posix_memalign() requires the alignment to be a multiple of - * sizeof(void*), and a power of 2. */ - if (posix_memalign (&mem, MAX (sizeof (void *), 8), size)) + * sizeof(void*), and a power of 2. + * Calling it with size==0 leads to implementation-defined behaviour, so avoid + * that and guarantee to return NULL. */ + if (size != 0 && + posix_memalign (&mem, MAX (sizeof (void *), 8), size)) g_error ("posix_memalign failed"); #else /* NOTE: there may be platforms that lack posix_memalign() and also * have malloc() that returns non-8-aligned. if so, we need to try * harder here. */ - mem = malloc (size); + mem = (size > 0) ? malloc (size) : NULL; #endif return mem; @@ -4959,6 +4962,12 @@ test_gbytes (void) g_bytes_unref (bytes2); g_variant_unref (a); g_variant_unref (tuple); + + bytes = g_bytes_new (NULL, 0); + a = g_variant_new_from_bytes (G_VARIANT_TYPE ("as"), bytes, TRUE); + g_bytes_unref (bytes); + g_assert_cmpuint (g_variant_n_children (a), ==, 0); + g_variant_unref (a); } typedef struct { diff --git a/glib/tests/io-channel-basic.c b/glib/tests/io-channel-basic.c index c1a46cd..695df6d 100644 --- a/glib/tests/io-channel-basic.c +++ b/glib/tests/io-channel-basic.c @@ -270,12 +270,12 @@ spawn_process (int children_nb) wcl.hCursor = NULL; wcl.hbrBackground = NULL; wcl.lpszMenuName = NULL; - wcl.lpszClassName = "io-channel-basic"; + wcl.lpszClassName = L"io-channel-basic"; klass = RegisterClass (&wcl); g_assert_cmpint (klass, !=, 0); - hwnd = CreateWindow (MAKEINTATOM(klass), "io-channel-basic", 0, 0, 0, 10, 10, + hwnd = CreateWindow (MAKEINTATOM (klass), L"io-channel-basic", 0, 0, 0, 10, 10, NULL, NULL, wcl.hInstance, NULL); g_assert_nonnull (hwnd); diff --git a/glib/tests/keyfile.c b/glib/tests/keyfile.c index bc125c1..92f8010 100644 --- a/glib/tests/keyfile.c +++ b/glib/tests/keyfile.c @@ -589,8 +589,9 @@ test_string (void) "key6=trailing space \n" "[invalid]\n" "key1=\\a\\b\\0800xff\n" - "key2=blabla\\\n" - "key3=foo\\i\\\n"; + "key2=blabla\\\n" /* escape at end of line */ + "key3=\\ifoo\n" /* invalid escape */ + "key4=\\i\\hfoo\n"; /* invalid escape with multiple stacked errors */ keyfile = load_data (data, 0); @@ -613,6 +614,10 @@ test_string (void) check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); g_free (value); + value = g_key_file_get_string (keyfile, "invalid", "key4", &error); + check_error (&error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); + g_free (value); + g_key_file_set_string (keyfile, "inserted", "key1", "simple"); g_key_file_set_string (keyfile, "inserted", "key2", " leading space"); g_key_file_set_string (keyfile, "inserted", "key3", "\tleading tab"); diff --git a/glib/tests/logging.c b/glib/tests/logging.c index ea9dcb8..858cad8 100644 --- a/glib/tests/logging.c +++ b/glib/tests/logging.c @@ -201,6 +201,71 @@ test_default_handler_debug_stderr (void) exit (0); } +static void +test_default_handler_would_drop_env5 (void) +{ + g_setenv ("G_MESSAGES_DEBUG", "foobar", TRUE); + + g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo")); + g_assert_true (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "bar")); +} + +static void +test_default_handler_would_drop_env4 (void) +{ + g_setenv ("G_MESSAGES_DEBUG", "all", TRUE); + + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_ERROR, "foo")); + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_CRITICAL, "foo")); + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_WARNING, "foo")); + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_MESSAGE, "foo")); + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_INFO, "foo")); + g_assert_false (g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, "foo")); + g_assert_false (g_log_writer_default_would_drop (1< 0) + g_log_writer_default_would_drop (G_LOG_LEVEL_DEBUG, test_would_drop_robustness_random_domain ()); + + g_atomic_int_set (&test_would_drop_robustness_stopping, TRUE); + for (i = 0; i < G_N_ELEMENTS (threads); i++) + g_thread_join (threads[i]); +} + static void test_default_handler_0x400 (void) { @@ -338,6 +517,24 @@ test_default_handler (void) g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop", 0, G_TEST_SUBPROCESS_DEFAULT); g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env1", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env2", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env3", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env4", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-env5", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_subprocess ("/logging/default-handler/subprocess/would-drop-robustness", 0, + G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); } static void @@ -871,6 +1068,12 @@ main (int argc, char *argv[]) g_test_add_func ("/logging/default-handler/subprocess/debug-stderr", test_default_handler_debug_stderr); g_test_add_func ("/logging/default-handler/subprocess/0x400", test_default_handler_0x400); g_test_add_func ("/logging/default-handler/subprocess/would-drop", test_default_handler_would_drop); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-env1", test_default_handler_would_drop_env1); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-env2", test_default_handler_would_drop_env2); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-env3", test_default_handler_would_drop_env3); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-env4", test_default_handler_would_drop_env4); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-env5", test_default_handler_would_drop_env5); + g_test_add_func ("/logging/default-handler/subprocess/would-drop-robustness", test_default_handler_would_drop_robustness); g_test_add_func ("/logging/warnings", test_warnings); g_test_add_func ("/logging/fatal-log-mask", test_fatal_log_mask); g_test_add_func ("/logging/set-handler", test_set_handler); diff --git a/glib/tests/mapping.c b/glib/tests/mapping.c index ea3495c..99cb8ee 100644 --- a/glib/tests/mapping.c +++ b/glib/tests/mapping.c @@ -189,8 +189,6 @@ test_private (void) /* Cleaning left over files */ g_remove ("maptest"); - - g_test_message ("test_private: ok"); } static void @@ -283,8 +281,6 @@ test_child_private (void) /* Cleaning left over files */ g_remove ("mapchild"); g_remove ("maptest"); - - g_test_message ("test_child_private: ok"); } int @@ -303,6 +299,7 @@ main (int argc, } #endif + g_test_init (&argc, &argv, NULL); local_argv = argv; if (argc > 1) @@ -311,8 +308,6 @@ main (int argc, return EXIT_SUCCESS; } - g_test_init (&argc, &argv, NULL); - g_test_add_func ("/mapping/flags", test_mapping_flags); g_test_add_func ("/mapping/private", test_private); g_test_add_func ("/mapping/private-child", test_child_private); diff --git a/glib/tests/meson.build b/glib/tests/meson.build index d80c86e..f6efc59 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -12,14 +12,25 @@ glib_tests = { 'cache' : {}, 'charset' : {}, 'checksum' : {}, - 'collate' : {}, + 'collate' : { + # musl: collate fail due to missing collation support in musl libc + # From https://wiki.musl-libc.org/roadmap#Open_future_goals + # "LC_COLLATE support for collation orders other than simple codepoint order" + 'can_fail' : linux_libc == 'musl', + }, 'completion' : {}, 'cond' : {}, - 'convert' : {}, + 'convert' : { + # FIXME: musl: /conversion/illegal-sequence: https://gitlab.gnome.org/GNOME/glib/-/issues/3182 + 'can_fail' : linux_libc == 'musl', + }, 'dataset' : {}, 'date' : { - # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 - 'can_fail' : host_system == 'darwin', + # FIXME: darwin: https://gitlab.gnome.org/GNOME/glib/-/issues/1392 + # musl: /date/month_substring should be skipped but it's not. The fix should + # be on musl side: https://www.openwall.com/lists/musl/2023/08/10/3 + # FIXME: musl: /date/strftime: https://gitlab.gnome.org/GNOME/glib/-/issues/3171 + 'can_fail' : host_system == 'darwin' or linux_libc == 'musl', }, 'dir' : {}, 'environment' : { @@ -29,8 +40,12 @@ glib_tests = { 'error' : {}, 'fileutils' : {}, 'gdatetime' : { + 'source' : ['gdatetime.c', '../gdatetime-private.c'], 'suite' : ['slow'], - 'can_fail' : host_system == 'windows', + # musl: GDateTime/format_mixed/non_utf8_time_non_utf8_messages should be + # skipped but it's not. The fix should be on musl side: + # https://www.openwall.com/lists/musl/2023/08/10/3 + 'can_fail' : host_system == 'windows' or linux_libc == 'musl', }, 'guuid' : {}, 'gvariant' : { @@ -70,7 +85,11 @@ glib_tests = { 'node' : {}, 'once' : {}, 'onceinit' : {}, - 'option-context' : {}, + 'option-context' : { + # musl: /option/arg/repetition/locale should be skipped but it's not. The + # fix should be on musl side: https://www.openwall.com/lists/musl/2023/08/10/3 + 'can_fail' : linux_libc == 'musl', + }, 'option-argv0' : {}, 'overflow' : {}, 'overflow-fallback' : { @@ -127,23 +146,14 @@ glib_tests = { 'extra_programs' : host_machine.system() == 'windows' ? ['spawn-test-win32-gui'] : [], }, 'strfuncs' : {}, - 'string' : {}, - 'string-macro' : { - 'source' : 'string.c', + 'string' : { 'c_args' : cc.get_id() == 'gcc' ? ['-Werror=sign-conversion'] : [], - 'install' : false, }, 'strvbuilder' : {}, 'testing' : { 'args': [ '--verbose' ], 'extra_programs' : ['testing-helper'], - }, - 'testing-macro' : { - 'args': [ '--verbose' ], - 'extra_programs' : ['testing-helper'], - 'source' : 'testing.c', 'c_args' : cc.get_id() == 'gcc' ? ['-Werror=sign-conversion'] : [], - 'install' : false, }, 'test-printf' : {}, 'thread' : {}, @@ -318,6 +328,29 @@ if host_machine.system() == 'windows' } endif +if host_machine.system() == 'windows' or have_dlopen_dlsym + constructor_helper = shared_library('constructor-helper', + 'constructor-helper.c', + dependencies: [libglib_dep], + install : false) + constructor_lib = shared_library('constructor-lib', + 'constructor.c', + c_args: ['-DPREFIX=lib'], + dependencies: [libglib_dep], + link_with: [constructor_helper], + install : false) + glib_tests += { + 'constructor' : { + 'install': false, + 'c_args': ['-DLIB_NAME=' + fs.name(constructor_lib.full_path()), + '-DBUILD_TEST_EXECUTABLE', + '-DPREFIX=app'], + 'dependencies' : libdl_dep, + 'link_with': [constructor_helper] + } + } +endif + foreach test_name, extra_args : glib_tests foreach std: extra_args.get('c_standards', []) if c_standards.has_key(std) @@ -398,6 +431,7 @@ foreach test_name, extra_args : glib_tests link_args : extra_args.get('link_args', []), override_options : extra_args.get('override_options', []), dependencies : test_deps + extra_args.get('dependencies', []), + link_with : extra_args.get('link_with', []), install_dir: installed_tests_execdir, install_tag: 'tests', install: install, diff --git a/glib/tests/messages-low-memory.py b/glib/tests/messages-low-memory.py index 8e071b1..eb80369 100644 --- a/glib/tests/messages-low-memory.py +++ b/glib/tests/messages-low-memory.py @@ -63,6 +63,7 @@ class TestMessagesLowMemory(unittest.TestCase): env = os.environ.copy() env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" print("Environment:", env) # We want to ensure consistent line endings... diff --git a/glib/tests/once.c b/glib/tests/once.c index 0bcaea4..d851ad1 100644 --- a/glib/tests/once.c +++ b/glib/tests/once.c @@ -199,8 +199,8 @@ test_once_init_string (void) g_test_summary ("Test g_once_init_{enter,leave}() usage with a string"); - if (g_once_init_enter (&val)) - g_once_init_leave (&val, "foo"); + if (g_once_init_enter_pointer (&val)) + g_once_init_leave_pointer (&val, "foo"); g_assert_cmpstr (val, ==, "foo"); } diff --git a/glib/tests/onceinit.c b/glib/tests/onceinit.c index 4d10b4f..1e60b63 100644 --- a/glib/tests/onceinit.c +++ b/glib/tests/onceinit.c @@ -71,14 +71,14 @@ initializer1 (void) static gpointer initializer2 (void) { - static gsize initialized = 0; - if (g_once_init_enter (&initialized)) + static void *initialized = NULL; + if (g_once_init_enter_pointer (&initialized)) { void *pointer_value = &dummy_value; assert_singleton_execution2 (); - g_once_init_leave (&initialized, (gsize) pointer_value); + g_once_init_leave_pointer (&initialized, pointer_value); } - return (void*) initialized; + return initialized; } static void diff --git a/glib/tests/private.c b/glib/tests/private.c index 37f7761..424c34b 100644 --- a/glib/tests/private.c +++ b/glib/tests/private.c @@ -148,19 +148,6 @@ test_private3 (void) thread = (HANDLE) _beginthreadex (NULL, 0, private3_func, NULL, 0, &ignore); WaitForSingleObject (thread, INFINITE); CloseHandle (thread); - - /* FIXME: with static compilation on Windows this test will fail because - * it is mixing up glib threads with Microsoft native thread API. See - * comment in gthread-win32.c for g_system_thread_exit() implementation. - * Fix is not straightforward, possible solution could be to use FLS - * functions (instead of TLS) as proposed in - * https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1655 - */ - if (!private3_freed) - { - g_test_skip ("FIXME: GPrivate with native win32 thread"); - return; - } } #else { diff --git a/glib/tests/regex.c b/glib/tests/regex.c index f18db48..d7a698e 100644 --- a/glib/tests/regex.c +++ b/glib/tests/regex.c @@ -1885,16 +1885,6 @@ test_lookbehind (void) g_match_info_free (match); g_regex_unref (regex); - regex = g_regex_new ("(?str, ==, "firsthalfsome format placeholders"); diff --git a/glib/tests/strvbuilder.c b/glib/tests/strvbuilder.c index 595a684..ed0cfa3 100644 --- a/glib/tests/strvbuilder.c +++ b/glib/tests/strvbuilder.c @@ -92,6 +92,25 @@ test_strvbuilder_add_many (void) g_strv_builder_unref (builder); } +static void +test_strvbuilder_take (void) +{ + GStrvBuilder *builder; + GStrv result; + const gchar *expected[] = { "one", "two", "three", NULL }; + + builder = g_strv_builder_new (); + g_strv_builder_take (builder, g_strdup ("one")); + g_strv_builder_add (builder, "two"); + g_strv_builder_take (builder, g_strdup ("three")); + result = g_strv_builder_end (builder); + g_assert_nonnull (result); + g_assert_true (g_strv_equal ((const gchar *const *) result, expected)); + + g_strfreev (result); + g_strv_builder_unref (builder); +} + static void test_strvbuilder_ref (void) { @@ -113,6 +132,7 @@ main (int argc, g_test_add_func ("/strvbuilder/add", test_strvbuilder_add); g_test_add_func ("/strvbuilder/addv", test_strvbuilder_addv); g_test_add_func ("/strvbuilder/add_many", test_strvbuilder_add_many); + g_test_add_func ("/strvbuilder/take", test_strvbuilder_take); g_test_add_func ("/strvbuilder/ref", test_strvbuilder_ref); return g_test_run (); diff --git a/glib/tests/test-printf.c b/glib/tests/test-printf.c index 261b038..432685e 100644 --- a/glib/tests/test-printf.c +++ b/glib/tests/test-printf.c @@ -897,6 +897,9 @@ test_upper_bound (void) res = upper_bound ("bla %s %d: %g\n", "bla", 123, 0.123); g_assert_cmpint (res, ==, 20); + + res = upper_bound ("Invalid case: %ls", L"\xD800" /* incomplete surrogate pair */); + g_assert_cmpint (res, ==, 0); } #if !defined(__APPLE__) && !defined(__FreeBSD__) @@ -945,6 +948,30 @@ test_vasprintf_invalid_format_placeholder (void) #endif } +static void +test_vasprintf_invalid_wide_string (void) +{ +#if !defined(__APPLE__) && !defined(__FreeBSD__) + gint len = 0; + gchar *buf = "some non-null string"; +#endif + + g_test_summary ("Test error handling for invalid wide strings in g_vasprintf()"); + +#if !defined(__APPLE__) && !defined(__FreeBSD__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat" +#pragma GCC diagnostic ignored "-Wformat-extra-args" + len = test_vasprintf_va (&buf, "%ls", L"\xD800" /* incomplete surrogate pair */); +#pragma GCC diagnostic pop + + g_assert_cmpint (len, ==, -1); + g_assert_null (buf); +#else + g_test_skip ("vasprintf() placeholder checks on BSDs are less strict"); +#endif +} + int main (int argc, char *argv[]) @@ -986,6 +1013,7 @@ main (int argc, g_test_add_func ("/sprintf/upper-bound", test_upper_bound); g_test_add_func ("/vasprintf/invalid-format-placeholder", test_vasprintf_invalid_format_placeholder); + g_test_add_func ("/vasprintf/invalid-wide-string", test_vasprintf_invalid_wide_string); return g_test_run(); } diff --git a/glib/tests/testing-helper.c b/glib/tests/testing-helper.c index da60f3e..3f5629a 100644 --- a/glib/tests/testing-helper.c +++ b/glib/tests/testing-helper.c @@ -55,6 +55,9 @@ test_fail (void) static void test_error (void) { + /* We expect this test to abort, so try to avoid that creating a coredump */ + g_test_disable_crash_reporting (); + g_error ("This should error out\nBecause it's just\nwrong!"); } diff --git a/glib/tests/testing.c b/glib/tests/testing.c index acbc1be..c4179eb 100644 --- a/glib/tests/testing.c +++ b/glib/tests/testing.c @@ -395,15 +395,34 @@ test_subprocess_timeout (void) { /* loop and sleep forever */ while (TRUE) - g_usleep (1000 * 1000); + g_usleep (G_USEC_PER_SEC); return; } /* allow child to run for only a fraction of a second */ - g_test_trap_subprocess (NULL, 0.11 * 1000000, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_subprocess (NULL, 0.05 * G_USEC_PER_SEC, G_TEST_SUBPROCESS_DEFAULT); g_test_trap_assert_failed (); g_assert_true (g_test_trap_reached_timeout ()); } +static void +test_subprocess_envp (void) +{ + char **envp = NULL; + + if (g_test_subprocess ()) + { + g_assert_cmpstr (g_getenv ("TEST_SUBPROCESS_VARIABLE"), ==, "definitely set"); + return; + } + + envp = g_get_environ (); + envp = g_environ_setenv (g_steal_pointer (&envp), "TEST_SUBPROCESS_VARIABLE", "definitely set", TRUE); + g_test_trap_subprocess_with_envp (NULL, (const gchar * const *) envp, + 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_strfreev (envp); +} + /* run a test with fixture setup and teardown */ typedef struct { guint seed; @@ -881,18 +900,6 @@ test_incomplete (void) g_test_trap_assert_failed (); } -static void -test_subprocess_timed_out (void) -{ - if (g_test_subprocess ()) - { - g_usleep (1000000); - return; - } - g_test_trap_subprocess (NULL, 50000, G_TEST_SUBPROCESS_DEFAULT); - g_assert_true (g_test_trap_reached_timeout ()); -} - static void test_path_first (void) { @@ -2907,8 +2914,8 @@ main (int argc, g_test_add_func ("/trap_subprocess/fail", test_subprocess_fail); g_test_add_func ("/trap_subprocess/no-such-test", test_subprocess_no_such_test); - if (g_test_slow ()) - g_test_add_func ("/trap_subprocess/timeout", test_subprocess_timeout); + g_test_add_func ("/trap_subprocess/timeout", test_subprocess_timeout); + g_test_add_func ("/trap_subprocess/envp", test_subprocess_envp); g_test_add_func ("/trap_subprocess/patterns", test_subprocess_patterns); @@ -2951,7 +2958,6 @@ main (int argc, g_test_add_func ("/misc/combining/subprocess/pass", test_pass); g_test_add_func ("/misc/fail", test_fail); g_test_add_func ("/misc/incomplete", test_incomplete); - g_test_add_func ("/misc/timeout", test_subprocess_timed_out); g_test_add_func ("/misc/path/first", test_path_first); g_test_add_func ("/misc/path/second", test_path_second); diff --git a/glib/tests/testutils.h b/glib/tests/testutils.h new file mode 100644 index 0000000..4a26b28 --- /dev/null +++ b/glib/tests/testutils.h @@ -0,0 +1,50 @@ +/* + * Copyright 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald + * Copyright 2023 Collabora Ltd. + * + * SPDX-License-Identifier: LicenseRef-old-glib-tests + * + * This work is provided "as is"; redistribution and modification + * in whole or in part, in any medium, physical or electronic is + * permitted without restriction. + * + * This work 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. + * + * In no event shall the authors 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. + */ + +#include "config.h" + +#include + +#include "glib-private.h" +#include "gstdio.h" + +static inline void +assert_fd_was_closed (int fd) +{ + /* We can't tell a fd was really closed without behaving as though it + * was still valid */ + if (g_test_undefined ()) + { + int result, errsv; + GWin32InvalidParameterHandler handler; + + GLIB_PRIVATE_CALL (g_win32_push_empty_invalid_parameter_handler) (&handler); + result = g_fsync (fd); + errsv = errno; + GLIB_PRIVATE_CALL (g_win32_pop_invalid_parameter_handler) (&handler); + + g_assert_cmpint (result, !=, 0); + g_assert_cmpint (errsv, ==, EBADF); + } +} diff --git a/glib/tests/thread-pool-slow.c b/glib/tests/thread-pool-slow.c index f4a4ad7..7b69373 100644 --- a/glib/tests/thread-pool-slow.c +++ b/glib/tests/thread-pool-slow.c @@ -16,20 +16,10 @@ static gulong abs_thread_counter = 0; static gulong running_thread_counter = 0; static gulong leftover_task_counter = 0; -G_LOCK_DEFINE_STATIC (last_thread); - -static guint last_thread_id = 0; - -G_LOCK_DEFINE_STATIC (thread_counter_sort); - -static gulong sort_thread_counter = 0; - static GThreadPool *idle_pool = NULL; -static GMainLoop *main_loop = NULL; - static void -test_thread_functions (void) +test_threadpool_functions (void) { gint max_unused_threads; guint max_idle_time; @@ -62,7 +52,7 @@ test_thread_functions (void) } static void -test_thread_stop_unused (void) +test_threadpool_stop_unused (void) { GThreadPool *pool; guint i; @@ -99,7 +89,7 @@ test_thread_stop_unused (void) } static void -test_thread_stop_unused_multiple (void) +test_threadpool_stop_unused_multiple (void) { GThreadPool *pools[10]; guint i, j; @@ -144,7 +134,7 @@ test_thread_stop_unused_multiple (void) } static void -test_thread_pools_entry_func (gpointer data, gpointer user_data) +test_threadpool_pools_entry_func (gpointer data, gpointer user_data) { G_LOCK (thread_counter_pools); abs_thread_counter++; @@ -161,15 +151,15 @@ test_thread_pools_entry_func (gpointer data, gpointer user_data) } static void -test_thread_pools (void) +test_threadpool_pools (void) { GThreadPool *pool1, *pool2, *pool3; guint runs; guint i; - pool1 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 3, FALSE, NULL); - pool2 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 5, TRUE, NULL); - pool3 = g_thread_pool_new ((GFunc)test_thread_pools_entry_func, NULL, 7, TRUE, NULL); + pool1 = g_thread_pool_new ((GFunc) test_threadpool_pools_entry_func, NULL, 3, FALSE, NULL); + pool2 = g_thread_pool_new ((GFunc) test_threadpool_pools_entry_func, NULL, 5, TRUE, NULL); + pool3 = g_thread_pool_new ((GFunc) test_threadpool_pools_entry_func, NULL, 7, TRUE, NULL); runs = 300; for (i = 0; i < runs; i++) @@ -192,7 +182,7 @@ test_thread_pools (void) } static gint -test_thread_sort_compare_func (gconstpointer a, gconstpointer b, gpointer user_data) +test_threadpool_sort_compare_func (gconstpointer a, gconstpointer b, gpointer user_data) { guint32 id1, id2; @@ -203,49 +193,40 @@ test_thread_sort_compare_func (gconstpointer a, gconstpointer b, gpointer user_d } static void -test_thread_sort_entry_func (gpointer data, gpointer user_data) +test_threadpool_sort_entry_func (gpointer data, gpointer user_data) { guint thread_id; gboolean is_sorted; + static GMutex last_thread_mutex; + static guint last_thread_id = 0; - G_LOCK (last_thread); + g_mutex_lock (&last_thread_mutex); thread_id = GPOINTER_TO_UINT (data); is_sorted = GPOINTER_TO_INT (user_data); - if (is_sorted) { - static gboolean last_failed = FALSE; + if (is_sorted) + { + if (last_thread_id != 0) + g_assert_cmpint (last_thread_id, <=, thread_id); - if (last_thread_id > thread_id) { - if (last_failed) { - g_assert_cmpint (last_thread_id, <=, thread_id); - } - - /* Here we remember one fail and if it concurrently fails, it - * can not be sorted. the last thread id might be < this thread - * id if something is added to the queue since threads were - * created - */ - last_failed = TRUE; - } else { - last_failed = FALSE; + last_thread_id = thread_id; } - last_thread_id = thread_id; - } - - G_UNLOCK (last_thread); + g_mutex_unlock (&last_thread_mutex); g_usleep (WAIT * 1000); } static void -test_thread_sort (gboolean sort) +test_threadpool_sort (gconstpointer data) { + gboolean sort = GPOINTER_TO_UINT (data); GThreadPool *pool; guint limit; guint max_threads; guint i; + GError *local_error = NULL; limit = MAX_THREADS * 10; @@ -261,11 +242,16 @@ test_thread_sort (gboolean sort) * Threads are scheduled by the operating system and are executed at * random. It cannot be assumed that threads are executed in the * order they are created. This was discussed in bug #334943. + * + * However, if testing sorting, we start with max-threads=0 so that all the + * work can be enqueued before starting the pool. This prevents a race between + * new work being enqueued out of sorted order, and work being pulled off the + * queue. */ - pool = g_thread_pool_new (test_thread_sort_entry_func, + pool = g_thread_pool_new (test_threadpool_sort_entry_func, GINT_TO_POINTER (sort), - max_threads, + sort ? 0 : max_threads, FALSE, NULL); @@ -273,7 +259,7 @@ test_thread_sort (gboolean sort) if (sort) { g_thread_pool_set_sort_function (pool, - test_thread_sort_compare_func, + test_threadpool_sort_compare_func, NULL); } @@ -290,6 +276,13 @@ test_thread_sort (gboolean sort) g_thread_pool_unprocessed (pool)); } + if (sort) + { + g_test_message ("Starting thread pool processing"); + g_thread_pool_set_max_threads (pool, max_threads, &local_error); + g_assert_no_error (local_error); + } + g_assert_cmpint (g_thread_pool_get_max_threads (pool), ==, (gint) max_threads); g_assert_cmpuint (g_thread_pool_get_num_threads (pool), <=, (guint) g_thread_pool_get_max_threads (pool)); @@ -297,31 +290,47 @@ test_thread_sort (gboolean sort) } static void -test_thread_idle_time_entry_func (gpointer data, gpointer user_data) +test_threadpool_idle_time_entry_func (gpointer data, gpointer user_data) { g_usleep (WAIT * 1000); } static gboolean -test_thread_idle_timeout (gpointer data) +test_threadpool_idle_timeout (gpointer data) { + gboolean *idle_timeout_called = data; gint i; + *idle_timeout_called = TRUE; + for (i = 0; i < 2; i++) { g_thread_pool_push (idle_pool, GUINT_TO_POINTER (100 + i), NULL); } - return FALSE; + g_main_context_wakeup (NULL); + + return G_SOURCE_REMOVE; +} + +static gboolean +poll_cb (gpointer data) +{ + g_main_context_wakeup (NULL); + return G_SOURCE_CONTINUE; } static void -test_thread_idle_time (void) +test_threadpool_idle_time (void) { guint limit = 50; guint interval = 10000; guint i; + guint idle; + gboolean idle_timeout_called = FALSE; + GSource *timeout_source = NULL; + GSource *poll_source = NULL; - idle_pool = g_thread_pool_new (test_thread_idle_time_entry_func, + idle_pool = g_thread_pool_new (test_threadpool_idle_time_entry_func, NULL, 0, FALSE, @@ -343,105 +352,32 @@ test_thread_idle_time (void) g_assert_cmpint (g_thread_pool_unprocessed (idle_pool), <=, limit); - g_timeout_add ((interval - 1000), - test_thread_idle_timeout, - GUINT_TO_POINTER (interval)); -} + timeout_source = g_timeout_source_new (interval - 1000); + g_source_set_callback (timeout_source, test_threadpool_idle_timeout, &idle_timeout_called, NULL); + g_source_attach (timeout_source, NULL); -static gboolean -test_check_start_and_stop (gpointer user_data) -{ - static guint test_number = 0; - static gboolean run_next = FALSE; - gboolean continue_timeout = TRUE; - gboolean quit = TRUE; + /* Wait until the idle timeout has been called at least once and there are no + * unused threads. We need a second timeout for this, to periodically wake + * the main context up, as there’s no way to be notified of changes to `idle`. + */ + poll_source = g_timeout_source_new (500); + g_source_set_callback (poll_source, poll_cb, NULL, NULL); + g_source_attach (poll_source, NULL); - if (test_number == 0) { - run_next = TRUE; - g_test_message ("***** RUNNING TEST %2.2d *****", test_number); - } - - if (run_next) { - test_number++; - - switch (test_number) { - case 1: - test_thread_functions (); - break; - case 2: - test_thread_stop_unused (); - break; - case 3: - test_thread_pools (); - break; - case 4: - test_thread_sort (FALSE); - break; - case 5: - test_thread_sort (TRUE); - break; - case 6: - test_thread_stop_unused (); - break; - case 7: - test_thread_stop_unused_multiple (); - break; - case 8: - test_thread_idle_time (); - break; - default: - g_test_message ("***** END OF TESTS *****"); - g_main_loop_quit (main_loop); - continue_timeout = FALSE; - break; + idle = g_thread_pool_get_num_unused_threads (); + while (!idle_timeout_called || idle > 0) + { + g_test_message ("Pool idle thread count: %d, unprocessed jobs: %d", + idle, g_thread_pool_unprocessed (idle_pool)); + g_main_context_iteration (NULL, TRUE); + idle = g_thread_pool_get_num_unused_threads (); } - run_next = FALSE; - return continue_timeout; - } - - if (test_number == 3) { - G_LOCK (thread_counter_pools); - quit &= running_thread_counter <= 0; - g_test_message ("***** POOL RUNNING THREAD COUNT:%ld", - running_thread_counter); - G_UNLOCK (thread_counter_pools); - } - - if (test_number == 4 || test_number == 5) { - G_LOCK (thread_counter_sort); - quit &= sort_thread_counter <= 0; - g_test_message ("***** POOL SORT THREAD COUNT:%ld", - sort_thread_counter); - G_UNLOCK (thread_counter_sort); - } - - if (test_number == 8) { - guint idle; - - idle = g_thread_pool_get_num_unused_threads (); - quit &= idle < 1; - g_test_message ("***** POOL IDLE THREAD COUNT:%d, UNPROCESSED JOBS:%d", - idle, g_thread_pool_unprocessed (idle_pool)); - } - - if (quit) { - run_next = TRUE; - } - - return continue_timeout; -} - -static void -test_threadpool_basics (void) -{ - g_timeout_add (1000, test_check_start_and_stop, NULL); - - main_loop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (main_loop); - g_main_loop_unref (main_loop); - g_thread_pool_free (idle_pool, FALSE, TRUE); + g_source_destroy (poll_source); + g_source_unref (poll_source); + g_source_destroy (timeout_source); + g_source_unref (timeout_source); } int @@ -449,7 +385,13 @@ main (int argc, char *argv[]) { g_test_init (&argc, &argv, NULL); - g_test_add_func ("/threadpool/basics", test_threadpool_basics); + g_test_add_func ("/threadpool/functions", test_threadpool_functions); + g_test_add_func ("/threadpool/stop-unused", test_threadpool_stop_unused); + g_test_add_func ("/threadpool/pools", test_threadpool_pools); + g_test_add_data_func ("/threadpool/no-sort", GUINT_TO_POINTER (FALSE), test_threadpool_sort); + g_test_add_data_func ("/threadpool/sort", GUINT_TO_POINTER (TRUE), test_threadpool_sort); + g_test_add_func ("/threadpool/stop-unused-multiple", test_threadpool_stop_unused_multiple); + g_test_add_func ("/threadpool/idle-time", test_threadpool_idle_time); return g_test_run (); } diff --git a/glib/tests/thread.c b/glib/tests/thread.c index 25c62cc..6e87796 100644 --- a/glib/tests/thread.c +++ b/glib/tests/thread.c @@ -212,6 +212,47 @@ test_thread6 (void) g_thread_join (thread); } +#if defined(_SC_NPROCESSORS_ONLN) && defined(THREADS_POSIX) && defined(HAVE_PTHREAD_GETAFFINITY_NP) +static gpointer +thread7_func (gpointer data) +{ + int idx = 0, err; + int ncores = sysconf (_SC_NPROCESSORS_ONLN); + + cpu_set_t old_mask, new_mask; + + err = pthread_getaffinity_np (pthread_self (), sizeof (old_mask), &old_mask); + CPU_ZERO (&new_mask); + g_assert_cmpint (err, ==, 0); + + for (idx = 0; idx < ncores; ++idx) + if (CPU_ISSET (idx, &old_mask)) + { + CPU_SET (idx, &new_mask); + break; + } + + err = pthread_setaffinity_np (pthread_self (), sizeof (new_mask), &new_mask); + g_assert_cmpint (err, ==, 0); + + int af_count = g_get_num_processors (); + return GINT_TO_POINTER (af_count); +} +#endif + +static void +test_thread7 (void) +{ +#if defined(_SC_NPROCESSORS_ONLN) && defined(THREADS_POSIX) && defined(HAVE_PTHREAD_GETAFFINITY_NP) + GThread *thread = g_thread_new ("mask", thread7_func, NULL); + gpointer result = g_thread_join (thread); + + g_assert_cmpint (GPOINTER_TO_INT (result), ==, 1); +#else + g_test_skip ("Skipping because pthread_getaffinity_np() is not available"); +#endif +} + int main (int argc, char *argv[]) { @@ -223,6 +264,7 @@ main (int argc, char *argv[]) g_test_add_func ("/thread/thread4", test_thread4); g_test_add_func ("/thread/thread5", test_thread5); g_test_add_func ("/thread/thread6", test_thread6); + g_test_add_func ("/thread/thread7", test_thread7); return g_test_run (); } diff --git a/glib/tests/unicode.c b/glib/tests/unicode.c index 5d66977..e91425a 100644 --- a/glib/tests/unicode.c +++ b/glib/tests/unicode.c @@ -173,6 +173,11 @@ test_unichar_break_type (void) { G_UNICODE_BREAK_EMOJI_BASE, 0x1F466 }, { G_UNICODE_BREAK_EMOJI_MODIFIER, 0x1F3FB }, { G_UNICODE_BREAK_ZERO_WIDTH_JOINER, 0x200D }, + { G_UNICODE_BREAK_AKSARA, 0x1B45 }, + { G_UNICODE_BREAK_AKSARA_PRE_BASE, 0x1193F }, + { G_UNICODE_BREAK_AKSARA_START, 0x11F50 }, + { G_UNICODE_BREAK_VIRAMA_FINAL, 0x1BF3 }, + { G_UNICODE_BREAK_VIRAMA, 0xA9C0 }, }; for (i = 0; i < G_N_ELEMENTS (examples); i++) diff --git a/glib/tests/unix.c b/glib/tests/unix.c index ab6efaa..1defb3d 100644 --- a/glib/tests/unix.c +++ b/glib/tests/unix.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2011 Red Hat, Inc. + * Copyright 2023 Collabora Ltd. * * SPDX-License-Identifier: LicenseRef-old-glib-tests * @@ -25,6 +26,7 @@ #include "config.h" +#include "glib-private.h" #include "glib-unix.h" #include "gstdio.h" @@ -32,6 +34,189 @@ #include #include +#include "testutils.h" + +static void +async_signal_safe_message (const char *message) +{ + if (write (2, message, strlen (message)) < 0 || + write (2, "\n", 1) < 0) + { + /* ignore: not much we can do */ + } +} + +static void +test_closefrom (void) +{ + /* Enough file descriptors to be confident that we're operating on + * all of them */ + const int N_FDS = 20; + int *fds; + int fd; + int i; + pid_t child; + int wait_status; + + /* The loop that populates @fds with pipes assumes this */ + g_assert (N_FDS % 2 == 0); + + g_test_summary ("Test g_closefrom(), g_fdwalk_set_cloexec()"); + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/3247"); + + for (fd = 0; fd <= 2; fd++) + { + int flags; + + g_assert_no_errno ((flags = fcntl (fd, F_GETFD))); + g_assert_no_errno (fcntl (fd, F_SETFD, flags & ~FD_CLOEXEC)); + } + + fds = g_new0 (int, N_FDS); + + for (i = 0; i < N_FDS; i += 2) + { + GError *error = NULL; + int pipefd[2]; + int res; + + /* Intentionally neither O_CLOEXEC nor FD_CLOEXEC */ + res = g_unix_open_pipe (pipefd, 0, &error); + g_assert (res); + g_assert_no_error (error); + g_clear_error (&error); + fds[i] = pipefd[0]; + fds[i + 1] = pipefd[1]; + } + + child = fork (); + + /* Child process exits with status = 100 + the first wrong fd, + * or 0 if all were correct */ + if (child == 0) + { + for (i = 0; i < N_FDS; i++) + { + int flags = fcntl (fds[i], F_GETFD); + + if (flags == -1) + { + async_signal_safe_message ("fd should not have been closed"); + _exit (100 + fds[i]); + } + + if (flags & FD_CLOEXEC) + { + async_signal_safe_message ("fd should not have been close-on-exec yet"); + _exit (100 + fds[i]); + } + } + + g_fdwalk_set_cloexec (3); + + for (i = 0; i < N_FDS; i++) + { + int flags = fcntl (fds[i], F_GETFD); + + if (flags == -1) + { + async_signal_safe_message ("fd should not have been closed"); + _exit (100 + fds[i]); + } + + if (!(flags & FD_CLOEXEC)) + { + async_signal_safe_message ("fd should have been close-on-exec"); + _exit (100 + fds[i]); + } + } + + g_closefrom (3); + + for (fd = 0; fd <= 2; fd++) + { + int flags = fcntl (fd, F_GETFD); + + if (flags == -1) + { + async_signal_safe_message ("fd should not have been closed"); + _exit (100 + fd); + } + + if (flags & FD_CLOEXEC) + { + async_signal_safe_message ("fd should not have been close-on-exec"); + _exit (100 + fd); + } + } + + for (i = 0; i < N_FDS; i++) + { + if (fcntl (fds[i], F_GETFD) != -1 || errno != EBADF) + { + async_signal_safe_message ("fd should have been closed"); + _exit (100 + fds[i]); + } + } + + _exit (0); + } + + g_assert_no_errno (waitpid (child, &wait_status, 0)); + + if (WIFEXITED (wait_status)) + { + int exit_status = WEXITSTATUS (wait_status); + + if (exit_status != 0) + g_test_fail_printf ("File descriptor %d in incorrect state", exit_status - 100); + } + else + { + g_test_fail_printf ("Unexpected wait status %d", wait_status); + } + + for (i = 0; i < N_FDS; i++) + { + GError *error = NULL; + + g_close (fds[i], &error); + g_assert_no_error (error); + g_clear_error (&error); + } + + g_free (fds); + + if (g_test_undefined ()) + { + g_test_trap_subprocess ("/glib-unix/closefrom/subprocess/einval", + 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + } +} + +static void +test_closefrom_subprocess_einval (void) +{ + int res; + int errsv; + + g_log_set_always_fatal (G_LOG_FATAL_MASK); + g_log_set_fatal_mask ("GLib", G_LOG_FATAL_MASK); + + errno = 0; + res = g_closefrom (-1); + errsv = errno; + g_assert_cmpint (res, ==, -1); + g_assert_cmpint (errsv, ==, EINVAL); + + errno = 0; + res = g_fdwalk_set_cloexec (-42); + errsv = errno; + g_assert_cmpint (res, ==, -1); + g_assert_cmpint (errsv, ==, EINVAL); +} + static void test_pipe (void) { @@ -122,6 +307,116 @@ test_pipe_stdio_overwrite (void) g_assert_no_error (error); } +static void +test_pipe_struct (void) +{ + GError *error = NULL; + GUnixPipe pair = G_UNIX_PIPE_INIT; + char buf[1024]; + gssize bytes_read; + gboolean res; + int read_end = -1; /* owned */ + int write_end = -1; /* unowned */ + int errsv; + + g_test_summary ("Test GUnixPipe structure"); + + res = g_unix_pipe_open (&pair, O_CLOEXEC, &error); + g_assert_no_error (error); + g_assert_true (res); + + read_end = g_unix_pipe_steal (&pair, G_UNIX_PIPE_END_READ); + g_assert_cmpint (read_end, >=, 0); + g_assert_cmpint (g_unix_pipe_steal (&pair, G_UNIX_PIPE_END_READ), ==, -1); + g_assert_cmpint (g_unix_pipe_get (&pair, G_UNIX_PIPE_END_READ), ==, -1); + write_end = g_unix_pipe_get (&pair, G_UNIX_PIPE_END_WRITE); + g_assert_cmpint (write_end, >=, 0); + g_assert_cmpint (g_unix_pipe_get (&pair, G_UNIX_PIPE_END_WRITE), ==, write_end); + + g_assert_cmpint (write (write_end, "hello", sizeof ("hello")), ==, sizeof ("hello")); + memset (buf, 0, sizeof (buf)); + bytes_read = read (read_end, buf, sizeof(buf) - 1); + g_assert_cmpint (bytes_read, ==, sizeof ("hello")); + buf[bytes_read] = '\0'; + + /* This is one of the few errno values guaranteed by Standard C. + * We set it here to check that g_unix_pipe_clear doesn't alter errno. */ + errno = EILSEQ; + + g_unix_pipe_clear (&pair); + errsv = errno; + g_assert_cmpint (errsv, ==, EILSEQ); + + g_assert_cmpint (pair.fds[0], ==, -1); + g_assert_cmpint (pair.fds[1], ==, -1); + + /* The read end wasn't closed, because it was stolen first */ + g_clear_fd (&read_end, &error); + g_assert_no_error (error); + + /* The write end was closed, because it wasn't stolen */ + assert_fd_was_closed (write_end); + + g_assert_cmpstr (buf, ==, "hello"); +} + +static void +test_pipe_struct_auto (void) +{ +#ifdef g_autofree + int i; + + g_test_summary ("Test g_auto(GUnixPipe)"); + + /* Let g_auto close the read end, the write end, neither, or both */ + for (i = 0; i < 4; i++) + { + int read_end = -1; /* unowned */ + int write_end = -1; /* unowned */ + int errsv; + + { + g_auto(GUnixPipe) pair = G_UNIX_PIPE_INIT; + GError *error = NULL; + gboolean res; + + res = g_unix_pipe_open (&pair, O_CLOEXEC, &error); + g_assert_no_error (error); + g_assert_true (res); + + read_end = pair.fds[G_UNIX_PIPE_END_READ]; + g_assert_cmpint (read_end, >=, 0); + write_end = pair.fds[G_UNIX_PIPE_END_WRITE]; + g_assert_cmpint (write_end, >=, 0); + + if (i & 1) + { + /* This also exercises g_unix_pipe_close() with error */ + res = g_unix_pipe_close (&pair, G_UNIX_PIPE_END_READ, &error); + g_assert_no_error (error); + g_assert_true (res); + } + + /* This also exercises g_unix_pipe_close() without error */ + if (i & 2) + g_unix_pipe_close (&pair, G_UNIX_PIPE_END_WRITE, NULL); + + /* This is one of the few errno values guaranteed by Standard C. + * We set it here to check that a g_auto(GUnixPipe) close doesn't + * alter errno. */ + errno = EILSEQ; + } + + errsv = errno; + g_assert_cmpint (errsv, ==, EILSEQ); + assert_fd_was_closed (read_end); + assert_fd_was_closed (write_end); + } +#else + g_test_skip ("g_auto not supported by compiler"); +#endif +} + static void test_error (void) { @@ -499,9 +794,14 @@ main (int argc, { g_test_init (&argc, &argv, NULL); + g_test_add_func ("/glib-unix/closefrom", test_closefrom); + g_test_add_func ("/glib-unix/closefrom/subprocess/einval", + test_closefrom_subprocess_einval); g_test_add_func ("/glib-unix/pipe", test_pipe); g_test_add_func ("/glib-unix/pipe/fd-cloexec", test_pipe_fd_cloexec); g_test_add_func ("/glib-unix/pipe-stdio-overwrite", test_pipe_stdio_overwrite); + g_test_add_func ("/glib-unix/pipe-struct", test_pipe_struct); + g_test_add_func ("/glib-unix/pipe-struct-auto", test_pipe_struct_auto); g_test_add_func ("/glib-unix/error", test_error); g_test_add_func ("/glib-unix/nonblocking", test_nonblocking); g_test_add_func ("/glib-unix/sighup", test_sighup); diff --git a/glib/tests/uri.c b/glib/tests/uri.c index 94a0d5d..5e12ab2 100644 --- a/glib/tests/uri.c +++ b/glib/tests/uri.c @@ -132,6 +132,8 @@ file_from_uri_tests[] = { { "file://%E5%E4%F6/etc", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, { "file:///some/file?query", "/some/file", NULL, 0 }, { "file:///some/file#bad", "/some/file", NULL, 0 }, + { "file:///some/file?query#frag", "/some/file", NULL, 0 }, + { "file:///some/file#fr?ag", "/some/file", NULL, 0 }, { "file://some", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, { "", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, { "file:test", NULL, NULL, G_CONVERT_ERROR_BAD_URI}, diff --git a/glib/tests/utils.c b/glib/tests/utils.c index 3abef93..e71d9a6 100644 --- a/glib/tests/utils.c +++ b/glib/tests/utils.c @@ -211,8 +211,27 @@ test_prgname_thread_safety (void) static void test_tmpdir (void) { + char **envp = NULL; + g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=627969"); - g_assert_cmpstr (g_get_tmp_dir (), !=, ""); + g_test_summary ("Test that g_get_tmp_dir() returns a correct default if TMPDIR is set to the empty string"); + + if (g_test_subprocess ()) + { + g_assert_cmpstr (g_get_tmp_dir (), !=, ""); + return; + } + + envp = g_get_environ (); + + envp = g_environ_setenv (g_steal_pointer (&envp), "TMPDIR", "", TRUE); + envp = g_environ_unsetenv (g_steal_pointer (&envp), "TMP"); + envp = g_environ_unsetenv (g_steal_pointer (&envp), "TEMP"); + + g_test_trap_subprocess_with_envp (NULL, (const gchar * const *) envp, + 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_strfreev (envp); } #if defined(__GNUC__) && (__GNUC__ >= 4) @@ -1309,11 +1328,6 @@ main (int argc, { argv0 = argv[0]; - /* for tmpdir test, need to do this early before g_get_any_init */ - g_setenv ("TMPDIR", "", TRUE); - g_unsetenv ("TMP"); - g_unsetenv ("TEMP"); - /* g_test_init() only calls g_set_prgname() if g_get_prgname() * returns %NULL, but g_get_prgname() on Windows never returns NULL. * So we need to do this by hand to make test_appname() work on diff --git a/glib/tests/win32.c b/glib/tests/win32.c index 748692d..18772c1 100644 --- a/glib/tests/win32.c +++ b/glib/tests/win32.c @@ -44,7 +44,7 @@ test_subst_pid_and_event (void) char *debugger_big_utf8; gchar *output; guintptr be = (guintptr) 0xFFFFFFFF; - DWORD bp = G_MAXSIZE; + DWORD bp = MAXDWORD; /* %f is not valid */ g_assert_false (_g_win32_subst_pid_and_event_w (debugger_3, G_N_ELEMENTS (debugger_3), diff --git a/glib/valgrind.h b/glib/valgrind.h index a7f1f56..6f1c452 100644 --- a/glib/valgrind.h +++ b/glib/valgrind.h @@ -93,6 +93,7 @@ #include +#include /* Nb: this file might be included in a file compiled with -ansi. So we can't use C++ style "//" comments nor the "asm" keyword (instead @@ -411,14 +412,14 @@ typedef _zzq_default, _zzq_request, \ _zzq_arg1, _zzq_arg2, _zzq_arg3, _zzq_arg4, _zzq_arg5) \ __extension__ \ - ({ volatile unsigned long int _zzq_args[6]; \ + ({ volatile uintptr_t _zzq_args[6]; \ volatile unsigned long int _zzq_result; \ - _zzq_args[0] = (unsigned long int)(_zzq_request); \ - _zzq_args[1] = (unsigned long int)(_zzq_arg1); \ - _zzq_args[2] = (unsigned long int)(_zzq_arg2); \ - _zzq_args[3] = (unsigned long int)(_zzq_arg3); \ - _zzq_args[4] = (unsigned long int)(_zzq_arg4); \ - _zzq_args[5] = (unsigned long int)(_zzq_arg5); \ + _zzq_args[0] = (uintptr_t)(_zzq_request); \ + _zzq_args[1] = (uintptr_t)(_zzq_arg1); \ + _zzq_args[2] = (uintptr_t)(_zzq_arg2); \ + _zzq_args[3] = (uintptr_t)(_zzq_arg3); \ + _zzq_args[4] = (uintptr_t)(_zzq_arg4); \ + _zzq_args[5] = (uintptr_t)(_zzq_arg5); \ __asm__ volatile(__SPECIAL_INSTRUCTION_PREAMBLE \ /* %RDX = client_request ( %RAX ) */ \ "xchgq %%rbx,%%rbx" \ diff --git a/gmodule/gmodule-dl.c b/gmodule/gmodule-dl.c index 81b1b9f..85062d0 100644 --- a/gmodule/gmodule-dl.c +++ b/gmodule/gmodule-dl.c @@ -167,7 +167,7 @@ _g_module_self (void) * NULL is given, dlsym returns an appropriate pointer. */ lock_dlerror (); -#if defined(__BIONIC__) || defined(__NetBSD__) +#if defined(__BIONIC__) || defined(__NetBSD__) || defined(__FreeBSD__) handle = RTLD_DEFAULT; #else handle = dlopen (NULL, RTLD_GLOBAL | RTLD_LAZY); @@ -182,7 +182,7 @@ _g_module_self (void) static void _g_module_close (gpointer handle) { -#if defined(__BIONIC__) || defined(__NetBSD__) +#if defined(__BIONIC__) || defined(__NetBSD__) || defined(__FreeBSD__) if (handle != RTLD_DEFAULT) #endif { diff --git a/gmodule/gmodule.c b/gmodule/gmodule.c index aafaaf0..09797c9 100644 --- a/gmodule/gmodule.c +++ b/gmodule/gmodule.c @@ -52,84 +52,6 @@ #include "gmoduleconf.h" #include "gstdio.h" -/** - * SECTION:modules - * @title: Dynamic Loading of Modules - * @short_description: portable method for dynamically loading 'plug-ins' - * - * These functions provide a portable way to dynamically load object files - * (commonly known as 'plug-ins'). The current implementation supports all - * systems that provide an implementation of dlopen() (e.g. Linux/Sun), as - * well as Windows platforms via DLLs. - * - * A program which wants to use these functions must be linked to the - * libraries output by the command `pkg-config --libs gmodule-2.0`. - * - * To use them you must first determine whether dynamic loading - * is supported on the platform by calling g_module_supported(). - * If it is, you can open a module with g_module_open(), - * find the module's symbols (e.g. function names) with g_module_symbol(), - * and later close the module with g_module_close(). - * g_module_name() will return the file name of a currently opened module. - * - * If any of the above functions fail, the error status can be found with - * g_module_error(). - * - * The #GModule implementation features reference counting for opened modules, - * and supports hook functions within a module which are called when the - * module is loaded and unloaded (see #GModuleCheckInit and #GModuleUnload). - * - * If your module introduces static data to common subsystems in the running - * program, e.g. through calling - * `g_quark_from_static_string ("my-module-stuff")`, - * it must ensure that it is never unloaded, by calling g_module_make_resident(). - * - * Example: Calling a function defined in a GModule - * |[ - * // the function signature for 'say_hello' - * typedef void (* SayHelloFunc) (const char *message); - * - * gboolean - * just_say_hello (const char *filename, GError **error) - * { - * SayHelloFunc say_hello; - * GModule *module; - * - * module = g_module_open (filename, G_MODULE_BIND_LAZY); - * if (!module) - * { - * g_set_error (error, FOO_ERROR, FOO_ERROR_BLAH, - * "%s", g_module_error ()); - * return FALSE; - * } - * - * if (!g_module_symbol (module, "say_hello", (gpointer *)&say_hello)) - * { - * g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, - * "%s: %s", filename, g_module_error ()); - * if (!g_module_close (module)) - * g_warning ("%s: %s", filename, g_module_error ()); - * return FALSE; - * } - * - * if (say_hello == NULL) - * { - * g_set_error (error, SAY_ERROR, SAY_ERROR_OPEN, - * "symbol say_hello is NULL"); - * if (!g_module_close (module)) - * g_warning ("%s: %s", filename, g_module_error ()); - * return FALSE; - * } - * - * // call our function in the module - * say_hello ("Hello world!"); - * - * if (!g_module_close (module)) - * g_warning ("%s: %s", filename, g_module_error ()); - * return TRUE; - * } - * ]| - */ /** * GModule: @@ -513,7 +435,9 @@ static GRecMutex g_module_global_lock; * @error: #GError. * * Opens a module. If the module has already been opened, its reference count - * is incremented. If not, the module is searched in the following order: + * is incremented. If not, the module is searched using @file_name. + * + * Since 2.76, the search order/behavior is as follows: * * 1. If @file_name exists as a regular file, it is used as-is; else * 2. If @file_name doesn't have the correct suffix and/or prefix for the @@ -524,10 +448,15 @@ static GRecMutex g_module_global_lock; * libtool archive is parsed to find the actual file name, and that is * used. * - * At the end of all this, we would have a file path that we can access on - * disk, and it is opened as a module. If not, @file_name is opened as - * a module verbatim in the hopes that the system implementation will somehow - * be able to access it. + * If, at the end of all this, we have a file path that we can access on disk, + * it is opened as a module. If not, @file_name is attempted to be opened as a + * module verbatim in the hopes that the system implementation will somehow be + * able to access it. If that is not possible, %NULL is returned. + * + * Note that this behaviour was different prior to 2.76, but there is some + * overlap in functionality. If backwards compatibility is an issue, kindly + * consult earlier #GModule documentation for the prior search order/behavior + * of @file_name. * * Returns: a #GModule on success, or %NULL on failure * diff --git a/gmodule/meson.build b/gmodule/meson.build index da4d06c..c7f2651 100644 --- a/gmodule/meson.build +++ b/gmodule/meson.build @@ -65,6 +65,7 @@ gmoduleconf_h = configure_file(input : 'gmoduleconf.h.in', # when it includes GLib as a subproject gmodule_h = files('gmodule.h') gmodule_c = files('gmodule.c') +gmodule_deprecated_c = files('gmodule-deprecated.c') install_headers([gmodule_h], install_dir : glib_includedir) @@ -77,9 +78,9 @@ gmodule_visibility_h = custom_target( install_tag: 'devel', ) -gmodule_sources = [gmodule_c, gmodule_visibility_h, 'gmodule-deprecated.c'] +gmodule_sources = [gmodule_c, gmodule_visibility_h, gmodule_deprecated_c] -if host_system == 'windows' +if host_system == 'windows' and glib_build_shared gmodule_win_rc = configure_file( input: 'gmodule.rc.in', output: 'gmodule.rc', diff --git a/gobject/gbinding.c b/gobject/gbinding.c index 204dc44..8c242e3 100644 --- a/gobject/gbinding.c +++ b/gobject/gbinding.c @@ -21,36 +21,33 @@ */ /** - * SECTION:gbinding - * @Title: GBinding - * @Short_Description: Bind two object properties + * GBinding: * - * #GBinding is the representation of a binding between a property on a - * #GObject instance (or source) and another property on another #GObject + * `GObject` instance (or source) and another property on another `GObject` * instance (or target). * * Whenever the source property changes, the same value is applied to the * target property; for instance, the following binding: * - * |[ + * ```c * g_object_bind_property (object1, "property-a", * object2, "property-b", * G_BINDING_DEFAULT); - * ]| + * ``` * * will cause the property named "property-b" of @object2 to be updated - * every time g_object_set() or the specific accessor changes the value of + * every time [method@GObject.set] or the specific accessor changes the value of * the property "property-a" of @object1. * * It is possible to create a bidirectional binding between two properties - * of two #GObject instances, so that if either property changes, the + * of two `GObject` instances, so that if either property changes, the * other is updated as well, for instance: * - * |[ + * ```c * g_object_bind_property (object1, "property-a", * object2, "property-b", * G_BINDING_BIDIRECTIONAL); - * ]| + * ``` * * will keep the two properties in sync. * @@ -59,14 +56,14 @@ * transformation from the source value to the target value before * applying it; for instance, the following binding: * - * |[ + * ```c * g_object_bind_property_full (adjustment1, "value", * adjustment2, "value", * G_BINDING_BIDIRECTIONAL, * celsius_to_fahrenheit, * fahrenheit_to_celsius, * NULL, NULL); - * ]| + * ``` * * will keep the "value" property of the two adjustments in sync; the * @celsius_to_fahrenheit function will be called whenever the "value" @@ -80,29 +77,29 @@ * * Note that #GBinding does not resolve cycles by itself; a cycle like * - * |[ + * ``` * object1:propertyA -> object2:propertyB * object2:propertyB -> object3:propertyC * object3:propertyC -> object1:propertyA - * ]| + * ``` * * might lead to an infinite loop. The loop, in this particular case, - * can be avoided if the objects emit the #GObject::notify signal only + * can be avoided if the objects emit the `GObject::notify` signal only * if the value has effectively been changed. A binding is implemented - * using the #GObject::notify signal, so it is susceptible to all the - * various ways of blocking a signal emission, like g_signal_stop_emission() - * or g_signal_handler_block(). + * using the `GObject::notify` signal, so it is susceptible to all the + * various ways of blocking a signal emission, like [func@GObject.signal_stop_emission] + * or [func@GObject.signal_handler_block]. * * A binding will be severed, and the resources it allocates freed, whenever - * either one of the #GObject instances it refers to are finalized, or when + * either one of the `GObject` instances it refers to are finalized, or when * the #GBinding instance loses its last reference. * * Bindings for languages with garbage collection can use - * g_binding_unbind() to explicitly release a binding between the source + * [method@GObject.Binding.unbind] to explicitly release a binding between the source * and target properties, instead of relying on the last reference on the * binding, source, and target instances to drop. * - * #GBinding is available since GObject 2.26 + * Since: 2.26 */ #include "config.h" @@ -123,9 +120,9 @@ GType g_binding_flags_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { static const GFlagsValue values[] = { { G_BINDING_DEFAULT, "G_BINDING_DEFAULT", "default" }, @@ -136,7 +133,7 @@ g_binding_flags_get_type (void) }; GType g_define_type_id = g_flags_register_static (g_intern_static_string ("GBindingFlags"), values); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; @@ -889,9 +886,7 @@ g_binding_class_init (GBindingClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_SOURCE, - g_param_spec_object ("source", - P_("Source"), - P_("The source of the binding"), + g_param_spec_object ("source", NULL, NULL, G_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | @@ -904,9 +899,7 @@ g_binding_class_init (GBindingClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_TARGET, - g_param_spec_object ("target", - P_("Target"), - P_("The target of the binding"), + g_param_spec_object ("target", NULL, NULL, G_TYPE_OBJECT, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | @@ -923,9 +916,7 @@ g_binding_class_init (GBindingClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_SOURCE_PROPERTY, - g_param_spec_string ("source-property", - P_("Source Property"), - P_("The property on the source to bind"), + g_param_spec_string ("source-property", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | @@ -942,9 +933,7 @@ g_binding_class_init (GBindingClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_TARGET_PROPERTY, - g_param_spec_string ("target-property", - P_("Target Property"), - P_("The property on the target to bind"), + g_param_spec_string ("target-property", NULL, NULL, NULL, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | @@ -957,9 +946,7 @@ g_binding_class_init (GBindingClass *klass) * Since: 2.26 */ g_object_class_install_property (gobject_class, PROP_FLAGS, - g_param_spec_flags ("flags", - P_("Flags"), - P_("The binding flags"), + g_param_spec_flags ("flags", NULL, NULL, G_TYPE_BINDING_FLAGS, G_BINDING_DEFAULT, G_PARAM_CONSTRUCT_ONLY | diff --git a/gobject/gbinding.h b/gobject/gbinding.h index 8504de2..4c7da7e 100644 --- a/gobject/gbinding.h +++ b/gobject/gbinding.h @@ -38,14 +38,6 @@ G_BEGIN_DECLS #define G_BINDING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_TYPE_BINDING, GBinding)) #define G_IS_BINDING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_BINDING)) -/** - * GBinding: - * - * GBinding is an opaque structure whose members - * cannot be accessed directly. - * - * Since: 2.26 - */ typedef struct _GBinding GBinding; /** diff --git a/gobject/gbindinggroup.c b/gobject/gbindinggroup.c index e5c8980..55e691b 100644 --- a/gobject/gbindinggroup.c +++ b/gobject/gbindinggroup.c @@ -27,18 +27,15 @@ #include "gparamspecs.h" /** - * SECTION:gbindinggroup - * @Title: GBindingGroup - * @Short_description: Binding multiple properties as a group - * @include: glib-object.h + * GBindingGroup: * - * The #GBindingGroup can be used to bind multiple properties + * `GBindingGroup` can be used to bind multiple properties * from an object collectively. * * Use the various methods to bind properties from a single source * object to multiple destination objects. Properties can be bound * bidirectionally and are connected when the source object is set - * with g_binding_group_set_source(). + * with [method@GObject.BindingGroup.set_source]. * * Since: 2.72 */ @@ -341,16 +338,14 @@ g_binding_group_class_init (GBindingGroupClass *klass) object_class->set_property = g_binding_group_set_property; /** - * GBindingGroup:source: (nullable) + * GBindingGroup:source: * * The source object used for binding properties. * * Since: 2.72 */ properties[PROP_SOURCE] = - g_param_spec_object ("source", - "Source", - "The source GObject used for binding properties.", + g_param_spec_object ("source", NULL, NULL, G_TYPE_OBJECT, (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); diff --git a/gobject/gbindinggroup.h b/gobject/gbindinggroup.h index 4cbdfe4..3985791 100644 --- a/gobject/gbindinggroup.h +++ b/gobject/gbindinggroup.h @@ -36,14 +36,6 @@ G_BEGIN_DECLS #define G_IS_BINDING_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_BINDING_GROUP)) #define G_TYPE_BINDING_GROUP (g_binding_group_get_type()) -/** - * GBindingGroup: - * - * GBindingGroup is an opaque structure whose members - * cannot be accessed directly. - * - * Since: 2.72 - */ typedef struct _GBindingGroup GBindingGroup; GOBJECT_AVAILABLE_IN_2_72 diff --git a/gobject/gboxed.c b/gobject/gboxed.c index 242ba09..04ceded 100644 --- a/gobject/gboxed.c +++ b/gobject/gboxed.c @@ -33,35 +33,6 @@ #include "gvaluearray.h" #include "gvaluecollector.h" - -/** - * SECTION:gboxed - * @short_description: A mechanism to wrap opaque C structures registered - * by the type system - * @see_also: #GParamSpecBoxed, g_param_spec_boxed() - * @title: Boxed Types - * - * #GBoxed is a generic wrapper mechanism for arbitrary C structures. - * - * The only thing the type system needs to know about the structures is how to - * copy them (a #GBoxedCopyFunc) and how to free them (a #GBoxedFreeFunc); - * beyond that, they are treated as opaque chunks of memory. - * - * Boxed types are useful for simple value-holder structures like rectangles or - * points. They can also be used for wrapping structures defined in non-#GObject - * based libraries. They allow arbitrary structures to be handled in a uniform - * way, allowing uniform copying (or referencing) and freeing (or unreferencing) - * of them, and uniform representation of the type of the contained structure. - * In turn, this allows any type which can be boxed to be set as the data in a - * #GValue, which allows for polymorphic handling of a much wider range of data - * types, and hence usage of such types as #GObject property values. - * - * #GBoxed is designed so that reference counted types can be boxed. Use the - * type’s ‘ref’ function as the #GBoxedCopyFunc, and its ‘unref’ function as the - * #GBoxedFreeFunc. For example, for #GBytes, the #GBoxedCopyFunc is - * g_bytes_ref(), and the #GBoxedFreeFunc is g_bytes_unref(). - */ - static inline void /* keep this function in sync with gvalue.c */ value_meminit (GValue *value, GType value_type) @@ -167,6 +138,9 @@ G_DEFINE_BOXED_TYPE (GTimeZone, g_time_zone, g_time_zone_ref, g_time_zone_unref) G_DEFINE_BOXED_TYPE (GKeyFile, g_key_file, g_key_file_ref, g_key_file_unref) G_DEFINE_BOXED_TYPE (GMappedFile, g_mapped_file, g_mapped_file_ref, g_mapped_file_unref) G_DEFINE_BOXED_TYPE (GBookmarkFile, g_bookmark_file, g_bookmark_file_copy, g_bookmark_file_free) +G_DEFINE_BOXED_TYPE (GHmac, g_hmac, g_hmac_ref, g_hmac_unref) +G_DEFINE_BOXED_TYPE (GDir, g_dir, g_dir_ref, g_dir_unref) +G_DEFINE_BOXED_TYPE (GRand, g_rand, g_rand_copy, g_rand_free) G_DEFINE_BOXED_TYPE (GMainLoop, g_main_loop, g_main_loop_ref, g_main_loop_unref) G_DEFINE_BOXED_TYPE (GMainContext, g_main_context, g_main_context_ref, g_main_context_unref) @@ -181,20 +155,22 @@ G_DEFINE_BOXED_TYPE (GUri, g_uri, g_uri_ref, g_uri_unref) G_DEFINE_BOXED_TYPE (GOptionGroup, g_option_group, g_option_group_ref, g_option_group_unref) G_DEFINE_BOXED_TYPE (GPatternSpec, g_pattern_spec, g_pattern_spec_copy, g_pattern_spec_free); +G_DEFINE_BOXED_TYPE (GStrvBuilder, g_strv_builder, g_strv_builder_ref, g_strv_builder_unref); + /* This one can't use G_DEFINE_BOXED_TYPE (GStrv, g_strv, g_strdupv, g_strfreev) */ GType g_strv_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { GType g_define_type_id = g_boxed_type_register_static (g_intern_static_string ("GStrv"), (GBoxedCopyFunc) g_strdupv, (GBoxedFreeFunc) g_strfreev); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; @@ -280,8 +256,8 @@ boxed_proxy_lcopy_value (const GValue *value, /** * g_boxed_type_register_static: * @name: Name of the new boxed type. - * @boxed_copy: Boxed structure copy function. - * @boxed_free: Boxed structure free function. + * @boxed_copy: (scope forever): Boxed structure copy function. + * @boxed_free: (scope forever): Boxed structure free function. * * This function creates a new %G_TYPE_BOXED derived type id for a new * boxed type with name @name. diff --git a/gobject/gclosure.c b/gobject/gclosure.c index 8d5d88d..af219c2 100644 --- a/gobject/gclosure.c +++ b/gobject/gclosure.c @@ -39,11 +39,13 @@ /** - * SECTION:gclosure - * @short_description: Functions as first-class objects - * @title: Closures + * GClosure: + * @in_marshal: Indicates whether the closure is currently being invoked with + * g_closure_invoke() + * @is_invalid: Indicates whether the closure has been invalidated by + * g_closure_invalidate() * - * A #GClosure represents a callback supplied by the programmer. + * A `GClosure` represents a callback supplied by the programmer. * * It will generally comprise a function of some kind and a marshaller * used to call it. It is the responsibility of the marshaller to @@ -76,7 +78,7 @@ * * Using closures has a number of important advantages over a simple * callback function/data pointer combination: - * + * * - Closures allow the callee to get the types of the callback parameters, * which means that language bindings don't have to write individual glue * for each callback type. @@ -1173,7 +1175,7 @@ g_signal_type_cclosure_new (GType itype, g_return_val_if_fail (G_TYPE_IS_CLASSED (itype) || G_TYPE_IS_INTERFACE (itype), NULL); g_return_val_if_fail (struct_offset >= sizeof (GTypeClass), NULL); - closure = g_closure_new_simple (sizeof (GClosure), (gpointer) itype); + closure = g_closure_new_simple (sizeof (GClosure), GTYPE_TO_POINTER (itype)); if (G_TYPE_IS_INTERFACE (itype)) { g_closure_set_meta_marshal (closure, GUINT_TO_POINTER (struct_offset), g_type_iface_meta_marshal); @@ -1673,320 +1675,3 @@ g_cclosure_marshal_generic_va (GClosure *closure, if (return_value && G_VALUE_TYPE (return_value)) value_from_ffi_type (return_value, rvalue); } - -/** - * g_cclosure_marshal_VOID__VOID: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 1 - * @param_values: a #GValue array holding only the instance - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__BOOLEAN: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gboolean parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gboolean arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__CHAR: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gchar parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gchar arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__UCHAR: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #guchar parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, guchar arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__INT: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gint parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gint arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__UINT: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #guint parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, guint arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__LONG: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #glong parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, glong arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__ULONG: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gulong parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gulong arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__ENUM: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the enumeration parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gint arg1, gpointer user_data)` where the #gint parameter denotes an enumeration type.. - */ - -/** - * g_cclosure_marshal_VOID__FLAGS: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the flags parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gint arg1, gpointer user_data)` where the #gint parameter denotes a flags type. - */ - -/** - * g_cclosure_marshal_VOID__FLOAT: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gfloat parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gfloat arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__DOUBLE: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gdouble parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gdouble arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__STRING: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gchar* parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, const gchar *arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__PARAM: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #GParamSpec* parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, GParamSpec *arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__BOXED: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #GBoxed* parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, GBoxed *arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__POINTER: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #gpointer parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, gpointer arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__OBJECT: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #GObject* parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, GObject *arg1, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_VOID__VARIANT: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 2 - * @param_values: a #GValue array holding the instance and the #GVariant* parameter - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, GVariant *arg1, gpointer user_data)`. - * - * Since: 2.26 - */ - -/** - * g_cclosure_marshal_VOID__UINT_POINTER: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: ignored - * @n_param_values: 3 - * @param_values: a #GValue array holding instance, arg1 and arg2 - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `void (*callback) (gpointer instance, guint arg1, gpointer arg2, gpointer user_data)`. - */ - -/** - * g_cclosure_marshal_BOOLEAN__FLAGS: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: a #GValue which can store the returned #gboolean - * @n_param_values: 2 - * @param_values: a #GValue array holding instance and arg1 - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `gboolean (*callback) (gpointer instance, gint arg1, gpointer user_data)` where the #gint parameter - * denotes a flags type. - */ - -/** - * g_cclosure_marshal_BOOL__FLAGS: - * - * Another name for g_cclosure_marshal_BOOLEAN__FLAGS(). - */ -/** - * g_cclosure_marshal_STRING__OBJECT_POINTER: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: a #GValue, which can store the returned string - * @n_param_values: 3 - * @param_values: a #GValue array holding instance, arg1 and arg2 - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `gchar* (*callback) (gpointer instance, GObject *arg1, gpointer arg2, gpointer user_data)`. - */ -/** - * g_cclosure_marshal_BOOLEAN__OBJECT_BOXED_BOXED: - * @closure: the #GClosure to which the marshaller belongs - * @return_value: a #GValue, which can store the returned string - * @n_param_values: 3 - * @param_values: a #GValue array holding instance, arg1 and arg2 - * @invocation_hint: the invocation hint given as the last argument - * to g_closure_invoke() - * @marshal_data: additional data specified when registering the marshaller - * - * A marshaller for a #GCClosure with a callback of type - * `gboolean (*callback) (gpointer instance, GBoxed *arg1, GBoxed *arg2, gpointer user_data)`. - * - * Since: 2.26 - */ diff --git a/gobject/gclosure.h b/gobject/gclosure.h index 3b139b0..2462bce 100644 --- a/gobject/gclosure.h +++ b/gobject/gclosure.h @@ -169,15 +169,7 @@ struct _GClosureNotifyData gpointer data; GClosureNotify notify; }; -/** - * GClosure: - * @in_marshal: Indicates whether the closure is currently being invoked with - * g_closure_invoke() - * @is_invalid: Indicates whether the closure has been invalidated by - * g_closure_invalidate() - * - * A #GClosure represents a callback supplied by the programmer. - */ + struct _GClosure { /*< private >*/ diff --git a/gobject/genums.c b/gobject/genums.c index 1fe7f72..96b367d 100644 --- a/gobject/genums.c +++ b/gobject/genums.c @@ -31,43 +31,6 @@ #include "gvaluecollector.h" -/** - * SECTION:enumerations_flags - * @short_description: Enumeration and flags types - * @title: Enumeration and Flag Types - * @see_also:#GParamSpecEnum, #GParamSpecFlags, g_param_spec_enum(), - * g_param_spec_flags() - * - * The GLib type system provides fundamental types for enumeration and - * flags types. (Flags types are like enumerations, but allow their - * values to be combined by bitwise or). A registered enumeration or - * flags type associates a name and a nickname with each allowed - * value, and the methods g_enum_get_value_by_name(), - * g_enum_get_value_by_nick(), g_flags_get_value_by_name() and - * g_flags_get_value_by_nick() can look up values by their name or - * nickname. When an enumeration or flags type is registered with the - * GLib type system, it can be used as value type for object - * properties, using g_param_spec_enum() or g_param_spec_flags(). - * - * GObject ships with a utility called [glib-mkenums][glib-mkenums], - * that can construct suitable type registration functions from C enumeration - * definitions. - * - * Example of how to get a string representation of an enum value: - * |[ - * GEnumClass *enum_class; - * GEnumValue *enum_value; - * - * enum_class = g_type_class_ref (MAMAN_TYPE_MY_ENUM); - * enum_value = g_enum_get_value (enum_class, MAMAN_MY_ENUM_FOO); - * - * g_print ("Name: %s\n", enum_value->value_name); - * - * g_type_class_unref (enum_class); - * ]| - */ - - /* --- prototypes --- */ static void g_enum_class_init (GEnumClass *class, gpointer class_data); diff --git a/gobject/genums.h b/gobject/genums.h index d253b15..0ee8a61 100644 --- a/gobject/genums.h +++ b/gobject/genums.h @@ -320,14 +320,14 @@ void g_flags_complete_type_info (GType g_flags_type, #define G_DEFINE_ENUM_TYPE(TypeName, type_name, ...) \ GType \ type_name ## _get_type (void) { \ - static gsize g_define_type__static = 0; \ - if (g_once_init_enter (&g_define_type__static)) { \ + static _g_type_once_init_type g_define_type__static = 0; \ + if (_g_type_once_init_enter (&g_define_type__static)) { \ static const GEnumValue enum_values[] = { \ __VA_ARGS__ , \ { 0, NULL, NULL }, \ }; \ GType g_define_type = g_enum_register_static (g_intern_static_string (#TypeName), enum_values); \ - g_once_init_leave (&g_define_type__static, g_define_type); \ + _g_type_once_init_leave (&g_define_type__static, g_define_type); \ } \ return g_define_type__static; \ } \ @@ -363,14 +363,14 @@ type_name ## _get_type (void) { \ #define G_DEFINE_FLAGS_TYPE(TypeName, type_name, ...) \ GType \ type_name ## _get_type (void) { \ - static gsize g_define_type__static = 0; \ - if (g_once_init_enter (&g_define_type__static)) { \ + static _g_type_once_init_type g_define_type__static = 0; \ + if (_g_type_once_init_enter (&g_define_type__static)) { \ static const GFlagsValue flags_values[] = { \ __VA_ARGS__ , \ { 0, NULL, NULL }, \ }; \ GType g_define_type = g_flags_register_static (g_intern_static_string (#TypeName), flags_values); \ - g_once_init_leave (&g_define_type__static, g_define_type); \ + _g_type_once_init_leave (&g_define_type__static, g_define_type); \ } \ return g_define_type__static; \ } \ diff --git a/gobject/glib-enumtypes.c.template b/gobject/glib-enumtypes.c.template index 42f9c34..ab59828 100644 --- a/gobject/glib-enumtypes.c.template +++ b/gobject/glib-enumtypes.c.template @@ -22,9 +22,9 @@ G_GNUC_END_IGNORE_DEPRECATIONS GType @enum_name@_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { static const G@Type@Value values[] = { /*** END value-header ***/ @@ -38,7 +38,7 @@ GType }; GType g_define_type_id = g_@type@_register_static (g_intern_static_string ("@EnumName@"), values); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; diff --git a/gobject/glib-mkenums.in b/gobject/glib-mkenums.in index 353e53a..e10b910 100755 --- a/gobject/glib-mkenums.in +++ b/gobject/glib-mkenums.in @@ -223,6 +223,8 @@ def parse_entries(file, file_name): (\w+)\s* # name (\s+[A-Z]+_(?:AVAILABLE|DEPRECATED)_ENUMERATOR_IN_[0-9_]+(?:_FOR\s*\(\s*\w+\s*\))?\s*)? # availability (?:=( # value + \s*'[^']*'\s* # char + | # OR \s*\w+\s*\(.*\)\s* # macro with multiple args | # OR (?:[^,/]|/(?!\*))* # anything but a comma or comment @@ -728,6 +730,10 @@ def process_file(curfilename): # approximation to C constant folding inum = eval(num, {}, c_namespace) + # Support character literals + if isinstance(inum, str) and len(inum) == 1: + inum = ord(inum) + # make sure it parsed to an integer if not isinstance(inum, int): sys.exit("Unable to parse enum value '%s'" % num) diff --git a/gobject/glib-types.h b/gobject/glib-types.h index 87065b9..e31baf1 100644 --- a/gobject/glib-types.h +++ b/gobject/glib-types.h @@ -336,6 +336,42 @@ typedef gsize GType; */ #define G_TYPE_BOOKMARK_FILE (g_bookmark_file_get_type ()) +/** + * G_TYPE_HMAC: + * + * The #GType for a boxed type holding a #GHmac. + * + * Since: 2.80 + */ +#define G_TYPE_HMAC (g_hmac_get_type ()) + +/** + * G_TYPE_DIR: + * + * The #GType for a boxed type holding a #GDir. + * + * Since: 2.80 + */ +#define G_TYPE_DIR (g_dir_get_type ()) + +/** + * G_TYPE_RAND: + * + * The #GType for a boxed type holding a #GRand. + * + * Since: 2.80 + */ +#define G_TYPE_RAND (g_rand_get_type ()) + +/** + * G_TYPE_STRV_BUILDER: + * + * The #GType for a boxed type holding a #GStrvBuilder. + * + * Since: 2.80 + */ +#define G_TYPE_STRV_BUILDER (g_strv_builder_get_type ()) + GOBJECT_AVAILABLE_IN_ALL GType g_date_get_type (void) G_GNUC_CONST; GOBJECT_AVAILABLE_IN_ALL @@ -400,6 +436,14 @@ GOBJECT_AVAILABLE_IN_2_70 GType g_pattern_spec_get_type (void) G_GNUC_CONST; GOBJECT_AVAILABLE_IN_2_76 GType g_bookmark_file_get_type (void) G_GNUC_CONST; +GOBJECT_AVAILABLE_IN_2_80 +GType g_hmac_get_type (void) G_GNUC_CONST; +GOBJECT_AVAILABLE_IN_2_80 +GType g_dir_get_type (void) G_GNUC_CONST; +GOBJECT_AVAILABLE_IN_2_80 +GType g_rand_get_type (void) G_GNUC_CONST; +GOBJECT_AVAILABLE_IN_2_80 +GType g_strv_builder_get_type (void) G_GNUC_CONST; GOBJECT_DEPRECATED_FOR('G_TYPE_VARIANT') GType g_variant_get_gtype (void) G_GNUC_CONST; diff --git a/gobject/gobject-autocleanups.h b/gobject/gobject-autocleanups.h index bddb3f2..23d4f6d 100644 --- a/gobject/gobject-autocleanups.h +++ b/gobject/gobject-autocleanups.h @@ -23,6 +23,8 @@ #error "Only can be included directly." #endif +#ifndef __GI_SCANNER__ + G_DEFINE_AUTOPTR_CLEANUP_FUNC(GClosure, g_closure_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GEnumClass, g_type_class_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GFlagsClass, g_type_class_unref) @@ -31,3 +33,5 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GInitiallyUnowned, g_object_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GParamSpec, g_param_spec_unref) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTypeClass, g_type_class_unref) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GValue, g_value_unset) + +#endif /* __GI_SCANNER__ */ diff --git a/gobject/gobject.c b/gobject/gobject.c index 518285d..7ec5902 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -38,102 +38,30 @@ #include "gconstructor.h" /** - * SECTION:objects - * @title: GObject - * @short_description: The base object type - * @see_also: #GParamSpecObject, g_param_spec_object() + * GObject: * - * GObject is the fundamental type providing the common attributes and + * The base object type. + * + * `GObject` is the fundamental type providing the common attributes and * methods for all object types in GTK, Pango and other libraries - * based on GObject. The GObject class provides methods for object + * based on GObject. The `GObject` class provides methods for object * construction and destruction, property access methods, and signal - * support. Signals are described in detail [here][gobject-Signals]. + * support. Signals are described in detail [here][gobject-Signals]. * - * For a tutorial on implementing a new GObject class, see [How to define and - * implement a new GObject][howto-gobject]. For a list of naming conventions for - * GObjects and their methods, see the [GType conventions][gtype-conventions]. - * For the high-level concepts behind GObject, read [Instantiatable classed types: - * Objects][gtype-instantiatable-classed]. + * For a tutorial on implementing a new `GObject` class, see [How to define and + * implement a new GObject](tutorial.html#how-to-define-and-implement-a-new-gobject). + * For a list of naming conventions for GObjects and their methods, see the + * [GType conventions](concepts.html#conventions). For the high-level concepts + * behind GObject, read + * [Instantiatable classed types: Objects](concepts.html#instantiatable-classed-types-objects). * - * ## Floating references # {#floating-ref} - * - * **Note**: Floating references are a C convenience API and should not be - * used in modern GObject code. Language bindings in particular find the - * concept highly problematic, as floating references are not identifiable - * through annotations, and neither are deviations from the floating reference - * behavior, like types that inherit from #GInitiallyUnowned and still return - * a full reference from g_object_new(). - * - * GInitiallyUnowned is derived from GObject. The only difference between - * the two is that the initial reference of a GInitiallyUnowned is flagged - * as a "floating" reference. This means that it is not specifically - * claimed to be "owned" by any code portion. The main motivation for - * providing floating references is C convenience. In particular, it - * allows code to be written as: - * - * |[ - * container = create_container (); - * container_add_child (container, create_child()); - * ]| - * - * If container_add_child() calls g_object_ref_sink() on the passed-in child, - * no reference of the newly created child is leaked. Without floating - * references, container_add_child() can only g_object_ref() the new child, - * so to implement this code without reference leaks, it would have to be - * written as: - * - * |[ - * Child *child; - * container = create_container (); - * child = create_child (); - * container_add_child (container, child); - * g_object_unref (child); - * ]| - * - * The floating reference can be converted into an ordinary reference by - * calling g_object_ref_sink(). For already sunken objects (objects that - * don't have a floating reference anymore), g_object_ref_sink() is equivalent - * to g_object_ref() and returns a new reference. - * - * Since floating references are useful almost exclusively for C convenience, - * language bindings that provide automated reference and memory ownership - * maintenance (such as smart pointers or garbage collection) should not - * expose floating references in their API. The best practice for handling - * types that have initially floating references is to immediately sink those - * references after g_object_new() returns, by checking if the #GType - * inherits from #GInitiallyUnowned. For instance: - * - * |[ - * GObject *res = g_object_new_with_properties (gtype, - * n_props, - * prop_names, - * prop_values); - * - * // or: if (g_type_is_a (gtype, G_TYPE_INITIALLY_UNOWNED)) - * if (G_IS_INITIALLY_UNOWNED (res)) - * g_object_ref_sink (res); - * - * return res; - * ]| - * - * Some object implementations may need to save an objects floating state - * across certain code portions (an example is #GtkMenu), to achieve this, - * the following sequence can be used: - * - * |[ - * // save floating state - * gboolean was_floating = g_object_is_floating (object); - * g_object_ref_sink (object); - * // protected code portion - * - * ... - * - * // restore floating state - * if (was_floating) - * g_object_force_floating (object); - * else - * g_object_unref (object); // release previously acquired reference - * ]| + * Since GLib 2.72, all `GObject`s are guaranteed to be aligned to at least the + * alignment of the largest basic GLib type (typically this is `guint64` or + * `gdouble`). If you need larger alignment for an element in a `GObject`, you + * should allocate it on the heap (aligned), or arrange for your `GObject` to be + * appropriately padded. This guarantee applies to the `GObject` (or derived) + * struct, the `GObjectClass` (or derived) struct, and any private data allocated + * by `G_ADD_PRIVATE()`. */ /* --- macros --- */ @@ -174,12 +102,52 @@ enum { PROP_NONE }; +#define _OPTIONAL_BIT_LOCK 3 + #define OPTIONAL_FLAG_IN_CONSTRUCTION (1 << 0) #define OPTIONAL_FLAG_HAS_SIGNAL_HANDLER (1 << 1) /* Set if object ever had a signal handler */ #define OPTIONAL_FLAG_HAS_NOTIFY_HANDLER (1 << 2) /* Same, specifically for "notify" */ +#define OPTIONAL_FLAG_LOCK (1 << 3) /* _OPTIONAL_BIT_LOCK */ +#define OPTIONAL_FLAG_EVER_HAD_WEAK_REF (1 << 4) /* whether on the object ever g_weak_ref_set() was called. */ -#if SIZEOF_INT == 4 && GLIB_SIZEOF_VOID_P == 8 -#define HAVE_OPTIONAL_FLAGS +/* We use g_bit_lock(), which only supports one lock per integer. + * + * Hence, while we have locks for different purposes, internally they all + * map to the same bit lock (_OPTIONAL_BIT_LOCK). + * + * This means you cannot take a lock (object_bit_lock()) while already holding + * another bit lock. There is an assert against that with G_ENABLE_DEBUG + * builds (_object_bit_is_locked). + * + * In the past, we had different global mutexes per topic. Now we have one + * per-object mutex for several topics. The downside is that we are not as + * parallel as possible. The alternative would be to add individual locking + * integers to GObjectPrivate. But increasing memory usage for more parallelism + * (per-object!) is not worth it. */ +#define OPTIONAL_BIT_LOCK_WEAK_REFS 1 +#define OPTIONAL_BIT_LOCK_NOTIFY 2 +#define OPTIONAL_BIT_LOCK_TOGGLE_REFS 3 +#define OPTIONAL_BIT_LOCK_CLOSURE_ARRAY 4 + +#if SIZEOF_INT == 4 && GLIB_SIZEOF_VOID_P >= 8 +#define HAVE_OPTIONAL_FLAGS_IN_GOBJECT 1 +#else +#define HAVE_OPTIONAL_FLAGS_IN_GOBJECT 0 +#endif + +/* For now we only create a private struct if we don't have optional flags in + * GObject. Currently we don't need it otherwise. In the future we might + * always add a private struct. */ +#define HAVE_PRIVATE (!HAVE_OPTIONAL_FLAGS_IN_GOBJECT) + +#if HAVE_PRIVATE +typedef struct { +#if !HAVE_OPTIONAL_FLAGS_IN_GOBJECT + guint optional_flags; /* (atomic) */ +#endif +} GObjectPrivate; + +static int GObject_private_offset; #endif typedef struct @@ -188,7 +156,7 @@ typedef struct /*< private >*/ guint ref_count; /* (atomic) */ -#ifdef HAVE_OPTIONAL_FLAGS +#if HAVE_OPTIONAL_FLAGS_IN_GOBJECT guint optional_flags; /* (atomic) */ #endif GData *qdata; @@ -239,10 +207,11 @@ static void g_object_dispatch_properties_changed (GObject *object, GParamSpec **pspecs); static guint object_floating_flag_handler (GObject *object, gint job); +static inline void object_set_optional_flags (GObject *object, + guint flags); static void object_interface_check_properties (gpointer check_data, gpointer g_iface); -static void weak_locations_free_unlocked (GSList **weak_locations); /* --- typedefs --- */ typedef struct _GObjectNotifyQueue GObjectNotifyQueue; @@ -255,24 +224,428 @@ struct _GObjectNotifyQueue }; /* --- variables --- */ -G_LOCK_DEFINE_STATIC (closure_array_mutex); -G_LOCK_DEFINE_STATIC (weak_refs_mutex); -G_LOCK_DEFINE_STATIC (toggle_refs_mutex); static GQuark quark_closure_array = 0; -static GQuark quark_weak_refs = 0; +static GQuark quark_weak_notifies = 0; static GQuark quark_toggle_refs = 0; static GQuark quark_notify_queue; -#ifndef HAVE_OPTIONAL_FLAGS -static GQuark quark_in_construction; -#endif static GParamSpecPool *pspec_pool = NULL; static gulong gobject_signals[LAST_SIGNAL] = { 0, }; static guint (*floating_flag_handler) (GObject*, gint) = object_floating_flag_handler; -/* qdata pointing to GSList, protected by weak_locations_lock */ static GQuark quark_weak_locations = 0; -static GRWLock weak_locations_lock; -G_LOCK_DEFINE_STATIC(notify_lock); +#if HAVE_PRIVATE +G_ALWAYS_INLINE static inline GObjectPrivate * +g_object_get_instance_private (GObject *object) +{ + return G_STRUCT_MEMBER_P (object, GObject_private_offset); +} +#endif + +G_ALWAYS_INLINE static inline guint * +object_get_optional_flags_p (GObject *object) +{ +#if HAVE_OPTIONAL_FLAGS_IN_GOBJECT + return &(((GObjectReal *) object)->optional_flags); +#else + return &g_object_get_instance_private (object)->optional_flags; +#endif +} + +/*****************************************************************************/ + +/* For GWeakRef, we need to take a lock per-object. However, in various cases + * we cannot take a strong reference on the object to keep it alive. So the + * mutex cannot be in the object itself, because when we want to release the + * lock, we can no longer access object. + * + * Instead, the mutex is on the WeakRefData, which is itself ref-counted + * and has a separate lifetime from the object. */ +typedef struct +{ + /* This is both an atomic ref-count and bit 30 (WEAK_REF_DATA_LOCK_BIT) is + * used for g_bit_lock(). */ + gint atomic_field; + + guint16 len; + + /* Only relevant when len > 1. In that case, it's the allocated size of + * "list.many" array. */ + guint16 alloc; + + /* Only relevant when len > 0. In that case, either "one" or "many" union + * field is in use. */ + union + { + GWeakRef *one; + GWeakRef **many; + } list; +} WeakRefData; + +/* We choose bit 30, and not bit 31. Bit 31 would be the sign for gint, so it + * a bit awkward to use. Note that it probably also would work fine. + * + * But 30 is ok, because it still leaves us space for 2^30-1 references, which + * is more than we ever need. */ +#define WEAK_REF_DATA_LOCK_BIT 30 + +static void weak_ref_data_clear_list (WeakRefData *wrdata, GObject *object); + +static WeakRefData * +weak_ref_data_ref (WeakRefData *wrdata) +{ + gint ref; + +#if G_ENABLE_DEBUG + g_assert (wrdata); +#endif + + ref = g_atomic_int_add (&wrdata->atomic_field, 1); + +#if G_ENABLE_DEBUG + /* Overflow is almost impossible to happen, because the user would need to + * spawn that many operating system threads, that all call + * g_weak_ref_{set,get}() in parallel. + * + * Still, assert in debug mode. */ + g_assert (ref < G_MAXINT32); + + /* the real ref-count would be the following: */ + ref = (ref + 1) & ~(1 << WEAK_REF_DATA_LOCK_BIT); + + /* assert that the ref-count is still in the valid range. */ + g_assert (ref > 0 && ref < (1 << WEAK_REF_DATA_LOCK_BIT)); +#endif + (void) ref; + + return wrdata; +} + +static void +weak_ref_data_unref (WeakRefData *wrdata) +{ + if (!wrdata) + return; + + /* Note that we also use WEAK_REF_DATA_LOCK_BIT on "atomic_field" as a bit + * lock. However, we will always keep the @wrdata alive (having a reference) + * while holding a lock (otherwise, we couldn't unlock anymore). Thus, at the + * point when we decrement the ref-count to zero, we surely also have the + * @wrdata unlocked. + * + * This means, using "aomit_field" both as ref-count and the lock bit is + * fine. */ + + if (!g_atomic_int_dec_and_test (&wrdata->atomic_field)) + return; + +#if G_ENABLE_DEBUG + /* We expect that the list of weak locations is empty at this point. + * During g_object_unref() (_object_unref_clear_weak_locations()) it + * should have been cleared. + * + * Calling weak_ref_data_clear_list() should be unnecessary. */ + g_assert (wrdata->len == 0); +#endif + + g_free_sized (wrdata, sizeof (WeakRefData)); +} + +static void +weak_ref_data_lock (WeakRefData *wrdata) +{ + /* Note that while holding a _weak_ref_lock() on the @weak_ref, we MUST not acquire a + * weak_ref_data_lock() on the @wrdata. The other way around! */ + if (wrdata) + g_bit_lock (&wrdata->atomic_field, WEAK_REF_DATA_LOCK_BIT); +} + +static void +weak_ref_data_unlock (WeakRefData *wrdata) +{ + if (wrdata) + g_bit_unlock (&wrdata->atomic_field, WEAK_REF_DATA_LOCK_BIT); +} + +static gpointer +weak_ref_data_get_or_create_cb (GQuark key_id, + gpointer *data, + GDestroyNotify *destroy_notify, + gpointer user_data) +{ + WeakRefData *wrdata = *data; + GObject *object = user_data; + + if (!wrdata) + { + wrdata = g_new (WeakRefData, 1); + + /* The initial ref-count is 1. This one is owned by the GData until the + * object gets destroyed. + * + * The WEAK_REF_DATA_LOCK_BIT bit is of course initially unset. */ + wrdata->atomic_field = 1; + wrdata->len = 0; + /* Other fields are left uninitialized. They are only considered with a positive @len. */ + + *data = wrdata; + *destroy_notify = (GDestroyNotify) weak_ref_data_unref; + + /* Mark the @object that it was ever involved with GWeakRef. This flag + * will stick until @object gets destroyed, just like the WeakRefData + * also won't be freed for the remainder of the life of @object. */ + object_set_optional_flags (object, OPTIONAL_FLAG_EVER_HAD_WEAK_REF); + } + + return wrdata; +} + +static WeakRefData * +weak_ref_data_get_or_create (GObject *object) +{ + if (!object) + return NULL; + + return _g_datalist_id_update_atomic (&object->qdata, + quark_weak_locations, + weak_ref_data_get_or_create_cb, + object); +} + +static WeakRefData * +weak_ref_data_get (GObject *object) +{ + return g_datalist_id_get_data (&object->qdata, quark_weak_locations); +} + +static WeakRefData * +weak_ref_data_get_surely (GObject *object) +{ + WeakRefData *wrdata; + + /* The "surely" part is about that we expect to have a WeakRefData. + * + * Note that once a GObject gets a WeakRefData (during g_weak_ref_set() and + * weak_ref_data_get_or_create()), it sticks and is not freed until the + * object gets destroyed. + * + * Maybe we could release the unused WeakRefData in g_weak_ref_set(), but + * then we would always need to take a reference during weak_ref_data_get(). + * That is likely not worth it. */ + + wrdata = weak_ref_data_get (object); +#if G_ENABLE_DEBUG + g_assert (wrdata); +#endif + return wrdata; +} + +static gint32 +weak_ref_data_list_find (WeakRefData *wrdata, GWeakRef *weak_ref) +{ + if (wrdata->len == 1u) + { + if (wrdata->list.one == weak_ref) + return 0; + } + else + { + guint16 i; + + for (i = 0; i < wrdata->len; i++) + { + if (wrdata->list.many[i] == weak_ref) + return i; + } + } + + return -1; +} + +static gboolean +weak_ref_data_list_add (WeakRefData *wrdata, GWeakRef *weak_ref) +{ + if (wrdata->len == 0u) + wrdata->list.one = weak_ref; + else + { + if (wrdata->len == 1u) + { + GWeakRef *weak_ref2 = wrdata->list.one; + + wrdata->alloc = 4u; + wrdata->list.many = g_new (GWeakRef *, wrdata->alloc); + wrdata->list.many[0] = weak_ref2; + } + else if (wrdata->len == wrdata->alloc) + { + guint16 alloc; + + alloc = wrdata->alloc * 2u; + if (G_UNLIKELY (alloc < wrdata->len)) + { + if (wrdata->len == G_MAXUINT16) + return FALSE; + alloc = G_MAXUINT16; + } + wrdata->list.many = g_renew (GWeakRef *, wrdata->list.many, alloc); + wrdata->alloc = alloc; + } + + wrdata->list.many[wrdata->len] = weak_ref; + } + + wrdata->len++; + return TRUE; +} + +static GWeakRef * +weak_ref_data_list_remove (WeakRefData *wrdata, guint16 idx, gboolean allow_shrink) +{ + GWeakRef *weak_ref; + +#if G_ENABLE_DEBUG + g_assert (idx < wrdata->len); +#endif + + wrdata->len--; + + if (wrdata->len == 0u) + { + weak_ref = wrdata->list.one; + } + else + { + weak_ref = wrdata->list.many[idx]; + + if (wrdata->len == 1u) + { + GWeakRef *weak_ref2 = wrdata->list.many[idx == 0 ? 1 : 0]; + + g_free (wrdata->list.many); + wrdata->list.one = weak_ref2; + } + else + { + wrdata->list.many[idx] = wrdata->list.many[wrdata->len]; + + if (allow_shrink && G_UNLIKELY (wrdata->len <= wrdata->alloc / 4u)) + { + /* Shrink the buffer. When 75% are empty, shrink it to 50%. */ + if (wrdata->alloc == G_MAXUINT16) + wrdata->alloc = ((guint32) G_MAXUINT16 + 1u) / 2u; + else + wrdata->alloc /= 2u; + wrdata->list.many = g_renew (GWeakRef *, wrdata->list.many, wrdata->alloc); + } + } + } + + return weak_ref; +} + +static gboolean +weak_ref_data_has (GObject *object, WeakRefData *wrdata, WeakRefData **out_new_wrdata) +{ + WeakRefData *wrdata2; + + /* Check whether @object has @wrdata as WeakRefData. Note that an GObject's + * WeakRefData never changes (until destruction, once it's allocated). + * + * If you thus hold a reference to a @wrdata, you can check that the @object + * is still the same as the object where we got the @wrdata originally from. + * + * You couldn't do this check by using pointer equality of the GObject pointers, + * when you cannot hold strong references on the objects involved. Because then + * the object pointer might be dangling (and even destroyed and recreated as another + * object at the same memory location). + * + * Basically, weak_ref_data_has() is to compare for equality of two GObject pointers, + * when we cannot hold a strong reference on both. Instead, we earlier took a reference + * on the @wrdata and compare that instead. + */ + + if (!object) + { + /* If @object is NULL, then it does have a NULL @wrdata, and we return + * TRUE in the case. That's a convenient special case for some callers. + * + * In other words, weak_ref_data_has(NULL, NULL, out_new_wrdata) is TRUE. + */ +#if G_ENABLE_DEBUG + g_assert (!out_new_wrdata); +#endif + return !wrdata; + } + + if (!wrdata) + { + /* We only call this function with an @object that was previously + * registered as GWeakRef. + * + * That means, our @object will have a wrdata, and the result of the + * evaluation will be %FALSE. */ + if (out_new_wrdata) + *out_new_wrdata = weak_ref_data_ref (weak_ref_data_get (object)); +#if G_ENABLE_DEBUG + g_assert (out_new_wrdata + ? *out_new_wrdata + : weak_ref_data_get (object)); +#endif + return FALSE; + } + + wrdata2 = weak_ref_data_get_surely (object); + + if (wrdata == wrdata2) + { + if (out_new_wrdata) + *out_new_wrdata = NULL; + return TRUE; + } + + if (out_new_wrdata) + *out_new_wrdata = weak_ref_data_ref (wrdata2); + return FALSE; +} + +/*****************************************************************************/ + +#if defined(G_ENABLE_DEBUG) && defined(G_THREAD_LOCAL) +/* Using this thread-local global is sufficient to guard the per-object + * locking, because while the current thread holds a lock on one object, it + * never calls out to another object (because doing so would would be prone to + * deadlock). */ +static G_THREAD_LOCAL guint _object_bit_is_locked; +#endif + +static void +object_bit_lock (GObject *object, guint lock_bit) +{ +#if defined(G_ENABLE_DEBUG) && defined(G_THREAD_LOCAL) + /* all object_bit_lock() really use the same bit/mutex. The "lock_bit" argument + * only exists for asserting. object_bit_lock() is not re-entrant (also not with + * different "lock_bit" values). */ + g_assert (lock_bit > 0); + g_assert (_object_bit_is_locked == 0); + _object_bit_is_locked = lock_bit; +#endif + + g_bit_lock ((gint *) object_get_optional_flags_p (object), _OPTIONAL_BIT_LOCK); +} + +static void +object_bit_unlock (GObject *object, guint lock_bit) +{ +#if defined(G_ENABLE_DEBUG) && defined(G_THREAD_LOCAL) + /* All lock_bit map to the same mutex. We cannot use two different locks on + * the same integer. Assert against that. */ + g_assert (lock_bit > 0); + g_assert (_object_bit_is_locked == lock_bit); + _object_bit_is_locked = 0; +#endif + + g_bit_unlock ((gint *) object_get_optional_flags_p (object), _OPTIONAL_BIT_LOCK); +} /* --- functions --- */ static void @@ -281,28 +654,37 @@ g_object_notify_queue_free (gpointer data) GObjectNotifyQueue *nqueue = data; g_slist_free (nqueue->pspecs); - g_slice_free (GObjectNotifyQueue, nqueue); + g_free_sized (nqueue, sizeof (GObjectNotifyQueue)); } -static GObjectNotifyQueue* -g_object_notify_queue_freeze (GObject *object, - gboolean conditional) +static GObjectNotifyQueue * +g_object_notify_queue_create_queue_frozen (GObject *object) { GObjectNotifyQueue *nqueue; - G_LOCK(notify_lock); + nqueue = g_new0 (GObjectNotifyQueue, 1); + + *nqueue = (GObjectNotifyQueue){ + .freeze_count = 1, + }; + + g_datalist_id_set_data_full (&object->qdata, quark_notify_queue, + nqueue, g_object_notify_queue_free); + + return nqueue; +} + +static GObjectNotifyQueue * +g_object_notify_queue_freeze (GObject *object) +{ + GObjectNotifyQueue *nqueue; + + object_bit_lock (object, OPTIONAL_BIT_LOCK_NOTIFY); nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); if (!nqueue) { - if (conditional) - { - G_UNLOCK(notify_lock); - return NULL; - } - - nqueue = g_slice_new0 (GObjectNotifyQueue); - g_datalist_id_set_data_full (&object->qdata, quark_notify_queue, - nqueue, g_object_notify_queue_free); + nqueue = g_object_notify_queue_create_queue_frozen (object); + goto out; } if (nqueue->freeze_count >= 65535) @@ -313,25 +695,33 @@ g_object_notify_queue_freeze (GObject *object, else nqueue->freeze_count++; - G_UNLOCK(notify_lock); +out: + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); return nqueue; } static void g_object_notify_queue_thaw (GObject *object, - GObjectNotifyQueue *nqueue) + GObjectNotifyQueue *nqueue, + gboolean take_ref) { GParamSpec *pspecs_mem[16], **pspecs, **free_me = NULL; GSList *slist; guint n_pspecs = 0; - G_LOCK(notify_lock); + object_bit_lock (object, OPTIONAL_BIT_LOCK_NOTIFY); + + if (!nqueue) + { + /* Caller didn't look up the queue yet. Do it now. */ + nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); + } /* Just make sure we never get into some nasty race condition */ - if (G_UNLIKELY (nqueue->freeze_count == 0)) + if (G_UNLIKELY (!nqueue || nqueue->freeze_count == 0)) { - G_UNLOCK (notify_lock); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); g_critical ("%s: property-changed notification for %s(%p) is not frozen", G_STRFUNC, G_OBJECT_TYPE_NAME (object), object); return; @@ -340,7 +730,7 @@ g_object_notify_queue_thaw (GObject *object, nqueue->freeze_count--; if (nqueue->freeze_count) { - G_UNLOCK (notify_lock); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); return; } @@ -352,19 +742,55 @@ g_object_notify_queue_thaw (GObject *object, } g_datalist_id_set_data (&object->qdata, quark_notify_queue, NULL); - G_UNLOCK(notify_lock); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); if (n_pspecs) - G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs); + { + if (take_ref) + g_object_ref (object); + + G_OBJECT_GET_CLASS (object)->dispatch_properties_changed (object, n_pspecs, pspecs); + + if (take_ref) + g_object_unref (object); + } g_free (free_me); } -static void +static gboolean g_object_notify_queue_add (GObject *object, GObjectNotifyQueue *nqueue, - GParamSpec *pspec) + GParamSpec *pspec, + gboolean in_init) { - G_LOCK(notify_lock); + object_bit_lock (object, OPTIONAL_BIT_LOCK_NOTIFY); + + if (!nqueue) + { + /* We are called without an nqueue. Figure out whether a notification + * should be queued. */ + nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); + + if (!nqueue) + { + if (!in_init) + { + /* We don't have a notify queue and are not in_init. The event + * is not to be queued. The caller will dispatch directly. */ + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); + return FALSE; + } + + /* We are "in_init", but did not freeze the queue in g_object_init + * yet. Instead, we gained a notify handler in instance init, so now + * we need to freeze just-in-time. + * + * Note that this freeze will be balanced at the end of object + * initialization. + */ + nqueue = g_object_notify_queue_create_queue_frozen (object); + } + } g_assert (nqueue->n_pspecs < 65535); @@ -374,7 +800,9 @@ g_object_notify_queue_add (GObject *object, nqueue->n_pspecs++; } - G_UNLOCK(notify_lock); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_NOTIFY); + + return TRUE; } #ifdef G_ENABLE_DEBUG @@ -472,6 +900,31 @@ _g_object_type_init (void) # endif /* G_HAS_CONSTRUCTORS */ } #endif /* G_ENABLE_DEBUG */ + +#if HAVE_PRIVATE + GObject_private_offset = + g_type_add_instance_private (G_TYPE_OBJECT, sizeof (GObjectPrivate)); +#endif +} + +/* Initialize the global GParamSpecPool; this function needs to be + * called whenever we access the GParamSpecPool and we cannot guarantee + * that g_object_do_class_init() has been called: for instance, by the + * interface property API. + * + * To avoid yet another global lock, we use atomic pointer checks: the + * first caller of this function will win the race. Any other access to + * the GParamSpecPool is done under its own mutex. + */ +static inline void +g_object_init_pspec_pool (void) +{ + if (G_UNLIKELY (g_atomic_pointer_get (&pspec_pool) == NULL)) + { + GParamSpecPool *pool = g_param_spec_pool_new (TRUE); + if (!g_atomic_pointer_compare_and_exchange (&pspec_pool, NULL, pool)) + g_param_spec_pool_free (pool); + } } static void @@ -519,17 +972,13 @@ g_object_base_class_finalize (GObjectClass *class) static void g_object_do_class_init (GObjectClass *class) { - /* read the comment about typedef struct CArray; on why not to change this quark */ quark_closure_array = g_quark_from_static_string ("GObject-closure-array"); - - quark_weak_refs = g_quark_from_static_string ("GObject-weak-references"); + quark_weak_notifies = g_quark_from_static_string ("GObject-weak-notifies"); quark_weak_locations = g_quark_from_static_string ("GObject-weak-locations"); quark_toggle_refs = g_quark_from_static_string ("GObject-toggle-references"); quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue"); -#ifndef HAVE_OPTIONAL_FLAGS - quark_in_construction = g_quark_from_static_string ("GObject-in-construction"); -#endif - pspec_pool = g_param_spec_pool_new (TRUE); + + g_object_init_pspec_pool (); class->constructor = g_object_constructor; class->constructed = g_object_constructed; @@ -585,6 +1034,10 @@ g_object_do_class_init (GObjectClass *class) * implement an interface implement all properties for that interface */ g_type_add_interface_check (NULL, object_interface_check_properties); + +#if HAVE_PRIVATE + g_type_class_adjust_private_offset (class, &GObject_private_offset); +#endif } /* Sinks @pspec if it’s a floating ref. */ @@ -595,11 +1048,13 @@ install_property_internal (GType g_type, { g_param_spec_ref_sink (pspec); + g_object_init_pspec_pool (); + if (g_param_spec_pool_lookup (pspec_pool, pspec->name, g_type, FALSE)) { g_critical ("When installing property: type '%s' already has a property named '%s'", - g_type_name (g_type), - pspec->name); + g_type_name (g_type), + pspec->name); g_param_spec_unref (pspec); return FALSE; } @@ -819,13 +1274,13 @@ find_pspec (GObjectClass *class, * GObjectClass *gobject_class = G_OBJECT_CLASS (klass); * * obj_properties[PROP_FOO] = - * g_param_spec_int ("foo", "Foo", "Foo", + * g_param_spec_int ("foo", NULL, NULL, * -1, G_MAXINT, * 0, * G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); * * obj_properties[PROP_BAR] = - * g_param_spec_string ("bar", "Bar", "Bar", + * g_param_spec_string ("bar", NULL, NULL, * NULL, * G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); * @@ -1020,7 +1475,9 @@ g_object_interface_find_property (gpointer g_iface, g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL); g_return_val_if_fail (property_name != NULL, NULL); - + + g_object_init_pspec_pool (); + return g_param_spec_pool_lookup (pspec_pool, property_name, iface_class->g_type, @@ -1146,10 +1603,10 @@ g_object_class_list_properties (GObjectClass *class, * Since: 2.4 * * Returns: (array length=n_properties_p) (transfer container): a - * pointer to an array of pointers to #GParamSpec - * structures. The paramspecs are owned by GLib, but the - * array should be freed with g_free() when you are done with - * it. + * pointer to an array of pointers to #GParamSpec + * structures. The paramspecs are owned by GLib, but the + * array should be freed with g_free() when you are done with + * it. */ GParamSpec** g_object_interface_list_properties (gpointer g_iface, @@ -1161,6 +1618,8 @@ g_object_interface_list_properties (gpointer g_iface, g_return_val_if_fail (G_TYPE_IS_INTERFACE (iface_class->g_type), NULL); + g_object_init_pspec_pool (); + pspecs = g_param_spec_pool_list (pspec_pool, iface_class->g_type, &n); @@ -1173,133 +1632,62 @@ g_object_interface_list_properties (gpointer g_iface, static inline guint object_get_optional_flags (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS - GObjectReal *real = (GObjectReal *)object; - return (guint)g_atomic_int_get (&real->optional_flags); -#else - return 0; -#endif + return g_atomic_int_get (object_get_optional_flags_p (object)); } -/* Variant of object_get_optional_flags for when - * we know that we have exclusive access (during - * construction) - */ -static inline guint -object_get_optional_flags_X (GObject *object) -{ -#ifdef HAVE_OPTIONAL_FLAGS - GObjectReal *real = (GObjectReal *)object; - return real->optional_flags; -#else - return 0; -#endif -} - -#ifdef HAVE_OPTIONAL_FLAGS static inline void object_set_optional_flags (GObject *object, guint flags) { - GObjectReal *real = (GObjectReal *)object; - g_atomic_int_or (&real->optional_flags, flags); + g_atomic_int_or (object_get_optional_flags_p (object), flags); } -/* Variant for when we have exclusive access - * (during construction) - */ static inline void -object_set_optional_flags_X (GObject *object, - guint flags) -{ - GObjectReal *real = (GObjectReal *)object; - real->optional_flags |= flags; -} - -/* Variant for when we have exclusive access - * (during construction) - */ -static inline void -object_unset_optional_flags_X (GObject *object, +object_unset_optional_flags (GObject *object, guint flags) { - GObjectReal *real = (GObjectReal *)object; - real->optional_flags &= ~flags; + g_atomic_int_and (object_get_optional_flags_p (object), ~flags); } -#endif gboolean _g_object_has_signal_handler (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS return (object_get_optional_flags (object) & OPTIONAL_FLAG_HAS_SIGNAL_HANDLER) != 0; -#else - return TRUE; -#endif } static inline gboolean _g_object_has_notify_handler (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS return CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object)) || (object_get_optional_flags (object) & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0; -#else - return TRUE; -#endif -} - -static inline gboolean -_g_object_has_notify_handler_X (GObject *object) -{ -#ifdef HAVE_OPTIONAL_FLAGS - return CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object)) || - (object_get_optional_flags_X (object) & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0; -#else - return TRUE; -#endif } void _g_object_set_has_signal_handler (GObject *object, guint signal_id) { -#ifdef HAVE_OPTIONAL_FLAGS guint flags = OPTIONAL_FLAG_HAS_SIGNAL_HANDLER; if (signal_id == gobject_signals[NOTIFY]) flags |= OPTIONAL_FLAG_HAS_NOTIFY_HANDLER; object_set_optional_flags (object, flags); -#endif } static inline gboolean object_in_construction (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS return (object_get_optional_flags (object) & OPTIONAL_FLAG_IN_CONSTRUCTION) != 0; -#else - return g_datalist_id_get_data (&object->qdata, quark_in_construction) != NULL; -#endif } static inline void set_object_in_construction (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS - object_set_optional_flags_X (object, OPTIONAL_FLAG_IN_CONSTRUCTION); -#else - g_datalist_id_set_data (&object->qdata, quark_in_construction, object); -#endif + object_set_optional_flags (object, OPTIONAL_FLAG_IN_CONSTRUCTION); } static inline void unset_object_in_construction (GObject *object) { -#ifdef HAVE_OPTIONAL_FLAGS - object_unset_optional_flags_X (object, OPTIONAL_FLAG_IN_CONSTRUCTION); -#else - g_datalist_id_set_data (&object->qdata, quark_in_construction, NULL); -#endif + object_unset_optional_flags (object, OPTIONAL_FLAG_IN_CONSTRUCTION); } static void @@ -1312,7 +1700,7 @@ g_object_init (GObject *object, if (CLASS_HAS_PROPS (class) && CLASS_NEEDS_NOTIFY (class)) { /* freeze object's notification queue, g_object_new_internal() preserves pairedness */ - g_object_notify_queue_freeze (object, FALSE); + g_object_notify_queue_freeze (object); } /* mark object in-construction for notify_queue_thaw() and to allow construct-only properties */ @@ -1359,9 +1747,10 @@ static void g_object_real_dispose (GObject *object) { g_signal_handlers_destroy (object); + + /* GWeakNotify and GClosure can call into user code */ + g_datalist_id_set_data (&object->qdata, quark_weak_notifies, NULL); g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); - g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); - g_datalist_id_set_data (&object->qdata, quark_weak_locations, NULL); } #ifdef G_ENABLE_DEBUG @@ -1439,13 +1828,25 @@ g_object_dispatch_properties_changed (GObject *object, void g_object_run_dispose (GObject *object) { + WeakRefData *wrdata; + g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (g_atomic_int_get (&object->ref_count) > 0); g_object_ref (object); + TRACE (GOBJECT_OBJECT_DISPOSE(object,G_TYPE_FROM_INSTANCE(object), 0)); G_OBJECT_GET_CLASS (object)->dispose (object); TRACE (GOBJECT_OBJECT_DISPOSE_END(object,G_TYPE_FROM_INSTANCE(object), 0)); + + if ((object_get_optional_flags (object) & OPTIONAL_FLAG_EVER_HAD_WEAK_REF)) + { + wrdata = weak_ref_data_get_surely (object); + weak_ref_data_lock (wrdata); + weak_ref_data_clear_list (wrdata, object); + weak_ref_data_unlock (wrdata); + } + g_object_unref (object); } @@ -1469,7 +1870,7 @@ g_object_freeze_notify (GObject *object) g_return_if_fail (G_IS_OBJECT (object)); #ifndef G_DISABLE_CHECKS - if (G_UNLIKELY (g_atomic_int_get (&object->ref_count) == 0)) + if (G_UNLIKELY (g_atomic_int_get (&object->ref_count) <= 0)) { g_critical ("Attempting to freeze the notification queue for object %s[%p]; " "Property notification does not work during instance finalization.", @@ -1479,18 +1880,14 @@ g_object_freeze_notify (GObject *object) } #endif - g_object_ref (object); - g_object_notify_queue_freeze (object, FALSE); - g_object_unref (object); + g_object_notify_queue_freeze (object); } static inline void g_object_notify_by_spec_internal (GObject *object, GParamSpec *pspec) { -#ifdef HAVE_OPTIONAL_FLAGS guint object_flags; -#endif gboolean needs_notify; gboolean in_init; @@ -1499,42 +1896,15 @@ g_object_notify_by_spec_internal (GObject *object, param_spec_follow_override (&pspec); -#ifdef HAVE_OPTIONAL_FLAGS /* get all flags we need with a single atomic read */ object_flags = object_get_optional_flags (object); needs_notify = ((object_flags & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0) || CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object)); in_init = (object_flags & OPTIONAL_FLAG_IN_CONSTRUCTION) != 0; -#else - needs_notify = TRUE; - in_init = object_in_construction (object); -#endif if (pspec != NULL && needs_notify) { - GObjectNotifyQueue *nqueue; - gboolean need_thaw = TRUE; - - /* conditional freeze: only increase freeze count if already frozen */ - nqueue = g_object_notify_queue_freeze (object, TRUE); - if (in_init && !nqueue) - { - /* We did not freeze the queue in g_object_init, but - * we gained a notify handler in instance init, so - * now we need to freeze just-in-time - */ - nqueue = g_object_notify_queue_freeze (object, FALSE); - need_thaw = FALSE; - } - - if (nqueue != NULL) - { - /* we're frozen, so add to the queue and release our freeze */ - g_object_notify_queue_add (object, nqueue, pspec); - if (need_thaw) - g_object_notify_queue_thaw (object, nqueue); - } - else + if (!g_object_notify_queue_add (object, NULL, pspec, in_init)) { /* * Coverity doesn’t understand the paired ref/unref here and seems to @@ -1628,7 +1998,7 @@ g_object_notify (GObject *object, * static void * my_object_class_init (MyObjectClass *klass) * { - * properties[PROP_FOO] = g_param_spec_int ("foo", "Foo", "The foo", + * properties[PROP_FOO] = g_param_spec_int ("foo", NULL, NULL, * 0, 100, * 50, * G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); @@ -1674,12 +2044,10 @@ g_object_notify_by_pspec (GObject *object, void g_object_thaw_notify (GObject *object) { - GObjectNotifyQueue *nqueue; - g_return_if_fail (G_IS_OBJECT (object)); #ifndef G_DISABLE_CHECKS - if (G_UNLIKELY (g_atomic_int_get (&object->ref_count) == 0)) + if (G_UNLIKELY (g_atomic_int_get (&object->ref_count) <= 0)) { g_critical ("Attempting to thaw the notification queue for object %s[%p]; " "Property notification does not work during instance finalization.", @@ -1689,17 +2057,7 @@ g_object_thaw_notify (GObject *object) } #endif - - g_object_ref (object); - - /* FIXME: Freezing is the only way to get at the notify queue. - * So we freeze once and then thaw twice. - */ - nqueue = g_object_notify_queue_freeze (object, FALSE); - g_object_notify_queue_thaw (object, nqueue); - g_object_notify_queue_thaw (object, nqueue); - - g_object_unref (object); + g_object_notify_queue_thaw (object, NULL, TRUE); } static void @@ -1710,14 +2068,14 @@ maybe_issue_property_deprecation_warning (const GParamSpec *pspec) static GMutex already_warned_lock; gboolean already; - if (g_once_init_enter (&enable_diagnostic)) + if (g_once_init_enter_pointer (&enable_diagnostic)) { const gchar *value = g_getenv ("G_ENABLE_DIAGNOSTIC"); if (!value) value = "0"; - g_once_init_leave (&enable_diagnostic, value); + g_once_init_leave_pointer (&enable_diagnostic, value); } if (enable_diagnostic[0] == '0') @@ -1843,7 +2201,7 @@ object_set_property (GObject *object, if ((pspec->flags & (G_PARAM_EXPLICIT_NOTIFY | G_PARAM_READABLE)) == G_PARAM_READABLE && nqueue != NULL) - g_object_notify_queue_add (object, nqueue, pspec); + g_object_notify_queue_add (object, nqueue, pspec, FALSE); } static void @@ -2202,7 +2560,7 @@ g_object_new_with_custom_constructor (GObjectClass *class, if (CLASS_HAS_PROPS (class)) { - if ((newly_constructed && _g_object_has_notify_handler_X (object)) || + if ((newly_constructed && _g_object_has_notify_handler (object)) || _g_object_has_notify_handler (object)) { /* This may or may not have been setup in g_object_init(). @@ -2210,7 +2568,7 @@ g_object_new_with_custom_constructor (GObjectClass *class, */ nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); if (!nqueue) - nqueue = g_object_notify_queue_freeze (object, FALSE); + nqueue = g_object_notify_queue_freeze (object); } } @@ -2225,7 +2583,7 @@ g_object_new_with_custom_constructor (GObjectClass *class, /* If nqueue is non-NULL then we are frozen. Thaw it. */ if (nqueue) - g_object_notify_queue_thaw (object, nqueue); + g_object_notify_queue_thaw (object, nqueue, FALSE); return object; } @@ -2252,14 +2610,14 @@ g_object_new_internal (GObjectClass *class, { GSList *node; - if (_g_object_has_notify_handler_X (object)) + if (_g_object_has_notify_handler (object)) { /* This may or may not have been setup in g_object_init(). * If it hasn't, we do it now. */ nqueue = g_datalist_id_get_data (&object->qdata, quark_notify_queue); if (!nqueue) - nqueue = g_object_notify_queue_freeze (object, FALSE); + nqueue = g_object_notify_queue_freeze (object); } /* We will set exactly n_construct_properties construct @@ -2303,7 +2661,7 @@ g_object_new_internal (GObjectClass *class, object_set_property (object, params[i].pspec, params[i].value, nqueue, TRUE); if (nqueue) - g_object_notify_queue_thaw (object, nqueue); + g_object_notify_queue_thaw (object, nqueue, FALSE); return object; } @@ -2622,7 +2980,7 @@ g_object_constructor (GType type, /* set construction parameters */ if (n_construct_properties) { - GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object, FALSE); + GObjectNotifyQueue *nqueue = g_object_notify_queue_freeze (object); /* set construct properties */ while (n_construct_properties--) @@ -2633,7 +2991,7 @@ g_object_constructor (GType type, construct_params++; object_set_property (object, pspec, value, nqueue, TRUE); } - g_object_notify_queue_thaw (object, nqueue); + g_object_notify_queue_thaw (object, nqueue, FALSE); /* the notification queue is still frozen from g_object_init(), so * we don't need to handle it here, g_object_newv() takes * care of that @@ -2710,7 +3068,7 @@ g_object_setv (GObject *object, class = G_OBJECT_GET_CLASS (object); if (_g_object_has_notify_handler (object)) - nqueue = g_object_notify_queue_freeze (object, FALSE); + nqueue = g_object_notify_queue_freeze (object); for (i = 0; i < n_properties; i++) { @@ -2723,7 +3081,7 @@ g_object_setv (GObject *object, } if (nqueue) - g_object_notify_queue_thaw (object, nqueue); + g_object_notify_queue_thaw (object, nqueue, FALSE); g_object_unref (object); } @@ -2751,7 +3109,7 @@ g_object_set_valist (GObject *object, g_object_ref (object); if (_g_object_has_notify_handler (object)) - nqueue = g_object_notify_queue_freeze (object, FALSE); + nqueue = g_object_notify_queue_freeze (object); class = G_OBJECT_GET_CLASS (object); @@ -2789,7 +3147,7 @@ g_object_set_valist (GObject *object, } if (nqueue) - g_object_notify_queue_thaw (object, nqueue); + g_object_notify_queue_thaw (object, nqueue, FALSE); g_object_unref (object); } @@ -3315,8 +3673,8 @@ g_object_weak_ref (GObject *object, g_return_if_fail (notify != NULL); g_return_if_fail (g_atomic_int_get (&object->ref_count) >= 1); - G_LOCK (weak_refs_mutex); - wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs); + object_bit_lock (object, OPTIONAL_BIT_LOCK_WEAK_REFS); + wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_notifies); if (wstack) { i = wstack->n_weak_refs++; @@ -3331,8 +3689,8 @@ g_object_weak_ref (GObject *object, } wstack->weak_refs[i].notify = notify; wstack->weak_refs[i].data = data; - g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify); - G_UNLOCK (weak_refs_mutex); + g_datalist_id_set_data_full (&object->qdata, quark_weak_notifies, wstack, weak_refs_notify); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_WEAK_REFS); } /** @@ -3354,8 +3712,8 @@ g_object_weak_unref (GObject *object, g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (notify != NULL); - G_LOCK (weak_refs_mutex); - wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs); + object_bit_lock (object, OPTIONAL_BIT_LOCK_WEAK_REFS); + wstack = g_datalist_id_get_data (&object->qdata, quark_weak_notifies); if (wstack) { guint i; @@ -3372,7 +3730,7 @@ g_object_weak_unref (GObject *object, break; } } - G_UNLOCK (weak_refs_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_WEAK_REFS); if (!found_one) g_critical ("%s: couldn't find weak ref %p(%p)", G_STRFUNC, notify, data); } @@ -3438,7 +3796,7 @@ object_floating_flag_handler (GObject *object, oldvalue = g_atomic_pointer_get (&object->qdata); while (!g_atomic_pointer_compare_and_exchange_full ( (void**) &object->qdata, oldvalue, - (void *) ((gsize) oldvalue | OBJECT_FLOATING_FLAG), + (void *) ((guintptr) oldvalue | OBJECT_FLOATING_FLAG), &oldvalue)) ; return (gsize) oldvalue & OBJECT_FLOATING_FLAG; @@ -3446,7 +3804,7 @@ object_floating_flag_handler (GObject *object, oldvalue = g_atomic_pointer_get (&object->qdata); while (!g_atomic_pointer_compare_and_exchange_full ( (void**) &object->qdata, oldvalue, - (void *) ((gsize) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG), + (void *) ((guintptr) oldvalue & ~(gsize) OBJECT_FLOATING_FLAG), &oldvalue)) ; return (gsize) oldvalue & OBJECT_FLOATING_FLAG; @@ -3584,7 +3942,6 @@ g_object_force_floating (GObject *object) } typedef struct { - GObject *object; guint n_toggle_refs; struct { GToggleNotify notify; @@ -3592,32 +3949,25 @@ typedef struct { } toggle_refs[1]; /* flexible array */ } ToggleRefStack; -static void -toggle_refs_notify (GObject *object, - gboolean is_last_ref) +static GToggleNotify +toggle_refs_get_notify_unlocked (GObject *object, + gpointer *out_data) { - ToggleRefStack tstack, *tstackptr; + ToggleRefStack *tstackptr; - G_LOCK (toggle_refs_mutex); - /* If another thread removed the toggle reference on the object, while - * we were waiting here, there's nothing to notify. - * So let's check again if the object has toggle reference and in case return. - */ if (!OBJECT_HAS_TOGGLE_REF (object)) - { - G_UNLOCK (toggle_refs_mutex); - return; - } + return NULL; tstackptr = g_datalist_id_get_data (&object->qdata, quark_toggle_refs); - tstack = *tstackptr; - G_UNLOCK (toggle_refs_mutex); - /* Reentrancy here is not as tricky as it seems, because a toggle reference - * will only be notified when there is exactly one of them. - */ - g_assert (tstack.n_toggle_refs == 1); - tstack.toggle_refs[0].notify (tstack.toggle_refs[0].data, tstack.object, is_last_ref); + if (tstackptr->n_toggle_refs != 1) + { + g_critical ("Unexpected number of toggle-refs. g_object_add_toggle_ref() must be paired with g_object_remove_toggle_ref()"); + return NULL; + } + + *out_data = tstackptr->toggle_refs[0].data; + return tstackptr->toggle_refs[0].notify; } /** @@ -3657,6 +4007,13 @@ toggle_refs_notify (GObject *object, * this reason, you should only ever use a toggle reference if there * is important state in the proxy object. * + * Note that if you unref the object on another thread, then @notify might + * still be invoked after g_object_remove_toggle_ref(), and the object argument + * might be a dangling pointer. If the object is destroyed on other threads, + * you must take care of that yourself. + * + * A g_object_add_toggle_ref() must be released with g_object_remove_toggle_ref(). + * * Since: 2.8 */ void @@ -3673,7 +4030,7 @@ g_object_add_toggle_ref (GObject *object, g_object_ref (object); - G_LOCK (toggle_refs_mutex); + object_bit_lock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); tstack = g_datalist_id_remove_no_notify (&object->qdata, quark_toggle_refs); if (tstack) { @@ -3685,7 +4042,6 @@ g_object_add_toggle_ref (GObject *object, else { tstack = g_renew (ToggleRefStack, NULL, 1); - tstack->object = object; tstack->n_toggle_refs = 1; i = 0; } @@ -3698,7 +4054,7 @@ g_object_add_toggle_ref (GObject *object, tstack->toggle_refs[i].data = data; g_datalist_id_set_data_full (&object->qdata, quark_toggle_refs, tstack, (GDestroyNotify)g_free); - G_UNLOCK (toggle_refs_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); } /** @@ -3713,6 +4069,11 @@ g_object_add_toggle_ref (GObject *object, * Removes a reference added with g_object_add_toggle_ref(). The * reference count of the object is decreased by one. * + * Note that if you unref the object on another thread, then @notify might + * still be invoked after g_object_remove_toggle_ref(), and the object argument + * might be a dangling pointer. If the object is destroyed on other threads, + * you must take care of that yourself. + * * Since: 2.8 */ void @@ -3726,7 +4087,7 @@ g_object_remove_toggle_ref (GObject *object, g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (notify != NULL); - G_LOCK (toggle_refs_mutex); + object_bit_lock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); tstack = g_datalist_id_get_data (&object->qdata, quark_toggle_refs); if (tstack) { @@ -3742,12 +4103,15 @@ g_object_remove_toggle_ref (GObject *object, tstack->toggle_refs[i] = tstack->toggle_refs[tstack->n_toggle_refs]; if (tstack->n_toggle_refs == 0) - g_datalist_unset_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG); + { + g_datalist_unset_flags (&object->qdata, OBJECT_HAS_TOGGLE_REF_FLAG); + g_datalist_id_set_data_full (&object->qdata, quark_toggle_refs, NULL, NULL); + } break; } } - G_UNLOCK (toggle_refs_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); if (found_one) g_object_unref (object); @@ -3755,6 +4119,63 @@ g_object_remove_toggle_ref (GObject *object, g_critical ("%s: couldn't find toggle ref %p(%p)", G_STRFUNC, notify, data); } +/* Internal implementation of g_object_ref() which doesn't call out to user code. + * @out_toggle_notify and @out_toggle_data *must* be provided, and if non-`NULL` + * values are returned, then the caller *must* call that toggle notify function + * as soon as it is safe to do so. It may call (or be) user-provided code so should + * only be called once all locks are released. */ +static gpointer +object_ref (GObject *object, + GToggleNotify *out_toggle_notify, + gpointer *out_toggle_data) +{ + GToggleNotify toggle_notify; + gpointer toggle_data; + gint old_ref; + + old_ref = g_atomic_int_get (&object->ref_count); + +retry: + toggle_notify = NULL; + toggle_data = NULL; + if (old_ref > 1 && old_ref < G_MAXINT) + { + /* Fast-path. We have apparently more than 1 references already. No + * special handling for toggle references, just increment the ref count. */ + if (!g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref + 1, &old_ref)) + goto retry; + } + else if (old_ref == 1) + { + gboolean do_retry; + + /* With ref count 1, check whether we need to emit a toggle notification. */ + object_bit_lock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + toggle_notify = toggle_refs_get_notify_unlocked (object, &toggle_data); + do_retry = !g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref + 1, &old_ref); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + if (do_retry) + goto retry; + } + else + { + gboolean object_already_finalized = TRUE; + + *out_toggle_notify = NULL; + *out_toggle_data = NULL; + g_return_val_if_fail (!object_already_finalized, NULL); + return NULL; + } + + TRACE (GOBJECT_OBJECT_REF (object, G_TYPE_FROM_INSTANCE (object), old_ref)); + + *out_toggle_notify = toggle_notify; + *out_toggle_data = toggle_data; + return object; +} + /** * g_object_ref: * @object: (type GObject.Object): a #GObject @@ -3772,23 +4193,74 @@ gpointer (g_object_ref) (gpointer _object) { GObject *object = _object; - gint old_val; - gboolean object_already_finalized; + GToggleNotify toggle_notify; + gpointer toggle_data; g_return_val_if_fail (G_IS_OBJECT (object), NULL); - - old_val = g_atomic_int_add (&object->ref_count, 1); - object_already_finalized = (old_val <= 0); - g_return_val_if_fail (!object_already_finalized, NULL); - if (old_val == 1 && OBJECT_HAS_TOGGLE_REF (object)) - toggle_refs_notify (object, FALSE); + object = object_ref (object, &toggle_notify, &toggle_data); - TRACE (GOBJECT_OBJECT_REF(object,G_TYPE_FROM_INSTANCE(object),old_val)); + if (toggle_notify) + toggle_notify (toggle_data, object, FALSE); return object; } +static gboolean +_object_unref_clear_weak_locations (GObject *object, gint *p_old_ref, gboolean do_unref) +{ + WeakRefData *wrdata; + gboolean success; + + /* Fast path, for objects that never had a GWeakRef registered. */ + if (!(object_get_optional_flags (object) & OPTIONAL_FLAG_EVER_HAD_WEAK_REF)) + { + /* The caller previously just checked atomically that the ref-count was + * one. + * + * At this point still, @object never ever had a GWeakRef registered. + * That means, nobody else holds a strong reference and also nobody else + * can hold a weak reference, to race against obtaining another + * reference. We are good to proceed. */ + if (do_unref) + { + if (!g_atomic_int_compare_and_exchange ((gint *) &object->ref_count, 1, 0)) + { +#if G_ENABLE_DEBUG + g_assert_not_reached (); +#endif + } + } + return TRUE; + } + + /* Slow path. We must obtain a lock on the @wrdata, to atomically release + * weak references and check that the ref count is as expected. */ + + wrdata = weak_ref_data_get_surely (object); + + weak_ref_data_lock (wrdata); + + if (do_unref) + { + success = g_atomic_int_compare_and_exchange_full ((gint *) &object->ref_count, + 1, 0, + p_old_ref); + } + else + { + *p_old_ref = g_atomic_int_get ((gint *) &object->ref_count); + success = (*p_old_ref == 1); + } + + if (success) + weak_ref_data_clear_list (wrdata, object); + + weak_ref_data_unlock (wrdata); + + return success; +} + /** * g_object_unref: * @object: (type GObject.Object): a #GObject @@ -3806,164 +4278,201 @@ g_object_unref (gpointer _object) { GObject *object = _object; gint old_ref; - + GToggleNotify toggle_notify; + gpointer toggle_data; + GObjectNotifyQueue *nqueue; + gboolean do_retry; + GType obj_gtype; + g_return_if_fail (G_IS_OBJECT (object)); - - /* here we want to atomically do: if (ref_count>1) { ref_count--; return; } */ + + /* obj_gtype will be needed for TRACE(GOBJECT_OBJECT_UNREF()) later. Note + * that we issue the TRACE() after decrementing the ref-counter. If at that + * point the reference counter does not reach zero, somebody else can race + * and destroy the object. + * + * This means, TRACE() can be called with a dangling object pointer. This + * could only be avoided, by emitting the TRACE before doing the actual + * unref, but at that point we wouldn't know the correct "old_ref" value. + * Maybe this should change. + * + * Anyway. At that later point we can also no longer safely get the GType for + * the TRACE(). Do it now. + */ + obj_gtype = G_TYPE_FROM_INSTANCE (object); + (void) obj_gtype; + old_ref = g_atomic_int_get (&object->ref_count); - retry_atomic_decrement1: - while (old_ref > 1) + +retry_beginning: + + if (old_ref > 2) { - /* valid if last 2 refs are owned by this call to unref and the toggle_ref */ - - if (!g_atomic_int_compare_and_exchange_full ((int *)&object->ref_count, - old_ref, old_ref - 1, - &old_ref)) - continue; - - TRACE (GOBJECT_OBJECT_UNREF(object,G_TYPE_FROM_INSTANCE(object),old_ref)); - - /* if we went from 2->1 we need to notify toggle refs if any */ - if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object)) - { - /* The last ref being held in this case is owned by the toggle_ref */ - toggle_refs_notify (object, TRUE); - } + /* We have many references. If we can decrement the ref counter, we are done. */ + if (!g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref - 1, &old_ref)) + goto retry_beginning; + /* Beware: object might be a dangling pointer. */ + TRACE (GOBJECT_OBJECT_UNREF (object, obj_gtype, old_ref)); return; } + if (old_ref == 2) { - GSList **weak_locations; - GObjectNotifyQueue *nqueue; - - /* The only way that this object can live at this point is if - * there are outstanding weak references already established - * before we got here. + /* We are about to return the second-to-last reference. In that case we + * might need to notify a toggle reference. * - * If there were not already weak references then no more can be - * established at this time, because the other thread would have - * to hold a strong ref in order to call - * g_object_add_weak_pointer() and then we wouldn't be here. + * Note that a g_object_add_toggle_ref() MUST always be released + * via g_object_remove_toggle_ref(). Thus, if we are here with + * an old_ref of 2, then at most one of the references can be + * a toggle reference. * - * Other GWeakRef's (weak locations) instead may still be added - * before the object is finalized, but in such case we'll unset - * them as part of the qdata removal. - */ - weak_locations = g_datalist_id_get_data (&object->qdata, quark_weak_locations); + * We need to take a lock, to avoid races. */ - if (weak_locations != NULL) + object_bit_lock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + + toggle_notify = toggle_refs_get_notify_unlocked (object, &toggle_data); + + if (!g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref - 1, &old_ref)) { - g_rw_lock_writer_lock (&weak_locations_lock); - - /* It is possible that one of the weak references beat us to - * the lock. Make sure the refcount is still what we expected - * it to be. - */ - old_ref = g_atomic_int_get (&object->ref_count); - if (old_ref != 1) - { - g_rw_lock_writer_unlock (&weak_locations_lock); - goto retry_atomic_decrement1; - } - - /* We got the lock first, so the object will definitely die - * now. Clear out all the weak references, if they're still set. - */ - weak_locations = g_datalist_id_remove_no_notify (&object->qdata, - quark_weak_locations); - g_clear_pointer (&weak_locations, weak_locations_free_unlocked); - - g_rw_lock_writer_unlock (&weak_locations_lock); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + goto retry_beginning; } - /* freeze the notification queue, so we don't accidentally emit - * notifications during dispose() and finalize(). - * - * The notification queue stays frozen unless the instance acquires - * a reference during dispose(), in which case we thaw it and - * dispatch all the notifications. If the instance gets through - * to finalize(), the notification queue gets automatically - * drained when g_object_finalize() is reached and - * the qdata is cleared. - */ - nqueue = g_object_notify_queue_freeze (object, FALSE); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); - /* we are about to remove the last reference */ - TRACE (GOBJECT_OBJECT_DISPOSE(object,G_TYPE_FROM_INSTANCE(object), 1)); - G_OBJECT_GET_CLASS (object)->dispose (object); - TRACE (GOBJECT_OBJECT_DISPOSE_END(object,G_TYPE_FROM_INSTANCE(object), 1)); - - /* may have been re-referenced meanwhile */ - old_ref = g_atomic_int_get ((int *)&object->ref_count); - - while (old_ref > 1) - { - /* valid if last 2 refs are owned by this call to unref and the toggle_ref */ - - if (!g_atomic_int_compare_and_exchange_full ((int *)&object->ref_count, - old_ref, old_ref - 1, - &old_ref)) - continue; - - TRACE (GOBJECT_OBJECT_UNREF (object, G_TYPE_FROM_INSTANCE (object), old_ref)); - - /* emit all notifications that have been queued during dispose() */ - g_object_notify_queue_thaw (object, nqueue); - - /* if we went from 2->1 we need to notify toggle refs if any */ - if (old_ref == 2 && OBJECT_HAS_TOGGLE_REF (object) && - g_atomic_int_get ((int *)&object->ref_count) == 1) - { - /* The last ref being held in this case is owned by the toggle_ref */ - toggle_refs_notify (object, TRUE); - } - - return; - } - - /* we are still in the process of taking away the last ref */ - g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); - g_signal_handlers_destroy (object); - g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); - g_datalist_id_set_data (&object->qdata, quark_weak_locations, NULL); - - /* decrement the last reference */ - old_ref = g_atomic_int_add (&object->ref_count, -1); - g_return_if_fail (old_ref > 0); - - TRACE (GOBJECT_OBJECT_UNREF(object,G_TYPE_FROM_INSTANCE(object),old_ref)); - - /* may have been re-referenced meanwhile */ - if (G_LIKELY (old_ref == 1)) - { - TRACE (GOBJECT_OBJECT_FINALIZE(object,G_TYPE_FROM_INSTANCE(object))); - G_OBJECT_GET_CLASS (object)->finalize (object); - TRACE (GOBJECT_OBJECT_FINALIZE_END(object,G_TYPE_FROM_INSTANCE(object))); - - GOBJECT_IF_DEBUG (OBJECTS, - { - gboolean was_present; - - /* catch objects not chaining finalize handlers */ - G_LOCK (debug_objects); - was_present = g_hash_table_remove (debug_objects_ht, object); - G_UNLOCK (debug_objects); - - if (was_present) - g_critical ("Object %p of type %s not finalized correctly.", - object, G_OBJECT_TYPE_NAME (object)); - }); - g_type_free_instance ((GTypeInstance*) object); - } - else - { - /* The instance acquired a reference between dispose() and - * finalize(), so we need to thaw the notification queue - */ - g_object_notify_queue_thaw (object, nqueue); - } + /* Beware: object might be a dangling pointer. */ + TRACE (GOBJECT_OBJECT_UNREF (object, obj_gtype, old_ref)); + if (toggle_notify) + toggle_notify (toggle_data, object, TRUE); + return; } + + if (G_UNLIKELY (old_ref != 1)) + { + gboolean object_already_finalized = TRUE; + + g_return_if_fail (!object_already_finalized); + return; + } + + /* We only have one reference left. Proceed to (maybe) clear weak locations. */ + if (!_object_unref_clear_weak_locations (object, &old_ref, FALSE)) + goto retry_beginning; + + /* At this point, we checked with an atomic read that we only hold only one + * reference. Weak locations are cleared (and toggle references are not to + * be considered in this case). Proceed with dispose(). + * + * First, freeze the notification queue, so we don't accidentally emit + * notifications during dispose() and finalize(). + * + * The notification queue stays frozen unless the instance acquires a + * reference during dispose(), in which case we thaw it and dispatch all the + * notifications. If the instance gets through to finalize(), the + * notification queue gets automatically drained when g_object_finalize() is + * reached and the qdata is cleared. + */ + nqueue = g_object_notify_queue_freeze (object); + + TRACE (GOBJECT_OBJECT_DISPOSE (object, G_TYPE_FROM_INSTANCE (object), 1)); + G_OBJECT_GET_CLASS (object)->dispose (object); + TRACE (GOBJECT_OBJECT_DISPOSE_END (object, G_TYPE_FROM_INSTANCE (object), 1)); + + /* Must re-fetch old-ref. _object_unref_clear_weak_locations() relies on + * that. */ + old_ref = g_atomic_int_get (&object->ref_count); + +retry_decrement: + /* Here, old_ref is 1 if we just come from dispose(). If the object was resurrected, + * we can hit `goto retry_decrement` and be here with a larger old_ref. */ + + if (old_ref > 1 && nqueue) + { + /* If the object was resurrected, we need to unfreeze the notify + * queue. */ + g_object_notify_queue_thaw (object, nqueue, FALSE); + nqueue = NULL; + + /* Note at this point, @old_ref might be wrong. + * + * Also note that _object_unref_clear_weak_locations() requires that we + * atomically checked that @old_ref is 1. However, as @old_ref is larger + * than 1, that will not be called. Instead, all other code paths below, + * handle the possibility of a bogus @old_ref. + * + * No need to re-fetch. */ + } + + if (old_ref > 2) + { + if (!g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref - 1, + &old_ref)) + goto retry_decrement; + + /* Beware: object might be a dangling pointer. */ + TRACE (GOBJECT_OBJECT_UNREF (object, obj_gtype, old_ref)); + return; + } + + if (old_ref == 2) + { + /* If the object was resurrected and the current ref-count is 2, then we + * are about to drop the ref-count to 1. We may need to emit a toggle + * notification. Take a lock and check for that. + * + * In that case, we need a lock to get the toggle notification. */ + object_bit_lock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + toggle_notify = toggle_refs_get_notify_unlocked (object, &toggle_data); + do_retry = !g_atomic_int_compare_and_exchange_full ((int *) &object->ref_count, + old_ref, old_ref - 1, + &old_ref); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_TOGGLE_REFS); + + if (do_retry) + goto retry_decrement; + + /* Beware: object might be a dangling pointer. */ + TRACE (GOBJECT_OBJECT_UNREF (object, obj_gtype, old_ref)); + if (toggle_notify) + toggle_notify (toggle_data, object, TRUE); + return; + } + + /* old_ref is (atomically!) checked to be 1, we are about to drop the + * reference count to zero in _object_unref_clear_weak_locations(). */ + if (!_object_unref_clear_weak_locations (object, &old_ref, TRUE)) + goto retry_decrement; + + TRACE (GOBJECT_OBJECT_UNREF (object, obj_gtype, old_ref)); + + /* The object is almost gone. Finalize. */ + + g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); + g_signal_handlers_destroy (object); + g_datalist_id_set_data (&object->qdata, quark_weak_notifies, NULL); + + TRACE (GOBJECT_OBJECT_FINALIZE (object, G_TYPE_FROM_INSTANCE (object))); + G_OBJECT_GET_CLASS (object)->finalize (object); + TRACE (GOBJECT_OBJECT_FINALIZE_END (object, G_TYPE_FROM_INSTANCE (object))); + + GOBJECT_IF_DEBUG (OBJECTS, + { + gboolean was_present; + + /* catch objects not chaining finalize handlers */ + G_LOCK (debug_objects); + was_present = g_hash_table_remove (debug_objects_ht, object); + G_UNLOCK (debug_objects); + + if (was_present) + g_critical ("Object %p of type %s not finalized correctly.", + object, G_OBJECT_TYPE_NAME (object)); + }); + g_type_free_instance ((GTypeInstance *) object); } /** @@ -4651,24 +5160,6 @@ typedef struct { guint n_closures; GClosure *closures[1]; /* flexible array */ } CArray; -/* don't change this structure without supplying an accessor for - * watched closures, e.g.: - * GSList* g_object_list_watched_closures (GObject *object) - * { - * CArray *carray; - * g_return_val_if_fail (G_IS_OBJECT (object), NULL); - * carray = g_object_get_data (object, "GObject-closure-array"); - * if (carray) - * { - * GSList *slist = NULL; - * guint i; - * for (i = 0; i < carray->n_closures; i++) - * slist = g_slist_prepend (slist, carray->closures[i]); - * return slist; - * } - * return NULL; - * } - */ static void object_remove_closure (gpointer data, @@ -4678,7 +5169,7 @@ object_remove_closure (gpointer data, CArray *carray; guint i; - G_LOCK (closure_array_mutex); + object_bit_lock (object, OPTIONAL_BIT_LOCK_CLOSURE_ARRAY); carray = g_object_get_qdata (object, quark_closure_array); for (i = 0; i < carray->n_closures; i++) if (carray->closures[i] == closure) @@ -4686,10 +5177,10 @@ object_remove_closure (gpointer data, carray->n_closures--; if (i < carray->n_closures) carray->closures[i] = carray->closures[carray->n_closures]; - G_UNLOCK (closure_array_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_CLOSURE_ARRAY); return; } - G_UNLOCK (closure_array_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_CLOSURE_ARRAY); g_assert_not_reached (); } @@ -4745,7 +5236,7 @@ g_object_watch_closure (GObject *object, g_closure_add_marshal_guards (closure, object, (GClosureNotify) g_object_ref, object, (GClosureNotify) g_object_unref); - G_LOCK (closure_array_mutex); + object_bit_lock (object, OPTIONAL_BIT_LOCK_CLOSURE_ARRAY); carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array); if (!carray) { @@ -4761,7 +5252,7 @@ g_object_watch_closure (GObject *object, } carray->closures[i] = closure; g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array); - G_UNLOCK (closure_array_mutex); + object_bit_unlock (object, OPTIONAL_BIT_LOCK_CLOSURE_ARRAY); } /** @@ -4914,6 +5405,203 @@ g_initially_unowned_class_init (GInitiallyUnownedClass *klass) * without first having or creating a strong reference to the object. */ +#define WEAK_REF_LOCK_BIT 0 + +static GObject * +_weak_ref_clean_pointer (gpointer ptr) +{ + /* Drop the lockbit WEAK_REF_LOCK_BIT from @ptr (if set). */ + return g_pointer_bit_lock_mask_ptr (ptr, WEAK_REF_LOCK_BIT, FALSE, 0, NULL); +} + +static void +_weak_ref_lock (GWeakRef *weak_ref, GObject **out_object) +{ + /* Note that while holding a _weak_ref_lock() on the @weak_ref, we MUST not acquire a + * weak_ref_data_lock() on the @wrdata. The other way around! */ + + if (out_object) + { + guintptr ptr; + + g_pointer_bit_lock_and_get (&weak_ref->priv.p, WEAK_REF_LOCK_BIT, &ptr); + *out_object = _weak_ref_clean_pointer ((gpointer) ptr); + } + else + g_pointer_bit_lock (&weak_ref->priv.p, WEAK_REF_LOCK_BIT); +} + +static void +_weak_ref_unlock (GWeakRef *weak_ref) +{ + g_pointer_bit_unlock (&weak_ref->priv.p, WEAK_REF_LOCK_BIT); +} + +static void +_weak_ref_unlock_and_set (GWeakRef *weak_ref, GObject *object) +{ + g_pointer_bit_unlock_and_set (&weak_ref->priv.p, WEAK_REF_LOCK_BIT, object, 0); +} + +static void +weak_ref_data_clear_list (WeakRefData *wrdata, GObject *object) +{ + while (wrdata->len > 0u) + { + GWeakRef *weak_ref; + gpointer ptr; + + /* pass "allow_shrink=FALSE", so we don't reallocate needlessly. We + * anyway are about to clear the entire list. */ + weak_ref = weak_ref_data_list_remove (wrdata, wrdata->len - 1u, FALSE); + + /* Fast-path. Most likely @weak_ref is currently not locked, so we can + * just atomically set the pointer to NULL. */ + ptr = g_atomic_pointer_get (&weak_ref->priv.p); +#if G_ENABLE_DEBUG + g_assert (G_IS_OBJECT (_weak_ref_clean_pointer (ptr))); + g_assert (!object || object == _weak_ref_clean_pointer (ptr)); +#endif + if (G_LIKELY (ptr == _weak_ref_clean_pointer (ptr))) + { + /* The pointer is unlocked. Try an atomic compare-and-exchange... */ + if (g_atomic_pointer_compare_and_exchange (&weak_ref->priv.p, ptr, NULL)) + { + /* Done. Go to the next. */ + continue; + } + } + + /* The @weak_ref is locked. Acquire the lock to set the pointer to NULL. */ + _weak_ref_lock (weak_ref, NULL); + _weak_ref_unlock_and_set (weak_ref, NULL); + } +} + +static void +_weak_ref_set (GWeakRef *weak_ref, + GObject *new_object, + gboolean called_by_init) +{ + WeakRefData *old_wrdata; + WeakRefData *new_wrdata; + GObject *old_object; + + new_wrdata = weak_ref_data_get_or_create (new_object); + +#if G_ENABLE_DEBUG + g_assert (!new_object || object_get_optional_flags (new_object) & OPTIONAL_FLAG_EVER_HAD_WEAK_REF); +#endif + + if (called_by_init) + { + /* The caller is g_weak_ref_init(). We know that the weak_ref should be + * NULL. We thus set @old_wrdata to NULL without checking. + * + * Also important, the caller ensured that @new_object is not NULL. So we + * are expected to set @weak_ref from NULL to a non-NULL @new_object. */ + old_wrdata = NULL; +#if G_ENABLE_DEBUG + g_assert (new_object); +#endif + } + else + { + /* We must get a wrdata object @old_wrdata for the current @old_object. */ + _weak_ref_lock (weak_ref, &old_object); + + if (old_object == new_object) + { + /* Already set. We are done. */ + _weak_ref_unlock (weak_ref); + return; + } + + old_wrdata = old_object + ? weak_ref_data_ref (weak_ref_data_get (old_object)) + : NULL; + _weak_ref_unlock (weak_ref); + } + + /* We need a lock on @old_wrdata, @new_wrdata and @weak_ref. We need to take + * these locks in a certain order to avoid deadlock. We sort them by pointer + * value. + * + * Note that @old_wrdata or @new_wrdata may be NULL, which is handled + * correctly. + * + * Note that @old_wrdata and @new_wrdata are never identical at this point. + */ + if (new_wrdata && old_wrdata && (((guintptr) (gpointer) old_wrdata) < ((guintptr) ((gpointer) new_wrdata)))) + { + weak_ref_data_lock (old_wrdata); + weak_ref_data_lock (new_wrdata); + } + else + { + weak_ref_data_lock (new_wrdata); + weak_ref_data_lock (old_wrdata); + } + _weak_ref_lock (weak_ref, &old_object); + + if (!weak_ref_data_has (old_object, old_wrdata, NULL)) + { + /* A race. @old_object no longer has the expected @old_wrdata after + * getting all the locks. */ + if (old_object) + { + /* We lost the race and find a different object set. It's fine, our + * action was lost in the race and we are done. No need to retry. */ + weak_ref_data_unlock (old_wrdata); + weak_ref_data_unlock (new_wrdata); + _weak_ref_unlock (weak_ref); + weak_ref_data_unref (old_wrdata); + return; + } + + /* @old_object is NULL after a race. We didn't expect that, but it's + * fine. Proceed to set @new_object... */ + } + + if (old_object) + { + gint32 idx; + + idx = weak_ref_data_list_find (old_wrdata, weak_ref); + if (idx < 0) + g_critical ("unexpected missing GWeakRef data"); + else + weak_ref_data_list_remove (old_wrdata, idx, TRUE); + } + + weak_ref_data_unlock (old_wrdata); + + if (new_object) + { +#if G_ENABLE_DEBUG + g_assert (weak_ref_data_list_find (new_wrdata, weak_ref) < 0); +#endif + if (g_atomic_int_get (&new_object->ref_count) < 1) + { + g_critical ("calling g_weak_ref_set() with already destroyed object"); + new_object = NULL; + } + else + { + if (!weak_ref_data_list_add (new_wrdata, weak_ref)) + { + g_critical ("Too many GWeakRef registered"); + new_object = NULL; + } + } + } + + _weak_ref_unlock_and_set (weak_ref, new_object); + weak_ref_data_unlock (new_wrdata); + + weak_ref_data_unref (old_wrdata); +} + /** * g_weak_ref_init: (skip) * @weak_ref: (inout): uninitialized or empty location for a weak @@ -4934,11 +5622,19 @@ g_initially_unowned_class_init (GInitiallyUnownedClass *klass) */ void g_weak_ref_init (GWeakRef *weak_ref, - gpointer object) + gpointer object) { - weak_ref->priv.p = NULL; + g_return_if_fail (weak_ref); + g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - g_weak_ref_set (weak_ref, object); + g_atomic_pointer_set (&weak_ref->priv.p, NULL); + if (object) + { + /* We give a hint that the weak_ref is currently NULL. Unlike + * g_weak_ref_set(), we then don't need the extra lock just to + * find out that we have no object. */ + _weak_ref_set (weak_ref, object, TRUE); + } } /** @@ -4985,49 +5681,91 @@ g_weak_ref_clear (GWeakRef *weak_ref) gpointer g_weak_ref_get (GWeakRef *weak_ref) { - gpointer object_or_null; + WeakRefData *wrdata; + WeakRefData *new_wrdata; + GToggleNotify toggle_notify = NULL; + gpointer toggle_data = NULL; + GObject *object; - g_return_val_if_fail (weak_ref!= NULL, NULL); + g_return_val_if_fail (weak_ref, NULL); - g_rw_lock_reader_lock (&weak_locations_lock); + /* We cannot take the strong reference on @object yet. Otherwise, + * _object_unref_clear_weak_locations() might have just taken the lock on + * @wrdata, see that the ref-count is 1 and plan to proceed clearing weak + * locations. If we then take a strong reference here, the object becomes + * alive and well, but _object_unref_clear_weak_locations() would proceed and + * clear the @weak_ref. + * + * We avoid that, by can only taking the strong reference when having a lock + * on @wrdata, so we are in sync with _object_unref_clear_weak_locations(). + * + * But first we must get a reference to the @wrdata. + */ + _weak_ref_lock (weak_ref, &object); + wrdata = object + ? weak_ref_data_ref (weak_ref_data_get (object)) + : NULL; + _weak_ref_unlock (weak_ref); - object_or_null = weak_ref->priv.p; - - if (object_or_null != NULL) - g_object_ref (object_or_null); - - g_rw_lock_reader_unlock (&weak_locations_lock); - - return object_or_null; -} - -static void -weak_locations_free_unlocked (GSList **weak_locations) -{ - if (*weak_locations) + if (!wrdata) { - GSList *weak_location; + /* There is no @wrdata and no object. We are done. */ + return NULL; + } - for (weak_location = *weak_locations; weak_location;) +retry: + + /* Now proceed to get the strong reference. This time with acquiring a lock + * on the per-object @wrdata and on @weak_ref. + * + * As the order in which locks are taken is important, we previously had to + * get a _weak_ref_lock(), to obtain the @wrdata. Now we have to lock on the + * @wrdata first, and the @weak_ref again. */ + weak_ref_data_lock (wrdata); + _weak_ref_lock (weak_ref, &object); + + if (!object) + { + /* Object is gone in the meantime. That is fine. */ + new_wrdata = NULL; + } + else + { + /* Check that @object still refers to the same object as before. We do + * that by comparing the @wrdata object. A GObject keeps its (unique!) + * wrdata instance until the end, and since @wrdata is still alive, + * @object is the same as before, if-and-only-if its @wrdata is the same. + */ + if (weak_ref_data_has (object, wrdata, &new_wrdata)) { - GWeakRef *weak_ref_location = weak_location->data; - - weak_ref_location->priv.p = NULL; - weak_location = g_slist_delete_link (weak_location, weak_location); + /* We are (still) good. Take a strong ref while holding the necessary locks. */ + object = object_ref (object, &toggle_notify, &toggle_data); + } + else + { + /* The @object changed and has no longer the same @wrdata. In this + * case, we need to start over. + * + * Note that @new_wrdata references the wrdata of the now current + * @object. We will use that during the retry. */ } } - g_free (weak_locations); -} + _weak_ref_unlock (weak_ref); + weak_ref_data_unlock (wrdata); + weak_ref_data_unref (wrdata); -static void -weak_locations_free (gpointer data) -{ - GSList **weak_locations = data; + if (new_wrdata) + { + /* There was a race. The object changed. Retry, with @new_wrdata. */ + wrdata = new_wrdata; + goto retry; + } - g_rw_lock_writer_lock (&weak_locations_lock); - weak_locations_free_unlocked (weak_locations); - g_rw_lock_writer_unlock (&weak_locations_lock); + if (toggle_notify) + toggle_notify (toggle_data, object, FALSE); + + return object; } /** @@ -5045,78 +5783,10 @@ weak_locations_free (gpointer data) */ void g_weak_ref_set (GWeakRef *weak_ref, - gpointer object) + gpointer object) { - GSList **weak_locations; - GObject *new_object; - GObject *old_object; - g_return_if_fail (weak_ref != NULL); g_return_if_fail (object == NULL || G_IS_OBJECT (object)); - new_object = object; - - g_rw_lock_writer_lock (&weak_locations_lock); - - /* We use the extra level of indirection here so that if we have ever - * had a weak pointer installed at any point in time on this object, - * we can see that there is a non-NULL value associated with the - * weak-pointer quark and know that this value will not change at any - * point in the object's lifetime. - * - * Both properties are important for reducing the amount of times we - * need to acquire locks and for decreasing the duration of time the - * lock is held while avoiding some rather tricky races. - * - * Specifically: we can avoid having to do an extra unconditional lock - * in g_object_unref() without worrying about some extremely tricky - * races. - */ - - old_object = weak_ref->priv.p; - if (new_object != old_object) - { - weak_ref->priv.p = new_object; - - /* Remove the weak ref from the old object */ - if (old_object != NULL) - { - weak_locations = g_datalist_id_get_data (&old_object->qdata, quark_weak_locations); - if (weak_locations == NULL) - { -#ifndef G_DISABLE_ASSERT - gboolean in_weak_refs_notify = - g_datalist_id_get_data (&old_object->qdata, quark_weak_refs) == NULL; - g_assert (in_weak_refs_notify); -#endif /* G_DISABLE_ASSERT */ - } - else - { - *weak_locations = g_slist_remove (*weak_locations, weak_ref); - - if (!*weak_locations) - { - weak_locations_free_unlocked (weak_locations); - g_datalist_id_remove_no_notify (&old_object->qdata, quark_weak_locations); - } - } - } - - /* Add the weak ref to the new object */ - if (new_object != NULL) - { - weak_locations = g_datalist_id_get_data (&new_object->qdata, quark_weak_locations); - - if (weak_locations == NULL) - { - weak_locations = g_new0 (GSList *, 1); - g_datalist_id_set_data_full (&new_object->qdata, quark_weak_locations, - weak_locations, weak_locations_free); - } - - *weak_locations = g_slist_prepend (*weak_locations, weak_ref); - } - } - - g_rw_lock_writer_unlock (&weak_locations_lock); + _weak_ref_set (weak_ref, object, FALSE); } diff --git a/gobject/gobject.h b/gobject/gobject.h index ea0157c..7d987c4 100644 --- a/gobject/gobject.h +++ b/gobject/gobject.h @@ -248,22 +248,7 @@ typedef void (*GObjectFinalizeFunc) (GObject *object); */ typedef void (*GWeakNotify) (gpointer data, GObject *where_the_object_was); -/** - * GObject: - * - * The base object type. - * - * All the fields in the `GObject` structure are private to the implementation - * and should never be accessed directly. - * - * Since GLib 2.72, all #GObjects are guaranteed to be aligned to at least the - * alignment of the largest basic GLib type (typically this is #guint64 or - * #gdouble). If you need larger alignment for an element in a #GObject, you - * should allocate it on the heap (aligned), or arrange for your #GObject to be - * appropriately padded. This guarantee applies to the #GObject (or derived) - * struct, the #GObjectClass (or derived) struct, and any private data allocated - * by G_ADD_PRIVATE(). - */ + struct _GObject { GTypeInstance g_type_instance; diff --git a/gobject/gobject.stp.in b/gobject/gobject.stp.in index 67a4520..f1f2483 100644 --- a/gobject/gobject.stp.in +++ b/gobject/gobject.stp.in @@ -70,6 +70,8 @@ probe gobject.object_ref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so. */ probe gobject.object_unref = process("@ABS_GLIB_RUNTIME_LIBDIR@/libgobject-2.0.so.0.@LT_CURRENT@.@LT_REVISION@").mark("object__unref") { + /* Beware that if old_refcount is larger than 1 and other threads might race + * and destroy object. In that case, object might be a dangling pointer. */ object = $arg1; gtype = $arg2; type = gobject_type_names_2_0_@LT_CURRENT@_@LT_REVISION@[pid(),gtype]; diff --git a/gobject/gobject_gdb.py b/gobject/gobject_gdb.py index ee554f5..55ad406 100644 --- a/gobject/gobject_gdb.py +++ b/gobject/gobject_gdb.py @@ -148,11 +148,16 @@ def get_signal_name(id): id = long(id) if id == 0: return None - val = read_global_var("g_signal_nodes") - max_s = read_global_var("g_n_signal_nodes") - max_s = long(max_s) - if id < max_s: - return val[id]["name"].string() + + try: + val = read_global_var("g_signal_nodes") + max_s = read_global_var("g_n_signal_nodes") + max_s = long(max_s) + if id < max_s: + return val[id]["name"].string() + except gdb.error: + return None + return None diff --git a/gobject/gparam.c b/gobject/gparam.c index 9af9e9b..1571b34 100644 --- a/gobject/gparam.c +++ b/gobject/gparam.c @@ -31,29 +31,27 @@ #include "gtype-private.h" /** - * SECTION:gparamspec - * @short_description: Metadata for parameter specifications - * @see_also: g_object_class_install_property(), g_object_set(), - * g_object_get(), g_object_set_property(), g_object_get_property(), - * g_value_register_transform_func() - * @title: GParamSpec + * GParamSpec: (ref-func g_param_spec_ref_sink) (unref-func g_param_spec_unref) (set-value-func g_value_set_param) (get-value-func g_value_get_param) + * @g_type_instance: private `GTypeInstance` portion + * @name: name of this parameter: always an interned string + * @flags: `GParamFlags` flags for this parameter + * @value_type: the `GValue` type for this parameter + * @owner_type: `GType` type that uses (introduces) this parameter * - * #GParamSpec is an object structure that encapsulates the metadata - * required to specify parameters, such as e.g. #GObject properties. + * `GParamSpec` encapsulates the metadata required to specify parameters, such as `GObject` properties. * - * ## Parameter names # {#canonical-parameter-names} + * ## Parameter names * * A property name consists of one or more segments consisting of ASCII letters * and digits, separated by either the `-` or `_` character. The first * character of a property name must be a letter. These are the same rules as - * for signal naming (see g_signal_new()). + * for signal naming (see [func@GObject.signal_new]). * - * When creating and looking up a #GParamSpec, either separator can be + * When creating and looking up a `GParamSpec`, either separator can be * used, but they cannot be mixed. Using `-` is considerably more * efficient, and is the ‘canonical form’. Using `_` is discouraged. */ - /* --- defines --- */ #define PARAM_FLOATING_FLAG 0x2 #define G_PARAM_USER_MASK (~0U << G_PARAM_USER_SHIFT) @@ -257,7 +255,7 @@ g_param_spec_unref (GParamSpec *pspec) void g_param_spec_sink (GParamSpec *pspec) { - gsize oldvalue; + guintptr oldvalue; g_return_if_fail (G_IS_PARAM_SPEC (pspec)); oldvalue = g_atomic_pointer_and (&pspec->qdata, ~(gsize)PARAM_FLOATING_FLAG); @@ -277,7 +275,7 @@ g_param_spec_sink (GParamSpec *pspec) GParamSpec* g_param_spec_ref_sink (GParamSpec *pspec) { - gsize oldvalue; + guintptr oldvalue; g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); oldvalue = g_atomic_pointer_and (&pspec->qdata, ~(gsize)PARAM_FLOATING_FLAG); @@ -996,11 +994,32 @@ g_param_spec_pool_new (gboolean type_prefixing) memcpy (&pool->mutex, &init_mutex, sizeof (init_mutex)); pool->type_prefixing = type_prefixing != FALSE; - pool->hash_table = g_hash_table_new (param_spec_pool_hash, param_spec_pool_equals); + pool->hash_table = g_hash_table_new_full (param_spec_pool_hash, + param_spec_pool_equals, + (GDestroyNotify) g_param_spec_unref, + NULL); return pool; } +/** + * g_param_spec_pool_free: + * @pool: (transfer full): a #GParamSpecPool + * + * Frees the resources allocated by a #GParamSpecPool. + * + * Since: 2.80 + */ +void +g_param_spec_pool_free (GParamSpecPool *pool) +{ + g_mutex_lock (&pool->mutex); + g_hash_table_unref (pool->hash_table); + g_mutex_unlock (&pool->mutex); + g_mutex_clear (&pool->mutex); + g_free (pool); +} + /** * g_param_spec_pool_insert: * @pool: a #GParamSpecPool. @@ -1055,9 +1074,7 @@ g_param_spec_pool_remove (GParamSpecPool *pool, if (pool && pspec) { g_mutex_lock (&pool->mutex); - if (g_hash_table_remove (pool->hash_table, pspec)) - g_param_spec_unref (pspec); - else + if (!g_hash_table_remove (pool->hash_table, pspec)) g_critical (G_STRLOC ": attempt to remove unknown pspec '%s' from pool", pspec->name); g_mutex_unlock (&pool->mutex); } @@ -1236,7 +1253,7 @@ g_param_spec_pool_list_owned (GParamSpecPool *pool, g_mutex_lock (&pool->mutex); data[0] = NULL; - data[1] = (gpointer) owner_type; + data[1] = GTYPE_TO_POINTER (owner_type); g_hash_table_foreach (pool->hash_table, pool_list, &data); g_mutex_unlock (&pool->mutex); @@ -1375,7 +1392,7 @@ g_param_spec_pool_list (GParamSpecPool *pool, d = g_type_depth (owner_type); slists = g_new0 (GSList*, d); data[0] = slists; - data[1] = (gpointer) owner_type; + data[1] = GTYPE_TO_POINTER (owner_type); data[2] = pool->hash_table; data[3] = &n_pspecs; @@ -1631,7 +1648,7 @@ g_param_spec_get_default_value (GParamSpec *pspec) * done before a g_once_init_enter() could take the fast path in * another thread. */ - if (g_once_init_enter (&priv->default_value.g_type)) + if (g_once_init_enter_pointer (&priv->default_value.g_type)) { GValue default_value = G_VALUE_INIT; @@ -1641,7 +1658,7 @@ g_param_spec_get_default_value (GParamSpec *pspec) /* store all but the type */ memcpy (priv->default_value.data, default_value.data, sizeof (default_value.data)); - g_once_init_leave (&priv->default_value.g_type, pspec->value_type); + g_once_init_leave_pointer (&priv->default_value.g_type, pspec->value_type); } return &priv->default_value; diff --git a/gobject/gparam.h b/gobject/gparam.h index 6454e69..89374fe 100644 --- a/gobject/gparam.h +++ b/gobject/gparam.h @@ -203,17 +203,7 @@ typedef struct _GParamSpec GParamSpec; typedef struct _GParamSpecClass GParamSpecClass; typedef struct _GParameter GParameter GOBJECT_DEPRECATED_TYPE_IN_2_54; typedef struct _GParamSpecPool GParamSpecPool; -/** - * GParamSpec: (ref-func g_param_spec_ref_sink) (unref-func g_param_spec_unref) (set-value-func g_value_set_param) (get-value-func g_value_get_param) - * @g_type_instance: private #GTypeInstance portion - * @name: name of this parameter: always an interned string - * @flags: #GParamFlags flags for this parameter - * @value_type: the #GValue type for this parameter - * @owner_type: #GType type that uses (introduces) this parameter - * - * All other fields of the GParamSpec struct are private and - * should not be used directly. - */ + struct _GParamSpec { GTypeInstance g_type_instance; @@ -453,7 +443,8 @@ GOBJECT_AVAILABLE_IN_ALL GParamSpec** g_param_spec_pool_list (GParamSpecPool *pool, GType owner_type, guint *n_pspecs_p); - +GOBJECT_AVAILABLE_IN_2_80 +void g_param_spec_pool_free (GParamSpecPool *pool); /* contracts: * diff --git a/gobject/gparamspecs.c b/gobject/gparamspecs.c index 17b8606..cf50df7 100644 --- a/gobject/gparamspecs.c +++ b/gobject/gparamspecs.c @@ -37,29 +37,6 @@ #include "gvaluearray.h" -/** - * SECTION:param_value_types - * @short_description: Standard Parameter and Value Types - * @see_also: #GParamSpec, #GValue, g_object_class_install_property(). - * @title: Parameters and Values - * - * #GValue provides an abstract container structure which can be - * copied, transformed and compared while holding a value of any - * (derived) type, which is registered as a #GType with a - * #GTypeValueTable in its #GTypeInfo structure. Parameter - * specifications for most value types can be created as #GParamSpec - * derived instances, to implement e.g. #GObject properties which - * operate on #GValue containers. - * - * Parameter names need to start with a letter (a-z or A-Z). Subsequent - * characters can be letters, numbers or a '-'. - * All other characters are replaced by a '-' during construction. - * - * See also #GValue for more information. - * - */ - - #define G_FLOAT_EPSILON (1e-30) #define G_DOUBLE_EPSILON (1e-90) @@ -1245,7 +1222,7 @@ param_gtype_set_default (GParamSpec *pspec, { GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec); - value->data[0].v_pointer = GSIZE_TO_POINTER (tspec->is_a_type); + value->data[0].v_pointer = GTYPE_TO_POINTER (tspec->is_a_type); } static gboolean @@ -1253,7 +1230,7 @@ param_gtype_is_valid (GParamSpec *pspec, const GValue *value) { GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec); - GType gtype = GPOINTER_TO_SIZE (value->data[0].v_pointer); + GType gtype = GPOINTER_TO_TYPE (value->data[0].v_pointer); return tspec->is_a_type == G_TYPE_NONE || g_type_is_a (gtype, tspec->is_a_type); @@ -1264,12 +1241,12 @@ param_gtype_validate (GParamSpec *pspec, GValue *value) { GParamSpecGType *tspec = G_PARAM_SPEC_GTYPE (pspec); - GType gtype = GPOINTER_TO_SIZE (value->data[0].v_pointer); + GType gtype = GPOINTER_TO_TYPE (value->data[0].v_pointer); guint changed = 0; if (tspec->is_a_type != G_TYPE_NONE && !g_type_is_a (gtype, tspec->is_a_type)) { - value->data[0].v_pointer = GSIZE_TO_POINTER (tspec->is_a_type); + value->data[0].v_pointer = GTYPE_TO_POINTER (tspec->is_a_type); changed++; } @@ -1281,8 +1258,8 @@ param_gtype_values_cmp (GParamSpec *pspec, const GValue *value1, const GValue *value2) { - GType p1 = GPOINTER_TO_SIZE (value1->data[0].v_pointer); - GType p2 = GPOINTER_TO_SIZE (value2->data[0].v_pointer); + GType p1 = GPOINTER_TO_TYPE (value1->data[0].v_pointer); + GType p2 = GPOINTER_TO_TYPE (value2->data[0].v_pointer); /* not much to compare here, try to at least provide stable lesser/greater result */ diff --git a/gobject/gsignal.c b/gobject/gsignal.c index 1a2051f..a5b471c 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -39,99 +39,6 @@ #include "gobject_trace.h" -/** - * SECTION:signals - * @short_description: A means for customization of object behaviour - * and a general purpose notification mechanism - * @title: Signals - * - * The basic concept of the signal system is that of the emission - * of a signal. Signals are introduced per-type and are identified - * through strings. Signals introduced for a parent type are available - * in derived types as well, so basically they are a per-type facility - * that is inherited. - * - * A signal emission mainly involves invocation of a certain set of - * callbacks in precisely defined manner. There are two main categories - * of such callbacks, per-object ones and user provided ones. - * (Although signals can deal with any kind of instantiatable type, I'm - * referring to those types as "object types" in the following, simply - * because that is the context most users will encounter signals in.) - * The per-object callbacks are most often referred to as "object method - * handler" or "default (signal) handler", while user provided callbacks are - * usually just called "signal handler". - * - * The object method handler is provided at signal creation time (this most - * frequently happens at the end of an object class' creation), while user - * provided handlers are frequently connected and disconnected to/from a - * certain signal on certain object instances. - * - * A signal emission consists of five stages, unless prematurely stopped: - * - * 1. Invocation of the object method handler for %G_SIGNAL_RUN_FIRST signals - * - * 2. Invocation of normal user-provided signal handlers (where the @after - * flag is not set) - * - * 3. Invocation of the object method handler for %G_SIGNAL_RUN_LAST signals - * - * 4. Invocation of user provided signal handlers (where the @after flag is set) - * - * 5. Invocation of the object method handler for %G_SIGNAL_RUN_CLEANUP signals - * - * The user-provided signal handlers are called in the order they were - * connected in. - * - * All handlers may prematurely stop a signal emission, and any number of - * handlers may be connected, disconnected, blocked or unblocked during - * a signal emission. - * - * There are certain criteria for skipping user handlers in stages 2 and 4 - * of a signal emission. - * - * First, user handlers may be blocked. Blocked handlers are omitted during - * callback invocation, to return from the blocked state, a handler has to - * get unblocked exactly the same amount of times it has been blocked before. - * - * Second, upon emission of a %G_SIGNAL_DETAILED signal, an additional - * @detail argument passed in to g_signal_emit() has to match the detail - * argument of the signal handler currently subject to invocation. - * Specification of no detail argument for signal handlers (omission of the - * detail part of the signal specification upon connection) serves as a - * wildcard and matches any detail argument passed in to emission. - * - * While the @detail argument is typically used to pass an object property name - * (as with #GObject::notify), no specific format is mandated for the detail - * string, other than that it must be non-empty. - * - * ## Memory management of signal handlers # {#signal-memory-management} - * - * If you are connecting handlers to signals and using a #GObject instance as - * your signal handler user data, you should remember to pair calls to - * g_signal_connect() with calls to g_signal_handler_disconnect() or - * g_signal_handlers_disconnect_by_func(). While signal handlers are - * automatically disconnected when the object emitting the signal is finalised, - * they are not automatically disconnected when the signal handler user data is - * destroyed. If this user data is a #GObject instance, using it from a - * signal handler after it has been finalised is an error. - * - * There are two strategies for managing such user data. The first is to - * disconnect the signal handler (using g_signal_handler_disconnect() or - * g_signal_handlers_disconnect_by_func()) when the user data (object) is - * finalised; this has to be implemented manually. For non-threaded programs, - * g_signal_connect_object() can be used to implement this automatically. - * Currently, however, it is unsafe to use in threaded programs. - * - * The second is to hold a strong reference on the user data until after the - * signal is disconnected for other reasons. This can be implemented - * automatically using g_signal_connect_data(). - * - * The first approach is recommended, as the second approach can result in - * effective memory leaks of the user data if the signal handler is never - * disconnected for some reason. - */ - - #define REPORT_BUG "please report occurrence circumstances to https://gitlab.gnome.org/GNOME/glib/issues/new" /* --- typedefs --- */ @@ -488,17 +395,9 @@ handler_list_ensure (guint signal_id, if (!hlbsa) { hlbsa = g_bsearch_array_create (&g_signal_hlbsa_bconfig); - hlbsa = g_bsearch_array_insert (hlbsa, &g_signal_hlbsa_bconfig, &key); - g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa); - } - else - { - GBSearchArray *o = hlbsa; - - hlbsa = g_bsearch_array_insert (o, &g_signal_hlbsa_bconfig, &key); - if (hlbsa != o) - g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa); } + hlbsa = g_bsearch_array_insert (hlbsa, &g_signal_hlbsa_bconfig, &key); + g_hash_table_insert (g_handler_list_bsa_ht, instance, hlbsa); return g_bsearch_array_lookup (hlbsa, &g_signal_hlbsa_bconfig, &key); } @@ -1326,8 +1225,8 @@ g_signal_lookup (const gchar *name, { /* give elaborate warnings */ if (!g_type_name (itype)) - g_critical (G_STRLOC ": unable to look up signal \"%s\" for invalid type id '%"G_GSIZE_FORMAT"'", - name, itype); + g_critical (G_STRLOC ": unable to look up signal \"%s\" for invalid type id '%"G_GUINTPTR_FORMAT"'", + name, (guintptr) itype); else if (!g_signal_is_valid_name (name)) g_critical (G_STRLOC ": unable to look up invalid signal name \"%s\" on type '%s'", name, g_type_name (itype)); @@ -1375,8 +1274,8 @@ g_signal_list_ids (GType itype, { /* give elaborate warnings */ if (!g_type_name (itype)) - g_critical (G_STRLOC ": unable to list signals for invalid type id '%"G_GSIZE_FORMAT"'", - itype); + g_critical (G_STRLOC ": unable to list signals for invalid type id '%"G_GUINTPTR_FORMAT"'", + (guintptr) itype); else if (!G_TYPE_IS_INSTANTIATABLE (itype) && !G_TYPE_IS_INTERFACE (itype)) g_critical (G_STRLOC ": unable to list signals of non instantiatable type '%s'", g_type_name (itype)); @@ -1461,7 +1360,7 @@ g_signal_query (guint signal_id, * @class_offset: The offset of the function pointer in the class structure * for this type. Used to invoke a class method generically. Pass 0 to * not associate a class method slot with this signal. - * @accumulator: (nullable): the accumulator for this signal; may be %NULL. + * @accumulator: (nullable) (scope forever): the accumulator for this signal; may be %NULL. * @accu_data: (nullable) (closure accumulator): user data for the @accumulator. * @c_marshaller: (nullable): the function to translate arrays of parameter * values to signal emissions into C language callback invocations or %NULL. @@ -1534,10 +1433,10 @@ g_signal_new (const gchar *signal_name, * @signal_flags: a combination of #GSignalFlags specifying detail of when * the default handler is to be invoked. You should at least specify * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST. - * @class_handler: (nullable): a #GCallback which acts as class implementation of + * @class_handler: (nullable) (scope forever): a #GCallback which acts as class implementation of * this signal. Used to invoke a class method generically. Pass %NULL to * not associate a class method with this signal. - * @accumulator: (nullable): the accumulator for this signal; may be %NULL. + * @accumulator: (nullable) (scope forever): the accumulator for this signal; may be %NULL. * @accu_data: (nullable) (closure accumulator): user data for the @accumulator. * @c_marshaller: (nullable): the function to translate arrays of parameter * values to signal emissions into C language callback invocations or %NULL. @@ -1674,7 +1573,7 @@ signal_add_class_closure (SignalNode *node, * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST * @class_closure: (nullable): The closure to invoke on signal emission; * may be %NULL - * @accumulator: (nullable): the accumulator for this signal; may be %NULL + * @accumulator: (nullable) (scope forever): the accumulator for this signal; may be %NULL * @accu_data: (nullable) (closure accumulator): user data for the @accumulator * @c_marshaller: (nullable): the function to translate arrays of * parameter values to signal emissions into C language callback @@ -1935,7 +1834,7 @@ g_signal_set_va_marshaller (guint signal_id, * the default handler is to be invoked. You should at least specify * %G_SIGNAL_RUN_FIRST or %G_SIGNAL_RUN_LAST. * @class_closure: (nullable): The closure to invoke on signal emission; may be %NULL. - * @accumulator: (nullable): the accumulator for this signal; may be %NULL. + * @accumulator: (nullable) (scope forever): the accumulator for this signal; may be %NULL. * @accu_data: (nullable) (closure accumulator): user data for the @accumulator. * @c_marshaller: (nullable): the function to translate arrays of parameter * values to signal emissions into C language callback invocations or %NULL. @@ -2097,7 +1996,7 @@ g_signal_override_class_closure (guint signal_id, * @signal_name: the name for the signal * @instance_type: the instance type on which to override the class handler * for the signal. - * @class_handler: the handler. + * @class_handler: (scope forever): the handler. * * Overrides the class closure (i.e. the default handler) for the * given signal for emissions on instances of @instance_type with @@ -2127,14 +2026,14 @@ g_signal_override_class_handler (const gchar *signal_name, g_signal_override_class_closure (signal_id, instance_type, g_cclosure_new (class_handler, NULL, NULL)); else - g_critical ("%s: signal name '%s' is invalid for type id '%"G_GSIZE_FORMAT"'", - G_STRLOC, signal_name, instance_type); + g_critical ("%s: signal name '%s' is invalid for type id '%"G_GUINTPTR_FORMAT"'", + G_STRLOC, signal_name, (guintptr) instance_type); } /** * g_signal_chain_from_overridden: - * @instance_and_params: (array) the argument list of the signal emission. + * @instance_and_params: (array): the argument list of the signal emission. * The first element in the array is a #GValue for the instance the signal * is being emitted on. The rest are any arguments to be passed to the signal. * @return_value: Location for the return value. @@ -2402,7 +2301,10 @@ g_signal_get_invocation_hint (gpointer instance) * If @closure is a floating reference (see g_closure_sink()), this function * takes ownership of @closure. * - * Returns: the handler ID (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID (always greater than 0) */ gulong g_signal_connect_closure_by_id (gpointer instance, @@ -2467,7 +2369,10 @@ g_signal_connect_closure_by_id (gpointer instance, * If @closure is a floating reference (see g_closure_sink()), this function * takes ownership of @closure. * - * Returns: the handler ID (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID (always greater than 0) */ gulong g_signal_connect_closure (gpointer instance, @@ -2563,7 +2468,10 @@ node_check_deprecated (const SignalNode *node) * used. Specify @connect_flags if you need `..._after()` or * `..._swapped()` variants of this function. * - * Returns: the handler ID (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID (always greater than 0) */ gulong g_signal_connect_data (gpointer instance, diff --git a/gobject/gsignal.h b/gobject/gsignal.h index 312055b..52d08a8 100644 --- a/gobject/gsignal.h +++ b/gobject/gsignal.h @@ -500,14 +500,18 @@ void g_signal_chain_from_overridden_handler (gpointer instance, * @c_handler: the #GCallback to connect. * @data: data to pass to @c_handler calls. * - * Connects a #GCallback function to a signal for a particular object. + * Connects a [type@GObject.Callback] function to a signal for a particular object. * - * The handler will be called synchronously, before the default handler of the signal. g_signal_emit() will not return control until all handlers are called. + * The handler will be called synchronously, before the default handler of the signal. + * [func@GObject.signal_emit] will not return control until all handlers are called. * - * See [memory management of signal handlers][signal-memory-management] for + * See [memory management of signal handlers](signals.html#Memory_management_of_signal_handlers) for * details on how to handle the return value and memory management of @data. * - * Returns: the handler ID, of type #gulong (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID, of type `gulong` (always greater than 0) */ /* Intentionally not using G_CONNECT_DEFAULT here to avoid deprecation * warnings with older GLIB_VERSION_MAX_ALLOWED */ @@ -524,7 +528,10 @@ void g_signal_chain_from_overridden_handler (gpointer instance, * * The handler will be called synchronously, after the default handler of the signal. * - * Returns: the handler ID, of type #gulong (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID, of type `gulong` (always greater than 0) */ #define g_signal_connect_after(instance, detailed_signal, c_handler, data) \ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_AFTER) @@ -562,7 +569,10 @@ void g_signal_chain_from_overridden_handler (gpointer instance, * (GCallback) button_clicked_cb, other_widget); * ]| * - * Returns: the handler ID, of type #gulong (always greater than 0 for successful connections) + * This function cannot fail. If the given signal doesn’t exist, a critical + * warning is emitted. + * + * Returns: the handler ID, of type `gulong` (always greater than 0) */ #define g_signal_connect_swapped(instance, detailed_signal, c_handler, data) \ g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, G_CONNECT_SWAPPED) diff --git a/gobject/gsignalgroup.c b/gobject/gsignalgroup.c index 6cf9cc9..5372e8c 100644 --- a/gobject/gsignalgroup.c +++ b/gobject/gsignalgroup.c @@ -28,13 +28,12 @@ #include "gvaluetypes.h" /** - * SECTION:gsignalgroup - * @Title: GSignalGroup - * @Short_description: Manage a collection of signals on a GObject + * GSignalGroup: * - * #GSignalGroup manages to simplify the process of connecting - * many signals to a #GObject as a group. As such there is no API - * to disconnect a signal from the group. + * `GSignalGroup` manages a collection of signals on a `GObject`. + * + * `GSignalGroup` simplifies the process of connecting many signals to a `GObject` + * as a group. As such there is no API to disconnect a signal from the group. * * In particular, this allows you to: * @@ -43,12 +42,12 @@ * - Block and unblock signals as a group * - Ensuring that blocked state transfers across target instances. * - * One place you might want to use such a structure is with #GtkTextView and - * #GtkTextBuffer. Often times, you'll need to connect to many signals on - * #GtkTextBuffer from a #GtkTextView subclass. This allows you to create a + * One place you might want to use such a structure is with `GtkTextView` and + * `GtkTextBuffer`. Often times, you'll need to connect to many signals on + * `GtkTextBuffer` from a `GtkTextView` subclass. This allows you to create a * signal group during instance construction, simply bind the - * #GtkTextView:buffer property to #GSignalGroup:target and connect - * all the signals you need. When the #GtkTextView:buffer property changes + * `GtkTextView:buffer` property to `GSignalGroup:target` and connect + * all the signals you need. When the `GtkTextView:buffer` property changes * all of the signals will be transitioned correctly. * * Since: 2.72 @@ -611,9 +610,7 @@ g_signal_group_class_init (GSignalGroupClass *klass) * Since: 2.72 */ properties[PROP_TARGET] = - g_param_spec_object ("target", - "Target", - "The target instance used when connecting signals.", + g_param_spec_object ("target", NULL, NULL, G_TYPE_OBJECT, (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS)); @@ -625,9 +622,7 @@ g_signal_group_class_init (GSignalGroupClass *klass) * Since: 2.72 */ properties[PROP_TARGET_TYPE] = - g_param_spec_gtype ("target-type", - "Target Type", - "The GType of the target property.", + g_param_spec_gtype ("target-type", NULL, NULL, G_TYPE_OBJECT, (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); diff --git a/gobject/gsignalgroup.h b/gobject/gsignalgroup.h index 6aa151c..38fd2e0 100644 --- a/gobject/gsignalgroup.h +++ b/gobject/gsignalgroup.h @@ -36,14 +36,6 @@ G_BEGIN_DECLS #define G_IS_SIGNAL_GROUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_TYPE_SIGNAL_GROUP)) #define G_TYPE_SIGNAL_GROUP (g_signal_group_get_type()) -/** - * GSignalGroup: - * - * #GSignalGroup is an opaque structure whose members - * cannot be accessed directly. - * - * Since: 2.72 - */ typedef struct _GSignalGroup GSignalGroup; GOBJECT_AVAILABLE_IN_2_72 diff --git a/gobject/gsourceclosure.c b/gobject/gsourceclosure.c index 6a42f77..3ca5e45 100644 --- a/gobject/gsourceclosure.c +++ b/gobject/gsourceclosure.c @@ -36,7 +36,7 @@ g_io_condition_get_type (void) { static GType etype = 0; - if (g_once_init_enter (&etype)) + if (g_once_init_enter_pointer (&etype)) { static const GFlagsValue values[] = { { G_IO_IN, "G_IO_IN", "in" }, @@ -48,7 +48,7 @@ g_io_condition_get_type (void) { 0, NULL, NULL } }; GType type_id = g_flags_register_static ("GIOCondition", values); - g_once_init_leave (&etype, type_id); + g_once_init_leave_pointer (&etype, type_id); } return etype; } diff --git a/gobject/gtype.c b/gobject/gtype.c index e2e0c38..8222fc4 100644 --- a/gobject/gtype.c +++ b/gobject/gtype.c @@ -44,65 +44,6 @@ #define IF_DEBUG(debug_type) if (_g_type_debug_flags & G_TYPE_DEBUG_ ## debug_type) #endif -/** - * SECTION:gtype - * @short_description: The GLib Runtime type identification and - * management system - * @title:Type Information - * - * The GType API is the foundation of the GObject system. It provides the - * facilities for registering and managing all fundamental data types, - * user-defined object and interface types. - * - * For type creation and registration purposes, all types fall into one of - * two categories: static or dynamic. Static types are never loaded or - * unloaded at run-time as dynamic types may be. Static types are created - * with g_type_register_static() that gets type specific information passed - * in via a #GTypeInfo structure. - * - * Dynamic types are created with g_type_register_dynamic() which takes a - * #GTypePlugin structure instead. The remaining type information (the - * #GTypeInfo structure) is retrieved during runtime through #GTypePlugin - * and the g_type_plugin_*() API. - * - * These registration functions are usually called only once from a - * function whose only purpose is to return the type identifier for a - * specific class. Once the type (or class or interface) is registered, - * it may be instantiated, inherited, or implemented depending on exactly - * what sort of type it is. - * - * There is also a third registration function for registering fundamental - * types called g_type_register_fundamental() which requires both a #GTypeInfo - * structure and a #GTypeFundamentalInfo structure but it is seldom used - * since most fundamental types are predefined rather than user-defined. - * - * Type instance and class structs are limited to a total of 64 KiB, - * including all parent types. Similarly, type instances' private data - * (as created by G_ADD_PRIVATE()) are limited to a total of - * 64 KiB. If a type instance needs a large static buffer, allocate it - * separately (typically by using #GArray or #GPtrArray) and put a pointer - * to the buffer in the structure. - * - * As mentioned in the [GType conventions][gtype-conventions], type names must - * be at least three characters long. There is no upper length limit. The first - * character must be a letter (a–z or A–Z) or an underscore (‘_’). Subsequent - * characters can be letters, numbers or any of ‘-_+’. - * - * # Runtime Debugging - * - * When `G_ENABLE_DEBUG` is defined during compilation, the GObject library - * supports an environment variable `GOBJECT_DEBUG` that can be set to a - * combination of flags to trigger debugging messages about - * object bookkeeping and signal emissions during runtime. - * - * The currently supported flags are: - * - `objects`: Tracks all #GObject instances in a global hash table called - * `debug_objects_ht`, and prints the still-alive objects on exit. - * - `instance-count`: Tracks the number of instances of every #GType and makes - * it available via the g_type_get_instance_count() function. - * - `signals`: Currently unused. - */ - /* NOTE: some functions (some internal variants and exported ones) * invalidate data portions of the TypeNodes. if external functions/callbacks @@ -155,6 +96,9 @@ #define g_assert_type_system_initialized() \ g_assert (static_quark_type_flags) +/* Make sure G_TYPE_IS_*() macros still end up inlined */ +#define g_type_test_flags(t,f) _g_type_test_flags(t,f) + #define TYPE_FUNDAMENTAL_FLAG_MASK (G_TYPE_FLAG_CLASSED | \ G_TYPE_FLAG_INSTANTIATABLE | \ G_TYPE_FLAG_DERIVABLE | \ @@ -163,7 +107,9 @@ /* List the flags that are directly accessible via the TypeNode struct flags */ #define NODE_FLAG_MASK ( \ + G_TYPE_FLAG_ABSTRACT | \ G_TYPE_FLAG_CLASSED | \ + G_TYPE_FLAG_DEPRECATED | \ G_TYPE_FLAG_INSTANTIATABLE | \ G_TYPE_FLAG_FINAL) @@ -198,6 +144,8 @@ typedef struct _IFaceHolder IFaceHolder; /* --- prototypes --- */ +static inline gboolean _g_type_test_flags (GType type, + guint flags); static inline GTypeFundamentalInfo* type_node_fundamental_info_I (TypeNode *node); static void type_add_flags_W (TypeNode *node, GTypeFlags flags); @@ -252,7 +200,9 @@ struct _TypeNode guint n_children; /* writable with lock */ guint n_supers : 8; guint n_prerequisites : 9; + guint is_abstract : 1; guint is_classed : 1; + guint is_deprecated : 1; guint is_instantiatable : 1; guint is_final : 1; guint mutatable_check_cache : 1; /* combines some common path checks */ @@ -472,7 +422,7 @@ type_node_any_new_W (TypeNode *pnode, #endif } else - type = (GType) node; + type = GPOINTER_TO_TYPE (node); g_assert ((type & TYPE_ID_MASK) == 0); @@ -482,7 +432,9 @@ type_node_any_new_W (TypeNode *pnode, node->supers[0] = type; node->supers[1] = 0; + node->is_abstract = (type_flags & G_TYPE_FLAG_ABSTRACT) != 0; node->is_classed = (type_flags & G_TYPE_FLAG_CLASSED) != 0; + node->is_deprecated = (type_flags & G_TYPE_FLAG_DEPRECATED) != 0; node->is_instantiatable = (type_flags & G_TYPE_FLAG_INSTANTIATABLE) != 0; if (NODE_IS_IFACE (node)) @@ -498,9 +450,13 @@ type_node_any_new_W (TypeNode *pnode, node->supers[0] = type; memcpy (node->supers + 1, pnode->supers, sizeof (GType) * (1 + pnode->n_supers + 1)); + node->is_abstract = (type_flags & G_TYPE_FLAG_ABSTRACT) != 0; node->is_classed = pnode->is_classed; + node->is_deprecated = (type_flags & G_TYPE_FLAG_DEPRECATED) != 0; node->is_instantiatable = pnode->is_instantiatable; - + + node->is_deprecated |= pnode->is_deprecated; + if (NODE_IS_IFACE (node)) { IFACE_NODE_N_PREREQUISITES (node) = 0; @@ -541,7 +497,7 @@ type_node_any_new_W (TypeNode *pnode, node->global_gdata = NULL; g_hash_table_insert (static_type_nodes_ht, (gpointer) g_quark_to_string (node->qname), - (gpointer) type); + GTYPE_TO_POINTER (type)); g_atomic_int_inc ((gint *)&type_registration_serial); @@ -566,20 +522,18 @@ type_node_fundamental_new_W (GType ftype, { GTypeFundamentalInfo *finfo; TypeNode *node; - + g_assert ((ftype & TYPE_ID_MASK) == 0); g_assert (ftype <= G_TYPE_FUNDAMENTAL_MAX); - + if (ftype >> G_TYPE_FUNDAMENTAL_SHIFT == static_fundamental_next) static_fundamental_next++; - - type_flags &= TYPE_FUNDAMENTAL_FLAG_MASK; - + node = type_node_any_new_W (NULL, ftype, name, NULL, type_flags); - + finfo = type_node_fundamental_info_I (node); - finfo->type_flags = type_flags; - + finfo->type_flags = type_flags & TYPE_FUNDAMENTAL_FLAG_MASK; + return node; } @@ -1854,14 +1808,14 @@ maybe_issue_deprecation_warning (GType type) gboolean already; const char *name; - if (g_once_init_enter (&enable_diagnostic)) + if (g_once_init_enter_pointer (&enable_diagnostic)) { const gchar *value = g_getenv ("G_ENABLE_DIAGNOSTIC"); if (!value) value = "0"; - g_once_init_leave (&enable_diagnostic, value); + g_once_init_leave_pointer (&enable_diagnostic, value); } if (enable_diagnostic[0] == '0') @@ -2767,9 +2721,9 @@ g_type_register_fundamental (GType type_id, if ((type_id & TYPE_ID_MASK) || type_id > G_TYPE_FUNDAMENTAL_MAX) { - g_critical ("attempt to register fundamental type '%s' with invalid type id (%" G_GSIZE_FORMAT ")", + g_critical ("attempt to register fundamental type '%s' with invalid type id (%" G_GUINTPTR_FORMAT ")", type_name, - type_id); + (guintptr) type_id); return 0; } if ((finfo->type_flags & G_TYPE_FLAG_INSTANTIATABLE) && @@ -3490,7 +3444,7 @@ g_type_from_name (const gchar *name) g_return_val_if_fail (name != NULL, 0); G_READ_LOCK (&type_rw_lock); - type = (GType) g_hash_table_lookup (static_type_nodes_ht, name); + type = GPOINTER_TO_TYPE (g_hash_table_lookup (static_type_nodes_ht, name)); G_READ_UNLOCK (&type_rw_lock); return type; @@ -3919,6 +3873,8 @@ type_add_flags_W (TypeNode *node, dflags |= flags; type_set_qdata_W (node, static_quark_type_flags, GUINT_TO_POINTER (dflags)); + node->is_abstract = (flags & G_TYPE_FLAG_ABSTRACT) != 0; + node->is_deprecated |= (flags & G_TYPE_FLAG_DEPRECATED) != 0; node->is_final = (flags & G_TYPE_FLAG_FINAL) != 0; } @@ -3995,9 +3951,9 @@ g_type_get_instance_count (GType type) } /* --- implementation details --- */ -gboolean -g_type_test_flags (GType type, - guint flags) +static inline gboolean +_g_type_test_flags (GType type, + guint flags) { TypeNode *node; gboolean result = FALSE; @@ -4007,16 +3963,22 @@ g_type_test_flags (GType type, { if ((flags & ~NODE_FLAG_MASK) == 0) { - if (flags & G_TYPE_FLAG_CLASSED) - result |= node->is_classed; + if ((flags & G_TYPE_FLAG_CLASSED) && !node->is_classed) + return FALSE; - if (flags & G_TYPE_FLAG_INSTANTIATABLE) - result |= node->is_instantiatable; + if ((flags & G_TYPE_FLAG_INSTANTIATABLE) && !node->is_instantiatable) + return FALSE; - if (flags & G_TYPE_FLAG_FINAL) - result |= node->is_final; + if ((flags & G_TYPE_FLAG_FINAL) && !node->is_final) + return FALSE; - return result; + if ((flags & G_TYPE_FLAG_ABSTRACT) && !node->is_abstract) + return FALSE; + + if ((flags & G_TYPE_FLAG_DEPRECATED) && !node->is_deprecated) + return FALSE; + + return TRUE; } guint fflags = flags & TYPE_FUNDAMENTAL_FLAG_MASK; @@ -4046,6 +4008,13 @@ g_type_test_flags (GType type, return result; } +gboolean +(g_type_test_flags) (GType type, + guint flags) +{ + return _g_type_test_flags (type, flags); +} + /** * g_type_get_plugin: * @type: #GType to retrieve the plugin for @@ -4421,7 +4390,7 @@ g_type_value_table_peek (GType type) return vtable; if (!node) - g_critical (G_STRLOC ": type id '%" G_GSIZE_FORMAT "' is invalid", type); + g_critical (G_STRLOC ": type id '%" G_GUINTPTR_FORMAT "' is invalid", (guintptr) type); if (!has_refed_data) g_critical ("can't peek value table for type '%s' which is not currently referenced", type_descriptive_name_I (type)); diff --git a/gobject/gtype.h b/gobject/gtype.h index b02121a..a16da45 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -421,9 +421,11 @@ G_BEGIN_DECLS * A numerical value which represents the unique identifier of a registered * type. */ -#if GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined (G_CXX_STD_VERSION) +#if GLIB_SIZEOF_VOID_P > GLIB_SIZEOF_SIZE_T +typedef guintptr GType; +#elif GLIB_SIZEOF_SIZE_T != GLIB_SIZEOF_LONG || !defined (G_CXX_STD_VERSION) typedef gsize GType; -#else /* for historic reasons, C++ links against gulong GTypes */ +#else /* for historic reasons, C++ on non-Morello/CHERI systems links against gulong GTypes */ typedef gulong GType; #endif typedef struct _GValue GValue; @@ -2009,8 +2011,8 @@ guint g_type_get_type_registration_serial (void); * GType * gtk_gadget_get_type (void) * { - * static gsize static_g_define_type_id = 0; - * if (g_once_init_enter (&static_g_define_type_id)) + * static GType static_g_define_type_id = 0; + * if (g_once_init_enter_pointer (&static_g_define_type_id)) * { * GType g_define_type_id = * g_type_register_static_simple (GTK_TYPE_WIDGET, @@ -2030,7 +2032,7 @@ guint g_type_get_type_registration_serial (void); * }; * g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); * } - * g_once_init_leave (&static_g_define_type_id, g_define_type_id); + * g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); * } * return static_g_define_type_id; * } @@ -2265,6 +2267,16 @@ static void type_name##_class_intern_init (gpointer klass) \ } #endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 */ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_80 +#define _g_type_once_init_type GType +#define _g_type_once_init_enter g_once_init_enter_pointer +#define _g_type_once_init_leave g_once_init_leave_pointer +#else /* if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_80 */ +#define _g_type_once_init_type gsize +#define _g_type_once_init_enter g_once_init_enter +#define _g_type_once_init_leave g_once_init_leave +#endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_80 */ + /* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */ #define _G_DEFINE_TYPE_EXTENDED_BEGIN_PRE(TypeName, type_name, TYPE_PARENT) \ \ @@ -2286,15 +2298,15 @@ type_name##_get_instance_private (TypeName *self) \ GType \ type_name##_get_type (void) \ { \ - static gsize static_g_define_type_id = 0; + static _g_type_once_init_type static_g_define_type_id = 0; /* Prelude goes here */ /* Added for _G_DEFINE_TYPE_EXTENDED_WITH_PRELUDE */ #define _G_DEFINE_TYPE_EXTENDED_BEGIN_REGISTER(TypeName, type_name, TYPE_PARENT, flags) \ - if (g_once_init_enter (&static_g_define_type_id)) \ + if (_g_type_once_init_enter (&static_g_define_type_id)) \ { \ GType g_define_type_id = type_name##_get_type_once (); \ - g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ + _g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } /* closes type_name##_get_type() */ \ @@ -2334,8 +2346,8 @@ static void type_name##_default_init (TypeName##Interface *klass); \ GType \ type_name##_get_type (void) \ { \ - static gsize static_g_define_type_id = 0; \ - if (g_once_init_enter (&static_g_define_type_id)) \ + static _g_type_once_init_type static_g_define_type_id = 0; \ + if (_g_type_once_init_enter (&static_g_define_type_id)) \ { \ GType g_define_type_id = \ g_type_register_static_simple (G_TYPE_INTERFACE, \ @@ -2351,7 +2363,7 @@ type_name##_get_type (void) \ #define _G_DEFINE_INTERFACE_EXTENDED_END() \ /* following custom code */ \ } \ - g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ + _g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } /* closes type_name##_get_type() */ @@ -2460,11 +2472,11 @@ static GType type_name##_get_type_once (void); \ GType \ type_name##_get_type (void) \ { \ - static gsize static_g_define_type_id = 0; \ - if (g_once_init_enter (&static_g_define_type_id)) \ + static _g_type_once_init_type static_g_define_type_id = 0; \ + if (_g_type_once_init_enter (&static_g_define_type_id)) \ { \ GType g_define_type_id = type_name##_get_type_once (); \ - g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ + _g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } \ @@ -2497,11 +2509,11 @@ static GType type_name##_get_type_once (void); \ GType \ type_name##_get_type (void) \ { \ - static gsize static_g_define_type_id = 0; \ - if (g_once_init_enter (&static_g_define_type_id)) \ + static _g_type_once_init_type static_g_define_type_id = 0; \ + if (_g_type_once_init_enter (&static_g_define_type_id)) \ { \ GType g_define_type_id = type_name##_get_type_once (); \ - g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ + _g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } \ @@ -2550,11 +2562,11 @@ static GType type_name##_get_type_once (void); \ GType \ type_name##_get_type (void) \ { \ - static gsize static_g_define_type_id = 0; \ - if (g_once_init_enter (&static_g_define_type_id)) \ + static _g_type_once_init_type static_g_define_type_id = 0; \ + if (_g_type_once_init_enter (&static_g_define_type_id)) \ { \ GType g_define_type_id = type_name##_get_type_once (); \ - g_once_init_leave (&static_g_define_type_id, g_define_type_id); \ + _g_type_once_init_leave (&static_g_define_type_id, g_define_type_id); \ } \ return static_g_define_type_id; \ } \ @@ -2698,6 +2710,27 @@ const gchar * g_type_name_from_class (GTypeClass *g_class); */ #define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0)) +/** + * GPOINTER_TO_TYPE: + * @p: The pointer to convert to a #GType + * + * This macro should be used instead of GPOINTER_TO_SIZE() to ensure + * portability since #GType is not guaranteed to be the same as #gsize. + * + * Since: 2.80 + */ +#define GPOINTER_TO_TYPE(p) ((GType) (guintptr) (p)) GOBJECT_AVAILABLE_MACRO_IN_2_80 +/** + * GTYPE_TO_POINTER: + * @t: The #GType to convert to a pointer + * + * This macro should be used instead of GSIZE_TO_POINTER() to ensure + * portability since #GType is not guaranteed to be the same as #gsize. + * + * Since: 2.80 + */ +#define GTYPE_TO_POINTER(t) ((gpointer) (guintptr) (t)) GOBJECT_AVAILABLE_MACRO_IN_2_80 + G_END_DECLS #endif /* __G_TYPE_H__ */ diff --git a/gobject/gtypemodule.c b/gobject/gtypemodule.c index ec95110..b7f61c6 100644 --- a/gobject/gtypemodule.c +++ b/gobject/gtypemodule.c @@ -26,41 +26,40 @@ /** - * SECTION:gtypemodule - * @short_description: Type loading modules - * @see_also: #GTypePlugin, #GModule - * @title: GTypeModule + * GTypeModule: + * @name: the name of the module * - * #GTypeModule provides a simple implementation of the #GTypePlugin + * `GTypeModule` provides a simple implementation of the `GTypePlugin` * interface. * - * The model of #GTypeModule is a dynamically loaded module which + * The model of `GTypeModule` is a dynamically loaded module which * implements some number of types and interface implementations. * * When the module is loaded, it registers its types and interfaces - * using g_type_module_register_type() and g_type_module_add_interface(). + * using [method@GObject.TypeModule.register_type] and + * [method@GObject.TypeModule.add_interface]. * As long as any instances of these types and interface implementations * are in use, the module is kept loaded. When the types and interfaces * are gone, the module may be unloaded. If the types and interfaces * become used again, the module will be reloaded. Note that the last * reference cannot be released from within the module code, since that - * would lead to the caller's code being unloaded before g_object_unref() + * would lead to the caller's code being unloaded before `g_object_unref()` * returns to it. * * Keeping track of whether the module should be loaded or not is done by * using a use count - it starts at zero, and whenever it is greater than * zero, the module is loaded. The use count is maintained internally by * the type system, but also can be explicitly controlled by - * g_type_module_use() and g_type_module_unuse(). Typically, when loading - * a module for the first type, g_type_module_use() will be used to load - * it so that it can initialize its types. At some later point, when the - * module no longer needs to be loaded except for the type - * implementations it contains, g_type_module_unuse() is called. + * [method@GObject.TypeModule.use] and [method@GObject.TypeModule.unuse]. + * Typically, when loading a module for the first type, `g_type_module_use()` + * will be used to load it so that it can initialize its types. At some later + * point, when the module no longer needs to be loaded except for the type + * implementations it contains, `g_type_module_unuse()` is called. * - * #GTypeModule does not actually provide any implementation of module + * `GTypeModule` does not actually provide any implementation of module * loading and unloading. To create a particular module type you must - * derive from #GTypeModule and implement the load and unload functions - * in #GTypeModuleClass. + * derive from `GTypeModule` and implement the load and unload functions + * in `GTypeModuleClass`. */ typedef struct _ModuleTypeInfo ModuleTypeInfo; @@ -116,6 +115,10 @@ g_type_module_finalize (GObject *object) g_free (module->name); + /* in case a subclass does not chain-up to parent in dispose() */ + g_assert (module->type_infos == NULL); + g_assert (module->interface_infos == NULL); + G_OBJECT_CLASS (parent_class)->finalize (object); } diff --git a/gobject/gtypemodule.h b/gobject/gtypemodule.h index e386b50..fba714b 100644 --- a/gobject/gtypemodule.h +++ b/gobject/gtypemodule.h @@ -40,13 +40,6 @@ typedef struct _GTypeModuleClass GTypeModuleClass; G_DEFINE_AUTOPTR_CLEANUP_FUNC(GTypeModule, g_object_unref) -/** - * GTypeModule: - * @name: the name of the module - * - * The members of the GTypeModule structure should not - * be accessed directly, except for the @name field. - */ struct _GTypeModule { GObject parent_instance; diff --git a/gobject/gtypeplugin.c b/gobject/gtypeplugin.c index b6f7f32..d9743f5 100644 --- a/gobject/gtypeplugin.c +++ b/gobject/gtypeplugin.c @@ -23,10 +23,7 @@ /** - * SECTION:gtypeplugin - * @short_description: An interface for dynamically loadable types - * @see_also: #GTypeModule and g_type_register_dynamic(). - * @title: GTypePlugin + * GTypePlugin: * * An interface that handles the lifecycle of dynamically loaded types. * @@ -36,45 +33,45 @@ * 1. The type is initially introduced (usually upon loading the module * the first time, or by your main application that knows what modules * introduces what types), like this: - * |[ + * ```c * new_type_id = g_type_register_dynamic (parent_type_id, * "TypeName", * new_type_plugin, * type_flags); - * ]| - * where @new_type_plugin is an implementation of the - * #GTypePlugin interface. + * ``` + * where `new_type_plugin` is an implementation of the + * `GTypePlugin` interface. * * 2. The type's implementation is referenced, e.g. through - * g_type_class_ref() or through g_type_create_instance() (this is - * being called by g_object_new()) or through one of the above done on - * a type derived from @new_type_id. + * [func@GObject.TypeClass.ref] or through [func@GObject.type_create_instance] + * (this is being called by [ctor@GObject.Object.new]) or through one of the above + * done on a type derived from `new_type_id`. * - * 3. This causes the type system to load the type's implementation by - * calling g_type_plugin_use() and g_type_plugin_complete_type_info() - * on @new_type_plugin. - * - * 4. At some point the type's implementation isn't required anymore, - * e.g. after g_type_class_unref() or g_type_free_instance() (called - * when the reference count of an instance drops to zero). + * 3. This causes the type system to load the type's implementation by calling + * [method@GObject.TypePlugin.use] and [method@GObject.TypePlugin.complete_type_info] + * on `new_type_plugin`. + * + * 4. At some point the type's implementation isn't required anymore, e.g. after + * [method@GObject.TypeClass.unref] or [func@GObject.type_free_instance] + * (called when the reference count of an instance drops to zero). * * 5. This causes the type system to throw away the information retrieved - * from g_type_plugin_complete_type_info() and then it calls - * g_type_plugin_unuse() on @new_type_plugin. - * + * from [method@GObject.TypePlugin.complete_type_info] and then it calls + * [method@GObject.TypePlugin.unuse] on `new_type_plugin`. + * * 6. Things may repeat from the second step. * - * So basically, you need to implement a #GTypePlugin type that + * So basically, you need to implement a `GTypePlugin` type that * carries a use_count, once use_count goes from zero to one, you need * to load the implementation to successfully handle the upcoming - * g_type_plugin_complete_type_info() call. Later, maybe after + * [method@GObject.TypePlugin.complete_type_info] call. Later, maybe after * succeeding use/unuse calls, once use_count drops to zero, you can * unload the implementation again. The type system makes sure to call - * g_type_plugin_use() and g_type_plugin_complete_type_info() again - * when the type is needed again. + * [method@GObject.TypePlugin.use] and [method@GObject.TypePlugin.complete_type_info] + * again when the type is needed again. * - * #GTypeModule is an implementation of #GTypePlugin that already - * implements most of this except for the actual module loading and + * [class@GObject.TypeModule] is an implementation of `GTypePlugin` that + * already implements most of this except for the actual module loading and * unloading. It even handles multiple registered types per module. */ diff --git a/gobject/gtypeplugin.h b/gobject/gtypeplugin.h index 3711932..c950dfb 100644 --- a/gobject/gtypeplugin.h +++ b/gobject/gtypeplugin.h @@ -80,12 +80,6 @@ typedef void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin, GType instance_type, GType interface_type, GInterfaceInfo *info); -/** - * GTypePlugin: - * - * The GTypePlugin typedef is used as a placeholder - * for objects that implement the GTypePlugin interface. - */ /** * GTypePluginClass: * @use_plugin: Increases the use count of the plugin. diff --git a/gobject/gvalue.c b/gobject/gvalue.c index 10885da..9d974fa 100644 --- a/gobject/gvalue.c +++ b/gobject/gvalue.c @@ -31,122 +31,6 @@ #include "gtype-private.h" -/** - * SECTION:generic_values - * @short_description: A polymorphic type that can hold values of any - * other type - * @see_also: The fundamental types which all support #GValue - * operations and thus can be used as a type initializer for - * g_value_init() are defined by a separate interface. See the - * [standard values API][gobject-Standard-Parameter-and-Value-Types] - * for details - * @title: Generic values - * - * The #GValue structure is basically a variable container that consists - * of a type identifier and a specific value of that type. - * - * The type identifier within a #GValue structure always determines the - * type of the associated value. - * - * To create an undefined #GValue structure, simply create a zero-filled - * #GValue structure. To initialize the #GValue, use the g_value_init() - * function. A #GValue cannot be used until it is initialized. Before - * destruction you must always use g_value_unset() to make sure allocated - * memory is freed. - * - * The basic type operations (such as freeing and copying) are determined - * by the #GTypeValueTable associated with the type ID stored in the #GValue. - * Other #GValue operations (such as converting values between types) are - * provided by this interface. - * - * The code in the example program below demonstrates #GValue's - * features. - * - * |[ - * #include - * - * static void - * int2string (const GValue *src_value, - * GValue *dest_value) - * { - * if (g_value_get_int (src_value) == 42) - * g_value_set_static_string (dest_value, "An important number"); - * else - * g_value_set_static_string (dest_value, "What's that?"); - * } - * - * int - * main (int argc, - * char *argv[]) - * { - * // GValues must be initialized - * GValue a = G_VALUE_INIT; - * GValue b = G_VALUE_INIT; - * const gchar *message; - * - * // The GValue starts empty - * g_assert (!G_VALUE_HOLDS_STRING (&a)); - * - * // Put a string in it - * g_value_init (&a, G_TYPE_STRING); - * g_assert (G_VALUE_HOLDS_STRING (&a)); - * g_value_set_static_string (&a, "Hello, world!"); - * g_printf ("%s\n", g_value_get_string (&a)); - * - * // Reset it to its pristine state - * g_value_unset (&a); - * - * // It can then be reused for another type - * g_value_init (&a, G_TYPE_INT); - * g_value_set_int (&a, 42); - * - * // Attempt to transform it into a GValue of type STRING - * g_value_init (&b, G_TYPE_STRING); - * - * // An INT is transformable to a STRING - * g_assert (g_value_type_transformable (G_TYPE_INT, G_TYPE_STRING)); - * - * g_value_transform (&a, &b); - * g_printf ("%s\n", g_value_get_string (&b)); - * - * // Attempt to transform it again using a custom transform function - * g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, int2string); - * g_value_transform (&a, &b); - * g_printf ("%s\n", g_value_get_string (&b)); - * return 0; - * } - * ]| - * - * See also [gobject-Standard-Parameter-and-Value-Types] for more information on - * validation of #GValue. - * - * For letting a #GValue own (and memory manage) arbitrary types or pointers, - * they need to become a [boxed type][gboxed]. The example below shows how - * the pointer `mystruct` of type `MyStruct` is used as a [boxed type][gboxed]. - * - * |[ - * typedef struct { ... } MyStruct; - * G_DEFINE_BOXED_TYPE (MyStruct, my_struct, my_struct_copy, my_struct_free) - * - * // These two lines normally go in a public header. By GObject convention, - * // the naming scheme is NAMESPACE_TYPE_NAME: - * #define MY_TYPE_STRUCT (my_struct_get_type ()) - * GType my_struct_get_type (void); - * - * void - * foo () - * { - * GValue *value = g_new0 (GValue, 1); - * g_value_init (value, MY_TYPE_STRUCT); - * g_value_set_boxed (value, mystruct); - * // [... your code ....] - * g_value_unset (value); - * g_free (value); - * } - * ]| - */ - - /* --- typedefs & structures --- */ typedef struct { GType src_type; diff --git a/gobject/gvaluearray.c b/gobject/gvaluearray.c index 07b2ffb..581503b 100644 --- a/gobject/gvaluearray.c +++ b/gobject/gvaluearray.c @@ -30,35 +30,35 @@ /** - * SECTION:value_arrays - * @short_description: A container structure to maintain an array of - * generic values - * @see_also: #GValue, #GParamSpecValueArray, g_param_spec_value_array() - * @title: Value arrays + * GValueArray: + * @n_values: number of values contained in the array + * @values: array of values * - * The prime purpose of a #GValueArray is for it to be used as an - * object property that holds an array of values. A #GValueArray wraps - * an array of #GValue elements in order for it to be used as a boxed - * type through %G_TYPE_VALUE_ARRAY. + * A `GValueArray` is a container structure to hold an array of generic values. * - * #GValueArray is deprecated in favour of #GArray since GLib 2.32. It - * is possible to create a #GArray that behaves like a #GValueArray by - * using the size of #GValue as the element size, and by setting - * g_value_unset() as the clear function using g_array_set_clear_func(), - * for instance, the following code: + * The prime purpose of a `GValueArray` is for it to be used as an + * object property that holds an array of values. A `GValueArray` wraps + * an array of `GValue` elements in order for it to be used as a boxed + * type through `G_TYPE_VALUE_ARRAY`. * - * |[ + * `GValueArray` is deprecated in favour of `GArray` since GLib 2.32. + * It is possible to create a `GArray` that behaves like a `GValueArray` + * by using the size of `GValue` as the element size, and by setting + * [method@GObject.Value.unset] as the clear function using + * [func@GLib.Array.set_clear_func], for instance, the following code: + * + * ```c * GValueArray *array = g_value_array_new (10); - * ]| + * ``` * * can be replaced by: * - * |[ + * ```c * GArray *array = g_array_sized_new (FALSE, TRUE, sizeof (GValue), 10); * g_array_set_clear_func (array, (GDestroyNotify) g_value_unset); - * ]| + * ``` * - * Deprecated: 2.32: Use #GArray instead, if possible for the given use case, + * Deprecated: 2.32: Use `GArray` instead, if possible for the given use case, * as described above. */ diff --git a/gobject/gvaluearray.h b/gobject/gvaluearray.h index 72aa91b..d6052c0 100644 --- a/gobject/gvaluearray.h +++ b/gobject/gvaluearray.h @@ -41,13 +41,6 @@ G_BEGIN_DECLS /* --- typedefs & structs --- */ typedef struct _GValueArray GValueArray; -/** - * GValueArray: - * @n_values: number of values contained in the array - * @values: array of values - * - * A #GValueArray contains an array of #GValue elements. - */ struct _GValueArray { guint n_values; diff --git a/gobject/gvaluecollector.h b/gobject/gvaluecollector.h index 7e7ae02..35608b1 100644 --- a/gobject/gvaluecollector.h +++ b/gobject/gvaluecollector.h @@ -18,17 +18,7 @@ * * gvaluecollector.h: GValue varargs stubs */ -/** - * SECTION:value_collection - * @Short_description: Converting varargs to generic values - * @Title: Varargs Value Collection - * - * The macros in this section provide the varargs parsing support needed - * in variadic GObject functions such as g_object_new() or g_object_set(). - * - * They currently support the collection of integral types, floating point - * types and pointers. - */ + #ifndef __G_VALUE_COLLECTOR_H__ #define __G_VALUE_COLLECTOR_H__ diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c index f490584..6ed6d9c 100644 --- a/gobject/gvaluetypes.c +++ b/gobject/gvaluetypes.c @@ -1159,6 +1159,41 @@ g_value_dup_string (const GValue *value) return g_strdup (value->data[0].v_pointer); } +/** + * g_value_steal_string: + * @value: a valid #GValue of type %G_TYPE_STRING + * + * Steal ownership on contents of a %G_TYPE_STRING #GValue. + * As a result of this operation the value's contents will be reset to %NULL. + * + * The purpose of this call is to provide a way to avoid an extra copy + * when some object have been serialized into string through #GValue API. + * + * NOTE: for safety and compatibility purposes, if #GValue contains + * static string, or an interned one, this function will return a copy + * of the string. Otherwise the transfer notation would be ambiguous. + * + * Returns: (nullable) (transfer full): string content of @value; + * Should be freed with g_free() when no longer needed. + * + * Since: 2.80 + */ +gchar* +g_value_steal_string (GValue *value) +{ + gchar *ret; + + g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL); + + ret = value->data[0].v_pointer; + value->data[0].v_pointer = NULL; + + if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + return g_strdup (ret); + + return ret; +} + /** * g_value_set_pointer: * @value: a valid #GValue of %G_TYPE_POINTER @@ -1208,7 +1243,7 @@ g_value_set_gtype (GValue *value, { g_return_if_fail (G_VALUE_HOLDS_GTYPE (value)); - value->data[0].v_pointer = GSIZE_TO_POINTER (v_gtype); + value->data[0].v_pointer = GTYPE_TO_POINTER (v_gtype); } @@ -1227,7 +1262,7 @@ g_value_get_gtype (const GValue *value) { g_return_val_if_fail (G_VALUE_HOLDS_GTYPE (value), 0); - return GPOINTER_TO_SIZE (value->data[0].v_pointer); + return GPOINTER_TO_TYPE (value->data[0].v_pointer); } /** diff --git a/gobject/gvaluetypes.h b/gobject/gvaluetypes.h index 0c8d0f6..afa6595 100644 --- a/gobject/gvaluetypes.h +++ b/gobject/gvaluetypes.h @@ -263,6 +263,8 @@ GOBJECT_AVAILABLE_IN_ALL const gchar * g_value_get_string (const GValue *value); GOBJECT_AVAILABLE_IN_ALL gchar* g_value_dup_string (const GValue *value); +GOBJECT_AVAILABLE_IN_2_80 +gchar* g_value_steal_string (GValue *value); GOBJECT_AVAILABLE_IN_ALL void g_value_set_pointer (GValue *value, gpointer v_pointer); diff --git a/gobject/tests/boxed.c b/gobject/tests/boxed.c index 4d3f4ea..c683ed8 100644 --- a/gobject/tests/boxed.c +++ b/gobject/tests/boxed.c @@ -668,6 +668,28 @@ test_boxed_pattern_spec (void) g_value_unset (&value); } +static void +test_boxed_rand (void) +{ + GRand *r, *r2; + GValue value = G_VALUE_INIT; + + g_value_init (&value, G_TYPE_RAND); + g_assert_true (G_VALUE_HOLDS_BOXED (&value)); + + r = g_rand_new (); + g_value_take_boxed (&value, r); + + r2 = g_value_get_boxed (&value); + g_assert_true (r == r2); + + r2 = g_value_dup_boxed (&value); + g_assert_true (r != r2); + g_rand_free (r2); + + g_value_unset (&value); +} + int main (int argc, char *argv[]) { @@ -699,6 +721,7 @@ main (int argc, char *argv[]) g_test_add_func ("/boxed/checksum", test_boxed_checksum); g_test_add_func ("/boxed/tree", test_boxed_tree); g_test_add_func ("/boxed/patternspec", test_boxed_pattern_spec); + g_test_add_func ("/boxed/rand", test_boxed_rand); return g_test_run (); } diff --git a/gobject/tests/genmarshal.py b/gobject/tests/genmarshal.py index 1062dfe..e2ecf74 100644 --- a/gobject/tests/genmarshal.py +++ b/gobject/tests/genmarshal.py @@ -88,6 +88,7 @@ class TestGenmarshal(unittest.TestCase): env = os.environ.copy() env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" print("Environment:", env) # We want to ensure consistent line endings... diff --git a/gobject/tests/gobject-query.py b/gobject/tests/gobject-query.py index 618b6ba..aab03be 100644 --- a/gobject/tests/gobject-query.py +++ b/gobject/tests/gobject-query.py @@ -59,6 +59,7 @@ class TestGobjectQuery(unittest.TestCase): env = os.environ.copy() env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" print("Environment:", env) # We want to ensure consistent line endings... diff --git a/gobject/tests/meson.build b/gobject/tests/meson.build index 23f131b..713c1d7 100644 --- a/gobject/tests/meson.build +++ b/gobject/tests/meson.build @@ -83,6 +83,7 @@ gobject_tests = { 'binding' : {}, 'bindinggroup' : {}, 'properties' : {}, + 'properties-introspection' : {}, 'reference' : {}, 'flags' : {}, 'value' : {}, diff --git a/gobject/tests/mkenums.py b/gobject/tests/mkenums.py index 0b40dae..8e92730 100644 --- a/gobject/tests/mkenums.py +++ b/gobject/tests/mkenums.py @@ -100,6 +100,7 @@ class TestMkenums(unittest.TestCase): env = os.environ.copy() env["LC_ALL"] = "C.UTF-8" + env["G_DEBUG"] = "fatal-warnings" print("Environment:", env) # We want to ensure consistent line endings... @@ -784,6 +785,32 @@ comment: {standard_bottom_comment} "7", ) + def test_comma_in_enum_value(self): + """Test use of comma in enum value.""" + h_contents = """ + typedef enum { + ENUM_VALUE_WITH_COMMA = ',', + } TestCommaEnum; + """ + + result = self.runMkenumsWithHeader(h_contents) + self.assertEqual("", result.err) + self.assertSingleEnum( + result, + "TestCommaEnum", + "test_comma_enum", + "TEST_COMMA_ENUM", + "COMMA_ENUM", + "TEST", + "", + "enum", + "Enum", + "ENUM", + "ENUM_VALUE_WITH_COMMA", + "comma", + 44, + ) + class TestRspMkenums(TestMkenums): """Run all tests again in @rspfile mode""" diff --git a/gobject/tests/param.c b/gobject/tests/param.c index 08bc80f..9d22135 100644 --- a/gobject/tests/param.c +++ b/gobject/tests/param.c @@ -1157,7 +1157,6 @@ test_interface_default_init (TestInterfaceInterface *iface) g_object_interface_install_property (iface, pspec); g_test_assert_expected_messages (); - g_param_spec_unref (pspec); continue; } @@ -1398,6 +1397,13 @@ test_param_implement (void) { gchar *test_path; + /* This test is slow. */ + if (!g_test_slow ()) + { + g_test_skip ("Skipping slow /param/implement test"); + return; + } + for (change_this_flag = 0; change_this_flag < 16; change_this_flag++) for (change_this_type = 0; change_this_type < 3; change_this_type++) for (use_this_flag = 0; use_this_flag < 16; use_this_flag++) @@ -1432,7 +1438,7 @@ test_param_implement (void) case 'i': g_test_trap_assert_failed (); - g_test_trap_assert_stderr ("*g_object_class_install_property*"); + g_test_trap_assert_stderr ("*pspec->flags*"); continue; case 'f': @@ -1624,6 +1630,24 @@ test_param_spec_custom (void) g_param_spec_unref (pspec); } +static void +test_param_spec_pool (void) +{ + GParamSpecPool *pool = g_param_spec_pool_new (FALSE); + GParamSpec *pspec = g_param_spec_ref_sink (g_param_spec_int ("int", NULL, NULL, -1, 100, -1, G_PARAM_READWRITE)); + GParamSpec *check = NULL; + + g_param_spec_pool_insert (pool, pspec, G_TYPE_OBJECT); + check = g_param_spec_pool_lookup (pool, "int", G_TYPE_OBJECT, FALSE); + g_assert_true (check->owner_type == G_TYPE_OBJECT); + + g_param_spec_pool_remove (pool, pspec); + g_assert_null (g_param_spec_pool_lookup (pool, "int", G_TYPE_OBJECT, FALSE)); + + g_param_spec_pool_free (pool); + g_param_spec_unref (pspec); +} + int main (int argc, char *argv[]) { @@ -1641,8 +1665,7 @@ main (int argc, char *argv[]) g_test_add_func ("/param/validate", test_param_validate); g_test_add_func ("/param/convert", test_param_convert); - if (g_test_slow ()) - g_test_add_func ("/param/implement", test_param_implement); + g_test_add_func ("/param/implement", test_param_implement); for (data.change_this_flag = 0; data.change_this_flag < 16; data.change_this_flag++) for (data.change_this_type = 0; data.change_this_type < 3; data.change_this_type++) @@ -1653,8 +1676,7 @@ main (int argc, char *argv[]) data.change_this_flag, data.change_this_type, data.use_this_flag, data.use_this_type); test_data = g_memdup2 (&data, sizeof (TestParamImplementData)); - g_test_add_data_func_full (test_path, test_data, test_param_implement_child, g_free); - g_free (test_data); + g_test_add_data_func_full (test_path, g_steal_pointer (&test_data), test_param_implement_child, g_free); g_free (test_path); } @@ -1680,6 +1702,7 @@ main (int argc, char *argv[]) g_test_add_func ("/paramspec/variant", test_param_spec_variant); g_test_add_func ("/paramspec/variant/cmp", test_param_spec_variant_cmp); g_test_add_func ("/paramspec/custom", test_param_spec_custom); + g_test_add_func ("/paramspec/pool", test_param_spec_pool); return g_test_run (); } diff --git a/gobject/tests/performance/meson.build b/gobject/tests/performance/meson.build index 2984a6c..0147f7c 100644 --- a/gobject/tests/performance/meson.build +++ b/gobject/tests/performance/meson.build @@ -1,5 +1,9 @@ gobject_tests = { - 'performance' : { 'args' : [ '--seconds', '0' ] }, + 'performance' : { + 'args' : [ '--seconds', '0' ], + # FIXME: https://gitlab.gnome.org/GNOME/glib/-/issues/3148 + 'can_fail' : host_system == 'gnu', + }, 'performance-threaded' : { 'args' : [ '--seconds', '0' ] }, } diff --git a/gobject/tests/properties-introspection.c b/gobject/tests/properties-introspection.c new file mode 100644 index 0000000..ac72330 --- /dev/null +++ b/gobject/tests/properties-introspection.c @@ -0,0 +1,114 @@ +/* properties-introspection.c: Test the properties introspection API + * + * SPDX-FileCopyrightText: 2023 Emmanuele Bassi + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +/* This test is isolated so we can control the initialization of + * GObjectClass, and the global GParamSpecPool + */ + +#include +#include + +G_DECLARE_INTERFACE (MyTestable, my_testable, MY, TESTABLE, GObject) + +struct _MyTestableInterface +{ + GTypeInterface g_iface; +}; + +G_DEFINE_INTERFACE (MyTestable, my_testable, G_TYPE_OBJECT) + +static void +my_testable_default_init (MyTestableInterface *iface) +{ + g_object_interface_install_property (iface, + g_param_spec_int ("check", NULL, NULL, -1, 10, 0, G_PARAM_READWRITE)); +} + +static void +properties_introspection (void) +{ + g_test_summary ("Verify that introspecting properties on an interface initializes the GParamSpecPool."); + + if (g_test_subprocess ()) + { + gpointer klass = g_type_default_interface_ref (my_testable_get_type ()); + g_assert_nonnull (klass); + + GParamSpec *pspec = g_object_interface_find_property (klass, "check"); + g_assert_nonnull (pspec); + + g_type_default_interface_unref (klass); + return; + } + + g_test_trap_subprocess (NULL, 0, G_TEST_SUBPROCESS_DEFAULT); + g_test_trap_assert_passed (); + g_test_trap_assert_stderr (""); +} + +static gpointer +inspect_func (gpointer data) +{ + unsigned int *n_checks = data; /* (atomic) */ + + gpointer klass = NULL; + do + { + klass = g_type_default_interface_ref (my_testable_get_type ()); + } + while (klass == NULL); + + GParamSpec *pspec = NULL; + do + { + pspec = g_object_interface_find_property (klass, "check"); + } + while (pspec == NULL); + + g_type_default_interface_unref (klass); + + g_atomic_int_inc (n_checks); + + return NULL; +} + +#define N_THREADS 10 + +static void +properties_collision (void) +{ + GThread *threads[N_THREADS]; + unsigned int n_checks = 0; /* (atomic) */ + + g_test_summary ("Verify that multiple threads create a single GParamSpecPool."); + + for (unsigned int i = 0; i < N_THREADS; i++) + { + char *t_name = g_strdup_printf ("inspect [%d]", i); + threads[i] = g_thread_new (t_name, inspect_func, &n_checks); + g_assert_nonnull (threads[i]); + g_free (t_name); + } + + while (g_atomic_int_get (&n_checks) != N_THREADS) + g_usleep (50); + + for (unsigned int i = 0; i < N_THREADS; i++) + g_thread_join (threads[i]); +} + +#undef N_THREADS + +int +main (int argc, char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/properties/introspection", properties_introspection); + g_test_add_func ("/properties/collision", properties_collision); + + return g_test_run (); +} diff --git a/gobject/tests/reference.c b/gobject/tests/reference.c index fa85ef9..0fe655e 100644 --- a/gobject/tests/reference.c +++ b/gobject/tests/reference.c @@ -615,7 +615,8 @@ weak_reffed_object_dispose (GObject *object) G_OBJECT_CLASS (weak_reffed_object_parent_class)->dispose (object); - g_assert_null (g_weak_ref_get (weak_reffed->weak_ref)); + g_assert_true (object == g_weak_ref_get (weak_reffed->weak_ref)); + g_object_unref (object); } static void @@ -669,6 +670,8 @@ test_weak_ref_on_run_dispose (void) g_object_run_dispose (obj); g_assert_null (g_weak_ref_get (&weak)); + g_weak_ref_set (&weak, obj); + g_clear_object (&obj); g_assert_null (g_weak_ref_get (&weak)); } @@ -716,6 +719,277 @@ test_weak_ref_on_toggle_notify (void) g_assert_null (g_weak_ref_get (&weak)); } +static void +weak_ref_in_toggle_notify_toggle_cb (gpointer data, + GObject *object, + gboolean is_last_ref) +{ + GWeakRef weak2; + GObject *obj2; + + if (is_last_ref) + return; + + /* We just got a second ref, while calling g_weak_ref_get(). + * + * Test that taking another weak ref in this situation works. + */ + + g_weak_ref_init (&weak2, object); + g_assert_true (object == g_weak_ref_get (&weak2)); + g_object_unref (object); + + obj2 = g_object_new (G_TYPE_OBJECT, NULL); + g_weak_ref_set (&weak2, obj2); + g_object_unref (obj2); + + g_assert_null (g_weak_ref_get (&weak2)); +} + +static void +test_weak_ref_in_toggle_notify (void) +{ + GObject *obj; + GWeakRef weak = { { GUINT_TO_POINTER (0xDEADBEEFU) } }; + + obj = g_object_new (G_TYPE_OBJECT, NULL); + g_object_add_toggle_ref (obj, weak_ref_in_toggle_notify_toggle_cb, NULL); + g_object_unref (obj); + + g_weak_ref_init (&weak, obj); + + /* We trigger a toggle notify via g_weak_ref_get(). */ + g_assert_true (g_weak_ref_get (&weak) == obj); + + g_object_remove_toggle_ref (obj, weak_ref_in_toggle_notify_toggle_cb, NULL); + g_object_unref (obj); + + g_assert_null (g_weak_ref_get (&weak)); +} + +static void +test_weak_ref_many (void) +{ + const guint N = g_test_slow () + ? G_MAXUINT16 + : 211; + const guint PRIME = 1048583; + GObject *obj; + GWeakRef *weak_refs; + GWeakRef weak_ref1; + guint j; + guint n; + guint i; + + obj = g_object_new (G_TYPE_OBJECT, NULL); + + weak_refs = g_new (GWeakRef, N); + + /* We register them in a somewhat juggled order. That's because below, we will clear them + * again, and we don't want to always clear them in the same order as they were registered. + * For that, we calculate the actual index by jumping around by adding a prime number. */ + j = (g_test_rand_int () % (N + 1)); + for (i = 0; i < N; i++) + { + j = (j + PRIME) % N; + g_weak_ref_init (&weak_refs[j], obj); + } + + if (N == G_MAXUINT16) + { + g_test_expect_message ("GLib-GObject", G_LOG_LEVEL_CRITICAL, "*Too many GWeakRef registered"); + g_weak_ref_init (&weak_ref1, obj); + g_test_assert_expected_messages (); + g_assert_null (g_weak_ref_get (&weak_ref1)); + } + + n = g_test_rand_int () % (N + 1u); + for (i = 0; i < N; i++) + g_weak_ref_set (&weak_refs[i], i < n ? NULL : obj); + + g_object_unref (obj); + + for (i = 0; i < N; i++) + g_assert_null (g_weak_ref_get (&weak_refs[i])); + + /* The API would expect us to also call g_weak_ref_clear() on all references + * to clean up. In practice, they are already all NULL, so we don't need + * that (it would have no effect, with the current implementation of + * GWeakRef). */ + + g_free (weak_refs); +} + +/*****************************************************************************/ + +#define CONCURRENT_N_OBJS 5 +#define CONCURRENT_N_THREADS 5 +#define CONCURRENT_N_RACES 100 + +typedef struct +{ + int TEST_IDX; + GObject *objs[CONCURRENT_N_OBJS]; + int thread_done[CONCURRENT_N_THREADS]; +} ConcurrentData; + +typedef struct +{ + const ConcurrentData *data; + int idx; + int race_count; + GWeakRef *weak_ref; + GRand *rnd; +} ConcurrentThreadData; + +static gpointer +_test_weak_ref_concurrent_thread_cb (gpointer data) +{ + ConcurrentThreadData *thread_data = data; + + while (TRUE) + { + gboolean all_done; + int i; + int r; + + for (r = 0; r < 15; r++) + { + GObject *obj_allocated = NULL; + GObject *obj; + GObject *obj2; + gboolean got_race; + + /* Choose a random object */ + obj = thread_data->data->objs[g_rand_int (thread_data->rnd) % CONCURRENT_N_OBJS]; + if (thread_data->data->TEST_IDX > 0 && (g_rand_int (thread_data->rnd) % 4 == 0)) + { + /* With TEST_IDX>0 also randomly choose NULL or a newly created + * object. */ + if (g_rand_boolean (thread_data->rnd)) + obj = NULL; + else + { + obj_allocated = g_object_new (G_TYPE_OBJECT, NULL); + obj = obj_allocated; + } + } + + g_assert (!obj || G_IS_OBJECT (obj)); + + g_weak_ref_set (thread_data->weak_ref, obj); + + /* get the weak-ref. If there is no race, we expect to get the same + * object back. */ + obj2 = g_weak_ref_get (thread_data->weak_ref); + + g_assert (!obj2 || G_IS_OBJECT (obj2)); + if (!obj2) + { + g_assert (thread_data->data->TEST_IDX > 0); + } + if (obj != obj2) + { + int cnt; + + cnt = 0; + for (i = 0; i < CONCURRENT_N_OBJS; i++) + { + if (obj2 == thread_data->data->objs[i]) + cnt++; + } + if (!obj2) + g_assert_cmpint (cnt, ==, 0); + else if (obj2 && obj2 == obj_allocated) + g_assert_cmpint (cnt, ==, 0); + else if (thread_data->data->TEST_IDX > 0) + g_assert_cmpint (cnt, <=, 1); + else + g_assert_cmpint (cnt, ==, 1); + got_race = TRUE; + } + else + got_race = FALSE; + + g_clear_object (&obj2); + g_clear_object (&obj_allocated); + + if (got_race) + { + /* Each thread should see CONCURRENT_N_RACES before being done. + * Count them. */ + if (g_atomic_int_get (&thread_data->race_count) > CONCURRENT_N_RACES) + g_atomic_int_set (&thread_data->data->thread_done[thread_data->idx], 1); + else + g_atomic_int_add (&thread_data->race_count, 1); + } + } + + /* Each thread runs, until all threads saw the expected number of races. */ + all_done = TRUE; + for (i = 0; i < CONCURRENT_N_THREADS; i++) + { + if (!g_atomic_int_get (&thread_data->data->thread_done[i])) + { + all_done = FALSE; + break; + } + } + if (all_done) + return GINT_TO_POINTER (1); + } +} + +static void +test_weak_ref_concurrent (gconstpointer testdata) +{ + const int TEST_IDX = GPOINTER_TO_INT (testdata); + GThread *threads[CONCURRENT_N_THREADS]; + int i; + ConcurrentData data = { + .TEST_IDX = TEST_IDX, + }; + ConcurrentThreadData thread_data[CONCURRENT_N_THREADS]; + GWeakRef weak_ref = { 0 }; + + /* Let several threads call g_weak_ref_set() & g_weak_ref_get() in a loop. */ + + for (i = 0; i < CONCURRENT_N_OBJS; i++) + data.objs[i] = g_object_new (G_TYPE_OBJECT, NULL); + + for (i = 0; i < CONCURRENT_N_THREADS; i++) + { + const guint32 rnd_seed[] = { + g_test_rand_int (), + g_test_rand_int (), + g_test_rand_int (), + }; + + thread_data[i] = (ConcurrentThreadData){ + .idx = i, + .data = &data, + .weak_ref = &weak_ref, + .rnd = g_rand_new_with_seed_array (rnd_seed, G_N_ELEMENTS (rnd_seed)), + }; + threads[i] = g_thread_new ("test-weak-ref-concurrent", _test_weak_ref_concurrent_thread_cb, &thread_data[i]); + } + + for (i = 0; i < CONCURRENT_N_THREADS; i++) + { + gpointer r; + + r = g_thread_join (g_steal_pointer (&threads[i])); + g_assert_cmpint (GPOINTER_TO_INT (r), ==, 1); + } + + for (i = 0; i < CONCURRENT_N_OBJS; i++) + g_object_unref (g_steal_pointer (&data.objs[i])); + for (i = 0; i < CONCURRENT_N_THREADS; i++) + g_rand_free (g_steal_pointer (&thread_data[i].rnd)); +} + +/*****************************************************************************/ + typedef struct { gboolean should_be_last; @@ -1106,8 +1380,7 @@ test_toggle_ref_and_notify_on_dispose (void) obj->expected.count = 1; obj->notify_handler = G_CALLBACK (on_object_notify); g_object_remove_toggle_ref (G_OBJECT (obj), obj->toggle_notify, NULL); - /* FIXME: adjust the count to 1 when !2377 is in */ - g_assert_cmpint (obj->actual.count, ==, 4); + g_assert_cmpint (obj->actual.count, ==, 2); g_assert_cmpuint (obj->notify_called, ==, 1); disposed_checker = &obj; @@ -1117,10 +1390,10 @@ test_toggle_ref_and_notify_on_dispose (void) * notification is happening if notify handler switches to normal reference */ obj->disposing_refs = 1; - obj->expected.count = 4; + obj->expected.count = 2; obj->notify_handler = G_CALLBACK (on_object_notify_switch_to_normal_ref); g_object_remove_toggle_ref (G_OBJECT (obj), obj->toggle_notify, NULL); - g_assert_cmpint (obj->actual.count, ==, 5); + g_assert_cmpint (obj->actual.count, ==, 2); g_assert_cmpuint (obj->notify_called, ==, 2); disposed_checker = &obj; @@ -1131,10 +1404,10 @@ test_toggle_ref_and_notify_on_dispose (void) */ obj->disposing_refs = 1; obj->disposing_refs_all_normal = TRUE; - obj->expected.count = 5; + obj->expected.count = 2; obj->notify_handler = G_CALLBACK (on_object_notify_switch_to_toggle_ref); g_object_unref (obj); - g_assert_cmpint (obj->actual.count, ==, 7); + g_assert_cmpint (obj->actual.count, ==, 3); g_assert_cmpuint (obj->notify_called, ==, 3); disposed_checker = &obj; @@ -1145,10 +1418,10 @@ test_toggle_ref_and_notify_on_dispose (void) */ obj->disposing_refs = 1; obj->disposing_refs_all_normal = FALSE; - obj->expected.count = 7; + obj->expected.count = 3; obj->notify_handler = G_CALLBACK (on_object_notify_add_ref); g_object_remove_toggle_ref (G_OBJECT (obj), obj->toggle_notify, NULL); - g_assert_cmpint (obj->actual.count, ==, 8); + g_assert_cmpint (obj->actual.count, ==, 3); g_assert_cmpuint (obj->notify_called, ==, 4); g_object_unref (obj); @@ -1156,7 +1429,7 @@ test_toggle_ref_and_notify_on_dispose (void) g_object_add_weak_pointer (G_OBJECT (obj), &disposed_checker); obj->disposing_refs = 0; - obj->expected.count = 9; + obj->expected.count = 4; g_clear_object (&obj); g_assert_null (disposed_checker); } @@ -1363,6 +1636,10 @@ main (int argc, char **argv) g_test_add_func ("/object/weak-ref/on-dispose", test_weak_ref_on_dispose); g_test_add_func ("/object/weak-ref/on-run-dispose", test_weak_ref_on_run_dispose); g_test_add_func ("/object/weak-ref/on-toggle-notify", test_weak_ref_on_toggle_notify); + g_test_add_func ("/object/weak-ref/in-toggle-notify", test_weak_ref_in_toggle_notify); + g_test_add_func ("/object/weak-ref/many", test_weak_ref_many); + g_test_add_data_func ("/object/weak-ref/concurrent/0", GINT_TO_POINTER (0), test_weak_ref_concurrent); + g_test_add_data_func ("/object/weak-ref/concurrent/1", GINT_TO_POINTER (1), test_weak_ref_concurrent); g_test_add_func ("/object/toggle-ref", test_toggle_ref); g_test_add_func ("/object/toggle-ref/ref-on-dispose", test_toggle_ref_on_dispose); g_test_add_func ("/object/toggle-ref/ref-and-notify-on-dispose", test_toggle_ref_and_notify_on_dispose); diff --git a/gobject/tests/references.c b/gobject/tests/references.c index 7b8aa9b..2eb994c 100644 --- a/gobject/tests/references.c +++ b/gobject/tests/references.c @@ -105,6 +105,17 @@ weak_ref2 (gpointer data, weak_ref2_notified = TRUE; } +static void +weak_ref3 (gpointer data, + GObject *object) +{ + GWeakRef *weak_ref = data; + + g_assert_null (g_weak_ref_get (weak_ref)); + + weak_ref2_notified = TRUE; +} + static void toggle_ref1 (gpointer data, GObject *object, @@ -154,6 +165,7 @@ static void test_references (void) { GObject *object; + GWeakRef weak_ref; /* Test basic weak reference operation */ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); @@ -191,6 +203,17 @@ test_references (void) g_assert_true (weak_ref2_notified); g_assert_true (object_destroyed); + /* Test that within a GWeakNotify the GWeakRef is NULL already. */ + weak_ref2_notified = FALSE; + object = g_object_new (G_TYPE_OBJECT, NULL); + g_weak_ref_init (&weak_ref, object); + g_assert_true (object == g_weak_ref_get (&weak_ref)); + g_object_weak_ref (object, weak_ref3, &weak_ref); + g_object_unref (object); + g_object_unref (object); + g_assert_true (weak_ref2_notified); + g_weak_ref_clear (&weak_ref); + /* Test basic toggle reference operation */ global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL); diff --git a/gobject/tests/signals.c b/gobject/tests/signals.c index 92a2882..834fdd6 100644 --- a/gobject/tests/signals.c +++ b/gobject/tests/signals.c @@ -66,9 +66,9 @@ custom_marshal_VOID__INVOCATIONHINT (GClosure *closure, static GType test_enum_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { static const GEnumValue values[] = { { TEST_ENUM_NEGATIVE, "TEST_ENUM_NEGATIVE", "negative" }, @@ -79,7 +79,7 @@ test_enum_get_type (void) }; GType g_define_type_id = g_enum_register_static (g_intern_static_string ("TestEnum"), values); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; @@ -88,9 +88,9 @@ test_enum_get_type (void) static GType test_unsigned_enum_get_type (void) { - static gsize static_g_define_type_id = 0; + static GType static_g_define_type_id = 0; - if (g_once_init_enter (&static_g_define_type_id)) + if (g_once_init_enter_pointer (&static_g_define_type_id)) { static const GEnumValue values[] = { { TEST_UNSIGNED_ENUM_FOO, "TEST_UNSIGNED_ENUM_FOO", "foo" }, @@ -99,7 +99,7 @@ test_unsigned_enum_get_type (void) }; GType g_define_type_id = g_enum_register_static (g_intern_static_string ("TestUnsignedEnum"), values); - g_once_init_leave (&static_g_define_type_id, g_define_type_id); + g_once_init_leave_pointer (&static_g_define_type_id, g_define_type_id); } return static_g_define_type_id; @@ -2045,6 +2045,44 @@ test_emitv (void) g_array_unref (values); } +typedef struct +{ + GWeakRef wr; + gulong handler; +} TestWeakRefDisconnect; + +static void +weak_ref_disconnect_notify (gpointer data, + GObject *where_object_was) +{ + TestWeakRefDisconnect *state = data; + g_assert_null (g_weak_ref_get (&state->wr)); + state->handler = 0; +} + +static void +test_weak_ref_disconnect (void) +{ + TestWeakRefDisconnect state; + GObject *test; + + test = g_object_new (test_get_type (), NULL); + g_weak_ref_init (&state.wr, test); + state.handler = g_signal_connect_data (test, + "simple", + G_CALLBACK (dont_reach), + &state, + (GClosureNotify) weak_ref_disconnect_notify, + 0); + g_assert_cmpint (state.handler, >, 0); + + g_object_unref (test); + + g_assert_cmpint (state.handler, ==, 0); + g_assert_null (g_weak_ref_get (&state.wr)); + g_weak_ref_clear (&state.wr); +} + /* --- */ int @@ -2083,6 +2121,7 @@ main (int argc, g_test_add_data_func ("/gobject/signals/invalid-name/first-char", "7zip", test_signals_invalid_name); g_test_add_data_func ("/gobject/signals/invalid-name/empty", "", test_signals_invalid_name); g_test_add_func ("/gobject/signals/is-valid-name", test_signal_is_valid_name); + g_test_add_func ("/gobject/signals/weak-ref-disconnect", test_weak_ref_disconnect); return g_test_run (); } diff --git a/gobject/tests/threadtests.c b/gobject/tests/threadtests.c index dee4d6e..9b923f3 100644 --- a/gobject/tests/threadtests.c +++ b/gobject/tests/threadtests.c @@ -480,6 +480,7 @@ test_threaded_toggle_notify (void) ToggleNotifyThreadData data = { object, FALSE, 0 }; GThread *threads[3]; gsize i; + const int n_iterations = g_test_thorough () ? 1000000 : 100000; g_test_bug ("https://gitlab.gnome.org/GNOME/glib/issues/2394"); g_test_summary ("Test that toggle reference notifications can be changed " @@ -498,7 +499,7 @@ test_threaded_toggle_notify (void) * race to happen, so we wait for an high number of toggle changes to be met * so that we can be consistent on each platform. */ - while (g_atomic_int_get (&data.toggles) < 1000000) + while (g_atomic_int_get (&data.toggles) < n_iterations) ; g_atomic_int_set (&data.done, TRUE); @@ -509,6 +510,81 @@ test_threaded_toggle_notify (void) g_clear_object (&object); } +static void +test_threaded_g_pointer_bit_unlock_and_set (void) +{ + GObject *obj; + gpointer plock; + gpointer ptr; + guintptr ptr2; + gpointer mangled_obj; + +#if defined(__GNUC__) + /* We should have at least one bit we can use safely for bit-locking */ + G_STATIC_ASSERT (__alignof (GObject) > 1); +#endif + + obj = g_object_new (G_TYPE_OBJECT, NULL); + + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0, NULL) == obj); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x2, obj) == obj); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 1, 0, NULL) != obj); + + mangled_obj = obj; + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x2, mangled_obj) == obj); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x3, mangled_obj) == obj); + g_atomic_pointer_and (&mangled_obj, ~((gsize) 0x7)); + g_atomic_pointer_or (&mangled_obj, 0x2); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x2, mangled_obj) != obj); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x2, mangled_obj) == (gpointer) (((guintptr) obj) | ((guintptr) mangled_obj))); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x3, mangled_obj) == (gpointer) (((guintptr) obj) | ((guintptr) mangled_obj))); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, TRUE, 0x3, mangled_obj) == (gpointer) (((guintptr) obj) | ((guintptr) mangled_obj) | ((guintptr) 1))); + g_atomic_pointer_and (&mangled_obj, ~((gsize) 0x2)); + g_assert_true (g_pointer_bit_lock_mask_ptr (obj, 0, 0, 0x2, mangled_obj) == obj); + g_atomic_pointer_or (&mangled_obj, 0x2); + + plock = obj; + g_pointer_bit_lock (&plock, 0); + g_assert_true (plock != obj); + g_pointer_bit_unlock_and_set (&plock, 0, obj, 0); + g_assert_true (plock == obj); + + plock = obj; + g_pointer_bit_lock_and_get (&plock, 0, &ptr2); + g_assert_true ((gpointer) ptr2 == plock); + g_assert_true (plock != obj); + g_atomic_pointer_set (&plock, mangled_obj); + g_pointer_bit_unlock_and_set (&plock, 0, obj, 0); + g_assert_true (plock == obj); + + plock = obj; + g_pointer_bit_lock_and_get (&plock, 0, NULL); + g_assert_true (plock != obj); + g_atomic_pointer_set (&plock, mangled_obj); + g_pointer_bit_unlock_and_set (&plock, 0, obj, 0x7); + g_assert_true (plock != obj); + g_assert_true (plock == (gpointer) (((guintptr) obj) | ((guintptr) mangled_obj))); + + plock = NULL; + g_pointer_bit_lock (&plock, 0); + g_assert_true (plock != NULL); + g_pointer_bit_unlock_and_set (&plock, 0, NULL, 0); + g_assert_true (plock == NULL); + + ptr = ((char *) obj) + 1; + plock = obj; + g_pointer_bit_lock (&plock, 0); + g_assert_true (plock == ptr); + g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, + "*assertion 'ptr == pointer_bit_lock_mask_ptr (ptr, lock_bit, FALSE, 0, NULL)' failed*"); + g_pointer_bit_unlock_and_set (&plock, 0, ptr, 0); + g_test_assert_expected_messages (); + g_assert_true (plock != ptr); + g_assert_true (plock == obj); + + g_object_unref (obj); +} + int main (int argc, char *argv[]) @@ -522,6 +598,8 @@ main (int argc, test_threaded_weak_ref_finalization); g_test_add_func ("/GObject/threaded-toggle-notify", test_threaded_toggle_notify); + g_test_add_func ("/GObject/threaded-g-pointer-bit-unlock-and-set", + test_threaded_g_pointer_bit_unlock_and_set); return g_test_run(); } diff --git a/gobject/tests/type-flags.c b/gobject/tests/type-flags.c index bb67f8c..a8d13d4 100644 --- a/gobject/tests/type-flags.c +++ b/gobject/tests/type-flags.c @@ -121,7 +121,7 @@ test_type_flags_final (void) * block within the test_final2_get_type() function */ g_test_expect_message ("GLib", G_LOG_LEVEL_CRITICAL, - "*g_once_init_leave: assertion*"); + "*g_once_init_leave_pointer: assertion*"); final2_type = TEST_TYPE_FINAL2; g_assert_true (final2_type == G_TYPE_INVALID); diff --git a/gobject/tests/value.c b/gobject/tests/value.c index 73a5de6..d1a9091 100644 --- a/gobject/tests/value.c +++ b/gobject/tests/value.c @@ -420,7 +420,7 @@ test_value_string (void) const gchar *static2 = "static2"; const gchar *storedstr; const gchar *copystr; - gchar *str1, *str2; + gchar *str1, *str2, *stolen_str; GValue value = G_VALUE_INIT; GValue copy = G_VALUE_INIT; @@ -513,7 +513,12 @@ test_value_string (void) g_assert_true (storedstr != static2); g_assert_cmpstr (storedstr, ==, static2); + /* Now check stealing the ownership of the contents */ + stolen_str = g_value_steal_string (&value); + g_assert_null (g_value_get_string (&value)); g_value_unset (&value); + g_assert_cmpstr (stolen_str, ==, static2); + g_free (stolen_str); /* * Static strings @@ -544,6 +549,14 @@ test_value_string (void) g_assert_true (storedstr != static1); g_assert_cmpstr (storedstr, ==, static2); + /* Check if g_value_steal_string() can handle GValue + * with a static string */ + stolen_str = g_value_steal_string (&value); + g_assert_true (stolen_str != static2); + g_assert_cmpstr (stolen_str, ==, static2); + g_assert_null (g_value_get_string (&value)); + g_free (stolen_str); + g_value_unset (&value); /* @@ -588,6 +601,14 @@ test_value_string (void) g_assert_true (storedstr != static2); g_assert_cmpstr (storedstr, ==, static2); + /* Check if g_value_steal_string() can handle GValue + * with an interned string */ + stolen_str = g_value_steal_string (&value); + g_assert_true (stolen_str != static2); + g_assert_cmpstr (stolen_str, ==, static2); + g_assert_null (g_value_get_string (&value)); + g_free (stolen_str); + g_value_unset (&value); } diff --git a/gthread/meson.build b/gthread/meson.build index 6126263..06ed9f7 100644 --- a/gthread/meson.build +++ b/gthread/meson.build @@ -2,7 +2,7 @@ # has been moved into glib now gthread_sources = ['gthread-impl.c'] -if host_system == 'windows' +if host_system == 'windows' and glib_build_shared gthread_win_rc = configure_file( input: 'gthread.rc.in', output: 'gthread.rc', diff --git a/meson.build b/meson.build index f7e936e..7534542 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project('glib', 'c', - version : '2.78.3', + version : '2.80.0', # NOTE: See the policy in docs/meson-version.md before changing the Meson dependency - meson_version : '>= 0.60.0', + meson_version : '>= 1.2.0', default_options : [ 'buildtype=debugoptimized', 'warning_level=3', @@ -65,6 +65,17 @@ if host_system == 'darwin' endif endif +linux_libc = '' +if host_system == 'linux' + musl_test_code = '''#include + #if defined __GLIBC__ || defined __UCLIBC__ + #error "Not in glibc or uclibc" + #endif''' + if cc.compiles(musl_test_code, name : 'building for musl libc') + linux_libc = 'musl' + endif +endif + glib_version = meson.project_version() glib_api_version = '2.0' version_arr = glib_version.split('.') @@ -87,6 +98,7 @@ glibinc = include_directories('glib') gobjectinc = include_directories('gobject') gmoduleinc = include_directories('gmodule') gioinc = include_directories('gio') +girepoinc = include_directories('girepository') glib_prefix = get_option('prefix') glib_bindir = join_paths(glib_prefix, get_option('bindir')) @@ -159,6 +171,10 @@ common_test_env = [ 'MALLOC_CHECK_=2', ] +if get_option('werror') + common_test_env += 'LINT_WARNINGS_ARE_ERRORS=1' +endif + # Note: this may cause the tests output not to be printed when running in # verbose mode, see https://github.com/mesonbuild/meson/issues/11185 # Can be changed it to 'exitcode' if required during development. @@ -181,6 +197,13 @@ add_test_setup('unstable_tests', #suites: ['flaky', 'unstable'] ) +add_test_setup('thorough', + exclude_suites: ['flaky', 'failing', 'performance'], + env: common_test_env, + timeout_multiplier: 20, + exe_wrapper: [find_program('./.gitlab-ci/thorough-test-wrapper.sh', required: true)], +) + # Allow the tests to be easily run under valgrind using --setup=valgrind valgrind = find_program('valgrind', required: false) valgrind_suppression_file = files('tools' / 'glib.supp')[0] @@ -213,6 +236,10 @@ if host_system == 'qnx' add_project_arguments('-D_QNX_SOURCE', language: 'c') endif +if host_system == 'windows' + add_project_arguments(['-DUNICODE', '-D_UNICODE'], language: 'c') +endif + # Disable strict aliasing; # see https://bugzilla.gnome.org/show_bug.cgi?id=791622 if cc.has_argument('-fno-strict-aliasing') @@ -289,6 +316,7 @@ if glib_build_static_only glibconfig_conf.set('GOBJECT_STATIC_COMPILATION', '1') glibconfig_conf.set('GIO_STATIC_COMPILATION', '1') glibconfig_conf.set('GMODULE_STATIC_COMPILATION', '1') + glibconfig_conf.set('GI_STATIC_COMPILATION', '1') glibconfig_conf.set('G_INTL_STATIC_COMPILATION', '1') glibconfig_conf.set('FFI_STATIC_BUILD', '1') endif @@ -359,6 +387,7 @@ headers = [ 'fstab.h', 'grp.h', 'inttypes.h', + 'libproc.h', 'limits.h', 'locale.h', 'mach/mach_time.h', @@ -397,6 +426,7 @@ headers = [ 'sys/vfstab.h', 'sys/vmount.h', 'sys/wait.h', + 'syslog.h', 'termios.h', 'unistd.h', 'values.h', @@ -482,6 +512,7 @@ struct_members = [ #include ''' ], [ 'statvfs', 'f_basetype', '#include ' ], [ 'statvfs', 'f_fstypename', '#include ' ], + [ 'statvfs', 'f_type', '#include ' ], [ 'tm', 'tm_gmtoff', '#include ' ], [ 'tm', '__tm_gmtoff', '#include ' ], ] @@ -493,7 +524,16 @@ foreach m : struct_members else header_check_prefix = header_check_prefix + '#include ' endif - if cc.has_member('struct ' + m[0], m[1], prefix : header_check_prefix) + # Reimplement cc.has_member() to workaround compiler warning + # FIXME: https://github.com/mesonbuild/meson/pull/12818 + code = header_check_prefix + ''' + void bar(void) { + struct ''' + m[0] + ''' foo; + (void) ( foo.''' + m[1] + ''' ); + (void) foo; + } + ''' + if cc.compiles(code, name : 'type "struct ' + m[0] + '" has member "' + m[1] + '"') define = 'HAVE_STRUCT_@0@_@1@'.format(m[0].to_upper(), m[1].underscorify().to_upper()) glib_conf.set(define, 1) glib_conf_prefix = glib_conf_prefix + '#define @0@ 1\n'.format(define) @@ -629,6 +669,7 @@ functions = [ 'free_aligned_sized', 'free_sized', 'fsync', + 'ftruncate64', 'getauxval', 'getc_unlocked', 'getfsstat', @@ -987,6 +1028,7 @@ static __uint128_t v1 = 100; static __uint128_t v2 = 10; static __uint128_t u; u = v1 / v2; +(void) u; }''' if cc.compiles(uint128_t_src, name : '__uint128_t available') glib_conf.set('HAVE_UINT128_T', 1) @@ -1082,7 +1124,7 @@ if cc.compiles('''#include #include #include void some_func (void) { - open(0, O_DIRECTORY, 0); + open(".", O_DIRECTORY, 0); }''', name : 'open() option O_DIRECTORY') glib_conf.set('HAVE_OPEN_O_DIRECTORY', 1) endif @@ -1187,7 +1229,6 @@ int doit() { char buffer[32]; - va_list args; int r; r = snprintf(buffer, 5, "1234567"); @@ -1274,6 +1315,7 @@ endif if cc.links('''#include int main (int argc, char ** argv) { char *codeset = nl_langinfo (CODESET); + (void) codeset; return 0; }''', name : 'nl_langinfo and CODESET') glib_conf.set('HAVE_LANGINFO_CODESET', 1) @@ -1281,6 +1323,7 @@ if cc.links('''#include endif # Check for nl_langinfo and LC_TIME parts that are needed in gdatetime.c +have_langinfo_time = false if cc.links('''#include int main (int argc, char ** argv) { char *str; @@ -1293,10 +1336,31 @@ if cc.links('''#include str = nl_langinfo (ABMON_12); str = nl_langinfo (DAY_1); str = nl_langinfo (ABDAY_7); + (void) str; return 0; }''', name : 'nl_langinfo (PM_STR)') + have_langinfo_time = true glib_conf.set('HAVE_LANGINFO_TIME', 1) endif + +# Linux glibc supports ERA, but FreeBSD and macOS don’t +if cc.links('''#include + int main (int argc, char **argv) { + char *str; + str = nl_langinfo (ERA); + str = nl_langinfo (ERA_D_T_FMT); + str = nl_langinfo (ERA_D_FMT); + str = nl_langinfo (ERA_T_FMT); + str = nl_langinfo (_NL_TIME_ERA_NUM_ENTRIES); + (void) str; + return 0; + }''', name : 'nl_langinfo (ERA)') + glib_conf.set('HAVE_LANGINFO_ERA', 1) + if not have_langinfo_time + error('nl_langinfo(ERA) is supported but more basic nl_langinfo() functionality like PM_STR is not') + endif +endif + if cc.links('''#include int main (int argc, char ** argv) { char *str; @@ -1310,9 +1374,13 @@ if cc.links('''#include str = nl_langinfo (_NL_CTYPE_OUTDIGIT7_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT8_MB); str = nl_langinfo (_NL_CTYPE_OUTDIGIT9_MB); + (void) str; return 0; }''', name : 'nl_langinfo (_NL_CTYPE_OUTDIGITn_MB)') glib_conf.set('HAVE_LANGINFO_OUTDIGIT', 1) + if not have_langinfo_time + error('nl_langinfo(_NL_CTYPE_OUTDIGITn_MB) is supported but more basic nl_langinfo() functionality like PM_STR is not') + endif endif # Check for nl_langinfo and alternative month names @@ -1334,9 +1402,13 @@ if cc.links('''#ifndef _GNU_SOURCE str = nl_langinfo (ALTMON_10); str = nl_langinfo (ALTMON_11); str = nl_langinfo (ALTMON_12); + (void) str; return 0; }''', name : 'nl_langinfo (ALTMON_n)') glib_conf.set('HAVE_LANGINFO_ALTMON', 1) + if not have_langinfo_time + error('nl_langinfo(ALTMON_n) is supported but more basic nl_langinfo() functionality like PM_STR is not') + endif endif # Check for nl_langinfo and abbreviated alternative month names @@ -1358,18 +1430,26 @@ if cc.links('''#ifndef _GNU_SOURCE str = nl_langinfo (_NL_ABALTMON_10); str = nl_langinfo (_NL_ABALTMON_11); str = nl_langinfo (_NL_ABALTMON_12); + (void) str; return 0; }''', name : 'nl_langinfo (_NL_ABALTMON_n)') glib_conf.set('HAVE_LANGINFO_ABALTMON', 1) + if not have_langinfo_time + error('nl_langinfo(_NL_ABALTMON_n) is supported but more basic nl_langinfo() functionality like PM_STR is not') + endif endif # Check for nl_langinfo and _NL_TIME_CODESET if cc.links('''#include int main (int argc, char ** argv) { char *codeset = nl_langinfo (_NL_TIME_CODESET); + (void) codeset; return 0; }''', name : 'nl_langinfo and _NL_TIME_CODESET') glib_conf.set('HAVE_LANGINFO_TIME_CODESET', 1) + if not have_langinfo_time + error('nl_langinfo(_NL_TIME_CODESET) is supported but more basic nl_langinfo() functionality like PM_STR is not') + endif endif # Check if C compiler supports the 'signed' keyword @@ -1434,6 +1514,7 @@ if cc.compiles('''#include #include void some_func (void) { uintmax_t i = (uintmax_t) -1; + (void) i; }''', name : 'uintmax_t in inttypes.h') glib_conf.set('HAVE_INTTYPES_H_WITH_UINTMAX', 1) found_uintmax_t = true @@ -1446,6 +1527,7 @@ if cc.compiles('''#include #include void some_func (void) { uintmax_t i = (uintmax_t) -1; + (void) i; }''', name : 'uintmax_t in stdint.h') glib_conf.set('HAVE_STDINT_H_WITH_UINTMAX', 1) found_uintmax_t = true @@ -1495,6 +1577,7 @@ if long_long_size == long_size int main () { int64_t i1 = 1; long *i2 = &i1; + (void) i2; return 1; }''', name : 'int64_t is long') int64_t_typedef = 'long' @@ -1507,9 +1590,12 @@ if long_long_size == long_size int main () { int64_t i1 = 1; long long *i2 = &i1; + (void) i2; return 1; }''', name : 'int64_t is long long') int64_t_typedef = 'long long' + else + error('Cannot detect int64_t typedef') endif endif @@ -1649,7 +1735,7 @@ if cc.get_id() == 'gcc' or cc.get_id() == 'clang' g_sizet_compatibility += { type_name: size_compatibility and cc.compiles( '''#include - size_t f (size_t *i) { return *i + 1; } + static size_t f (size_t *i) { return *i + 1; } int main (void) { unsigned ''' + type_name + ''' i = 0; f (&i); @@ -1998,6 +2084,9 @@ else if cc.has_header_symbol('pthread.h', 'pthread_getname_np', prefix : pthread_prefix) glib_conf.set('HAVE_PTHREAD_GETNAME_NP', 1) endif + if cc.has_header_symbol('pthread.h', 'pthread_getaffinity_np', prefix : pthread_prefix) + glib_conf.set('HAVE_PTHREAD_GETAFFINITY_NP', 1) + endif # Assume that pthread_setname_np is available in some form; same as configure if cc.links(pthread_prefix + ''' @@ -2191,6 +2280,10 @@ libmount_dep = [] if host_system == 'linux' libmount_dep = dependency('mount', version : '>=2.23', required : get_option('libmount')) glib_conf.set('HAVE_LIBMOUNT', libmount_dep.found()) + + if libmount_dep.found() and cc.has_function('mnt_monitor_veil_kernel', dependencies: libmount_dep) + glib_conf.set('HAVE_MNT_MONITOR_VEIL_KERNEL', 1) + endif endif if host_system == 'windows' @@ -2326,12 +2419,12 @@ endif glib_conf.set('HAVE_PROC_SELF_CMDLINE', have_proc_self_cmdline) -python = import('python').find_installation() +python = import('python').find_installation(modules: ['packaging']) # used for '#!/usr/bin/env ' python_name = 'python3' python_version = python.language_version() -python_version_req = '>=3.5' +python_version_req = '>=3.7' if not python_version.version_compare(python_version_req) error('Requires Python @0@, @1@ found.'.format(python_version_req, python_version)) endif @@ -2456,15 +2549,31 @@ if want_systemtap and enable_dtrace enable_systemtap = true endif +# introspection +gir_scanner = find_program('g-ir-scanner', required: get_option('introspection')) +enable_gir = get_option('introspection').allowed() and gir_scanner.found() and meson.can_run_host_binaries() + +if get_option('introspection').enabled() and not meson.can_run_host_binaries() + error('Running binaries on the build host needs to be supported to build with -Dintrospection=enabled') +endif + +gir_args = [ + '--quiet', +] + pkg = import('pkgconfig') windows = import('windows') +gnome = import('gnome') + subdir('tools') subdir('glib') subdir('gobject') subdir('gthread') subdir('gmodule') subdir('gio') +subdir('girepository') subdir('fuzzing') +subdir('tests') # xgettext is optional (on Windows for instance) if find_program('xgettext', required : get_option('nls')).found() @@ -2493,19 +2602,10 @@ endif configure_file(output : 'config.h', configuration : glib_conf) -if get_option('man') - xsltproc = find_program('xsltproc', required : true) - xsltproc_command = [ - xsltproc, - '--nonet', - '--stringparam', 'man.output.quietly', '1', - '--stringparam', 'funcsynopsis.style', 'ansi', - '--stringparam', 'man.th.extra1.suppress', '1', - '--stringparam', 'man.authors.section.enabled', '0', - '--stringparam', 'man.copyright.section.enabled', '0', - '-o', '@OUTPUT@', - 'http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl', - '@INPUT@', +rst2man = find_program('rst2man', 'rst2man.py', required: get_option('man-pages')) +if rst2man.found() + rst2man_flags = [ + '--syntax-highlight=none', ] man1_dir = join_paths(glib_prefix, get_option('mandir'), 'man1') endif @@ -2531,6 +2631,12 @@ if build_machine.system() != host_system }, section: 'Build environment') endif +if linux_libc != '' + summary({ + 'linux_libc' : linux_libc + }, section: 'Build environment') +endif + summary({ 'prefix' : glib_prefix, 'bindir' : glib_bindir, @@ -2563,11 +2669,11 @@ endif summary({ 'xattr' : xattr_dep.length() > 0, - 'man' : get_option('man'), + 'man-pages' : get_option('man-pages'), 'dtrace' : get_option('dtrace'), 'systemtap' : enable_systemtap, 'sysprof' : libsysprof_capture_dep.found(), - 'gtk_doc' : get_option('gtk_doc'), + 'documentation' : get_option('documentation'), 'bsymbolic_functions' : get_option('bsymbolic_functions'), 'force_posix_threads' : get_option('force_posix_threads'), 'tests' : get_option('tests'), @@ -2579,4 +2685,5 @@ summary({ 'glib_checks' : get_option('glib_checks'), 'libelf' : get_option('libelf'), 'multiarch' : get_option('multiarch'), + 'introspection' : enable_gir, }, section: 'Options') diff --git a/meson_options.txt b/meson_options.txt index 517d575..69a2135 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -40,7 +40,14 @@ option('libmount', option('man', type : 'boolean', value : false, - description : 'generate man pages (requires xsltproc)') + description : 'generate man pages (requires xsltproc)', + deprecated : 'man-pages') + +option('man-pages', + type : 'feature', + value : 'auto', + description : 'generate man pages (requires rst2man)', + deprecated : { 'true': 'enabled', 'false': 'disabled' }) option('dtrace', type : 'boolean', @@ -62,10 +69,16 @@ option('sysprof', value : 'disabled', description : 'include tracing support for sysprof') +option('documentation', + type : 'boolean', + value : false, + description : 'Build API reference and tools documentation') + option('gtk_doc', type : 'boolean', value : false, - description : 'use gtk-doc to build documentation') + description : 'use gtk-doc to build documentation', + deprecated : 'documentation') option('bsymbolic_functions', type : 'boolean', @@ -125,3 +138,12 @@ option('multiarch', type : 'boolean', value : false, description : 'Install some helper executables in per-architecture locations') + +option('gir_dir_prefix', + type: 'string', + description: 'Intermediate prefix for gir installation under ${prefix}') + +option('introspection', + type: 'feature', + value: 'auto', + description: 'Enable generating introspection data (requires gobject-introspection)') diff --git a/po/POTFILES.in b/po/POTFILES.in index 9a4cdf3..0712c0a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -181,6 +181,9 @@ gio/gzlibcompressor.c gio/gzlibdecompressor.c gio/tests/gdbus-daemon.c gio/win32/gwinhttpfile.c +girepository/compiler/compiler.c +girepository/decompiler/decompiler.c +girepository/inspector/inspector.c glib/gatomic.c glib/gbookmarkfile.c glib/gconvert.c diff --git a/po/ca.po b/po/ca.po index fad0049..9463cfd 100644 --- a/po/ca.po +++ b/po/ca.po @@ -6,14 +6,14 @@ # Sílvia Miranda , 2011. # Jordi Serratosa , 2012, 2017. # Gil Forcada , 2008-2013, 2013, 2014, 2016. -# Jordi Mas i Hernàndez , 2016-2023 +# Jordi Mas i Hernàndez , 2016-2024 # Xavi Ivars , 2017. msgid "" msgstr "" "Project-Id-Version: glib 2.8\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 10:14+0000\n" -"PO-Revision-Date: 2023-09-11 11:48+0100\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-14 09:23+0000\n" +"PO-Revision-Date: 2024-02-19 11:48+0100\n" "Last-Translator: Jordi Mas i Hernàndez \n" "Language-Team: Catalan \n" "Language: ca\n" @@ -47,39 +47,43 @@ msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "" "No s'ha pogut trobar l'aplicació predeterminada per a l'esquema URI «%s»" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Opcions de la GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Mostra les opcions de la GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Introduïu un mode de servei GApplication (utilitzeu-lo des de fitxers de " "servei D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Sobreescriu l'identificador de l'aplicació" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Mostra la versió de l'aplicació" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Reemplaça la instància en execució" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Mostra l'ajuda" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 -#: gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 +#: gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[ORDRE]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Mostra la versió" @@ -134,7 +138,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "ORDRE" @@ -149,7 +153,7 @@ msgstr "" #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 msgid "FILE" msgstr "FITXER" @@ -174,7 +178,7 @@ msgstr "PARÀMETRE" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Paràmetre opcional per la invocació de l'acció, en format GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -188,12 +192,12 @@ msgstr "" msgid "Usage:\n" msgstr "Forma d'ús:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Arguments:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTS...]" @@ -290,78 +294,78 @@ msgstr "" "es desconeix l'ordre: «%s»\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "El valor de comptatge passat a %s és massa gran" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "No està implementada la cerca en el flux base" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "No es pot truncar el GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Ja està tancat el flux" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "No es permet truncar en els fluxos base" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "S'ha cancel·lat l'operació" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "L'objecte no és vàlid, no s'ha inicialitzat" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "La seqüència de múltiples bytes de l'entrada no és completa" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "No hi ha prou espai a la destinació" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "S'ha produït un error durant la conversió: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "La cancel·lació de la inicialització no està implementada" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "No es permet la conversió entre els jocs de caràcters «%s» i «%s»" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "tipus %s" @@ -375,43 +379,43 @@ msgstr "Tipus desconegut" msgid "%s filetype" msgstr "tipus de fitxer %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials conté dades no vàlides" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "Aquest sistema operatiu no implementa les GCredentials" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "La vostra plataforma no implementa les GCredentials" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "" "Les GCredentials no contenen cap identificador de procés en aquest sistema " "operatiu" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Aquest sistema operatiu no implementa el falsejament de credencials" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "No s'esperava un final de flux tan aviat" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "No es permet la clau «%s» en l'entrada de l'adreça «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "L'entrada d'adreça «%s» té una parella clau/valor que no té sentit" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -420,29 +424,29 @@ msgstr "" "L'adreça «%s» no és vàlida (ha de ser, o bé un camí, o bé un tmpdir " "-directori temporal-, o bé unes claus abstractes)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Hi ha un error a l'adreça «%s» — l'atribut «%s» no està ben formatat" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "" "El transport «%s» per a l'adreça «%s» és desconegut o no està implementat" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "L'element d'adreça «%s» no conté dos punts (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "El nom del transport a l'adreça a l'element «%s» no pot estar buit" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -451,7 +455,7 @@ msgstr "" "La parella de clau/valor %d, «%s», a l'element d'adreça «%s», no conté un " "signe d'igual" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -459,7 +463,7 @@ msgstr "" "La parella de clau/valor %d, «%s», a l'element d'adreça «%s», no conté un " "signe d'igual" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element" @@ -468,7 +472,7 @@ msgstr "" "S'ha produït un error en suprimir l'escapament d'una clau o d'un valor en la" " parella clau/valor %d, «%s», de l'element d'adreça «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -478,20 +482,20 @@ msgstr "" "establerta exactament una clau, o bé de tipus «path» (camí), o bé de tipus " "«abstract» (abstracte)" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Hi ha un error a l'adreça «%s»: manca o està mal formatat l'atribut del nom " "d'ordinador" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Hi ha un error a l'adreça «%s»: manca o està mal formatat l'atribut del port" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "" "Error in address “%s” — the noncefile attribute is missing or malformed" @@ -499,66 +503,66 @@ msgstr "" "Hi ha un error a l'adreça «%s»: l'atribut noncefile no existeix o està mal " "formatat" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "S'ha produït un error en executar-se automàticament: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "S'ha produït un error en obrir el fitxer nonce «%s»: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "S'ha produït un error en llegir el fitxer nonce «%s»: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "S'ha produït un error en llegir el fitxer nonce «%s»: s'esperaven 16 bytes, " "però se n'han obtingut %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "" "S'ha produït un error en escriure els continguts del fitxer nonce «%s» al " "flux:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "L'adreça que s'ha indicat és buida" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "No es pot engendrar un bus de missatges quan s'ha definit AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "" "No es pot engendrar un bus de missatge sense un identificador de màquina: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "No es pot executar D-Bus automàticament sense X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "S'ha produït un error en engendrar la línia d'ordres «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "No s'ha pogut determinar l'adreça del bus de sessió (no està implementat en " "aquest sistema operatiu)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" @@ -567,7 +571,7 @@ msgstr "" "No es pot determinar l'adreça del bus a través de la variable d'entorn " "«DBUS_STARTER_BUS_TYPE»: conté un valor desconegut «%s»" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -575,22 +579,22 @@ msgstr "" "No es pot determinar l'adreça del bus perquè la variable d'entorn " "«DBUS_STARTER_BUS_TYPE» no està establerta" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Tipus de bus desconegut %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "S'ha trobat una inesperada falta de contingut en llegir una línia" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" "S'ha trobat una inesperada falta de contingut en llegir (de forma segura) " "una línia" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: " @@ -599,16 +603,16 @@ msgstr "" "S'han exhaurit tots els mecanismes d'autenticació disponibles (s'han provat:" " %s) (hi ha disponibles: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Manca inesperada de contingut en intentar llegir un byte" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "" "Els identificadors d'usuari han de ser els mateixos per a clients i servidor" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "" "S'ha cancel·lat a través de GDBusAuthObserver::authorize-authenticated-peer" @@ -631,13 +635,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "S'ha produït un error en crear el directori «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "L'operació no està implementada" @@ -710,15 +714,15 @@ msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" "(A més a més, l'alliberació del blocatge per a «%s» també ha fallat: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "La connexió està tancada" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "S'ha esgotat el temps d'espera" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -811,67 +815,81 @@ msgstr "Ja està exportat un subarbre per a %s" msgid "Object does not exist at path “%s”" msgstr "L'objecte no existeix al camí «%s»" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"Missatge %s: el camp de capçalera %s no és vàlid; s'esperava un valor de " +"tipus «%s»" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "Missatge %s: falta el camp de capçalera %s o no és vàlid" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "Missatge %s: s'ha subministrat un camp de capçalera NO VÀLID" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value " +"/org/freedesktop/DBus/Local" +msgstr "" +"Missatge %s: el camp de capçalera PATH està utilitzant el valor reservat " +"/org/freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"Missatge %s: el camp de capçalera de la INTERFÍCIE no conté un nom " +"d'interfície vàlid" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value " +"org.freedesktop.DBus.Local" +msgstr "" +"Missatge %s: el camp de capçalera de la INTERFÍCIE està utilitzant el valor " +"reservat org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"Missatge %s: el camp de capçalera MEMBER no conté un nom de membre vàlid" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "" +"%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"Missatge %s: el camp de la capçalera ERRORNAME no conté un nom d'error vàlid" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "el tipus és no vàlid" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Missatge «METHOD_CALL»: el camp de capçalera «PATH» o «MEMBER» manca o és " -"invàlid" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Missatge «METHOD_RETURN»: el camp de capçalera «REPLY_SERIAL» manca o és " -"invàlid" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Missatge «ERROR»: el camp de capçalera «REPLY_SERIAL» o «ERROR_NAME» manca o" -" és invàlid" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Missatge «SIGNAL»: el camp de capçalera «PATH», «INTERFACE» o «MEMBER» manca" -" o és invàlid" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value " -"/org/freedesktop/DBus/Local" -msgstr "" -"Missatge «SIGNAL»: el camp de la capçalera «PATH» utilitza el valor reservat" -" «/org/freedesktop/DBus/Local»" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value " -"org.freedesktop.DBus.Local" -msgstr "" -"Missatge SIGNAL: el camp de capçalera INTERFACE utilitza el valor reservat " -"org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Es volia llegir %lu byte però només s'han rebut %lu" msgstr[1] "Es volien llegir %lu bytes però només s'han rebut %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "" "S'esperava el byte «NUL» després de la cadena «%s» però s'ha trobat el byte " "%d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -882,21 +900,21 @@ msgstr "" "l'òfset %d (la llargada de la cadena és %d). La cadena UTF-8 vàlida fins " "aquell moment era «%s»" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Valor imbricat massa profund" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "El valor analitzat «%s» no és un camí d'objecte D-Bus vàlid" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "El valor analitzat «%s» no és una signatura D-Bus vàlida" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -910,7 +928,7 @@ msgstr[1] "" "S'ha trobat una matriu de llargada %u bytes. La llargada màxima és de 2<<26 " "bytes (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -919,16 +937,16 @@ msgstr "" "S'ha trobat una matriu de tipus «a%c» que s'esperava que tingués una " "llargada múltiple de %u bytes, però en realitat és de %u bytes" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "No es permeten estructures buides (tuples) a D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "El valor analitzat «%s» per variant no és una signatura D-Bus vàlida" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire " @@ -937,7 +955,7 @@ msgstr "" "S'ha produït un error en convertir a estructura de dades la GVariant amb el " "tipus de cadena «%s» del format de cable D-Bus" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -946,28 +964,28 @@ msgstr "" "Valor d'ordenació de bits (endianness) no vàlid. S'esperava 0x6c («l») o " "0x42 («B») però s'ha trobat el valor 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Versió major del protocol no vàlida. S'esperava 1 però s'ha trobat %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "S'ha trobat la capçalera de signatura però no és del tipus signatura" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "S'ha trobat la capçalera de la signatura amb la signatura «%s», però el cos " "és buit" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "El valor analitzat «%s» no és una signatura de D-Bus vàlida (pel cos)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -978,11 +996,11 @@ msgstr[1] "" "No hi ha cap capçalera de la signatura en el missatge, però el cos és de %u " "bytes" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "No s'ha pogut tornar a convertir el missatge a estructura de dades: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -990,7 +1008,7 @@ msgstr "" "No s'ha pogut convertir a seqüència de bits la GVariant de tipus cadena «%s»" " al format de cable D-Bus" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -998,18 +1016,18 @@ msgstr "" "El nombre de descriptors de fitxer al missatge (%d) difereix del camp de la " "capçalera (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "No s'ha pogut convertir a seqüència de bits el missatge: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "El cos del missatge té la signatura «%s» però no hi ha cap capçalera de " "signatura" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -1018,19 +1036,19 @@ msgstr "" "El cos del missatge té el tipus de signatura «%s» però la signatura en el " "camp de la capçalera és «%s»" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "El cos del missatge és buit però la signatura en el camp de la capçalera és " "«(%s)»" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "S'ha retornat un error amb el cos de tipus «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "S'ha retornat un error amb el cos buit" @@ -1052,24 +1070,24 @@ msgid "Unable to get Hardware profile: %s" msgstr "No s'ha pogut obtenir el perfil de maquinari: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "No s'ha pogut carregar %s ni %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "S'ha produït un error en cridar «StartServiceByName» per a %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "" "S'ha obtingut una resposta inesperada %d per al mètode " "«StartServiceByName(\"%s\")»" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1079,25 +1097,25 @@ msgstr "" "conegut %s sense cap propietari i el servidor intermediari s'ha construït " "amb el senyalador «G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START»" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "No es pot utilitzar l'espai de noms abstracte" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "No es pot especificar el fitxer «nonce» quan es crea un servidor" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "S'ha produït un error en escriure el fitxer nonce a «%s»: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "La cadena «%s» no és un GUID vàlid de D-Bus" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "No es pot escoltar «%s», és un transport desconegut" @@ -1391,74 +1409,75 @@ msgstr "Error: %s no és un nom de bus conegut vàlid.\n" msgid "Not authorized to change debug settings" msgstr "No esteu autoritzat a canviar la configuració de depuració" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Sense nom" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "El fitxer d'escriptori no especificava el camp d'execució" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "No s'ha trobat el programa «%s» a $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "No s'ha pogut crear el directori de configuració de l'aplicació de l'usuari " "%s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "" "No s'ha pogut crear el directori de configuració MIME de l'usuari %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "A la informació d'aplicació li manca un identificador" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "No s'ha pogut crear el fitxer d'escriptori de l'usuari %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Definició personalitzada per a %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "la unitat no implementa l'expulsió" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "la unitat no implementa l'expulsió o «eject_with_operation»" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "la unitat no implementa el sondeig per si hi ha un suport" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "la unitat no implementa la inicialització" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "la unitat no implementa l'aturada" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "El backend TLS no implementa la recuperació de la vinculació TLS" @@ -1471,163 +1490,169 @@ msgstr "El TLS no està implementat" msgid "DTLS support is not available" msgstr "El DTLS no està implementat" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "No es pot gestionar la versió %d de la codificació del GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "" "Un nombre de testimonis (%d) de la codificació del GEmblem no són formats " "correctament" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "No es pot gestionar la versió %d de la codificació del GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "" "Un nombre de testimonis (%d) en la codificació del GEmblemedIcon no són " "formats correctament" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "S'esperava un GEmblem per a un GEmblemedIcon" #. Translators: This is an error message when #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "No existeix el punt de muntatge contenidor" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "No es pot copiar al directori" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "No es pot copiar el directori al directori" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Ja existeix el fitxer de destinació" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "No es pot copiar el directori de forma recursiva" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 +#, c-format msgid "Copy file range not supported" msgstr "No s'admet la còpia de fitxers amb interval" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "S'ha produït un error en empalmar el fitxer: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "No es pot empalmar" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "No està implementada la còpia (referències, clonacions) entre muntatges" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "" "No està implementada o no és vàlida la còpia (referències, clonacions)" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" "No està implementada o no ha funcionat la còpia (referències, clonacions)" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "No es pot recuperar l'atribut %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "No es pot copiar el fitxer especial" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2399 msgid "Symbolic links not supported" msgstr "No es poden utilitzar els enllaços simbòlics" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "No es pot utilitzar la paperera" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "En els noms de fitxers no pot haver-hi «%c»" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "No s'ha pogut crear un directori temporal per a la plantilla «%s»: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "el volum no implementa el muntatge" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "" "No hi ha cap aplicació que s'hagi registrat per a gestionar aquest fitxer" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "L'enumerador està tancat" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "L'enumerador de fitxer té una operació pendent" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Ja està tancat l'enumerador de fitxer" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "No es pot gestionar la versió %d de la codificació del GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Les dades d'entrada pel GFileIcon no són formades correctament" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "El flux no implementa «query_info»" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "No està implementada la cerca en el flux" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "No es permet truncar en els fluxos d'entrada" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "No es permet truncar en els fluxos" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "El nom de l'ordinador no és vàlid" @@ -1660,65 +1685,65 @@ msgstr "La resposta del servidor intermediari d'HTTP és massa gran" msgid "HTTP proxy server closed connection unexpectedly." msgstr "El servidor intermediari d'HTTP ha tancat la connexió inesperadament." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Nombre de testimonis erroni (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "El nom de classe %s no té tipus" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "El tipus %s no implementa la interfície GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "El tipus %s no té classe" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "El número de versió no és format correctament: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "El tipus %s no implementa «from_tokens()» a la interfície GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "" "No es pot gestionar la versió proporcionada de la codificació de la icona" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "No s'ha especificat cap adreça" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "L'adreça és massa llarga (%u)" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "L'adreça conté bits més enllà de la llargada del prefix" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "No s'ha pogut analitzar «%s» com a màscara d'adreça IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "No hi ha prou espai per a l'adreça del sòcol" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "L'adreça de sòcol no és compatible" @@ -1732,7 +1757,7 @@ msgstr "El flux d'entrada no té implementada la lectura" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "El flux té una operació pendent" @@ -1748,7 +1773,7 @@ msgstr "Mantén-lo amb el fitxer quan es mogui" msgid "“version” takes no arguments" msgstr "«version» no té arguments" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Forma d'ús:" @@ -1756,79 +1781,79 @@ msgstr "Forma d'ús:" msgid "Print version information and exit." msgstr "Mostra la informació de la versió i surt." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Ordres:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Concatena fitxers i els mostra per la sortida estàndard" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Copia un, o més, fitxers" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Mostra informació sobre ubicacions" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Executa una aplicació des d'un fitxer d'escriptori" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Llista el contingut de les ubicacions" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Obteniu o establiu el gestor d'un tipus MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Crea els directoris" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Fes un seguiment dels directoris per a veure si hi ha canvis" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Munta o desmunta les ubicacions" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Mou un, o més, fitxers" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Obre els fitxers amb l'aplicació per defecte" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Canvia el nom del fitxer" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Suprimeix un o més fitxers" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Llegeix de l'entrada estàndard i desa-ho" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Establiu un atribut de fitxer" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Mou els fitxers o directoris a la paperera" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Llista els continguts de les ubicacions en un arbre" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Ordres:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Feu servir %s per a obtenir ajuda detallada.\n" @@ -1838,7 +1863,7 @@ msgid "Error writing to stdout" msgstr "S'ha produït un error en escriure a la sortida estàndard" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1861,62 +1886,68 @@ msgstr "" "en comptes de fitxers locals: per exemple, podeu usar quelcom com ara\n" "smb://servidor/recurs/fitxer.txt com a ubicació." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "No s'ha donat cap ubicació" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "No hi ha cap directori de destinació" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Mostra el progrés" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Pregunta abans de sobreescriure" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Conserva tots els atributs" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "" "Crea una còpia de seguretat dels fitxers existents al directori de " "destinació" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "No segueixis mai els enllaços simbòlics" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Usa els permisos predeterminats per la destinació" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" +"Usa les marques de temps per defecte per a la modificació del fitxer per a " +"la destinació" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "S'han transferit %s de %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "FONT" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "DESTINACIÓ" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Copia un, o més, fitxers des de la FONT a la DESTINACIÓ." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1926,12 +1957,12 @@ msgstr "" "en comptes de fitxers locals: per exemple, podeu usar quelcom com ara\n" "smb://servidor/recurs/fitxer.txt com a ubicació." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "La destinació «%s» no és un directori" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: voleu sobreescriure «%s»? " @@ -1972,52 +2003,52 @@ msgstr "nom que es mostra: %s\n" msgid "edit name: %s\n" msgstr "edita el nom: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "nom: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tipus: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "mida: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "ocult\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "camí local: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix mount: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Atributs que es poden establir:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Espais de nom d'atributs d'escriptura:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Mostra informació sobre ubicacions." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -3155,128 +3186,128 @@ msgstr "" #. Translators: This is an error message when trying to find #. * the enclosing (user visible) mount of a file, but none #. * exists. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "No s'ha trobat el punt del muntatge pel fitxer %s" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "No es pot canviar el nom del directori arrel" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "S'ha produït un error en canviar el nom del fitxer %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "No es pot canviar el nom del fitxer, ja existeix aquest nom" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Nom de fitxer no vàlid" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "S'ha produït un error en obrir el fitxer %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "S'ha produït un error en suprimir el fitxer %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "S'ha produït un error en enviar a la paperera el fitxer %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "No s'ha pogut crear el directori de la paperera %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "No s'ha pogut trobar el directori superior per a la paperera %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "No està implementat l'enviament a la paperera en muntatges interns del " "sistema" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "No s'ha pogut trobar o crear el directori %s de la paperera per %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "No s'ha pogut crear el fitxer d'informació de la paperera per %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "No s'ha pogut enviar el fitxer %s a la paperera als límits del sistema de " "fitxers" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "No s'ha pogut enviar el fitxer a la paperera %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "No s'ha pogut enviar el fitxer %s a la paperera" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "S'ha produït un error en crear el directori %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "El sistema de fitxers no implementa enllaços simbòlics" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "S'ha produït un error en fer l'enllaç simbòlic: %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "S'ha produït un error en moure el fitxer %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "No s'ha pogut moure el directori al directori" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Ha fallat la creació del fitxer de còpia de seguretat" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "No està implementat moure entre muntatges" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "No s'han pogut determinar l'ús del disc de %s: %s" @@ -3298,124 +3329,124 @@ msgstr "El nom de l'atribut ampliat no és vàlid" msgid "Error setting extended attribute “%s”: %s" msgstr "S'ha produït un error en establir l'atribut ampliat «%s»: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (codificació no vàlida)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "S'ha produït un error en obtenir informació del fitxer «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "" "S'ha produït un error en obtenir informació del descriptor de fitxer: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "No es poden establir permisos en els enllaços simbòlics" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "S'ha produït un error en establir els permisos: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "S'ha produït un error en establir el propietari: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "l'enllaç simbòlic no pot ser nul" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "S'ha produït un error en establir l'enllaç simbòlic: el fitxer no és un " "enllaç simbòlic" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" "%d nanosegons addicionals per a la marca horària d'UNIX %lld és negatiu" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "%d nanosegons addicionals per a la marca horària d'UNIX %lld arriba al segon" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "La marca horària d'UNIX %lld no hi cap en 64 bits" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "La marca horària d'UNIX %lld és fora de l'interval suportat per Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "El valor «%s» no es pot convertir a UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "No es pot obrir el fitxer «%s»: error %lu del Windows" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "S'ha produït un error en establir el temps de modificació o d'accés per al " "fitxer: «%s»: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "" "S'ha produït un error en establir el temps de modificació o d'accés: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "El context del SELinux no pot ser nul" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "Aquest sistema no té habilitat el SELinux" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "S'ha produït un error en establir el context del SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "No està implementat establir l'atribut %s" @@ -3470,7 +3501,7 @@ msgid "Error truncating file: %s" msgstr "S'ha produït un error en truncar el fitxer: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "S'ha produït un error en obrir el fitxer «%s»: %s" @@ -3492,27 +3523,27 @@ msgstr "El fitxer ha estat modificat des d'alguna aplicació externa" msgid "Error removing old file: %s" msgstr "S'ha produït un error en suprimir el fitxer vell: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "El GSeekType proporcionat no és vàlid" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "La sol·licitud de cerca és no vàlida" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "No es pot truncar el GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "El flux de sortida de memòria no és modificable" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Ha fallat el redimensionament de la memòria del flux de sortida" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3520,32 +3551,32 @@ msgstr "" "La quantitat de memòria necessària per a processar l'escriptura és més gran " "que l'espai d'adreces disponible" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "S'ha sol·licitat un desplaçament abans de l'inici del flux" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "S'ha sol·licitat un desplaçament més enllà del final del flux" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "el muntatge no implementa el desmuntatge («unmount»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "el muntatge no implementa l'expulsió («eject»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "el muntatge no implementa el desmuntatge («unmount») o " @@ -3554,7 +3585,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "el muntatge no implementa l'expulsió («eject») o l'«eject_with_operation»" @@ -3562,34 +3593,34 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "el muntatge no implementa tornar-se a muntar («remount»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "el muntatge no implementa l'estimació de tipus de contingut" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "el muntatge no implementa l'estimació de tipus de contingut síncron" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "El nom de l'ordinador «%s» conté «[» però no «]»" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "No es pot accedir a la xarxa" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "No es pot accedir a la màquina" @@ -3617,7 +3648,7 @@ msgstr "El NetworkManager no s'està executant" msgid "NetworkManager version too old" msgstr "La versió del NetworkManager és massa antiga" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "El flux de sortida no implementa l'escriptura" @@ -3630,39 +3661,39 @@ msgstr "La suma de vectors donada a %s és massa gran" msgid "Source stream is already closed" msgstr "El flux font ja està tancat" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "" "S'ha produït un error no especificat la cerca del servidor intermediari" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "S'ha produït un error en resoldre «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "no s'ha implementat %s" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "El domini no és vàlid" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "No existeix el recurs a «%s»" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "No s'ha pogut descomprimir el recurs «%s»" @@ -3680,11 +3711,11 @@ msgstr "El recurs a «%s» no és un directori" msgid "Input stream doesn’t implement seek" msgstr "El flux d'entrada no té implementada la cerca" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Llista les seccions que contenen recursos en un FITXER elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3694,15 +3725,15 @@ msgstr "" "Si s'especifica una SECCIÓ, només es llisten els recursos d'aquella secció\n" "Si s'especifica un CAMÍ, només es llisten els recursos que hi coincideixin" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FITXER [CAMÍ]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECCIÓ" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3714,15 +3745,15 @@ msgstr "" "Si s'especifica el CAMÍ, només es mostren els recursos que hi coincideixin\n" "Les dades són la secció, la mida i la compressió" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extreu un fitxer de recurs a la sortida estàndard" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "CAMÍ AL FITXER" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3750,7 +3781,7 @@ msgstr "" "Utilitzeu «gresource help ORDRE» per a obtenir informació més detallada.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3765,20 +3796,20 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SECCIÓ El nom (opcional) d'una secció elf\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " ORDRE L'ordre (opcional) que s'explicarà\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" " FITXER Un fitxer elf (un fitxer binari o una biblioteca compartida)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3786,19 +3817,19 @@ msgstr "" " FITXER Un fitxer elf (un fitxer binari o una biblioteca\n" " compartida) o un fitxer de recurs compilat\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[CAMÍ]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " CAMÍ Un (opcional) camí (pot ser parcial) de recurs\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "CAMÍ" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " CAMÍ Un camí de recurs\n" @@ -4030,219 +4061,219 @@ msgstr "S'ha donat un nom d'esquema buit\n" msgid "No such key “%s”\n" msgstr "No existeix la clau «%s»\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "El sòcol no és vàlid, no està inicialitzat" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "El sòcol no és vàlid, ha fallat la inicialització a causa de: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "El sòcol ja és tancat" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "S'ha excedit el temps d'espera d'entrada/sortida del sòcol" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "s'està creant un GSocket a partir del descriptor de fitxer: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "No s'ha pogut crear el sòcol: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "S'ha especificat una família desconeguda" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "S'ha especificat un protocol desconegut" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "No es poden realitzar operacions de datagrames a un sòcol que no és de " "datagrama." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "No es poden realitzar operacions de datagrames a un sòcol que tingui un " "temps d'espera màxim establert." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "no s'ha pogut obtenir l'adreça local: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "no s'ha pogut obtenir l'adreça remota: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "no s'ha pogut escoltar: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "S'ha produït un error en vincular-se a l'adreça %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "S'ha produït un error en unir-se a un grup de multidestinació: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "S'ha produït un error en deixar un grup de multidestinació: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Encara no es pot fer multidestinació des d'un origen concret" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "La família del sòcol no és compatible" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "la font especificada no és una adreça IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "El nom de la interfície és massa llarg" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "No s'ha trobat la interfície: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Encara no es pot fer multidestinació en IPv4 des d'un origen concret" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Encara no es pot fer multidestinació en IPv6 des d'un origen concret" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "S'ha produït un error en acceptar la connexió: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Connexió en curs" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "No s'ha pogut obtenir l'error pendent: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "S'ha produït un error en rebre les dades: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "S'ha produït un error en enviar les dades: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "No s'ha pogut aturar el sòcol: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "S'ha produït un error en tancar el sòcol: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "S'està esperant la condició del sòcol: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "S'ha produït un error en enviar el missatge: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Els vectors del missatge són massa grans" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "S'ha produït un error en enviar el missatge: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "El GSocketControlMessage no està implementat a Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "S'ha produït un error en rebre un missatge: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "No s'han pogut llegir les credencials del sòcol: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "aquest sistema operatiu no admet g_socket_get_credentials" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "No s'ha pogut connectar al servidor intermediari %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "No s'ha pogut connectar a %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "No s'ha pogut connectar: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "Encara no es pot fer de servidor intermediari d'una connexió que no sigui " "TCP." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "El protocol del servidor intermediari «%s» no està implementat." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Ja està tancat el receptor de connexions" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "El sòcol que s'ha afegit és tancat" @@ -4342,97 +4373,97 @@ msgstr "" msgid "Unknown SOCKSv5 proxy error." msgstr "S'ha produït un error desconegut en el servidor intermediari SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "No s'ha pogut crear el conducte per a comunicar-se amb el procés fill (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Els conductes no són compatibles amb aquesta plataforma" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "No es pot gestionar la versió %d de la codificació del GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "No s'ha trobat cap adreça vàlida" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "S'ha produït un error en resoldre a la inversa «%s»: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "" "S'ha produït un error en analitzar el registre de DNS %s: paquet DNS mal " "format" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No hi ha cap registre del tipus sol·licitat al DNS per «%s»" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "No s'ha pogut resoldre «%s» de forma temporal" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "S'ha produït un error en resoldre «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Paquet DNS mal format" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "No s'ha pogut analitzar la resposta DNS per a «%s»: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "No s'ha trobat cap clau privada codificada amb PEM" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "No s'ha pogut desxifrar la clau privada codificada amb PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "No s'ha pogut analitzar la clau privada codificada amb PEM" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "No s'ha trobat cap certificat codificat amb PEM" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "No s'ha pogut analitzar el certificat codificat amb PEM" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "El backend TLS actual no és compatible amb PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Aquest GTlsBackend no admet la creació de certificats PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4442,7 +4473,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4450,15 +4481,15 @@ msgstr "" "S'han introduït diverses contrasenyes errònies i se us bloquejarà l'accés " "després de més intents." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "La contrasenya introduïda no és correcta." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "L'enviament de FD no és compatible" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4466,42 +4497,42 @@ msgstr[0] "S'esperava un missatge de control però se n'ha obtingut %d" msgstr[1] "S'esperava un missatge de control però se n'han obtingut %d" # FIXME -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Tipus de dades extres no esperades" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "S'esperava un descriptor de fitxer però se n'ha obtingut %d\n" msgstr[1] "S'esperava un descriptor de fitxer però se n'han obtingut %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "S'ha rebut un descriptor de fitxer no vàlid" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "No s'admet la recepció de FD" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "S'ha produït un error en enviar les credencials: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" "S'ha produït un error en la comprovació de si «SO_PASSCRED» és habilitat en " "el sòcol: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "S'ha produït un error en habilitar «SO_PASSCRED»: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero " "bytes" @@ -4509,82 +4540,94 @@ msgstr "" "S'esperava llegir un sol byte per a rebre les credencials però s'han llegit " "zero bytes" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "No s'esperava un missatge de control però s'ha obtingut %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "S'ha produït un error en inhabilitar «SO_PASSCRED»: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "S'ha produït un error en llegir del descriptor de fitxer: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "S'ha produït un error en tancar el descriptor de fitxer: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Arrel del sistema de fitxers" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "S'ha produït un error en escriure al descriptor de fitxer: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Aquest sistema no admet adreces de sòcol de domini UNIX abstractes" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "el volum no implementa l'expulsió" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "el volum no implementa l'expulsió o «eject_with_operation»" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "L'aplicació «%s» de l'objecte d'aplicació no té verbs" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"L'aplicació «%s» i el gestor «%s» de l'objecte d'aplicació no tenen verbs" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "S'ha produït un error en llegir del gestor: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "S'ha produït un error en tancar el gestor: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "S'ha produït un error en escriure al gestor: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "No hi ha prou memòria" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Error intern: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Fan falta més dades d'entrada" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Les dades comprimides no són vàlides" @@ -4612,154 +4655,154 @@ msgstr "Executa un servei de D-Bus" msgid "Wrong args\n" msgstr "Els arguments no són vàlids\n" -#: glib/gbookmarkfile.c:861 +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "No s'ha trobat l'atribut «%s» de l'element «%s»" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "No s'esperava l'etiqueta «%s» dins «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "La data/hora «%s» no és vàlida al fitxer d'adreces d'interès" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "" "No s'ha trobat cap fitxer d'adreces d'interès dins dels directoris de dades" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Ja existeix una adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No s'ha trobat cap adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "No hi ha cap tipus MIME definit a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "" "No hi ha cap senyalador privat definit a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No hi ha cap grup establert a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "" "No hi ha cap aplicació amb el nom «%s» que hagi registrat l'adreça d'interès" " «%s»" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "No s'ha pogut ampliar la línia d'execució «%s» amb l'URI «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Caràcter no representable a l'entrada de la conversió" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Seqüència de caràcters parcial al final de l'entrada" # FIXME: fallback -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "No es pot convertir el «fallback» «%s» al joc de codis «%s»" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "NUL byte incrustat a l'entrada de conversió" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "L'URI «%s» no és un URI absolut que utilitzi l'esquema «file»" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "L'URI «%s» no és vàlid" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "El nom de l'ordinador de l'URI «%s» no és vàlid" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "L'URI «%s» conté caràcters d'escapada no vàlids" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "El nom de camí «%s» no és un camí absolut" #. Translators: this is the preferred format for expressing the date and the #. time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %-d %b de %Y, %T %Z" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%-H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4779,62 +4822,62 @@ msgstr "%I:%M:%S %p" #. * paste here. Note that in most of the languages (western European, #. * non-European) there is no difference between the standalone and #. * complete date form. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "gener" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "febrer" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "març" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "abril" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "maig" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "juny" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "juliol" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "agost" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "setembre" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "octubre" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "novembre" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "desembre" @@ -4855,132 +4898,132 @@ msgstr "desembre" #. * and paste here. Note that this feature is not yet supported by any #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "gen." -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "febr." -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "març" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "abr." -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "maig" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "juny" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "jul." -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "ag." -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "set." -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "oct." -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "nov." -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "des." -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "dilluns" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "dimarts" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "dimecres" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "dijous" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "divendres" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "dissabte" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "diumenge" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "dl." -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "dt." -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "dc." -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "dj." -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "dv." -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "ds." -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "dg." @@ -5001,62 +5044,62 @@ msgstr "dg." #. * incorrect in some languages. Note that in most of the languages #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "de gener" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "de febrer" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "de març" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "d'abril" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "de maig" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "de juny" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "de juliol" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "d'agost" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "de setembre" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "d'octubre" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "de novembre" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "de desembre" @@ -5077,200 +5120,205 @@ msgstr "de desembre" #. * `locale abmon' in your native locale produces a complete list of #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "de gen." -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "de febr." -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "de març" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "d'abr." -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "de maig" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "de juny" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "de jul." -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "d'ag." -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "de set." -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "d'oct." -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "de nov." -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "de des." #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "a. m." #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "p. m." -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "S'ha produït un error en obrir el directori «%s»: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "No s'han pogut assignar %lu byte per a llegir el fitxer «%s»" -msgstr[1] "No s'han pogut assignar %lu bytes per a llegir el fitxer «%s»" +#: glib/gfileutils.c:716 glib/gfileutils.c:820 +# +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "No s'ha pogut assignar %" +msgstr[1] "No s'han pogut assignar %" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:733 #, c-format msgid "Error reading file “%s”: %s" msgstr "S'ha produït un error en llegir el fitxer «%s»: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:769 glib/gfileutils.c:803 #, c-format msgid "File “%s” is too large" msgstr "El fitxer «%s» és massa gran" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:845 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "No s'ha pogut llegir del fitxer «%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:895 glib/gfileutils.c:970 glib/gfileutils.c:1477 #, c-format msgid "Failed to open file “%s”: %s" msgstr "No s'ha pogut obrir el fitxer «%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:908 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" "No s'han pogut obtenir els atributs del fitxer «%s»: ha fallat la funció " "fstat(): %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:939 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció fdopen(): %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1040 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "No s'ha pogut canviar el nom del fitxer «%s» a «%s»: ha fallat la funció " "g_rename(): %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1139 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat ftruncate(): %s" + +#: glib/gfileutils.c:1184 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "" "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció write(): %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1205 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "" "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fsync(): %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1366 glib/gfileutils.c:1783 #, c-format msgid "Failed to create file “%s”: %s" msgstr "No s'ha pogut crear el fitxer «%s»: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1411 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" "No s'ha pogut suprimir el fitxer existent «%s»: ha fallat la funció " "g_unlink(): %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1748 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "La plantilla «%s» no és vàlida, no hauria de tenir cap «%s»" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1761 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "La plantilla «%s» no conté XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2355 glib/gfileutils.c:2384 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "No es pot fer una lectura bàsica a g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "" "A la memòria intermèdia de lectura hi ha dades sobrants no convertides" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "El canal acaba en un caràcter parcial" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "No es pot fer una lectura bàsica a g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "" "No s'ha pogut trobar cap fitxer de claus vàlid als directoris de cerca" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "No és un fitxer regular" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5278,44 +5326,44 @@ msgstr "" "El fitxer de claus conté la línia «%s» que no és una parella clau-valor, " "grup o comentari" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "El nom del grup no és vàlid: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "El fitxer de claus no comença amb un grup" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "El nom de la clau no és vàlid: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "El fitxer de claus conté la codificació no implementada «%s»" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "El fitxer de claus no té el grup «%s»" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "El fitxer de claus no conté una clau «%s» en el grup «%s»" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "El fitxer de claus conté la clau «%s» amb el valor «%s», que no és UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." @@ -5323,7 +5371,7 @@ msgstr "" "El fitxer de claus conté la clau «%s», que té un valor que no es pot " "interpretar." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5332,37 +5380,37 @@ msgstr "" "El fitxer de claus conté la clau «%s» en el grup «%s», que té un valor que " "no es pot interpretar." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "La clau «%s» en el grup «%s» té el valor «%s» però s'esperava el valor %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "El fitxer de claus conté un caràcter d'escapada al final de línia" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "El fitxer de claus conté la seqüència d'escapada no vàlida «%s»" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "El valor «%s» no es pot interpretar com un nombre." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "El valor enter «%s» és fora de l'interval" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "El valor «%s» no es pot interpretar com un nombre amb coma flotant." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "El valor «%s» no es pot interpretar com un booleà." @@ -5385,32 +5433,32 @@ msgstr "" msgid "Failed to open file “%s”: open() failed: %s" msgstr "No s'ha pogut obrir el fitxer «%s»: ha fallat la funció open(): %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "S'ha produït un error a la línia %d caràcter %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "El nom conté caràcters UTF-8 no vàlids: «%s»" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "«%s» no és un nom vàlid" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "«%s» no és un nom vàlid: «%c»" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "S'ha produït un error a la línia %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5419,7 +5467,7 @@ msgstr "" "No s'ha pogut analitzar «%-.*s»: hi hauria d'haver hagut un dígit dins un " "caràcter de referència (per exemple ê). Potser el dígit és massa gran" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5429,24 +5477,24 @@ msgstr "" "utilitzat un caràcter «&» sense intenció d'iniciar una entitat. Substituïu " "el caràcter «&» per &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permès" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "S'ha detectat una entitat buida «&;». Les entitats vàlides són: & "" " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Es desconeix el nom d'entitat «%-.*s»" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5455,11 +5503,11 @@ msgstr "" "«&» sense intenció d'iniciar una entitat. Substituïu el caràcter «&» per " "&" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "El document ha de començar amb un element (p. ex. )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an" @@ -5468,7 +5516,7 @@ msgstr "" "«%s» no és un caràcter vàlid després d'un caràcter «<»: no pot començar un " "nom d'element" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5477,12 +5525,12 @@ msgstr "" "S'ha trobat un caràcter estrany: «%s». S'esperava el caràcter «>» per a " "tancar l'etiqueta d'element buit «%s»" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Massa atributs en l'element «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5490,7 +5538,7 @@ msgstr "" "S'ha trobat un caràcter estrany: «%s». S'esperava un «=» després del nom " "d'atribut «%s» de l'element «%s»" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5501,7 +5549,7 @@ msgstr "" "a finalitzar l'etiqueta d'inici de l'element «%s», o opcionalment un " "atribut. Potser heu utilitzat un caràcter no vàlid en un nom d'atribut" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5510,7 +5558,7 @@ msgstr "" "S'ha trobat un caràcter estrany: «%s». S'esperaven unes cometes d'obertura " "després del signe «=» en donar valor a l'atribut «%s» de l'element «%s»" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “»" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "L'element «%s» estava tancat. Actualment no hi ha cap element obert" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "L'element «%s» estava tancat. L'element obert actualment és «%s»" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "El document era buit o només contenia espais en blanc" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" "El document ha acabat de manera inesperada immediatament després del símbol " "«<»" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5557,7 +5605,7 @@ msgstr "" "El document ha acabat de manera inesperada amb elements que encara eren " "oberts. «%s» era l'últim element obert" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5566,21 +5614,21 @@ msgstr "" "El document ha acabat de manera inesperada. S'esperava trobar un símbol «>» " "que acabés l'etiqueta <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "El document ha acabat de manera inesperada enmig d'un nom d'element" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "El document ha acabat de manera inesperada enmig d'un nom d'atribut" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "" "El document ha acabat de manera inesperada enmig d'una etiqueta d'obertura " "d'un element." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5588,268 +5636,268 @@ msgstr "" "El document ha acabat de manera inesperada després d'un signe d'igual " "després d'un nom d'atribut. No hi ha cap valor d'atribut" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "El document ha acabat de manera inesperada enmig d'un valor d'atribut" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" "El document ha acabat de manera inesperada enmig de l'etiqueta de tancament " "de l'element «%s»" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "El document ha acabat de manera inesperada enmig de l'etiqueta de tancament " "per un element no obert" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "El document ha acabat de manera inesperada enmig d'un comentari o d'una " "instrucció de processament" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPCIÓ...]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Opcions d'ajuda:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Mostra les opcions d'ajuda" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Mostra totes les opcions d'ajuda" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Opcions de l'aplicació:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Opcions:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "No es pot analitzar el valor enter «%s» per a %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "El valor enter «%s» per a %s és fora de l'interval" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "No es pot analitzar el valor doble «%s» per a %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "El valor doble «%s» per a %s és fora de l'interval" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "S'ha produït un error en analitzar l'opció %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Manca un argument per a %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Es desconeix l'opció %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "objecte malmès" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "no hi ha prou memòria" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "error intern" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" "el patró conté elements que no estan implementats en les concordances " "parcials" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "no s'ha implementat l'ús de referències anteriors per a coincidències " "parcials" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "s'ha arribat al límit de recurrències" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "desplaçament incorrecte" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "bucle recursiu" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "es demana que el mode de coincidència però es va compilar per al JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "error desconegut" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ al final del patró" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c al final del patró" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "caràcter no reconegut després de \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "nombres fora de l'interval en el quantificador {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "nombre massa gran en el quantificador {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "falta el «]» per a la classe de caràcter" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "la seqüència d'escapada en la classe de caràcter no és vàlida" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "s'ha sortit de l'interval en la classe de caràcter" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "no hi ha res per a repetir" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "no es reconeix el caràcter després de «(?» o «(?-»" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "" "Només es permeten les classes amb nom de POSIX dins de la pròpia classe" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "No es poden utilitzar els elements d'ordenació de POSIX" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "falta un «)»" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "referència a un subpatró que no existeix" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "falta un «)» després del comentari" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "l'expressió regular és massa gran" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "el nombre o el nom no estan ben formats després de «(?(»" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "l'asserció cap enrere no té llargada fixa" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "el grup condicional conté més de dues branques" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "s'esperava una asserció després de «(?(»" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "les referències numerades no poden ser zero" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nom de classe POSIX desconeguda" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "el valor del caràcter a la seqüència «\\x{...}» és massa gran" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "no es permet \\C en assercions cap enrere" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "falta la finalització en el nom del subpatró" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dos noms de subpatró tenen el mateix nom" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "la seqüència «\\P» o «\\p» no està ben formada" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "es desconeix el nom de la propietat després de «\\P» o «\\p»" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "el nom del subpatró és massa llarg (32 caràcters com a màxim)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "hi ha massa subpatrons amb nom (màxim de 10.000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "el valor octal és més gran que \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "El grup «DEFINE» conté més d'una branca" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "opcions «NEWLINE» incoherents" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5857,242 +5905,242 @@ msgstr "" "després de «\\g» no hi ha cap número o cap nom o número entre claudàtors, " "claus angulars o cometes" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "no es permeten arguments per «(*ACCEPT)», «(*FAIL)» o «(*COMMIT)»" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "no es reconeix «(*VERB)»" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "el número és massa gran" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "falta el nom del subpatró després de (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "no s'accepten noms diferents per subpatrons del mateix número" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "«(*MARK)» ha de tenir un argument" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "després de «\\c» ha d'haver-hi un caràcter ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "després de «\\k» no hi ha cap nom entre claudàtors, claus angulars o cometes" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "no es pot utilitzar \\N en una classe" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "el nom és massa llarg a «(*MARK)«, «(*PRUNE)«, «(*SKIP)» o «(*THEN)»" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "desbordament del codi" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "no es reconeix el caràcter després de «(?P»" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "s'ha produït un desbordament en compilar l'espai de treball" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "no s'ha trobat el subpatró referenciat comprovat anteriorment" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "S'ha produït un error en fer coincidir l'expressió regular %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "La biblioteca PCRE no està compilada per a interpretar UTF-8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "La biblioteca PCRE ha estat compilada amb opcions incompatibles" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "S'ha produït un error en compilar l'expressió regular «%s» al caràcter %s: " "%s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "s'esperava un dígit hexadecimal o bé «}»" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "s'esperava un dígit hexadecimal" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "falta un «<» en la referència simbòlica" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "la referència simbòlica no està acabada" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "referència simbòlica de longitud zero" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "s'esperava un dígit" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "la referència simbòlica no és vàlida" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "«\\» final extraviat" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "no es reconeix la seqüència d'escapament" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "S'ha produït un error en analitzar el text de reemplaçament «%s» al caràcter" " %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "El text citat no comença amb cometes" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "S'han trobat unes cometes desaparellades en una línia d'ordres o en un altre" " text entre cometes" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "El text acaba just després d'un caràcter «\\». (El text era «%s».)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "El text ha acabat abans de trobar les cometes corresponents a %c. (El text " "era «%s».)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "El text era buit (o només contenia espais en blanc)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "No s'han pogut llegir dades des del procés fill (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "" "S'ha produït un error no esperat en llegir dades des d'un procés fill (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "S'ha produït un error inesperat en waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "El procés fill ha sortit amb el codi %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "El senyal %ld ha matat el procés fill" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "El senyal %ld ha aturat el procés fill" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "El procés fill ha sortit inesperadament" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "No s'ha pogut llegir des del conducte fill (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "No s'ha pogut engendrar el procés fill «%s» (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "No s'ha pogut bifurcar (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "No s'ha pogut canviar al directori «%s» (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "No s'ha pogut executar el procés fill «%s» (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "" "No s'ha pogut obrir el fitxer per a tornar a assignar el descriptor de " "fitxers (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "" "No s'ha pogut duplicar el descriptor de fitxers per al procés fill (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "No s'ha pogut bifurcar el procés fill (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "No s'ha pogut tancar el descriptor de fitxers per al procés fill (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "S'ha produït un error desconegut en executar el procés fill «%s»" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -6151,78 +6199,78 @@ msgstr "" "S'ha produït un error inesperat a g_io_channel_win32_poll() en llegir dades " "d'un procés fill" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "La cadena buida no és un número" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» no és un nombre amb signe" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "El número «%s» està fora de rangs [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» no és un nombre sense signe" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Codificació %-e no vàlida en l'URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Caràcters no UTF-8 en l'URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Caràcters no UTF-8 en l'URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Adreça IPv6 no vàlida «%.*s» en URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Adreça IP codificada incorrectament «%.*s» en URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nom d'amfitrió internacionalitzat incorrectament «%.*s» a l'URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "No s'ha pogut analitzar el port «%.*s» en l'URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "El port «%.*s» de l'URI està fora de rang" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "L'URI «%s» no és un URI absolut" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "L'URI «%s» no té un component amfitrió" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "L'URI no és absolut i no s'ha proporcionat cap URI base" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Falta «=» i el valor del paràmetre" @@ -6316,76 +6364,76 @@ msgid "EiB" msgstr "EiB" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. kb" +#. kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Mb" +#. Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Gb" +#. Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Tb" +#. Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Pb" +#. Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Eb" +#. Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Kib" +#. Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Mib" +#. Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Gib" +#. Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Tib" +#. Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Pib" +#. Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" #. Translators: A unit symbol for size formatting, showing for example: "13.0 -#. Eib" +#. Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6496,6 +6544,53 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Missatge «METHOD_RETURN»: el camp de capçalera «REPLY_SERIAL» manca o és " +#~ "invàlid" + +#, c-format +#~ msgid "Could not allocate %lu byte to read file “%s”" +#~ msgid_plural "Could not allocate %lu bytes to read file “%s”" +#~ msgstr[0] "No s'han pogut assignar %lu byte per a llegir el fitxer «%s»" +#~ msgstr[1] "No s'han pogut assignar %lu bytes per a llegir el fitxer «%s»" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "GApplication options" #~ msgstr "Opcions de la GApplication" diff --git a/po/cs.po b/po/cs.po index 77b9d8c..fe3dd55 100644 --- a/po/cs.po +++ b/po/cs.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-16 21:53+0000\n" -"PO-Revision-Date: 2023-09-17 14:58+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-27 09:41+0000\n" +"PO-Revision-Date: 2024-02-28 00:02+0100\n" "Last-Translator: Daniel Rusek \n" "Language-Team: Czech \n" "Language: cs\n" @@ -25,7 +25,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" "X-Project-Style: gnome\n" #: gio/gappinfo.c:339 @@ -48,37 +48,41 @@ msgstr "Selhalo vyhledání výchozí aplikace pro obsah typu „%s“" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Selhalo vyhledání výchozí aplikace pro schéma URI „%s“" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Volby GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Zobrazit volby GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Vstoupit do režimu služby GApplication (použít ze souborů služby D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Přepsat ID aplikace" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Vypsat verzi aplikace" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Nahradit běžící instanci" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Vypsat nápovědu" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[PŘÍKAZ]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Vypsat verzi" @@ -132,7 +136,7 @@ msgid "APPID" msgstr "IDAPLIKACE" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "PŘÍKAZ" @@ -146,7 +150,9 @@ msgstr "Identifikátor aplikace ve formátu D-Bus (např. org.example.viewer)" #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/decompiler/decompiler.c:51 msgid "FILE" msgstr "SOUBOR" @@ -172,7 +178,7 @@ msgstr "PARAMETR" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Volitelný parametr k akci vyvolání ve formátu GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -186,12 +192,12 @@ msgstr "" msgid "Usage:\n" msgstr "Použití:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumenty:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTY…]" @@ -284,78 +290,78 @@ msgstr "" "neznámý příkaz: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "%s poskytnut příliš vysoký počet" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Posouvání není v proudu podporováno" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Nelze zkrátit GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Proud je již uzavřen" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Zkrácování není v proudu podporováno" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operace byla zrušena" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Neplatný objekt, nebyl spuštěn" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Neúplná vícebajtová posloupnost na vstupu" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Cíl nemá dostatek místa" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Neplatná posloupnost bajtů na vstupu převodu" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Chyba při převodu: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Zrušitelné spuštění není podporováno" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Převod ze znakové sady „%s“ do „%s“ není podporován" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Nelze otevřít převodník z „%s“ do „%s“" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "typ %s" @@ -369,41 +375,41 @@ msgstr "Neznámý typ" msgid "%s filetype" msgstr "typ souboru %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials obsahuje neplatná data" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials na tomto OS není implementováno" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Danou platformu GCredentials nepodporuje" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials na tomto OS neobsahuje ID procesu" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Změna přihlašovacích údajů na tomto OS není implementován" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Neočekávaný časný konec proudu" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nepodporovaný klíč „%s“ v záznamu s adresou „%s“" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Nesmyslná párová kombinace klíč/hodnota v záznamu s adresou „%s“" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -412,28 +418,28 @@ msgstr "" "Adresa „%s“ je neplatná (je zapotřebí právě jeden z klíčů path, tmpdir nebo " "abstract)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Chyba v adrese „%s“ – atribut „%s“ má chybný formát" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Neznámý nebo nepodporovaný přenos „%s“ adresy „%s“" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Prvek adresy „%s“ neobsahuje dvojtečku (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Název přenosu v prvku adresy „%s“ nesmí být prázdný" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -441,13 +447,13 @@ msgid "" msgstr "" "Pár klíč/hodnota %d, „%s“, v prvku adresy „%s“ neobsahuje znak rovná se" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "Pár klíč/hodnota %d, „%s“ v prvku adresy „%s“ nesmí mít prázdný klíč" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -456,7 +462,7 @@ msgstr "" "Chyba v neuvozeném klíči nebo hodnotě v páru klíč/hodnota %d, „%s“, v prvku " "adresy „%s“" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -465,74 +471,74 @@ msgstr "" "Chyba v adrese „%s“ – unix transport vyžaduje jako nastavený právě jeden z " "klíčů „path“ nebo „abstract“" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Chyba v adrese „%s“ – atribut počítače schází nebo má chybný formát" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Chyba v adrese „%s“ – atribut portu schází nebo má chybný formát" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "Chyba v adrese „%s“ – atribut noncefile schází nebo má chybný formát" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Chyba při automatickém spouštění: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Chyba při otevírání souboru nonce „%s“: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Chyba při čtení ze souboru nonce „%s“: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Chyba při čtení ze souboru nonce „%s“, očekáváno 16 bajtů, obdrženo %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Chyba při zápisu obsahu souboru nonce „%s“ do proudu:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Daná adresa je prázdná" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Nelze spustit sběrnici zpráv, když je nastaveno AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Nelze spustit sběrnici zpráv bez machine-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Nelze automaticky spustit D-Bus bez X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Chyba při spouštění příkazového řádku „%s“: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Nelze určit adresu sběrnice sezení (v tomto OS neimplementováno)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -541,7 +547,7 @@ msgstr "" "Nelze určit adresu sběrnice z proměnné prostředí DBUS_STARTER_BUS_TYPE – " "neznámá hodnota „%s“" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -549,35 +555,35 @@ msgstr "" "Nelze určit adresu sběrnice, jelikož proměnná prostředí " "DBUS_STARTER_BUS_TYPE není nastavena" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Neznámý typ sběrnice %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Neočekávaně scházející obsah při pokusu o přečtení řádku" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Neočekávaně scházející obsah při pokusu o (bezpečné) přečtení řádku" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "" "Vyčerpány všechny dostupné ověřovací mechanismy (pokusů: %s) (dostupných: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Neočekávaně chybí obsah při pokusu o přečtení bajtu" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "ID uživatele musí být stejné pro klienta i server" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Zrušeno přes GDBusAuthObserver::authorize-authenticated-peer" @@ -598,13 +604,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Chyba při vytváření složky %s: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operace není podporována" @@ -665,15 +671,15 @@ msgstr "Chyba při otevírání klíčenky „%s“ k zápisu: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Navíc selhalo také uvolnění zámku pro „%s“: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Spojení bylo ukončeno" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Časový limit vypršel" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -763,51 +769,82 @@ msgstr "Podstrom je již exportován pro %s" msgid "Object does not exist at path “%s”" msgstr "V cestě „%s“ objekt neexistuje" -#: gio/gdbusmessage.c:1306 -msgid "type is INVALID" -msgstr "typ je INVALID" +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +#: gio/gdbusmessage.c:1374 +#, fuzzy, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: %s header field is missing or invalid" msgstr "" "Zpráva METHOD_CALL: pole se záhlavím PATH nebo MEMBER schází nebo je neplatné" -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" msgstr "" -"Zpráva METHOD_RETURN: pole se záhlavím REPLY_SERIAL schází nebo je neplatné" -#: gio/gdbusmessage.c:1360 +#: gio/gdbusmessage.c:1424 +#, fuzzy, c-format +#| msgid "" +#| "SIGNAL message: The PATH header field is using the reserved value /org/" +#| "freedesktop/DBus/Local" msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Zpráva ERROR: pole se záhlavím REPLY_SERIAL nebo ERROR_NAME schází nebo je " -"neplatné" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Zpráva SIGNAL: pole se záhlavím PATH, INTERFACE nebo MEMBER schází nebo je " -"neplatné" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" msgstr "" "Zpráva SIGNAL: pole se záhlavím PATH používá rezervovanou hodnotu /org/" "freedesktop/DBus/Local" -#: gio/gdbusmessage.c:1400 +#: gio/gdbusmessage.c:1437 +#, fuzzy, c-format +#| msgid "" +#| "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or " +#| "invalid" msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"Zpráva SIGNAL: pole se záhlavím PATH, INTERFACE nebo MEMBER schází nebo je " +"neplatné" + +#: gio/gdbusmessage.c:1446 +#, fuzzy, c-format +#| msgid "" +#| "SIGNAL message: The INTERFACE header field is using the reserved value " +#| "org.freedesktop.DBus.Local" +msgid "" +"%s message: INTERFACE header field is using the reserved value org." "freedesktop.DBus.Local" msgstr "" "Zpráva SIGNAL: pole se záhlavím INTERFACE používá rezervovanou hodnotu org." "freedesktop.DBus.Local" -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1459 +#, fuzzy, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"Zpráva METHOD_CALL: pole se záhlavím PATH nebo MEMBER schází nebo je neplatné" + +#: gio/gdbusmessage.c:1472 +#, fuzzy, c-format +#| msgid "" +#| "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or " +#| "invalid" +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"Zpráva ERROR: pole se záhlavím REPLY_SERIAL nebo ERROR_NAME schází nebo je " +"neplatné" + +#: gio/gdbusmessage.c:1511 +msgid "type is INVALID" +msgstr "typ je INVALID" + +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -815,12 +852,12 @@ msgstr[0] "Zamýšlel se přečíst %lu bajt, ale obdrženo %lu" msgstr[1] "Zamýšlely se přečíst %lu bajty, ale obdrženo %lu" msgstr[2] "Zamýšlelo se přečíst %lu bajtů, ale obdrženo %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Očekáván bajt NULL za řetězcem „%s“, ale byl nalezen bajt %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -829,21 +866,21 @@ msgstr "" "Očekáván platný řetězec UTF-8, ale byly nalezeny neplatné bajty na pozici %d " "(délka řetězce je %d). Platný řetězec UTF-8 až do příslušného bodu byl „%s“" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Hodnota je zanořená příliš hluboko" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Analyzovaná hodnota „%s“ není platná cesta objektu D-Bus" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Analyzovaná hodnota „%s“ není platný podpis D-Bus" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -856,7 +893,7 @@ msgstr[1] "" msgstr[2] "" "Zjištěno pole o délce %u bajtů. Maximální délka je 2<<26 bajtů (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -865,16 +902,16 @@ msgstr "" "Vyskytlo se pole typu „a%c“, které by mělo mít délku v násobku %u bajtů, ale " "skutečná délka je %u bajtů" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Prázdné struktury (n-tice) nejsou na sběrnici D-Bus dovoleny" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Analyzovaná hodnota „%s“ varianty není platným podpisem D-Bus" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -882,7 +919,7 @@ msgstr "" "Chyba při rušení serializace GVariant s řetězcem typu „%s“ z přenosového " "formátu D-Bus" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -891,27 +928,27 @@ msgstr "" "Neplatná hodnota endianity. Očekávána 0x6c („l“) nebo 0x42 („B“), ale " "nalezena hodnota 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Neplatná verze hlavního protokolu. Očekávána 1, ale nalezena %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Byla nalezena hlavička podpisu, ale není typu podpis" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Byla nalezena hlavička podpisu s podpisem „%s“, ale tělo zprávy je prázdné" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Analyzovaná hodnota „%s“ není platným podpisem D-Bus (pro tělo)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -919,11 +956,11 @@ msgstr[0] "Ve zprávě není hlavička s podpisem, ale tělo zprávy má %u bajt msgstr[1] "Ve zprávě není hlavička s podpisem, ale tělo zprávy má %u bajty" msgstr[2] "Ve zprávě není hlavička s podpisem, ale tělo zprávy má %u bajtů" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Nelze zrušit serializaci zprávy: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -931,40 +968,40 @@ msgstr "" "Chyba při serializaci GVariant s řetězcem typu „%s“ do přenosového formátu D-" "Bus" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Počet popisovačů souborů ve zprávě (%d) se liší od pole v hlavičce (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Nelze serializovat zprávu: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Tělo zprávy má podpis „%s“, ale záhlaví s podpisem neexistuje" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" msgstr "Tělo zprávy má podpis typu „%s“, ale podpis v poli se záhlavím je „%s“" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Tělo zprávy je prázdné, ale podpis v poli se záhlavím je „(%s)“" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Navrácena chyba s tělem typu „%s“" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Navrácena chyba s prázdným tělem" @@ -984,22 +1021,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Nelze získat profil hardwaru: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Nelze načíst %s: %s" -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Chyba při volání StartServiceByName pro %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Neočekávaná odpověď %d od metody StartServiceByName(„%s“)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1008,25 +1045,25 @@ msgstr "" "Metodu nelze vyvolat; proxy je na dobře známý název %s bez vlastníka a proxy " "byla vytvořena s příznakem G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstraktní jmenný prostor není podporován" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Při vytváření serveru nelze určit soubor nonce" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Chyba při zápisu souboru nonce na „%s“: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Řetězec „%s“ není platné D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Nelze naslouchat na nepodporovaném přenosu „%s“" @@ -1319,71 +1356,72 @@ msgstr "Chyba: %s není platným oficiálně známým názvem sběrnice.\n" msgid "Not authorized to change debug settings" msgstr "Neautorizováno ke změnám ladicích nastavení" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Bez názvu" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "V souboru .desktop není určeno pole Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Nezdařilo se najít terminál vyžadovaný pro aplikaci" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Program „%s“ nebyl nalezent v cestách podle $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Nezdařilo se vytvořit složku %s s uživatelským nastavením aplikace: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nezdařilo se vytvořit složku %s s uživatelským nastavením MIME: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Informace o aplikaci postrádá identifikátor" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nezdařilo se vytvořit uživatelský soubor .desktop %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Vlastní definice %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "mechanika neumí vysouvání" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "mechanika neumí vysouvací funkce eject nebo eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "mechanika neumí dotazování na média" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "mechanika neumí spuštění" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "mechanika neumí zastavení" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "Knihovna TLS neimplementuje zjišťování vazeb TLS" @@ -1396,27 +1434,27 @@ msgstr "Podpora TLS není dostupná" msgid "DTLS support is not available" msgstr "Podpora DTLS není dostupná" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Nelze zpracovat verzi %d kódování GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Chybný počet tokenů (%d) v kódování GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Nelze zpracovat verzi %d kódování GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Chybný počet tokenů (%d) v kódování GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Očekáváno GEmblem u GEmblemedIcon" @@ -1424,130 +1462,136 @@ msgstr "Očekáváno GEmblem u GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Obsahující připojené neexistuje" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Nelze kopírovat nad složku" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Nelze kopírovat složku nad složku" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Cílový soubor existuje" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Složku nelze kopírovat rekurzivně" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Rozsah kopírování souborů není podporován" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Chyba při spojování souboru: %s" # For splice(), see http://en.wikipedia.org/w/index.php?title=Splice_(system_call)&oldid=334434835 -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "splice() není podporováno" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Kopírování (reflink/clone) mezi připojeními není podporováno" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopírování (reflink/clone) není podporováno nebo je neplatné" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopírování (reflink/clone) není podporováno nebo neproběhlo správně" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, fuzzy, c-format +#| msgid "Unset given attribute" +msgid "Cannot retrieve attribute %s" +msgstr "Zrušit nastavení zadaného atributu" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Nelze kopírovat zvláštní soubor" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Zadaný symbolický odkaz je neplatný" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2404 msgid "Symbolic links not supported" msgstr "Symbolické odkazy nejsou podporovány" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Zahozené není podporováno" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Názvy souborů nemohou obsahovat „%c“" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Selhalo vytvoření dočasné složky pro šablonu „%s“: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "svazek neumí připojení" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Žádná aplikace není zaregistrována k obsluze tohoto souboru" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator je uzavřen" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Souborový enumerator má nevykonanou operaci" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Souborový enumerator je již uzavřen" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Nelze zpracovat verzi %d kódování GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Chybná vstupní data u GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Datový proud nepodporuje query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Posouvání není v datovém proudu podporováno" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Oříznutí není možné ve vstupním datovém proudu" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Oříznutí není v datovém proudu podporováno" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Neplatný název počítače" @@ -1580,64 +1624,64 @@ msgstr "Odpověď z HTTP proxy je příliš velká" msgid "HTTP proxy server closed connection unexpectedly." msgstr "Server HTTP proxy neočekávaně ukončil spojení." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Chybný počet tokenů (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Název třídy %s nemá typ" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Typ %s neimplementuje rozhraní GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Typ %s není mezi třídami" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Chybné číslo verze: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Typ %s neimplementuje from_tokens() v rozhraní GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Nelze zpracovat poskytnutou verzi kódování ikony" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Není zadána žádná adresa" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Délka %u je pro adresu příliš dlouhá" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adresa má nastavené bity za hranicí danou prefixem délky" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Nelze zpracovat „%s“ jak masku adresy IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Adresa soketu nemá dostatek místa" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Nepodporovaná adresa soketu" @@ -1651,7 +1695,7 @@ msgstr "Vstupní datový proud neumí čtení" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Proud má otevřenou operaci" @@ -1667,7 +1711,7 @@ msgstr "Zachovat u souboru, když je přesunut" msgid "“version” takes no arguments" msgstr "„version“ nepřebírá žádné argumenty" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Použití:" @@ -1675,79 +1719,79 @@ msgstr "Použití:" msgid "Print version information and exit." msgstr "Vypsat informace o verzi a skončit." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Příkazy:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Spojit soubory do standardního výstupu" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopírovat jeden nebo více souborů" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Zobrazit informace o umístěních" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Spustit aplikaci ze souboru .desktop" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Vypsat obsah umístění" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Vypsat nebo nastavit obsluhu pro typ MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Vytvořit složky" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Sledovat soubory a složky ohledně změn" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Připojit nebo odpojit umístění" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Přesunout jeden nebo více souborů" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Otevřít soubory pomocí výchozí aplikace" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Přejmenovat soubor" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Smazat jeden nebo více souborů" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Číst a ukládat ze standardního vstupu" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Nastavit atribut souboru" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Přesunout soubory nebo složky do koše" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Vypsat obsah umístění ve stromu" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Příkazy:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Podrobnou nápovědu získáte spuštěním %s.\n" @@ -1757,7 +1801,7 @@ msgid "Error writing to stdout" msgstr "Chyba při zápisu do standardního výstupu" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1780,60 +1824,66 @@ msgstr "" "lokálních souborů používá umístění GIO: například můžete pro umístění\n" "použít něco jako smb://server/cesta/soubor.txt" -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Nebylo zadáno žádné umístění" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Nebyla zadána žádná cílová složka" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Zobrazovat průběh" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Před přepsáním se dotázat" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Zachovat všechny atributy" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Zálohovat stávající cílové soubory" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Nenásledovat symbolické odkazy" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Používat pro tento cíl výchozí oprávnění" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +#, fuzzy +#| msgid "Use default permissions for the destination" +msgid "Use default file modification timestamps for the destination" +msgstr "Používat pro tento cíl výchozí oprávnění" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Přeneseno %s z %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ZDROJ" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "CÍL" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopírovat jeden nebo více souborů ze ZDROJE do CÍLE." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1843,12 +1893,12 @@ msgstr "" "namísto lokálních souborů umístění GIO: například můžete pro umístění\n" "použít něco jako smb://server/cesta/soubor.txt." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Cíl %s není složka" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: přepsat „%s“?" @@ -1889,52 +1939,52 @@ msgstr "zobrazovaný název: %s\n" msgid "edit name: %s\n" msgstr "název pro úpravy: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "název: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "typ: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "velikost: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "skrytý\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "adresa uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "místní cesta: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "připojené unixové svazky: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Nastavitelné atributy:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Jmenné prostory zapisovatelných atributů:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Zobrazit informace o umístění" -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -3049,125 +3099,125 @@ msgstr "Chyba při získávání informace o souborovém systému pro %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Přípojení obsahující soubor %s nebylo nalezen" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Nelze přejmenovat kořenovou složku" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Chyba při přejmenovávání souboru %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Soubor nelze přejmenovat, název souboru již existuje" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Neplatný název souboru" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Chyba při otevírání souboru %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Chyba při odstraňování souboru %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Chyba při zahazování souboru %s do koše: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Nelze vytvořit složku koše %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nezdařilo se najít složku nejvyšší úrovně pro vyhození %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "Přesouvání do koše na svazku připojeném interně systémem není podporováno" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Nezdařilo se najít nebo vytvořit složku koše %s pro vyhození %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Nelze vytvořit informační soubor o koši pro %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Nelze zahodit soubor %s do koše mimo hranice souborového systému" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nelze zahodit soubor %s do koše: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Nelze zahodit soubor %s do koše" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Chyba při vytváření složky %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Systém souborů nepodporuje symbolické odkazy" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Chyba při vytváření symbolického odkazu %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Chyba při přesunování souboru %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Složku nelze přesunout nad složku" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Vytvoření záložního souboru selhalo" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Chyba při odstraňování cílového souboru: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Přesunování mezi připojeními není podporováno" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nelze zjistit využití disku %s: %s" @@ -3189,117 +3239,117 @@ msgstr "Neplatný název rozšířeného atributu" msgid "Error setting extended attribute “%s”: %s" msgstr "Chyba při nastavování rozšířeného atributu „%s“: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (neplatné kódování)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Chyba při získávání informací pro soubor „%s“: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Chyba při získávání informací pro popisovače souboru: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Neplatný typ atributu (očekáván uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Neplatný typ atributu (očekáván uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Neplatný typ atributu (očekáván bajtový řetězec)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Nelze nastavit oprávnění na symbolických odkazech" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Chyba při nastavování oprávnění: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Chyba při nastavování vlastníka: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symbolický odkaz nesmí být prázdný" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Chyba při nastavování symbolického odkazu: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "Chyba při nastavování symbolického odkazu: soubor není symbolickým odkazem" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Dodatečné nanosekundy %d pro UNIXové časové razítko %lld jsou záporné." -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "Dodatečné nanosekundy %d pro UNIXové časové razítko %lld dosáhly 1 sekundy." -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIXové časové razítko %lld se nevleze do 64 bitů." -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIXové časové razítko %lld je mimo rozsah podporovaný Windows." -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Název souboru „%s“ se nezdařilo převést do UTF-16." -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Soubor „%s“ se nezdařilo otevřít: chyba Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Chyba při nastavování času změny nebo přístupu u souboru „%s“: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Chyba při nastavování času změny nebo přístupu: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "Kontext SELinux nesmí být prázdný." -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "V tomto systému není SELinux povolen" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Chyba při nastavování kontextu SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Nastavení atributu %s není podporováno" @@ -3352,7 +3402,7 @@ msgid "Error truncating file: %s" msgstr "Chyba při zkracování souboru: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Chyba při otevírání souboru %s: %s" @@ -3374,27 +3424,27 @@ msgstr "Soubor byl externě pozměněn" msgid "Error removing old file: %s" msgstr "Chyba při odstraňování starého souboru: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Poskytnut neplatný GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Neplatný požadavek na hledání" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Nelze zkrátit GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Nelze měnit velikost výstupního proudu paměti" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Nelze změnit velikost výstupního proudu paměti" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3402,32 +3452,32 @@ msgstr "" "Velikost paměti potřebná ke zpracování zápisu je větší než dostupný adresní " "prostor" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Požadováno hledání před počátkem proudu" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Požadováno hledání za ukončením proudu" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "připojené neprovádí odpojovací operaci „unmount“" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "připojené neumí vysouvací operaci „eject“" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "připojené neumí odpojovací operaci „unmount“ nebo „unmount_with_operation“" @@ -3435,41 +3485,41 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "připojené neumí vysouvací operaci „eject“ nebo „eject_with_operation“" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "připojené neumí operaci opakovaného připojení „remount“" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "připojené neumí odhad typu obsahu" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "připojené neumí synchronní odhad typu obsahu" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Název počítače „%s“ obsahuje „[“, ale nikoliv „]“" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Síť není dostupná" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Počítač není dostupný" @@ -3497,7 +3547,7 @@ msgstr "NetworkManager neběží" msgid "NetworkManager version too old" msgstr "NetworkManager je v příliš staré verzi" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Výstupní datový proud neumí zápis" @@ -3510,38 +3560,38 @@ msgstr "Součet vektorů předaných do %s je příliš velký" msgid "Source stream is already closed" msgstr "Zdrojový proud je již ukončen" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Blíže neurčené selhání vyhledávání v proxy" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Chyba při řešení „%s“: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "Funkce %s není implementovaná" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Neplatná doména" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Prostředek v „%s“ neexistuje" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Selhala dekomprimace prostředku v „%s“" @@ -3559,11 +3609,11 @@ msgstr "Prostředek v „%s“ není složka" msgid "Input stream doesn’t implement seek" msgstr "Vstupní datový proud neumí přeskakování" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Vypsat oddíly obsahující prostředky v SOUBORU ve formátu elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3573,15 +3623,15 @@ msgstr "" "Je-li zadán ODDÍL, jsou vypsány pouze prostředky v tomto oddíle\n" "Je-li zadána CESTA, jsou vypsány jen odpovídající prostředky" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "SOUBOR [CESTA]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "ODDÍL" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3593,15 +3643,15 @@ msgstr "" "Je-li zadána CESTA, jsou vypsány jen odpovídající prostředky\n" "Podrobnosti zahrnují oddíl, velikost a komprimaci" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Vybalit prostředky ze souboru na standardní výstup" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "SOUBOR CESTA" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3629,7 +3679,7 @@ msgstr "" "Další informace získáte zadáním „gresource help PŘÍKAZ“.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3644,20 +3694,20 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " ODDÍL (Volitelný) název oddílu elf\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " PŘÍKAZ (Volitelný) příkaz, který má být popsán\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" " SOUBOR Soubor ve formátu elf (spustitelný nebo sdílená knihovna)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3665,19 +3715,19 @@ msgstr "" " SOUBOR Soubor ve formátu elf (spustitelný nebo sdílená knihovna)\n" " nebo přeložený soubor prostředků\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[CESTA]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " CESTA (Volitelná) cesta k prostředku (může být neúplná)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "CESTA" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " CESTA Cesta k prostředku\n" @@ -3908,215 +3958,215 @@ msgstr "Poskytnut prázdný název schématu\n" msgid "No such key “%s”\n" msgstr "Klíč „%s“ neexistuje\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Neplatný soket, nebyl spuštěn" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Neplatný soket, spuštění selhalo kvůli: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Soket je již ukončen" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1445 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Časový limit V/V soketu vypršel" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "vytváří se GSocket z fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Nelze vytvořit soket: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Byla zadána neznámá rodina" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Byl zadán neznámý protokol" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Nelze používat datagramové operace na nedatagramovém soketu." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Nelze používat datagramové operace na soketu s nastaveným časovým limitem." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "nezdařilo se získat místní adresu: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "nezdařilo se získat vzdálenou adresu: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "nezdařilo se naslouchání: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Chyba při navázání na adresu %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Chyba připojování ke skupině hromadného vysílání: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Chyba při opouštění skupiny hromadného vysílání: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Není podpora pro hromadné vysílání určené zdrojem" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Nepodporovaná rodina soketů" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "určení zdroje není adresa IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Název rozhraní je příliš dlouhý" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Rozhraní nebylo nalezeno: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Není podpora pro hromadné vysílání určené zdrojem IPv4" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Není podpora pro hromadné vysílání určené zdrojem IPv6" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Chyba při přijímání spojení: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Probíhá spojení" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Nelze získat nevyřízenou chybu: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Chyba při získávání dat: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Chyba při odesílání dat: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Nelze ukončit soket: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Chyba při zavírání soketu: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Čeká se na stav soketu: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Nezdařilo se odeslat zprávu: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Vektory zprávy jsou příliš rozsáhlé" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Chyba při odesílání zprávy: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage nepodporováno na Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Chyba při získávání zprávy: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nelze číst pověření k soketu: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials není u tohoto OS implementováno" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Nelze se připojit k serveru proxy %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Nelze se připojit k %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Nelze se připojit: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "Není podporován pokus o proxy přes spojení, které není založeno na TCP." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Protokol proxy „%s“ není podporován." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Naslouchající je již uzavřen" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Přidaný soket je uzavřen" @@ -4206,94 +4256,94 @@ msgstr "SOCKSv5 proxy nepodporuje poskytnutý typ adresy." msgid "Unknown SOCKSv5 proxy error." msgstr "Neznámá chyba SOCKSv5 proxy." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Selhalo vytvoření roury ke komunikaci s procesem potomka (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Roury nejsou na této platformě podporovány" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Nelze zpracovat verzi %d kódování GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Nebyly nalezeny žádné platné adresy" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Chyba při reverzním řešení „%s“: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Chyba při zpracování záznamu %s z DNS: poškozený paket DNS" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Záznam DNS požadovaného typu pro „%s“ neexistuje" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Dočasně není možné vyřešit „%s“" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Chyba při řešení „%s“" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Poškozený paket DNS" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Selhalo zpracování odpovědi DNS pro „%s“: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Nebyl nalezen žádný soukromý klíč kódovaný jako PEM." -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Nelze dešifrovat soukromý klíč kódovaný jako PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Nezdařilo se analyzovat soukromý klíč kódovaný jako PEM." -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Nebyl nalezen žádný certifikát kódovaný jako PEM." -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Nezdařilo se analyzovat certifikát kódovaný jako PEM." -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Tato knihovna TLS nepodporuje PKCS #12." -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Tento GTlsBackend nepodporuje vytváření certifikátů PKCS #11." -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4303,7 +4353,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4311,15 +4361,15 @@ msgstr "" "Několik předešlých hesel nebylo zadáno správně a po dalším nesprávně zadaném " "hesle bude přístup zablokován." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Zadané heslo není správné." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Odesílání popisovače souboru není podporováno" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4327,11 +4377,11 @@ msgstr[0] "Očekávána 1 ovládací zpráva, získána %d" msgstr[1] "Očekávána 1 ovládací zpráva, získány %d" msgstr[2] "Očekávána 1 ovládací zpráva, získáno %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Neočekávaný typ pomocných dat" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4339,111 +4389,122 @@ msgstr[0] "Očekáváno jedno fd, ale získána %d\n" msgstr[1] "Očekáváno jedno fd, ale získány %d\n" msgstr[2] "Očekáváno jedno fd, ale získáno %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Přijat neplatný popisovač souboru" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Přijímání popisovače souboru není podporováno" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Chyba při odesílání přihlašovacích údajů: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Chyba při kontrole, zda je SO_PASSCRED povoleno u soketu: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Chyba při povolování SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "U odeslání přihlašovacích údajů očekáváno přečtení jednoho bajtu, ale " "přečteno nula bajtů" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Ovládací zpráva nebyla očekávána, ale obdrženo %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Chyba při zakazování SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Chyba při čtení z popisovače souboru: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Chyba při zavírání popisovače souboru: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Kořen systému souborů" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Chyba při zápisu do popisovače souboru: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "V tomto systému nejsou podporovány abstraktní adresy soketů domén UNIX" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "svazek neumí vysouvací operaci eject" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "svazek neumí vysouvací operaci eject nebo eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Chyba při čtení z obsluhy: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Chyba při zavírání obsluhy: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Chyba při zápisu do obsluhy: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Nedostatek paměti" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Vnitřní chyba: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Vyžadováno více na vstupu" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Neplatná komprimovaná data" @@ -4471,150 +4532,308 @@ msgstr "Spustit službu dbus" msgid "Wrong args\n" msgstr "Nesprávné argumenty\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, fuzzy, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to open ‘%s’: %s" +msgstr "Nelze otevřít soubor „%s“: %s" + +#: girepository/compiler/compiler.c:103 +#, fuzzy, c-format +#| msgid "Could not create network monitor: %s" +msgid "Error: Could not write the whole output: %s" +msgstr "Nelze vytvořit sledování sítě: %s" + +#: girepository/compiler/compiler.c:115 +#, fuzzy, c-format +#| msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Nelze přejmenovat soubor „%s“ na „%s“: funkce g_rename() selhala: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:52 +msgid "Include directories in GIR search path" +msgstr "" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:51 +msgid "Output file" +msgstr "Výstupní soubor" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Sdílená knihovna" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Zobrazit ladicí zprávy" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Zobrazit podrobné zprávy" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:54 +msgid "Show program’s version number and exit" +msgstr "Zobrazit číslo verze programu a skončit" + +#: girepository/compiler/compiler.c:174 +#, fuzzy, c-format +#| msgid "Error parsing parameter %d: %s\n" +msgid "Error parsing arguments: %s" +msgstr "Chyba při analyzování parametru %d: %s\n" + +#: girepository/compiler/compiler.c:201 +msgid "Please specify exactly one input file" +msgstr "Uveďte prosím přesně jeden vstupní soubor" + +#: girepository/compiler/compiler.c:217 +#, fuzzy, c-format +#| msgid "Error opening file “%s”: %s" +msgid "Error parsing file ‘%s’: %s" +msgstr "Chyba při otevírání souboru %s: %s" + +#: girepository/compiler/compiler.c:242 +#, fuzzy, c-format +#| msgid "Failed to load info for handler “%s”" +msgid "Failed to build typelib for module ‘%s’" +msgstr "Selhalo načtení informací pro obsluhu „%s“" + +#: girepository/compiler/compiler.c:244 +#, fuzzy, c-format +#| msgid "Unable to load ‘%s‘: %s" +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Nezdařilo se načíst „%s“: %s" + +#: girepository/decompiler/decompiler.c:53 +#, fuzzy +#| msgid "Show extra information" +msgid "Show all available information" +msgstr "Zobrazit doplňující informace" + +#: girepository/decompiler/decompiler.c:67 +#, fuzzy, c-format +#| msgid "Failed to fork (%s)" +msgid "Failed to parse: %s" +msgstr "Selhalo rozvětvení procesu (%s)" + +#: girepository/decompiler/decompiler.c:83 +#, fuzzy +#| msgid "Show hidden files" +msgid "No input files" +msgstr "Zobrazit skryté soubory" + +#: girepository/decompiler/decompiler.c:109 +#, fuzzy, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to read ‘%s’: %s" +msgstr "Nelze vytvořit soubor „%s“: %s" + +#: girepository/decompiler/decompiler.c:121 +#, fuzzy, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Nelze vytvořit soubor „%s“: %s" + +#: girepository/decompiler/decompiler.c:125 +#: girepository/inspector/inspector.c:113 +#, fuzzy, c-format +#| msgid "Failed to allocate memory" +msgid "Failed to load typelib: %s" +msgstr "Nelze alokovat paměť" + +#: girepository/decompiler/decompiler.c:132 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERZE" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:75 +#, fuzzy +#| msgid "The attributes to get" +msgid "The typelib to inspect" +msgstr "Atributy, které se mají vypsat" + +#: girepository/inspector/inspector.c:75 +#, fuzzy +#| msgid "NAME" +msgid "NAMESPACE" +msgstr "NÁZEV" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "" + +#: girepository/inspector/inspector.c:86 +#, fuzzy, c-format +#| msgid "Failed to read from file “%s”: %s" +msgid "Failed to parse command line options: %s" +msgstr "Chyba při čtení ze souboru „%s“: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Neočekávaný atribut „%s“ prvku „%s“" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atribut „%s“ prvku „%s“ nebyl nalezen" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Neočekávaná značka „%s“, byla očekávána značka „%s“" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Neočekávaná značka „%s“ v „%s“" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Neplatné datum/čas „%s“ v souboru se záložkami" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "V datových složkách nebyl nalezen platný soubor záložek" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Záložka URI „%s“ již existuje" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nebyla nalezena záložka URI „%s“" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "V záložce URI „%s“ není definován žádný typ MIME" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "V záložce URI „%s“ nebyl definován žádný soukromý příznak" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "V záložce URI „%s“ nejsou nastavené žádné skupiny" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Žádná aplikace s názvem „%s“ nezaregistrovala záložku „%s“" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Nelze rozšířit řádek exec „%s“ pomocí URI „%s“" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Nereprezentovatelný znak na vstupu převodu" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Částečná posloupnost znaků na konci vstupu" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Nelze převést zálohu „%s“ do znakové sady „%s“" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Vležený nulový bajt na vstupu převodu" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Vložený nulový bajt na výstupu převodu" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "Adresa URI „%s“ není absolutní URI používající schéma „file“" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "Adresa URI „%s“ je neplatné" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Název počítače v adrese URI „%s“ je neplatný" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI „%s“ obsahuje nesprávně změněné znaky" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Název cesty „%s“ není absolutní cestou" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %-d. %B %Y, %H:%M:%S %Z" # This might be e.g. %Y-%m-%d or %e. %m. %Y as well. See also http://prirucka.ujc.cas.cz/?id=810. #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%Y" # This might be e.g. %k:%M:%S or %k.%M.%S as well. See also http://prirucka.ujc.cas.cz/?id=820. #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S" @@ -4635,62 +4854,62 @@ msgstr "%I:%M:%S" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "leden" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "únor" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "březen" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "duben" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "květen" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "červen" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "červenec" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "srpen" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "září" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "říjen" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "listopad" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "prosinec" @@ -4712,134 +4931,134 @@ msgstr "prosinec" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "led" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "úno" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "bře" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "dub" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "kvě" # Might be e.g. "čer" as well. -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "čen" # Might be e.g. "čvc" as well. -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "čec" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "srp" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "zář" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "říj" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "lis" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "pro" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "pondělí" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "úterý" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "středa" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "čtvrtek" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "pátek" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "sobota" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "neděle" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "po" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "út" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "st" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "čt" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "pá" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "so" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "ne" @@ -4861,62 +5080,62 @@ msgstr "ne" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "ledna" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "února" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "března" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "dubna" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "května" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "června" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "července" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "srpna" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "září" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "října" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "listopadu" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "prosince" @@ -4938,193 +5157,210 @@ msgstr "prosince" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "led" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "úno" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "bře" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "dub" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "kvě" # Might be e.g. "čer" as well. -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "čen" # Might be e.g. "čvc" as well. -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "čec" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "srp" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "zář" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "říj" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "lis" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "pro" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "dop." #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "odp." -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Chyba při otevírání složky „%s“: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Nelze alokovat %lu bajtů k přečtení souboru „%s“" -msgstr[1] "Nelze alokovat %lu bajty k přečtení souboru „%s“" -msgstr[2] "Nelze alokovat %lu bajtů k přečtení souboru „%s“" +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 +#, fuzzy, c-format +#| msgid "Could not allocate %lu byte to read file “%s”" +#| msgid_plural "Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "Nelze alokovat %lu bajtů k přečtení souboru „%s“" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Chyba čtení souboru „%s“: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Soubor „%s“ je příliš velký" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:825 +#, fuzzy +#| msgid "Could not connect: " +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Nelze se připojit: " +msgstr[1] "Nelze se připojit: " +msgstr[2] "Nelze se připojit: " + +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Chyba při čtení ze souboru „%s“: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:900 glib/gfileutils.c:975 glib/gfileutils.c:1482 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Nelze otevřít soubor „%s“: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:913 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Nelze získat atributy souboru „%s“: funkce fstat() selhala: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:944 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Nelze otevřít soubor „%s“: funkce fdopen() selhala: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1045 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Nelze přejmenovat soubor „%s“ na „%s“: funkce g_rename() selhala: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1144 +#, fuzzy, c-format +#| msgid "Failed to write file “%s”: write() failed: %s" +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Nelze zapisovat do souboru „%s“: funkce write() selhala: %s" + +#: glib/gfileutils.c:1189 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Nelze zapisovat do souboru „%s“: funkce write() selhala: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1210 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Nelze zapisovat do souboru „%s“: funkce fsync() selhala: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1371 glib/gfileutils.c:1788 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Nelze vytvořit soubor „%s“: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1416 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Existující soubor „%s“ nelze odstranit: funkce g_unlink() selhala: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1753 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Šablona „%s“ je neplatná, neměla by obsahovat „%s“" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1766 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Šablona „%s“ neobsahuje XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2360 glib/gfileutils.c:2389 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Nelze přečíst symbolický odkaz „%s“: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Nelze otevřít převodník z „%s“ do „%s“: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Nelze přímo číst v g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Ve vstupní vyrovnávací paměti zbyla nepřevedená data" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanál ukončen částí znaku" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Nelze přímo číst v g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "V složkách hledání nelze najít platný soubor klíče" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Není obyčejným souborem" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5132,50 +5368,50 @@ msgstr "" "Soubor klíče obsahuje „%s“, což není dvojice klíč-hodnota, skupina ani " "komentář" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Neplatný název skupiny: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Soubor klíče nezačíná skupinou" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Neplatný název klíče: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Soubor klíče obsahuje nepodporované kódování „%s“" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Soubor klíče nemá skupinu „%s“" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Soubor klíče nemá klíč „%s“ ve skupině „%s“" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Soubor klíče obsahuje klíč „%s“ s hodnotou „%s“, která není v UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Soubor klíče obsahuje klíč „%s“, který má neinterpretovatelnou hodnotu." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5184,36 +5420,36 @@ msgstr "" "Soubor klíče obsahuje klíč „%s“ ve skupině „%s“, který má " "neinterpretovatelnou hodnotu." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Klíč „%s“ ve skupině „%s“ má hodnotu „%s“, když byla očekávána „%s“" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Soubor klíče obsahuje na konci řádku znak změny" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Soubor klíče obsahuje neplatnou únikovou sekvenci „%s“" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Hodnotu „%s“ nelze interpretovat jako číslo." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Celočíselná hodnota „%s“ je mimo rozsah" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Hodnotu „%s“ nelze interpretovat jako reálné (plovoucí) číslo." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Hodnotu „%s“ nelze interpretovat jako pravdivostní hodnotu." @@ -5234,32 +5470,32 @@ msgstr "Selhalo namapování „%s%s%s%s“: selhala funkce mmap(): %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Selhalo otevření souboru „%s“: selhala funkce open(): %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Chyba na řádku %d, znak %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "V názvu je neplatný text v kódování UTF-8 – platné není „%s“" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "„%s“ není platným názvem" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "„%s“ není platným názvem: „%c“" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Chyba na řádku %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5268,7 +5504,7 @@ msgstr "" "Nelze zpracovat „%-.*s“, což by mělo být číslo v znakové entitě (například " "ê) – číslo je možná příliš velké" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5277,24 +5513,24 @@ msgstr "" "Znaková entita nekončí středníkem; pravděpodobně jste použili znak & bez " "úmyslu začít entitu – zapište prosím ligaturu et jako &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Znaková entita „%-.*s“ nekóduje povolený znak" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Nalezena prázdná entita „&;“, platnými entitami jsou: & " < > " "'" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Název entity „%-.*s“ není znám" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5302,18 +5538,18 @@ msgstr "" "Entita nekončí středníkem; pravděpodobně jste použili znak & bez úmyslu " "začít entitu – zapište prosím ligaturu et jako &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokument musí začínat prvkem (například: )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "„%s“ není platný znak po znaku „<“; nesmí jím začínat název prvku" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5322,19 +5558,19 @@ msgstr "" "Nezapadající znak „%s“, byl očekáván znak „>“ k ukončení značky empty-" "element „%s“" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Příliš mnoho atributů v prvku „%s“" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "Nezapadající znak „%s“, po názvu atributu „%s“ prvku „%s“ bylo očekáváno „=“" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5345,7 +5581,7 @@ msgstr "" "značky prvku „%s“, nebo případně atribut; pravděpodobně jste použili " "neplatný znak v názvu atributu" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5354,7 +5590,7 @@ msgstr "" "Nezapadající znak „%s“, po znaku rovnítka při udávání hodnoty atributu „%s“ " "prvku „%s“ byly očekávány uvozovky" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters ““" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Prvek „%s“ byl uzavřen, žádný prvek není momentálně otevřený" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Prvek „%s“ byl uzavřen, ale aktuálně je otevřený prvek „%s“" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokument je prázdný nebo obsahuje pouze mezery" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokument neočekávaně skončil ihned po otevírací značce „<“" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5398,7 +5634,7 @@ msgstr "" "Dokument neočekávaně skončil s otevřenými prvky – poslední otevřený prvek " "byl „%s“" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5406,19 +5642,19 @@ msgid "" msgstr "" "Dokument neočekávaně skončil, byla očekávána uzavírací závorka značky <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokument neočekávaně skončil uvnitř názvu prvku" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokument neočekávaně skončil uvnitř názvu atributu" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokument neočekávaně skončil ve značce otevírající prvek." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5426,262 +5662,262 @@ msgstr "" "Dokument neočekávaně skončil po znaku přiřazení následujícím za názvem " "atributu; chybí hodnota atributu" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokument neočekávaně skončil uvnitř hodnoty atributu" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokument neočekávaně skončil uvnitř uzavírací značky prvku „%s“" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Dokument neočekávaně skončil uvnitř uzavírací značky neotevřeného prvku" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokument neočekávaně skončil uvnitř komentáře nebo instrukce pro zpracování" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[PŘEPÍNAČ…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Přepínače nápovědy:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Zobrazit přepínače nápovědy" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Zobrazit všechny přepínače nápovědy" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Přepínače aplikace:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Přepínače:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nelze zpracovat celočíselnou hodnotu „%s“ u %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Celočíselná hodnota „%s“ pro %s je mimo rozsah" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "" "Nelze zpracovat reálnou hodnotu s dvojitou přesností (double) „%s“ u %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "" "Reálná hodnota s dvojitou přesností (double) „%s“ pro %s je mimo rozsah" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Chyba volby %s při syntaktické analýze" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Chybí parametr %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Neznámý přepínač %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "poškozený objekt" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "nedostatek paměti" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "vnitřní chyba" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "vzorek obsahuje položky nepodporované u částečného porovnávání" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "zpětné odkazy coby podmínky nejsou podporované u částečného porovnávání" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "dosažen limit rekurze" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "chybný offset" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekurzivní smyčka" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "je požadován příslušný režim, který ale nebyl zkompilován pro JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "neznámá chyba" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ na konci vzorku" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c na konci vzorku" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "nerozpoznaný znak následuje po \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "čísla v {} quantifier nejsou v pořádku" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "číslo v {} quantifier je příliš vysoké" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "schází koncový znak ] znakové třídy" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "neplatná posloupnost pro změnu ve znakové třídě" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "rozsah ve znakové třídě není v pořádku" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nic k opakování" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "nerozpoznaný znak po (? nebo (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "třídy nazvané po POSIX nejsou uvnitř třídy podporovány" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "Porovnávací prvky POSIX nejsou podporovány" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "schází koncový znak )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "odkaz na neexistující podřazený vzorek" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "po komentáři schází znak )" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "regulární výraz je příliš dlouhý" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "nesprávně utvořené číslo nebo název po (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "zpětný výrok není pevné délky" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "podmínková skupina obsahuje více než dvě větve" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "po (?( očekáván výrok" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "číslovaná reference nesmí být nula" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "neplatný název třídy POSIX" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "znaková hodnota v posloupnosti \\x{…} je příliš vysoká" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C není dovoleno ve zpětném výroku" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "schází ukončovací člen v názvu podřazeného vzorku" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dva nazvané podřazené vzorky mají stejný název" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "chybně utvořená posloupnost \\P nebo \\p" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "neznámý název vlastnosti po \\P či \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "název podřazeného vzorku je příliš dlouhý (maximem je 32 znaků)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "příliš mnoho nazvaných podřazených vzorků (maximem je 10 000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "osmičková hodnota je větší než \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "skupina DEFINE obsahuje více než jednu větev" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "neslučitelné volby NEWLINE" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5689,233 +5925,233 @@ msgstr "" "po \\g nenásleduje název nebo číslo ve složené nebo lomené závorce nebo v " "uvozovkách, nebo nenulové číslo" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "argument není povolen u (*ACCEPT), (*FAIL) nebo (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) nerozpoznáno" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "číslo je příliš velké" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "schází název podřazeného vzorku po (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "rozdílné názvy podřazených vzorků stejného čísla nejsou povoleny" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) musí mít argument" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "po \\c nesmí následovat znak ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "po \\k nenásleduje název ve složené nebo lomné závorce nebo v uvozovkách" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N není podporováno ve třídě" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "název je příliš dlouhý v (*MARK), (*PRUNE), (*SKIP) nebo (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "přetečení kódu" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "nerozpoznaný znak pře (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "přetečení přijímaných informací překládaného pracovního prostoru" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "v předchozím kroku kontrolovaný odkazovaný podřazený vzorek nenalezen" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Chyba při porovnávání regulárního výrazu %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "Knihovna PCRE byla přeložena bez podpory UTF-8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "Knihovna PCRE je přeložena s nekompatibilními volbami" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Chyba při kompilaci regulárního výrazu „%s“ na znaku %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "očekávána šestnáctková číslice nebo „}“" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "očekávána šestnáctková číslice" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "v symbolickém odkazu chybí „<“" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "neukončený symbolický odkaz" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "symbolický odkaz o nulové délce" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "očekávána číslice" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "nedovolený symbolický odkaz" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "osamocené koncové „\\“" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "neznámá úniková sekvence" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Chyba při zpracování náhradního textu „%s“ na znaku %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Text v uvozovkách nezačíná uvozovkami" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Nenalezena uzavírací uvozovka v příkazovém řádku nebo jiném uvozeném textu" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Text skončil právě za znakem „\\“. (Text zněl „%s“)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Text skončil před nalezením odpovídajících uvozovek znakem %c. (Text zněl " "„%s“)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Text je prázdný (nebo obsahuje pouze mezery)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nelze číst data z procesu potomka (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Neočekávaná chyba při čtení dat z procesu potomka (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Neočekávaná chyba v waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Proces potomka skončil s kódem %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Proces potomka byl zabit signálem %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Proces potomka byl zastaven signálem %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Proces potomka neskončil normálně" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Selhalo čtení z roury potomka (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Selhalo zplození procesu potomka „%s“ (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Selhalo rozvětvení procesu (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Selhal přechod do složky „%s“ (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Selhalo spuštění procesu potomka „%s“ (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Selhalo otevření souboru pro přemapování popisovače souboru (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Selhalo zduplikování popisovače souboru pro proces potomka (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Selhalo rozvětvení procesu potomka (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Selhalo zavření popisovače souboru pro proces potomka (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Neznámá chyba při běhu procesu potomka „%s“" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Nezdařilo se přečíst dostatek dat z roury pid potomka (%s)" @@ -5971,78 +6207,78 @@ msgid "" msgstr "" "Neočekávaná chyba v g_io_channel_win32_poll() při čtení dat z procesu potomka" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Prázdný řetězec není číslo" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "„%s“ není číslo se znaménkem" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Číslo „%s“ je mimo meze [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "„%s“ není číslo bez znaménka" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Neplatné kódování pomocí % v adrese URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Neplatný znak v adrese URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Znak mimo standard UTF-8 v adrese URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Neplatná adresa IPv6 „%.*s“ v adrese URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Neplatná zakódovaná adresa IP „%.*s“ v adrese URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Neplatná internacionalizace názvu hostitele „%.*s“ v adrese URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Nezdařilo se zpracovat port „%.*s“ v adrese URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Port „%.*s“ v adrese URI je mimo rozsah" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "Adresa URI „%s“ není absolutní" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "Adresa URI „%s“ nemá část s hostitelem" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "Adresa URI není absolutní a není poskytnuta žádná základní URI" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Schází „=“ a hodnota parametru" @@ -6123,65 +6359,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "" #: glib/gutils.c:3056 msgid "byte" @@ -6291,6 +6527,48 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Zpráva METHOD_RETURN: pole se záhlavím REPLY_SERIAL schází nebo je " +#~ "neplatné" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "GApplication options" #~ msgstr "Volby GApplication" diff --git a/po/en_GB.po b/po/en_GB.po index 7316cb9..3f6a578 100644 --- a/po/en_GB.po +++ b/po/en_GB.po @@ -4,22 +4,23 @@ # Gareth Owen 2004 # Philip Withnall , 2010. # Zander Brown , 2019-2021. -# Bruce Cowan , 2009-2023. +# Bruce Cowan , 2009-2024. +# Andi Chandler , 2024. # msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 11:01+0000\n" -"PO-Revision-Date: 2023-09-06 12:31+0100\n" -"Last-Translator: Bruce Cowan \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-06 13:36+0000\n" +"Last-Translator: Andi Chandler \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.3.1\n" +"X-Generator: Poedit 3.4.2\n" "X-Project-Style: gnome\n" "X-DL-Team: en_GB\n" "X-DL-Module: glib\n" @@ -45,36 +46,40 @@ msgstr "Failed to find default application for content type ‘%s’" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Failed to find default application for URI Scheme ‘%s’" -#: gio/gapplication.c:502 -msgid "GApplication options" -msgstr "GApplication options" +#: gio/gapplication.c:507 +msgid "GApplication Options:" +msgstr "GApplication Options:" -#: gio/gapplication.c:502 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Show GApplication options" -#: gio/gapplication.c:547 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Enter GApplication service mode (use from D-Bus service files)" -#: gio/gapplication.c:559 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Override the application’s ID" -#: gio/gapplication.c:571 +#: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Print the application version" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Replace the running instance" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Print help" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[COMMAND]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Print version" @@ -127,7 +132,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "COMMAND" @@ -139,9 +144,13 @@ msgstr "The command to print detailed help for" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Application identifier in D-Bus format (eg: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FILE" @@ -165,7 +174,7 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Optional parameter to the action invocation, in GVariant format" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -179,12 +188,12 @@ msgstr "" msgid "Usage:\n" msgstr "Usage:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Arguments:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGS…]" @@ -277,78 +286,78 @@ msgstr "" "unrecognised command: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 -#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:650 -#: gio/ginputstream.c:1052 gio/goutputstream.c:225 gio/goutputstream.c:1051 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 +#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Too large count value passed to %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Seek not supported on base stream" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Cannot truncate GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1241 gio/giostream.c:302 -#: gio/goutputstream.c:2200 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 +#: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Stream is already closed" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Truncate not supported on base stream" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operation was cancelled" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Invalid object, not initialised" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Incomplete multibyte sequence in input" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Not enough space in destination" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:451 glib/gconvert.c:883 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 -#: glib/gutf8.c:892 glib/gutf8.c:1346 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 +#: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Invalid byte sequence in conversion input" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:459 glib/gconvert.c:797 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Error during conversion: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1151 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Cancellable initialisation not supported" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:324 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Conversion from character set “%s” to “%s” is not supported" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:328 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Could not open converter from “%s” to “%s”" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s type" @@ -362,41 +371,41 @@ msgstr "Unknown type" msgid "%s filetype" msgstr "%s filetype" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials contains invalid data" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials is not implemented on this OS" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "There is no GCredentials support for your platform" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials does not contain a process ID on this OS" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Credentials spoofing is not possible on this OS" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Unexpected early end-of-stream" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Unsupported key “%s” in address entry “%s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Meaningless key/value pair combination in address entry “%s”" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -405,28 +414,28 @@ msgstr "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Error in address “%s” — the “%s” attribute is malformed" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Unknown or unsupported transport “%s” for address “%s”" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Address element “%s” does not contain a colon (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transport name in address element “%s” must not be empty" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -435,14 +444,14 @@ msgstr "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -451,7 +460,7 @@ msgstr "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -460,75 +469,75 @@ msgstr "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Error in address “%s” — the host attribute is missing or malformed" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Error in address “%s” — the port attribute is missing or malformed" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Error in address “%s” — the noncefile attribute is missing or malformed" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Error auto-launching: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Error opening nonce file “%s”: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Error reading from nonce file “%s”: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Error reading from nonce file “%s”, expected 16 bytes, got %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Error writing contents of nonce file “%s” to stream:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "The given address is empty" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Cannot spawn a message bus when AT_SECURE is set" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Cannot spawn a message bus without a machine-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Cannot autolaunch D-Bus without X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Error spawning command line “%s”: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Cannot determine session bus address (not implemented for this OS)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -537,7 +546,7 @@ msgstr "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -545,35 +554,35 @@ msgstr "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Unknown bus type %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Unexpected lack of content trying to read a line" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Unexpected lack of content trying to (safely) read a line" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Unexpected lack of content trying to read a byte" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "User IDs must be the same for peer and server" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" @@ -594,13 +603,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Error creating directory “%s”: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1095 gio/gfile.c:1333 -#: gio/gfile.c:1471 gio/gfile.c:1709 gio/gfile.c:1764 gio/gfile.c:1822 -#: gio/gfile.c:1906 gio/gfile.c:1963 gio/gfile.c:2027 gio/gfile.c:2082 -#: gio/gfile.c:3797 gio/gfile.c:3937 gio/gfile.c:4349 gio/gfile.c:4819 -#: gio/gfile.c:5230 gio/gfile.c:5315 gio/gfile.c:5405 gio/gfile.c:5502 -#: gio/gfile.c:5589 gio/gfile.c:5690 gio/gfile.c:8819 gio/gfile.c:8909 -#: gio/gfile.c:8993 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operation not supported" @@ -663,15 +672,15 @@ msgstr "Error opening keyring “%s” for writing: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Additionally, releasing the lock for “%s” also failed: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "The connection is closed" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Timeout was reached" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -760,63 +769,74 @@ msgstr "A subtree is already exported for %s" msgid "Object does not exist at path “%s”" msgstr "Object does not exist at path “%s”" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "%s message: %s header field is invalid; expected a value of type ‘%s’" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s message: %s header field is missing or invalid" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s message: INVALID header field supplied" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s message: INTERFACE header field does not contain a valid interface name" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s message: MEMBER header field does not contain a valid member name" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s message: ERROR_NAME header field does not contain a valid error name" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "type is INVALID" -#: gio/gdbusmessage.c:1324 -#| msgid "METHOD_CALL message: PATH or MEMBER header field is missing" -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" - -#: gio/gdbusmessage.c:1340 -#| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" - -#: gio/gdbusmessage.c:1360 -#| msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" - -#: gio/gdbusmessage.c:1384 -#| msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Wanted to read %lu byte but only got %lu" msgstr[1] "Wanted to read %lu bytes but only got %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Expected NUL byte after the string “%s” but found byte %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -825,21 +845,21 @@ msgstr "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " "(length of string is %d). The valid UTF-8 string up until that point was “%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Value nested too deeply" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Parsed value “%s” is not a valid D-Bus object path" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Parsed value “%s” is not a valid D-Bus signature" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -850,7 +870,7 @@ msgstr[0] "" msgstr[1] "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -859,23 +879,23 @@ msgstr "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Empty structures (tuples) are not allowed in D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Parsed value “%s” for variant is not a valid D-Bus signature" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Error deserialising GVariant with type string “%s” from the D-Bus wire format" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -884,60 +904,60 @@ msgstr "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Invalid major protocol version. Expected 1 but found %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Signature header found but is not of type signature" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Signature header with signature “%s” found but message body is empty" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Parsed value “%s” is not a valid D-Bus signature (for body)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "No signature header in message but the message body is %u byte" msgstr[1] "No signature header in message but the message body is %u bytes" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Cannot deserialise message: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" "Error serialising GVariant with type string “%s” to the D-Bus wire format" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Number of file descriptors in message (%d) differs from header field (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Cannot serialise message: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Message body has signature “%s” but there is no signature header" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -946,17 +966,17 @@ msgstr "" "Message body has type signature “%s” but signature in the header field is " "“%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Message body is empty but signature in the header field is “(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Error return with body of type “%s”" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Error return with empty body" @@ -976,22 +996,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Unable to get Hardware profile: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Unable to load %s or %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Error calling StartServiceByName for %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Unexpected reply %d from StartServiceByName(\"%s\") method" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1001,25 +1021,25 @@ msgstr "" "owner, and proxy was constructed with the " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstract namespace not supported" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Cannot specify nonce file when creating a server" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Error writing nonce file at “%s”: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "The string “%s” is not a valid D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Cannot listen on unsupported transport “%s”" @@ -1082,6 +1102,10 @@ msgstr "Connect to the session bus" msgid "Connect to given D-Bus address" msgstr "Connect to given D-Bus address" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "ADDRESS" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Connection Endpoint Options:" @@ -1311,71 +1335,72 @@ msgstr "Error: %s is not a valid well-known bus name.\n" msgid "Not authorized to change debug settings" msgstr "Not authorised to change debug settings" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Unnamed" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Desktop file didn’t specify Exec field" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Unable to find terminal required for application" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Program ‘%s’ not found in $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Can’t create user application configuration folder %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Can’t create user MIME configuration folder %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Application information lacks an identifier" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Can’t create user desktop file %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Custom definition for %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "drive doesn’t implement eject" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "drive doesn’t implement eject or eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "drive doesn’t implement polling for media" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "drive doesn’t implement start" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "drive doesn’t implement stop" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS backend does not implement TLS binding retrieval" @@ -1388,27 +1413,27 @@ msgstr "TLS support is not available" msgid "DTLS support is not available" msgstr "DTLS support is not available" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Can’t handle version %d of GEmblem encoding" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Malformed number of tokens (%d) in GEmblem encoding" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Can’t handle version %d of GEmblemedIcon encoding" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Expected a GEmblem for GEmblemedIcon" @@ -1416,124 +1441,134 @@ msgstr "Expected a GEmblem for GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1594 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Containing mount does not exist" -#: gio/gfile.c:2641 gio/glocalfile.c:2515 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Can’t copy over directory" -#: gio/gfile.c:2701 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Can’t copy directory over directory" -#: gio/gfile.c:2709 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Target file exists" -#: gio/gfile.c:2728 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Can’t recursively copy directory" -#: gio/gfile.c:3029 -msgid "Splice not supported" -msgstr "Splice not supported" +#: gio/gfile.c:3050 gio/gfile.c:3098 +#, c-format +msgid "Copy file range not supported" +msgstr "Copy file range not supported" -#: gio/gfile.c:3033 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Error splicing file: %s" -#: gio/gfile.c:3195 +#: gio/gfile.c:3163 +msgid "Splice not supported" +msgstr "Splice not supported" + +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Copy (reflink/clone) between mounts is not supported" -#: gio/gfile.c:3199 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Copy (reflink/clone) is not supported or invalid" -#: gio/gfile.c:3204 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Copy (reflink/clone) is not supported or didn’t work" -#: gio/gfile.c:3269 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Cannot retrieve attribute %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Can’t copy special file" -#: gio/gfile.c:4163 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Invalid symlink value given" -#: gio/gfile.c:4173 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Symbolic links not supported" -#: gio/gfile.c:4460 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Wastebasket not supported" -#: gio/gfile.c:4572 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "File names cannot contain “%c”" -#: gio/gfile.c:7003 gio/gfile.c:7129 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Failed to create a temporary directory for template “%s”: %s" -#: gio/gfile.c:7418 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "volume doesn’t implement mount" -#: gio/gfile.c:7532 gio/gfile.c:7609 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "No application is registered as handling this file" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator is closed" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:424 gio/gfileenumerator.c:523 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "File enumerator has outstanding operation" -#: gio/gfileenumerator.c:415 gio/gfileenumerator.c:514 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "File enumerator is already closed" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Can’t handle version %d of GFileIcon encoding" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Malformed input data for GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:396 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Stream doesn’t support query_info" -#: gio/gfileinputstream.c:327 gio/gfileiostream.c:381 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Seek not supported on stream" -#: gio/gfileinputstream.c:371 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Truncate not allowed on input stream" -#: gio/gfileiostream.c:457 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Truncate not supported on stream" -#: gio/ghttpproxy.c:93 gio/gresolver.c:460 gio/gresolver.c:613 -#: glib/gconvert.c:1829 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Invalid hostname" @@ -1566,64 +1601,64 @@ msgstr "HTTP proxy response too big" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP proxy server closed connection unexpectedly." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Wrong number of tokens (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "No type for class name %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Type %s does not implement the GIcon interface" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Type %s is not classed" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Malformed version number: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Type %s does not implement from_tokens() on the GIcon interface" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Can’t handle the supplied version of the icon encoding" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "No address specified" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Length %u is too long for address" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Address has bits set beyond prefix length" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Could not parse “%s” as IP address mask" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Not enough space for socket address" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Unsupported socket address" @@ -1637,7 +1672,7 @@ msgstr "Input stream doesn’t implement read" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1251 gio/giostream.c:312 gio/goutputstream.c:2210 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Stream has outstanding operation" @@ -1653,7 +1688,7 @@ msgstr "Keep with file when moved" msgid "“version” takes no arguments" msgstr "“version” takes no arguments" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Usage:" @@ -1661,79 +1696,79 @@ msgstr "Usage:" msgid "Print version information and exit." msgstr "Print version information and exit." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Commands:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Concatenate files to standard output" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Copy one or more files" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Show information about locations" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Launch an application from a desktop file" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "List the contents of locations" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Get or set the handler for a mimetype" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Create directories" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Monitor files and directories for changes" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Mount or unmount the locations" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Move one or more files" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Open files with the default application" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Rename a file" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Delete one or more files" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Read from standard input and save" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Set a file attribute" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Move files or directories to the wastebasket" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lists the contents of locations in a tree" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Commands:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Use %s to get detailed help.\n" @@ -1743,10 +1778,10 @@ msgid "Error writing to stdout" msgstr "Error writing to stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 -#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1210 gio/gio-tool-open.c:72 +#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 #: gio/gio-tool-remove.c:50 gio/gio-tool-rename.c:47 gio/gio-tool-set.c:95 #: gio/gio-tool-trash.c:222 gio/gio-tool-tree.c:246 msgid "LOCATION" @@ -1766,60 +1801,64 @@ msgstr "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 -#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1261 gio/gio-tool-open.c:98 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "No locations given" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "No target directory" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Show progress" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Prompt before overwrite" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Preserve all attributes" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Backup existing destination files" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Never follow symbolic links" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Use default permissions for the destination" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Use default file modification timestamps for the destination" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Transferred %s out of %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "SOURCE" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "DESTINATION" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Copy one or more files from SOURCE to DESTINATION." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1829,12 +1868,12 @@ msgstr "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Destination %s is not a directory" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: overwrite “%s”? " @@ -1863,57 +1902,64 @@ msgstr "Don’t follow symbolic links" msgid "attributes:\n" msgstr "attributes:\n" -#: gio/gio-tool-info.c:166 gio/gio-tool-info.c:176 +#. Translators: This is a noun and represents and attribute of a file +#: gio/gio-tool-info.c:166 #, c-format msgid "display name: %s\n" msgstr "display name: %s\n" -#: gio/gio-tool-info.c:184 +#. Translators: This is a noun and represents and attribute of a file +#: gio/gio-tool-info.c:176 +#, c-format +msgid "edit name: %s\n" +msgstr "edit name: %s\n" + +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "name: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "type: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "size: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "hidden\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "local path: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix mount: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Settable attributes:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Writable attribute namespaces:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Show information about locations." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2181,15 +2227,15 @@ msgstr "Mount a TCRYPT system volume" msgid "Anonymous access denied" msgstr "Anonymous access denied" -#: gio/gio-tool-mount.c:533 +#: gio/gio-tool-mount.c:559 msgid "No drive for device file" msgstr "No drive for device file" -#: gio/gio-tool-mount.c:1025 +#: gio/gio-tool-mount.c:1051 msgid "No volume for given ID" msgstr "No volume for given ID" -#: gio/gio-tool-mount.c:1214 +#: gio/gio-tool-mount.c:1240 msgid "Mount or unmount the locations." msgstr "Mount or unmount the locations." @@ -2466,7 +2512,8 @@ msgstr "" "directory)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "DIRECTORY" @@ -2516,6 +2563,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "C identifier name used for the generated source code" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFIER" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "The target C compiler (default: the CC environment variable)" @@ -3006,12 +3057,12 @@ msgstr "No schema files found: doing nothing." msgid "No schema files found: removed existing output file." msgstr "No schema files found: removed existing output file." -#: gio/glocalfile.c:567 gio/win32/gwinhttpfile.c:436 +#: gio/glocalfile.c:570 gio/win32/gwinhttpfile.c:436 #, c-format msgid "Invalid filename %s" msgstr "Invalid filename %s" -#: gio/glocalfile.c:1009 +#: gio/glocalfile.c:1012 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "Error getting filesystem info for %s: %s" @@ -3020,124 +3071,124 @@ msgstr "Error getting filesystem info for %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1145 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Containing mount for file %s not found" -#: gio/glocalfile.c:1168 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Can’t rename root directory" -#: gio/glocalfile.c:1186 gio/glocalfile.c:1209 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Error renaming file %s: %s" -#: gio/glocalfile.c:1193 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Can’t rename file, filename already exists" -#: gio/glocalfile.c:1206 gio/glocalfile.c:2409 gio/glocalfile.c:2437 -#: gio/glocalfile.c:2576 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Invalid filename" -#: gio/glocalfile.c:1374 gio/glocalfile.c:1385 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Error opening file %s: %s" -#: gio/glocalfile.c:1510 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Error removing file %s: %s" -#: gio/glocalfile.c:2004 gio/glocalfile.c:2015 gio/glocalfile.c:2042 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Error moving file %s to the wastebasket: %s" -#: gio/glocalfile.c:2062 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Unable to create the wastebasket directory %s: %s" -#: gio/glocalfile.c:2083 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Unable to find toplevel directory to move %s to the wastebasket" -#: gio/glocalfile.c:2091 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" -msgstr "Can’t move to wastebasket on system internal mounts" +msgstr "Moving to wastebasket on system internal mounts is not supported" -#: gio/glocalfile.c:2177 gio/glocalfile.c:2205 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Unable to find or create wastebasket directory %s to move %s to" -#: gio/glocalfile.c:2249 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Unable to create wastebasket info file for %s: %s" -#: gio/glocalfile.c:2320 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Unable to move %s to wastebasket across filesystem boundaries" -#: gio/glocalfile.c:2324 gio/glocalfile.c:2380 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Unable to move file %s to the wastebasket: %s" -#: gio/glocalfile.c:2386 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Unable to move file %s to the wastebasket" -#: gio/glocalfile.c:2412 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Error creating directory %s: %s" -#: gio/glocalfile.c:2441 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Filesystem does not support symbolic links" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Error making symbolic link %s: %s" -#: gio/glocalfile.c:2487 gio/glocalfile.c:2522 gio/glocalfile.c:2579 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Error moving file %s: %s" -#: gio/glocalfile.c:2510 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Can’t move directory over directory" -#: gio/glocalfile.c:2536 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Backup file creation failed" -#: gio/glocalfile.c:2555 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Error removing target file: %s" -#: gio/glocalfile.c:2569 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Move between mounts not supported" -#: gio/glocalfile.c:2745 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Could not determine the disk usage of %s: %s" @@ -3159,115 +3210,115 @@ msgstr "Invalid extended attribute name" msgid "Error setting extended attribute “%s”: %s" msgstr "Error setting extended attribute “%s”: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (invalid encoding)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Error when getting information for file “%s”: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Error when getting information for file descriptor: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Invalid attribute type (uint32 expected)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Invalid attribute type (uint64 expected)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Invalid attribute type (byte string expected)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Cannot set permissions on symlinks" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Error setting permissions: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Error setting owner: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symlink must be non-NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Error setting symlink: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Error setting symlink: file is not a symlink" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Extra nanoseconds %d for UNIX timestamp %lld are negative" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX timestamp %lld does not fit into 64 bits" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX timestamp %lld is outside of the range supported by Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "File name “%s” cannot be converted to UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "File “%s” cannot be opened: Windows Error %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Error setting modification or access time for file “%s”: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Error setting modification or access time: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux context must be non-NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux is not enabled on this system" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Error setting SELinux context: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Setting attribute %s not supported" @@ -3320,7 +3371,7 @@ msgid "Error truncating file: %s" msgstr "Error truncating file: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Error opening file “%s”: %s" @@ -3342,27 +3393,27 @@ msgstr "The file was externally modified" msgid "Error removing old file: %s" msgstr "Error removing old file: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Invalid GSeekType supplied" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Invalid seek request" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Cannot truncate GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Memory output stream not resizable" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Failed to resize memory output stream" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3370,73 +3421,73 @@ msgstr "" "Amount of memory required to process the write is larger than available " "address space" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Requested seek before the beginning of the stream" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Requested seek beyond the end of the stream" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "mount doesn’t implement “unmount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "mount doesn’t implement “eject”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "mount doesn’t implement “unmount” or “unmount_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "mount doesn’t implement “eject” or “eject_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "mount doesn’t implement “remount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "mount doesn’t implement content type guessing" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "mount doesn’t implement synchronous content type guessing" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Hostname “%s” contains “[” but not “]”" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Network unreachable" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Host unreachable" @@ -3464,51 +3515,51 @@ msgstr "NetworkManager not running" msgid "NetworkManager version too old" msgstr "NetworkManager version too old" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Output stream doesn’t implement write" -#: gio/goutputstream.c:474 gio/goutputstream.c:1535 +#: gio/goutputstream.c:474 gio/goutputstream.c:1539 #, c-format msgid "Sum of vectors passed to %s too large" msgstr "Sum of vectors passed to %s too large" -#: gio/goutputstream.c:738 gio/goutputstream.c:1763 +#: gio/goutputstream.c:738 gio/goutputstream.c:1769 msgid "Source stream is already closed" msgstr "Source stream is already closed" -#: gio/gproxyaddressenumerator.c:324 gio/gproxyaddressenumerator.c:342 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Unspecified proxy lookup failure" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:403 gio/gthreadedresolver.c:152 gio/gthreadedresolver.c:170 -#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822 -#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Error resolving “%s”: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:472 gio/gresolver.c:632 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s not implemented" -#: gio/gresolver.c:1001 gio/gresolver.c:1053 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Invalid domain" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "The resource at “%s” does not exist" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "The resource at “%s” failed to decompress" @@ -3526,11 +3577,11 @@ msgstr "The resource at “%s” is not a directory" msgid "Input stream doesn’t implement seek" msgstr "Input stream doesn’t implement seek" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "List sections containing resources in an elf FILE" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3540,15 +3591,15 @@ msgstr "" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FILE [PATH]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECTION" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3560,15 +3611,15 @@ msgstr "" "If PATH is given, only list matching resources\n" "Details include the section, size and compression" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extract a resource file to stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FILE PATH" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3596,7 +3647,7 @@ msgstr "" "Use “gresource help COMMAND” to get detailed help.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3611,19 +3662,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SECTION An (optional) elf section name\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " COMMAND The (optional) command to explain\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FILE An elf file (a binary or a shared library)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3631,19 +3682,19 @@ msgstr "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[PATH]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " PATH An (optional) resource path (may be partial)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "PATH" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " PATH A resource path\n" @@ -3874,212 +3925,213 @@ msgstr "Empty schema name given\n" msgid "No such key “%s”\n" msgstr "No such key “%s”\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Invalid socket, not initialised" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Invalid socket, initialisation failed due to: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Socket is already closed" -#: gio/gsocket.c:449 gio/gsocket.c:3225 gio/gsocket.c:4458 gio/gsocket.c:4516 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Socket I/O timed out" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "creating GSocket from fd: %s" -#: gio/gsocket.c:615 gio/gsocket.c:679 gio/gsocket.c:686 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Unable to create socket: %s" -#: gio/gsocket.c:679 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Unknown family was specified" -#: gio/gsocket.c:686 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Unknown protocol was specified" -#: gio/gsocket.c:1177 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Cannot use datagram operations on a non-datagram socket." -#: gio/gsocket.c:1194 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Cannot use datagram operations on a socket with a timeout set." -#: gio/gsocket.c:2001 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "could not get local address: %s" -#: gio/gsocket.c:2047 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "could not get remote address: %s" -#: gio/gsocket.c:2113 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "could not listen: %s" -#: gio/gsocket.c:2217 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Error binding to address %s: %s" -#: gio/gsocket.c:2392 gio/gsocket.c:2429 gio/gsocket.c:2539 gio/gsocket.c:2564 -#: gio/gsocket.c:2631 gio/gsocket.c:2689 gio/gsocket.c:2707 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Error joining multicast group: %s" -#: gio/gsocket.c:2393 gio/gsocket.c:2430 gio/gsocket.c:2540 gio/gsocket.c:2565 -#: gio/gsocket.c:2632 gio/gsocket.c:2690 gio/gsocket.c:2708 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Error leaving multicast group: %s" -#: gio/gsocket.c:2394 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "No support for source-specific multicast" -#: gio/gsocket.c:2541 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Unsupported socket family" -#: gio/gsocket.c:2566 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "source-specific not an IPv4 address" -#: gio/gsocket.c:2590 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Interface name too long" -#: gio/gsocket.c:2603 gio/gsocket.c:2657 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interface not found: %s" -#: gio/gsocket.c:2633 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "No support for IPv4 source-specific multicast" -#: gio/gsocket.c:2691 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "No support for IPv6 source-specific multicast" -#: gio/gsocket.c:2924 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Error accepting connection: %s" -#: gio/gsocket.c:3050 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Connection in progress" -#: gio/gsocket.c:3101 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Unable to get pending error: " -#: gio/gsocket.c:3290 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Error receiving data: %s" -#: gio/gsocket.c:3487 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Error sending data: %s" -#: gio/gsocket.c:3674 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Unable to shutdown socket: %s" -#: gio/gsocket.c:3755 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Error closing socket: %s" -#: gio/gsocket.c:4451 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Waiting for socket condition: %s" -#: gio/gsocket.c:4841 gio/gsocket.c:4857 gio/gsocket.c:4870 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Unable to send message: %s" -#: gio/gsocket.c:4842 gio/gsocket.c:4858 gio/gsocket.c:4871 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Message vectors too large" -#: gio/gsocket.c:4887 gio/gsocket.c:4889 gio/gsocket.c:5036 gio/gsocket.c:5121 -#: gio/gsocket.c:5299 gio/gsocket.c:5339 gio/gsocket.c:5341 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Error sending message: %s" -#: gio/gsocket.c:5063 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage not supported on Windows" -#: gio/gsocket.c:5536 gio/gsocket.c:5612 gio/gsocket.c:5838 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Error receiving message: %s" -#: gio/gsocket.c:6123 gio/gsocket.c:6134 gio/gsocket.c:6197 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Unable to read socket credentials: %s" -#: gio/gsocket.c:6206 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials not implemented for this OS" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Could not connect to proxy server %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Could not connect to %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Could not connect: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Proxying over a non-TCP connection is not supported." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Proxy protocol “%s” is not supported." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Listener is already closed" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Added socket is closed" @@ -4170,94 +4222,94 @@ msgstr "SOCKSv5 proxy does not support provided address type." msgid "Unknown SOCKSv5 proxy error." msgstr "Unknown SOCKSv5 proxy error." -#: gio/gtestdbus.c:615 glib/gspawn-win32.c:354 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Failed to create pipe for communicating with child process (%s)" -#: gio/gtestdbus.c:622 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Pipes are not supported in this platform" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Can’t handle version %d of GThemedIcon encoding" -#: gio/gthreadedresolver.c:154 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "No valid addresses were found" -#: gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Error reverse-resolving “%s”: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:552 gio/gthreadedresolver.c:574 -#: gio/gthreadedresolver.c:628 gio/gthreadedresolver.c:675 -#: gio/gthreadedresolver.c:704 gio/gthreadedresolver.c:716 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Error parsing DNS %s record: malformed DNS packet" -#: gio/gthreadedresolver.c:774 gio/gthreadedresolver.c:911 -#: gio/gthreadedresolver.c:1009 gio/gthreadedresolver.c:1059 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No DNS record of the requested type for “%s”" -#: gio/gthreadedresolver.c:779 gio/gthreadedresolver.c:1014 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Temporarily unable to resolve “%s”" -#: gio/gthreadedresolver.c:784 gio/gthreadedresolver.c:1019 -#: gio/gthreadedresolver.c:1129 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Error resolving “%s”" -#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822 -#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Malformed DNS packet" -#: gio/gthreadedresolver.c:904 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Failed to parse DNS response for “%s”: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "No PEM-encoded private key found" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Cannot decrypt PEM-encoded private key" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Could not parse PEM-encoded private key" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "No PEM-encoded certificate found" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Could not parse PEM-encoded certificate" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "The current TLS backend does not support PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "This GTlsBackend does not support creating PKCS #11 certificates" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4267,7 +4319,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4275,136 +4327,148 @@ msgstr "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "The password entered is incorrect." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Sending FD is not supported" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:601 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Expecting 1 control message, got %d" msgstr[1] "Expecting 1 control message, got %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:613 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Unexpected type of ancillary data" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Expecting one fd, but got %d\n" msgstr[1] "Expecting one fd, but got %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Received invalid fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Receiving FD is not supported" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Error sending credentials: " -#: gio/gunixconnection.c:541 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Error checking if SO_PASSCRED is enabled for socket: %s" -#: gio/gunixconnection.c:557 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Error enabling SO_PASSCRED: %s" -#: gio/gunixconnection.c:586 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Expecting to read a single byte for receiving credentials but read zero bytes" -#: gio/gunixconnection.c:627 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Not expecting control message, but got %d" -#: gio/gunixconnection.c:652 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Error while disabling SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Error reading from file descriptor: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Error closing file descriptor: %s" -#: gio/gunixmounts.c:2817 gio/gunixmounts.c:2870 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Filesystem root" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Error writing to file descriptor: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstract UNIX domain socket addresses not supported on this system" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "volume doesn’t implement eject" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "volume doesn’t implement eject or eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "The app ‘%s’ in the application object has no verbs" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Error reading from handle: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Error closing handle: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Error writing to handle: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Not enough memory" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Internal error: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Need more input" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Invalid compressed data" @@ -4432,153 +4496,286 @@ msgstr "Run a dbus service" msgid "Wrong args\n" msgstr "Wrong args\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Failed to open ‘%s’: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Error: Could not write the whole output: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Error: Failed to rename ‘%s’ to ‘%s’: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Include directories in GIR search path" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Output file" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Shared library" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Show debug messages" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Show verbose messages" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Show program’s version number and exit" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Error parsing arguments: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Please specify exactly one input file" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Error parsing file ‘%s’: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Failed to build typelib for module ‘%s’" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Invalid typelib for module ‘%s’: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Show all available information" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Failed to parse: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "No input files" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Failed to read ‘%s’: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Failed to create typelib ‘%s’: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Failed to load typelib: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Warning: %u modules omitted" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Typelib version to inspect" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERSION" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "List the shared libraries the typelib requires" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "List other typelibs the inspected typelib requires" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "The typelib to inspect" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "NAMESPACE" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Inspect GI typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Failed to parse command line options: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Please specify exactly one namespace" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Please specify --print-shlibs, --print-typelibs or both" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Unexpected attribute “%s” for element “%s”" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Attribute “%s” of element “%s” not found" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Unexpected tag “%s”, tag “%s” expected" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Unexpected tag “%s” inside “%s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Invalid date/time ‘%s’ in bookmark file" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "No valid bookmark file found in data dirs" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "A bookmark for URI “%s” already exists" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No bookmark found for URI “%s”" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "No MIME type defined in the bookmark for URI “%s”" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "No private flag has been defined in bookmark for URI “%s”" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No groups set in bookmark for URI “%s”" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "No application with name “%s” registered a bookmark for “%s”" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Failed to expand exec line “%s” with URI “%s”" -#: glib/gconvert.c:470 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Unrepresentable character in conversion input" -#: glib/gconvert.c:497 glib/gutf8.c:888 glib/gutf8.c:1101 glib/gutf8.c:1238 -#: glib/gutf8.c:1342 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Partial character sequence at end of input" -#: glib/gconvert.c:768 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Cannot convert fallback “%s” to codeset “%s”" -#: glib/gconvert.c:940 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Embedded NUL byte in conversion input" -#: glib/gconvert.c:961 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Embedded NUL byte in conversion output" -#: glib/gconvert.c:1692 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "The URI “%s” is not an absolute URI using the “file” scheme" -#: glib/gconvert.c:1702 -#, c-format -msgid "The local file URI “%s” may not include a “#”" -msgstr "The local file URI “%s” may not include a “#”" - -#: glib/gconvert.c:1719 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "The URI “%s” is invalid" -#: glib/gconvert.c:1731 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "The hostname of the URI “%s” is invalid" -#: glib/gconvert.c:1747 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "The URI “%s” contains invalidly escaped characters" -#: glib/gconvert.c:1819 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "The pathname “%s” is not an absolute path" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %e %b %Y %H:%M:%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%l:%M:%S %P" @@ -4599,62 +4796,62 @@ msgstr "%l:%M:%S %P" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "January" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "February" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "March" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "April" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "May" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "June" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "July" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "August" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "September" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "October" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "November" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "December" @@ -4676,132 +4873,132 @@ msgstr "December" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "May" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jun" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Jul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Aug" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Oct" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Monday" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Tuesday" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Wednesday" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Thursday" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Friday" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Saturday" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Sunday" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Mon" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Tue" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Wed" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Thu" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Fri" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Sat" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Sun" @@ -4823,62 +5020,62 @@ msgstr "Sun" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "January" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "February" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "March" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "April" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "May" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "June" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "July" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "August" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "September" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "October" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "November" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "December" @@ -4900,240 +5097,246 @@ msgstr "December" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "May" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Jun" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Jul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Aug" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Oct" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Dec" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Error opening directory “%s”: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Could not allocate %lu byte to read file “%s”" -msgstr[1] "Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "Could not allocate %s to read file “%s”" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Error reading file “%s”: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "File “%s” is too large" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Failed to read from file “%s”: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Failed to open file “%s”: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Failed to get attributes of file “%s”: fstat() failed: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Failed to open file “%s”: fdopen() failed: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Failed to rename file “%s” to “%s”: g_rename() failed: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Failed to write file “%s”: ftruncate() failed: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Failed to write file “%s”: write() failed: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Failed to write file “%s”: fsync() failed: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Failed to create file “%s”: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Existing file “%s” could not be removed: g_unlink() failed: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Template “%s” invalid, should not contain a “%s”" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Template “%s” doesn’t contain XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Failed to read the symbolic link “%s”: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Could not open converter from “%s” to “%s”: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Can’t do a raw read in g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Leftover unconverted data in read buffer" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Channel terminates in a partial character" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Can’t do a raw read in g_io_channel_read_to_end" -#: glib/gkeyfile.c:800 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Valid key file could not be found in search dirs" -#: glib/gkeyfile.c:837 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Not a regular file" -#: glib/gkeyfile.c:1295 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "" "Key file contains line “%s” which is not a key-value pair, group, or comment" -#: glib/gkeyfile.c:1352 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Invalid group name: %s" -#: glib/gkeyfile.c:1376 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Key file does not start with a group" -#: glib/gkeyfile.c:1400 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Invalid key name: %.*s" -#: glib/gkeyfile.c:1428 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Key file contains unsupported encoding “%s”" -#: glib/gkeyfile.c:1683 glib/gkeyfile.c:1856 glib/gkeyfile.c:3303 -#: glib/gkeyfile.c:3367 glib/gkeyfile.c:3497 glib/gkeyfile.c:3626 -#: glib/gkeyfile.c:3772 glib/gkeyfile.c:4007 glib/gkeyfile.c:4074 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Key file does not have group “%s”" -#: glib/gkeyfile.c:1811 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Key file does not have key “%s” in group “%s”" -#: glib/gkeyfile.c:1973 glib/gkeyfile.c:2089 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Key file contains key “%s” with value “%s” which is not UTF-8" -#: glib/gkeyfile.c:1993 glib/gkeyfile.c:2109 glib/gkeyfile.c:2548 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Key file contains key “%s” which has a value that cannot be interpreted." -#: glib/gkeyfile.c:2763 glib/gkeyfile.c:3132 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5142,36 +5345,36 @@ msgstr "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." -#: glib/gkeyfile.c:2841 glib/gkeyfile.c:2918 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Key “%s” in group “%s” has value “%s” where %s was expected" -#: glib/gkeyfile.c:4330 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Key file contains escape character at end of line" -#: glib/gkeyfile.c:4352 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Key file contains invalid escape sequence “%s”" -#: glib/gkeyfile.c:4504 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Value “%s” cannot be interpreted as a number." -#: glib/gkeyfile.c:4518 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Integer value “%s” out of range" -#: glib/gkeyfile.c:4551 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Value “%s” cannot be interpreted as a float number." -#: glib/gkeyfile.c:4590 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Value “%s” cannot be interpreted as a boolean." @@ -5191,32 +5394,32 @@ msgstr "Failed to map %s%s%s%s: mmap() failed: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Failed to open file “%s”: open() failed: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Error on line %d char %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Invalid UTF-8 encoded text in name — not valid “%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” is not a valid name" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” is not a valid name: “%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Error on line %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5225,7 +5428,7 @@ msgstr "" "Failed to parse “%-.*s”, which should have been a digit inside a character " "reference (ê for example) — perhaps the digit is too large" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5235,23 +5438,23 @@ msgstr "" "ampersand character without intending to start an entity — escape ampersand " "as &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Character reference “%-.*s” does not encode a permitted character" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Empty entity “&;” seen; valid entities are: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Entity name “%-.*s” is not known" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5259,11 +5462,11 @@ msgstr "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Document must begin with an element (e.g. )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5272,7 +5475,7 @@ msgstr "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5281,19 +5484,19 @@ msgstr "" "Odd character “%s”: expected a '>' character to end the empty-element tag " "“%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Too many attributes in element “%s”" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "Odd character “%s”, expected a '=' after attribute name “%s” of element “%s”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5304,7 +5507,7 @@ msgstr "" "element “%s”, or optionally an attribute; perhaps you used an invalid " "character in an attribute name" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5313,7 +5516,7 @@ msgstr "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “'" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Element “%s” was closed, no element is currently open" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Element “%s” was closed, but the currently open element is “%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Document was empty or contained only whitespace" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Document ended unexpectedly just after an open angle bracket “<”" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5358,7 +5561,7 @@ msgstr "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5367,19 +5570,19 @@ msgstr "" "Document ended unexpectedly, expected to see a close angle bracket ending " "the tag <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Document ended unexpectedly inside an element name" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Document ended unexpectedly inside an attribute name" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Document ended unexpectedly inside an element-opening tag." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5387,262 +5590,258 @@ msgstr "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Document ended unexpectedly while inside an attribute value" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Document ended unexpectedly inside the close tag for element “%s”" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Document ended unexpectedly inside the close tag for an unopened element" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Document ended unexpectedly inside a comment or processing instruction" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPTION…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Help Options:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Show help options" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Show all help options" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Application Options:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Options:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Cannot parse integer value “%s” for %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Integer value “%s” for %s out of range" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Cannot parse double value “%s” for %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Double value “%s” for %s out of range" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Error parsing option %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Missing argument for %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Unknown option %s" -#: glib/gregex.c:479 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "corrupted object" -#: glib/gregex.c:481 +#: glib/gregex.c:488 msgid "out of memory" msgstr "out of memory" -#: glib/gregex.c:487 -msgid "backtracking limit reached" -msgstr "backtracking limit reached" - -#: glib/gregex.c:498 +#: glib/gregex.c:503 msgid "internal error" msgstr "internal error" -#: glib/gregex.c:500 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "the pattern contains items not supported for partial matching" -#: glib/gregex.c:502 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "back references as conditions are not supported for partial matching" -#: glib/gregex.c:508 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "recursion limit reached" -#: glib/gregex.c:510 +#: glib/gregex.c:515 msgid "bad offset" msgstr "bad offset" -#: glib/gregex.c:512 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "recursion loop" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:515 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "matching mode is requested that was not compiled for JIT" -#: glib/gregex.c:536 glib/gregex.c:1838 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "unknown error" -#: glib/gregex.c:557 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ at end of pattern" -#: glib/gregex.c:561 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c at end of pattern" -#: glib/gregex.c:566 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "unrecognised character following \\" -#: glib/gregex.c:570 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "numbers out of order in {} quantifier" -#: glib/gregex.c:574 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "number too big in {} quantifier" -#: glib/gregex.c:578 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "missing terminating ] for character class" -#: glib/gregex.c:582 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "invalid escape sequence in character class" -#: glib/gregex.c:586 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "range out of order in character class" -#: glib/gregex.c:591 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nothing to repeat" -#: glib/gregex.c:595 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "unrecognised character after (? or (?-" -#: glib/gregex.c:599 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX named classes are supported only within a class" -#: glib/gregex.c:603 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX collating elements are not supported" -#: glib/gregex.c:609 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "missing terminating )" -#: glib/gregex.c:613 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "reference to non-existent subpattern" -#: glib/gregex.c:617 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "missing ) after comment" -#: glib/gregex.c:621 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "regular expression is too large" -#: glib/gregex.c:625 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "malformed number or name after (?(" -#: glib/gregex.c:629 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind assertion is not fixed length" -#: glib/gregex.c:633 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "conditional group contains more than two branches" -#: glib/gregex.c:637 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "assertion expected after (?(" -#: glib/gregex.c:641 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "a numbered reference must not be zero" -#: glib/gregex.c:645 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "unknown POSIX class name" -#: glib/gregex.c:650 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "character value in \\x{...} sequence is too large" -#: glib/gregex.c:654 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C not allowed in lookbehind assertion" -#: glib/gregex.c:658 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "missing terminator in subpattern name" -#: glib/gregex.c:662 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "two named subpatterns have the same name" -#: glib/gregex.c:666 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "malformed \\P or \\p sequence" -#: glib/gregex.c:670 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "unknown property name after \\P or \\p" -#: glib/gregex.c:674 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "subpattern name is too long (maximum 32 characters)" -#: glib/gregex.c:678 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "too many named subpatterns (maximum 10,000)" -#: glib/gregex.c:682 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "octal value is greater than \\377" -#: glib/gregex.c:686 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE group contains more than one branch" -#: glib/gregex.c:690 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "inconsistent NEWLINE options" -#: glib/gregex.c:694 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5650,230 +5849,230 @@ msgstr "" "\\g is not followed by a curly-bracketed, angle-bracketed, or quoted name or " "number, or by a plain number" -#: glib/gregex.c:699 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" -#: glib/gregex.c:703 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) not recognised" -#: glib/gregex.c:707 +#: glib/gregex.c:712 msgid "number is too big" msgstr "number is too big" -#: glib/gregex.c:711 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "missing subpattern name after (?&" -#: glib/gregex.c:715 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "different names for subpatterns of the same number are not allowed" -#: glib/gregex.c:719 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) must have an argument" -#: glib/gregex.c:723 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c must be followed by an ASCII character" -#: glib/gregex.c:727 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k is not followed by a curly-bracketed, angle-bracketed, or quoted name" -#: glib/gregex.c:731 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N is not supported in a class" -#: glib/gregex.c:735 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" -#: glib/gregex.c:739 glib/gregex.c:875 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "code overflow" -#: glib/gregex.c:743 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "unrecognised character after (?P" -#: glib/gregex.c:747 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "overran compiling workspace" -#: glib/gregex.c:751 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "previously-checked referenced subpattern not found" -#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Error while matching regular expression %s: %s" -#: glib/gregex.c:1721 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE library is compiled without UTF8 support" -#: glib/gregex.c:1729 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE library is compiled with incompatible options" -#: glib/gregex.c:1847 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Error while compiling regular expression ‘%s’ at char %s: %s" -#: glib/gregex.c:2887 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "hexadecimal digit or “}” expected" -#: glib/gregex.c:2903 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "hexadecimal digit expected" -#: glib/gregex.c:2943 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "missing “<” in symbolic reference" -#: glib/gregex.c:2952 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "unfinished symbolic reference" -#: glib/gregex.c:2959 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "zero-length symbolic reference" -#: glib/gregex.c:2970 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "digit expected" -#: glib/gregex.c:2988 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "illegal symbolic reference" -#: glib/gregex.c:3051 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "stray final “\\”" -#: glib/gregex.c:3055 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "unknown escape sequence" -#: glib/gregex.c:3065 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Error while parsing replacement text “%s” at char %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Quoted text doesn’t begin with a quotation mark" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Unmatched quotation mark in command line or other shell-quoted text" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Text ended just after a “\\” character. (The text was “%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "Text ended before matching quote was found for %c. (The text was “%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Text was empty (or contained only whitespace)" -#: glib/gspawn.c:319 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Failed to read data from child process (%s)" -#: glib/gspawn.c:471 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Unexpected error in reading data from a child process (%s)" -#: glib/gspawn.c:556 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Unexpected error in waitpid() (%s)" -#: glib/gspawn.c:1175 glib/gspawn-win32.c:1503 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Child process exited with code %ld" -#: glib/gspawn.c:1183 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Child process killed by signal %ld" -#: glib/gspawn.c:1190 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Child process stopped by signal %ld" -#: glib/gspawn.c:1197 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Child process exited abnormally" -#: glib/gspawn.c:2027 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Failed to read from child pipe (%s)" -#: glib/gspawn.c:2399 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Failed to spawn child process “%s” (%s)" -#: glib/gspawn.c:2525 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Failed to fork (%s)" -#: glib/gspawn.c:2685 glib/gspawn-win32.c:424 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Failed to change to directory “%s” (%s)" -#: glib/gspawn.c:2695 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Failed to execute child process “%s” (%s)" -#: glib/gspawn.c:2705 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Failed to open file to remap file descriptor (%s)" -#: glib/gspawn.c:2713 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Failed to duplicate file descriptor for child process (%s)" -#: glib/gspawn.c:2722 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Failed to fork child process (%s)" -#: glib/gspawn.c:2730 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Failed to close file descriptor for child process (%s)" -#: glib/gspawn.c:2738 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Unknown error executing child process “%s”" -#: glib/gspawn.c:2762 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Failed to read enough data from child pid pipe (%s)" @@ -5883,46 +6082,46 @@ msgstr "Failed to read enough data from child pid pipe (%s)" msgid "Invalid source FDs argument" msgstr "Invalid source FDs argument" -#: glib/gspawn-win32.c:337 +#: glib/gspawn-win32.c:416 msgid "Failed to read data from child process" msgstr "Failed to read data from child process" -#: glib/gspawn-win32.c:430 glib/gspawn-win32.c:435 glib/gspawn-win32.c:561 +#: glib/gspawn-win32.c:509 glib/gspawn-win32.c:514 glib/gspawn-win32.c:640 #, c-format msgid "Failed to execute child process (%s)" msgstr "Failed to execute child process (%s)" -#: glib/gspawn-win32.c:440 +#: glib/gspawn-win32.c:519 #, c-format msgid "Failed to dup() in child process (%s)" msgstr "Failed to dup() in child process (%s)" -#: glib/gspawn-win32.c:511 +#: glib/gspawn-win32.c:590 #, c-format msgid "Invalid program name: %s" msgstr "Invalid program name: %s" -#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:868 +#: glib/gspawn-win32.c:600 glib/gspawn-win32.c:940 #, c-format msgid "Invalid string in argument vector at %d: %s" msgstr "Invalid string in argument vector at %d: %s" -#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:884 +#: glib/gspawn-win32.c:611 glib/gspawn-win32.c:956 #, c-format msgid "Invalid string in environment: %s" msgstr "Invalid string in environment: %s" -#: glib/gspawn-win32.c:864 +#: glib/gspawn-win32.c:936 #, c-format msgid "Invalid working directory: %s" msgstr "Invalid working directory: %s" -#: glib/gspawn-win32.c:929 +#: glib/gspawn-win32.c:1001 #, c-format msgid "Failed to execute helper program (%s)" msgstr "Failed to execute helper program (%s)" -#: glib/gspawn-win32.c:1158 +#: glib/gspawn-win32.c:1230 msgid "" "Unexpected error in g_io_channel_win32_poll() reading data from a child " "process" @@ -5930,95 +6129,95 @@ msgstr "" "Unexpected error in g_io_channel_win32_poll() reading data from a child " "process" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Empty string is not a number" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s” is not a signed number" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Number “%s” is out of bounds [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s” is not an unsigned number" -#: glib/guri.c:317 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Invalid %-encoding in URI" -#: glib/guri.c:334 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Illegal character in URI" -#: glib/guri.c:368 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Non-UTF-8 characters in URI" -#: glib/guri.c:548 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Invalid IPv6 address ‘%.*s’ in URI" -#: glib/guri.c:603 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Illegal encoded IP address ‘%.*s’ in URI" -#: glib/guri.c:615 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Illegal internationalised hostname ‘%.*s’ in URI" -#: glib/guri.c:647 glib/guri.c:659 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Could not parse port ‘%.*s’ in URI" -#: glib/guri.c:666 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Port ‘%.*s’ in URI is out of range" -#: glib/guri.c:1226 glib/guri.c:1290 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI ‘%s’ is not an absolute URI" -#: glib/guri.c:1232 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI ‘%s’ has no host component" -#: glib/guri.c:1462 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI is not absolute, and no base URI was provided" -#: glib/guri.c:2248 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Missing ‘=’ and parameter value" -#: glib/gutf8.c:834 +#: glib/gutf8.c:900 msgid "Failed to allocate memory" msgstr "Failed to allocate memory" -#: glib/gutf8.c:967 +#: glib/gutf8.c:1033 msgid "Character out of range for UTF-8" msgstr "Character out of range for UTF-8" -#: glib/gutf8.c:1069 glib/gutf8.c:1078 glib/gutf8.c:1208 glib/gutf8.c:1217 -#: glib/gutf8.c:1356 glib/gutf8.c:1453 +#: glib/gutf8.c:1135 glib/gutf8.c:1144 glib/gutf8.c:1274 glib/gutf8.c:1283 +#: glib/gutf8.c:1422 glib/gutf8.c:1519 msgid "Invalid sequence in conversion input" msgstr "Invalid sequence in conversion input" -#: glib/gutf8.c:1367 glib/gutf8.c:1464 +#: glib/gutf8.c:1433 glib/gutf8.c:1530 msgid "Character out of range for UTF-16" msgstr "Character out of range for UTF-16" @@ -6082,65 +6281,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6245,9 +6444,62 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "Could not allocate %" +#~ msgstr[1] "Could not allocate %" + +#~ msgid "GApplication options" +#~ msgstr "GApplication options" + +#~| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" + #, c-format -#~ msgid "edit name: %s\n" -#~ msgstr "edit name: %s\n" +#~ msgid "The local file URI “%s” may not include a “#”" +#~ msgstr "The local file URI “%s” may not include a “#”" + +#~ msgid "backtracking limit reached" +#~ msgstr "backtracking limit reached" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" #~ msgid "internal error or corrupted object" #~ msgstr "internal error or corrupted object" @@ -6418,9 +6670,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[ARGS...]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "Failed to create temp file: %s" - #~ msgid "; ignoring override for this key.\n" #~ msgstr "; ignoring override for this key.\n" diff --git a/po/es.po b/po/es.po index 9e34ee6..75969a6 100644 --- a/po/es.po +++ b/po/es.po @@ -8,14 +8,14 @@ # # # Jorge González , 2007, 2008, 2009, 2010, 2011, 2012. -# Daniel Mustieles , 2022-2023. +# Daniel Mustieles , 2022-2024. # msgid "" msgstr "" "Project-Id-Version: glib.master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-11 06:52+0000\n" -"PO-Revision-Date: 2023-09-11 10:13+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-29 10:40+0000\n" +"PO-Revision-Date: 2024-02-29 12:34+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish - Spain \n" "Language: es_ES\n" @@ -23,7 +23,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"X-Generator: Gtranslator 45.alpha0\n" +"X-Generator: Gtranslator 45.3\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -47,38 +47,42 @@ msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "" "Falló al encontrar una aplicación predeterminada el esquema del URI «%s»" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Opciones de GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Mostrar las opciones de GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Entrar en modo de servicio de GApplication (usar desde archivos de servicio " "de D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Omitir el ID de la aplicación" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Imprimir la versión de la aplicación" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Reemplazar la instancia actual en ejecución" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Imprimir ayuda" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[COMANDO]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Imprimir versión" @@ -133,7 +137,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "COMANDO" @@ -146,9 +150,13 @@ msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "" "Identificador de la aplicación en formato D-Bus (ej. org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "ARCHIVO" @@ -173,7 +181,7 @@ msgid "Optional parameter to the action invocation, in GVariant format" msgstr "" "Parámetro opcionales para la invocación de la acción, en formato GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -187,12 +195,12 @@ msgstr "" msgid "Usage:\n" msgstr "Uso:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumentos:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGS…]" @@ -287,79 +295,79 @@ msgstr "" "comando desconocido: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "El valor de conteo pasado a %s es demasiado largo" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "No se permite buscar en el flujo base" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "No se puede truncar GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "El flujo ya se cerró" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "No se soporta el truncado en el flujo base" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Se canceló la operación" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Objeto no válido, no inicializado" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Secuencia multibyte incompleta en la entrada" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "No hay suficiente espacio en el destino" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Hay una secuencia de bytes no válida en la entrada de conversión" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Falló durante la conversión: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "La inicialización cancelable no eestá soportada" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "" "La conversión desde el conjunto de caracteres «%s» a «%s» no está soportada" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "No se pudo abrir el conversor de «%s» a «%s»" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "tipo %s" @@ -373,42 +381,42 @@ msgstr "Tipo desconocido" msgid "%s filetype" msgstr "tipo de archivo %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials contiene datos no válidos" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials no está implementado en este SO" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "No existe soporte de GCredentials para su plataforma" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials no contiene un ID de proceso en este SO" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "No se soporta la burla de credenciales en este SO" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Final de flujo inesperadamente prematuro" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Clave «%s» no soportada en la entrada de dirección «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "" "Combinación del par clave/valor sin sentido en la entrada de dirección «%s»" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -417,29 +425,29 @@ msgstr "" "La dirección «%s» no es válida (se necesita exactamente una ruta, carpeta, " "carpeta temporal o claves abstractas)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Error en la dirección «%s» — el atributo «%s» está mal formado" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Transporte «%s» desconocido o no soportado para la dirección «%s»" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "El elemento de dirección «%s» no contiene dos puntos (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "" "El nombre del transporte en el elemento de dirección «%s» no debe estar vacío" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -448,7 +456,7 @@ msgstr "" "El par clave/valor %d, «%s», en el elemento de dirección «%s», no contiene " "un signo de igual" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -456,7 +464,7 @@ msgstr "" "El par clave/valor %d, «%s», en el elemento de dirección «%s», no debe " "contener una clave vacía" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -465,7 +473,7 @@ msgstr "" "Error al desescapar la clave o el valor en el par clave/valor %d, «%s», en " "el elemento de dirección «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -474,86 +482,86 @@ msgstr "" "Error en la dirección «%s»: el transporte UNIX requiere exactamente que una " "de las claves «path» o «abstract» esté establecida" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Error en la dirección «%s»: falta o está mal formado el atributo para el " "servidor" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Error en la dirección «%s»: falta o está mal formado el atributo para el " "puerto" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Error en la dirección «%s»: falta o está mal formado el atributo para el " "archivo de número usado una sola vez" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Error al autolanzar: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Error al abrir el archivo de número usado una sola vez «%s»: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Error al leer el archivo de número usado una sola vez «%s»: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Error al leer el archivo de número usado una sola vez «%s», se esperaban 16 " "bytes, se obtuvieron %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "" "Error al escribir el contenido del archivo de número usado una sola vez «%s» " "al flujo:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "La dirección proporcionada está vacía" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "No se puede lanzar un mensaje cuando AT_SECURE está activado" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "No se puede lanzar («spawn») un mensaje al bus sin un ID de máquina: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "No se puede lanzar D-Bus automáticamente sin X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Error al lanzar («spawn») el comando «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "No se puede determinar la dirección del bus de sesión (no implementado para " "este SO)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -562,7 +570,7 @@ msgstr "" "No se puede determinar la dirección del bus desde la variable de entorno " "DBUS_STARTER_BUS_TYPE; variable «%s» desconocida" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -570,21 +578,21 @@ msgstr "" "No se puede determinar la dirección del bus porque la variable de entorno " "DBUS_STARTER_BUS_TYPE no está establecida" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Tipo de bus %d desconocido" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Falta de contenido inesperada al intentar leer una línea" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" "Falta de contenido inesperada al intentar leer (de forma segura) una línea" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -592,15 +600,15 @@ msgstr "" "Se agotaron todos los mecanismos de autenticación (intentados: %s) " "(disponibles: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Falta de contenido inesperada al intentar leer un byte" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "El ID del usuario debe ser el mismo en el par y el servidor" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Cancelado a través de GDBusAuthObserver::authorize-authenticated-peer" @@ -622,13 +630,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Error al crear la carpeta %s: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operación no soportada" @@ -696,15 +704,15 @@ msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" "(Adicionalmente, también falló la liberación del bloqueo para «%s»: %s)" -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "La conexión está cerrada" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Se alcanzó el tiempo de expiración" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -797,67 +805,82 @@ msgstr "Ya se ha exportado un subárbol para %s" msgid "Object does not exist at path “%s”" msgstr "El objeto no existe en la ruta «%s»" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"mensaje %s: el campo de cabecera %s no es válido; se esperaba un valor de " +"tipo «%s»" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "mensaje %s: falta el campo de cabecera %s o no es válido" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "mensaje %s: campo de cabecera proporcionado NO VÁLIDO" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"mensaje %s: el campo de cabecera PATH está usando el valor reservado /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"mensaje %s: el campo de cabecera INTERFACE no contiene un nombre de interfaz " +"válido" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"mensaje %s: el campo de cabecera INTERFACE está usando el valor reservado " +"org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"mensaje %s: el campo de cabecera MEMBER no contiene un nombre de miembro " +"válido" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"mensaje %s: el campo de cabecera ERROR_NAME no contiene un nombre de error " +"válido" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "el tipo no es válido («INVALID»)" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Mensaje de METHOD_CALL: falta el campo de cabecera PATH o MEMEBER o no es " -"válido" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Mensaje de METHOD_RETURN: falta el campo de cabecera REPLY_SERIAL o no es " -"válido" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Mensaje de ERROR: falta el campo de cabecera REPLY_SERIAL o ERROR_NAME o no " -"es válido" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Mensaje de SIGNAL: falta el campo de cabecera PATH, INTERFACE o MEMBER o no " -"es válido" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Mensaje de SIGNAL: el campo de cabecera PATH está usando el valor reservado /" -"org/freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Mensaje de SIGNAL: el campo de cabecera INTERFACE está usando el valor " -"reservado org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Se quería leer %lu byte pero sólo se obtuvo %lu" msgstr[1] "Se querían leer %lu bytes pero sólo se obtuvo %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "" "Se esperaba el byte NULL después de la cadena «%s» pero se encontró el byte " "%d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -867,21 +890,21 @@ msgstr "" "en el byte desplazado %d (la longitud de la cadena es %d). La cadena UTF-8 " "válida hasta ese punto era «%s»." -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Valor anidado demasiado profundamente" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "El valor analizado «%s» no es un objeto de ruta D-Bus válido" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "El valor analizado «%s» no es una firma de D-Bus válida" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -894,7 +917,7 @@ msgstr[1] "" "Se encontró un array de longitud %u bytes. La longitud máxima es 2<<26 bytes " "(64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -903,17 +926,17 @@ msgstr "" "Encontrado un vector de tipo «a%c», esperando que su longitud fuese múltiplo " "de %u bytes, pero su longitud es de %u" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Las estructuras vacías (tuplas) no están permitidas en D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" "El valor analizado «%s» para la variante no es una firma de D-Bus válida" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -921,7 +944,7 @@ msgstr "" "Error al deserializar GVariant con el tipo de cadena «%s» al formato de " "mensaje de D-Bus" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -930,31 +953,31 @@ msgstr "" "Valor endian no válido. Se esperaba 0x6c («l») o 0x42 («B»)» pero se obtuvo " "el valor 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" "La versión principal del protocolo no es válida. Se esperaba 1 pero se " "encontró %d." -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Cabecera de firma encontrada pero no es del tipo firma" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Se encontró la cabecera de firma con firma «%s» pero el cuerpo del mensaje " "está vacío" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" "El valor analizado «%s» no es una firma de D-Bus válida (para el cuerpo)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -965,11 +988,11 @@ msgstr[1] "" "No existe la cabecera de firma en el mensaje pero el cuerpo del mensaje " "tiene %u bytes" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "No se puede deserializar el mensaje: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -977,7 +1000,7 @@ msgstr "" "Error al serializar GVariant con el tipo de cadena «%s» al formato de " "mensaje de D-Bus" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -985,17 +1008,17 @@ msgstr "" "El número de descriptores de archivos en el mensaje (%d) es distinto del " "campo de cabecera (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "No se puede serializar el mensaje: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "El cuerpo del mensaje tiene la firma «%s» pero no existe la cabecera de firma" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -1004,19 +1027,19 @@ msgstr "" "El cuerpo del mensaje tiene un tipo de firma «%s» pero la firma en el campo " "de cabecera es «%s»" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "El cuerpo del mensaje está vacío pero la firma en el campo de cabecera es " "«(%s)»" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Error al devolver el cuerpo de tipo «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Error al devolver un cuepro vacío" @@ -1037,22 +1060,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "No se pudo obtener el perfil de hardware: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "No se pudo cargar «%s» o %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Error al llamar StartSereviceByName para %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Respuesta %d no esperada del método StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1062,27 +1085,27 @@ msgstr "" "%sconocido y el proxy se construyó con la opción " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Espacio de nombres abstracto no soportado" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "" "No se puede especificar el archivo de número usado una sola vez al crear un " "servidor" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Error al escribir el archivo de número usado una sola vez en «%s»: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "La cadena «%s» no es un GUID válido de D-Bus" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "No se puede escuchar en un transporte no soportado «%s»" @@ -1145,6 +1168,10 @@ msgstr "Conectar con el bus de sesión" msgid "Connect to given D-Bus address" msgstr "Conectar con la dirección de D-Bus proporcionada" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "DIRECCIÓN" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Opciones de conexión del extremo:" @@ -1376,73 +1403,74 @@ msgstr "Error: %s no es un nombre de bus conocido válido\n" msgid "Not authorized to change debug settings" msgstr "No autorizado para cambiar la configuración de depuración" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Sin nombre" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "El archivo de escritorio no especificó el campo Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Imposible encontrar el terminal requerido por la aplicación" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programa «%s» no encontrado en $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "No se puede crear la carpeta de configuración de la aplicación %s del " "usuario: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "No se puede crear la carpeta de configuración MIME %s del usuario: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "La información de la aplicación carece de un identificador" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "No se puede crear el archivo de escritorio %s del usuario" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Definición personalizada para %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "la unidad no implementa la expulsión" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "la unidad no implementa la expulsión o expulsión con operación" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "la unidad no implementa el sondeo para medios" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "la unidad no implementa reproducir" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "la unidad no implementa detener" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "El «backend» de TLS no implementa recuperación de enlace de TLS" @@ -1455,27 +1483,27 @@ msgstr "El soporte de TSL no está disponible" msgid "DTLS support is not available" msgstr "Soporte de DTSL no disponible" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "No se puede manejar la versión %d de la codificación GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Número de tokens (%d) mal formados en la codificación GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "No se puede manejar la versión %d de la codificación GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Número de tokens (%d) mal formados en la codificación GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Se esperaba un GEmblem para GEmblemedIconjo" @@ -1483,129 +1511,134 @@ msgstr "Se esperaba un GEmblem para GEmblemedIconjo" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "El punto de montaje contenido no existe" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "No se puede copiar sobre la carpeta" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "No se puede copiar una carpeta sobre otra" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "El archivo destino ya existe" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "No se puede copiar la carpeta recursivamente" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Copiar el rango de archivos no está soportado" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Error al unir el archivo: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "La unión no está soportada" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Copiar (reflink/clone) entre puntos de montaje no está soportado" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Copiar (reflink/clone) no está soportado o no es válido" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Copiar (reflink/clone) no está soportado o no ha funcionado" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "No se puede obtener el atributo %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "No se puede copiar el archivo especial" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "El valor del enlace simbólico dado no es válido" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2404 msgid "Symbolic links not supported" msgstr "Enlaces simbólicos no soportados" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "No se soporta mover a la papelera" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Los nombres de archivo no pueden contener «%c»" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Falló al crear una carpeta temporal para la plantilla «%s»: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "el volumen no implementa el montaje" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "No hay ninguna aplicación registrada para manejar este archivo" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "El enumerador está cerrado" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "El enumerador del archivo tiene una operación excepcional" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "El enumerador del archivo ya está cerrado" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "No se puede manejar la versión %d de la codificación GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Datos de entrada mal formados para GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "El flujo no soporta query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "No se permite buscar en el flujo" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "No se permite truncar en el flujo de entrada" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "No se soporta el truncamiento en el flujo" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "El nombre del host no es válido" @@ -1638,65 +1671,65 @@ msgstr "La respuesta del proxy HTTP es demasiado grande" msgid "HTTP proxy server closed connection unexpectedly." msgstr "El servidor proxy HTTP cerró la conexión inesperadamente." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Número de tokens (%d) incorrecto" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "No existe el tipo para la clase de nombre %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "El tipo %s no implementa la interfaz GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "El tipo %s no tiene clase" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Número de versión mal formado: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "El tipo %s no implementa from_tokens() en la interfaz GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "" "No se puede manejar la versión proporcionada de la codificación de icono" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "No se especificó ninguna dirección" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "La longitud de %u es demasiado larga para una dirección" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "La dirección tiene bits más allá de la longitud del prefijo" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "No se pudo analizar «%s» como una máscara de una dirección IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "No hay suficiente espacio para la dirección del socket" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Dirección del socket no soportada" @@ -1710,7 +1743,7 @@ msgstr "El flujo de entrada no implementa la lectura" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "El flujo tiene una operación excepcional" @@ -1726,7 +1759,7 @@ msgstr "Mantener con archivo cuando se mueva" msgid "“version” takes no arguments" msgstr "«version» no lleva ningún argumento" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Uso:" @@ -1734,79 +1767,79 @@ msgstr "Uso:" msgid "Print version information and exit." msgstr "Mostrar información de la versión y salir." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Comandos:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Concatenar archivos en la salida estándar" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Copiar uno o más archivos" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Mostrar información sobre las ubicaciones" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Lanzar una aplicación desde un archivo .desktop" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Listar el contenido de las ubicaciones" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Obtener o establecer el gestor para un tipo MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Crear carpetas" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Monitorizar cambios en archivos y claves" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Montar o desmontar las ubicaciones" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Mover uno o más archivos" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Abrir archivos con la aplicación predeterminada" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Renombrar un archivo" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Eliminar uno o más archivos" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Leer de la entrada estándar y guardar" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Establecer el atributo de un archivo" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Mover archivos o carpetas a la papelera" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Listar el contenido de las ubicaciones en un árbol" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Comandos:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "" @@ -1818,7 +1851,7 @@ msgid "Error writing to stdout" msgstr "Error al escribir en la salida estándar" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1841,60 +1874,66 @@ msgstr "" "ubicaciones GIO en lugar de archivos locales: por ejemplo, puede\n" "usar algo como smb://servidor/recurso/archivo.txt como ubicación." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "No se han proporcionado ubicaciones" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "No hay carpeta de destino" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Mostrar progreso" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Preguntar antes de sobrescribir" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Conservar todos los atributos" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Respaldar los archivos de destino existentes" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "No seguir nunca enlaces simbólicos" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Usar permisos predeterminados para el destino" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" +"Usar las marcas de tiempo de modificación del archivo predeterminadas para " +"el destino" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Transferido %s de %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ORIGEN" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "DESTINO" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Copiar uno o más archivos desde el ORIGEN al DESTINO." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1904,12 +1943,12 @@ msgstr "" "ubicaciones GIO en lugar de archivos locales: por ejemplo, puede\n" "usar algo como smb://servidor/recurso/archivo.txt como ubicación." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "El destino %s no es una carpeta" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: ¿sobrescribir «%s» ? " @@ -1950,52 +1989,52 @@ msgstr "nombre que mostrar: %s\n" msgid "edit name: %s\n" msgstr "nombre editado: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "nombre: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tipo: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "tamaño: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "oculto\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "URI: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "ruta local: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "montaje unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Atributos que se pueden establecer:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Espacios de nombres de atributos que se pueden escribir:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Mostrar información sobre las ubicaciones." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2557,7 +2596,8 @@ msgstr "" "(la predeterminada es la carpeta actual)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "CARPETA" @@ -2610,6 +2650,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "Nombre del identificador C usado para el código fuente generado" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFICADOR" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "El compilador C objetivo (predeterminado: la variable de entorno CC)" @@ -3126,125 +3170,125 @@ msgstr "Error al obtener la información del sistema de archivos para %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "No se ha encontrado el punto de montaje para el archivo %s" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "No se puede renombrar la carpeta raíz" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Error al leer el archivo %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "No se puede renombrar el archivo, el nombre de archivo ya existe" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Nombre de archivo no válido" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Error al abrir el archivo %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Error al eliminar el archivo %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Error al mover a la papelera el archivo %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "No se pudo crear la carpeta de papelera %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "No se pudo encontrar la carpeta de nivel superior para la papelera %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Copiar (reflink/clone) entre puntos de montaje no está soportado" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "No se pudo encontrar o crear la carpeta %s de la papelera para %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "No se pudo crear la información de papelera para el archivo %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "No se pudo enviar a la papelera el archivo %s entre sistemas de archivos" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "No se pudo enviar a la papelera el archivo %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "No se pudo enviar a la papelera el archivo %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Error al crear la carpeta %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "El sistema de archivos no soporta enlaces simbólicos" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Error al crear el enlace simbólico %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Error al mover el archivo %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "No se puede mover una carpeta sobre una carpeta" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Falló la creación del archivo de respaldo" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Error al eliminar el archivo destino: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "No se soporta mover archivos entre puntos de montaje" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "No se pudo determinar el uso de disco de %s: %s" @@ -3266,122 +3310,122 @@ msgstr "Nombre extendido del atributo no válido" msgid "Error setting extended attribute “%s”: %s" msgstr "Error al establecer el atributo extendido «%s»: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (codificación no válida)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Error al obtener la información del archivo «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Error al obtener la información del descriptor del archivo: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Tipo de atributo no válido (se esperaba uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Tipo de atributo no válido (se esperaba uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Tipo de atributo no válido (se esperaba una cadena byte)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "No se pueden establecer permisos en enlaces simbólicos" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Error al establecer permisos: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Error al establecer el propietario: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "el enlace simbólico debe ser no nulo" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Error al establecer el enlace simbólico: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "Error al establecer el enlace simbólico: el archivo no es un enlace simbólico" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" "Los %d nanosegundos adicionales para la marca de tiempo UNIX %lld son " "negativos" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "Los %d nanosegundos adicionales para la marca de tiempo UNIX %lld alcanzan 1 " "segundo" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "La marca de tiempo UNIX %lld no cabe en 64 bits" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "La marca de tiempo UNIX %lld está fuera del rango soportado por Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "El nombre de archivo «%s» no se puede convertir a UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "No se puede abrir el archivo «%s»: error de Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "Error al establecer o modificar la hora de acceso para el archivo %s: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Error al establecer o modificar el tiempo de acceso: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "El contexto SELinux debe ser no nulo" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux no está activado en este sistema" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Error al establecer el contexto SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Establecer el atributo %s no está soportado" @@ -3436,7 +3480,7 @@ msgid "Error truncating file: %s" msgstr "Error al truncar el archivo: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Error al abrir el archivo %s: %s" @@ -3458,27 +3502,27 @@ msgstr "El archivo se modificó externamente" msgid "Error removing old file: %s" msgstr "Error al eliminar el archivo antiguo: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Se proporcionó un GSeekType no válido" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Petición de búsqueda no válida" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "No se puede truncar GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "El flujo de salida de la memoria no es redimensionable" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Falló al redimensionar el flujo de salida de la memoria" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3486,32 +3530,32 @@ msgstr "" "La cantidad de memoria necesaria para procesar el escrito es mayor que el " "espacio de direcciones libre disponible" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "La búsqueda solicitada antes del inicio del flujo" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "La búsqueda solicitada después del final del flujo" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "el punto de montaje no implementa el desmontado («unmount»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "el punto de montaje no implementa la expulsión («eject»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "el punto de montaje no implementa desmontado («umount») o desmontado con " @@ -3520,7 +3564,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "el punto de montaje no implementa la expulsión («eject») o expulsión con " @@ -3529,35 +3573,35 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "el punto de montaje no implementa el remontado («remount»)" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "el punto de montaje no implementa averiguación del tipo de contenido" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" "el punto de montaje no implementa averiguación síncrona del tipo de contenido" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "El nombre del equipo «%s» contiene «[» pero no «]»" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Red no alcanzable" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Equipo no alcanzable" @@ -3585,7 +3629,7 @@ msgstr "NetworkManager no está en ejecución" msgid "NetworkManager version too old" msgstr "Versión de NetworkManager demasiado antigua" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "El flujo de salida no implementa la escritura" @@ -3598,38 +3642,38 @@ msgstr "La suma de vectores pasada a %s es demasiado grande" msgid "Source stream is already closed" msgstr "El flujo de origen ya está cerrado" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Falló la búsqueda del proxy no especificado" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Error al resolver «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s no está implementado" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Dominio no válido" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "El recurso en «%s» no existe" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "El recurso en «%s» falló al descomprimir" @@ -3647,11 +3691,11 @@ msgstr "El recurso en «%s» no es una carpeta" msgid "Input stream doesn’t implement seek" msgstr "El flujo de entrada no implementa la búsqueda" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Listar secciones que contengan recursos en un ARCHIVO elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3661,15 +3705,15 @@ msgstr "" "Si se da la SECCIÓN, listar solo los recursos de esta sección.\n" "Si se da la RUTA, listar solo los recursos que coincidan" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "ARCHIVO [RUTA]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECCIÓN" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3681,15 +3725,15 @@ msgstr "" "Si se da la RUTA, listar solo los recursos que coincidan\n" "Los detalles incluyen la sección, el tamaño y la compresión" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extraer un archivo de recursos a stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "ARCHIVO RUTA" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3717,7 +3761,7 @@ msgstr "" "Use «gresource help COMANDO» para obtener ayuda detallada.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3732,20 +3776,20 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SECCIÓN El nombre de sección (opcional) de un elf\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " COMANDO El comando (opcional) que explicar\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" " ARCHIVO Un archivo elf (un binario o una biblioteca compartida)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3753,19 +3797,19 @@ msgstr "" " ARCHIVO Un archivo elf (un binario o una biblioteca compartida)\n" " o un archivo de recursos compilado\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[RUTA]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " RUTA La ruta (opcional) de un recurso (puede ser parcial)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "RUTA" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " RUTA La ruta de un recurso\n" @@ -3998,218 +4042,218 @@ msgstr "Se proporcionó un nombre de esquema vacío\n" msgid "No such key “%s”\n" msgstr "No existe la clave «%s»\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Socket no válido, no inicializado" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Socket no válido, falló la instalación debido a: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "El socket ya está cerrado" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Expiró la E/S del socket" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "creando el GSocket desde fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "No se pudo crear el socket: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Se especificó una familia desconocida" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Se especificó un protocolo desconocido" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "No se pueden usar operaciones de datagrama en un zócalo que no es de " "datagrama." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "No se pueden usar operaciones de datagrama en un zócalo sin un tiempo de " "expiración establecido." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "no se pudo obtener la dirección local: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "no se pudo obtener la dirección remota: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "no se pudo escuchar: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Error al vincular con la dirección %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Error al unirse al grupo de multicast: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Error al abandonar al grupo de multicast: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "No se soporta el multicast específico de la fuente" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Familia del socket no soportada" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "la fuente específica no es una dirección IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "El nombre de la interfaz es demasiado largo" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interfaz no encontrada: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "No se soporta el multicast específico de la fuente para IPv4" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "No se soporta el multicast específico de la fuente para IPv6" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Error al aceptar la conexión: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Conexión en progreso" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "No se pudo obtener el error pendiente: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Error al recibir los datos: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Error al enviar los datos: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "No se pudo desconectar el socket: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Error al cerrar el socket: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Esperando la condición del socket: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "No se pudo enviar el mensaje: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Vectores de mensaje demasiado largos" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Error al enviar el mensaje: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage no está soportado en Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Error al recibir el mensaje: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "No se pudieron leer las credenciales del socket: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials no está implementado en este SO" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "No se pudo conectar al servidor proxy %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "No se pudo conectar a %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "No se pudo conectar: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "No se soporta intentar hacer de proxy sobre una conexión que no es TCP." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "El protocolo del proxy «%s» no está soportado." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "El «listener» ya está cerrado" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "El socket añadido está cerrado" @@ -4304,96 +4348,96 @@ msgstr "El proxy SOCKSv5 no soporta el tipo de dirección proporcionado." msgid "Unknown SOCKSv5 proxy error." msgstr "Error desconocido del proxy SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Falló en la creación de un conducto (pipe) para comunicarse con el proceso " "hijo (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "En esta plataforma no se soportan las tuberías" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "No se puede manejar la versión %d de la codificación GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "No se han encontrado direcciones válidas" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Error al resolver «%s» de forma inversa: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Error al analizar el registro DNS %s: paquete DNS mal formado" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No hay un registro de DNS del tipo solicitado para «%s»" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "No se puede resolver «%s» temporalmente" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Error al resolver «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Paquete DNS mal formado" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Falló al analizar la respuesta DNS para «%s» " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "No se encontró ninguna clave privada codificada con PEM" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "No se pudo descifrar la clave privada codificada con PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "No se pudo analizar la clave privada codificada con PEM" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "No se encontró ningún certificado codificado con PEM" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "No se pudo analizar el certificado codificado con PEM" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Este «backend» de TLS actual no soporta crear certificados PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Este GTlsBackend no soporta crear certificados PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4403,7 +4447,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4411,138 +4455,151 @@ msgstr "" "Se han introducido varias contraseñas incorrectas, y su acceso se bloqueará " "después de más fallos." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "La contraseña introducida no es correcta." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "No se soporta el envío de FD" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Se esperaba un mensaje de control, se obtuvo %d" msgstr[1] "Se esperaba un mensaje de control, se obtuvieron %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Tipos de datos complementarios inesperados" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Se esperaba un fd pero se obtuvo %d\n" msgstr[1] "Se esperaba un fd pero se obtuvieron %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Se recibió un fd no válido" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "No se soporta recibid FD" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Error al enviar las credenciales: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Error al comprobar si SO_PASSCRED está activada para el socket: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Error al activar SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Se esperaba leer un solo byte para recibir las credenciales pero se leyeron " "cero bytes" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "No se esperaba un mensaje de control, pero se obtuvo %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Error al desactivar SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Error al leer del descriptor del archivo: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Error al cerrar el descriptor del archivo: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Sistema de archivos raíz" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Error al escribir en el descriptor del archivo: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" "Este sistema no soporta direcciones de socket de dominio UNIX abstracto" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "el volumen no implementa la expulsión" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "el volumen no implementa la expulsión o expulsión con operación" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "La aplicación «%s» en el objeto de la aplicación no tiene verbos" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"La aplicación «%s» y el manejador «%s» en el objeto de la aplicación no " +"tiene verbos" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Error al leer del gestor: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Error al cerrar el gestor: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Error al escribir en el gestor: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "No hay suficiente memoria" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Error interno: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Se necesita más entrada" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Datos comprimidos no válidos" @@ -4570,150 +4627,288 @@ msgstr "Ejecutar un servicio dbus" msgid "Wrong args\n" msgstr "Argumentos incorrectos\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Falló al abrir «%s»: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Error: no se pudo escribir la salida completa: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Error: falló al renombrar «%s» a «%s»: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Incluir carpetas en la ruta de búsqueda GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Archivo de salida" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Biblioteca compartida" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Mostrar mensajes de depuración" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Mostrar mensajes detallados" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Mostrar el número de versión del programa y salir" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Error al analizar los argumentos: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Especifique exactamente un archivo de salida" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Error al analizar el archivo «%s»: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Falló al construir el tipo de biblioteca para el módulo «%s»" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Tipo de biblioteca no valido para el módulo «%s»: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Mostrar toda la información disponible" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Falló al analizar: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "No hay archivos de entrada" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Falló al leer «%s»: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Falló al crear el tipo de biblioteca «%s»: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Falló al cargar el tipo de biblioteca: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Advertencia: %u módulos omitidos" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Tipo de biblioteca que inspeccionar" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERSION" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Listar las bibliotecas compartidas que requiere el tipo de biblioteca" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Listar otros tipos de biblioteca que requiere el tipos de biblioteca" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "El tipo de biblioteca que inspeccionar" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "ESPACIODENOMBRES" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr ". Inspeccionar tipo de biblioteca GI" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Falló al analizar las opciones de la línea de comandos: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Especifique exactamente un espacio de nombres" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Especifique --print-shlibs, --print-typelibs o ambas" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Atributo inesperado «%s» para el elemento «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "El atributo «%s» del elemento «%s» no se ha encontrado" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Etiqueta «%s» inesperada, se esperaba la etiqueta «%s»" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Etiqueta «%s» inesperada dentro de «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Fecha/hora «%s» no válida en el archivo de marcadores" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "" "No se pudo encontrar ningún archivo de marcadores válido en las carpetas de " "datos" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Ya existe un marcador para el URI «%s»" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No se encontró un marcador para el URI «%s»" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Ningún tipo MIME definido en el marcador para la URI «%s»" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "No se ha definido ningún flag privado en el marcador para el URI «%s»" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No se ha establecido ningún grupo en el marcador para el URI «%s»" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Ninguna aplicación con nombre «%s» registró un marcador para «%s»" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Falló la expansión de lalinea ejecutable «%s» con el URI «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Carácter no representable en entrada de conversión" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Hay una secuencia parcial de caracteres en el final de la entrada" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "No se puede convertir el fallback «%s» al conjunto de códigos «%s»" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Tipo NUL empotrado en la entrada de conversión" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Tipo NUL empotrado en la salida de conversión" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "El URI «%s» no es una URI absoluta utilizando el esquema «file»" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "El URI «%s» no es válido" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "El nombre del host de la URI «%s» no es válido" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "El URI «%s» contiene caracteres de escape no válidos" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "El nombre de la ruta «%s» no es una ruta absoluta" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %H:%M:%S, %-d de %B de %Y" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4734,62 +4929,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "enero" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "febrero" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "marzo" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "abril" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "mayo" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "junio" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "julio" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "agosto" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "septiembre" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "octubre" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "noviembre" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "diciembre" @@ -4811,132 +5006,132 @@ msgstr "diciembre" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "ene" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "abr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "may" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "jun" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "jul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "ago" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "oct" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "dic" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Lunes" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Martes" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Miércoles" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Jueves" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Viernes" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Sábado" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Domingo" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Lun" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Mar" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Mié" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Jue" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Vie" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Sáb" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Dom" @@ -4958,62 +5153,62 @@ msgstr "Dom" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "enero" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "febrero" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "marzo" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "abril" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "mayo" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "junio" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "julio" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "agosto" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "septiembre" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "octubre" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "noviembre" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "diciembre" @@ -5035,193 +5230,205 @@ msgstr "diciembre" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "ene" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "abr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "may" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "jun" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "jul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "ago" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "oct" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "dic" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Falló al abrir la carpeta «%s»: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "No se pudo asignar %lu byte para leer el archivo «%s»" -msgstr[1] "No se pudieron asignar %lu bytes para leer el archivo «%s»" +msgid "Could not allocate %s to read file “%s”" +msgstr "No se pudo asignar %s byte para leer el archivo «%s»" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Error al leer el archivo %s: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "El archivo «%s» es demasiado grande" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:825 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "No se pudo asignar %s" +msgstr[1] "No se pudieron asignar %s" + +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Falló al leer del archivo «%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:900 glib/gfileutils.c:975 glib/gfileutils.c:1482 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Falló al abrir el archivo «%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:913 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Falló al obtener los atributos del archivo «%s»: fstat() falló: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:944 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Falló al abrir el archivo «%s»: fdopen() falló: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1045 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Falló al renombrar el archivo «%s» a «%s»: g_rename() falló: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1144 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Falló al escribir el archivo «%s»: falló ftruncate(): %s" + +#: glib/gfileutils.c:1189 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Falló al escribir el archivo «%s»: falló write(): %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1210 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Falló al escribir el archivo «%s»: falló fsync(): %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1371 glib/gfileutils.c:1788 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Falló al crear el archivo «%s»: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1416 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "El archivo existente «%s» no se pudo eliminar: g_unlink() falló: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1753 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "La plantilla «%s» no es válida, no debería contener un «%s»" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1766 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "La plantilla «%s» no contiene XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2360 glib/gfileutils.c:2389 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Falló al leer el enlace simbólico «%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "No se pudo abrir el conversor de «%s» a «%s»: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "No se puede hacer una lectura en bruto (raw) en g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Se han dejado datos no convertidos en el búfer de lectura" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "El canal termina en un carácter parcial" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" "No se puede hacer una lectura en bruto (raw) en g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "" "No se pudo encontrar la clave de archivo válida en las carpetas de búsqueda" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "No es un archivo regular" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5229,45 +5436,45 @@ msgstr "" "El archivo de claves contiene la línea «%s» que no es un par valor-clave, " "grupo o comentario" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Nombre de grupo no válido: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "El archivo de claves no empieza por un grupo" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Nombre de clave no válido: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "El archivo de claves contiene una codificación «%s» no soportada" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "El archivo de claves no tiene el grupo «%s»" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "El archivo de claves no tiene la clave «%s» en el grupo «%s»" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "El archivo de claves contiene la clave «%s» con el valor «%s» el cual no es " "UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." @@ -5275,7 +5482,7 @@ msgstr "" "El archivo de claves contiene la clave «%s» que tiene un valor que no se " "puede interpretar." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5284,38 +5491,38 @@ msgstr "" "El archivo de claves contiene la clave «%s» en el grupo «%s» que tiene un " "valor que no puede interpretarse." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "La clave «%s» en el grupo «%s» tiene el valor «%s», pero se esperaba %s" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "" "El archivo de claves contiene un carácter de escape al final de la línea" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "El archivo de claves contiene la secuencia de escape no válida «%s»" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "El valor «%s» no puede interpretarse como un número." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "El valor entero «%s» está fuera de rango" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "El valor «%s» no puede interpretarse como un número de coma flotante." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "El valor «%s» no puede interpretarse como un booleano." @@ -5336,32 +5543,32 @@ msgstr "Falló al mapear el archivo «%s%s%s%s»: mmap() falló: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Falló al abrir el archivo «%s»: open() falló: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Error en la línea %d, carácter %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Texto codificado como UTF-8 en el nombre no válido; «%s» no es válido" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "«%s» no es un nombre válido" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "«%s» no es un nombre válido: «%c»" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Error en la línea %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5371,7 +5578,7 @@ msgstr "" "carácter de referencia( por ejemplo ê) - tal vez el dígito es demasiado " "grande" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5381,24 +5588,24 @@ msgstr "" "un carácter «&» sin pretender iniciar una entidad; escape el carácter \"&\" " "como &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "El carácter de referencia «%-.*s» no codifica un carácter permitido" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "La entidad «&;» está vacía; las entidades válidas son: & " < " "> '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "El nombre de la entidad «%-.*s» es desconocido" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5407,11 +5614,11 @@ msgstr "" "\"&\" sin la intención de indicar una entidad, escape el signo \"&\" como " "&" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "El documento debe comenzar con un elemento (por ejemplo: )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5420,7 +5627,7 @@ msgstr "" "«%s» no es un carácter válido a continuación del carácter '<'; no debe " "iniciar un nombre de elemento" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5429,12 +5636,12 @@ msgstr "" "Carácter «%s» impropio, se esperaba un carácter «>» para terminar la " "etiqueta vacía del elemento «%s»" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Demasiados atributos en el elemento «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5442,7 +5649,7 @@ msgstr "" "Carácter «%s» impropio, se esperaba el carácter '=' después del nombre de " "atributo «%s» del elemento «%s»" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5453,7 +5660,7 @@ msgstr "" "etiqueta de inicio del elemento «%s» u opcionalmente un atributo; tal vez " "utilizó un carácter que no es válido en un nombre de atributo" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5462,7 +5669,7 @@ msgstr "" "Carácter «%s» impropio, se esperaba una marca de apertura de comillas " "después del signo igual al darle valor al atributo «%s» del elemento «%s»" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “'" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Se cerró el elemento «%s», no existe ningún elemento abierto" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" "Se cerró el elemento «%s», pero el elemento que está abierto actualmente es " "«%s»" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "El documento estaba vacío o sólo contenía espacios en blanco" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "El documento termina inesperadamente justo después de un '<'" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5509,7 +5716,7 @@ msgstr "" "El documento termina inesperadamente con elementos todavía abiertos - «%s» " "fue el último elemento abierto" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5518,21 +5725,21 @@ msgstr "" "El documento termina inesperadamente, se esperaba un carácter '>' " "finalizando la etiqueta <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "El documento termina inesperadamente dentro de un nombre de elemento" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "El documento termina inesperadamente dentro de un nombre de atributo" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "" "El documento terminó inesperadamente dentro de una etiqueta de apertura de " "elemento." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5540,266 +5747,266 @@ msgstr "" "El documento termina inesperadamente después de los signos igual que siguen " "al nombre de atributo; sin valor de atributo" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "El documento termina inesperadamente dentro del valor de un atributo" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" "El documento termina inesperadamente dentro de la etiqueta de cierre del " "elemento «%s»" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "El documento termina inesperadamente dentro de la etiqueta de cierre para un " "elemento no abierto" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "El documento termina inesperadamente dentro de un comentario o instrucción " "de proceso" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPCIÓN…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Opciones de ayuda:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Mostrar opciones de ayuda" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Muestra todas las opciones de ayuda" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Opciones de la aplicación:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Opciones:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "No se puede analizar el valor entero «%s» para %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "El valor entero «%s» para %s está fuera de rango" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "No se puede analizar el valor doble «%s» para %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "El valor doble «%s» para %s está fuera de rango" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Error al analizar la opción: %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Falta un argumento para %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Opción desconocida %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "objeto corrupto" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "sin memoria" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "error interno" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" "el patrón contiene elementos no soportados para una coincidencia parcial" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "no se soportan referencias anteriores como condiciones para coincidencias " "parciales" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "se alcanzó el límite de recursividad" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "desplazamiento erróneo" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "bucle de repetición" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "solicitado el modo de coincidencia que no se compiló para JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "error desconocido" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ al final del patrón" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c al final del patrón" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "carácter no reconocido después de \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "números fuera de rango en el cuantificador {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "número demasiado grande en el cuantificador {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "falta la terminación ] para la clase de carácter" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "secuencia de escape no válida en la clase de carácter" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "rango fuera de orden en la clase de carácter" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nada que repetir" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "carácter no reconocido después de (? o (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "Sólo se soportan las clases con nombres POSIX dentro de una clase" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "los elementos POSIX recopilados no están soportados" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "falta el ) de terminación" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "referencia a un subpatrón no existente" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "falta ) después del comentario" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "la expresión regular es demasiado larga" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "número o nombre mal formado después de (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "la comprobación «lookbehind» no tiene una longitud fija" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "el grupo condicional contiene más de dos ramas" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "se esperaba una comprobación después de (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "una referencia con número no puede ser cero" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nombre de clase POSIX desconocido" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "el valor del carácter en la secuencia \\x{…} es demasiado largo" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "no se permite \\C en comprobaciones «lookbehind»" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "falta el terminador en el nombre del subpatrón" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dos subpatrones tienen el mismo nombre" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "secuencia \\P o \\p mal formada" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "nombre de propiedad desconocido después de \\P o \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "el nombre del subpatrón es demasiado largo (máximo 32 caracteres)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "demasiados subpatrones con nombre (máximo 10.000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "el valor octal es mayor que \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "el grupo DEFINE contiene más de una rama" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "opciones NEWLINE inconsistentes" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5807,236 +6014,236 @@ msgstr "" "\\g no está seguido por un nombre entre llaves, corchetes angulares o número " "o entre comillas, o por un número simple" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "no se permite un argumento para (*ACCEPT), (*FAIL), o (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) no reconocido" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "el número es demasiado grande" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "falta elnombre del subpatrón después de (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "no se permiten diferentes nombres para subpatrones del mismo número" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) debe tener un argumento" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c debe estar seguido de un carácter ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k no está seguido por un nombre entre llaves, corchetes angulares o entre " "comillas" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N no está soportado en una clase" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "el nombre es demasiado largo en (*MARK), (*PRUNE), (*SKIP), o (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "desbordamiento de código" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "carácter no reconocido después de (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "se desbordó el espacio de trabajo de compilación" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "no se encontró el subpatrón referenciado anteriormente comprobado" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Error al coincidir con la expresión regular %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "La biblioteca PCRE está compilada sin soporte para UTF8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "La biblioteca PCRE está compilada con opciones incompatibles" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Error al compilar la expresión regular «%s» en el carácter %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "se esperaba un dígito hexadecimal o «}»" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "se esperaba un dígito hexadecimal" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "falta «<» en la referencia simbólica" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "referencia de símbolo sin terminar" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "referencia simbólica de longitud cero" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "se esperaba un dígito" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "referencia simbólica ilegal" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "«\\» al final de la cadena" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "secuencia de escape desconocida" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Error al analizar el texto de reemplazo «%s» en el carácter %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "El texto entrecomillado no empieza por un signo de comilla" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Falta una comilla en la línea de comandos o en otro texto con comillas tipo " "shell" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "" "El texto termina justo después de un carácter '\\'. (El texto era «%s»)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "El texto terminó antes de que se encontrase la comilla correspondiente con " "%c. (El texto era «%s»)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "El texto está vacío (o sólo contiene espacios en blanco)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Falló en la lectura de datos desde el proceso hijo (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Error inesperado al leer datos desde el proceso hijo (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Falló inesperado en waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "El proceso hijo terminó con el código %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "El proceso hijo terminado por la señal %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "El proceso hijo se detuvo por la señal %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "El proceso hijo terminó de forma anormal" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Falló al leer desde el conducto hijo (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Falló al bifurcar (fork) (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Falló al cambiar a la carpeta «%s» (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Falló al abrir el archivo para volver a mapear el descriptor: (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Falló al duplicar el descriptor del archivo para el proceso hijo (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Falló al bifurcar el proceso hijo (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Falló al cerrar el descriptor del archivo para el proceso hijo (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Error desconocido al ejecutar el proceso hijo «%s»" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Falló al leer suficientes datos desde el conducto del pid hijo (%s)" @@ -6093,78 +6300,78 @@ msgstr "" "Falló inesperado en g_io_channel_win32_poll() al leer datos desde un proceso " "hijo" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Una cadena vacía no es un número" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» no es un número con signo" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "El número «%s» está fuera de los límites [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» no es un número sin signo" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "codificación %-e no válida en el URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Caracter ilegal en el URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Caracteres no UTF-8 en el URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Dirección IPv6 «%.*s» no válida en el URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Dirección IP codificada «%.*s» no válida en el URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nombre de equipo traducido «%.*s» no válido en el URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "No se pudo analizar el puerto «%.*s» en el URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Puerto «%.*s» en el URI fuera de rango" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "El URI «%s» no es un URI absoluto" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "El URI «%s» no tiene componente de equipo" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "El URI no es absoluto y no se ha proporcionado un URI base" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Faltan el «=» y el valor del parámetro" @@ -6245,65 +6452,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6408,6 +6615,48 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Mensaje de METHOD_RETURN: falta el campo de cabecera REPLY_SERIAL o no es " +#~ "válido" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "backtracking limit reached" #~ msgstr "se alcanzó el límite de «backtracking»" @@ -6613,9 +6862,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[ARGS...]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "Falló al crear el archivo temporal: %s" - #~ msgid "" #~ "Message has %d file descriptors but the header field indicates %d file " #~ "descriptors" diff --git a/po/eu.po b/po/eu.po index a9476e8..168a6d8 100644 --- a/po/eu.po +++ b/po/eu.po @@ -5,13 +5,13 @@ # Hizkuntza Politikarako Sailburuordetza , 2004. # Iñaki Larrañaga Murgoitio , 2004, 2005, 2006, 2007, 2008, 2009, 2010. # Iñaki Larrañaga Murgoitio , 2011, 2012, 2013, 2014, 2015, 2016, 2017. -# Asier Sarasua Garmendia , 2019, 2020, 2021, 2022, 2023. +# Asier Sarasua Garmendia , 2019, 2020, 2021, 2022, 2023, 2024. # msgid "" msgstr "Project-Id-Version: glib master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-06 12:12+0000\n" -"PO-Revision-Date: 2023-09-07 10:00+0100\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-01 10:00+0100\n" "Last-Translator: Asier Sarasua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" @@ -38,36 +38,40 @@ msgstr "Huts egin du ‘%s’ eduki motarako aplikazio lehenetsia aurkitzeak" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Huts egin du ‘%s’ URI eskemarako aplikazio lehenetsia aurkitzeak" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication aplikazioaren aukerak:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Erakutsi GApplication-en aukerak" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Sartu GApplication zerbitzu moduan (erabili D-Bus zerbitzuaren fitxategietatik)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Gainidatzi aplikazioaren IDa" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Inprimatu aplikazioaren bertsioa" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Ordeztu exekuzioan dagoen instantzia" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Erakutsi laguntza" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMANDOA]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Bistaratu bertsioa" @@ -120,7 +124,7 @@ msgid "APPID" msgstr "APP_ID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "KOMANDOA" @@ -132,9 +136,13 @@ msgstr "Erakutsi komandoaren laguntza xehea" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Aplikazioaren identifikatzailea D-bus formatuan (adib: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FITXATEGIA" @@ -158,7 +166,7 @@ msgstr "PARAMETROA" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Ekintza deitzean emango zaion parametroa, GVariant formatuan" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -171,12 +179,12 @@ msgstr "'%s' komando ezezaguna\n" msgid "Usage:\n" msgstr "Erabilera:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumentuak:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTUAK…]" @@ -265,78 +273,78 @@ msgid "" msgstr "komando ezezaguna: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Zenbaketaren balio handiegia honi pasatuta: %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Ez da bilaketarik onartzen oinarrizko korrontean" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Ezin da GBufferedInputStream trunkatu" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Korrontea jadanik itxita dago" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Trunkatzea ez da onartzen oinarrizko korrontean" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Eragiketa bertan behera utzi da" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Baliogabeko objektua, hasieratu gabe dago" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Byteen sekuentzia baliogabea sarreran" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Ez dago nahikoa lekurik helburuan" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Byteen sekuentzia baliogabea bihurketa-sarreran" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Errorea bihurtzean: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Hasieratzea bertan behera uztea ez dago onartuta" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "“%s” karaktere-multzoa “%s” bihurtzea ez da onartzen" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Ezin izan da “%s” “%s” bihurtzeko tresna ireki" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s mota" @@ -350,203 +358,203 @@ msgstr "Mota ezezaguna" msgid "%s filetype" msgstr "%s fitxategi mota" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials-ek baliogabeko datuak ditu" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials ez dago inplementatuta SE honetan" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Ez dago GCredentials euskarririk plataforma honetan" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials-ek ez dauka prozesuaren IDrik SE honetan" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Kredentzialak usurpatzea ezinezkoa da SE honetan" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Ustekabeko korronte-amaiera azkarregia" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Onartu gabeko “%s” gakoa helbidearen “%s” sarreran" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Zentzurik gabeko gakoa/balioa bikotearen konbinazioa “%s” helbidearen sarreran" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" msgstr "“%s” helbidea baliogabea da (gako hauetako bat behar du: “path” (bide-izena), “tmpdir” (aldi baterako direktorioa) edo “abstract” (abstraktua))" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Errorea “%s” helbidean — “%s” atributua gaizki osatuta dago" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "“%2$s” helbidearen “%1$s” garraioa ezezaguna edo onartu gabea" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "“%s” helbidearen elementuak ez dauka bi punturik (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "“%s” helbidearen elementuko garraio-izenak ez du hutsik egon behar" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" msgstr "%d. gakoa/balioa bikoteak, “%s”, “%s” helbidearen elementuan, ez dauka berdina (=) ikurrik" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "%d. gakoa/balioa bikoteak, “%s”, “%s” helbidearen elementuan, ez du gakoa hutsik eduki behar" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" msgstr "Errorea gakoa edo balioa iheseko modutik kentzean %d. gakoa/balioa bikotean, “%s”, “%s” helbidearen elementuan" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" msgstr "Errorea “%s” helbidean - unix-eko garraioak “path” edo “abstract” gakoetariko bat behar du hain zuzen." -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Errorea “%s” helbidean — ostalariaren atributua falta da edo gaizki osatuta dago" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Errorea “%s” helbidean — atakaren atributua falta da edo gaizki osatuta dago" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "Errorea “%s” helbidean — izendapenaren fitxategiaren atributua falta da edo gaizki osatuta dago" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Errorea automatikoki abiaraztean: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Errorea “%s” izendapeneko fitxategia irekitzean: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Errorea “%s” izendapeneko fitxategitik irakurtzean: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Errorea “%s” izendapeneko fitxategitik irakurtzean: 16 byte espero ziren, baina %d lortu dira" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Errorea “%s” izendapeneko fitxategiko edukia korrontean idaztean:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Emandako helbidea hutsik dago" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Ezin da mezuaren deia abiarazi AT_SECURE ezarrita dagoenean" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Ezin da mezuaren deia abiarazi makinaren IDrik gabe: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Ezin da D-Bus automatikoki abiarazi X11 $DISPLAY gabe" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Errorea “%s” komando-lerroa abiaraztean: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Ezin da saioaren bus-eko helbidea zehaztu (ez dago SE honetan garatuta)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" msgstr "Ezin da bus-aren helbidea zehaztua inguruneko DBUS_STARTER_BUS_TYPE aldagaitik. “%s” balio ezezaguna" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" msgstr "Ezin da bus-aren helbidea zehaztua, inguruneko DBUS_STARTER_BUS_TYPE aldagaia ezarri gabe dagoelako" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "%d bus mota ezezaguna" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Edukiaren zati bat falta da lerro bat irakurtzean" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Edukiaren zati bat falta da lerro bat modu seguruan irakurtzean" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "Autentifikazioko metodo guztiak agortuta (saiatuta: %s) (erabilgarri: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Edukiaren zati bat falta da byte bat irakurtzean" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Erabiltzailearen IDak ID bera izan behar du parekoan eta zerbitzarian" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Bertan behera utzita GDBusAuthObserver::authorize-authenticated-peer erabiliz" @@ -566,13 +574,13 @@ msgstr "“%s” direktorioko baimenak gaizki osatuta. 0700 modua espero zen, ba msgid "Error creating directory “%s”: %s" msgstr "Errorea “%s” direktorioa sortzean: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Eragiketa ez dago onartuta" @@ -633,15 +641,15 @@ msgstr "Errorea “%s” gako sorta idazteko irekitzean: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Gainera, “%s”(r)en blokeoa askatzeak ere huts egin du: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Konexioa itxi egin da" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Denbora-mugara iritsi da" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "Onartu gabeko banderak aurkitu dira bezeroaren aldeko konexioa eraikitzean" @@ -728,74 +736,89 @@ msgstr "Azpizuhaitza jadanik %s(e)ra esportatuta" msgid "Object does not exist at path “%s”" msgstr "Objekturik ez da existitzen “%s” bide-izenean" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "%s mezua: %s goiburu-eremua baliogabea da; ‘%s’ motako balioa espero zen" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s mezua: %s goiburu-eremua falta da edo baliogabea da" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s mezua: goiburu-eremu BALIOGABEA eman da" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "%s mezua: PATH goiburu-eremua '/org/freedesktop/DBus/Local' balio erreserbatua erabiltzen ari da" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "%s mezua: INTERFACE goiburu-eremuak ez du baliozko interfaze-izenik" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "%s mezua: INTERFACE goiburu-eremua '/org/freedesktop/DBus/Local' balio erreserbatua erabiltzen ari da" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s mezua: MEMBER goiburu-eremuak ez du baliozko kide-izenik" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "%s mezua: ERROR-NAME goiburu-eremuak ez du baliozko errore-izenik" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "mota baliogabea da" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "METHOD_CALL-en mezua: goiburuko PATH edo MEMBER eremua falta da edo baliogabea da" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "METHOD_RETURN-en mezua: goiburuko REPLY_SERIAL eremua falta da edo baliogabea da" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "ERROR-en mezua: goiburuko REPLY_SERIAL edo ERROR_NAME eremua falta da edo baliogabea da" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "SIGNAL-en mezua: goiburuko PATH, INTERFACE edo MEMBER eremua falta da edo baliogabea da" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "SIGNAL-en mezua: goiburuko PATH eremua '/org/freedesktop/DBus/Local' balio erreserbatua erabiltzen ari da" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "SIGNAL-en mezua: goiburuko INTERFACE eremua '/org/freedesktop/DBus/Local' balio erreserbatua erabiltzen ari da" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "byte %lu irakurtzea nahi zen, baina soilik %lu lortu da" msgstr[1] "%lu byte irakurtzea nahi ziren, baina %lu lortu da" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "NUL bytea espero zen “%s” katearen ondoren, baina “%d” bytea aurkitu da" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " "(length of string is %d). The valid UTF-8 string up until that point was “%s”" msgstr "Baliozko UTF-8 katea espero zen, baina baliogabeko byte batzuk aurkitu dira byteen %d desplazamenduan (katearen luzera: %d). Ordura arteko baliozko UTF-8 katea honakoa zen: “%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Balioa sakonegi habiaratuta dago" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Analizatutako “%s” balioa ez da baliozko D-Bus objektuaren bide-izen bat" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Analizatutako “%s” balioa ez da baliozko D-Bus sinadura" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -804,104 +827,104 @@ msgid_plural "" msgstr[0] "%u byte luzerako matrizea aurkitu da. Gehieneko luzera 2<<26 byte da (64 MiB)." msgstr[1] "%u byte luzerako matrizea aurkitu da. Gehieneko luzera 2<<26 byte da (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" msgstr "“a%c' motako matrizea aurkitu da, expected to have a length a multiple of %u byteko multiploko luzera edukitzea espero zen, baina %u byteko luzera du" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "D-Bus-en ez dira hutsik dauden egiturak (tuplak) onartzen" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Analizatutako “%s” balioa aldagaiarentzat ez da baliozko D-Bus sinadura bat" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "Errorea GVariant deserializatzean “%s” kate motarekin D-Bus konexioko formatutik" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "Baliogabeko endian balioa. 0x6c (“l“) edo 0x42 (“B“) espero zen, baina 0x%02x balioa aurkitu da." -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Protokoloaren bertsio nagusia baliogabea. 1 espero zen, baina %d aurkitu da" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Sinaduraren goiburua aurkitu da, baina ez da sinadura motakoa" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Sinaduraren goiburua “%s” sinadurarekin aurkitu da, baina gorputza hutsik dago" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Analizatutako “%s” balioa ez da baliozko D-Bus sinadura (gorputzarentzako)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "Ez dago sinaduraren goibururik mezuan, baina mezuaren gorputzak %u byte du" msgstr[1] "Ez dago sinaduraren goibururik mezuan, baina mezuaren gorputzak %u byte ditu" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Ezin da mezua deserializatu: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "Errorea GVariant serializatzean “%s” kate motarekin D-Bus konexioaren formatura" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "Mezuko fitxategi-deskriptoreen kopurua (%d) goiburu-eremukoaren (%d) desberdina da" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Ezin da mezua serializatu: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Mezuaren gorputzak “%s” sinadura du, baina ez dago sinaduraren goibururik" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" msgstr "Mezuaren gorputzak “%s” sinadura mota du, baina goiburuaren eremuko sinadura “%s” da" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Mezuaren gorputza hutsik dago, baina goiburuaren eremuko sinadura “(%s)“ da" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Errorearen itzulera “'%s” motako gorputzarekin" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Errorearen itzulera gorputz hutsarekin" @@ -921,47 +944,47 @@ msgid "Unable to get Hardware profile: %s" msgstr "Ezin da hardwarearen profila eskuratu: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Ezin izan da %s edo %s kargatu: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Errorea %s(r)en StartServiceByName deia egitean: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Ustekabeko %d erantzuna StartServiceByName(“%s”) metodotik" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " "and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "Ezin da metodoari deitu: proxyak jaberik gabeko %s izen ezaguna du eta G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START banderarekin eraiki zen" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Izen abstraktuen lekua ez da onartzen" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Ezin da izendapeneko fitxategia zehaztu zerbitzari bat sortzean" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Errorea “%s” izendapeneko fitxategian idaztean: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "“%s” katea ez da baliozko D-Bus GUID bat" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Ezin da onartu gabeko “%s” garraioa entzun" @@ -1023,6 +1046,10 @@ msgstr "Konektatu saioko bus-arekin" msgid "Connect to given D-Bus address" msgstr "Konektatu emandako D-Bus helbidera" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "HELBIDEA" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Konexioaren amaierako puntuaren aukerak:" @@ -1247,71 +1274,72 @@ msgstr "Errorea: '%s' ez da busaren izen ezagun bat\n" msgid "Not authorized to change debug settings" msgstr "Ez duzu arazketa-ezarpenak aldatzeko baimenik" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Izengabea" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Mahaigaineko fitxategiak ez du Exec eremua zehaztu" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Ezin izan da aplikazioak eskatzen duen terminala aurkitu" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Ez da aurkitu ‘%s’ programa $PATH bidean" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Ezin da erabiltzailearen aplikazioaren %s konfigurazio-karpeta sortu: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Ezin da erabiltzailearen MIMEren %s konfigurazio-karpeta sortu: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Aplikazioaren informazioari identifikatzaile bat falta zaio" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Ezin da erabiltzailearen mahaigaineko %s fitxategia sortu" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "%s(r)en definizio pertsonalizatua" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "gailuak ez dauka “egotzi” inplementatuta" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "gailuak ez dauka “egotzi” edo “egotzi eragiketarekin” inplementatuta" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "gailuak ez dauka euskarria eskaneatzeko inplementaziorik" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "gailuak ez dauka “abiatu” inplementatuta" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "gailuak ez dauka “gelditu” inplementatuta" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS motorrak ez du inplementatu TLS loturen atzitzea" @@ -1324,27 +1352,27 @@ msgstr "TLS euskarria ez dago erabilgarri" msgid "DTLS support is not available" msgstr "DTLS euskarria ez dago erabilgarri" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Ezin da GEmblem kodeketaren %d bertsioa kudeatu" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Gaizki osatutako token kopurua (%d) GEmblem kodeketan" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Ezin da GEmblemedIcon kodeketaren %d bertsioa kudeatu" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Gaizki osatutako token kopurua (%d) GEmblemedIcon kodeketan" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "GEmblen espero zen GEmblemedIcon-entzako" @@ -1352,130 +1380,135 @@ msgstr "GEmblen espero zen GEmblemedIcon-entzako" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Ontziaren muntaia ez da existitzen" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Ezin da direktorioaren gainean kopiatu" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Ezin da direktorioa kopiatu direktorio gainean" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Helburuko fitxategia existitzen da" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Ezin da direktorioa errekurtsiboki kopiatu" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Kopiatutako fitxategi barrutia ez da onartzen" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Errorea fitxategia batzean: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Lotura ez da onartzen" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Muntaien artean kopiatzea (reflink/clone) ez dago onartuta" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopiatzea (reflink/clone) ez dago onartuta edo baliogabea da" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopiatzea (reflink/clone) ez dago onartuta edo ez du funtzionatzen" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Ezin da %s atributua atzitu" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Ezin da fitxategi berezia kopiatu" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Esteka sinbolikoaren baliogabeko balioa eman da" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Esteka sinbolikoak ez dira onartzen" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Zakarrontzira botatzea ez dago onartuta" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Fitxategi-izenek ezin dute “%c” eduki" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Huts egin du “%s” txantiloirako aldi baterako direktorioa sortzeak: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "bolumenak ez dauka muntatzea inplementatuta" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Ez da aplikaziorik erregistratu fitxategi hau kudeatzeko" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumeratzailea itxi da" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Fitxategiaren enumeratzaileak eragiketa bat du lanean" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Fitxategiaren enumeratzailea itxita dago jadanik" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Ezin da GFileIcon kodeketaren %d bertsioa kudeatu" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Gaizki osatutako sarrerako datuak GFileIcon-entzako" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Korronteak ez du query_info onartzen" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Ez da bilaketarik onartzen korrontean" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Trunkatzea ez da baimentzen sarrerako korrontean" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Trunkatzea ez da onartzen korrontean" # -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Ostalari-izen baliogabea" @@ -1508,64 +1541,64 @@ msgstr "HTTP proxyaren erantzuna handiegia da" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP proxy zerbitzariak konexioa ustekabean itxi du." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Okerreko token kopurua (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Ez dago %s klasearen izen motarik" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "%s motak ez du GIcon interfazea inplementatzen" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "%s mota ez du klaserik" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Gaizko osatutako bertsio zenbakia: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "%s motak ez du from_tokens() inplementatzen GIcon interfazean" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Ezin da ikonoaren kodeketaren emandako bertsioa kudeatu" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Ez da helbiderik zehaztu" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "%u luzera luzeegia da helbidearentzako" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Helbideak aurrizkiaren luzera baino harago bitak ditu ezarrita" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Ezin izan da “%s” analizatu IP helbide-maskara gisa" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Ez dago nahikoa lekurik socket helbideentzako" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Onartu gabeko socket helbidea" @@ -1579,7 +1612,7 @@ msgstr "Sarrerako korronteak ez dauka irakurtzea inplementatuta" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Korronteak eragiketa bat du lanean" @@ -1595,7 +1628,7 @@ msgstr "Mantendu fitxategiarekin lekuz aldatzean" msgid "“version” takes no arguments" msgstr "“version” ez du argumenturik hartzen" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Erabilera:" @@ -1603,79 +1636,79 @@ msgstr "Erabilera:" msgid "Print version information and exit." msgstr "Erakutsi bertsioaren informazioa eta irten" -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Komandoak:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Kateatu fitxategiak irteera estandarrera" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopiatu fitxategi bat edo gehiago" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Erakutsi kokalekuei buruzko informazioa" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Abiarazi aplikazio bat mahaigaineko fitxategi batetik" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Zerrendatu kokalekuen edukia" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Lortu edo ezarri MIME mota baten maneiatzailea" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Sortu direktorioak" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Monitorizatu fitxategi eta direktorioen aldaketak" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Muntatu edo desmuntatu kokalekuak" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Aldatu fitxategi bat edo gehiago lekuz" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Ireki fitxategiak aplikazio lehenetsiarekin" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Aldatu fitxategi-izena" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Ezabatu fitxategi bat edo gehiago" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Irakurri sarrera estandarretik eta gorde" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Ezarri fitxategiaren atributua" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Bota fitxategi edo direktorioak zakarrontzira" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Zerrendatu kokalekuen edukia zuhaitz batean" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Komandoak:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Erabili %s laguntza xehea lortzeko.\n" @@ -1685,7 +1718,7 @@ msgid "Error writing to stdout" msgstr "Errorea irteera arruntean (stdout) idaztean" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1705,72 +1738,76 @@ msgid "" "like smb://server/resource/file.txt as location." msgstr "'cat' tresna bezala erabiltzen da 'gio cat', baina GIOren kokalekuak erabiliz lokaleko fitxategien ordez. Adibidez, honelako zerbait erabil dezakezu kokaleku gisa: smb://zerbitzaria/baliabidea/fitxategia.txt" -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Ez da kokalekurik eman" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Ez dago helburuko direktorioa" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Erakutsi jarraipena" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Galdetu gainidatzi aurretik" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Mantendu atributu guztiak" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Egin existitzen diren helburuko fitxategien babeskopia" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Inoiz ez jarraitu esteka sinbolikoak" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Erabili baimen lehenetsiak helbururako" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Erabili fitxategia aldatu deneko denbora-zigilu lehenetsia helbururako" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Transferituta: %s / %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ITURBURUA" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "HELBURUA" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopiatu fitxategi bat edo gehiago ITURBURUtik HELBURUra." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "'cp' tresna bezala erabiltzen da 'gio copy', baina GIOren kokalekuak erabiliz lokaleko fitxategien ordez. Adibidez, honelako zerbait erabil dezakezu kokaleku gisa: smb://zerbitzaria/baliabidea/fitxategia.txt" -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "'%s' helburua ez da direktorio bat" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: gainidatzi “%s”? " @@ -1811,52 +1848,52 @@ msgstr "bistaratu izena: %s\n" msgid "edit name: %s\n" msgstr "editatu izena: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "izena: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "mota: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "tamaina: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "ezkutukoa\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "URIa: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "bide-izen lokala: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix muntatzea: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Atributu ezargarriak:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Atributu idazgarrien izen-espazioak:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Erakutsi kokalekuei buruzko informazioa." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2393,7 +2430,8 @@ msgid "" msgstr "FITXATEGIA atributuak erreferentziatutako fitxategiak kargatzeko direktorioak (lehenetsia: uneko direktorioa)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "DIREKTORIOA" @@ -2440,6 +2478,10 @@ msgstr "Ez kapsulatu baliabide-datuak C fitxategian; onartu kanpotik estekatuta msgid "C identifier name used for the generated source code" msgstr "C identifikatzailearen izena (sortutako iturburuaren kodean erabilita)" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFIKATZAILEA" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Helburuko C konpilatzailea (balio lehenetsia: CC ingurumen-aldagaia)" @@ -2907,125 +2949,125 @@ msgstr "Errorea %s(r)en fitxategi-sistemako informazioa lortzean: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Ez da %s fitxategiaren muntatze-puntua aurkitzen" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Ezin da erroko direktorioa izenez aldatu" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Errorea '%s' fitxategia izenez aldatzean: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Ezin da fitxategia izenez aldatu, fitxategi-izena badago lehendik ere" # -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Fitxategi-izen baliogabea" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Errorea '%s' fitxategia irekitzean: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Errorea '%s' fitxategia kentzean: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Errorea '%s' fitxategia zakarrontzira botatzean: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Ezin izan da %s zakarrontzi-direktorioa sortu: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Ezin da '%s' zakarrontziaren goi-mailako direktorioa aurkitu" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Sistemaren barneko muntaietan ez da onartzen zakarrontzira botatzea" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Ezin izan da %s zakarrontzi-direktorioa aurkitu edo sortu %s zakarrontzian" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Ezin da '%s' fitxategiaren zakarrontzi-informazioa sortu: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Ezin da '%s' fitxategia fitxategi-sistemen arteko zakarrontzira bota" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Ezin da '%s' fitxategia zakarrontzira bota: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Ezin da '%s' fitxategia zakarrontzira bota" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Errorea '%s' direktorioa sortzean: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Fitxategi-sistemak ez ditu esteka sinbolikorik onartzen" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Errorea '%s' esteka sinbolikoa sortzean: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Errorea '%s' fitxategia lekuz aldatzean: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Ezin da direktorioa lekuz aldatu direktorioaren gainera" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Huts egin du babeskopia sortzean" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Errorea helburuko fitxategia kentzean: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Muntaien artean lekuz aldatzea ez dago onartuta" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Ezin izan da '%s' diskoaren erabilpena zehaztu: %s" @@ -3047,115 +3089,115 @@ msgstr "Atributu hedatuaren izen baliogabea" msgid "Error setting extended attribute “%s”: %s" msgstr "Errorea “%s” atributu hedatua ezartzean: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (baliogabeko kodeketa)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Errorea “'%s” fitxategiaren informazioa eskuratzean: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Errorea fitxategiaren deskriptorearen informazioa irakurtzean: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Baliogabeko atributu mota (uint32 espero zen)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Baliogabeko atributu mota (uint64 espero zen)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Baliogabeko atributu mota (byte katea espero zen)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Ezin da baimenik ezarri esteka sinbolikoetan" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Errorea baimenak ezartzean: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Errorea jabea ezartzean: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "esteka sinbolikoak NULL-en desberdina izan behar du" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Errorea esteka sinbolikoa ezartzean: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Errorea esteka sinbolikoa ezartzean: fitxategia ez da esteka sinboliko bat" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "%d nanosegundo gehigarriak negatiboak dira %lld UNIX denbora-zigiluetarako" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "%d nanosegundo gehigarriak segundo 1 dira %lld UNIX denbora-zigiluetarako" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "%lld UNIX denbora-zigilua ez da sartzen 64 bit-etan" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "%lld UNIX denbora-zigilua Windowsen onartutako barrutitik kanpo dago" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "“%s” fitxategi-izena ezin da UTF-16 kodeketara bihurtu" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "“%s” fitxategia ezin da ireki: Windows errorea %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Errorea “%s” fitxategiaren aldaketa edo atzipen denbora ezartzean: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Errorea eraldaketa edo atzipen ordua ezartzean: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux testuinguruak NULL-en desberdina izan behar du" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux ez dago gaituta sistema honetan" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Errorea SELinux testuingurua ezartzean: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "%s atributuaren ezarpena ez dago onartuta" @@ -3208,7 +3250,7 @@ msgid "Error truncating file: %s" msgstr "Errorea fitxategia trunkatzean: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Errorea “%s” fitxategia irekitzean: %s" @@ -3230,100 +3272,100 @@ msgstr "Fitxategia kanpotik aldatu da" msgid "Error removing old file: %s" msgstr "Errorea fitxategi zaharra kentzean: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Baliogabeko GSeekType eman da" # -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Bilaketa-eskaera baliogabea" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Ezin da GMemoryInputStream trunkatu" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Ezin da memoriaren irteeraren korrontea tamainaz aldatu" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Huts egin du memoriaren irteeraren korrontea tamainaz aldatzean" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" msgstr "Idazketa lantzeko behar den memoria kopurua erabilgarri dagoen helbide-espazioa baino handiagoa da" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Bilaketa eskatu da korrontearen hasieraren aurretik" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Bilaketa eskatu da korrontearen amaieraren ondoren" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "muntaiak ez dauka “unmount” (desmuntatu) inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "muntaiak ez dauka “eject” (egotzi) inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "muntaiak ez dauka “unmount” (desmuntatzea) edo “unmount_with_operation” (desmuntatu eragiketarekin) inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "muntaiak ez dauka “eject” (egotzi) edo “eject_with_operation” (egotzi eragiketarekin) inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "muntaiak ez dauka “remount” (birmuntaketa) inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "muntaiak ez dauka eduki mota sinkronoa asmatzea inplementatuta" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "muntaiak ez dauka eduki mota sinkronoa asmatzea inplementatuta" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "“%s” ostalariak “[“dauka, baina ez “]“" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Sarea atziezina" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Ostalaria atziezina" @@ -3351,7 +3393,7 @@ msgstr "NetworkManager ez dago abian" msgid "NetworkManager version too old" msgstr "NetworkManager-en bertsioa zaharregia" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Irteerako korronteak ez dauka idaztea inplementatuta" @@ -3364,39 +3406,39 @@ msgstr "%s(e)ri pasatutako bektoreen batuketa handiegia da" msgid "Source stream is already closed" msgstr "Iturburuko korrontea jadanik itxi da" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Proxy-kontsultaren zehaztu gabeko hutsegitea" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Errorea “%s” ebaztean: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s ez dago inplementatuta" # -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Baliogabeko domeinua" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "“%s”(e)ko baliabidea ez da existitzen" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Huts egin du “%s”(e)ko baliabidea deskonprimatzean" @@ -3414,11 +3456,11 @@ msgstr "“%s”(e)ko baliabidea ez da direktorio bat" msgid "Input stream doesn’t implement seek" msgstr "Sarrerako korronteak ez dauka bilaketa inplementatuta" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Zerrendatu baliabideak dituzten atalak elf fitxategi batean" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3427,15 +3469,15 @@ msgstr "Zerrendatu baliabideak\n" "ATALA ematen bada, soilik atal honetako baliabideak zerrendatu\n" "BIDE-IZENA ematen bada, bat datozen baliabideak soilik zerrendatu" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FITXATEGIA [BIDE-IZENA]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "ATALA" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3446,15 +3488,15 @@ msgstr "Zerrendatu baliabideak xehetasunez\n" "BIDE-IZENA ematen bada, bat datozen baliabideak soilik zerrendatu\n" "Xehetasunek atala, tamaina eta konpresioa daukate" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Erauzi baliabidearen fitxategia irteera estandarrean (stdout)" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FITXATEGIA BIDE-IZENA" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3481,7 +3523,7 @@ msgstr "Erabilera:\n" "Erabili “gresource help KOMANDOA“ laguntza xehea eskuratzeko.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3495,38 +3537,38 @@ msgstr "Erabilera:\n" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " ATALA elf atalaren izena (aukerakoa)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMANDOA (aukerako) komandoa deskribatzeko\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FITXATEGIA Elf fitxategia (bitarra edo partekatutako liburutegia)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" msgstr " FITXATEGIA Elf fitxategia (bitarra edo partekatutako liburutegia)\n" " edo konpilatutako baliabidearen fitxategi bat\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[BIDE-IZENA]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " BIDE-IZENA (aukerakoa) baliabidearen bide-izena (partziala izan daiteke)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "BIDE-IZENA" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " BIDE-IZENA Baliabidearen bide-izena\n" @@ -3752,213 +3794,213 @@ msgstr "Eskemaren izen hutsa eman da\n" msgid "No such key “%s”\n" msgstr "Ez dago “%s” bezalako gakorik\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Baliogabeko socket-a, hasieratu gabe dago" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Baliogabeko socket-a, hasieratzeak huts egin du: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Socket-a jadanik itxita dago" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "S/Iko socketaren denbora-muga gaindituta" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "GSocket sortzen fd-tik: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Ezin da socket-a sortu: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Familia ezezaguna zehaztu da" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Protokolo ezezaguna zehaztu da" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Ezin da datagramen eragiketarik erabili datagramak ez diren socket-etan." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Ezin da datagramen eragiketarik erabili socket-etan iraungitze-denborarik ezarri gabe." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "ezin izan da lokaleko helbidea lortu: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "ezin izan da urruneko helbidea lortu: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "ezin izan da entzun: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Errorea %s helbidearekin lotzean: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Errorea multidifusioko taldean elkartzean: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Errorea multidifusioko taldea uztean: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Iturburu zehatzeko multidifusiorik ez da onartzen" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Onartzen ez den socket familia" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "Iturburu zehatzekoa ez IPv4 helbidea" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Interfaze-izena luzeegia da" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interfazea ez da aurkitu: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "IPv4 iturburu zehatzeko multidifusiorik ez da onartzen" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "IPv6 iturburu zehatzeko multidifusiorik ez da onartzen" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Errorea konexioa onartzean: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Konexioa lantzen" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Ezin da falta diren erroreak lortu: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Errorea datuak jasotzean: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Errorea datuak bidaltzean: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Ezin da socket-a itzali: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Errorea socket-a ixtean: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Socket-aren baldintzen zai: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Ezin izan da mezua bidali: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Mezu-bektoreak luzeegiak dira" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Errorea mezua bidaltzean: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage ez da Windows sisteman onartzen" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Errorea mezua jasotzean: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Ezin da socket-aren kredentzialik irakurri: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials ez dago S.E. honetan inplementatuta" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Ezin izan da %s proxy zerbitzariarekin konektatu: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Ezin izan da %s(r)ekin konektatu: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Ezin izan da konektatu: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "TCP motakoak ez diren konexioen gainean proxya egitea ez dago onartuta." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Proxy-aren “%s” protokoloa ez dago onartuta." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Entzulea jadanik itxita dago" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Gehitutako socket-a itxi da" @@ -4047,94 +4089,94 @@ msgstr "SOCKSv5 proxyak ez du emandako helbide mota onartzen." msgid "Unknown SOCKSv5 proxy error." msgstr "SOCKSv5 proxyaren errore ezezaguna." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Ezin izan da kanalizazioa sortu prozesu haurrarekin komunikatzeko (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Plataforma honetan ez dira kanalizazioak onartzen" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Ezin da GThemedIcon kodeketaren %d bertsioa kudeatu" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Ez da baliozko helbiderik aurkitu" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Errorea “%s” alderantziz ebaztean: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Errorea DNS %s erregistroa analizatzean: gaizki osatutako DNS paketea" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Ez dago eskatutako motaren DNS erregistrorik “%s”(r)entzako" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Ezin da “%s” ebatzi aldi batean" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Errorea “%s” ebaztean" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Gaizki osatutako DNS paketea" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Huts egin du “%s”(e)rako DNS erantzuna analizatzeak: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Ez da PEMekin kodetutako ziurtagirik aurkitu" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Ezin da PEMekin kodetutako gako pribatua deszifratu" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Ezin izan da PEMekin kodetutako gako pribatua analizatu" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Ez da PEMekin kodetutako ziurtagirik aurkitu" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Ezin izan da PEMekin kodetutako ziurtagiririk analizatu" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Uneko TLS motorrak ez du PKCS #12 onartzen" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "GTlsBackend honek ez du onartzen PKCS #11 ziurtagiriak sortzeak" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4142,142 +4184,153 @@ msgstr "Hau azken aukera da pasahitza ongi sartzeko, zure sarbidetza blokeatu au #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." msgstr "Sartu diren hainbat pasahitz ez dira zuzenak, eta zure sarbidetza blokeatu egingo da hutsegite gehiagoren ondoren." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Sartutako pasahitza okerrekoa da." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "FD bidaltzea ez dago onartuta" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Kontroleko mezu 1 espero zen, %d lortu da" msgstr[1] "Kontroleko mezu 1 espero zen, %d lortu da" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Ustekabeko datu-laguntzaile mota" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "fd bat espero zen, baina %d lortu da\n" msgstr[1] "fd bat espero zen, baina %d lortu da\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Baliogabeko fd jasota" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "FD jasotzea ez dago onartuta" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Errorea kredentzialak bidaltzean: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Errorea SO_PASSCRED gaituta dagoen begiratzean socket-arentzako: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Errorea SO_PASSCRED gaitzean: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "Harrerako kredentzialentzako byte bakar bat irakurtzea espero zen, baina zero byte irakurri dira." -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Ez zen kontroleko mezurik espero, baina %d lortu dira" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Errorea SO_PASSCRED desgaitzean: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Errorea fitxategiaren deskriptoretik irakurtzean: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Errorea fitxategiaren deskriptorea ixtean: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Fitxategi-sistemaren erroa" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Errorea fitxategiaren deskriptorean idaztean: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "UNIX-eko domeinuen socket helbide abstraktuak ez daude sistema honetan onartuta" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "bolumenak ez dauka “egotzi” inplementatuta" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "bolumenak ez dauka “egotzi” edo “egotzi eragiketarekin” inplementatuta" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Aplikazio-objektuko ‘%s’ aplikazioak ez du aditzik" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "Aplikazio-objektuko ‘%s’ aplikazioak eta ‘%s’ maneiatzaileak ez dute aditzik" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Errorea heldulekutik irakurtzean: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Errorea heldulekua ixtean: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Errorea heldulekuan idaztean: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Ez dago nahikoa memoriarik" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Barneko errorea: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Sarrera gehiago behar dira" # -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Konprimatutako datu baliogabeak" @@ -4305,148 +4358,286 @@ msgstr "Exekutatu dbus zerbitzua" msgid "Wrong args\n" msgstr "Okerreko argumentuak\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Huts egin du ‘%s’ irekitzeak: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Errorea: ezin izan da irteera osoa idatzi: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Errorea: Huts egin du ‘%s’ izena aldatzeak ‘%s’ deitzeko: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Sartu GIR bilaketa-bidean dauden direktorioak" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Irteerako fitxategia" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Liburutegi partekatua" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Erakutsi arazketa-mezuak" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Erakutsi mezu xeheak" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Erakutsi bertsioaren zenbakia eta irten" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Errorea argumentuak analizatzean: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Zehaztu sarrerako fitxategi bakar bat" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Errorea '%s' fitxategia analizatzean: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Huts egin du typelib ‘%s’ modulurako eraikitzeak" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Typelib baliogabea ‘%s’ modulurako: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Erabili informazio erabilgarri guztia" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Analisiak huts egin du: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Ez dago sarrerako fitxategirik" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Huts egin du ‘%s’ irakurtzeak: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Huts egin du ‘%s’ typelib sortzeak: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Huts egin du typelib kargatzeak: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Abisua: %u moduluri ez ikusiarena egin zaie" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Ikuskatuko den typelib bertsioa" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "BERTSIOA" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Zerrendatu typelib-ek behar dituen liburutegi partekatuak" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Zerrendatu ikuskatutako typelib-ek behar dituen beste typelib-ak" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "Ikuskatuko den typelib-a" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "IZEN-ESPAZIOA" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Ikuskatu GI typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Huts egin du komando-lerroko aukeren analisiak: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Zehaztu sarrerako izan-espazio bakar bat" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Zehaztu --print-shlibs, --print-typelibs edo biak" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" -msgstr "“%2$s” elementuaren ustekabeko “%1$s” atributua" +msgstr "Ustekabeko “%s” atributua “%s” elementuan" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" -msgstr "“%2$s” elementuaren “%1$s” atributua ez da aurkitu" +msgstr "“%s” atributua ez da aurkitu “%s” elementuan" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Ustekabeko “%s” etiketa, “%s” espero zen" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" -msgstr "“%2$s” barruan ustekabeko “%1$s” etiketa" +msgstr "ustekabeko “%s” etiketa “%s” barruan" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Baliogabeko ‘%s’ data/ordua laster-marken fitxategian" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Ezin izan da baliozko laster-marken fitxategia aurkitu datuen direktorioan" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "“%s” URIaren laster-marka badago lehendik ere" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Ez da “%s” URIaren laster-markarik aurkitu" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Ez dago “%s” URIaren laster-markan MIME motarik definituta" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "“%s” URIaren laster-markan ez dago bandera pribaturik definituta" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "“%s” URIaren laster-markan ez dago talderik ezarrita" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "“%s” izeneko aplikaziorik ez du erregistratu laster-markarik '%s'(e)n" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Huts egin du “%s” exekuzioko lerroa “%s” URIarekin hedatzean" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Adierazi ezin den karakterea bihurketa-sarreran" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Karaktere-sekuentzia partziala sarreraren amaieran" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Ezin da “%s” atzerapena “%s” kode-multzo bihurtu" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "NUL byte baliogabea bihurketa-sarreran" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "NUL byte kapsulatua bihurketa-sarreran" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "“%s” URIa ez da “fitxategi“-eskema erabiltzen duen URI absolutua" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "“%s” URI baliogabea da" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "“%s” URIaren ostalari-izena baliogabea da" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "“%s” URIak ihes-karaktere baliogabeak ditu" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "“%s” bide-izena ez da bide-izen absolutua" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%y-%m-%d %T %Z" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%y/%m/%d" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4467,62 +4658,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Urtarrila" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Otsaila" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Martxoa" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Apirila" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Maiatza" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Ekaina" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Uztaila" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Abuztua" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Iraila" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Urria" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Azaroa" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Abendua" @@ -4544,132 +4735,132 @@ msgstr "Abendua" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Urt." -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Ots." -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar." -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr." -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Maiatza" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Eka." -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Uzt." -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Abu." -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Ira." -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Urr." -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Aza." -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Abe." -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Astelehena" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Asteartea" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Asteazkena" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Osteguna" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Ostirala" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Larunbata" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Igandea" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Al." -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Ar." -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Az." -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Og." -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Or." -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Lr." -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Ig." @@ -4691,62 +4882,62 @@ msgstr "Ig." #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Urtarrila" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Otsaila" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Martxoa" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "Apirila" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Maiatza" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Ekaina" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Uztaila" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Abuztua" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "Iraila" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Urria" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "Azaroa" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Abendua" @@ -4768,276 +4959,282 @@ msgstr "Abendua" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Urt." -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Ots." -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Mar." -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Apr." -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "Mai." -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Eka." -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Uzt." -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Abu." -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Ira." -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Urr." -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Aza." -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Abe." #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Errorea “%s” direktorioa irekitzean: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Ezin izan da byte %lu esleitu “%s” fitxategia irakurtzeko" -msgstr[1] "Ezin izan dira %lu byte esleitu “%s” fitxategia irakurtzeko" +msgid "Could not allocate %s to read file “%s”" +msgstr "Ezin da %s esleitu “%s” fitxategia irakurtzeko" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Errorea “%s” fitxategia irakurtzean: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "“%s” fitxategia handiegia da" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Ezin izan da “%s” fitxategitik irakurri: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Ezin izan da “%s” fitxategia ireki: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Ezin izan dira “%s” fitxategiko atributuak lortu, fstat() funtzioak huts egin du: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Ezin izan da “%s” fitxategia ireki, fdopen() funtzioak huts egin du: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Ezin izan da “%s” fitxategia “%s” gisa berrizendatu, g_rename() funtzioak huts egin du: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Huts egin du “%s” fitxategian idazteak: ftruncate() funtzioak huts egin du: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" -msgstr "Huts egin du “%s” fitxategian idaztean: fwrite() funtzioak huts egin du: %s" +msgstr "Huts egin du “%s” fitxategian idazteak: fwrite() funtzioak huts egin du: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" -msgstr "Huts egin du “%s” fitxategia idaztean: fsync() funtzioak huts egin du: %s" +msgstr "Huts egin du “%s” fitxategia idazteak: fsync() funtzioak huts egin du: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Ezin izan da “%s” fitxategia sortu: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "“%s” fitxategia ezin izan da kendu, g_unlik() funtzioak huts egin du: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "“%s” txantiloia baliogabea da, ez luke “%s” eduki behar" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "“%s” txantiloiak ez dauka: XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Ezin izan da “%s” esteka sinbolikorik irakurri: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Ezin izan da “%s”(e)tik “%s”(e)rako bihurtzailea ireki: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Ezin dira datu gordinak irakurri “g_io_channel_read_line_string“-en" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Irakurketa-bufferrean geratu diren bihurtu gabeko datuak" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanala karaktere partzial batean bukatzen da" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Ezin dira datu gordinak irakurri “g_io_channel_read_to_end“-etik" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Ezin izan da baliozko gakoa datuen direktorioan aurkitu" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Ez da fitxategi arrunta" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "Gako-fitxategiak “%s” lerroa du, gako-balioa bikotea, taldea edo iruzkinik ez daukalarik" # -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Taldearen izen baliogabea: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Gako-fitxategiak ez da talde batekin hasten" # -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Gakoaren izen baliogabea: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Gako-fitxategiak onartzen ez den “%s” kodeketa du" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Gako-fitxategiak ez dauka “%s” taldea" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Gako-fitxategiak ez dauka “%s” gakoa (“%s” taldean)" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Gako-fitxategiak “%s” gakoa dauka (%s balioduna) baina ez da UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "Gako-fitxategiak “%s” gakoa dauka, baina ezin den interpretatu balio bat dauka." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." msgstr "Gako-fitxategiak “%s” gakoa dauka ('%s taldean), baina dagokion balioa ezin da interpretatu." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" -msgstr "“%2$s” taldeko “%1$s” gakoaren balioa “%3$s” da, “%4$s” izan ordez." +msgstr "“%s” gakoaren balioa “%s” taldean “%s” da, “%s” izan ordez." -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Gako-fitxategiak ihes-karakterea dauka lerro amaieran" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Gako-fitxategiak “%s” ihes-sekuentzia baliogabea dauka" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "“%s” balioa ezin da zenbaki gisa interpretatu" -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "“%s” osoko balioa barrutitik kanpo" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "“%s” balioa ezin da zenbaki mugikor gisa interpretatu." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "“%s” balioa ezin da boolear gisa interpretatu" @@ -5057,96 +5254,96 @@ msgstr "Huts egin %s%s%s%s mapatzean. mmap() funtzioak huts egin du: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Ezin izan da “%s” fitxategia ireki, open() funtzioak huts egin du: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Errorea %d lerroko %d karakterean: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "UTF-8 gisa kodetutako testu baliogabea izenean - “%s” ez da baliozkoa" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” ez da baliozko izena" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” ez da baliozko izena: “%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Errorea %d lerroan: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " "reference (ê for example) — perhaps the digit is too large" msgstr "Ezin izan da “%-.*s” analizatu, digitu bat izan behar zuen karaktere-erreferentzia baten barruan (ê adibidez); agian digitua handiegia da" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " "as &" msgstr "Karaktere-erreferentzia ez da puntu eta komaz bukatzen; ziurrenik & ikurra erabiliko zenuen entitatea hasteko asmorik gabe. Izendatu & karakterea & gisa" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "“%-.*s” karaktere-erreferentziak ez du baimendutako karaktere bat kodetzen" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "“&;” entitatea hutsik dago; baliozko entitateak hauek dira: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "“%-.*s” entitate-izena ezezaguna da" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" msgstr "Entitatea ez da puntu eta komaz bukatzen; normalean & ikurra erabiltzen da entitatea hasteko asmorik gabe; izendatu & karakterea & gisa" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumentuak elementu batez hasi behar du (adibidez, )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "“%s” ez da baliozko karakterea '<' karakterearen atzetik; baliteke elementu baten izena ez hastea" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" msgstr "“%s” karaktere bitxia, '>' karakterea espero zen “%s” elementuaren etiketa hutsa amaitzeko" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Atributu gehiegi “%s” elementuan" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "“%s” karaktere bitxia, '=' espero zen “%s” atributuaren ondoren “%s” elementuan" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5154,556 +5351,556 @@ msgid "" "character in an attribute name" msgstr "“%s” atributuaren ondoren karaktere bitxia, “>“ edo “/“ karakterea espero zen “%s” atributuaren ondoren elementuaren hasiera-etiketa bukatzeko, edo bestela atributu bat. Agian karaktere baliogabea erabili duzu atributu-izen batean" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" msgstr "“%s” karaktere bitxia, komatxo irekia espero zen berdin ikurraren ondoren “%s” atributuari balioa ematean “%s” elementuan" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" msgstr "“%s” ez da baliozko karakterea da “%s” itxiera-elementuaren izenaren atzetik; baimendutako karakterea “>“ da" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "“%s” elementua itxi egin da, unean ez dago elementurik irekita" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "“%s” elementua itxi egin da, baina unean “%s” elementua dago irekita" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokumentua hutsik dago edo zuriuneak bakarrik ditu" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokumentua ustekabean itxi da “<“ angelu-parentesi ireki baten ondoren" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" msgstr "Dokumentua ustekabean amaitu da oraindik irekita zeuden elementuekin. “%s” irekitako azken elementua da" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " "the tag <%s/>" msgstr "Dokumentua ustekabean amaitu da, angelu-parentesi itxia ikustea espero zen <%s/> etiketa amaitzen" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokumentua ustekabean amaitu da elementu-izen baten barruan" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokumentua ustekabean amaitu da atributu-izen baten barruan" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokumentua ustekabean amaitu da elementua irekitzeko etiketa baten barruan." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" msgstr "Dokumentua ustekabean amaitu da atributu-izen baten ondorengo berdin ikurraren atzetik; ez dago atributu-baliorik" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokumentua ustekabean amaitu da atributu-balio baten barruan" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokumentua ustekabean amaitu da “%s” elementuaren itxiera-etiketaren barruan" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Dokumentua ustekabean amaitu da ireki gabeko elementu baten itxiera-etiketaren barruan" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Dokumentua ustekabean amaitu da iruzkin baten barruan edo prozesatzen ari zen instrukzio baten barruan" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[AUKERA…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Laguntzako aukerak:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Erakutsi laguntzako aukerak" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Erakutsi laguntzako aukera guztiak" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Aplikazio-aukerak:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Aukerak:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" -msgstr "Ezin da “%2$s“(r)en “%1$s” osoko balioa analizatu" +msgstr "Ezin da “%s” osoko balioa analizatu “%s“(r)ako" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" -msgstr "%2$s(r)en “%1$s” osoko balioa barrutitik kanpo" +msgstr "“%s” osoko balioa barrutitik kanpo %s(r)ako" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" -msgstr "Ezin da “%2$s“(r)en “%1$s” balio bikoitza analizatu" +msgstr "Ezin da “%s” balio bikoitza analizatu “%s“(r)ako" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" -msgstr "%2$s(r)en “%1$s” balio bikoitza barrutitik kanpo" +msgstr "“%s” balio bikoitza barrutitik kanpo %s(r)ako" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Errorea %s aukera analizatzean" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "%s(e)ko argumentua falta da" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "%s aukera ezezaguna" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "hondatutako objektua" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "Memoriarik ez" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "barneko errorea" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "ereduak zenbait elementu ditu bat etortze partzialetan onartzen ez direnak" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "aurreko erreferentziak baldintza gisa ez daude onartuta bat etortze partzialetan" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "errekurtsioaren muga gainditua" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "okerreko desplazamendua" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "errekurtsioaren begizta" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "eskatu den bat etortze modua ez da konpilatu JITerako" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "errore ezezaguna" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ ereduaren amaieran" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c ereduaren amaieran" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "karaktere ezezagunak jarraitzen dio \\ karaktereari" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "zenbakiak barrutitik kanpo {} kuantifikatzailean" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "zenbaki handiegiak {} kuantifikatzaileak" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "karaktere-klasearen amaierako ] falta da" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "karaktere-klasean baliogabeko ihes sekuentzia" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "karaktere-klaseko barrutia barrutitik kanpo" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "ezer ez errepikatzeko" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "karaktere ezezaguna (? edo (?- karaktereen atzetik" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX izeneko klaseak soilik onartzen dira klase baten barruan" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "Tartekatutako POSIX elementuak ez daude onartuta" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "amaierako ) falta da" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "existitzen ez den azpieredu baten erreferentzia" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "iruzkinaren ondoren ) falta da" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "adierazpen erregularra luzeegia da" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "gaizki osatutako zenbakia edo izena (?(-ren atzetik" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "'lookbehind' baieztapenak ez du luzera finkorik" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "baldintza taldeak bi adar baino gehiago ditu" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "baieztapena espero zen (?)-ren atzetik" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "zenbatutako erreferentzia bat ezin du zero izan" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "POSIX klasearen izen ezezaguna" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "\\x{…} sekuentziako karaktere-balioa luzeegia da" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C ez dago baimenduta 'lookbehind' baieztapenean" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "amaierako karakterea falta da azpiereduko izenean" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "bi azpiereduk izen berdina dute" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "gaizki osatutako \\P edo \\p sekuentzia" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "propietate-izen ezezaguna \\P edo \\p atzetik" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "azpiereduaren izena luzeegia (32 karaktere gehienez)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "izendun azpieredu gehiegi (10.000 gehienez)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "balio zortzitarra \\377 baino handiagoa" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE taldeak adar bat baino gehiago ditu" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "NEWLINE aukera inkoherentea" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" msgstr "\\g ez da parentesi, kortxete edo aipu motako izena edo zenbaki, edo zenbaki soil batekin jarraitzen" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "argumentu bat ez dago onartuta (*ACCEPT), (*FAIL), edo (*COMMIT)-entzako" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) ez da ezagutzen" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "zenbakia handiegia da" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "azpiereduaren izena falta da (?& ondoren" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "zenbaki berdinaren azpiereduen izen desberdinak ez daude onartuta" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) argumentu bat eduki behar du" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c ondoren ASCII karaktere bat behar da" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "\\k ondoren ez dago parentesi, kortxete edo aipatutako izen bat" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N ez dago klase batean onartuta" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "izena luzeegia da (*MARK), (*PRUNE), (*SKIP), edo (*THEN)-en" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "kodea gainezkatua" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "karaktere ezezaguna (?P karaktereen atzetik" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "konpilazioaren laneko area gainezkatua" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "ez da aurrez egiaztatutako erreferentziatutako azpieredua aurkitu" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Errorea %s adierazpen erregularra bilatzean: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE liburutegia UTF8 euskarri gabe konpilatua" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE liburutegia aukera bateragarririk gabe konpilatua" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Errorea ‘%s’adierazpen erregularra %s karakterean konpilatzean: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "digitu hamaseitarra edo “}“ espero zen" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "digitu hamaseitarra espero zen" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "“<“ falta da erreferentzia sinbolikoan" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "amaitu gabeko erreferentzia sinbolikoa" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "zero luzerako erreferentzia sinbolikoa" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "digitua espero zen" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "erreferentzia sinboliko ilegala" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "“\\“ katearen amaieran" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "ihes-sekuentzi ezezaguna" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Errorea ordezko “%s” testua analizatzean %lu karakterean: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Komatxo arteko testua ez da komatxoekin hasten" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Bat ez datozen komatxoak daude komando-lerroan edo shell-ak aipatutako beste testu batean" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Testua “\\“ karakterearen atzetik amaitu da. (Testua “%s” zen)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "Testua %c(r)en komatxoak aurkitu baino lehen amaitu da. (Testua “%s” zen)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Testua hutsik dago (edo zuriuneak bakarrik ditu)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Ezin izan da daturik irakurri prozesu umetik (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Ustekabeko errorea datuak prozesu umetik irakurtzean (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Ustekabeko errorea waitpid()-en (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Prozesu haurra amaitu da %ld kodearekin" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Prozesu haurra %ld seinaleak hilda" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Prozesu haurra %ld seinaleak geldituta" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Prozesu haurra ustekabean amaituta" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Ezin izan da kanalizazio umetik irakurri (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Ezin izan da “%s” prozesu haurra abiarazi (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Ezin da sardetu (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Ezin izan da “%s” direktoriora aldatu (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Ezin izan da “%s” prozesu haurra exekutatu (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Huts egin du fitxategia irekitzeak fitxategi-deskribatzailea birmapatzeko (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Huts egin du prozesu umerako fitxategi-deskribatzailea bikoizteak (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Ezin izan da prozesu haurra sardetu (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Huts egin du prozesu umerako fitxategi-deskribatzailea ixteak (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Errore ezezaguna “%s” prozesu haurra exekutatzean" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Ezin izan da nahikoa datu irakurri pid kanalizazio umetik (%s)" @@ -5761,78 +5958,78 @@ msgid "" "process" msgstr "Ustekabeko errorea gertatu da 'g_io_channel_win32_poll()'-en prozesu umetik datuak irakurtzean" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Kate hutsa ez da zenbaki bat" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s” ez da zeinudun zenbaki bat" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "“%s” zenbakia barrutitik kanpo [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s” ez da zeinurik gabeko zenbaki bat" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Baliogabeko %-kodeketa URIan" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Legez kanpoko karakterea URIan" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "UTF-8 ez diren karaktereak URIan" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Baliogabeko IPv6 helbidea ‘%.*s’ URIan" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Legez kanpoko IP helbide kodea ‘%.*s’ URIan" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Internazionalizatutako ostalari-izen baliogabea (‘%.*s’) URIan" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Ezin izan da ‘%.*s’ ataka analizatu URIan" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URIko ‘%.*s’ ataka barrutitik kanpo dago" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "‘%s’ URIa ez da URI absolutua" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "‘%s’ URIak ez du ostalari-osagairik" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URIa ez da absolutua eta ez da oinarrizko URIrik eman" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "‘=’ eta parametro-balioa falta dira" @@ -5913,65 +6110,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6076,6 +6273,53 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "Ezin da % esleitu" +#~ msgstr[1] "Ezin izan da konektatu:" + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN-en mezua: goiburuko REPLY_SERIAL eremua falta da edo " +#~ "baliogabea da" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "backtracking limit reached" #~ msgstr "atzera-jotzearen mugara gainditua" diff --git a/po/fa.po b/po/fa.po index 3ba701f..25a010d 100644 --- a/po/fa.po +++ b/po/fa.po @@ -4,14 +4,14 @@ # Hamed Malek , 2005. # Meelad Zakaria , 2006. # Arash Mousavi , 2011. -# Danial Behzadi , 2022-2023. +# Danial Behzadi , 2022-2024. # msgid "" msgstr "" "Project-Id-Version: glib HEAD\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-02 13:39+0000\n" -"PO-Revision-Date: 2023-09-03 00:18+0330\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 17:06+0000\n" +"PO-Revision-Date: 2024-03-07 01:06+0330\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Persian <>\n" "Language: fa\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n==0 || n==1);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -37,38 +37,42 @@ msgstr "شکست در یافتن برنامهٔ پیش‌گزیده برای گ #: gio/gappinfo.c:874 #, c-format msgid "Failed to find default application for URI Scheme ‘%s’" -msgstr "شکست در یافتن برنامهٔ پیش‌گزیده برای شمای نشانی %s" +msgstr "شکست در یافتن برنامهٔ پیش‌گزیده برای طرحوارهٔ نشانی %s" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "گزینه‌های GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "نمایش گزینه‌های GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "ورود به حالت خدمت GApplication (استفاده از پرونده‌های خدمت D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "پایمالی شناسهٔ برنامه" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "چاپ نگارش برنامه" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "جایگزینی نمونهٔ در حال اجرا" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "چاپ راهنما" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[COMMAND]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "چاپ نگارش" @@ -121,7 +125,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "COMMAND" @@ -133,9 +137,13 @@ msgstr "دستور برای چاپ راهنمای باجزییات" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "شناسهٔ برنامه در قالب دی‌باس (مثل: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FILE" @@ -159,7 +167,7 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "پارامتر اختیاری برای فراخوانی کنش، در قالب GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 gio/gsettings-tool.c:678 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 gio/gsettings-tool.c:678 #, c-format msgid "" "Unknown command %s\n" @@ -172,11 +180,11 @@ msgstr "" msgid "Usage:\n" msgstr "کارکرد:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 gio/gsettings-tool.c:713 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "متغییرها:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGS…]" @@ -271,78 +279,78 @@ msgstr "" "فرمان ناشناس: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "مقدار شمارش بسیار بزرگی به %s ارسال شده است" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "جویش روی جریان پایه پشتیبانی نمی‌شود" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "نمی تواند GbufferedInputStream را کوتاه کند" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "جریان از قبل بسته شده است" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "هرس روی جریان پایه پشتیبانی نمی‌شود" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "عملیات لغو شده" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "شیء نامعتبر، مقدار دهی اولیه نشد" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "دنبالهٔ چندبایتی ناقص در ورودی" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "فضا کافی در مقصد وجود ندارد" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "دنبالهٔ بایتی نامعتبر در ورودی تبدیل" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "خطا در حین تبدیل: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "مقداردهی‌های اولیهٔ قابل لغو پشتیبانی نمی‌شود" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "تبدیل از مجموعهٔ نویسهٔ «%s» به «%s» پشتیبانی نمی‌شود" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "نمی‌توان تبدیلگر «%s» به «%s» را گشود" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "نوع %s" @@ -356,41 +364,41 @@ msgstr "نوع نامعلوم" msgid "%s filetype" msgstr "نوع پرونده %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "دارای داده‌های نامعتبر در GCredentials" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "بر روی این سیستم عامل GCredentials توسعه داده نشده است" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" -msgstr "پشتیبانی از GCredentials در پلتفرم شما وجود ندارد" +msgstr "بن‌سازه‌تان از GCredentials پشتیبانی نمی‌کند" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "روی این سیستم‌عامل GCredentials شناسهٔ فرایندی ندارد" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "جعل گواهی روی این سیستم‌عامل ممکن نیست" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "پایان جریان زودهنگام نامنتظره" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "کلید پشتیبانی نشدهٔ «%s» در ورودی نشانی «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "ترکیب جفت کلید و مقدار بی‌معنی در ورودی نشانی «%s»" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract keys)" @@ -398,45 +406,45 @@ msgstr "" "نشانی «%s» نامعتبر است (فقط یکی از کلیدهای path، dir، tmpdir یا abstract را نیاز " "دارد)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "خطا در نشانی «%s» — مولّفهٔ «%s» بدریخت است" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "جابه‌جایی پشتیبانی نشده یا ناشناختهٔ «%s» برای نشانی «%s»" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "عنصر نشانی «%s» دارای دونقطه (:) نیست." -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "نام جابه‌جایی در عنصر نشانی «%s» نباید خالی باشد" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal sign" msgstr "جفت گلید و مقدار %Id، «%s» در عنصر نشانی «%s» دارای علامت مساوی نیست" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "جفت گلید و مقدار %Id، «%s» در عنصر نشانی «%s» نباید کلیدی خالی داشته باشد" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element “%s”" msgstr "خطا در حذف کلید یا مقدار در جفت کلیدمقدار %Id، «%s» در نشانی عنصر «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -445,74 +453,74 @@ msgstr "" "خطا در نشانی «%s» — جابه‌جایی یونیکس نیازمند تنظیم بودن دقیقاً یکی از کلیدهای path " "یا abstract است" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "خطا در نشانی «%s» — مولّفهٔ host غایب یا بدریخت است" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "خطا در نشانی «%s» — مولّفهٔ port غایب یا بدریخت است" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "خطا در نشانی «%s» — مولّفهٔ noncefile غایب یا بدریخت است" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "خطا در راه‌اندازی خودکار: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "خطا در گشودن پروندهٔ فعلی «‎%s»‏: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "خطا در خواندن از پروندهٔ فعلی «‎%s»‏، انتظار ۱۶ بایت می‌رفت ولی %Id دریافت شد" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "خطا در نوشتن محتوای پروندهٔ فعلی «‎%s»‏ روی جریان:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "آدرس داده شده خالی است" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "هنگام تنظیم بودن AT_SECURE نمی‌توان گذرگاه پیامی ایجاد کرد" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "نمی‌توان بدون یک شناسهٔ دستگاه، گذرگاه پیامی ایجاد کرد: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "نمی‌توان بدون ‪$DISPLAY‬ X11 به طور خودکار D-Bus را اجرا کرد" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "خطا در ایجاد خط فرمان «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "نمی‌توان نشانی گذرگاه نشست را تشخیص داد (برای این سیستم‌عامل پیاده نشده)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable — " @@ -521,7 +529,7 @@ msgstr "" "نمی‌توان نشانی گذرگاه را از متغیّر محیطی DBUS_STARTER_BUS_TYPE تشخیص داد — مقدار " "ناشناختهٔ «%s»" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -529,34 +537,34 @@ msgstr "" "نمی‌توان نشانی گذرگاه را تشخیص داد؛ چون متغیّر محیطی DBUS_STARTER_BUS_TYPE تنظیم " "نشده" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "گونهٔ گذرگاه ناشناخته %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "کمبود محتوای نامنتظره هنگام خواندن یک خط" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "کمبود محتوای نامنتظره هنگام خواندن (امن) یک خط" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "تمامی سازوکارهای تأیید هویت موجود آزموده شد (آزموده: %s) (موجود: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "کمبود محتوای نامنتظره هنگام خواندن یک بایت" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "شناسه‌های کاربری باید برای نمونه و کارساز یکی باشد" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "لغو شده به دست GDBusAuthObserver::authorize-authenticated-peer" @@ -575,13 +583,13 @@ msgstr "اجازه‌های روی «%s» مستقیم بدریختند. انت msgid "Error creating directory “%s”: %s" msgstr "خطا در ایجاد شاخهٔ «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "عملیات پشتیبانی نمی‌شود" @@ -642,15 +650,15 @@ msgstr "خطا در گشودن دسته‌کلید «%s» برای نوشتن: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(به علاوه، آزاد سازی قفل برا ی «%s» هم شکست خورد: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "اتصال بسته شده است" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "زمان به پایان رسید" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "Unsupported flags encountered when constructing a client-side connection" msgstr "مواجهه با پرچم‌های پشتیبانی نشده هنگام ساخت یک اتّصال سمت کارخواه" @@ -734,59 +742,71 @@ msgstr "زیردرختی از پیش برای %s برون‌ریزی شده" msgid "Object does not exist at path “%s”" msgstr "شی در مسیر «%s» وجود ندارد" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "پیام %s: زمینهٔ سرایند %s نامعتبر است . انتظار مقداری از گونهٔ «%s» می‌رفت" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "پیام %s: زمینهٔ سرایند %s وجود نداشته یا نامعتبر است" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "پیام %s: زمینهٔ سرایند نامعتبر داده شده" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/DBus/" +"Local" +msgstr "" +"پیام %s: زمینهٔ سرایند PATH دارد از مقدار رزرو شدهٔ ‪/org/freedesktop/DBus/Local‬ " +"استفاده می‌کند" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "%s message: INTERFACE header field does not contain a valid interface name" +msgstr "پیام %s: زمینهٔ سرایند INTERFACE نام میانای معتبری ندارد" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org.freedesktop." +"DBus.Local" +msgstr "" +"پیام %s: زمینهٔ سرایند INTERFACE دارد از مقدار رزرو شدهٔ ‪org.freedesktop.DBus." +"Local‬ استفاده می‌کند" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "پیام %s: زمینهٔ سرایند MEMBER نام عضو معتبری ندارد" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "پیام %s: زمینهٔ سرایند ERROR_NAME نام خطای معتبری ندارد" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "نوع INVALID است" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "پیام METHOD_CALL: زمینهٔ سرایند PATH یا MEMBER وجود نداشته یا نامعتبر است" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "پیام METHOD_RETURN: زمینهٔ سرایند REPLY_SERIAL وجود نداشته یا نامعتبر است" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"پیام خطا: زمینهٔ سرایند REPLY_SERIAL یا ERROR_NAME وجود نداشته یا نامعتبر است" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"پیام سیگنال: زمینهٔ سرایند PATH، INTERFACE یا MEMBER وجود نداشته یا نامعتبر است" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"پیام سیگنال: زمینهٔ سرایند PATH دارد از مقدار رزرو شدهٔ ‪/org/freedesktop/DBus/" -"Local‬ استفاده می‌کند" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"پیام سیگنال: زمینهٔ سرایند INTERFACE دارد از مقدار رزرو شدهٔ ‪org.freedesktop.DBus." -"Local‬ استفاده می‌کند" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "می‌خواست %lu بایت بخواند؛ ولی فقط %lu بایت گرفت" msgstr[1] "می‌خواست %lu بایت بخواند؛ ولی فقط %lu بایت گرفت" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "پس از رشتهٔ «%s» انتظار بایت NUL می‌رفت؛ ولی بایت %Id پیدا شد" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d (length of " @@ -795,126 +815,132 @@ msgstr "" "انتظار رشتهٔ UTF-8 معتبر می‌رفت؛ ولی بایت‌های نامعتبر در عرض از مبدأ بایت %Id پیدا " "شد (طول رشته %Id است). رشتهٔ معتبر UTF-8 تا آن نقطه «%s» بود" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "مقدار بیش از حد تودرتو شده" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "مقدار تجزیه شدهٔ «%s» مسیر شی D-Bus معتبری نیست" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "مقدار تجزیه شدهٔ «%s» امضای D-Bus معتبری نیست" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." msgid_plural "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." msgstr[0] "" +"مواجهه با آرایه به درازای %Iu بایت. بیشینهٔ درازا ۲<<۲۶ بایت (۶۴ می‌ب) است." msgstr[1] "" +"مواجهه با آرایه به درازای %Iu بایت. بیشینهٔ درازا ۲<<۲۶ بایت (۶۴ می‌ب) است." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" msgstr "" +"مواجهه با آرایه از گونهٔ «a%c». انتظار درازایی از مضرب %Iu بایت می‌رفت؛ ولی %Iu " +"بایت پیدا شد" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" -msgstr "" +msgstr "ساختارهای خالی (تاپل‌ها) در دی‌باس مجاز نیستند" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" -msgstr "" +msgstr "مقدار تجزیه شدهٔ «%s» برای دگرگونه، امضای دی‌باس معتبری نیست" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" -msgstr "" +msgstr "خطا در نامرتّب کردن GVariant با رشتهٔ گونهٔ %s از قالب سیم دی‌باس" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "" +"مقدار پایان‌پذیری نامعتبر. انتظار 0x6c (“l”) یا 0x42 (“B”) می‌رفت، ولی مقدار " +"0x%02x پیدا شد" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" -msgstr "" +msgstr "نگارش شیوه‌نامهٔ اصلی نامعتبر. انتظار ۱ می‌رفت؛ ولی %Id پیدا شد" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" -msgstr "" +msgstr "سرایند امضا پیدا شد ولی از گونهٔ امضا نیست" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" -msgstr "" +msgstr "سرایند امضا با امضای «%s» پیدا شد ولی بدنهٔ پیام خالیست" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" -msgstr "" +msgstr "مقدار تجزیه شدهٔ «%s» امضای دی‌باس معتبری (برای بدنه) نیست" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "سرایند امضایی در پیام نیست ولی بدنهٔ پیام %Iu بایت است" +msgstr[1] "سرایند امضایی در پیام نیست ولی بدنهٔ پیام %Iu بایت است" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " -msgstr "" +msgstr "نمی‌توان پیام را نامرتّب کرد: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "Error serializing GVariant with type string “%s” to the D-Bus wire format" -msgstr "" +msgstr "خطا در مرتّب کردن GVariant با رشتهٔ گونهٔ %s از قالب سیم دی‌باس" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "Number of file descriptors in message (%d) differs from header field (%d)" -msgstr "" +msgstr "تعداد توصیفگرهای پرونده در پیام (%Id) با زمینهٔ سرایند (%Id) متفاوت است" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " -msgstr "" +msgstr "نمی‌توان پیام را مرتّب کرد: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" -msgstr "" +msgstr "بدنهٔ پیام امضای %s را دارد ولی هیچ سرایند امضایی وجود ندارد" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is “%s”" -msgstr "" +msgstr "بدنهٔ پیام امضای گونهٔ %s را دارد ولی امضا در زمینهٔ سرایند %s است" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" -msgstr "" +msgstr "بدنهٔ پیام خالیست ولی امضا در زمینهٔ سرایند «(%s)» است" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "خطای بازگشت با بدنهٔ گونهٔ «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" -msgstr "" +msgstr "خطا با بدنهٔ خالی برگردانده شد" #: gio/gdbusprivate.c:2201 #, c-format @@ -924,7 +950,7 @@ msgstr "(یک نویسه وارد کنید تا این پنجره بسته شو #: gio/gdbusprivate.c:2387 #, c-format msgid "Session dbus not running, and autolaunch failed" -msgstr "" +msgstr "دی‌باس نشست در حال اجرا نبوده و اجرای خودکار شکست خورد" #: gio/gdbusprivate.c:2410 #, c-format @@ -932,50 +958,52 @@ msgid "Unable to get Hardware profile: %s" msgstr "ناتوان در گرفتن نمایهٔ سخت‌افزار: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "ناتوان در بار کردن %s یا %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " -msgstr "" +msgstr "خطا در فراخوانی StartServiceByName برای %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" -msgstr "" +msgstr "پاسخ %Id نامنتظره از روش StartServiceByName‏(«%s»)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, and " "proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "" +"نمی‌توان روش را فراخوانی کرد. پیشکار برای نام شناخته شدهٔ %s بدون مالک بوده و " +"پیشکار با پرچم G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ساخته شده" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "فضانام انتزاعی پشتیبانی نمی‌شود" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" -msgstr "" +msgstr "نمی‌توان هنگام ایجاد کارساز پروندهٔ nonce را مشخّص کرد" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "خطا در خواندن پروندهٔ فعلی «‎%s»‏: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" -msgstr "" +msgstr "رشتهٔ «%s» شناسهٔ گروه دی‌باس معتبری نیست" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" -msgstr "" +msgstr "نمی‌توان روی حامل پشتیبانی نشدهٔ «%s» شنود کرد" #: gio/gdbus-tool.c:113 #, c-format @@ -990,6 +1018,15 @@ msgid "" "\n" "Use “%s COMMAND --help” to get help on each command.\n" msgstr "" +"فرمان‌ها:\n" +" help نمایش این اطّلاعات\n" +" introspect درون‌نگری شی‌ای دوردست\n" +" monitor پایش شی‌ای دوردست\n" +" call فراخوانی روشی روی شی‌ای دوردست\n" +" emit ساطع کردن علامت\n" +" wait انتظار برای ظهور نام گذرگاه\n" +"\n" +"برای گرفتن راهنمایی دربارهٔ هر فرمان از ‪%s COMMAND --help‬ استفاده کنید.\n" #: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:347 #: gio/gdbus-tool.c:371 gio/gdbus-tool.c:861 gio/gdbus-tool.c:1246 @@ -1026,6 +1063,10 @@ msgstr "وصل شدن به گذرگاه نشست" msgid "Connect to given D-Bus address" msgstr "وصل‌شدن به نشانی دی‌باس داده شده" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "ADDRESS" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "گزینه‌های نقطهٔ پایانی اتّصال:" @@ -1062,15 +1103,15 @@ msgstr "مقصد اختیاری برای سیگنال (نام یکتا)" #: gio/gdbus-tool.c:596 msgid "Object path to emit signal on" -msgstr "" +msgstr "مسیر شی برای علامت دادن" #: gio/gdbus-tool.c:597 msgid "Signal and interface name" -msgstr "" +msgstr "نام میانا و علامت" #: gio/gdbus-tool.c:630 msgid "Emit a signal." -msgstr "" +msgstr "علامت دادن." #: gio/gdbus-tool.c:685 gio/gdbus-tool.c:1002 gio/gdbus-tool.c:1836 #: gio/gdbus-tool.c:2068 gio/gdbus-tool.c:2288 @@ -1119,11 +1160,11 @@ msgstr "خطا در بستن اتّصال: %s\n" #: gio/gdbus-tool.c:896 msgid "Destination name to invoke method on" -msgstr "" +msgstr "نام مقصد برای فراخوانی روش" #: gio/gdbus-tool.c:897 msgid "Object path to invoke method on" -msgstr "" +msgstr "مسیر شی برای فراخوانی روش" #: gio/gdbus-tool.c:898 msgid "Method and interface name" @@ -1131,15 +1172,15 @@ msgstr "نام متد و واسط" #: gio/gdbus-tool.c:899 msgid "Timeout in seconds" -msgstr "" +msgstr "مهلت زمانی به ثانیه" #: gio/gdbus-tool.c:900 msgid "Allow interactive authorization" -msgstr "" +msgstr "اجازه به مجوّز دادن تعاملی" #: gio/gdbus-tool.c:947 msgid "Invoke a method on a remote object." -msgstr "" +msgstr "فراخوانی روش روی شی دوردست." #: gio/gdbus-tool.c:1019 gio/gdbus-tool.c:1853 gio/gdbus-tool.c:2093 msgid "Error: Destination is not specified\n" @@ -1171,11 +1212,11 @@ msgstr "خطا در افزودن دستهٔ %Id‏: %s\n" #: gio/gdbus-tool.c:1695 msgid "Destination name to introspect" -msgstr "" +msgstr "نام مقصد برای بازرسی" #: gio/gdbus-tool.c:1696 msgid "Object path to introspect" -msgstr "" +msgstr "مسیر شی برای بازرسی" #: gio/gdbus-tool.c:1697 msgid "Print XML" @@ -1183,7 +1224,7 @@ msgstr "چاپ XML" #: gio/gdbus-tool.c:1698 msgid "Introspect children" -msgstr "" +msgstr "بازرسی فرزندان" #: gio/gdbus-tool.c:1699 msgid "Only print properties" @@ -1191,7 +1232,7 @@ msgstr "تنها ترجیحات را چاپ کن" #: gio/gdbus-tool.c:1788 msgid "Introspect a remote object." -msgstr "" +msgstr "بازرسی مسیر دوردست." #: gio/gdbus-tool.c:1994 msgid "Destination name to monitor" @@ -1207,17 +1248,19 @@ msgstr "پایش یک شیء دوردست." #: gio/gdbus-tool.c:2078 msgid "Error: can’t monitor a non-message-bus connection\n" -msgstr "" +msgstr "خطا: نمی‌توان اتّصال non-message-bus را پایید\n" #: gio/gdbus-tool.c:2202 msgid "Service to activate before waiting for the other one (well-known name)" -msgstr "" +msgstr "خدمت برای فعّال سازی پیش از انتظار برای دیگری (نام شناخته شده)" #: gio/gdbus-tool.c:2205 msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" msgstr "" +"مهات زمانی برای انتظار پیش از خروج با خطا (ثانیه)؛ 0 برای بدون مهلت زمانی " +"(پیش‌گزیده)" #: gio/gdbus-tool.c:2253 msgid "[OPTION…] BUS-NAME" @@ -1249,73 +1292,73 @@ msgstr "خطا: %s نام گذرگاه شناخته شدهٔ معتبری نیس msgid "Not authorized to change debug settings" msgstr "برای تغییر تنظیمات اشکال‌زدایی مجاز نیست" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "بدون‌نام" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "پروندهٔ میزکار زمینهٔ Exec را مشخّص نکرده" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "نمی‌توان پایانهٔ لازم برای این برنامه را پیدا کرد" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" -msgstr "" +msgstr "برنامهٔ %s در ‪$PATH‬ پیدا نشد" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "نمی‌توان شاخهٔ پیکربندی برنامهٔ کاربر %s را ایجاد کرد: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "نمی‌توان شاخهٔ پیکربندی MIME کاربر %s را ایجاد کرد: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "اطّلاعات برنامه یک شناسه کم دارد" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "نمی‌توان پروندهٔ میزکار کاربر %s را ایجاد کرد" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "تعریف شخصی برای %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "گرداننده eject را پیاده نساخته" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "گرداننده eject یا eject_with_operation را پیاده نساخته" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "گرداننده نمونه گیری را برای رسانه پیاده نساخته" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "گرداننده start را پیاده نساخته" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "گرداننده stop را پیاده نساخته" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" -msgstr "" +msgstr "پسانهٔ TLS بازیابی اتّصال TLS را پیاده نمی‌کند" #: gio/gdummytlsbackend.c:197 gio/gdummytlsbackend.c:323 gio/gdummytlsbackend.c:515 msgid "TLS support is not available" @@ -1325,27 +1368,27 @@ msgstr "پیشتیبانی TLS موجود نیست" msgid "DTLS support is not available" msgstr "پیشتیبانی DTLS موجود نیست" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "نمی‌توان نگارش %Id رمزنگاری GEmblem را مدیریت کرد" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "تعداد بدریخت ژتون‌ها (%Id) در کدبندی GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "نمی‌توان نگارش %Id رمزنگاری GEmblemIcon را مدیریت کرد" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "تعداد بدریخت ژتون‌ها (%Id) در کدبندی GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "برای GEmblemedIcon انتظار GEmblem می‌رفت" @@ -1353,126 +1396,131 @@ msgstr "برای GEmblemedIcon انتظار GEmblem می‌رفت" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" -msgstr "" +msgstr "سوار کردن داده شده وجود ندارد" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "نمی‌توان روی شاخه رونوشت کرد" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "نمی‌توان شاخه را روی شاخه رونوشت کرد" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "پرونده مقصد وجود دارد" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "نمی‌توان شاخه را بازگشتی رونوشت کرد" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "رونوشت از بازهٔ پرونده پشتیبانی نمی‌شود" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "خطا در هنگام اتصال پرونده: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "اتصال پشتیبانی نمی‌شود" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" -msgstr "" +msgstr "رونوشت (پیوند مرجع یا شبیه‌سازی) بین سوار شده‌ها پشتیبانی نمی‌شود" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" -msgstr "" +msgstr "رونوشت (پیوند مرجع یا شبیه‌سازی) پشتیبانی نشده یا نامعتبر است" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" -msgstr "" +msgstr "رونوشت (پیوند مرجع یا شبیه‌سازی) پشتیبانی نشده یا کار نکرد" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "نمی‌توان ویژگی %s را بازیابی کرد" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "نمی‌توان پروندهٔ خاص را رونوشت کرد" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "مقدار نامعتبر پیوند نمادین داده شده" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "پیوندهای نمادی پشتیبانی نمی‌شوند" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "زباله پشتیبانی نمی‌شود" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "نام‌های پرونده نمی‌توانند شامل «%c» باشند" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "شکست در ایجاد شاخه‌ای موقَّتی برای قالب «%s»: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "حجم mount را پیاده نساخته" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "هیچ برنامه‌ای برای مار با این پرونده ثبت نشده است" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "عددساز بسته شده" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 gio/gfileenumerator.c:425 -#: gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 gio/gfileenumerator.c:427 +#: gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "عددساز پرونده عملیاتی خارق‌العاده" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "عددساز بسته از پیش شده" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "نمی‌توان نگارش %Id رمزنگاری GFileIcon را مدیریت کرد" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "دادهٔ ورودی بدشکل برای GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 gio/gfileiostream.c:169 -#: gio/gfileoutputstream.c:166 gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 gio/gfileiostream.c:166 +#: gio/gfileoutputstream.c:163 gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "جریان از query_info پشتیبانی نمی‌کند" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "جویش روی جریان پشتیبانی نمی‌شود" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "هرس روی جریان ورودی پشتیبانی نمی‌شود" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "هرس روی جریان پشتیبانی نمی‌شود" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "نام میزبان نامعتبر" @@ -1505,64 +1553,64 @@ msgstr "پاسخ بیش از حد بزرگ پیشکار HTTP" msgid "HTTP proxy server closed connection unexpectedly." msgstr "کارساز پیشکار HTTP اتّصال را به طور غیرمنتظره‌ای بست." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "تعداد ژتون‌های اشتباه (%Id)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "گونه‌ای برای نام کلاس %s وجود ندارد" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "گونهٔ %s واسط GIcon را پیاده نساخته" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" -msgstr "" +msgstr "گونهٔ %s طبقه‌بندی نشده" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "شمارهٔ نگارش بدریخت: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "گونهٔ %s from_tokens() را روی واسط GIcon پیاده نساخته" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "نمی‌توان نگارش فراهم شدهٔ رمزنگاری نقشک را مدیریت کرد" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "هیچ آدرسی مشخص نشده است" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "طول %Iu برای نشانی‌ها بیش از حد زیاد است" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "نشانی بیت‌هایی تنظیم شده ورای طول پیشوند دارد" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "نتوانست «%s» را به عنوان نقاب نشانی آی‌پی تجزیه کند" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "فضای کافی برای نشانی سوکت نیست" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "نشانی سوکت پشتیبانی نشده" @@ -1576,7 +1624,7 @@ msgstr "جریان ورودی read را پیاده نساخته" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "سامانه عملیاتی خارق‌العاده دارد" @@ -1586,13 +1634,13 @@ msgstr "رونوشت همراه پرونده" #: gio/gio-tool.c:166 msgid "Keep with file when moved" -msgstr "" +msgstr "نگه‌داری با پرونده هنگام جابه‌جایی" #: gio/gio-tool.c:207 msgid "“version” takes no arguments" msgstr "«version» آرگومانی نمی‌گیرد" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "روش استفاده:" @@ -1600,89 +1648,89 @@ msgstr "روش استفاده:" msgid "Print version information and exit." msgstr "چاپ اطّلاعات نگارش و خروج." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "دستورات:" - -#: gio/gio-tool.c:231 -msgid "Concatenate files to standard output" -msgstr "" - #: gio/gio-tool.c:232 -msgid "Copy one or more files" -msgstr "" +msgid "Concatenate files to standard output" +msgstr "چسباندن پرونده‌ها در خروجی استاندارد" #: gio/gio-tool.c:233 -msgid "Show information about locations" -msgstr "" +msgid "Copy one or more files" +msgstr "رونوشت یک یا چند پرونده" #: gio/gio-tool.c:234 -msgid "Launch an application from a desktop file" -msgstr "" +msgid "Show information about locations" +msgstr "نمایش اطّلاعات دربارهٔ مکان‌ها" #: gio/gio-tool.c:235 -msgid "List the contents of locations" -msgstr "" +msgid "Launch an application from a desktop file" +msgstr "اجرای برنامه از پروندهٔ میزکار" #: gio/gio-tool.c:236 -msgid "Get or set the handler for a mimetype" -msgstr "" +msgid "List the contents of locations" +msgstr "سیاهه کردن محتوای مکان‌ها" #: gio/gio-tool.c:237 +msgid "Get or set the handler for a mimetype" +msgstr "گرفتن یا تنظیم مدیر mimetype" + +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "ایجاد شاخه‌ها" -#: gio/gio-tool.c:238 -msgid "Monitor files and directories for changes" -msgstr "" - #: gio/gio-tool.c:239 -msgid "Mount or unmount the locations" -msgstr "" +msgid "Monitor files and directories for changes" +msgstr "پایش پرونده‌ها و شاخه‌ها برای دگرگونی‌ها" #: gio/gio-tool.c:240 -msgid "Move one or more files" -msgstr "" +msgid "Mount or unmount the locations" +msgstr "سوار یا پیاده کردن مکان‌ها" #: gio/gio-tool.c:241 -msgid "Open files with the default application" -msgstr "" +msgid "Move one or more files" +msgstr "جابه‌جایی یک یا چند پرونده" #: gio/gio-tool.c:242 +msgid "Open files with the default application" +msgstr "گشودن پرونده‌ها با برنامهٔ پیش‌گزیده" + +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "تغییر نام یک پرونده" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "حذف یک یا چند پرونده" -#: gio/gio-tool.c:244 -msgid "Read from standard input and save" -msgstr "" - #: gio/gio-tool.c:245 -msgid "Set a file attribute" -msgstr "" +msgid "Read from standard input and save" +msgstr "خواندن از ورودی استاندارد و ذخیره" #: gio/gio-tool.c:246 -msgid "Move files or directories to the trash" -msgstr "" +msgid "Set a file attribute" +msgstr "تنظیم یک ویژگی پرونده" #: gio/gio-tool.c:247 -msgid "Lists the contents of locations in a tree" -msgstr "" +msgid "Move files or directories to the trash" +msgstr "جابه‌جایی پرونده‌ها یا شاخه‌ها به زباله‌دان" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:248 +msgid "Lists the contents of locations in a tree" +msgstr "محتوای مکان‌ها را به شکل درخت سیاهه می‌:ند" + +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "دستورات:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" -msgstr "" +msgstr "استفاده ا ز%s برای گرفتن راهنمای با جزییات\n" #: gio/gio-tool-cat.c:89 msgid "Error writing to stdout" msgstr "خطا در نوشتن روی خروجی استاندارد" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 gio/gio-tool-monitor.c:206 #: gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 gio/gio-tool-remove.c:50 @@ -1693,7 +1741,7 @@ msgstr "LOCATION" #: gio/gio-tool-cat.c:140 msgid "Concatenate files and print to standard output." -msgstr "" +msgstr "پرونده‌ها را چسبانده و در خروجی استاندارد چاپ می‌کند." #: gio/gio-tool-cat.c:142 msgid "" @@ -1701,80 +1749,90 @@ msgid "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" +"فرمان gio cat درست مثل ابزار cat سنّتی عمل می‌کند، ولی به جای\n" +"پرونده‌های محلّی از مکان‌های GIO استفاده می‌کند. برای نمونه می‌توانید\n" +"از چیزی چون ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "مکانی داده نشده" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "بدون شاخهٔ مقصد" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "نمایش پیشرفت" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "اعلان پیش از پایمالی" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "نگه‌داری تمامی مولّفه‌ها" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "پشتیبان گیری از پرونده‌های مقصد موجود" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "پیوندهای نمادین هرگز دنبال نشوند" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "استفاده از اجازه‌های پیش‌گزیده برای مقصد" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "استفاده از برچسب‌های زمانی تفییر پیش‌گزیده برای مقصد" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "%s از %s منتقل شد (%s/ث)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "مبدأ" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "مقصد" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "رونوشت یک یا چند پرونده از مبدأ به مقصد." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" +"فرمان gio copy درست مثل ابزار cp سنّتی عمل می‌کند، ولی به جای\n" +"پرونده‌های محلّی از مکان‌های GIO استفاده می‌کند. برای نمونه می‌توانید\n" +"از چیزی چون ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "مقصد %s یک شاخه نیست" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " -msgstr "" +msgstr "%s: پایمالی «%s»؟ " #: gio/gio-tool-info.c:39 msgid "List writable attributes" -msgstr "" +msgstr "سیاهه کردن ویژگی‌های قابل نوشتن" #: gio/gio-tool-info.c:40 msgid "Get file system info" @@ -1782,7 +1840,7 @@ msgstr "گرفتن اطَلاعات سامانهٔ پرونده" #: gio/gio-tool-info.c:41 gio/gio-tool-list.c:37 msgid "The attributes to get" -msgstr "" +msgstr "ویژگی‌ها برای گرفتن" #: gio/gio-tool-info.c:41 gio/gio-tool-list.c:37 msgid "ATTRIBUTES" @@ -1790,7 +1848,7 @@ msgstr "ATTRIBUTES" #: gio/gio-tool-info.c:42 gio/gio-tool-list.c:40 gio/gio-tool-set.c:37 msgid "Don’t follow symbolic links" -msgstr "" +msgstr "دنبال نکردن پیوندهای نمادین" #: gio/gio-tool-info.c:105 msgid "attributes:\n" @@ -1808,52 +1866,52 @@ msgstr "نام نمایشی: %s\n" msgid "edit name: %s\n" msgstr "ویرایش نام: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "نام: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "گونه: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "اندازه: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "مخفی\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "نشانی: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" -msgstr "" +msgstr "مسیر محلی: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" -msgstr "" +msgstr "سوار کردن یونیکس: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" -msgstr "" +msgstr "ویژگی‌های تنظیم‌پذیر:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" -msgstr "" +msgstr "فضانام ویژگی‌های قابل نوشتن:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." -msgstr "" +msgstr "نمایش اطّلاعات دربارهٔ مکان‌ها." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1861,6 +1919,11 @@ msgid "" "be specified with their GIO name, e.g. standard::icon, or just by\n" "namespace, e.g. unix, or by “*”, which matches all attributes" msgstr "" +"فرمان gio info درست مثل ابزار ls سنّتی عمل می‌کند، ولی به جای\n" +"پرونده‌های محلّی از مکان‌های GIO استفاده می‌کند. برای نمونه می‌توانید\n" +"از چیزی چون ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید.\n" +"ویژگی‌های پرونده می‌توانند با نام GIOشان چون standard::icon یا تنها با\n" +"فضانام چون unix یا با «*» که با همهٔ ویژگی‌ها منطبق است مشخّص شوند" #. Translators: commandline placeholder #: gio/gio-tool-launch.c:56 @@ -1871,11 +1934,11 @@ msgstr "DESKTOP-FILE [FILE-ARG …]" msgid "" "Launch an application from a desktop file, passing optional filename arguments " "to it." -msgstr "" +msgstr "اجرای برنامه از پروندهٔ میزکار با دادن آرگومان‌های نام پروندهٔ اختیاری به آن." #: gio/gio-tool-launch.c:79 msgid "No desktop file given" -msgstr "" +msgstr "هیچ پروندهٔ میزکاری داده نشد" #: gio/gio-tool-launch.c:87 msgid "The launch command is not currently supported on this platform" @@ -1889,7 +1952,7 @@ msgstr "ناتوان در بار کردن «%s»: %s" #: gio/gio-tool-launch.c:109 #, c-format msgid "Unable to load application information for ‘%s‘" -msgstr "" +msgstr "ناتوان در بار کردن اطّلاعات برنامه برای «%s»" #: gio/gio-tool-launch.c:121 #, c-format @@ -1898,15 +1961,15 @@ msgstr "ناتوان در اجرای برنامهٔ «%s»: %s" #: gio/gio-tool-list.c:38 gio/gio-tool-tree.c:34 msgid "Show hidden files" -msgstr "" +msgstr "نمایش پرونده‌های نهفته" #: gio/gio-tool-list.c:39 msgid "Use a long listing format" -msgstr "" +msgstr "استفاده از قالب سیاهه‌ای بلند" #: gio/gio-tool-list.c:41 msgid "Print display names" -msgstr "" +msgstr "چاپ نام‌های نمایشی" #: gio/gio-tool-list.c:42 msgid "Print full URIs" @@ -1923,6 +1986,10 @@ msgid "" "like smb://server/resource/file.txt as location. File attributes can\n" "be specified with their GIO name, e.g. standard::icon" msgstr "" +"فرمان gio list درست مثل ابزار ls سنّتی عمل می‌کند، ولی به جای\n" +"پرونده‌های محلّی از مکان‌های GIO استفاده می‌کند. برای نمونه می‌توانید\n" +"از چیزی چون ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید.\n" +"ویژگی‌های پرونده مي‌توانند با نام GIOشان چون standard::icon مشخّص شوند" #. Translators: commandline placeholder #: gio/gio-tool-mime.c:73 @@ -1935,7 +2002,7 @@ msgstr "HANDLER" #: gio/gio-tool-mime.c:78 msgid "Get or set the handler for a mimetype." -msgstr "" +msgstr "گرفتن یا تنظیم مدیر برای mimetype." #: gio/gio-tool-mime.c:80 msgid "" @@ -1943,24 +2010,27 @@ msgid "" "for the mimetype. If a handler is given, it is set as the default\n" "handler for the mimetype." msgstr "" +"اگر مدیری داده نشود، برنامه‌های توصیه شده و ثبت شده برای\n" +"گونهٔ mime را سیاهه می‌کند. اگر مدیر داده شود، به عنوان\n" +"مدیر پیش‌گزیدهٔ گونهٔ mime تنظیم شده است." #: gio/gio-tool-mime.c:102 msgid "Must specify a single mimetype, and maybe a handler" -msgstr "" +msgstr "باید یک mimetype و احتمالاً یک مدیر مشخّص شود" #: gio/gio-tool-mime.c:118 #, c-format msgid "No default applications for “%s”\n" -msgstr "" +msgstr "برنامهٔ پیش‌گزیده‌ای برای «%s» وجود ندارد\n" #: gio/gio-tool-mime.c:124 #, c-format msgid "Default application for “%s”: %s\n" -msgstr "" +msgstr "برنامهٔ پیش‌گزیده برای «%s»: ‏%s\n" #: gio/gio-tool-mime.c:129 msgid "Registered applications:\n" -msgstr "" +msgstr "برنامه‌های ثبت شده:\n" #: gio/gio-tool-mime.c:131 msgid "No registered applications\n" @@ -1968,7 +2038,7 @@ msgstr "بدون برنامهٔ ثبت شده\n" #: gio/gio-tool-mime.c:142 msgid "Recommended applications:\n" -msgstr "" +msgstr "برنامه‌های توصیه شده:\n" #: gio/gio-tool-mime.c:144 msgid "No recommended applications\n" @@ -1982,7 +2052,7 @@ msgstr "شکست در بارکردن اطّلاعات برای مدیر «%s»" #: gio/gio-tool-mime.c:170 #, c-format msgid "Failed to set “%s” as the default handler for “%s”: %s\n" -msgstr "" +msgstr "شکست در تنظیم «%s» به مدیر پیش‌گزیده برای «%s»: ‏%s\n" #: gio/gio-tool-mkdir.c:33 msgid "Create parent directories" @@ -1998,42 +2068,45 @@ msgid "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/mydir as location." msgstr "" +"فرمان gio mkdir درست مثل ابزار mkdir سنّتی عمل می‌کند، ولی به جای\n" +"پرونده‌های محلّی از مکان‌های GIO استفاده می‌کند. برای نمونه می‌توانید\n" +"از چیزی چون ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید." #: gio/gio-tool-monitor.c:39 msgid "Monitor a directory (default: depends on type)" -msgstr "" +msgstr "پایش شاخه (پیش‌گزیده: بسته به گونه)" #: gio/gio-tool-monitor.c:41 msgid "Monitor a file (default: depends on type)" -msgstr "" +msgstr "پایش پرونده (پیش‌گزیده: بسته به گونه)" #: gio/gio-tool-monitor.c:43 msgid "Monitor a file directly (notices changes made via hardlinks)" -msgstr "" +msgstr "پیش مستقیم پرونده (آگاهی از دگرگونی‌های ایجاد شده به دست پیوندهای سخت)" #: gio/gio-tool-monitor.c:45 msgid "Monitors a file directly, but doesn’t report changes" -msgstr "" +msgstr "پرونده‌ی را بهصورت مستقیم می‌پاید، ولی دگرگونی‌ها را گزارش نمی‌کند" #: gio/gio-tool-monitor.c:47 msgid "Report moves and renames as simple deleted/created events" -msgstr "" +msgstr "گزارش جابه‌جایی‌ها و تغییر نام‌ها به شکل رویدادهای حذف و ایجاد ساده" #: gio/gio-tool-monitor.c:49 msgid "Watch for mount events" -msgstr "" +msgstr "رصد برای رویدادهای سوار کردن" #: gio/gio-tool-monitor.c:211 msgid "Monitor files or directories for changes." -msgstr "" +msgstr "پایش پرونده‌ها و شاخه‌ها برای دگرگونی‌ها." #: gio/gio-tool-mount.c:65 msgid "Mount as mountable" -msgstr "" +msgstr "سوار کردن به عنوان سوارکردنی" #: gio/gio-tool-mount.c:66 msgid "Mount volume with device file, or other identifier" -msgstr "" +msgstr "سوار کردن حجم با پروندهٔ افزاره یا دیگر شناسه" #: gio/gio-tool-mount.c:66 msgid "ID" @@ -2049,7 +2122,7 @@ msgstr "بیرون دادن" #: gio/gio-tool-mount.c:69 msgid "Stop drive with device file" -msgstr "" +msgstr "توقّف گرداننده با پروندهٔ افزاره" #: gio/gio-tool-mount.c:69 msgid "DEVICE" @@ -2057,7 +2130,7 @@ msgstr "DEVICE" #: gio/gio-tool-mount.c:70 msgid "Unmount all mounts with the given scheme" -msgstr "" +msgstr "پیاده کردن همهٔ سوار کردن‌ها با طرحوارهٔ داده شده" #: gio/gio-tool-mount.c:70 msgid "SCHEME" @@ -2065,11 +2138,11 @@ msgstr "SCHEME" #: gio/gio-tool-mount.c:71 msgid "Ignore outstanding file operations when unmounting or ejecting" -msgstr "" +msgstr "چشم‌پوشی از عملیات برحستهٔ پرونده هنگام پیاده کردن یا بیرون دادن" #: gio/gio-tool-mount.c:72 msgid "Use an anonymous user when authenticating" -msgstr "" +msgstr "استقاده از کاربری ناشناس هنگام هویت‌سنجی" #. Translator: List here is a verb as in 'List all mounts' #: gio/gio-tool-mount.c:74 @@ -2086,7 +2159,7 @@ msgstr "نمایش اطَلاعات اضافی" #: gio/gio-tool-mount.c:77 msgid "The numeric PIM when unlocking a VeraCrypt volume" -msgstr "" +msgstr "مقدار PIM عددی هنگام قفل‌گشایی یک حجم VeraCrypt" #: gio/gio-tool-mount.c:77 msgid "PIM" @@ -2094,35 +2167,35 @@ msgstr "PIM" #: gio/gio-tool-mount.c:78 msgid "Mount a TCRYPT hidden volume" -msgstr "" +msgstr "سوار کردن حجم نهفتهٔ‌TCRYPT" #: gio/gio-tool-mount.c:79 msgid "Mount a TCRYPT system volume" -msgstr "" +msgstr "سوار کردن حجم سامانه‌ای TCRYPT" #: gio/gio-tool-mount.c:276 gio/gio-tool-mount.c:308 msgid "Anonymous access denied" -msgstr "" +msgstr "دسترسی ناشناس رد شد" #: gio/gio-tool-mount.c:559 msgid "No drive for device file" -msgstr "" +msgstr "گرداننده‌ای برای پروندهٔ افزاره وجود ندارد" #: gio/gio-tool-mount.c:1051 msgid "No volume for given ID" -msgstr "" +msgstr "حجمی برای شناسهٔ داده وجود ندارد" #: gio/gio-tool-mount.c:1240 msgid "Mount or unmount the locations." -msgstr "" +msgstr "سوار یا پیاده کردن مکان‌ها." #: gio/gio-tool-move.c:44 msgid "Don’t use copy and delete fallback" -msgstr "" +msgstr "استفاده نکردن از رونوشت و حذف پشتیبان" #: gio/gio-tool-move.c:101 msgid "Move one or more files from SOURCE to DEST." -msgstr "" +msgstr "جابه‌جایی یک یا بیش‌تر پرونده از SOURCE به DEST." #: gio/gio-tool-move.c:103 msgid "" @@ -2130,6 +2203,9 @@ msgid "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location" msgstr "" +"جابه‌جایی gio شبیه ابزار سنّتی mv است، ولی به جای پرونده‌های محلی\n" +"از مکان‌های GIO استفاده می‌کند: برای نمونه می‌توان از چیزی\n" +"شبیه ‪smb://server/resource/file.txt‬ به عنوان مکان استفاده کنید" #: gio/gio-tool-move.c:145 #, c-format @@ -2141,14 +2217,16 @@ msgid "" "Open files with the default application that\n" "is registered to handle files of this type." msgstr "" +"گشودن پرونده‌ها با برنامهٔ پیش‌گزیده‌ای که برای\n" +"مدیریت پرونده‌هایی از این گونه ثبت شده." #: gio/gio-tool-remove.c:33 gio/gio-tool-trash.c:35 msgid "Ignore nonexistent files, never prompt" -msgstr "" +msgstr "چشم‌پوشی از پرونده‌های ناموجود. هرگز پرسیده نشود" #: gio/gio-tool-remove.c:54 msgid "Delete the given files." -msgstr "" +msgstr "حذف پرونده‌های داده." #: gio/gio-tool-rename.c:47 msgid "NAME" @@ -2169,7 +2247,7 @@ msgstr "آرگومان‌های بیش از حد" #: gio/gio-tool-rename.c:97 #, c-format msgid "Rename successful. New uri: %s\n" -msgstr "" +msgstr "تغییر نام موفّق. نشانی جدید: %s\n" #: gio/gio-tool-save.c:52 msgid "Only create if not existing" @@ -2181,16 +2259,16 @@ msgstr "الحاق به پایان پرونده" #: gio/gio-tool-save.c:54 msgid "When creating, restrict access to the current user" -msgstr "" +msgstr "محدود کردن دسترسی به کاربر کنونی هنگام ایجد" #: gio/gio-tool-save.c:55 msgid "When replacing, replace as if the destination did not exist" -msgstr "" +msgstr "جایگذاری به صورتی که گویی مقصد وجود ندارد" #. Translators: The "etag" is a token allowing to verify whether a file has been modified #: gio/gio-tool-save.c:57 msgid "Print new etag at end" -msgstr "" +msgstr "چاپ etag جدید در پایان" #. Translators: The "etag" is a token allowing to verify whether a file has been modified #: gio/gio-tool-save.c:59 @@ -2228,7 +2306,7 @@ msgstr "TYPE" #: gio/gio-tool-set.c:38 msgid "Unset given attribute" -msgstr "ناتنظیم صفت اعطایی" +msgstr "ناتنظیم مشخّصه اعطایی" #: gio/gio-tool-set.c:95 msgid "ATTRIBUTE" @@ -2257,7 +2335,7 @@ msgstr "مقدار مشخّص نشده" #: gio/gio-tool-set.c:193 #, c-format msgid "Invalid attribute type “%s”" -msgstr "گونهٔ صفت نامعتبر «%s»" +msgstr "گونهٔ مشخّصه نامعتبر «%s»" #: gio/gio-tool-trash.c:36 msgid "Empty the trash" @@ -2265,13 +2343,14 @@ msgstr "خالی کردن زباله‌دان" #: gio/gio-tool-trash.c:37 msgid "List files in the trash with their original locations" -msgstr "" +msgstr "سیاهه کردن پرونده‌های داخل زباله‌دان با مکان‌های اصلیشان" #: gio/gio-tool-trash.c:38 msgid "" "Restore a file from trash to its original location (possibly recreating the " "directory)" msgstr "" +"برگرداندن پرونده‌ای از زباله‌دان به مکان اصلیش (ممکن است شاخه را دوباره ایجاد کند)" #: gio/gio-tool-trash.c:108 msgid "Unable to find original path" @@ -2283,21 +2362,23 @@ msgstr "ناتوان در بازایجاد مکان اصلی: " #: gio/gio-tool-trash.c:138 msgid "Unable to move file to its original location: " -msgstr "" +msgstr "ناتوان در جابه‌جایی پرونده به مکان اصلیش: " #: gio/gio-tool-trash.c:227 msgid "Move/Restore files or directories to the trash." -msgstr "" +msgstr "جابه‌جایی یا برگرداندن پرونده‌ها یا شاخه‌ها به زباله‌دان." #: gio/gio-tool-trash.c:229 msgid "" "Note: for --restore switch, if the original location of the trashed file \n" "already exists, it will not be overwritten unless --force is set." msgstr "" +"یادداشت: برای گزینهٔ ‪--restore‬ اگر مکان اصلی پروندهٔ زباله شده از پیش\n" +"موجود باشد، تا وقتی ‪--force‬ تنظیم نشده باشد پایمال نخواهد شد." #: gio/gio-tool-trash.c:260 msgid "Location given doesn't start with trash:///" -msgstr "" +msgstr "مکان داده شده با ‪trash:///‬ آغاز نمی‌شود" #: gio/gio-tool-tree.c:35 msgid "Follow symbolic links, mounts and shortcuts" @@ -2305,7 +2386,7 @@ msgstr "پیگیری پیوندهای نمادین، سوار شدن‌ها و #: gio/gio-tool-tree.c:251 msgid "List contents of directories in a tree-like format." -msgstr "" +msgstr "سیاهه کردن محتوای شاخه‌ها در قالبی درخت‌گون." #: gio/glib-compile-resources.c:142 gio/glib-compile-schemas.c:1514 #, c-format @@ -2320,7 +2401,7 @@ msgstr "عنصر <%s> به عنوان سطح بالا (toplevel) مجاز نیس #: gio/glib-compile-resources.c:236 #, c-format msgid "File %s appears multiple times in the resource" -msgstr "" +msgstr "پروندهٔ %s چندین بار در منبع ظاهر شده" #: gio/glib-compile-resources.c:247 #, c-format @@ -2345,7 +2426,7 @@ msgstr "گزینهٔ پردازش ناشناختهٔ «%s»" #: gio/glib-compile-resources.c:426 #, c-format msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" -msgstr "" +msgstr "پیش‌پردازش %s خواسته شد، ولی %s تنظیم نشده و %s در PATH نیست" #: gio/glib-compile-resources.c:459 #, c-format @@ -2374,16 +2455,17 @@ msgstr "نام پروندهٔ خروجی" msgid "" "The directories to load files referenced in FILE from (default: current " "directory)" -msgstr "" +msgstr "شاخه برای بار کردن پرونده‌های ارجاع شده در FILE (پیش‌گزیده: شاخهٔ کنونی)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "DIRECTORY" #: gio/glib-compile-resources.c:824 msgid "Generate output in the format selected for by the target filename extension" -msgstr "" +msgstr "تولید خروجی در قالب گزیده برای افزونهٔ نام پروندهٔ هدف" #: gio/glib-compile-resources.c:825 msgid "Generate source header" @@ -2391,7 +2473,7 @@ msgstr "ایجاد سرایند منبع" #: gio/glib-compile-resources.c:826 msgid "Generate source code used to link in the resource file into your code" -msgstr "" +msgstr "تولید کد مبدأ استفاده شده برای پیوند در پروندهٔ مبدأ در کدتان" #: gio/glib-compile-resources.c:827 msgid "Generate dependency list" @@ -2403,28 +2485,32 @@ msgstr "نام پروندهٔ وابستگی برای ایجاد" #: gio/glib-compile-resources.c:829 msgid "Include phony targets in the generated dependency file" -msgstr "" +msgstr "قراردادن هدف‌های ساختگی در پروندهٔ وابستگی تولید شده" #: gio/glib-compile-resources.c:830 msgid "Don’t automatically create and register resource" -msgstr "" +msgstr "عدم ایجاد خودکار و ثبت منبع" #: gio/glib-compile-resources.c:831 msgid "Don’t export functions; declare them G_GNUC_INTERNAL" -msgstr "" +msgstr "تابع‌ها را برون‌ریزی نکنید. به صورت G_GNUC_INTERNAL تعریفشان کنید" #: gio/glib-compile-resources.c:832 msgid "" "Don’t embed resource data in the C file; assume it's linked externally instead" -msgstr "" +msgstr "تعبیه نکردن داده‌های منبع در پروندهٔ C. فرض کردن پیوند شدنش به صورت خارجی" #: gio/glib-compile-resources.c:833 msgid "C identifier name used for the generated source code" -msgstr "" +msgstr "نام شناساگر C استفاده شده برای کد مبدأ تولیدی" + +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFIER" #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" -msgstr "" +msgstr "مترجم C هدف (پیش‌گزیده: متغیّر محیطی CC)" #: gio/glib-compile-resources.c:861 msgid "" @@ -2432,6 +2518,9 @@ msgid "" "Resource specification files have the extension .gresource.xml,\n" "and the resource file have the extension called .gresource." msgstr "" +"ترجمهٔ مشخّصهٔ منبع در یک پروندهٔ منبع.\n" +"پرونده‌های مشخّصهٔ منبع پسوند ‪.gresource.xml‬ داشته\n" +"و پروندهٔ منبع پسوندی با نام ‪.gresource‬ دارد." #: gio/glib-compile-resources.c:893 msgid "You should give exactly one file name\n" @@ -2460,7 +2549,7 @@ msgstr "مقدار=«%s» از پیش مشخّص شده" #: gio/glib-compile-schemas.c:136 #, c-format msgid "flags values must have at most 1 bit set" -msgstr "" +msgstr "مقدارهای پرچم باید بیشینه ۱ بیت تنظیم شده باشند" #: gio/glib-compile-schemas.c:161 #, c-format @@ -2475,12 +2564,12 @@ msgstr "«%s» در بازهٔ مشخّص شده موجود نیست" #: gio/glib-compile-schemas.c:329 #, c-format msgid "<%s> is not a valid member of the specified enumerated type" -msgstr "" +msgstr "<%s> عضوی معتبر از گونهٔ شمارشی مشخّص شده نیست" #: gio/glib-compile-schemas.c:335 #, c-format msgid "<%s> contains string not in the specified flags type" -msgstr "" +msgstr "<%s> رشته‌ای دارد که در گونهٔ پرچم مشخّص شده نیست" #: gio/glib-compile-schemas.c:341 #, c-format @@ -2494,12 +2583,12 @@ msgstr " از پیش برای این کلید مشخّص شده" #: gio/glib-compile-schemas.c:393 #, c-format msgid " not allowed for keys of type “%s”" -msgstr "" +msgstr " برای کلیدهایی از گونهٔ «%s» مجاز نیست" #: gio/glib-compile-schemas.c:410 #, c-format msgid " specified minimum is greater than maximum" -msgstr "" +msgstr "کمینهٔ مشخّص شدهٔ بزرگ‌تر از بیشینه است" #: gio/glib-compile-schemas.c:435 #, c-format @@ -2508,11 +2597,11 @@ msgstr "دستهٔ l10n پشتیبانی نشده: %s" #: gio/glib-compile-schemas.c:443 msgid "l10n requested, but no gettext domain given" -msgstr "" +msgstr "درخواست بومی‌سازی بدون دادن دامنهٔ gettext" #: gio/glib-compile-schemas.c:455 msgid "translation context given for value without l10n enabled" -msgstr "" +msgstr "بافتار ترجمه داده برای مقدار بدون به کار افتاده بومی‌سازی" #: gio/glib-compile-schemas.c:477 #, c-format @@ -2659,7 +2748,7 @@ msgstr "" #: gio/glib-compile-schemas.c:1060 #, c-format msgid "No to override" -msgstr "" +msgstr "بدون برای پایمالی" #: gio/glib-compile-schemas.c:1068 #, c-format @@ -2684,12 +2773,12 @@ msgstr "" #: gio/glib-compile-schemas.c:1177 #, c-format msgid "Cannot be a list of a schema with a path" -msgstr "نمی‌تواند سیاهه‌ای از یک شما با یک مسیر باشد" +msgstr "نمی‌تواند سیاهه‌ای از یک طرحواره با یک مسیر باشد" #: gio/glib-compile-schemas.c:1187 #, c-format msgid "Cannot extend a schema with a path" -msgstr "نمی‌تواند شمایی را با یک مسیر گستراند" +msgstr "نمی‌تواند طرحواره‌ای را با یک مسیر گستراند" #: gio/glib-compile-schemas.c:1197 #, c-format @@ -2838,7 +2927,7 @@ msgstr "مکان ذخیرهٔ پروندهٔ gschemas.compiled" #: gio/glib-compile-schemas.c:2174 msgid "Abort on any errors in schemas" -msgstr "قطع کردن با رخدادِ هر نوع خطا در شِماها" +msgstr "قطع کردن با رخدادِ هر نوع خطا در طرحواره‌ها" #: gio/glib-compile-schemas.c:2175 msgid "Do not write the gschema.compiled file" @@ -2846,7 +2935,7 @@ msgstr "بر روی پروندهٔ gschema.compiled ننویس" #: gio/glib-compile-schemas.c:2176 msgid "Do not enforce key name restrictions" -msgstr "" +msgstr "اجبار نکردن محدودیت‌های نام کلید" #: gio/glib-compile-schemas.c:2206 msgid "" @@ -2854,6 +2943,9 @@ msgid "" "Schema files are required to have the extension .gschema.xml,\n" "and the cache file is called gschemas.compiled." msgstr "" +"ترجمهٔ همهٔ پرونده‌های طرحوارهٔ GSettings در یک انبارهٔ طرحواره.\n" +"پرونده‌های طرحواره پسوند ‪.gschema.xml‬ داشته\n" +"و پروندهٔ انباره پسوندی با نام ‪.gschemas‬ دارد." #: gio/glib-compile-schemas.c:2238 msgid "You should give exactly one directory name" @@ -2861,11 +2953,11 @@ msgstr "باید دقیقأ یک نام شاخه بدهید" #: gio/glib-compile-schemas.c:2285 msgid "No schema files found: doing nothing." -msgstr "هیچ پرونده شمایی پیدا نشد: کاری نمی‌شود." +msgstr "هیچ پروندهٔ طرحواره‌ای پیدا نشد: کاری نمی‌شود." #: gio/glib-compile-schemas.c:2287 msgid "No schema files found: removed existing output file." -msgstr "هیچ پرونده شمایی پیدا نشد: پروندهٔ خروجی موجود برداشته شد." +msgstr "هیچ پرونده طرحواره‌ای پیدا نشد: پروندهٔ خروجی موجود برداشته شد." #: gio/glocalfile.c:570 gio/win32/gwinhttpfile.c:436 #, c-format @@ -2881,253 +2973,253 @@ msgstr "خطا در گرفتن اطّلاعات سامانه‌پرونده‌ #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" -msgstr "" +msgstr "سوار کردن داده شده برای پروندهٔ %s پیدا نشد" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "نمی‌توان نام شاخهٔ ریشه را عوض کرد" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "خطا در تغییر نام پرونده %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "نمی‌توان نام پرونده را عوض کرد. نام پرونده از پیش وجود دارد" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "نام پرونده نامعتبر" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "خطا در گشودن پروندهٔ %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "خطا در برداشتن پروندهٔ %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "خطا در دور ریختن پروندهٔ %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "ناتوان در ایجاد شاخهٔ زباله‌دان %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "ناتوان در یافتن شاخهٔ سطح بالا برای دور ریختن %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" -msgstr "" +msgstr "زباله اندازی روی سوار شده‌های درونی سامانه پشتیبانی نمی‌شود" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "ناتوان در یافتن یا ایجاد شاخهٔ زباله‌دان %s برای دور ریختن %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "ناتوان در ایجاد پروندهٔ اطّلاعات دور ریختن برای %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "ناتوان در دور ریختن پروندهٔ %s از فرار محدوده‌های سامانه‌پرونده" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "ناتوان در دور ریختن پروندهٔ %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "ناتوان در دور ریختن پروندهٔ %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "خطا در ایجاد شاخهٔ %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "سیستم‌پرونده از پیوندهای نمادین پشتیبانی نمی‌کند" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "خطا در ساختن پیوند نمادین %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "خطا در جابجایی پروندهٔ %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "نمی‌توان شاخه را روی شاخه جابه‌جا کرد" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "ساخت پرونده پشتیبان شکست خورد" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "خطا در هنگام حذف پرونده هدف: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" -msgstr "" +msgstr "جابه‌جایی بین سوار شده‌ها پشتیبانی نمی‌شود" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "نتوانست استفادهٔ دیسک %s را تشخیص دهد: %s" #: gio/glocalfileinfo.c:765 msgid "Attribute value must be non-NULL" -msgstr "مقدار صفت باید غیر تهی باشد" +msgstr "مقدار مشخّصه باید غیر تهی باشد" #: gio/glocalfileinfo.c:772 msgid "Invalid attribute type (string or invalid expected)" -msgstr "گونهٔ صفت نامعتبر (انتظار رشته یا نامعتبر)" +msgstr "گونهٔ مشخّصه نامعتبر (انتظار رشته یا نامعتبر)" #: gio/glocalfileinfo.c:779 msgid "Invalid extended attribute name" -msgstr "نام صفت گستردهٔ نامعتبر" +msgstr "نام مشخّصه گستردهٔ نامعتبر" #: gio/glocalfileinfo.c:830 #, c-format msgid "Error setting extended attribute “%s”: %s" -msgstr "خطا در تنظیم کردن صفت گستردهٔ «‎%s»‏: %s" +msgstr "خطا در تنظیم کردن مشخّصه گستردهٔ «‎%s»‏: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (کدگذاری نامعتبر)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "خطا هنگام گرفتن اطّلاعات برای پروندهٔ «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "خطا هنگام گرفتن اطّلاعات برای توصیفگر پرونده: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "نوع مشخصه نامعتبر (uint32 مورد انتظار بود)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "نوع مشخصه نامعتبر بود (uint64 مورد انتظار بود)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "نوع مشخصه نامعتبر (رشته بایتی مورد انتظار بود)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "نمی‌توان اجازه‌های روی پیوند نمادین را تنظیم کرد" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "خطا در هنگام تنظیم اجازه‌ها: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "خطا در هنگام تنظیم مالک: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "پیوند نمادین باید ناتهی باشد" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "خطا در تنظیم پیوند نمادین: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "خطا در تنظیم پیوند نمادین: پرونده یک پیوند نمادین نیست" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "خطا در تنظیم کردن زمان دسترسی یا تغییر برای پروندهٔ «%s»: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "خطا در هنگام تنظیم کردن زمان دسترسی یا تغییر: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "بافتار SELinux باید ناتهی باشد" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "سیستم SELinux بر روی این سیستم فعال نشده است" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "خطا در تنظیم مفاد SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "تنظیم کردن مشخصه %s پشتیبانی نمی‌شود" @@ -3180,7 +3272,7 @@ msgid "Error truncating file: %s" msgstr "خطا در هنگام کوتاه کردن پرونده: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "خطا در گشودن پروندهٔ «%s»: %s" @@ -3202,99 +3294,99 @@ msgstr "پرونده از خارج تغییر کرده است" msgid "Error removing old file: %s" msgstr "خطا در هنگام حذف پرونده قدیمی: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" -msgstr "" +msgstr "GSeekType نامعتبر داده شده" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "درخواست جستجو نامعتبر" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" -msgstr "" +msgstr "جریان خروجی حافظه قابل تغییر اندازه نیست" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" -msgstr "" +msgstr "شکست در تغییر اندازهٔ جریان خروجی حافظه" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available address " "space" msgstr "" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "سوار کردن unmount را پیاده نساخته" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "سوار کردن eject را پیاده نساخته" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "سوار کردن unmount یا unmount_with_operation را پیاده نساخته" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "سوار کردن eject یا eject_with_operation را پیاده نساخته" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "سوار کردن remount را پیاده نساخته" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" -msgstr "" +msgstr "نام میزبان «%s» ‏[ دارد، ولی ] نه" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "شبکه غیرقابل دسترس است" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "میزبان غیرقابل دسترسی است" @@ -3315,94 +3407,95 @@ msgstr "نتوانست وضعیت شبکه را بگیرد: " #: gio/gnetworkmonitornm.c:313 #, c-format msgid "NetworkManager not running" -msgstr "" +msgstr "مدیر شبکه در حال اجرا نیست" #: gio/gnetworkmonitornm.c:324 #, c-format msgid "NetworkManager version too old" -msgstr "" +msgstr "نگارش مدیر شبکه بیش از حد قدیمی" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "جریان خروجی write را پیاده نساخته" #: gio/goutputstream.c:474 gio/goutputstream.c:1539 #, c-format msgid "Sum of vectors passed to %s too large" -msgstr "" +msgstr "جمع بردارهای داده شده به %s بیش از حد بزرگ" #: gio/goutputstream.c:738 gio/goutputstream.c:1769 msgid "Source stream is already closed" msgstr "جریان منبع از قبل بسته شده است" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" -msgstr "" +msgstr "شکست جست‌وجوی پیشکار نامشخّص" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "خطا در حل «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" -msgstr "" +msgstr "%s پیاده نشده" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "دامنهٔ نامعتبر" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 gio/gresource.c:1109 -#: gio/gresource.c:1181 gio/gresource.c:1255 gio/gresource.c:1336 -#: gio/gresourcefile.c:482 gio/gresourcefile.c:606 gio/gresourcefile.c:757 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" -msgstr "" +msgstr "منبع در «%s» وجود ندارد" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" -msgstr "" +msgstr "گشودن فشردگی منبع در «%s» شکست خورد" #: gio/gresourcefile.c:663 msgid "Resource files cannot be renamed" -msgstr "" +msgstr "پرونده‌های منبع قابل تغییر نام نیستند" #: gio/gresourcefile.c:753 #, c-format msgid "The resource at “%s” is not a directory" -msgstr "" +msgstr "منبع در «%s» شاخه نیست" #: gio/gresourcefile.c:961 msgid "Input stream doesn’t implement seek" msgstr "جریان ورودی seek را پیاده نساخته" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" -msgstr "" +msgstr "سیاهه کردن بخش‌های شامل منابع در یک پروندهٔ elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" msgstr "" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FILE [PATH]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECTION" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3410,15 +3503,15 @@ msgid "" "Details include the section, size and compression" msgstr "" -#: gio/gresource-tool.c:527 -msgid "Extract a resource file to stdout" -msgstr "" - #: gio/gresource-tool.c:528 +msgid "Extract a resource file to stdout" +msgstr "استحراج پروندهٔ منبع در خروجی استاندارد" + +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FILE PATH" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3434,7 +3527,7 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3449,19 +3542,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" -msgstr "" +msgstr " SECTION نامی (اختیاری) برای بخش‫ elf\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" -msgstr "" +msgstr " COMMAND فرمانی (اختیاری) برای توضیح\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FILE ‫یک پروندهٔ elf (یک کتاب‌خانهٔ دودویی یا اشتراکی)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3469,36 +3562,36 @@ msgstr "" " FILE ‫یک پروندهٔ elf (یک کتاب‌خانهٔ دودویی یا اشتراکی)\n" " یا یک پروندهٔ منبع ترجمه شده\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[PATH]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " PATH یک مسیر (اختیاری) منبع (شاید ناقص)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "PATH" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " PATH یک مسیر منبع\n" #: gio/gsettings-tool.c:51 gio/gsettings-tool.c:72 gio/gsettings-tool.c:925 #, c-format msgid "No such schema “%s”\n" -msgstr "هیچ شمایی چون «%s» وجود ندارد\n" +msgstr "هیچ طرحواره‌ای چون «%s» وجود ندارد\n" #: gio/gsettings-tool.c:57 #, c-format msgid "Schema “%s” is not relocatable (path must not be specified)\n" -msgstr "شمای «%s» قابل جابه‌جایی نیست (نباید مسیر مشخّص باشد)\n" +msgstr "طرحوارهٔ «%s» قابل جابه‌جایی نیست (نباید مسیر مشخّص باشد)\n" #: gio/gsettings-tool.c:78 #, c-format msgid "Schema “%s” is relocatable (path must be specified)\n" -msgstr "شمای «%s» قابل جابه‌جایی است (باید مسیر مشخّص باشد)\n" +msgstr "طرحوارهٔ «%s» قابل جابه‌جایی است (باید مسیر مشخّص باشد)\n" #: gio/gsettings-tool.c:92 msgid "Empty path given.\n" @@ -3514,7 +3607,7 @@ msgstr "مسیر با یک خط مورب (/) باید پایان یابد\n" #: gio/gsettings-tool.c:110 msgid "Path must not contain two adjacent slashes (//)\n" -msgstr "" +msgstr "مسیر نباید دو خط مورب متوالی (//) داشته باشد\n" #: gio/gsettings-tool.c:555 msgid "The provided value is outside of the valid range\n" @@ -3526,11 +3619,11 @@ msgstr "کلید نوشتنی نیست\n" #: gio/gsettings-tool.c:598 msgid "List the installed (non-relocatable) schemas" -msgstr "" +msgstr "سیاهه کردن طرحواره‌های نصب شده (غیر قابل جابه‌جایی)" #: gio/gsettings-tool.c:604 msgid "List the installed relocatable schemas" -msgstr "" +msgstr "سیاهه کردن طرحواره‌های قابل جابه‌جایی" #: gio/gsettings-tool.c:610 msgid "List the keys in SCHEMA" @@ -3549,6 +3642,8 @@ msgid "" "List keys and values, recursively\n" "If no SCHEMA is given, list all keys\n" msgstr "" +"سیاهه کردن کلیدها و مقدارها به صورت بازگشتی\n" +"اگر SCHEMA داده نشود، سیاهه کردن همهٔ کلیدها\n" #: gio/gsettings-tool.c:624 msgid "[SCHEMA[:PATH]]" @@ -3565,11 +3660,11 @@ msgstr "SCHEMA[:PATH] KEY" #: gio/gsettings-tool.c:635 msgid "Query the range of valid values for KEY" -msgstr "" +msgstr "پرس‌وجوی بازهٔ مقدارهای معتبر برای KEY" #: gio/gsettings-tool.c:641 msgid "Query the description for KEY" -msgstr "" +msgstr "پرس‌وجوی شرح برای KEY" #: gio/gsettings-tool.c:647 msgid "Set the value of KEY to VALUE" @@ -3597,6 +3692,9 @@ msgid "" "If no KEY is specified, monitor all keys in SCHEMA.\n" "Use ^C to stop monitoring.\n" msgstr "" +"پایش KEY برای دگرگونی‌ها.\n" +"اگر KEY مشخّص نشده باشد، پایش همهٔ کلیدها در SCHEMA.\n" +"استفاده از ‪^C‬ برای پایان پاییدن.\n" #: gio/gsettings-tool.c:674 msgid "SCHEMA[:PATH] [KEY]" @@ -3667,251 +3765,253 @@ msgstr "" #: gio/gsettings-tool.c:716 msgid " SCHEMADIR A directory to search for additional schemas\n" -msgstr "" +msgstr " SCHEMADIR شاخه‌ای برای جست‌وجوی طرحواره‌های اضافی\n" #: gio/gsettings-tool.c:724 msgid "" " SCHEMA The name of the schema\n" " PATH The path, for relocatable schemas\n" msgstr "" +" SCHEMA نام طرحواره\n" +" PATH مسیر برای طرحوارهٔ قابل جابه‌جایی\n" #: gio/gsettings-tool.c:729 msgid " KEY The (optional) key within the schema\n" -msgstr "" +msgstr " KEY کلید (اختیاری) در طرحواره\n" #: gio/gsettings-tool.c:733 msgid " KEY The key within the schema\n" -msgstr "" +msgstr " KEY کلید در طرحواره\n" #: gio/gsettings-tool.c:737 msgid " VALUE The value to set\n" -msgstr "" +msgstr " VALUE مقدار برای تنظیم\n" #: gio/gsettings-tool.c:792 #, c-format msgid "Could not load schemas from %s: %s\n" -msgstr "نتوانست شماها را از %s بار کند: %s\n" +msgstr "نتوانست طرحواره‌ها را از %s بار کند: %s\n" #: gio/gsettings-tool.c:804 msgid "No schemas installed\n" -msgstr "هیچ شمایی نصب نشده\n" +msgstr "هیچ طرحواره‌ای نصب نشده\n" #: gio/gsettings-tool.c:883 msgid "Empty schema name given\n" -msgstr "" +msgstr "نام طرحوارهٔ خالی داده شده\n" #: gio/gsettings-tool.c:938 #, c-format msgid "No such key “%s”\n" msgstr "کلیدی چون «%s» وجود ندارد\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" -msgstr "" +msgstr "سوکت نامعتبر. مقداردهی نخستین نشد" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" -msgstr "" +msgstr "سوکت نامعتبر. مقداردهی نخستین شکست خورد چرا که: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "سوکت از قبل بسته شده است" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "مهلت سوکت ورودی و خروجی به سر رسید" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "درحال ساخت GSocket از طریق fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "نمی‌توان سوکت را ساخت: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "خانوادهٔ ناشناخته مشخّص شده" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "پروتکل ناشناسی مشخص شده است" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." -msgstr "" +msgstr "نمی‌توان عملیات دیتاگرم را روی سوکتی غیر دیتاگرم استفاده کرد." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." -msgstr "" +msgstr "نمی‌توان عملیات دیتاگرم را روی سوکتی با مهلت زمانی استفاده کرد." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "نمی‌توان آدرس محلی را دریافت کرد: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "نمی‌توان آدرس دوردست را دریافت کرد: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "نتوانست شنود کند: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "خطا در چسبیدن به نشانی ‎%s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "خطا در پیوستن به گروه چندپخشی: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "خطا در ترک گروه چندپخشی: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" -msgstr "" +msgstr "بدون پشتیبانی از چندپخشی مختص به منبع" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" -msgstr "" +msgstr "خانوادهٔ سوکت پشیبانی نشده" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" -msgstr "" +msgstr "مختص منبع نه نشانی IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" -msgstr "" +msgstr "نام میانا بیش از حد بلند" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "میانا پیدا نشد: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" -msgstr "" +msgstr "بدون پشتیبانی از چندپخشی مختص به منبع IPv4" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" -msgstr "" +msgstr "بدون پشتیبانی از چندپخشی مختص به منبع IPv6" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "خطا در هنگام پذیرفتن اتصال: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "اتصال در حال پیشروی است" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "ناتوان در دریافت خطای درانتظار: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "خطا در دریافت داده: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "خطا در ارسال داده: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "نمی‌توان سوکت را خاموش کرد: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "خط در هنگام بستن سوکت: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "در حال انتظار برای وضعیت سوکت: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "ناتوان در فرستادن پیام: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "بردارهای پیام بیش از حد بلند" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "خطا در هنگام ارسال پیام: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "روی ویندوز از GSocketControlMessage پشتیبانی نمی‌شود" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "خطا در هنگام دریافت پیام: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "ناتوان در خواندن گواهی‌های سوکت: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" -msgstr "" +msgstr "روی این سیستم‌عامل g_socket_get_credentials پیاده نشده" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " -msgstr "" +msgstr "نتوانست به کارساز پیشکار %s وصل شود: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "نمی‌توان به %s متصل شد: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "نتوانست وصل شود: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "پیشکاری روی اتّصالی غیر TCP پیشتیبانی نمی‌شود." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "شیوه‌نامهٔ پیشکار «%s» پیشتیبانی نمی‌شود." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "شنونده از قبل بسته شده است" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "سوکت اضافه شده بسته است" @@ -4000,103 +4100,103 @@ msgstr "پیشکار SOCKSv5 از نوع آدرس ارائه شده پشتیبا msgid "Unknown SOCKSv5 proxy error." msgstr "خطا ناشناس پیشکار نسخه ۵ SOCKS." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "ایجاد لوله برای ارتباط با فرایند فرزند شکست خورد (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "روی این بن‌سازه ار لوله‌ها پشتیبانی نمی‌شود" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "نمی‌توان نگارش %Id رمزنگاری GThemedIcon را مدیریت کرد" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "هیجچ نشانی معتبری پیدا نشد" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "خطا در حل معکوس «%s»: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "طا در تجزیهٔ رکورد %s ساناد: بستهٔ ساناد بدریخت" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "هیچ رکورد سانادی از گونهٔ درخواستی برای «%s» وجود ندارد" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "ناتوانی موقتی در تحلیل «%s»" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "خطا در حل «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "بستهٔ ساناد بدریخت" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "شکست در تجزیهٔ پاسخ ساناد برای «%s»: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "هیچ کلید خصوصی رمز‌نگاری شده PEM پیدا نشد" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "نمی‌توان کلید خصوصی رمزنگاری شده با PEM را رمزگشایی کرد" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "نمی‌توان کلید خصوصی رمزنگاری شده PEM را تجزیه کرد" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "هیچ گواهینامه رمزنگاری شده PEM پیدا نشد" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "نمی‌توان گواهینامه رمزنگاری شده PEM را پیدا کرد" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" -msgstr "" +msgstr "پسانهٔ کنونی TLS از ‪PKCS #12‬ پشتیبانی نمی‌کند" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" -msgstr "" +msgstr "این GTlsBackend از ایجاد گواهی‌های ‪PKCS #11‬ پشتیبانی نمی‌کند" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access is " "locked out." msgstr "" -"این آخرین شانس برای وارد کردن گذرواژه بطور صحیح قبل از قفل شدن دسترسی شما است." +"این آخرین شانس برای وارد کردن گذرواژه بطور صحیح پیش از قفل شدن دسترسیتان است." #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be locked " "out after further failures." @@ -4104,135 +4204,145 @@ msgstr "" "تعدادی از گذرواژهای وارد شده نادرست بوده‌اند و دسترسیتان پس از شکست‌های بعدی قفل " "خواهد شد." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "گذرواژه وارد شده نادرست است." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "فرستادن FD پشتیبانی نمی‌شود" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "انتظار ۱ پیام واپایشی می‌رفت، %Id مورد دریافت شد" msgstr[1] "انتظار ۱ پیام واپایشی می‌رفت، %Id مورد دریافت شد" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "نوع داده کمکی غیرمنتظره" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "انتظار یک fd می‌رفت، ولی %Id مورد دریافت شد\n" msgstr[1] "انتظار یک fd می‌رفت، ولی %Id مورد دریافت شد\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "یک fd نامعتبر دریافت شد" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "گرفتن FD پشتیبانی نمی‌شود" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "خطا در زمان ارسال گواهینامه: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "خطا در هنگام بررسی اینکه آیا SO_PASSCRED f برای سوکت فعال است یا خیر: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "خطا در هنگام فعال کردن SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "انتظار خواندن یک بایت برای دریافت گواهینامه می‌رفت اما صفر بایت خوانده شد" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "انتظار پیام کنترلی نمی‌رفت، اما %Id دریافت شد" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "خطا در هنگام غیرفعال‌سازی SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "خطا در خواندن از توصیف‌گر پرونده: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "خطا در بستن توصیف‌گر پرونده: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "ریشه سیستم‌پرونده‌ها" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "خطا در نوشتن روی توصیف‌گر پرونده: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" -msgstr "" +msgstr "انتزاع نشانی‌های سوکت دامنهٔ یونیکس روی این سامانه پشتیبانی نمی‌شود" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "حجم eject را پیاده نساخته" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "حجم eject یا eject_with_operation را پیاده نساخته" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "کارهٔ «%s» در شی برنامه هیچ فعلی ندارد" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "کارهٔ «%s» و مدیر «%s» در شی برنامه هیچ فعلی ندارند" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "خطا در خواندن از مدیر: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "خطا در بستن مدیر: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "خطا در نوشتن روی مدیر: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "حافظه کافی موجود نیست" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "خطا داخلی: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "ورودی بیشتر لازم است" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "داده فشرده شده نامعتبر" @@ -4242,7 +4352,7 @@ msgstr "نشانی برای شنود" #: gio/tests/gdbus-daemon.c:19 msgid "Ignored, for compat with GTestDbus" -msgstr "" +msgstr "چشم‌پوشیده برای سازگاری با GTestDbus" #: gio/tests/gdbus-daemon.c:20 msgid "Print address" @@ -4260,149 +4370,286 @@ msgstr "اجرای یک خدمت دی‌باس" msgid "Wrong args\n" msgstr "آرکومان‌های اشتباه\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "شکست در گشودن «‎%s»: ‏%s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "خطا: نتوانست خروجی کامل را بنویسد: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "خطا: شکست در تغییر نام «‎%s» به «%s»: ‏%s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "شامل شاخه‌ها در مسیر جست‌وجوی GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "پروندهٔ خروجی" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "کتابخانهٔ هم‌رسانده" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "نمایش پیام‌های رفع اشکال" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "نمایش پیام‌های پرگو" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "نمایش شمارهٔ نگارش برنامه و خروج" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "خطا در تجزیهٔ آرگومان‌ها: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "مشخّص کردن دقیقاً یک پروندهٔ ورودی" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "خطا در تجزیهٔ پروندهٔ «%s»: ‏%s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "شکست در ساخت typelib برای پیمانهٔ «%s»" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "مفدار typelib نامعتبر برای پیمانهٔ «%s»: ‏%s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "نمایش همهٔ اطَلاعات موجود" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "شکست در تجزیه: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "بدون پروندهٔ ورودی" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "شکست درخواندن «‎%s»: ‏%s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "شکست در ساخت typelib‏ «%s»: ‏%s" + +#: girepository/decompiler/decompiler.c:129 girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "شکست در بار کردن typelib‏: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "هشدار: %Iu پیمانه حذف شده" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "نگارش Typelib برای بازرسی" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERSION" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "سیاهه کردن کتابخانه‌های هم‌رساندهٔ لازم برای typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "سیاهه کردن دیگر typelibهای لازم برای typelib بازررسی شده" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "مقدار typelib برای بازرسی" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "NAMESPACE" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- بازرسی GI typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "شکست در تجزیهٔ گزینه‌های خط فرمان: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "مشخّص کردن دقیقاً یک فضانام" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "مشخّص کردن ‪--print-shlibs‬، ‪--print-typelibs‬ یا هردو" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" -msgstr "صفت نامنتظرهٔ «%s» برای عنصر «%s»" +msgstr "مشخّصهٔ نامنتظرهٔ «%s» برای عنصر «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" -msgstr "صفت «%s» برای عنصر «%s» پیدا نشد" +msgstr "مشخّصه «%s» برای عنصر «%s» پیدا نشد" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 glib/gbookmarkfile.c:1413 -#: glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 glib/gbookmarkfile.c:1368 +#: glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "برچسب نامنتظرهٔ «%s»، انتظار برچسب «%s» می‌رفت" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 glib/gbookmarkfile.c:1391 -#: glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 glib/gbookmarkfile.c:1346 +#: glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "برچسب نامنتظرهٔ «%s» داخل «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "تاریخ یا زمان اشتباه «%s» در پروندهٔ نشانم" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "پروندهٔ چوب‌الف معتبری در شاخه‌های داده پیدا نمی‌شود" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "نشانکی برای نشانی «‎%s» از پیش موجود است" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 glib/gbookmarkfile.c:2449 -#: glib/gbookmarkfile.c:2529 glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 glib/gbookmarkfile.c:3058 -#: glib/gbookmarkfile.c:3155 glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 glib/gbookmarkfile.c:3919 -#: glib/gbookmarkfile.c:4008 glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 glib/gbookmarkfile.c:2404 +#: glib/gbookmarkfile.c:2484 glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 glib/gbookmarkfile.c:3013 +#: glib/gbookmarkfile.c:3110 glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 glib/gbookmarkfile.c:3874 +#: glib/gbookmarkfile.c:3963 glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "نشانکی برای نشانی «‎%s» پیدا نشد" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "هیچ گونهٔ MIMEای در نشانک برای نشانی «‎%s» تعریف نشده" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "هیچ پرچم خصوصی‌ای در نشانک برای نشانی «%s» تعریف نشده" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "هیچ گروهی در نشانک برای نشانی «‎%s» تعیین نشده" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "هیچ برنامه‌ای با نام «%s» نشانکی برای «‎%s» ثبت نکرده" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "شکست در گستراندن خط «‎%s» با نشانی «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "نویسهٔ غیرقابل نمایش در ورودی تبدیل" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "دنباله نویسهٔ ناتمام در انتهای ورودی" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "نمی‌توان عقب‌نشینی «%s» را به مجموعه کد «%s» تبدیل کرد" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "بایت تهی تعبیه شده در ورودی تبدیل" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "بایت تهی تعبیه شده در خروجی تبدیل" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" -msgstr "نشانی «‎%s» یک نشانی اینترنتی مطلق با شِمای «پرونده» نیست" +msgstr "نشانی «‎%s» یک نشانی اینترنتی مطلق با طرحوارهٔ «پرونده» نیست" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "نشانی اینترنتی «%s» نامعتبر است" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "نام میزبان نشانی اینترنتی «‎%s» نامعتبر است" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "نشانی اینترنتی «‎%s» نویسه‌های گریختهٔ نامعتبر دارد" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "نام مسیر «‎%s» یک مسیر مطلق نیست" # استفاده از نویسه‌های U+2266 و U+2269 برای ایزوله‌کردن زمان، تا به درستی نمایش داده شود. #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%A %Oe %B %Oy، ⁦%OH:%OM:%OS⁩" # استفاده از نویسه‌های U+2266 و U+2269 برای ایزوله‌کردن تاریخ، تا به درستی نمایش داده شود. #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "⁩%Oy/%Om/%Od⁩" # استفاده از نویسه‌های U+2266 و U+2269 برای ایزوله‌کردن زمان، تا به درستی نمایش داده شود. #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "⁦%OH:%OM:%OS⁩" # استفاده از نویسه‌های U+2266 و U+2269 برای ایزوله‌کردن زمان، تا به درستی نمایش داده شود. #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "⁦%OI:%OM:%OS⁩ %p" @@ -4423,62 +4670,62 @@ msgstr "⁦%OI:%OM:%OS⁩ %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "ژانویه" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "فوریه" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "مارس" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "آوریل" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "مه" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "ژوئن" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "ژوئیه" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "آگوست" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "سپتامبر" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "اکتبر" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "نوامبر" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "دسامبر" @@ -4500,132 +4747,132 @@ msgstr "دسامبر" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "ژانویه" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "فوریه" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "مارس" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "آوریل" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "مه" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "ژوئن" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "ژوئیه" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "آگوست" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "سپتامبر" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "اکتبر" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "نوامبر" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "دسامبر" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "دوشنبه" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "سه‌شنبه" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "چهارشنبه" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "پنجشنبه" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "جمعه" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "شنبه" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "یکشنبه" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "دوشنبه" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "سه‌شنبه" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "چهارشنبه" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "پنجشنبه" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "جمعه" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "شنبه" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "یکشنبه" @@ -4647,62 +4894,62 @@ msgstr "یکشنبه" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "ژانویه" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "فوریه" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "مارس" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "آوریل" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "مه" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "ژوئن" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "ژوئیه" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "آگوست" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "سپتامبر" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "اکتبر" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "نوامبر" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "دسامبر" @@ -4724,273 +4971,279 @@ msgstr "دسامبر" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "ژانویه" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "فوریه" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "مارس" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "آوریل" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "مه" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "ژوئن" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "ژوئیه" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "آگوست" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "سپتامبر" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "اکتبر" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "نوامبر" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "دسامبر" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "ق‌ظ" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "ب‌ظ" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "خطا در گشودن شاخهٔ «‎%s»‏: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "نتوانست %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص دهد" -msgstr[1] "نتوانست %Ilu بایت برای خواندن پروندهٔ «‎%s» تخصیص دهد" +msgid "Could not allocate %s to read file “%s”" +msgstr "نتوانست %s را برای خواندن پروندهٔ «‎%s» تخصیص دهد" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "خطا در خواندن پروندهٔ «%s»: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "پروندهٔ «%s» بسیار بزرگ است" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "شکست در خواندن از پروندهٔ «‎%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "شکست در گشودن پروندهٔ «‎%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "شکست در گرفتن مشخصه‌های پروندهٔ «‎%s»: fstat()‎ شکست خورد: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "شکست در گشودن پروندهٔ «‎%s»: fdopen()‎ شکست خورد: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "شکست در تغییر نام پروندهٔ «‎%s» به «‎%s»: g_rename()‎ شکست خورد: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "شکست در نوشتن پروندهٔ «‎%s»: ‪fturncate()‬ شکست خورد: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "شکست در نوشتن پروندهٔ «‎%s»: fdwrite()‎ شکست خورد: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "شکست در نوشتن پروندهٔ «‎%s»: fsync()‎ شکست خورد: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "شکست در ایجاد پروندهٔ «‎%s»: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "پروندهٔ موجود «‎%s» نتوانست برداشته شود: g_unlink() شکست خورد: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "قالب «%s» نامعتبر است، نباید «%s» داشته باشد" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "قالب «%s» شامل XXXXXX نیست" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "شکست در خواندن پیوند نمادین «‎%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "نتوانست تبدیلگر «%s» به «%s» را بگشاید: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "نمی‌توان در g_io_channel_read_line_string خوانش خام انجام داد" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "دادهٔ تبدیل‌نشده در میان‌گیر خواندن باقی مانده است" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "کانال با یک نویسهٔ ناتمام پایان می‌یابد" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "نمی‌توان در g_io_channel_read_to_end خوانش خام انجام داد" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "پروندهٔ کلید معتبر در شاخه‌های جست‌وجو یافت نمی‌شود" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "پرونده متعارف نیست" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "پرونده کلید حاوی خط «%s» است که جفت کلید‐مقدار، گروه یا توضیح نیست" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "نام گروه نامعتبر: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "پروندهٔ کلید با یک گروه آغاز نمی‌شود" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "نام کلید نامعتبر: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "پروندهٔ کلید حاوی کدگذاری پشتیبانی نشدهٔ «%s» است" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "پروندهٔ کلید گروه «%s» را ندارد" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "پروندهٔ کلید، کلید «%s» در گروه «%s» را ندارد" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "پروندهٔ کلید دارای کلید «%s» با مقدار «%s» است که UTF-8 نیست" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "پروندهٔ کلید دارای کلید «%s» است که دارای مقداری است که قابل تفسیر نیست." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." msgstr "پروندهٔ کلید دارای کلید «%s» در گروه «%s» است که مقداری غیرقابل تفسیر دارد." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "کلید «%s» در گروه «%s» دارای مقدار «%s» است؛ در حالی مه انتظار %s می رفت" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "پرونده کلید شامل نویسهٔ گریز در انتهای خط است" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "پروندهٔ کلید حاوی دنبالهٔ گریز نامعتبر «%s» است" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "مقدار «%s» را نمی‌توان به عدد تفسیر کرد." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "مقدار صحیح «%s» خارج از محدوده است" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "مقدار «%s» را نمی‌توان به عدد اعشاری تفسیر کرد." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "مقدار «%s» را نمی‌توان به مقدار بولی تفسیر کرد." @@ -5010,32 +5263,32 @@ msgstr "شکست در نگاشت %s%s%s%s: mmap()‎ شکست خورد: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "شکست در گشودن «%s»: ‪open()‬ شکست خورد: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "خطا در سطر %Id نویسهٔ %Id:‏ " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "متن کدگذاری‌شدهٔ UTF-8 نامعتبر در نام - «%s» معتبر نیست" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "نام «%s» معتبر نیست" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "نام «%s» معتبر نیست: «%c»" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "خطا در سطر %Id:‏ %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5044,7 +5297,7 @@ msgstr "" "شکست در تجزیهٔ «‎%-.*s»، که باید رقمی داخل یک ارجاع نویسه‌ای (مثل ‎ê‎) باشد - " "شاید رقم خیلی بزرگ است" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand as " @@ -5054,23 +5307,23 @@ msgstr "" "موجودیتی را بیاغازید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & از ‎&‎ " "استفاده کنید;" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "ارجاع نویسه‌ای «‎%-.*s» به نویسهٔ مجاز اشاره نمی‌کند" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "موجودیت خالی «‎&;‎» مشاهده شد؛ موجودیت‌های معتبر عبارتند از: ‎& " < > " "'" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "نام موجودیت «%-.*s» شناخته شده نیست" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand character " "without intending to start an entity — escape ampersand as &" @@ -5079,18 +5332,18 @@ msgstr "" "موجودیتی را بیاغازید از نویسهٔ & استفاده کرده‌اید - برای نوشتن علامت & از ‎&‎ " "استفاده کنید;" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "نوشتار باید با یک عنصر (مثلاً ) شروع شود" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "«%s» پس از یک نویسهٔ '‎<‎' نویسهٔ مجازی نیست؛ نمی‌شود ابتدای نام یک عنصر باشد" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag “%s”" @@ -5098,19 +5351,19 @@ msgstr "" "نویسهٔ غیرعادی «%s»، برای پایان دادن به برچسب عنصر خالی «%s» انتظار یک نویسهٔ «‎>‎» " "می‌رفت" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "ویژگی‌های بیش از حد در عنصر «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "نویسهٔ غیرعادی «%s»، بعد از نام مشخصهٔ «%s» عنصر «%s» انتظار یک نویسهٔ «=» می‌رفت" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5121,7 +5374,7 @@ msgstr "" "انتظار یک نویسهٔ «‎>‎» یا «/» می‌رفت؛ شاید از یک نویسهٔ نامعتبر در نام مشخصه‌ای " "استفاده کرده باشید" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5130,7 +5383,7 @@ msgstr "" "نویسهٔ غیرعادی «%s»، هنگام مقدار دادن به مشخصهٔ «%s» از عنصر «%s» پس از علامت " "تساوی انتظار یک علامت نقل قول باز می‌رفت" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" msgstr "«%s» نویسهٔ معتبری برای بستن نام عنصر «%s» نیست؛ نویسهٔ مجاز «‎<» است" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "عنصر «%s» بسته بود، در حال حاضر هیچ عنصری باز نیست" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "عنصر «%s» بسته بود، ولی عنصری که در حال حاضر باز است «%s» است" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "نوشتار خالی است یا فقط فاصلهٔ خالی دارد" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "نوشتار به‌طور غیرمنتظره‌ای درست بعد از یک علامت کوچکتر '‎<‎' پایان یافت" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last element " @@ -5173,7 +5426,7 @@ msgstr "" "نوشتار وقتی که هنوز عناصری باز بودند به‌طور غیرمنتظره‌ای پایان یافت — آخرین عنصر " "باز شده «%s» بود" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending the " @@ -5182,19 +5435,19 @@ msgstr "" "نوشتار به‌طور غیرمنتظره‌ای پایان یافت، یک علامت بزرگتر برای بستن برچسب ‎<%s/>‎ " "انتظار می‌رفت" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک عنصر به‌پایان رسید" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل نام یک مشخصه به‌پایان رسید" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک برچسب عنصربازکن پایان یافت." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute name; " "no attribute value" @@ -5202,486 +5455,486 @@ msgstr "" "نوشتار به‌طور غیرمنتظره‌ای بعد از علامت تساوی‌ای که پس از نام مشخصه‌ای آمده بود تمام " "شد؛ بدون مقدار برای مشخصه" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل مقدار یک مشخصه به‌پایان رسید" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "Document ended unexpectedly inside the close tag for an unopened element" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل برچسب بستن عنصر «%s» پایان یافت" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "نوشتار به‌طور غیرمنتظره‌ای داخل یک توضیح یا دستورالعمل پردازشی پایان یافت" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPTION…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "گزینه‌های راهنما:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "نمایش گزینه‌های راهنما" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "نمایش همهٔ گزینه‌های راهنما" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "گزینه‌های برنامه:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "گزینه‌ها:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "نمی‌توان مقدار صحیح «%s» برای %s را تجزیه کرد" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "مقدار صحیح «%s» خارج از محدودهٔ %s است" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "نمی‌توان مقدار صحیح با دقت مضاعف «%s» برای %s را تجزیه کرد" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "مقدار صحیح با دقت مضاعف «%s» خارج از محدودهٔ %s است" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "خطا در تجزیهٔ گزینهٔ %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "‏%s یک آرگومان کم دارد" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "گزینهٔ نامعلوم %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "شیء ناقص" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "حافظه کم است" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "خطا داخلی" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "الگو حاوی مواردی است که برای مطابقت جزئی مناسب نیست" -#: glib/gregex.c:501 -msgid "back references as conditions are not supported for partial matching" -msgstr "" - #: glib/gregex.c:507 +msgid "back references as conditions are not supported for partial matching" +msgstr "ارجاع به پیش‌ها به عنوان شرط برای مطابقت‌های جزیی پشتیبانی نمی‌شوند" + +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "محدودیت تکرار فرارسید" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "جابه‌جایی نادرست" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "حلقهٔ بازگشتی" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "حالت تطبیقی درخواست می‌شود که برای JIT ترجمه نشده بود" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "خطا نادرست" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ در پایان الگو" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c در پایان الگو" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "نویسهٔ ناشناخته پس از \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "اعداد بدون ترتیل در کمیت‌سنج {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "اعداد در کمیت‌سنج {} بسیار بزرگ هستند" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "بدون [ پایان‌دهنده برای کلاس نویسه" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "دنبالهٔ گریز نامعتبر در کلاس نویسه" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "محدوده در کلاس نویسه بدون ترتیب است" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "چیزی برای تکرار نیست" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "نویسهٔ ناشناس پس از ‪(?‬ یا ‪(?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "کلاس‌های نام‌دار پازیکس تنها درون کلاس‌ها پشتیبانی می‌شوند" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "عنصرهای تطبیق با POSIX پشتیبانی نمی‌شوند" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "پرانتز بستهٔ پایانی ناموجود" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "ارجاع به زیرالگوی ناموجود" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "پرانتز بستهٔ ناموجود پس از نظر" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "عبارت باقاعده بیش از حد بلند است" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "عدد یا نام بدریخت پس از ‪(?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" -msgstr "" +msgstr "ادعای پیش‌نگری طول ثابتی ندارد" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" -msgstr "" +msgstr "گروه شرطی بیش از دو شاخه دارد" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" -msgstr "" +msgstr "پس از ‪(?(‬ انتظار ادّعا می‌رفت" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "ارجاع عددی نباید صفر باشد" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "نام کلاس POSIX ناشناخته" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "مقدار نویسه در دنبالهٔ ‪\\x{...}‬ بیش از حد طولانی است" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" -msgstr "" +msgstr "در ادّعای پیش‌نگری ‪\\C‬ مجاز نیست" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "در نام زیرالگو پایان دهنده وجود ندارد" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "نام دو زیرالگوی نام‌دار یکی است" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "دنبالهٔ ‪\\P‬ یا ‪\\p‬ بدریخت" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "خصیصهٔ ناشناس پس از \\P یا \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "نام زیرالگو بیش از حد طولانی است (بیشینه ۳۲ نویسه)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "زیرالگوهای نام‌دار بیش از حد (بیشینه ۱۰٫۰۰۰)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "مقدار هشت‌هشتی بزرگ‌تر از \\377 است" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" -msgstr "" +msgstr "گروه DEFINE بیش از یک شاخه دارد" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "گزینه‌های NEWLINE متناقض" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, or " "by a plain number" msgstr "" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" -msgstr "" +msgstr "آرکومان برای ‪(*ACCEPT)‬, ‪(*FAIL)‬, یا ‪(*COMMIT)‬ مجاز نیست" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" -msgstr "" +msgstr "مقدار ‪(*VERB)‬ شناخته نشده" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "عدد بیش از حد بزرگ است" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" -msgstr "" +msgstr "نام زیرالگوی ناموجود پس از ‪(?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" -msgstr "" +msgstr "نام‌های مستقیم برای زیرالگکوهایی از همان شماره مجاز نیستند" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" -msgstr "" +msgstr "باید ‪(*MARK) ‬ آرگومانی داشته باشد" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" -msgstr "" +msgstr "باید ‪\\‬c‪‬ با نویسه‌ای اسکی همراه شود" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "از ‪/N‬ در یک کلاس پشتیبانی نمی‌شود" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "نام در (*MARK)، (*PRUNE)، (*SKIP) یا (*THEN) بیش از حد طولانی است." -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "سرریز کد" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "نویسه ناشناس بعد از (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "فضای کاری ترجمهٔ پایمال شده" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "زیرالگوی ارجاع شدهٔ پیش‌تر بررسی شده پیدا نشد" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "خطا در هنگام منطبق کردن عبارت باقاعده %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "کتابخانه PCRE بدون پشتیبانی از UTF8 کامپایل شده است" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "کتابخانهٔ PCRE با گزینه‌هایی ناسازگار ترجمه شده" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "خطا هنگام ترجمهٔ عبارت با قاعدهٔ «%s» در نویسهٔ %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "انتظار رقم شانزده‌شانزدهی یا «}» می‌رفت" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "رقم هگزادسیمال مورد انتظار بود" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "بدون «>» در ارجاع نمادین" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "ارجاع نمادین ناتمام" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "مرجع نمادین با طول صفر" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "انتظار رقم می‌رفت" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "ارجاع نمادین غیرقانونی" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "«\\» پایانی سرگردان" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "دنبالهٔ گریز ناشناخته" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "خطا هنگام تجزیه کردن متن جایگزین «%s» در نویسهٔ %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "متن نقل شده با علامت نقل قول شروع نمی‌شود" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "علامت نقل قول تکی در سطر دستور یا متون داخل پوستهٔ دیگر" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "متن دقیقاً پس از یک نویسهٔ «\\» پایان یافت. (متن عبارت بود از «%s»)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "متن پیش از آن که علامت نقل قول متناظر برای %c پیدا شود پایان یافت. (متن عبارت " "بود از «%s»)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "متن خالی بود (یا فقط فاصلهٔ خالی داشت)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "خواندن داده‌ها از فرایند فرزند شکست خورد (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "خطای غیرمنتظره در خواندن داده‌ها از یک فرایند فرزند (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "خطای غیرمنتظره در waitpid()‎ ‏(%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "فرایند فرزند با رمز %ld خارج شد" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "فرایند فرزند به دست سیگنال %ld کشته شد" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "فرایند فرزند به دست سیگنال %ld متوقّف شد" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "فرایند فرزند به طور غیر معمول خارج شد" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "خواندن از لولهٔ فرزند شکست خورد (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "انشعاب فرایند فرزند «%s» شکست خورد (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "انشعاب شکست خورد (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "تغییر به شاخهٔ «%s» شکست خورد: (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "اجرای فرایند فرزند «%s» شکست خورد (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "شکست در گشودن شرح‌دهندهٔ پروندهٔ بازنگاشت (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "شکست در تکرار شرح‌دهندهٔ پرونده برای فرایند فرزند (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "انشعاب فرایند فرزند شکست خورد (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "شکست در بستن شرح‌دهندهٔ پرونده برای فرایند فرزند (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "خطای ناشناخته در اجرای فرایند فرزند «%s»" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "خواندن دادهٔ کافی از لولهٔ pid فرزند شکست خورد (%s)" @@ -5737,78 +5990,78 @@ msgstr "" "خطای غیرمنتظره در g_io_channel_win32_poll()‎ هنگام خواندن داده‌ها از یک فرایند " "فرزند" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "رشتهٔ خالی یک شماره نیست" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» عددی علامت‌دار نیست" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "شمارهٔ «%s» خارج از محدودهٔ [%s, %s] است" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» عددی بدون علامت نیست" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "کدگذاری % نامعتبر در نشانی" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "نویسه‌های غیرقانونی در نشانی" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "نویشه‌های غیر UTF-8 در نشانی" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "نشانی آی‌پی۶ «%.*s» در نشانی" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "نشانی آی‌پی رمزشدهٔ غیرقانونی «%.*s» در نشانی" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "نام دامنهٔ غیرقانونی بین‌المللی‌سازی «%.*s» در نشانی" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "نتوانست درگاه «%.*s» در نشانی را تجزیه کند" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "درگاه «%.*s» در نشانی حارج از محدوده است" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "نشانی «‎%s» یک نشانی مطلق نیست" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "نشانی «%s» هیچ مولّفهٔ میزبانی ندارد" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "نشانی مطلق نیست و هیج نشانی پایه‌ای فراهم نشده" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "بدون «=»‌و مقدار پرامتر" @@ -5889,64 +6142,64 @@ msgstr "پی‌ب" msgid "EiB" msgstr "ای‌ب" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" +msgid "kbit" msgstr "ک‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" +msgid "Mbit" msgstr "م‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" +msgid "Gbit" msgstr "گ‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" +msgid "Tbit" msgstr "ت‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" +msgid "Pbit" msgstr "پ‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "اِبی" +msgid "Ebit" +msgstr "ابی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" +msgid "Kibit" msgstr "کی‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" +msgid "Mibit" msgstr "می‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" +msgid "Gibit" msgstr "گی‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" +msgid "Tibit" msgstr "تی‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" +msgid "Pibit" msgstr "پی‌بی" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" +msgid "Eibit" msgstr "ای‌بی" #: glib/gutils.c:3056 @@ -6025,32 +6278,77 @@ msgstr[1] "%Iu بایت" #: glib/gutils.c:3214 #, c-format msgid "%.1f KB" -msgstr "%I.1f کیلوبایت" +msgstr "%I.1f ک‌ب" #: glib/gutils.c:3219 #, c-format msgid "%.1f MB" -msgstr "%I.1f مگابایت" +msgstr "%I.1f م‌ب" #: glib/gutils.c:3224 #, c-format msgid "%.1f GB" -msgstr "%I.1f گیگابایت" +msgstr "%I.1f گ‌ب" #: glib/gutils.c:3229 #, c-format msgid "%.1f TB" -msgstr "%I.1f ترابایت" +msgstr "%I.1f ت‌ب" #: glib/gutils.c:3234 #, c-format msgid "%.1f PB" -msgstr "%I.1f پتابایت" +msgstr "%I.1f پ‌ب" #: glib/gutils.c:3239 #, c-format msgid "%.1f EB" -msgstr "%I.1f اگزابایت" +msgstr "%I.1f اب" + +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "نتوانست %s را تخصیص دهد" +#~ msgstr[1] "نتوانست %s را تخصیص دهد" + +#~ msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "پیام METHOD_RETURN: زمینهٔ سرایند REPLY_SERIAL وجود نداشته یا نامعتبر است" + +#~ msgid "kb" +#~ msgstr "ک‌بی" + +#~ msgid "Mb" +#~ msgstr "م‌بی" + +#~ msgid "Gb" +#~ msgstr "گ‌بی" + +#~ msgid "Tb" +#~ msgstr "ت‌بی" + +#~ msgid "Pb" +#~ msgstr "پ‌بی" + +#~ msgid "Eb" +#~ msgstr "اِبی" + +#~ msgid "Kib" +#~ msgstr "کی‌بی" + +#~ msgid "Mib" +#~ msgstr "می‌بی" + +#~ msgid "Gib" +#~ msgstr "گی‌بی" + +#~ msgid "Tib" +#~ msgstr "تی‌بی" + +#~ msgid "Pib" +#~ msgstr "پی‌بی" + +#~ msgid "Eib" +#~ msgstr "ای‌بی" #~ msgid "backtracking limit reached" #~ msgstr "محدودیت backtracking فرارسید" diff --git a/po/gl.po b/po/gl.po index e528fda..ee46f4a 100644 --- a/po/gl.po +++ b/po/gl.po @@ -17,17 +17,17 @@ msgid "" msgstr "" "Project-Id-Version: glib.master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 20:16+0000\n" -"PO-Revision-Date: 2023-09-01 12:28+0200\n" -"Last-Translator: Fran Dieguez \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-15 02:24+0000\n" +"PO-Revision-Date: 2024-02-18 20:52+0100\n" +"Last-Translator: Fran Dieguez \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" "X-Project-Style: gnome\n" "X-DL-Team: gl\n" "X-DL-Module: glib\n" @@ -57,38 +57,42 @@ msgstr "" "Produciuse un fallo ao buscar a aplicación predeterminada para o esquema de " "URI «%s»" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Opcións da GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Mostrar as opcións de GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Escriba o modo de servizo de GApplication (usar desde os ficheiros de " "servizo D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Omitir o ID da aplicación" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Imprimir a versión da aplicación" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Substituír a instancia en execución" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Imprimir axuda" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[ORDE]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Mostrar versión" @@ -143,7 +147,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "ORDE" @@ -158,7 +162,7 @@ msgstr "" #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 msgid "FILE" msgstr "FICHEIRO" @@ -182,7 +186,7 @@ msgstr "PARÁMETRO" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Parámetro opcional para a invocación da acción, en formato GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -196,12 +200,12 @@ msgstr "" msgid "Usage:\n" msgstr "Uso:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumentos:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGS...]" @@ -294,78 +298,78 @@ msgstr "" "orde descoñecida: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "O valor de conta pasado a %s é demasiado longo" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Non se permite buscar no fluxo base" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Non é posíbel truncar GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "O fluxo xa se pechou" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Non se permite truncar no fluxo base" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "A operación foi cancelada" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "O socket non é válido, non se inicializou" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "A secuencia de bytes non é válida na entrada da conversión" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Non hai espazo abondo para o enderezo do socket" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "A secuencia de bytes non é válida na entrada da conversión" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Produciuse un erro durante a conversión: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Non se permite a inicialización cancelábel" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Non se admite a conversión do conxunto de caracteres «%s» a «%s»" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Non foi posíbel abrir o conversor de «%s» a «%s»" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "tipo %s" @@ -379,41 +383,41 @@ msgstr "Tipo descoñecido" msgid "%s filetype" msgstr "tipo de ficheiro %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials contén datos non válidos" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials non está implementado neste SO" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "A súa plataforma non ten compatibilidade con GCredentials" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials non contén un ID de proceso para este SO" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Non é posíbel burlar as credenciais neste SO" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Final de fluxo inesperadamente prematuro" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Clave «%s» non admitida na entrada do enderezo «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Combinación de par clave/valor sen sentido na entrada do enderezo «%s»" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -422,29 +426,29 @@ msgstr "" "O enderezo «%s» non é válido (necesítase exactamente unha ruta, directorio, " "directorio temporal ou claves abstractas)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Erro no enderezo «%s» — o atributo «%s» está mal formado" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Transporte «%s» descoñecido ou non compatíbel para o enderezo «%s»" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "O elemento do enderezo «%s» non contén un carácter dous puntos (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "" "O nome de transporte do elemento de enderezo «%s» non pode estar baleiro" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -453,7 +457,7 @@ msgstr "" "O par clave/valor %d, «%s» no elemento do enderezo «%s» non contén un signo " "de igual" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -461,7 +465,7 @@ msgstr "" "O par clave/valor %d, «%s» no elemento do enderezo «%s» non debe ter unha " "chave baleira" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -470,7 +474,7 @@ msgstr "" "Produciuse un erro ao desescapar a clave ou o valor no par clave/valor %d, " "«%s», no elemento de enderezo «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -479,85 +483,85 @@ msgstr "" "Erro no enderezo «%s» — o transporte unix require que se estabeleza " "exactamente unha das claves «path» ou «abstract»" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Erro no enderezo «%s» — falta o atributo do equipo ou está mal formado" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Erro no enderezo «%s» — falta o atributo do porto ou está mal formado" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Erro no enderezo «%s» — falta o atributo do ficheiro de uso de unha vez ou " "está mal formado" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Produciuse un erro ao autoiniciar: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Produciuse un erro ao abrir o ficheiro de uso de unha vez «%s»: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Produciuse un erro ao ler o ficheiro de uso de unha vez «%s»: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Produciuse un erro ao ler o ficheiro de uso de unha vez «%s»:, esperábanse " "16 bytes, obtivéronse %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "" "Produciuse un erro ao gravar os contidos do ficheiro de uso de unha vez «%s» " "ao fluxo:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "O enderezo fornecido está baleiro" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "" "Non é posíbel iniciar («spawn») unha bus de mensaxe cando AT_SECURE está " "estabelecido" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "" "Non é posíbel iniciar («spawn») unha mensaxe ao bus sen un ID de máquina: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Non é posíbel autoiniciar D-Bus sen un $DISPLAY X11" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Produciuse un erro ao iniciar («spawn») a orde «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Non é posíbel determinar o enderezo do bus de sesión (non está implementado " "para este SO)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -566,7 +570,7 @@ msgstr "" "Non é posíbel determinar o enderezo do bus desde a variábel de ambiente " "DBUS_STARTER_BUS_TYPE - valor descoñecido «%s»" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -574,20 +578,20 @@ msgstr "" "Non é posíbel determinar o enderezo do bus xa que a variábel de ambiente " "DBUS_STARTER_BUS_TYPE non está estabelecida" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Tipo de bus %d descoñecido" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Falta o contido inesperada ao tentar ler unha liña" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Falta de contido inesperada ao tentar ler (de forma segura) unha liña" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -595,15 +599,15 @@ msgstr "" "Esgotáronse todos os mecanismos de autenticación dispoñíbel (tentáronse: %s) " "(dispoñíbeis: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Falta de contido inesperada ao tentar ler un byte" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Os IDs de usuario deben ser os mesmos para o par e o servidor" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Cancelando mediante GDBusAuthObserver::authorize-authenticated-peer" @@ -625,13 +629,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Produciuse un erro ao crear o directorio %s: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operación non permitida" @@ -658,7 +662,7 @@ msgstr "" msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -"O segundo token da liña %d no anel de chaves en «%s» co contido «%s» está " +"O segundo token da liña %d no anel de chaves en «%s» co contido «%s» está " "malformado" #: gio/gdbusauthmechanismsha1.c:486 @@ -696,15 +700,15 @@ msgstr "Produciuse un erro ao abrir o anel de chaves «%s» para escribir: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Ademais, a liberación do bloqueo para «%s» tamén fallou: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "A conexión está pechado" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Tempo de espera máximo alcanzado" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -796,65 +800,80 @@ msgstr "Xa se exportou un subárbore para %s" msgid "Object does not exist at path “%s”" msgstr "O obxecto non existe na ruta «%s»" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s mensaxe: o campo de cabeceira %s non é válido; agardábase o valor do tipo " +"‘%s’" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "Mensaxe %s: falta o campo da cabeceira %s ou non é válido" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s mensaxe: o campo fornecido da cabeceira NON VÁLIDA" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"Mensaxe %s: o campo da cabeceira PATH está usando un valor reservado /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"Mensaxe %s: falta o campo da cabeceira INTERFACE non contén un nome de " +"interface válido" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Mensaxe %s: O campo da cabeceira INTERFACE está usando un valor reservado " +"org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"Mensaxe %s: falta o campo da cabeceira MEMBER non contén un nome de membro " +"válido" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"Mensaxe %s: falta o campo da cabeceira ERROR_NAME non contén un nome de erro " +"válido" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "o tipo é INVALID" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Mensaxe METHOD_CALL: falta o campo da cabeceira PATH ou MEMBER ou non é " -"válido" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Mensaxe METHOD_RETURN: falta o campo da cabeceira REPLY_SERIAL ou non é " -"válido" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Mensaxe ERROR: falta o campo da cabeceira REPLY_SERIAL ou ERROR_NAME ou non " -"é válido" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Mensaxe SIGNAL: falta o campo da cabeceira PATH, INTERFACE ou MEMBER ou non " -"é válido" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Mensaxe SIGNAL: o campo da cabeceira PATH está usando un valor reservado /" -"org/freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Mensaxe SIGNAL: O campo da cabeceira INTERFACE está usando un valor " -"reservado org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Quíxose ler %lu byte pero obtívose un %lu" msgstr[1] "Quixéronse ler %lu bytes pero obtívose un %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Esperábase un byte NUL despois da cadea «%s» pero atopouse o byte %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -864,21 +883,21 @@ msgstr "" "byte desvío %d (a lonxitude da cadea é %d). A cadea UTF-8 correcta até ese " "punto foi «%s»" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Valor aniñado demasiado profundo" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "O valor analizado «%s» non é unha ruta de obxecto D-Bus correcta" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "O valor analizado «%s» non é unha sinatura D-Bus correcta" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -891,7 +910,7 @@ msgstr[1] "" "Atopouse unha matriz cunha lonxitude de %u bytes. A lonxitude máxima é 2<<26 " "bytes (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -900,17 +919,17 @@ msgstr "" "Atopouse unha matriz de tipo «a%c», agardábase ter unha de lonxitude de " "varios %u bytes, aínda que se atopou unha de %u bytes" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Non se permiten as estruturas baleiras (tuplas) en D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" "O valor «%s» analizado para a variante non é unha sinatura de D-Bus correcta" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -918,7 +937,7 @@ msgstr "" "Produciuse un erro ao deserializar o GVariant co tipo cadea «%s» desde o " "formato ligado D-Bus" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -927,30 +946,30 @@ msgstr "" "Valor de «endianness» non válido. Esperábase 0x6c («|») ou 0x42 («B») pero " "atopouse 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" "A versión maior do protocolo non é válida. Esperábase 1 pero atopouse a %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Atopouse a cabeceira da sinatura pero non é do tipo sinatura" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Atopouse a cabeceira de sinatura coa sinatura «%s» máis o corpo da mensaxe " "está baleiro" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" "O valor analizado «%s» non é unha sinatura D-Bus correcta (para o corpo)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -961,11 +980,11 @@ msgstr[1] "" "Non hai unha cabeceira da sinatura na mensaxe pero o corpo da mensaxe ten %u " "bytes" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Non foi posíbel deserializar a mensaxe: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -973,7 +992,7 @@ msgstr "" "Produciuse un erro ao serializar o GVariant co tipo cadea «%s» desde o " "formato ligado D-Bus" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -981,18 +1000,18 @@ msgstr "" "O número de descritores de ficheiro no mensaxe (%d) difire do campo " "cabeceira (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Non foi posíbel serializar a mensaxe: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "O corpo da mensaxe ten a sinatura «%s» máis non está presente a cabeceira de " "sinatura" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -1001,19 +1020,19 @@ msgstr "" "O corpo da mensaxe ten a sinatura de tipo «%s» pero a sinatura no campo da " "cabeceira é «%s»" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "O corpo da mensaxe está baleiro máis a sinatura do campo da cabeceira é " "«(%s)»" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Produciuse un erro ao devolver co corpo de tipo «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Produciuse un erro ao devolver co corpo baleiro" @@ -1033,22 +1052,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Non é posíbel obter o perfil de hardware: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Non foi posíbel cargar %s ou %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Produciuse un erro ao chamar a StartServiceByName para %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Resposta %d non esperada desde o método StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1057,27 +1076,27 @@ msgstr "" "Non é posíbel invocar ao método; o proxy non ten dono para un nome coñecido " "%s e o proxy construíuse coa opción G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Non se admite un espazo de nomes abstracto" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "" "Non é posíbel especificar o ficheiro de uso de unha vez ao crear un servidor" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "" "Produciuse un erro ao escribir no ficheiro de uso de unha vez en «%s»: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "A cadea «%s» non é un GUID de D-BUS correcta" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Non é posíbel escoitar nun transporte «%s» non admitido" @@ -1368,74 +1387,75 @@ msgstr "Erro: %s non é un nome de bus válido e coñecido.\n" msgid "Not authorized to change debug settings" msgstr "Non está autorizado para cambiar as preferencias de depuración" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Sen nome" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "O ficheiro de escritorio non especificou o campo Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Non é posíbel atopar o terminal requirido pola aplicación" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Non se puido atopar o programa «%s» no $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "Non é posíbel crear o directorio de configuración da aplicación de usuario " "%s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "" "Non é posíbel crear o directorio de configuración MIME %s do usuario: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "A información da aplicación carece dun identificador" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Non é posíbel crear o ficheiro de escritorio %s do usuario" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Definición personalizada para %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "a unidade non implementa a expulsión" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "a unidade non implementa eject ou eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "a unidade non implementa a consulta para medios" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "a unidade non implementa o inicio" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "a unidade non implementa a detención" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "A infraestrutura de TLS non implementa a obtención da ligazón TLS" @@ -1448,30 +1468,30 @@ msgstr "A compatibilidade de TLS non está dispoñíbel" msgid "DTLS support is not available" msgstr "A compatibilidade de DTLS non está dispoñíbel" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Non é posíbel manipular a versión %d da codificación de GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "" "Número formado incorrectamente de tokens (%d) na codificación de GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Non é posíbel manipular a versión %d da codificación de GEmblemedicon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "" "Número formado incorrectamente de tokens (%d) na codificación de " "GEmblemedicon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Esperábase un GEmblem para o GEmblemedIcon" @@ -1479,130 +1499,135 @@ msgstr "Esperábase un GEmblem para o GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "O punto de montaxe contido non existe" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Non é posíbel copiar sobre o directorio" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Non é posíbel copiar un directorio sobre o directorio" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "O ficheiro de destino xa existe" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Non é posíbel copiar o directorio recursivamente" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Copiar rango de ficheiro non é compatíbel" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Produciuse un erro ao empalmar o ficheiro: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Non se admite a unión" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Copiar (reflink/clonar) entre montaxes non é compatíbel" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Copiar (reflink/clone) non é compatíbel ou non é válido" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Copiar (reflink/clone) non é compatíbel ou non funciona" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Non foi posíbel obter o atributo %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Non é posíbel copiar o ficheiro especial" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "O valor da ligazón simbólica dada non é válido" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2399 msgid "Symbolic links not supported" msgstr "As ligazóns simbólicas non se admiten" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "O Lixo non é compatíbel" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Os nomes de ficheiro non poden conter «%c»" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "" "Produciuse un erro ao crear o directorio temporal para o modelo «%s»: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "o volume non implementa o montado" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Non hai ningunha aplicación rexistrado para manexar este ficheiro" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "O enumerador está pechado" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "O enumerador do ficheiro ten unha operación excepcional" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "O enumerador do ficheiro xa está pechado" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Non é posíbel manipular a versión %d da codificación de GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Datos de entrada formados incorrectamente para o GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "O fluxo non permite query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Non se permite buscar no fluxo" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Non se permite truncar no fluxo de entrada" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Non se permite truncar no fluxo" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "O nome do host non é válido" @@ -1635,64 +1660,64 @@ msgstr "A resposta do proxy HTTP é demasiado grande" msgid "HTTP proxy server closed connection unexpectedly." msgstr "A conexión co servidor proxy HTTP pechouse de forma non esperada." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Número incorrecto de tokens (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Non hai un tipo para o nome de clase %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "O tipo %s non implementa unha interface GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "O tipo %s non ten unha clase" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Número de versión formado incorrectamente: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "O tipo %s non implementa from_tokens() na interface do GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Non é posíbel manipular a versión fornecida da codificación da icona" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Non se especificou ningún enderezo" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "A lonxitude %u é demasiado longa para un enderezo" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "O enderezo ten bits máis aló da lonxitude do prefixo" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Non foi posíbel analizar «%s» como unha máscara dun enderezo IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Non hai espazo abondo para o enderezo do socket" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Non se admite o enderezo do socket" @@ -1706,7 +1731,7 @@ msgstr "O fluxo de entrada non implementa a lectura" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "O fluxo ten unha operación excepcional" @@ -1722,7 +1747,7 @@ msgstr "Manter co ficheiro ao mover" msgid "“version” takes no arguments" msgstr "«version» non recolle argumentos" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Uso:" @@ -1730,79 +1755,79 @@ msgstr "Uso:" msgid "Print version information and exit." msgstr "Mostrar información da versión e saír." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Ordes:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Concatenar ficheiros á saída estándar" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Copiar un ou máis ficheiros" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Mostrar información sobre as localizacións" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Iniciar unha aplicación desde un ficheiro .desktop" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Lista os contidos das localizacións" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Obtén ou estabelece o xestor para o tipo mime" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Crear cartafoles" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Monitorizar cambios en ficheiros ou cartafoles" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Montar ou desmontar as localizacións" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Mover un ou máis ficheiros" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Abrir ficheiros con unha aplicación predeterminado" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Renomear un ficheiro" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Eliminar un ou máis ficheiros" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Ler da entrada en estándar e gardar" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Estabelecer un atributo de ficheiro" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Mover ficheiros ou directorios ao lixo" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lista os contidos da localización nunha árbore" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Ordes:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Use '%s help ORDE' para obter axuda detallada.\n" @@ -1812,7 +1837,7 @@ msgid "Error writing to stdout" msgstr "Produciuse un erro ao escribir ao stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1836,60 +1861,66 @@ msgstr "" "GIO no lugar de ficheiros locais: por exemplo, pode usar algo así como \n" "smb:////server/resource/file.txt como localización." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Non se forneceron localizacións" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Non hai un directorio obxectivo" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Mostrar progreso" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Preguntar antes de sobrescribir" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Manter todos os atributos" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Facer unha copia de respaldo para os ficheiros de destino" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Non mostrar nunha as ligazóns simbólicas" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Usar os permisos predeterminados para o destino" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" +"Usar as marcas de tempo de modificación do ficheiro predeterminada para o " +"destino" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Transferíronse %s de %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ORIXE" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "DESTINO" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Copia un ou máis ficheiros desde ORIXE a DESTINO." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1899,12 +1930,12 @@ msgstr "" "GIO no lugar de ficheiros locais: por exemplo, pode usar algo así como \n" "smb:////server/resource/file.txt como localización." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "O destino %s non é un cartafol" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: sobrescribir «%s»? " @@ -1945,52 +1976,52 @@ msgstr "nome en pantalla: %s\n" msgid "edit name: %s\n" msgstr "nome de edición: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "nome: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tipo: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "tamaño: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "oculto\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "ruta local: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "montaxe unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Atributos estabelecíbeis:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Espazos de nomes de atributo escribíbeis:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Mostrar información sobre as localizacións." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -3124,127 +3155,127 @@ msgstr "" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Non se atopa o punto de montaxe que contén o ficheiro %s" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Non é posíbel renomear o directorio raíz" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Produciuse un erro ao renomear o ficheiro %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Non é posíbel renomear o ficheiro, o ficheiro xa existe" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "O nome do ficheiro non é válido" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Produciuse un erro ao abrir o ficheiro %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Produciuse un erro ao eliminar o ficheiro %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Produciuse un erro ao mover ao lixo o ficheiro %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Non é posíbel crear o directorio do lixo %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "" "Non é posíbel atopar o directorio de nivel superior para mover ao lixo %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Enviar ao lixo en montaxes internos do sistema non se admite" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Non é posíbel atopar ou crear o directorio do lixo para %s ao lixo %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Non é posíbel crear a información de lixo para o ficheiro %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "Non é posíbel mover ao lixo o ficheiro %s a través dos límites do sistema de " "ficheiros" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Non é posíbel mover ao lixo o ficheiro %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Non é posíbel mover ao lixo o ficheiro %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Produciuse un erro ao crear o directorio %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "O sistema de ficheiros non é compatíbel coas ligazóns simbólicas" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Produciuse un erro ao crear a ligazón simbólica %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Produciuse un erro ao mover o ficheiro %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Non é posíbel mover o directorio sobre un directorio" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Fallou a creación do ficheiro de seguranza" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Produciuse un erro ao retirar o ficheiro obxectivo: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Non se permite mover entre puntos de montaxe" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Non foi posíbel determinar o uso de disco de %s: %s" @@ -3266,122 +3297,122 @@ msgstr "Nome estendido do atributo non válido" msgid "Error setting extended attribute “%s”: %s" msgstr "Produciuse un erro ao estabelecer o atributo estendido «%s»: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (codificación non válida)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Produciuse un erro ao obter a información do ficheiro «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Produciuse un erro ao obter información do descritor do ficheiro: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "O tipo de atributo non é válido (esperábase uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "O tipo de atributo non é válido (esperábase uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "O tipo de atributo non é válido (esperábase unha cadea de bytes)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Non foi posíbel estabelecer os permisos nas ligazóns simbólicas" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Produciuse un erro ao estabelecer os permisos: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Produciuse un erro ao estabelecer o propietario: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "a ligazón simbólica debe ser non nula" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Produciuse un erro ao estabelecer a ligazón simbólica: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "Produciuse un erro ao estabelecer a ligazón simbólica: o ficheiro non é unha " "ligazón" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" "Os nanosegundos %d adicionais en marcas de tempo UNIX %lld son negativas" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "Os nanosegundos %d adicionais en marcas de tempo UNIX %lld alcanzan 1 segundo" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "A marca de tempo UNIX %lld non colle nos 64 bits" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "A marca de tempo %lld está fóra do rango admitido por Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Non é posíbel converter o nome de ficheiro «%s» a UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Non é posíbel abrir o ficheiro «%s»: Erro de Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "Produciuse un erro ao estabelecer a data de modificación ou acceso para o " "ficheiro «%s»: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "" "Produciuse un erro ao modificar a configuración ou o tempo de acceso: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "O contexto SELinux debe ser non-NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux non está activado neste sistema" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Produciuse un erro ao estabelecer o contexto SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Non se permite estabelecer o atributo %s" @@ -3437,7 +3468,7 @@ msgid "Error truncating file: %s" msgstr "Produciuse un erro ao truncar o ficheiro: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Produciuse un erro ao abrir o ficheiro %s: %s" @@ -3459,27 +3490,27 @@ msgstr "O ficheiro foi modificado externamente" msgid "Error removing old file: %s" msgstr "Produciuse un erro ao retirar o ficheiro antigo: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Proporcionouse un GSeekType non válido" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Petición de busca non válida" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Non é posíbel truncar GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "O fluxo de saída da memoria non é redimensionábel" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Produciuse un erro ao redimensionar o fluxo de saída da memoria" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3487,73 +3518,73 @@ msgstr "" "A cantidade de memoria requirida para procesar a escrita é máis grande que o " "espazo de enderezos dispoñíbel" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Solicitouse unha busca antes do inicio do fluxo" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Solicitouse unha busca máis aló do final do fluxo" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "montaxe non implementa «desmontaxe»" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "mount non implementa «extraer»" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "a montaxe non implementa o «unmount» ou a «unmount_with_operation»" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "a montaxe non implementa a «eject» ou a \"eject_with_operation\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "a montaxe non implementa \"remount\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "a montaxe non implementa o descubrimento do tipo de contido" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "a montaxe non implementa o descubrimento síncrono do tipo de contido" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "O nome do host «%s» contén «[» mais non «]»" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "A rede non é atinxíbel" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Equipo non atinxíbel" @@ -3581,7 +3612,7 @@ msgstr "NetworkManager non está executándose" msgid "NetworkManager version too old" msgstr "A versión NetworkManager é demasiado antiga" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "O fluxo de saída non implementa a escritura" @@ -3594,38 +3625,38 @@ msgstr "A suma de vectores pasados a %s é demasiado longa" msgid "Source stream is already closed" msgstr "O fluxo de orixe xa está pechado" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Fallor por proxi de busca non especificado" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Produciuse un erro ao resolver «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s non implementado" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Dominio non válido" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Non existe o recurso en «%s»" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Produciuse un erro ao descomprimir o recurso en «%s»" @@ -3643,11 +3674,11 @@ msgstr "O recurso en «%s» non é un cartafol" msgid "Input stream doesn’t implement seek" msgstr "O fluxo de entrada non implementa seek" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Lista as seccións que conteñen recursos nun ficheiro elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3657,15 +3688,15 @@ msgstr "" "Se se fornece SECCIÓN, só se listarán os recursos desta sección\n" "Se se fornece RUTA, só se listarán os recursos que coincidan" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FICHEIRO [RUTA]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECCIÓN" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3677,15 +3708,15 @@ msgstr "" "Se se fornece RUTA, só se listarán os recursos que coincidan\n" "Os detalles inclúen a sección, tamaño e compresión" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extraer un ficheiro de recurso a stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FICHEIRO RUTA" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3713,7 +3744,7 @@ msgstr "" "Use 'gresource help ORDE' para obter axuda detallada.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3728,20 +3759,20 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SECCIÓN Un nome de sección elf (opcional)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " ORDE A orde que explicar (opcional)\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" " FICHEIRO Un ficheiro elf (un binario ou biblioteca compartida)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3749,19 +3780,19 @@ msgstr "" " FICHEIRO Un ficheiro elf (un binario ou unha biblioteca compartida)\n" " ou un ficheiro de recurso compilado\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[RUTA]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " RUTA Unha ruta (optional) de recurso (pode ser parcial)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "CAMIÑO" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " RUTA Unha ruta dun recurso\n" @@ -3994,219 +4025,219 @@ msgstr "Forneceuse un nome de esquema baleiro\n" msgid "No such key “%s”\n" msgstr "Non existe a clave «%s»\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "O socket non é válido, non se inicializou" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "O socket non é válido, a inicialización fallou debido a: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "O fluxo de orixe xa está pechado" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Tempo de espera do Socket de E/S superado" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "creando o GSocket a partir de fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Non é posíbel crear o socket: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Especificouse unha familia descoñecida" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Especificouse un protocolo descoñecido" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "Non é posíbel usar as operacións de datagramas nun socket que non é de " "datagramas." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Non é posíbel usar operacións de datagramas nun socket con un tempo de " "espera máximo estabelecido." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "non foi posíbel obter un enderezo local: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "non foi posíbel obter un enderezo remoto: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "non foi posíbel escoitar: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Produciuse un erro ao ligar co enderezo %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Produciuse un erro ao unirse ao grupo multicast: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Produciuse un erro ao deixar o grupo multicast: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Non se admite o multicast específico da fonte" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Familia de socket non admitida" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "o source-specific non é un enderezo IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Nome da interface demasiado larga" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interface non atopada: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Non se admite o multicast IPv4 específico da fonte" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Non se admite o multicast IPv6 específico da fonte" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Produciuse un erro ao aceptar a conexión: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Conexión en marcha" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Non é posíbel obter o erro pendente: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Produciuse un erro ao recibir datos: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Produciuse un erro ao enviar datos: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Non é posíbel desconectar o socket: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Produciuse un erro ao pechar o socket: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Agardando pola situación do socket: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Non foi posíbel enviar a mensaxe: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Os vectores de mensaxes son moi largos" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Produciuse un erro ao enviar a mensaxe: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "O GSocketControlMessage non está permitido en Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Produciuse un erro ao recibir a mensaxe: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Non é posíbel ler as credenciais do socket: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "" "g_socket_get_credentials non está implementado para este sistema operativo" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Non foi posíbel conectarse ao servidor proxy %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Non foi posíbel conectar a %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Non foi posíbel conectar: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "Non se permite a conexión ao proxy mediante unha conexión que non sexa TCP." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Non é posíbel usar o proxy co protocolo «%s»." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "O porto de escoita xa está pechado" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "O socket engadido está pechado" @@ -4300,97 +4331,97 @@ msgstr "O proxy SOCKSv5 non é compatíbel co tipo de enderezo fornecido." msgid "Unknown SOCKSv5 proxy error." msgstr "Erro no proxy SOCKSv5 descoñecido." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Produciuse un erro ao crear a canalización para comunicarse co proceso fillo " "(%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "As tuberías non están soportadas nesta plataforma" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Non é posíbel manipular a versión %d da codificación de GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Non se atopou ningún enderezo válido" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Produciuse un erro ao resolver inversamente «%s»: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "" "Produciuse un erro ao analizar o rexistro de DNS %s: paquete DNS mal formado" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Non hai un rexistro de DNS do tipo solicitado para «%s»" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Non é posíbel resolver temporalmente «%s»" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Produciuse un erro ao resolver «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Paquete DNS mal formado" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Produciuse un erro ao analizar a resposta DNS para «%s»: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Non se atopou ningún certificado PEM codificado" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Non foi posíbel descifrar a chave privada codificada con PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Non foi posíbel analizar a chave privada PEM codificada" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Non se atopou ningún certificado PEM codificado" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Non foi posíbel analizar o certificado PEM codificado" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "O backend TLS actual non é admite PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Este GTlsBackend non admite a creación de certificados PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4400,7 +4431,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4408,139 +4439,151 @@ msgstr "" "Escribiu varias veces o contrasinal incorrecto, se falla de novo bloquearase " "o acceso." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "O contrasinal introducido é incorrecto." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Non se permite enviar o FD" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Esperando 1 mensaxe de control, obtívose %d" msgstr[1] "Esperando 1 mensaxe de control, obtivéronse %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Tipo de datos subsidiarios inesperados" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Esperando un descritor de ficheiro (fd), pero obtívose %d\n" msgstr[1] "Esperando un descritor de ficheiro (fd), pero obtivéronse %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Recibiuse un descritor de ficheiro (fd) incorrecto" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Non se permite a recepción de FD" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Produciuse un erro ao enviar as credenciais: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" "Produciuse un erro ao comprobar se SO_PASSCRED está activado para o socket: " "%s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Produciuse un erro ao activar SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Esperábase ler un só byte para recibir as credenciais pero léronse creo bytes" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Non se esperaba unha mensaxe de control, pero obtívose %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Produciuse un erro ao desactivar SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Produciuse un erro ao ler do descritor do ficheiro: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Produciuse un erro ao pechar o descritor do ficheiro: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Raíz do sistema de ficheiros" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Produciuse un erro ao escribir no descritor do ficheiro: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" "Neste sistema non se permiten enderezos de socket de dominios UNIX abstractos" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "o volume non implementa a expulsión" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "o volume non implementa a «eject» ou «eject_with_operation»" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "A aplicación «%s» no obxecto de aplicación non ten verbos" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"A aplicación «%s» e o xestor «%s» no obxecto de aplicación non ten verbos" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Produciuse un erro ao ler do manexador: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Produciuse un erro ao pechar o manexador: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Produciuse un erro ao escribir no manexador: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Sen memoria dabondo" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Erro interno: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Necesítase máis entrada" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Datos comprimidos incorrectos" @@ -4568,152 +4611,152 @@ msgstr "Executar servizo dbus" msgid "Wrong args\n" msgstr "Argumentos incorrectos\n" -#: glib/gbookmarkfile.c:861 +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Atributo «%s» inesperado para o elemento «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Non se atopou o atributo «%s» do elemento «%s»" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Etiqueta «%s» inesperada, esperábase a etiqueta «%s»" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Etiqueta «%s» inesperada dentro de «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Data/Hora «%s» non válida no ficheiro de marcador" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "" "Non foi posíbel atopar un ficheiro de marcadores válido nos directorios de " "datos" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Xa existe un marcador para o URI «%s»" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Non se atopou ningún marcador para o URI «%s»" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Non hai ningún tipo MIME definido no marcador para o URI «%s»" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Non se definiu ningún parámetro privado no marcador para o URI «%s»" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Non existe ningún grupo definido no marcador para o URI «%s»" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Ningunha aplicación denominada «%s» rexistrou un marcador para «%s»" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Produciuse un erro ao expandir a liña executábel «%s» co URI «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Carácter non representábel na entrada da conversión" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Hai unha secuencia de carácter parcial ao final da entrada" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "" "Non é posíbel converter o modo de emerxencia «%s» na codificación de " "caracteres «%s»" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Byte NUL incrustado na entrada de conversión" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Byte NUL incrustado na saída de conversión" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "O URI «%s» non é un URI absoluto usando o esquema «file»" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "O URI «%s» non é válido" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "O nome de host do URI «%s» non é válido" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "O URI «%s» contén caracteres de escape non válidos" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "O nome da ruta «%s» non é un camiño absoluto" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %H:%M:%S, %e de %B de %Y" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4734,62 +4777,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Xaneiro" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Febreiro" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Marzo" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Abril" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Maio" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Xuño" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Xullo" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Agosto" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Setembro" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Outubro" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Novembro" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Decembro" @@ -4811,132 +4854,132 @@ msgstr "Decembro" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Xan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Abr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Maio" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Xuño" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Xul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Ago" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Out" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Luns" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Martes" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Mércores" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Xoves" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Venres" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Sábado" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Domingo" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Lun" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Mar" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Mer" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Xov" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Ven" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Sáb" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Dom" @@ -4958,62 +5001,62 @@ msgstr "Dom" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Xaneiro" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Febreiro" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Marzo" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "Abril" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Maio" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Xuño" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Xullo" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Agosto" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "Setembro" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Outubro" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "Novembro" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Decembro" @@ -5035,196 +5078,200 @@ msgstr "Decembro" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Xan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Abr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "Mai" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Xuñ" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Xul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Ago" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Out" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Dec" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Produciuse un erro ao abrir o directorio «%s»: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Non foi posíbel asignar %lu byte para ler o ficheiro «%s»" -msgstr[1] "Non foi posíbel asignar %lu bytes para ler o ficheiro «%s»" +#: glib/gfileutils.c:716 glib/gfileutils.c:820 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Non foi posíbel reservar %" +msgstr[1] "Non foi posíbel reservar %" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:733 #, c-format msgid "Error reading file “%s”: %s" msgstr "Produciuse un erro ao ler o ficheiro «%s»: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:769 glib/gfileutils.c:803 #, c-format msgid "File “%s” is too large" msgstr "O ficheiro «%s» é demasiado grande" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:845 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Produciuse un erro ao ler desde o ficheiro «%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:895 glib/gfileutils.c:970 glib/gfileutils.c:1477 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Produciuse un erro ao abrir o ficheiro «%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:908 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" "Produciuse un erro ao obter os atributos do ficheiro «%s»: fstat() fallou: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:939 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Produciuse un erro ao abrir o ficheiro «%s»: fdopen() fallou: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1040 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "Produciuse un erro ao renomear o ficheiro «%s» como «%s»: g_rename() fallou: " "%s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1139 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Produciuse un erro ao escribir o ficheiro «%s»: ftruncate() fallou: %s" + +#: glib/gfileutils.c:1184 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Produciuse un erro ao escribir o ficheiro «%s»: write() fallou: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1205 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Produciuse un erro ao escribir o ficheiro «%s»: fsync() fallou: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1366 glib/gfileutils.c:1783 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Produciuse un erro ao crear o ficheiro «%s»: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1411 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" "Non foi posíbel retirar o ficheiro existente «%s»: g_unlink() fallou: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1748 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "O modelo «%s» non é válido, non debería conter «%s»" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1761 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "O modelo «%s» non contén XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2355 glib/gfileutils.c:2384 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Produciuse un erro ao ler a ligazón simbólica «%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Non foi posíbel abrir o conversor de «%s» a «%s»: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Non é posíbel facer unha lectura en bruto en g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Datos restantes non convertidos no búfer de lectura" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "O canal termina nun carácter parcial" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Non é posíbel facer unha lectura en bruto en g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "" "Non é posíbel atopar un ficheiro de clave correcto nos directorios de busca" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Non é un ficheiro normal" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5232,43 +5279,43 @@ msgstr "" "O ficheiro clave contén a liña «%s» que non é un par valor-clave, grupo ou " "comentario" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Nome de grupo non válido: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "O ficheiro clave non comeza cun grupo" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Nome de chave non válido: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "O ficheiro clave contén unha codificación non permitida «%s»" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "O ficheiro clave non ten un grupo «%s»" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "O ficheiro clave non ten a clave «%s» no grupo «%s»" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "O ficheiro clave contén a clave «%s» co valor «%s» que non é UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." @@ -5276,7 +5323,7 @@ msgstr "" "O ficheiro clave contén a clave «%s» que ten un valor que non é posíbel " "interpretar." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5285,36 +5332,36 @@ msgstr "" "O ficheiro clave contén a clave «%s» no grupo «%s» que ten un valor que non " "é posíbel interpretar." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "A clave «%s» do grupo «%s» ten o valor «%s», pero agardábase %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "O ficheiro clave contén un carácter de escape ao final da liña" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "O ficheiro clave contén a secuencia de escape non válida «%s»" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Non é posíbel interpretar o valor «%s» como un número." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "O valor enteiro «%s» está fóra do intervalo" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Non é posíbel interpretar o valor «%s» como un número flotante." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Non é posíbel interpretar o valor «%s» como un booleano." @@ -5336,32 +5383,32 @@ msgstr "Produciuse un erro ao mapear «%s%s%s%s»: mmap() fallou: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Produciuse un erro ao abrir o ficheiro «%s»: open() fallou: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Erro na liña %d carácter %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "O texto do nome codificado en UTF-8 non é válido - «%s» non válido" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "«%s» non é un nome válido" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "«%s» non é un nome válido: '%c'" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Erro na liña %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5371,7 +5418,7 @@ msgstr "" "dunha referencia de carácter (por exemplo ê) - pode que o díxito sexa " "grande de máis" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5381,24 +5428,24 @@ msgstr "" "utilizou un carácter & sen intención de comezar unha entidade - escape o & " "como &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "A referencia de carácter «%-.*s» non codifica un carácter permitido" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Detectada unha entidade baleira «&;»; as entidades válidas son: & " " "< > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Non se coñece o nome de entidade «%-.*s»" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5406,11 +5453,11 @@ msgstr "" "A entidade non remata cun punto e coma, probabelmente usou o carácter & sen " "a intención de comezar unha entidade, escriba o & como &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "O documento debe comezar cun elemento (por exemplo )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5419,7 +5466,7 @@ msgstr "" "«%s» non é un carácter válido despois dun carácter «<»; non pode iniciar un " "nome de elemento" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5428,12 +5475,12 @@ msgstr "" "Carácter estraño «%s», esperábase un carácter «>» para pechar a etiqueta de " "elemento baleiro «%s»" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Hai demasiados atributos no elemento «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5441,7 +5488,7 @@ msgstr "" "Carácter estraño «%s», esperábase un «=» despois do nome do atributo «%s» do " "elemento «%s»" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5452,7 +5499,7 @@ msgstr "" "etiqueta de comezo do elemento «%s» ou opcionalmente un atributo; quizais " "usou un carácter non válido no nome dun atributo" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5461,7 +5508,7 @@ msgstr "" "Carácter estraño «%s», esperábase unhas comiñas de apertura despois do signo " "igual para dar un valor ao atributo «%s» do elemento «%s»" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “»" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Pechouse o elemento «%s», actualmente non hai ningún elemento aberto" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Pechouse o elemento «%s», mais o elemento aberto actualmente é «%s»" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "O documento estaba baleiro ou só contiña espazos en branco" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "O documento rematou inesperadamente despois dun símbolo menor que «<»" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5506,7 +5553,7 @@ msgstr "" "O documento rematou inesperadamente con elementos aínda abertos - «%s» foi o " "último elemento aberto" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5515,21 +5562,21 @@ msgstr "" "O documento rematou inesperadamente, esperábase ver un símbolo maior que '>' " "que pechase a etiqueta <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "O documento rematou inesperadamente dentro dun nome de elemento" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "O documento rematou inesperadamente dentro dun nome de atributo" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "" "O documento rematou inesperadamente dentro dunha etiqueta de comezo de " "elemento." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5537,265 +5584,265 @@ msgstr "" "O documento rematou inesperadamente despois do signo igual que segue a un " "nome de atributo; non hai valor de atributo" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "O documento rematou inesperadamente dentro dun valor de atributo" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" "O documento rematou inesperadamente dentro da etiqueta que pechaba o " "elemento «%s»" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "O documento rematou inesperadamente dentro da etiqueta que pechaba o " "elemento «%s»" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "O documento rematou inesperadamente dentro dun comentario ou instrución de " "procesamento" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPCIÓN…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Opcións de axuda:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Mostrar as opcións de axuda" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Mostrar todas as opcións de axuda" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Opcións da aplicación:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Opcións:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Non é posíbel analizar o valor enteiro «%s» para %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "O valor enteiro «%s» para %s está fóra do intervalo" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Non é posíbel analizar o valor \"double\" «%s» para %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "O valor \"double\" «%s» para %s está fóra do intervalo" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Produciuse un erro ao analizar a opción %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Argumento que falta para %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Opción %s descoñecida" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "obxecto danado" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "sen memoria" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "erro interno" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "o patrón contén elementos non permitidos na coincidencia parcial" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "as referencias anteriores como condicións non se permiten na coincidencia " "parcial" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "atinxiuse o límite de recursividade" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "desprazamento erróneo" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "bucle de repetición" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "o modo coincidente solicítase como se non fora compilado por JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "erro descoñecido" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ ao final do patrón" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c ao final do patrón" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "carácter non recoñecido despois de \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "números fóra do intervalo no cuantificador {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "número demasiado grande no cuantificador {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "falta a terminación ] para a clase de carácter" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "secuencia de escape non válida na clase de carácter" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "intervalo fóra de orde na clase de carácter" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nada que repetir" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "carácter non recoñecido despois de (? ou (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "As clases de nomes POSIX só se permiten dentro dunha clase" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "Os elementos de colación POSIX non se admiten" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "falta o ) de terminación" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "referencia a un subpatrón non existente" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "falta un ) despois do comentario" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "a expresión regular é demasiado longa" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "número ou nome formado incorrectamente despois de (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "a aserción lockbehind non ten unha lonxitude fixa" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "o grupo condicional contén máis de dúas ramas" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "esperábase unha aserción despois de (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "unha referencia co número non pode ser cero" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nome de clase POSIX descoñecida" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "o valor do carácter na secuencia \\x{...} é demasiado longo" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "non se permite \\C en asercións lookbehind" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "falta a terminación no nome do subpatrón" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dous subpatróns teñen o mesmo nome" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "secuencia \\P ou \\p formada incorrectamente" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "nome de propiedade descoñecido despois de \\P ou \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "o nome do subpatrón é demasiado longo (máximo 32 caracteres)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "demasiados subpatróns con nome (máximo 10.000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "o valor octal é maior que \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "O grupo DEFINE contén máis dunha rama" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "opcións NEWLINE inconsistentes" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5803,244 +5850,244 @@ msgstr "" "\\g non está seguido por un nome entre chaves, corchetes angulares ou un " "número entre comiñas, ou por un número simple" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "non se permite un argumento para (*ACCEPT), (*FAIL), ou (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) no recoñecido" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "o número é demasiado grande" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "falta o nome do subpatrón despois de (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "non se permiten diferentes nomes para subpatróns do mesmo número" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) debe ter un argumento" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c debe estar seguido dun carácter ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k non está seguido por un nome entre chaves, corchetes angulares ou entre " "comiñas" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "non se permite \\N nunha clase" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "o nome é demasiado longo en (*MARK), (*PRUNE), (*SKIP), ou (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "desbordamento de código" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "carácter non recoñecido despois de (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "desbordouse o espazo de traballo de compilación" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "non se atopou o subpatrón referenciado comprobado previamente" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "" "Produciuse un erro ao estabelecer a equivalencia da expresión regular %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "A biblioteca PCRE está compilada sen compatibilidade con UTF8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "A biblioteca PCRE está compilada con opcións non compatíbeis" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "Produciuse un erro ao compilar a expresión regular «%s» no carácter %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "esperábase un díxito hexadecimal ou '}'" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "esperábase un díxito hexadecimal" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "falta «<» na referencia simbólica" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "referencia simbólica sen finalizar" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "referencia simbólica de lonxitude cero" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "esperábase un díxito" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "referencia simbólica ilegal" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "«\\» final perdido" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "secuencia de escape descoñecida" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "Produciuse un erro ao analizar o texto de substitución «%s» no carácter %lu: " "%s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "O texto citado non comeza con comiñas" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Comiñas non pechadas na liña de ordes ou noutro texto citado nun intérprete " "de ordes" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "O texto rematou despois dun carácter «\\». (O texto era «%s»)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "O texto rematou antes de atopar a comiña final para %c. (O texto era «%s»)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "O texto estaba baleiro (ou só contiña espazos en branco)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Produciuse un erro ao ler datos desde un proceso fillo (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Produciuse un erro ao ler os datos dun proceso fillo (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Erro inesperado en waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "O proceso fillo rematou co código %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "O proceso fillo rematou polo sinal %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "O proceso fillo detívose polo sinal %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "O proceso fillo rematou de forma anormal" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Produciuse un erro ao ler desde a canalización filla (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Produciuse un erro ao executar o proceso fillo «%s» (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Produciuse un erro ao facer fork (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Produciuse un erro ao cambiar ao directorio «%s» (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Produciuse un erro ao executar o proceso fillo «%s» (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "" "Produciuse un erro ao abrir o ficheiro para remapear o descritor de ficheiro " "(%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "" "Produciuse un erro ao duplicar o descritor de ficheiro para o proceso fillo " "(%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Produciuse un erro ao facer fork ao proceso fillo (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "" "Produciuse un erro ao pechar o descritor de ficheiro para o proceso fillo " "(%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Produciuse un erro descoñecido ao executar o proceso fillo «%s»" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -6098,78 +6145,78 @@ msgstr "" "Erro inesperado en g_io_channel_win32_poll() ao ler datos desde un proceso " "fillo" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "A cadea baleira non é un número" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» non é un número con signo" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "O número «%s» está fóra de rango [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» non é un número sen signo" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "%-encoding non válida na URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Carácter ilegal na URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Caracteres non UTF-8 na URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Enderezo IPv6 non válido «%.*s» na URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Enderezo IP codificado ilegal «%.*s» na URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nome de equipo internacionalizado ilegal «%.*s» na URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Non foi posíbel analizar «%.*s» como unha URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "O porto «%.*s» na URI está fóra do intervalo" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "A URI «%s» non é unha URI absoluta" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "A URI «%s» non ten o compoñente de equipo" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "A URI non é absoluta, e non se forneceu unha URI base" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Falta «=» e o valor de parámetro" @@ -6250,65 +6297,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6413,5 +6460,53 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Mensaxe METHOD_RETURN: falta o campo da cabeceira REPLY_SERIAL ou non é " +#~ "válido" + +#, c-format +#~ msgid "Could not allocate %lu byte to read file “%s”" +#~ msgid_plural "Could not allocate %lu bytes to read file “%s”" +#~ msgstr[0] "Non foi posíbel asignar %lu byte para ler o ficheiro «%s»" +#~ msgstr[1] "Non foi posíbel asignar %lu bytes para ler o ficheiro «%s»" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "backtracking limit reached" #~ msgstr "alcanzouse o límite de \"backtracking\"" diff --git a/po/he.po b/po/he.po index 37c0d5d..0669fe4 100644 --- a/po/he.po +++ b/po/he.po @@ -13,18 +13,18 @@ msgid "" msgstr "" "Project-Id-Version: glib.HEAD.he\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-02 13:39+0000\n" -"PO-Revision-Date: 2023-09-02 21:02+0300\n" -"Last-Translator: Yosef Or Boczko \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-03 00:01+0200\n" +"Last-Translator: Yaron Shahrabani \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " -"2 : 3)\n" -"X-Generator: Gtranslator 42.0\n" +"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? 2 : " +"3);\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -44,36 +44,40 @@ msgstr "Failed to find default application for content type ‘%s’" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Failed to find default application for URI Scheme ‘%s’" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" -msgstr "GApplication Options:" +msgstr "אפשרויות GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "הצגת אפשרויות GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Enter GApplication service mode (use from D-Bus service files)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Override the application’s ID" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "הצגת גרסת היישום" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "החלפת העותק הפעיל" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "הצגת העזרה" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[COMMAND]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "הצגת הגרסה" @@ -126,7 +130,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "COMMAND" @@ -138,9 +142,13 @@ msgstr "The command to print detailed help for" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Application identifier in D-Bus format (eg: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FILE" @@ -164,26 +172,24 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Optional parameter to the action invocation, in GVariant format" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 -#: gio/gsettings-tool.c:678 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 gio/gsettings-tool.c:678 #, c-format msgid "" "Unknown command %s\n" "\n" msgstr "" -"Unknown command %s\n" +"פקודה לא ידועה %s\n" "\n" #: gio/gapplication-tool.c:105 msgid "Usage:\n" msgstr "שימוש:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 -#: gio/gsettings-tool.c:713 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "ארגומנטים:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGS…]" @@ -276,128 +282,128 @@ msgstr "" "unrecognised command: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Too large count value passed to %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Seek not supported on base stream" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Cannot truncate GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Stream is already closed" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Truncate not supported on base stream" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operation was cancelled" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Invalid object, not initialized" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Incomplete multibyte sequence in input" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Not enough space in destination" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Invalid byte sequence in conversion input" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Error during conversion: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Cancellable initialization not supported" # *** This file should not be translated to hebrew, please only copy the english text *** # *** Old hebrew ranslation is commented for backup sake *** -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Conversion from character set “%s” to “%s” is not supported" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Could not open converter from “%s” to “%s”" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s type" #: gio/gcontenttype-win32.c:198 msgid "Unknown type" -msgstr "Unknown type" +msgstr "סוג לא ידוע" #: gio/gcontenttype-win32.c:200 #, c-format msgid "%s filetype" msgstr "%s filetype" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" -msgstr "GCredentials contains invalid data" +msgstr "GCredentials מכיל נתונים שגויים" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" -msgstr "GCredentials is not implemented on this OS" +msgstr "GCredentials לא ממומש במערכת ההפעלה הזאת" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" -msgstr "There is no GCredentials support for your platform" +msgstr "אין תמיכה ב־GCredentials לפלטפורמה שלך" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" -msgstr "GCredentials does not contain a process ID on this OS" +msgstr "GCredentials לא מכיל מזהה תהליך במערכת ההפעלה הזאת" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Credentials spoofing is not possible on this OS" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Unexpected early end-of-stream" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Unsupported key “%s” in address entry “%s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Meaningless key/value pair combination in address entry “%s”" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -406,28 +412,28 @@ msgstr "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Error in address “%s” — the “%s” attribute is malformed" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Unknown or unsupported transport “%s” for address “%s”" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Address element “%s” does not contain a colon (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transport name in address element “%s” must not be empty" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -436,14 +442,14 @@ msgstr "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -452,7 +458,7 @@ msgstr "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -461,75 +467,74 @@ msgstr "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Error in address “%s” — the host attribute is missing or malformed" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Error in address “%s” — the port attribute is missing or malformed" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" -msgstr "" -"Error in address “%s” — the noncefile attribute is missing or malformed" +msgstr "Error in address “%s” — the noncefile attribute is missing or malformed" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Error auto-launching: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Error opening nonce file “%s”: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Error reading from nonce file “%s”: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Error reading from nonce file “%s”, expected 16 bytes, got %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Error writing contents of nonce file “%s” to stream:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "The given address is empty" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "לא ניתן לפצל אפיק הודעה כש־AT_SECURE מוגדר" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Cannot spawn a message bus without a machine-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Cannot autolaunch D-Bus without X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Error spawning command line “%s”: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Cannot determine session bus address (not implemented for this OS)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -538,7 +543,7 @@ msgstr "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -546,35 +551,35 @@ msgstr "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "סוג אפיק לא ידוע %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Unexpected lack of content trying to read a line" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Unexpected lack of content trying to (safely) read a line" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "העדר הקשר בלתי צפוי בניסיון לקרוא בית" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "מזהי המשתמשים חייבים להיות זהים לעמית ולשרת" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" @@ -585,8 +590,7 @@ msgstr "Error when getting information for directory “%s”: %s" #: gio/gdbusauthmechanismsha1.c:322 #, c-format -msgid "" -"Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" +msgid "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" msgstr "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -595,13 +599,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Error creating directory “%s”: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operation not supported" @@ -664,41 +668,39 @@ msgstr "Error opening keyring “%s” for writing: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Additionally, releasing the lock for “%s” also failed: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "The connection is closed" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Timeout was reached" -#: gio/gdbusconnection.c:2538 -msgid "" -"Unsupported flags encountered when constructing a client-side connection" +#: gio/gdbusconnection.c:2515 +msgid "Unsupported flags encountered when constructing a client-side connection" msgstr "" "Unsupported flags encountered when constructing a client-side connection" #: gio/gdbusconnection.c:4277 gio/gdbusconnection.c:4631 #, c-format -msgid "" -"No such interface “org.freedesktop.DBus.Properties” on object at path %s" +msgid "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" #: gio/gdbusconnection.c:4422 #, c-format msgid "No such property “%s”" -msgstr "No such property “%s”" +msgstr "אין מאפיין כזה „%s”" #: gio/gdbusconnection.c:4434 #, c-format msgid "Property “%s” is not readable" -msgstr "Property “%s” is not readable" +msgstr "המאפיין „%s” לא זמין לקריאה" #: gio/gdbusconnection.c:4445 #, c-format msgid "Property “%s” is not writable" -msgstr "Property “%s” is not writable" +msgstr "המאפיין „%s” לא זמין לכתיבה" #: gio/gdbusconnection.c:4465 #, c-format @@ -709,7 +711,7 @@ msgstr "Error setting property “%s”: Expected type “%s” but got “%s” #: gio/gdbusconnection.c:6762 #, c-format msgid "No such interface “%s”" -msgstr "No such interface “%s”" +msgstr "אין כזה מנשק „%s”" #: gio/gdbusconnection.c:5001 gio/gdbusconnection.c:7279 #, c-format @@ -719,7 +721,7 @@ msgstr "No such interface “%s” on object at path %s" #: gio/gdbusconnection.c:5102 #, c-format msgid "No such method “%s”" -msgstr "No such method “%s”" +msgstr "אין כזאת מתודה „%s”" #: gio/gdbusconnection.c:5133 #, c-format @@ -734,12 +736,12 @@ msgstr "An object is already exported for the interface %s at %s" #: gio/gdbusconnection.c:5563 #, c-format msgid "Unable to retrieve property %s.%s" -msgstr "Unable to retrieve property %s.%s" +msgstr "לא ניתן למשוך את המאפיין %s.%s" #: gio/gdbusconnection.c:5619 #, c-format msgid "Unable to set property %s.%s" -msgstr "Unable to set property %s.%s" +msgstr "לא ניתן להגדיר את המאפיין %s.%s" #: gio/gdbusconnection.c:5798 #, c-format @@ -761,47 +763,57 @@ msgstr "A subtree is already exported for %s" msgid "Object does not exist at path “%s”" msgstr "Object does not exist at path “%s”" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "הודעת %s:‏ %s שדה הכותרת שגוי, אמור להיות ערך מסוג ‚%s’" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "הודעת %s: שדה הכותרת %s חסר או שגוי" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "הודעת %s: סופק שדה כותרת שגוי" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "הודעת %s: שדה הכותרת PATH משתמש בערך השגוי ‎/org/freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "הודעת %s: שדה הכותרת INTERFACE לא מכיל שם מנשק תקני" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"הודעת %s: שדה הכותרת INTERFACE משתמש בערך השגוי org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "הודעת %s: שדה הכותרת MEMBER לא מכיל שם חבר תקני" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "הודעת %s: שדה הכותרת ERROR_NAME לא מכיל שם שגיאה תקני" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "הסוג שגוי" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -810,35 +822,35 @@ msgstr[1] "‫Wanted to read %lu bytes but only got %lu" msgstr[2] "‫Wanted to read %lu bytes but only got %lu" msgstr[3] "‫Wanted to read %lu bytes but only got %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Expected NUL byte after the string “%s” but found byte %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" -"Expected valid UTF-8 string but found invalid bytes at byte offset %d " -"(length of string is %d). The valid UTF-8 string up until that point was “%s”" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d (length " +"of string is %d). The valid UTF-8 string up until that point was “%s”" msgstr "" -"Expected valid UTF-8 string but found invalid bytes at byte offset %d " -"(length of string is %d). The valid UTF-8 string up until that point was “%s”" +"Expected valid UTF-8 string but found invalid bytes at byte offset %d (length " +"of string is %d). The valid UTF-8 string up until that point was “%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Value nested too deeply" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Parsed value “%s” is not a valid D-Bus object path" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Parsed value “%s” is not a valid D-Bus signature" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -853,7 +865,7 @@ msgstr[2] "" msgstr[3] "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -862,23 +874,23 @@ msgstr "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Empty structures (tuples) are not allowed in D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Parsed value “%s” for variant is not a valid D-Bus signature" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -887,26 +899,26 @@ msgstr "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Invalid major protocol version. Expected 1 but found %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Signature header found but is not of type signature" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Signature header with signature “%s” found but message body is empty" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Parsed value “%s” is not a valid D-Bus signature (for body)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -915,53 +927,51 @@ msgstr[1] "‫No signature header in message but the message body is %u bytes" msgstr[2] "‫No signature header in message but the message body is %u byte" msgstr[3] "‫No signature header in message but the message body is %u byte" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Cannot deserialize message: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Number of file descriptors in message (%d) differs from header field (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Cannot serialize message: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Message body has signature “%s” but there is no signature header" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" -"Message body has type signature “%s” but signature in the header field is " -"“%s”" +"Message body has type signature “%s” but signature in the header field is “%s”" msgstr "" -"Message body has type signature “%s” but signature in the header field is " -"“%s”" +"Message body has type signature “%s” but signature in the header field is “%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Message body is empty but signature in the header field is “(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Error return with body of type “%s”" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Error return with empty body" @@ -981,22 +991,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Unable to get Hardware profile: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Unable to load %s or %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Error calling StartServiceByName for %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Unexpected reply %d from StartServiceByName(\"%s\") method" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1005,25 +1015,25 @@ msgstr "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " "and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstract namespace not supported" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Cannot specify nonce file when creating a server" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Error writing nonce file at “%s”: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "The string “%s” is not a valid D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Cannot listen on unsupported transport “%s”" @@ -1086,6 +1096,10 @@ msgstr "Connect to the session bus" msgid "Connect to given D-Bus address" msgstr "Connect to given D-Bus address" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "כתובת" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Connection Endpoint Options:" @@ -1315,71 +1329,72 @@ msgstr "Error: %s is not a valid well-known bus name.\n" msgid "Not authorized to change debug settings" msgstr "Not authorized to change debug settings" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "ללא שם" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Desktop file didn’t specify Exec field" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Unable to find terminal required for application" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Program ‘%s’ not found in $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Can’t create user application configuration folder %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Can’t create user MIME configuration folder %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Application information lacks an identifier" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Can’t create user desktop file %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Custom definition for %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "drive doesn’t implement eject" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "drive doesn’t implement eject or eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "drive doesn’t implement polling for media" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "drive doesn’t implement start" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "drive doesn’t implement stop" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS backend does not implement TLS binding retrieval" @@ -1392,27 +1407,27 @@ msgstr "TLS support is not available" msgid "DTLS support is not available" msgstr "DTLS support is not available" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Can’t handle version %d of GEmblem encoding" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Malformed number of tokens (%d) in GEmblem encoding" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Can’t handle version %d of GEmblemedIcon encoding" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Malformed number of tokens (%d) in GEmblemedIcon encoding" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Expected a GEmblem for GEmblemedIcon" @@ -1420,129 +1435,133 @@ msgstr "Expected a GEmblem for GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Containing mount does not exist" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Can’t copy over directory" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Can’t copy directory over directory" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "קובץ יעד קיים" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Can’t recursively copy directory" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Copy file range not supported" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Error opening file: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Symbolic links not supported" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Copy (reflink/clone) between mounts is not supported" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Copy (reflink/clone) is not supported or invalid" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Copy (reflink/clone) is not supported or didn’t work" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "לא ניתן למשוך את המאפיין %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Can’t copy special file" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Invalid symlink value given" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Symbolic links not supported" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Trash not supported" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "File names cannot contain “%c”" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Failed to create a temporary directory for template “%s”: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "volume doesn’t implement mount" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "No application is registered as handling this file" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator is closed" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 gio/gfileenumerator.c:427 +#: gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "File enumerator has outstanding operation" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "File enumerator is already closed" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Can’t handle version %d of GFileIcon encoding" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Malformed input data for GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 gio/gfileiostream.c:166 +#: gio/gfileoutputstream.c:163 gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Stream doesn’t support query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Seek not supported on stream" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Truncate not allowed on input stream" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Truncate not supported on stream" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "שם מארח שגוי" @@ -1575,64 +1594,64 @@ msgstr "HTTP proxy response too big" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP proxy server closed connection unexpectedly." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Wrong number of tokens (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "No type for class name %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Type %s does not implement the GIcon interface" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Type %s is not classed" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Malformed version number: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Type %s does not implement from_tokens() on the GIcon interface" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Can’t handle the supplied version of the icon encoding" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "No address specified" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Length %u is too long for address" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Address has bits set beyond prefix length" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Could not parse “%s” as IP address mask" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Not enough space for socket address" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Unsupported socket address" @@ -1646,7 +1665,7 @@ msgstr "Input stream doesn’t implement read" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Stream has outstanding operation" @@ -1662,7 +1681,7 @@ msgstr "Keep with file when moved" msgid "“version” takes no arguments" msgstr "“version” takes no arguments" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Usage:" @@ -1670,79 +1689,79 @@ msgstr "Usage:" msgid "Print version information and exit." msgstr "Print version information and exit." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Commands:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Concatenate files to standard output" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Copy one or more files" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Show information about locations" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Launch an application from a desktop file" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "List the contents of locations" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Get or set the handler for a mimetype" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Create directories" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Monitor files and directories for changes" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Mount or unmount the locations" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Move one or more files" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Open files with the default application" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Rename a file" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Delete one or more files" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Read from standard input and save" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Set a file attribute" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Move files or directories to the trash" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lists the contents of locations in a tree" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Commands:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Use %s to get detailed help.\n" @@ -1752,7 +1771,7 @@ msgid "Error writing to stdout" msgstr "Error writing to stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1775,60 +1794,64 @@ msgstr "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "No locations given" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "No target directory" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Show progress" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Prompt before overwrite" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Preserve all attributes" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Backup existing destination files" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Never follow symbolic links" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Use default permissions for the destination" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "להשתמש בחותמות זמן השינוי כברירת מחדל ליעד" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Transferred %s out of %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "SOURCE" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "DESTINATION" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Copy one or more files from SOURCE to DESTINATION." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1838,12 +1861,12 @@ msgstr "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Destination %s is not a directory" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: overwrite “%s”? " @@ -1884,52 +1907,52 @@ msgstr "display name: %s\n" msgid "edit name: %s\n" msgstr "edit name: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "name: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "type: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "size: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "hidden\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "local path: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix mount: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Settable attributes:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Writable attribute namespaces:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Show information about locations." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2481,7 +2504,8 @@ msgstr "" "directory)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "DIRECTORY" @@ -2521,16 +2545,18 @@ msgstr "Don’t export functions; declare them G_GNUC_INTERNAL" #: gio/glib-compile-resources.c:832 msgid "" -"Don’t embed resource data in the C file; assume it's linked externally " -"instead" +"Don’t embed resource data in the C file; assume it's linked externally instead" msgstr "" -"Don’t embed resource data in the C file; assume it's linked externally " -"instead" +"Don’t embed resource data in the C file; assume it's linked externally instead" #: gio/glib-compile-resources.c:833 msgid "C identifier name used for the generated source code" msgstr "C identifier name used for the generated source code" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "מזהה" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "The target C compiler (default: the CC environment variable)" @@ -2671,11 +2697,9 @@ msgstr "" #: gio/glib-compile-schemas.c:583 #, c-format msgid "" -" given when “%s” is already a member of the enumerated " -"type" +" given when “%s” is already a member of the enumerated type" msgstr "" -" given when “%s” is already a member of the enumerated " -"type" +" given when “%s” is already a member of the enumerated type" #: gio/glib-compile-schemas.c:589 #, c-format @@ -2761,11 +2785,11 @@ msgstr "" #: gio/glib-compile-schemas.c:983 #, c-format msgid "" -"Exactly one of “type”, “enum” or “flags” must be specified as an attribute " -"to " +"Exactly one of “type”, “enum” or “flags” must be specified as an attribute to " +"" msgstr "" -"Exactly one of “type”, “enum” or “flags” must be specified as an attribute " -"to " +"Exactly one of “type”, “enum” or “flags” must be specified as an attribute to " +"" #: gio/glib-compile-schemas.c:1002 #, c-format @@ -2932,20 +2956,20 @@ msgstr "" #: gio/glib-compile-schemas.c:2026 #, c-format msgid "" -"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " -"%s. Ignoring override for this key." +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. " +"Ignoring override for this key." msgstr "" -"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " -"%s. Ignoring override for this key." +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. " +"Ignoring override for this key." #: gio/glib-compile-schemas.c:2038 #, c-format msgid "" -"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " -"%s. --strict was specified; exiting." +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. " +"--strict was specified; exiting." msgstr "" -"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " -"%s. --strict was specified; exiting." +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: %s. " +"--strict was specified; exiting." #: gio/glib-compile-schemas.c:2065 #, c-format @@ -2968,20 +2992,20 @@ msgstr "" #: gio/glib-compile-schemas.c:2101 #, c-format msgid "" -"Override for key “%s” in schema “%s” in override file “%s” is not in the " -"list of valid choices; ignoring override for this key." +"Override for key “%s” in schema “%s” in override file “%s” is not in the list " +"of valid choices; ignoring override for this key." msgstr "" -"Override for key “%s” in schema “%s” in override file “%s” is not in the " -"list of valid choices; ignoring override for this key." +"Override for key “%s” in schema “%s” in override file “%s” is not in the list " +"of valid choices; ignoring override for this key." #: gio/glib-compile-schemas.c:2111 #, c-format msgid "" -"Override for key “%s” in schema “%s” in override file “%s” is not in the " -"list of valid choices and --strict was specified; exiting." +"Override for key “%s” in schema “%s” in override file “%s” is not in the list " +"of valid choices and --strict was specified; exiting." msgstr "" -"Override for key “%s” in schema “%s” in override file “%s” is not in the " -"list of valid choices and --strict was specified; exiting." +"Override for key “%s” in schema “%s” in override file “%s” is not in the list " +"of valid choices and --strict was specified; exiting." #: gio/glib-compile-schemas.c:2173 msgid "Where to store the gschemas.compiled file" @@ -3035,124 +3059,124 @@ msgstr "Error getting filesystem info for %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Containing mount for file %s not found" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Can’t rename root directory" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Error renaming file %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Can’t rename file, filename already exists" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Invalid filename" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Error opening file %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Error removing file %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Error trashing file %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Unable to create trash directory %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Unable to find toplevel directory to trash %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Trashing on system internal mounts is not supported" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Unable to find or create trash directory %s to trash %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Unable to create trashing info file for %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Unable to trash file %s across filesystem boundaries" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Unable to trash file %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Unable to trash file %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Error creating directory %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Filesystem does not support symbolic links" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Error making symbolic link %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Error moving file %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Can’t move directory over directory" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Backup file creation failed" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Error removing target file: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Move between mounts not supported" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Could not determine the disk usage of %s: %s" @@ -3174,116 +3198,115 @@ msgstr "Invalid extended attribute name" msgid "Error setting extended attribute “%s”: %s" msgstr "Error setting extended attribute “%s”: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" -msgstr " (invalid encoding)" +msgstr " (קידוד שגוי)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Error when getting information for file “%s”: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Error when getting information for file descriptor: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Invalid attribute type (uint32 expected)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Invalid attribute type (uint64 expected)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Invalid attribute type (byte string expected)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Cannot set permissions on symlinks" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Error setting permissions: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Error setting owner: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symlink must be non-NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Error setting symlink: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Error setting symlink: file is not a symlink" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Extra nanoseconds %d for UNIX timestamp %lld are negative" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX timestamp %lld does not fit into 64 bits" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX timestamp %lld is outside of the range supported by Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "File name “%s” cannot be converted to UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "File “%s” cannot be opened: Windows Error %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Error setting modification or access time for file “%s”: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Error setting modification or access time: %s" # c-format -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux context must be non-NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux is not enabled on this system" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Error setting SELinux context: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Setting attribute %s not supported" @@ -3336,7 +3359,7 @@ msgid "Error truncating file: %s" msgstr "Error truncating file: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Error opening file “%s”: %s" @@ -3358,27 +3381,27 @@ msgstr "The file was externally modified" msgid "Error removing old file: %s" msgstr "Error removing old file: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Invalid GSeekType supplied" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Invalid seek request" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Cannot truncate GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Memory output stream not resizable" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Failed to resize memory output stream" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3386,73 +3409,73 @@ msgstr "" "Amount of memory required to process the write is larger than available " "address space" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Requested seek before the beginning of the stream" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Requested seek beyond the end of the stream" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "mount doesn’t implement “unmount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "mount doesn’t implement “eject”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "mount doesn’t implement “unmount” or “unmount_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "mount doesn’t implement “eject” or “eject_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "mount doesn’t implement “remount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "mount doesn’t implement content type guessing" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "mount doesn’t implement synchronous content type guessing" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Hostname “%s” contains “[” but not “]”" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Network unreachable" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Host unreachable" @@ -3480,7 +3503,7 @@ msgstr "NetworkManager not running" msgid "NetworkManager version too old" msgstr "NetworkManager version too old" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Output stream doesn’t implement write" @@ -3493,38 +3516,38 @@ msgstr "Sum of vectors passed to %s too large" msgid "Source stream is already closed" msgstr "Source stream is already closed" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Unspecified proxy lookup failure" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Error resolving “%s”: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s not implemented" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Invalid domain" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "The resource at “%s” does not exist" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "The resource at “%s” failed to decompress" @@ -3542,11 +3565,11 @@ msgstr "The resource at “%s” is not a directory" msgid "Input stream doesn’t implement seek" msgstr "Input stream doesn’t implement seek" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "List sections containing resources in an elf FILE" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3556,15 +3579,15 @@ msgstr "" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FILE [PATH]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SECTION" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3576,15 +3599,15 @@ msgstr "" "If PATH is given, only list matching resources\n" "Details include the section, size and compression" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extract a resource file to stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FILE PATH" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3612,7 +3635,7 @@ msgstr "" "Use “gresource help COMMAND” to get detailed help.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3627,19 +3650,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SECTION An (optional) elf section name\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " COMMAND The (optional) command to explain\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FILE An elf file (a binary or a shared library)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3647,21 +3670,21 @@ msgstr "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[PATH]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " PATH An (optional) resource path (may be partial)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "PATH" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" -msgstr " PATH A resource path\n" +msgstr " נתיב נתיב למשאב‬\n" #: gio/gsettings-tool.c:51 gio/gsettings-tool.c:72 gio/gsettings-tool.c:925 #, c-format @@ -3866,11 +3889,13 @@ msgstr " KEY The (optional) key within the schema\n" #: gio/gsettings-tool.c:733 msgid " KEY The key within the schema\n" -msgstr " KEY The key within the schema\n" +msgstr " מפתח המפתח כחלק מהסכמה‬\n" #: gio/gsettings-tool.c:737 msgid " VALUE The value to set\n" -msgstr " VALUE The value to set\n" +msgstr "" +" ערך הערך להגדרה\n" +"‬\n" #: gio/gsettings-tool.c:792 #, c-format @@ -3890,213 +3915,213 @@ msgstr "Empty schema name given\n" msgid "No such key “%s”\n" msgstr "No such key “%s”\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Invalid socket, not initialized" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Invalid socket, initialization failed due to: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Socket is already closed" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Socket I/O timed out" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "creating GSocket from fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Unable to create socket: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Unknown family was specified" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Unknown protocol was specified" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Cannot use datagram operations on a non-datagram socket." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Cannot use datagram operations on a socket with a timeout set." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "could not get local address: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "could not get remote address: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "could not listen: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Error binding to address %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Error joining multicast group: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Error leaving multicast group: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "No support for source-specific multicast" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Unsupported socket family" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "source-specific not an IPv4 address" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Interface name too long" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interface not found: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "No support for IPv4 source-specific multicast" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "No support for IPv6 source-specific multicast" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Error accepting connection: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Connection in progress" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Unable to get pending error: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Error receiving data: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Error sending data: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Unable to shutdown socket: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Error closing socket: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Waiting for socket condition: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Unable to send message: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Message vectors too large" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Error sending message: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage not supported on Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Error receiving message: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Unable to read socket credentials: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials not implemented for this OS" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Could not connect to proxy server %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Could not connect to %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Could not connect: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Proxying over a non-TCP connection is not supported." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Proxy protocol “%s” is not supported." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Listener is already closed" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Added socket is closed" @@ -4187,120 +4212,120 @@ msgstr "SOCKSv5 proxy does not support provided address type." msgid "Unknown SOCKSv5 proxy error." msgstr "Unknown SOCKSv5 proxy error." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Failed to create pipe for communicating with child process (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Pipes are not supported in this platform" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Can’t handle version %d of GThemedIcon encoding" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "No valid addresses were found" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Error reverse-resolving “%s”: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Error parsing DNS %s record: malformed DNS packet" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No DNS record of the requested type for “%s”" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Temporarily unable to resolve “%s”" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Error resolving “%s”" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Malformed DNS packet" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Failed to parse DNS response for “%s”: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "No PEM-encoded private key found" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Cannot decrypt PEM-encoded private key" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Could not parse PEM-encoded private key" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "No PEM-encoded certificate found" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Could not parse PEM-encoded certificate" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "The current TLS backend does not support PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "This GTlsBackend does not support creating PKCS #11 certificates" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" -"This is the last chance to enter the password correctly before your access " -"is locked out." +"This is the last chance to enter the password correctly before your access is " +"locked out." msgstr "" -"This is the last chance to enter the password correctly before your access " -"is locked out." +"This is the last chance to enter the password correctly before your access is " +"locked out." #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" -"Several passwords entered have been incorrect, and your access will be " -"locked out after further failures." +"Several passwords entered have been incorrect, and your access will be locked " +"out after further failures." msgstr "" -"Several passwords entered have been incorrect, and your access will be " -"locked out after further failures." +"Several passwords entered have been incorrect, and your access will be locked " +"out after further failures." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "The password entered is incorrect." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Sending FD is not supported" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4309,11 +4334,11 @@ msgstr[1] "‫Expecting 1 control message, got %d" msgstr[2] "‫Expecting 1 control message, got %d" msgstr[3] "‫Expecting 1 control message, got %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Unexpected type of ancillary data" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4330,116 +4355,127 @@ msgstr[3] "" "‫Expecting one fd, but got %d\n" "‬\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Received invalid fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Receiving FD is not supported" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Error sending credentials: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Error checking if SO_PASSCRED is enabled for socket: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Error enabling SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Expecting to read a single byte for receiving credentials but read zero bytes" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Not expecting control message, but got %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Error while disabling SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Error reading from file descriptor: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Error closing file descriptor: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Filesystem root" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Error writing to file descriptor: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstract UNIX domain socket addresses not supported on this system" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "volume doesn’t implement eject" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "volume doesn’t implement eject or eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "ליישום ‚%s’ בעצם היישום אין פעלים" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "ליישום ‚%s’ ולמטפל ‚%s’ בעצם היישום אין פעלים" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Error reading from file: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Error closing file: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Error writing to file: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" -msgstr "Not enough memory" +msgstr "אין מספיק זיכרון" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" -msgstr "Internal error: %s" +msgstr "שגיאה פנימית: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" -msgstr "Need more input" +msgstr "צריך עוד קלט" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" -msgstr "Invalid hostname" +msgstr "נתוני דחוסים שגויים" #: gio/tests/gdbus-daemon.c:18 msgid "Address to listen on" -msgstr "Address to listen on" +msgstr "כתובת להאזנה" #: gio/tests/gdbus-daemon.c:19 msgid "Ignored, for compat with GTestDbus" @@ -4447,162 +4483,297 @@ msgstr "Ignored, for compat with GTestDbus" #: gio/tests/gdbus-daemon.c:20 msgid "Print address" -msgstr "Print address" +msgstr "הצגת כתובת" #: gio/tests/gdbus-daemon.c:21 msgid "Print address in shell mode" -msgstr "Print address in shell mode" +msgstr "הצגת הכתובת במצב מעטפת" #: gio/tests/gdbus-daemon.c:28 msgid "Run a dbus service" -msgstr "Run a dbus service" +msgstr "הרצת שירות dbus" #: gio/tests/gdbus-daemon.c:42 msgid "Wrong args\n" -msgstr "Wrong args\n" +msgstr "ארגומנטים שגויים\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "פתיחת ‚%s’ נכשלה: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "שגיאה: לא ניתן לכתוב את כל הפלט: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "שגיאה: שינוי שם הקובץ ‚%s’ לשם ‚%s’ נכשל:‏ %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "לכלול תיקיות בנתיב חיפוש GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "קובץ פלט" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "ספרייה משותפת" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "הצגת הודעות ניפוי תקלות" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "הצגת הודעות מפורטות" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "להציג את מספר גרסת התוכנה ולצאת" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "שגיאה בפענוח ארגומנטים: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "נא לציין קובץ קלט אחד בלבד" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "שגיאה בפענוח הקובץ ‚%s’: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "בניית typelib למודול ‚%s’ נכשלה" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "‫typelib שגוי למודול ‚%s’: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "להציג את כל המידע הזמין" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "פענוח נכשל: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "אין קובצי קלט" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "קריאת ‚%s’ נכשלה: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "יצירת typelib‏ ‚%s’ נכשלה: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "טעינת typelib נכשלה: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "אזהרה: %u מודולים הושמטו" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "גרסת Typelib לחקירה" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "גרסה" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "להציג את הספריות המשותפות ואת דרישות ה־typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "להציג typelib אחרים שה־typelib שבחקירה דורש" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "ה־typelib לחקירה" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "מרחב_שם" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- חקירת typelib GI" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "פענוח אפשרויות שורת הפקודה נכשל: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "נא לציין מרחב שם אחד בלבד" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "נא לציין את ‎—print-shlibs,‏ ‎—print-typelibs או את שניהם" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Unexpected attribute “%s” for element “%s”" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Attribute “%s” of element “%s” not found" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 glib/gbookmarkfile.c:1368 +#: glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Unexpected tag “%s”, tag “%s” expected" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 glib/gbookmarkfile.c:1346 +#: glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Unexpected tag “%s” inside “%s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Invalid date/time ‘%s’ in bookmark file" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "No valid bookmark file found in data dirs" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "A bookmark for URI “%s” already exists" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 glib/gbookmarkfile.c:2404 +#: glib/gbookmarkfile.c:2484 glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 glib/gbookmarkfile.c:3013 +#: glib/gbookmarkfile.c:3110 glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 glib/gbookmarkfile.c:3874 +#: glib/gbookmarkfile.c:3963 glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No bookmark found for URI “%s”" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "No MIME type defined in the bookmark for URI “%s”" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "No private flag has been defined in bookmark for URI “%s”" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No groups set in bookmark for URI “%s”" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "No application with name “%s” registered a bookmark for “%s”" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Failed to expand exec line “%s” with URI “%s”" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Unrepresentable character in conversion input" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Partial character sequence at end of input" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Cannot convert fallback “%s” to codeset “%s”" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Embedded NUL byte in conversion input" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Embedded NUL byte in conversion output" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "The URI “%s” is not an absolute URI using the “file” scheme" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "The URI “%s” is invalid" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "The hostname of the URI “%s” is invalid" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "The URI “%s” contains invalidly escaped characters" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "The pathname “%s” is not an absolute path" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%Z %H:%M:%S %Y %b %d %a" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %P" @@ -4623,62 +4794,62 @@ msgstr "%I:%M:%S %P" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "ינואר" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "פברואר" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "מרץ" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "אפריל" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "מאי" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "יוני" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "יולי" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "אוגוסט" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "ספטמבר" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "אוקטובר" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "נובמבר" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "דצמבר" @@ -4700,132 +4871,132 @@ msgstr "דצמבר" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "ינו" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "פבר" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "מרץ" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "אפר" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "מאי" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "יונ" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "יול" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "אוג" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "ספט" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "אוק" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "נוב" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "דצמ" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "יום שני" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "יום שלישי" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "יום רביעי" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "יום חמישי" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "יום שישי" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "שבת" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "יום ראשון" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "ב׳" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "ג׳" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "ד׳" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "ה" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "ו׳" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "ש׳" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "א׳" @@ -4847,62 +5018,62 @@ msgstr "א׳" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "ינואר" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "פברואר" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "מרץ" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "אפריל" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "מאי" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "יוני" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "יולי" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "אוגוסט" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "ספטמבר" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "אוקטובר" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "נובמבר" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "דצמבר" @@ -4924,242 +5095,245 @@ msgstr "דצמבר" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "ינו" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "פבר" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "מרץ" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "אפר" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "מאי" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "יונ" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "יול" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "אוג" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "ספט" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "אוק" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "נוב" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "דצמ" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" -msgstr "Error opening directory “%s”: %s" +msgstr "שגיאה בפתיחת התיקייה „%s”:‏ %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "‫Could not allocate %lu byte to read file “%s”" -msgstr[1] "‫Could not allocate %lu bytes to read file “%s”" -msgstr[2] "‫Could not allocate %lu bytes to read file “%s”" -msgstr[3] "‫Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "‫לא ניתן להקצות בית %s לקריאת הקובץ „%s”" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" -msgstr "Error reading file “%s”: %s" +msgstr "שגיאה בקריאת הקובץ „%s”:‏ %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" -msgstr "File “%s” is too large" +msgstr "הקובץ „%s” גדול מדי" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" -msgstr "Failed to read from file “%s”: %s" +msgstr "קריאה מהקובץ „%s” נכשלה: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" -msgstr "Failed to open file “%s”: %s" +msgstr "פתיחת הקובץ „%s” נכשלה: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Failed to get attributes of file “%s”: fstat() failed: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Failed to open file “%s”: fdopen() failed: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Failed to rename file “%s” to “%s”: g_rename() failed: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "כתיבת הקובץ „%s” נכשלה: ftruncate()‎ נכשל: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Failed to write file “%s”: write() failed: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Failed to write file “%s”: fsync() failed: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Failed to create file “%s”: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Existing file “%s” could not be removed: g_unlink() failed: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Template “%s” invalid, should not contain a “%s”" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" -msgstr "Template “%s” doesn’t contain XXXXXX" +msgstr "התבנית „%s” לא מכילה XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Failed to read the symbolic link “%s”: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Could not open converter from “%s” to “%s”: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Can’t do a raw read in g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Left over unconverted data in read buffer" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Channel terminates in a partial character" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Can’t do a raw read in g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Valid key file could not be found in search dirs" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" -msgstr "Not a regular file" +msgstr "לא קובץ רגיל" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "" "Key file contains line “%s” which is not a key-value pair, group, or comment" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" -msgstr "Invalid group name: %s" +msgstr "שם הקבוצה שגוי: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" -msgstr "Key file does not start with a group" +msgstr "קובץ המפתח לא מתחיל בקבוצה" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "שם המפתח שגוי: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Key file contains unsupported encoding “%s”" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" -msgstr "Key file does not have group “%s”" +msgstr "לקובץ המפתח אין קבוצה „%s”" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Key file does not have key “%s” in group “%s”" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Key file contains key “%s” with value “%s” which is not UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format -msgid "" -"Key file contains key “%s” which has a value that cannot be interpreted." +msgid "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Key file contains key “%s” which has a value that cannot be interpreted." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5168,36 +5342,36 @@ msgstr "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Key “%s” in group “%s” has value “%s” where %s was expected" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Key file contains escape character at end of line" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Key file contains invalid escape sequence “%s”" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Value “%s” cannot be interpreted as a number." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Integer value “%s” out of range" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Value “%s” cannot be interpreted as a float number." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Value “%s” cannot be interpreted as a boolean." @@ -5217,32 +5391,32 @@ msgstr "Failed to map %s%s%s%s: mmap() failed: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Failed to open file “%s”: open() failed: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Error on line %d char %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Invalid UTF-8 encoded text in name — not valid “%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” is not a valid name" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” is not a valid name: “%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Error on line %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5251,7 +5425,7 @@ msgstr "" "Failed to parse “%-.*s”, which should have been a digit inside a character " "reference (ê for example) — perhaps the digit is too large" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5261,23 +5435,23 @@ msgstr "" "ampersand character without intending to start an entity — escape ampersand " "as &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Character reference “%-.*s” does not encode a permitted character" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Empty entity “&;” seen; valid entities are: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Entity name “%-.*s” is not known" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5285,11 +5459,11 @@ msgstr "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Document must begin with an element (e.g. )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5299,28 +5473,26 @@ msgstr "" "element name" # c-format -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" -"Odd character “%s”, expected a “>” character to end the empty-element tag " -"“%s”" +"Odd character “%s”, expected a “>” character to end the empty-element tag “%s”" msgstr "" -"Odd character “%s”, expected a “>” character to end the empty-element tag " -"“%s”" +"Odd character “%s”, expected a “>” character to end the empty-element tag “%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Too many attributes in element “%s”" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5331,7 +5503,7 @@ msgstr "" "element “%s”, or optionally an attribute; perhaps you used an invalid " "character in an attribute name" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5340,7 +5512,7 @@ msgstr "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Element “%s” was closed, no element is currently open" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Element “%s” was closed, but the currently open element is “%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Document was empty or contained only whitespace" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Document ended unexpectedly just after an open angle bracket “<”" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5385,28 +5557,28 @@ msgstr "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" -"Document ended unexpectedly, expected to see a close angle bracket ending " -"the tag <%s/>" +"Document ended unexpectedly, expected to see a close angle bracket ending the " +"tag <%s/>" msgstr "" -"Document ended unexpectedly, expected to see a close angle bracket ending " -"the tag <%s/>" +"Document ended unexpectedly, expected to see a close angle bracket ending the " +"tag <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Document ended unexpectedly inside an element name" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Document ended unexpectedly inside an attribute name" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Document ended unexpectedly inside an element-opening tag." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5414,258 +5586,257 @@ msgstr "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Document ended unexpectedly while inside an attribute value" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Document ended unexpectedly inside the close tag for element “%s”" -#: glib/gmarkup.c:1880 -msgid "" -"Document ended unexpectedly inside the close tag for an unopened element" +#: glib/gmarkup.c:1826 +msgid "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Document ended unexpectedly inside the close tag for an unopened element" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Document ended unexpectedly inside a comment or processing instruction" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPTION…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" -msgstr "Help Options:" +msgstr "אפשרויות עזרה:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" -msgstr "Show help options" +msgstr "הצגת אפשרויות עזרה" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" -msgstr "Show all help options" +msgstr "הצגת כל אפשרויות העזרה" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" -msgstr "Application Options:" +msgstr "אפשרויות יישום:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" -msgstr "Options:" +msgstr "אפשרויות:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Cannot parse integer value “%s” for %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Integer value “%s” for %s out of range" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Cannot parse double value “%s” for %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Double value “%s” for %s out of range" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Error parsing option %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Missing·argument·for·%s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Unknown option %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "corrupted object" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "out of memory" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "internal error" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "the pattern contains items not supported for partial matching" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "back references as conditions are not supported for partial matching" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "recursion limit reached" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "bad offset" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "recursion loop" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "התבקש מצב התאמה שלא הודר עבור JIT (הרצה ללא הידור)" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "unknown error" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ at end of pattern" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c at end of pattern" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "unrecognized character following \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "numbers out of order in {} quantifier" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "number too big in {} quantifier" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "missing terminating ] for character class" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "invalid escape sequence in character class" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "range out of order in character class" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nothing to repeat" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "unrecognized character after (? or (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX named classes are supported only within a class" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX collating elements are not supported" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "missing terminating )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "reference to non-existent subpattern" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "missing ) after comment" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "regular expression is too large" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "malformed number or name after (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind assertion is not fixed length" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "conditional group contains more than two branches" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "assertion expected after (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "a numbered reference must not be zero" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "unknown POSIX class name" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "character value in \\x{...} sequence is too large" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C not allowed in lookbehind assertion" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "missing terminator in subpattern name" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "two named subpatterns have the same name" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "malformed \\P or \\p sequence" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "unknown property name after \\P or \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "subpattern name is too long (maximum 32 characters)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "too many named subpatterns (maximum 10,000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "octal value is greater than \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE group contains more than one branch" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "inconsistent NEWLINE options" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5673,229 +5844,229 @@ msgstr "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) not recognized" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "number is too big" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "missing subpattern name after (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "different names for subpatterns of the same number are not allowed" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) must have an argument" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c must be followed by an ASCII character" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "\\k is not followed by a braced, angle-bracketed, or quoted name" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N is not supported in a class" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "code overflow" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "unrecognized character after (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "overran compiling workspace" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "previously-checked referenced subpattern not found" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Error while matching regular expression %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE library is compiled without UTF8 support" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE library is compiled with incompatible options" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "שגיאה בהידור הביטוי הרגולרי ‚%s’ בתו %s:‏ %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "hexadecimal digit or “}” expected" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "hexadecimal digit expected" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "missing “<” in symbolic reference" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "unfinished symbolic reference" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "zero-length symbolic reference" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "digit expected" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "illegal symbolic reference" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "stray final “\\”" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "unknown escape sequence" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Error while parsing replacement text “%s” at char %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Quoted text doesn’t begin with a quotation mark" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Unmatched quotation mark in command line or other shell-quoted text" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Text ended just after a “\\” character. (The text was “%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "Text ended before matching quote was found for %c. (The text was “%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Text was empty (or contained only whitespace)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Failed to read data from child process (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Unexpected error in reading data from a child process (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Unexpected error in waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Child process exited with code %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Child process killed by signal %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Child process stopped by signal %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Child process exited abnormally" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Failed to read from child pipe (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Failed to spawn child process “%s” (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Failed to fork (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Failed to change to directory “%s” (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Failed to execute child process “%s” (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Failed to open file to remap file descriptor (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Failed to duplicate file descriptor for child process (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Failed to fork child process (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Failed to close file descriptor for child process (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Unknown error executing child process “%s”" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Failed to read enough data from child pid pipe (%s)" @@ -5952,78 +6123,78 @@ msgstr "" "Unexpected error in g_io_channel_win32_poll() reading data from a child " "process" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Empty string is not a number" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s” is not a signed number" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Number “%s” is out of bounds [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s” is not an unsigned number" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Invalid %-encoding in URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Illegal character in URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Non-UTF-8 characters in URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Invalid IPv6 address ‘%.*s’ in URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Illegal encoded IP address ‘%.*s’ in URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Illegal internationalized hostname ‘%.*s’ in URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Could not parse port ‘%.*s’ in URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Port ‘%.*s’ in URI is out of range" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI ‘%s’ is not an absolute URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI ‘%s’ has no host component" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI is not absolute, and no base URI was provided" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "חסרים ‚=’ וערך משתנה" @@ -6104,65 +6275,65 @@ msgstr "פבי״ב" msgid "EiB" msgstr "אק״ב" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "ק״ס" +msgid "kbit" +msgstr "קילוסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "מ״ס" +msgid "Mbit" +msgstr "מגהסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "ג״ס" +msgid "Gbit" +msgstr "גיגהסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "ט״ס" +msgid "Tbit" +msgstr "טרהסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "פ״ס" +msgid "Pbit" +msgstr "פטהסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "א״ס" +msgid "Ebit" +msgstr "אקסהסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "קי״ס" +msgid "Kibit" +msgstr "קיביסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "מבי״ס" +msgid "Mibit" +msgstr "מיביסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "גיב״ס" +msgid "Gibit" +msgstr "גיביסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "אבי״ס" +msgid "Tibit" +msgstr "טיביסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "פבי״ס" +msgid "Pibit" +msgstr "פיביסיביות" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "אק״ס" +msgid "Eibit" +msgstr "איביסיביות" #: glib/gutils.c:3056 msgid "byte" @@ -6277,6 +6448,54 @@ msgstr "%.1f פ״ב" msgid "%.1f EB" msgstr "%.1f א״ב" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "לא ניתן להקצות %" +#~ msgstr[1] "לא ניתן להקצות %" +#~ msgstr[2] "לא ניתן להקצות %" +#~ msgstr[3] "לא ניתן להקצות %" + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" + +#~ msgid "kb" +#~ msgstr "ק״ס" + +#~ msgid "Mb" +#~ msgstr "מ״ס" + +#~ msgid "Gb" +#~ msgstr "ג״ס" + +#~ msgid "Tb" +#~ msgstr "ט״ס" + +#~ msgid "Pb" +#~ msgstr "פ״ס" + +#~ msgid "Eb" +#~ msgstr "א״ס" + +#~ msgid "Kib" +#~ msgstr "קי״ס" + +#~ msgid "Mib" +#~ msgstr "מבי״ס" + +#~ msgid "Gib" +#~ msgstr "גיב״ס" + +#~ msgid "Tib" +#~ msgstr "אבי״ס" + +#~ msgid "Pib" +#~ msgstr "פבי״ס" + +#~ msgid "Eib" +#~ msgstr "אק״ס" + #, c-format #~ msgid "The local file URI “%s” may not include a “#”" #~ msgstr "The local file URI “%s” may not include a “#”" diff --git a/po/hu.po b/po/hu.po index efb94d2..763f255 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1,17 +1,17 @@ # Hungarian translation for glib. -# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023 Free Software Foundation, Inc. +# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 Free Software Foundation, Inc. # This file is distributed under the same license as the glib package. # # Szabolcs Varga , 2005. # Gabor Kelemen , 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2016, 2017. -# Balázs Úr , 2013, 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023. -# Balázs Meskó , 2017, 2018, 2020, 2021. +# Balázs Úr , 2013, 2014, 2015, 2016, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# Balázs Meskó , 2017, 2018, 2020, 2021, 2024. msgid "" msgstr "" "Project-Id-Version: glib master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-02 13:39+0000\n" -"PO-Revision-Date: 2023-09-05 20:34+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-04 11:49+0100\n" "Last-Translator: Balázs Úr \n" "Language-Team: Hungarian \n" "Language: hu\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Lokalize 23.04.3\n" +"X-Generator: Lokalize 23.08.4\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -42,38 +42,43 @@ msgstr "" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Nem sikerült alapértelmezett alkalmazást találni a(z) „%s” URI-sémához" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication kapcsolói:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "A GApplication kapcsolóinak megjelenítése" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Belépés GApplication szolgáltatásmódba (használja D-Bus " "szolgáltatásfájlokból)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Alkalmazások azonosítójának felülbírálása" #: gio/gapplication.c:575 +#| msgid "List applications" +msgid "Print the application version" +msgstr "Az alkalmazás verziójának kiírása" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "A futó példány cseréje" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Súgó kiírása" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[PARANCS]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Verzió kiírása" @@ -128,7 +133,7 @@ msgid "APPID" msgstr "ALKALMAZÁSAZONOSÍTÓ" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "PARANCS" @@ -140,9 +145,13 @@ msgstr "Részletes súgó kiírása ezen parancshoz" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Alkalmazásazonosító D-Bus formátumban (például: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FÁJL" @@ -166,7 +175,7 @@ msgstr "PARAMÉTER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "A művelethívás elhagyható paramétere GVariant formátumban" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -180,12 +189,12 @@ msgstr "" msgid "Usage:\n" msgstr "Használat:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumentumok:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTUMOK…]" @@ -279,80 +288,80 @@ msgstr "" "ismeretlen parancs: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Túl nagy számérték került átadásra ennek: %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Az alap adatfolyam nem támogatja a pozicionálást" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "A GBufferedInputStream nem csonkítható" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Az adatfolyam már le van zárva" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Az alap adatfolyam csonkítása nem engedélyezett" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "A művelet megszakítva" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Érvénytelen objektum, nincs előkészítve" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Érvénytelen több bájtos sorozat a bemenetben" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Nincs elég hely a célon" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Érvénytelen bájtsorrend az átalakítás bemenetében" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Hiba az átalakításkor: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "A megszakítható előkészítés nem támogatott" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "A(z) „%s” és „%s” karakterkészletek közötti átalakítás nem támogatott" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "" "A(z) „%s” karakterkészletről „%s” karakterkészletre átalakító nem nyitható " "meg" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s típus" @@ -366,41 +375,41 @@ msgstr "Ismeretlen típus" msgid "%s filetype" msgstr "%s fájltípus" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "A GCredentials érvénytelen adatot tartalmaz" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "A GCredentials nincs megvalósítva ezen a rendszeren" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "A platformhoz nincs GCredentials támogatás" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "A GCredentials nem tartalmaz folyamatazonosítót ezen a rendszeren" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "A hitelesítési adatok hamisítása nincs megvalósítva ezen a rendszeren" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Váratlan korai adatfolyam vége" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nem támogatott „%s” kulcs a(z) „%s” címbejegyzésben" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Értelmetlen kulcs-érték pár kombináció a(z) „%s” címbejegyzésben" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -409,28 +418,28 @@ msgstr "" "A(z) „%s” cím érvénytelen (csak az útvonal, könyvtár, tmp könyvtár vagy " "absztrakt kulcsok egyike lehet)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Hiba a(z) „%s” címben – a(z) „%s” attribútum rosszul formázott" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Ismeretlen vagy nem támogatott szállítás („%s”) a címhez („%s”)" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "A(z) „%s” címelem nem tartalmaz kettőspontot (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Az átvitel neve a(z) „%s” címelemben nem lehet üres" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -438,14 +447,14 @@ msgid "" msgstr "" "%d. kulcs-érték pár: „%s” a(z) „%s” címelemben nem tartalmaz egyenlőségjelet" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" "%d. kulcs-érték pár: „%s” a(z) „%s” címelemben nem tartalmazhat üres kulcsot" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -454,7 +463,7 @@ msgstr "" "Hiba a(z) „%3$s” címelemben található a(z) %1$d. kulcs-érték párban lévő " "„%2$s” kulcs vagy érték értelmezésekor" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -463,81 +472,81 @@ msgstr "" "Hiba a(z) „%s” címben – a unix szállítás a „path” vagy „abstract” kulcsok " "pontosan egyikének jelenlétét igényli" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Hiba a(z) „%s” címben – a host attribútum hiányzik vagy rosszul formázott" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Hiba a(z) „%s” címben – a port attribútum hiányzik vagy rosszul formázott" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Hiba a(z) „%s” címben – a noncefile attribútum hiányzik vagy rosszul " "formázott" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Hiba az automatikus indításkor: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Hiba a(z) „%s” ideiglenes fájl megnyitásakor: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Hiba a(z) „%s” ideiglenes fájl olvasásakor: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Hiba a(z) „%s” ideiglenes fájl olvasásakor, a várt 16 bájt helyett %d " "érkezett" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Hiba az ideiglenes fájl („%s”) tartalmának írásakor az adatfolyamba:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "A megadott cím üres" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Nem indítható üzenetbusz, ha az AT_SECURE be van állítva" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Nem indítható üzenetbusz gépazonosító nélkül: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Nem indítható automatikusan a D-Bus X11 $DISPLAY nélkül" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Hiba a(z) „%s” parancssor indításakor: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Nem határozható meg a munkamenetbusz címe (nincs megvalósítva erre az OS-re)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -546,7 +555,7 @@ msgstr "" "Nem határozható meg a busz címe a DBUS_STARTER_BUS_TYPE környezeti " "változóból – ismeretlen „%s” érték" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -554,21 +563,21 @@ msgstr "" "Nem határozható meg a busz címe, mivel a DBUS_STARTER_BUS_TYPE környezeti " "változó nincs beállítva" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Ismeretlen busztípus: %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "A tartalom váratlanul hiányzik egy sor olvasásának kísérletekor" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" "A tartalom váratlanul hiányzik egy sor (biztonságos) olvasásának kísérletekor" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -576,17 +585,17 @@ msgstr "" "Minden elérhető hitelesítési mechanizmus kimerítve (próbálva: %s, elérhető: " "%s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "A tartalom váratlanul hiányzik egy bájt olvasásának kísérletekor" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "" "A felhasználói azonosítóknak ugyanannak kell lenniük a partnernél és a " "kiszolgálónál" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "" "Megszakítva a GDBusAuthObserver::authorize-authenticated-peer használatával" @@ -601,21 +610,21 @@ msgstr "Hiba a(z) „%s” könyvtár információinak lekérésekor: %s" msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" msgstr "" -"A(z) „%s” könyvtár jogosultságai rosszul formázottak. A várt 0700 mód " -"helyett 0%o érkezett." +"A(z) „%s” könyvtár jogosultságai formailag hibásak. A várt 0700 mód helyett " +"0%o érkezett." #: gio/gdbusauthmechanismsha1.c:355 gio/gdbusauthmechanismsha1.c:366 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Hiba a(z) %s könyvtár létrehozásakor: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "A művelet nem támogatott" @@ -680,15 +689,15 @@ msgstr "Hiba a(z) „%s” kulcstartó írásra való megnyitásakor: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Ezen kívül a(z) „%s” zárolásának feloldása is meghiúsult: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "A kapcsolat le van zárva" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Az időkorlát elérve" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -780,67 +789,89 @@ msgstr "Egy részfa már exportálva van a következőhöz: %s" msgid "Object does not exist at path “%s”" msgstr "Az objektum nem létezik a(z) „%s” útvonalon" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "%s üzenet: a(z) %s fejlécmező érvénytelen, „%s” típusú érték az elvárt" + +#: gio/gdbusmessage.c:1374 +#, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: %s header field is missing or invalid" +msgstr "%s üzenet: a(z) %s fejlécmező hiányzik vagy érvénytelen" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s üzenet: ÉRVÉNYTELEN fejlécmező lett megadva" + +#: gio/gdbusmessage.c:1424 +#, c-format +#| msgid "" +#| "SIGNAL message: The PATH header field is using the reserved value /org/" +#| "freedesktop/DBus/Local" +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s üzenet: a PATH fejlécmező a fenntartott /org/freedesktop/DBus/Local " +"értéket használja" + +#: gio/gdbusmessage.c:1437 +#, c-format +#| msgid "" +#| "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or " +#| "invalid" +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s üzenet: az INTERFACE fejlécmező nem tartalmaz érvényes interfésznevet" + +#: gio/gdbusmessage.c:1446 +#, c-format +#| msgid "" +#| "SIGNAL message: The INTERFACE header field is using the reserved value " +#| "org.freedesktop.DBus.Local" +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s üzenet: az INTERFACE fejlécmező a fenntartott org.freedesktop.DBus.Local " +"értéket használja" + +#: gio/gdbusmessage.c:1459 +#, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s üzenet: a MEMBER fejlécmező nem tartalmaz érvényes tagnevet" + +#: gio/gdbusmessage.c:1472 +#, c-format +#| msgid "" +#| "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or " +#| "invalid" +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "%s üzenet: az ERROR_NAME fejlécmező nem tartalmaz érvényes hibanevet" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "a típus érvénytelen" -#: gio/gdbusmessage.c:1324 -#| msgid "METHOD_CALL message: PATH or MEMBER header field is missing" -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"METHOD_CALL üzenet: a PATH vagy MEMBER fejlécmező hiányzik vagy érvénytelen" - -#: gio/gdbusmessage.c:1340 -#| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"METHOD_RETURN üzenet: a REPLY_SERIAL fejlécmező hiányzik vagy érvénytelen" - -#: gio/gdbusmessage.c:1360 -#| msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR üzenet: a REPLY_SERIAL vagy ERROR_NAME fejlécmező hiányzik vagy" -" érvénytelen" - -#: gio/gdbusmessage.c:1384 -#| msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL üzenet: a PATH, INTERFACE vagy MEMBER fejlécmező hiányzik vagy" -" érvénytelen" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL üzenet: a PATH fejlécmező a fenntartott /org/freedesktop/DBus/Local " -"értéket használja" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL üzenet: az INTERFACE fejlécmező a fenntartott value org.freedesktop." -"DBus.Local értéket használja" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Az olvasandó %lu bájt helyett csak %lu érkezett" msgstr[1] "Az olvasandó %lu bájt helyett csak %lu érkezett" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "A(z) „%s” karakterlánc után várt NULL bájt helyett %d bájt található" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -848,23 +879,23 @@ msgid "" msgstr "" "A várt érvényes UTF-8 karakterlánc helyett érvénytelen bájtok találhatók " "a(z) %d bájteltolásnál (a karakterlánc hossza: %d). Az érvényes UTF-8 " -"karakterlánc az adott pontig: „%s”" +"karakterlánc az adott pontig: „%s”." -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Az érték túl mélyen van egymásba ágyazva" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "A feldolgozott „%s” érték nem érvényes D-Bus objektumútvonal" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "A feldolgozott „%s” érték nem érvényes D-Bus aláírás" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -875,7 +906,7 @@ msgstr[0] "" msgstr[1] "" "%u bájt hosszú tömb található. A maximális hossz 2<<26 bájt (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -884,85 +915,85 @@ msgstr "" "Egy „a%c” típusú tömb található, az elvárt hossz a(z) %u bájt többszöröse, " "de %u bájt hosszú található" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Üres szerkezetek (rekordok) nem engedélyezettek a D-Buson" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "A változat feldolgozott „%s” értéke nem érvényes D-Bus aláírás" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Hiba a(z) „%s” típusú GVariant visszafejtésekor a D-Bus átviteli formátumból" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "" -"Érvénytelen bájtsorrend-érték. A várt 0x6c („l”) vagy 0x42 („B”) helyett " -"0x%02x érték található" +"Érvénytelen bájtsorrend-érték. A várt 0x6c („l”) vagy 0x42 („B”) helyett " +"0x%02x érték található." -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" -msgstr "Érvénytelen fő protokollverzió. A várt 1 helyett %d található" +msgstr "Érvénytelen fő protokollverzió. A várt 1 helyett %d található." -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Aláírásfejléc található, de nem aláírás típusú" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Aláírásfejléc található „%s” aláírással, de az üzenettörzs üres" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "A feldolgozott „%s” érték nem érvényes D-Bus aláírás (a törzshöz)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "Nincs aláírásfejléc az üzenetben, de az üzenettörzs %u bájt" msgstr[1] "Nincs aláírásfejléc az üzenetben, de az üzenettörzs %u bájt" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Nem fejthető sorba az üzenet: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" "Hiba a(z) „%s” típusú GVariant sorbafejtésekor a D-Bus átviteli formátumba" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Az üzenetben található fájlleírók száma (%d) eltér a fejléc mezőtől (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Az üzenet nem fejthető sorba: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Az üzenettörzs „%s” aláírással rendelkezik, de nincs aláírásfejléc" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -971,17 +1002,17 @@ msgstr "" "Az üzenettörzs „%s” típusaláírással rendelkezik, de az aláírásfejlécben lévő " "aláírás: „%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Az üzenettörzs üres, de az aláírásfejlécben lévő aláírás: „%s”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Hiba került visszaadásra a(z) „%s” típusú törzzsel" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Hiba került visszaadásra az üres törzzsel" @@ -1001,22 +1032,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Nem kérhető le hardverprofil: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "A(z) %s vagy a(z) %s nem tölthető be: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Hiba a StartServiceByName hívásakor ehhez: %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Váratlan válasz (%d) a StartServiceByName(\"%s\") metódustól" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1025,25 +1056,25 @@ msgstr "" "A metódus nem hívható; a proxy a jól ismert %s névhez tartozik tulajdonos " "nélkül, és a proxy a G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START jelzővel készült" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Az absztrakt névtér nem támogatott" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Kiszolgáló létrehozásakor nem adható meg az ideiglenes fájl" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Hiba az ideiglenes fájl („%s”) írásakor: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "A(z) „%s” karakterlánc nem érvényes D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Nem figyelhető a nem támogatott „%s” szállítás" @@ -1105,6 +1136,10 @@ msgstr "Csatlakozás a munkamenetbuszhoz" msgid "Connect to given D-Bus address" msgstr "Csatlakozás a megadott D-Bus címhez" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "CÍM" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Kapcsolatvégpont beállításai:" @@ -1335,73 +1370,74 @@ msgstr "Hiba: a(z) %s nem érvényes busznév\n" msgid "Not authorized to change debug settings" msgstr "Nincs felhatalmazva a hibakeresési beállítások megváltoztatására" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Névtelen" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "A desktop fájl nem adta meg az Exec mezőt" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Nem található az alkalmazáshoz szükséges terminál" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "A(z) „%s” program nem található a $PATH értékében" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "Nem hozható létre a(z) %s felhasználói alkalmazáskonfigurációs mappa: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nem hozható létre a(z) %s felhasználói MIME konfigurációs mappa: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Az alkalmazásinformációkból hiányzik az azonosító" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nem hozható létre a felhasználói desktop fájl (%s)" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "%s egyéni meghatározása" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "a meghajtó nem valósítja meg a kiadást" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "" "a meghajtó nem valósítja meg a kiadást vagy az eject_with_operation függvényt" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "a meghajtó nem valósítja meg a média lekérdezését" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "a meghajtó nem valósítja meg a indítást" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "a meghajtó nem valósítja meg a leállítást" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "A TLS háttérszolgáltatás nem valósítja meg a TLS kötéslekérdezést" @@ -1414,27 +1450,27 @@ msgstr "A TLS-támogatás nem érhető el" msgid "DTLS support is not available" msgstr "A DTLS-támogatás nem érhető el" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "A GEmblem kódolás %d. verziója nem kezelhető" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "A GEmblem kódolásban a jelsorok száma (%d) hibásan formált" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "A GEmblemedIcon kódolás %d. verziója nem kezelhető" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "A GEmblemedIcon kódolásban a jelsorok száma (%d) hibásan formált" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Egy GEmblem kellene a GEmblemedIconhoz" @@ -1442,129 +1478,135 @@ msgstr "Egy GEmblem kellene a GEmblemedIconhoz" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "A tartalmazó csatolás nem létezik" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Nem lehet a könyvtárra másolni" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "A könyvtár nem másolható könyvtárba" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "A célfájl létezik" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "A könyvtár nem másolható rekurzívan" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Fájltartomány másolása nem támogatott" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Hiba a fájl illesztésekor: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "A fájlillesztés nem támogatott" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "A csatolások közti másolás (reflink/clone) nem támogatott" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "A másolás (reflink/clone) nem támogatott vagy érvénytelen" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "A másolás (reflink/clone) nem támogatott vagy nem működött" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +#| msgid "Unset given attribute" +msgid "Cannot retrieve attribute %s" +msgstr "Nem sikerült lekérni a(z) %s attribútumot" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "A speciális fájl nem másolható" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Érvénytelen szimbolikus link érték került megadásra" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "A szimbolikus linkek használata nem támogatott" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "A Kuka nem támogatott" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "A fájlnevek nem tartalmazhatnak „%c” karaktert" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Nem sikerült átmeneti könyvtárat létrehozni a(z) „%s” sablonhoz: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "a kötet nem valósítja meg a csatolást" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Nincs alkalmazás regisztrálva a fájl kezeléséhez" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Az enumerátor le van zárva" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "A fájlenumerátor hátralévő művelettel rendelkezik" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "A fájlenumerátor már le van zárva" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "A GFileIcon kódolás %d. verziója nem kezelhető" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "A GFileIcon bemeneti adatai rosszul formáltak" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Az adatfolyam nem támogatja a query_info-t" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Az adatfolyam nem támogatja a pozicionálást" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "A bemeneti adatfolyam csonkítása nem engedélyezett" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Az adatfolyam csonkítása nem engedélyezett" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Érvénytelen gépnév" @@ -1597,65 +1639,65 @@ msgstr "A HTTP proxy válasza túl nagy" msgid "HTTP proxy server closed connection unexpectedly." msgstr "A HTTP proxykiszolgáló váratlanul lezárta a kapcsolatot." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "A jelsorok száma hibás (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Nincs típus az osztálynévhez: %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "A(z) %s típus nem valósítja meg a GIcon interfészt" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "A típus (%s) nem tartalmaz osztályokat" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Rosszul formált verziószám: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "" "A(z) %s típus nem valósítja meg a from_tokens() függvényt a GIcon interfészen" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Az ikonkódolás megadott verziója nem kezelhető" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Nincs megadva cím" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "A(z) %u cím túl rövid a címhez" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "A címben az előtag hosszán túl is be vannak állítva bitek" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Nem dolgozható fel a(z) „%s” IP-cím maszkként" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Nincs elég hely a foglalat címének" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Nem támogatott foglalatcím" @@ -1669,7 +1711,7 @@ msgstr "A bemeneti adatfolyam nem valósítja meg az olvasást" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Az adatfolyam hátralévő művelettel rendelkezik" @@ -1685,7 +1727,7 @@ msgstr "Megtartás a fájllal áthelyezéskor" msgid "“version” takes no arguments" msgstr "a „version” nem vár argumentumot" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Használat:" @@ -1693,79 +1735,79 @@ msgstr "Használat:" msgid "Print version information and exit." msgstr "Verziószám kiírása és kilépés." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Parancsok:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Fájlok összefűzése a szabványos kimenetre" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Fájlok másolása" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Információk megjelenítése helyekről" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Alkalmazás indítása egy desktop fájlból" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "A helyek tartalmának felsorolása" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "A MIME-típus kezelőjének lekérése vagy beállítása" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Könyvtárak létrehozása" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Fájlok és könyvtárak változásainak figyelése" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "A helyek csatolása vagy leválasztása" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Fájlok áthelyezése" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Fájlok megnyitása az alapértelmezett alkalmazással" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Fájl átnevezése" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Fájlok törlése" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Szabványos bemenet olvasása és mentése" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Egy fájlattribútum beállítása" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Fájlok vagy könyvtárak áthelyezése a Kukába" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "A helyek tartalmának felsorolása egy fában" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Parancsok:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Részletes segítségért adja ki a %s parancsot.\n" @@ -1775,7 +1817,7 @@ msgid "Error writing to stdout" msgstr "Hiba a szabványos kimenetre íráskor" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1798,60 +1840,65 @@ msgstr "" "fájlok helyett GIO helyeket használ: megadható például helyként az\n" "smb://kiszolgáló/erőforrás/fájl.txt." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Nincsenek megadva helyek" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Nincs célkönyvtár" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Folyamat megjelenítése" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Kérdés felülírás előtt" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Minden attribútum megőrzése" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Meglévő célfájlok biztonsági mentése" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Soha ne kövesse a szimbolikus linkeket" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Alapértelmezett jogosultságok használata a célnál" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +#| msgid "Use default permissions for the destination" +msgid "Use default file modification timestamps for the destination" +msgstr "Alapértelmezett fájlmódosítási időbélyegek használata a célnál" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "%s / %s átvitele kész (%s/mp)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "FORRÁS" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "CÉL" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Fájlok áthelyezése a FORRÁSBÓL a CÉLBA." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1861,12 +1908,12 @@ msgstr "" "fájlok helyett GIO helyeket használ: megadható például helyként az\n" "smb://kiszolgáló/erőforrás/fájl.txt." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "%s cél nem könyvtár" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: felülírja a(z) „%s” fájlt? " @@ -1907,52 +1954,52 @@ msgstr "megjelenített név: %s\n" msgid "edit name: %s\n" msgstr "szerkeszthető név: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "név: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "típus: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "méret: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "rejtett\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "URI: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "helyi útvonal: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix csatolás: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Beállítható attribútumok:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Írható attribútumnévterek:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Információk megjelenítése helyekről." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2512,7 +2559,8 @@ msgstr "" "aktuális könyvtár)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "KÖNYVTÁR" @@ -2562,6 +2610,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "Az előállított forráskódhoz használt C azonosító neve" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "AZONOSÍTÓ" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "A cél C fordító (alapértelmezett: a CC környezeti változó)" @@ -3074,126 +3126,126 @@ msgstr "Hiba a(z) %s fájlrendszer-információinak lekérésekor: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "A(z) %s fájlt tartalmazó csatolás nem található" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Nem nevezhető át a gyökérkönyvtár" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Hiba a(z) %s fájl átnevezésekor: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "A fájl nem nevezhető át, a fájlnév már létezik" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Érvénytelen fájlnév" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Hiba a(z) %s fájl megnyitásakor: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Hiba a(z) %s fájl eltávolításakor: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Hiba a(z) %s fájl Kukába dobásakor: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Nem sikerült létrehozni a(z) %s Kuka könyvtárat: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nem található a felső szintű könyvtár a(z) %s kidobásához" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "A rendszer belső csatolásain a Kukába dobás nem támogatott" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "" "Nem található vagy nem hozható létre a(z) %s Kuka könyvtár a(z) %s " "kidobásához" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Nem sikerült létrehozni a(z) %s kukainformációs fájlját: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Nem lehet fájlrendszer-határokon át Kukába dobni a(z) %s fájlt" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nem lehet a Kukába dobni a(z) %s fájlt: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Nem lehet a Kukába dobni a(z) %s fájlt" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Hiba a(z) %s könyvtár létrehozásakor: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "A fájlrendszer nem támogatja a szimbolikus linkeket" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Hiba a(z) %s szimbolikus link létrehozásakor: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Hiba a(z) %s fájl áthelyezésekor: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "A könyvtár nem helyezhető át könyvtárba" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "A mentési fájl létrehozása meghiúsult" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Hiba a célfájl eltávolításakor: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "A csatolások közti áthelyezés nem támogatott" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nem lehet meghatározni %s lemezhasználatát: %s" @@ -3216,120 +3268,120 @@ msgstr "Érvénytelen kiterjesztett attribútumnév" msgid "Error setting extended attribute “%s”: %s" msgstr "Hiba a(z) „%s” kiterjesztett attribútum beállításakor: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (érvénytelen kódolás)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Hiba a(z) „%s” fájl információinak lekérésekor: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Hiba a fájlleíró információinak lekérésekor: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Érvénytelen attribútumtípus (a várt uint32 helyett)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Érvénytelen attribútumtípus (a várt uint64 helyett)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Érvénytelen attribútumtípus (a várt bájtkarakterlánc helyett)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Nem állíthatók be a szimbolikus linkek jogosultságai" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Hiba a jogosultságok beállításakor: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Hiba a tulajdonos beállításakor: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "a szimbolikus link nem lehet NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Hiba a szimbolikus link beállításakor: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Hiba a szimbolikus link beállításakor: a fájl nem szimbolikus link" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" "A(z) %2$lld UNIX időbélyeghez tartozó további %1$d nanoszekundum negatív" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "A(z) %2$lld UNIX időbélyeghez tartozó további %1$d nanoszekundum eléri az 1 " "másodpercet" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "A(z) %lld UNIX időbélyeg nem fér el 64 biten" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "A(z) %lld UNIX időbélyeg kívül esik a Windows által támogatott tartományon" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "A(z) „%s” fájlnév nem alakítható át UTF-16-as kódolásúra" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "A(z) „%s” fájl nem nyitható meg: Windows hiba %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "Hiba a(z) „%s” fájl módosítási vagy hozzáférési idejének beállításakor: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Hiba a módosítási vagy hozzáférési idő beállításakor: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "A SELinux környezet nem lehet NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "A SELinux nem engedélyezett ezen rendszeren" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Hiba a SELinux környezet beállításakor: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "A(z) %s attribútum beállítása nem támogatott" @@ -3382,7 +3434,7 @@ msgid "Error truncating file: %s" msgstr "Hiba a fájl csonkításakor: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Hiba a(z) %s fájl megnyitásakor: %s" @@ -3404,27 +3456,27 @@ msgstr "A fájlt külső program módosította" msgid "Error removing old file: %s" msgstr "Hiba a régi fájl eltávolításakor: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "A megadott GSeekType nem támogatott" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Érvénytelen keresési kérés" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "A GMemoryInputStream nem csonkítható" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "A memóriakimeneti adatfolyam nem méretezhető át" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "A memóriakimeneti adatfolyam átméretezése meghiúsult" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3432,32 +3484,32 @@ msgstr "" "Az írás feldolgozásához szükséges memória mérete nagyobb, mint az elérhető " "címtér" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Pozicionálási kérés az adatfolyam eleje elé" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Pozicionálási kérés az adatfolyam vége mögé" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "A csatolás nem valósítja meg az „unmount” függvényt" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "A csatolás nem valósítja meg az „eject” függvényt" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "A csatolás nem valósítja meg az „unmount” vagy az „unmount_with_operation” " @@ -3466,7 +3518,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "A csatolás nem valósítja meg az „eject” vagy az „eject_with_operation” " @@ -3475,34 +3527,34 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "A csatolás nem valósítja meg a „remount” függvényt" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "A csatolás nem valósítja meg a tartalomtípus meghatározását" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "A csatolás nem valósítja meg a tartalomtípus szinkron meghatározását" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "A gépnév („%s”) „[” karaktert tartalmaz „]” nélkül" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "A hálózat elérhetetlen" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "A gép elérhetetlen" @@ -3530,7 +3582,7 @@ msgstr "A Hálózatkezelő nem fut" msgid "NetworkManager version too old" msgstr "A Hálózatkezelő verziója túl régi" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "A kimeneti adatfolyam nem valósítja meg az írást" @@ -3543,38 +3595,38 @@ msgstr "A(z) %s részére átadott vektorok összege túl nagy" msgid "Source stream is already closed" msgstr "A forrás adatfolyam már le van zárva" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Meghatározatlan proxykeresési hiba" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Hiba a(z) „%s” feloldásakor: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "A(z) %s nincs megvalósítva" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Érvénytelen tartomány" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Az erőforrás nem létezik itt: „%s”" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Az erőforrás kicsomagolása meghiúsult itt: „%s”" @@ -3592,11 +3644,11 @@ msgstr "Az erőforrás nem könyvtár itt: „%s”" msgid "Input stream doesn’t implement seek" msgstr "A bemeneti adatfolyam nem valósítja meg a pozicionálást" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Elf FÁJLBAN erőforrásokat tartalmazó szakaszok felsorolása" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3607,15 +3659,15 @@ msgstr "" "felsorolása\n" "Ha az ÚTVONAL meg van adva, akkor csak az illeszkedő erőforrások felsorolása" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FÁJL [ÚTVONAL]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SZAKASZ" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3629,15 +3681,15 @@ msgstr "" "felsorolása\n" "A részletek közé a szakasz, méret és tömörítés tartozik" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Erőforrásfájl kibontása a szabványos kimenetre" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FÁJL ÚTVONAL" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3665,7 +3717,7 @@ msgstr "" "Részletes segítségért adja ki a „gresource help PARANCS” parancsot.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3680,19 +3732,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SZAKASZ Egy elhagyható elf szakasznév\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " PARANCS A megmagyarázandó (elhagyható) parancs\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FÁJL Egy elf fájl (bináris vagy megosztott programkönyvtár)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3701,19 +3753,19 @@ msgstr "" "\n" " vagy lefordított erőforrásfájl\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[ÚTVONAL]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " ÚTVONAL Egy elhagyható erőforrás-útvonal (részleges is lehet)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "ÚTVONAL" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " ÚTVONAL Egy erőforrás-útvonal\n" @@ -3945,215 +3997,215 @@ msgstr "Üres sémanevet adott meg\n" msgid "No such key “%s”\n" msgstr "Nincs „%s” kulcs\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Érvénytelen foglalat, nincs előkészítve" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Érvénytelen foglalat, az előkészítés meghiúsulásának oka: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "A foglalat már le van zárva" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "A foglalat I/O túllépte az időkorlátot" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "GSocket létrehozása fájlleíróból: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Nem sikerült létrehozni foglalatot: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Ismeretlen családot adtak meg" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Ismeretlen protokollt adtak meg" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "A datagram műveletek nem használhatóak nem-datagram foglalaton." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "A datagram műveletek nem használhatóak olyan foglalaton, amelyre időtúllépés " "van beállítva." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "nem kérhető le a helyi cím: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "nem kérhető le a távoli cím: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "nem lehet figyelni: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Hiba a(z) %s címhez csatlakozáskor: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Hiba a multicast csoporthoz csatlakozáskor: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Hiba a multicast csoport elhagyásakor: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "A forrásspecifikus multicast nem támogatott" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Nem támogatott foglalatcsalád" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "A forrásspecifikus nem egy IPv4-cím" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Az interfésznév túl hosszú" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Interfész nem található: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Az IPv4 forrásspecifikus multicast nem támogatott" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Az IPv6 forrásspecifikus multicast nem támogatott" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Hiba a kapcsolat elfogadásakor: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Csatlakozás folyamatban" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Nem lehet lekérni a függőben lévő hibát: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Hiba az adatok fogadásakor: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Hiba az adatok küldésekor: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Nem sikerült leállítani a foglalatot: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Hiba a foglalat lezárásakor: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Várakozás a foglalat állapotára: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Nem sikerült elküldeni az üzenetet: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Az üzenetvektorok túl nagyok" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Hiba az üzenet küldésekor: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "A GSocketControlMessage nem támogatott Windowson" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Hiba az üzenet fájl eltávolítása fogadásakor: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nem sikerült olvasni a foglalat hitelesítési adatait: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "a g_socket_get_credentials nincs megvalósítva erre az OS-re" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Nem sikerült kapcsolódni a(z) %s proxy kiszolgálóhoz: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Nem sikerült kapcsolódni a következőhöz: %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Nem sikerült kapcsolódni: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "A proxyzás nem TCP kapcsolaton keresztül nem támogatott." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "A proxyprotokoll („%s”) nem támogatott." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "A figyelő már le van zárva" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "A hozzáadott foglalat le van zárva" @@ -4243,97 +4295,97 @@ msgstr "A SOCKSv5 proxy nem támogatja a megadott címtípust." msgid "Unknown SOCKSv5 proxy error." msgstr "Ismeretlen SOCKSv5 proxy hiba." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Nem sikerült csővezetéket készíteni a gyermekfolyamattal (%s) való " "kommunikációhoz" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "A csővezetékek nem támogatottak ezen a platformon" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "A GThemedIcon kódolás %d. verziója nem kezelhető" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Nem találhatók érvényes címek" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Hiba a(z) „%s” fájl fordított feloldásakor: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "" "Hiba a(z) %s DNS-rekord feldolgozásakor: helytelenül formázott DNS-csomag" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Nincs kért típusú DNS-rekord ehhez: „%s”" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Ideiglenesen nem oldható fel: „%s”" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Hiba a(z) „%s” feloldásakor" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Helytelenül formázott DNS-csomag" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Nem sikerült feldolgozni a(z) „%s” DNS válaszát: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Nem található PEM-kódolású személyes kulcs" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Nem fejthető vissza a PEM-kódolású személyes kulcs" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Nem dolgozható fel a PEM-kódolású személyes kulcs" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Nem található PEM-kódolású tanúsítvány" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Nem dolgozható fel a PEM-kódolású tanúsítvány" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "A jelenlegi TLS háttérprogram nem támogatja a PKCS #12 tanúsítványokat" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Ez a GTlsBackend nem támogatja a PKCS #11 tanúsítványok létrehozását" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4343,7 +4395,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4351,140 +4403,153 @@ msgstr "" "Több helytelen jelszót adott meg, és a további sikertelen próbálkozások után " "hozzáférése zárolásra kerül." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "A megadott jelszó helytelen." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Az FL küldése nem támogatott" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "A várt 1 vezérlőüzenet helyett %d érkezett" msgstr[1] "A várt 1 vezérlőüzenet helyett %d érkezett" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Váratlan típusú kiegészítő adatok" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "A várt egy fájlleíró helyett %d érkezett\n" msgstr[1] "A várt egy fájlleíró helyett %d érkezett\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Érvénytelen fájlleíró érkezett" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Az FL fogadása nem támogatott" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Hiba a hitelesítési adatok küldésekor: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" "Hiba a SO_PASSCRED engedélyezettségének ellenőrzésekor a foglalathoz: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Hiba a SO_PASSCRED engedélyezésekor: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "A hitelesítési adatok fogadásához várt egyetlen bájt helyett nulla bájt lett " "beolvasva" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "A program nem várt vezérlőüzenetet, de %d érkezett" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Hiba a SO_PASSCRED letiltásakor: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Hiba a fájlleíróból olvasáskor: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Hiba a fájlleíró lezárásakor: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Fájlrendszer gyökere" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Hiba a fájlleíróba íráskor: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" "Az absztrakt UNIX tartományfoglalat-címek nem támogatottak ezen a rendszeren" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "a kötet nem valósítja meg a kiadást" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "" "a kötet nem valósítja meg a kiadást vagy a eject_with_operation függvényt" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Az alkalmazásobjektumban lévő „%s” alkalmazásnak nincsenek igéi" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"Az alkalmazásobjektumban lévő „%s” alkalmazásnak és „%s” kezelőnek nincsenek " +"igéi" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Hiba a leíróból való olvasáskor: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Hiba a leíró lezárásakor: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Hiba a leíróba íráskor: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Nincs elég memória" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Belső hiba: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "További bemenet szükséges" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Érvénytelen tömörített adatok" @@ -4512,152 +4577,309 @@ msgstr "D-Bus szolgáltatás futtatása" msgid "Wrong args\n" msgstr "Hibás argumentumok\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to open ‘%s’: %s" +msgstr "Nem sikerült a(z) „%s” megnyitása: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +#| msgid "Could not create network monitor: %s" +msgid "Error: Could not write the whole output: %s" +msgstr "Hiba: nem sikerült kiírni a teljes kimenetet: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +#| msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Hiba: nem sikerült a(z) „%s” átnevezése erre: „%s”: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Könyvtárak felvétele a GIR keresési útvonalába" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Kimeneti fájl" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Osztott programkönyvtár" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Hibakeresési üzenetek megjelenítése" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Bőbeszédű üzenetek megjelenítése" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +#| msgid "Show program version and exit" +msgid "Show program’s version number and exit" +msgstr "A program verziószámának megjelenítése és kilépés" + +#: girepository/compiler/compiler.c:175 +#, c-format +#| msgid "Error parsing parameter %d: %s\n" +msgid "Error parsing arguments: %s" +msgstr "Hiba az argumentumok feldolgozásakor: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Pontosan egy bemeneti fájlt adjon meg" + +#: girepository/compiler/compiler.c:218 +#, c-format +#| msgid "Error opening file “%s”: %s" +msgid "Error parsing file ‘%s’: %s" +msgstr "Hiba a(z) „%s” fájl feldolgozásakor: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +#| msgid "Failed to load info for handler “%s”" +msgid "Failed to build typelib for module ‘%s’" +msgstr "Nem sikerült a típuskönyvtár összeállítása a(z) „%s” modulhoz" + +#: girepository/compiler/compiler.c:245 +#, c-format +#| msgid "Unable to load ‘%s‘: %s" +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Érvénytelen típuskönyvtár a(z) „%s” modulhoz: %s" + +#: girepository/decompiler/decompiler.c:54 +#| msgid "Show extra information" +msgid "Show all available information" +msgstr "Összes elérhető információ megjelenítése" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +#| msgid "Failed to fork (%s)" +msgid "Failed to parse: %s" +msgstr "Nem sikerült feldolgozni: %s" + +#: girepository/decompiler/decompiler.c:87 +#| msgid "Show hidden files" +msgid "No input files" +msgstr "Nincsenek bemeneti fájlok" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to read ‘%s’: %s" +msgstr "Nem sikerült a(z) „%s” olvasása: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Nem sikerült létrehozni a(z) „%s” típuskönyvtárat: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +#| msgid "Failed to allocate memory" +msgid "Failed to load typelib: %s" +msgstr "Nem sikerült betölteni a típuskönyvtárat: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Figyelmeztetés: %u modul kihagyva" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "A vizsgálandó típuskönyvtár-verzió" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERZIÓ" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "A típuskönyvtárhoz szükséges osztott programkönyvtárak felsorolása" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "" +"A vizsgált típuskönyvtárhoz szükséges egyéb típuskönyvtárak felsorolása" + +#: girepository/inspector/inspector.c:75 +#| msgid "The attributes to get" +msgid "The typelib to inspect" +msgstr "A vizsgálandó típuskönyvtár" + +#: girepository/inspector/inspector.c:75 +#| msgid "NAME" +msgid "NAMESPACE" +msgstr "NÉVTÉR" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- GI típuskönyvtár vizsgálata" + +#: girepository/inspector/inspector.c:86 +#, c-format +#| msgid "Failed to read from file “%s”: %s" +msgid "Failed to parse command line options: %s" +msgstr "Nem sikerült feldolgozni a parancssori kapcsolókat: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Pontosan egy névteret adjon meg" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" +"Adja meg a --print-shlibs és a --print-typelibs egyikét vagy mindkettőt" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" -msgstr "Váratlan attribútum („%s”) a(z) „%s” elemhez" +msgstr "Váratlan „%s” attribútum a(z) „%s” elemhez" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "A(z) „%2$s” elem „%1$s” attribútuma nem található" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" -msgstr "Váratlan címke: „%s” a várt „%s” helyett" +msgstr "Váratlan „%s” címke, „%s” címke az elvárt" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" -msgstr "Váratlan címke: „%s” a következőn belül: „%s”" +msgstr "Váratlan „%s” címke a következőn belül: „%s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Érvénytelen „%s” dátum vagy idő a könyvjelzőfájlban" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Az adatkönyvtárakban nem található érvényes könyvjelzőfájl" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Már létezik könyvjelző a következő URI címhez: „%s”" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nem található könyvjelző a következő URI címhez: „%s”" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Nincs MIME típus meghatározva a következő URI könyvjelzőjéhez: „%s”" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Nincs magán jelző meghatározva a következő URI könyvjelzőjéhez: „%s”" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Nincsenek csoportok beállítva a következő URI könyvjelzőjéhez: „%s”" # FIXME: hol jön ez elő? -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "" "Nincs „%s” nevű alkalmazás regisztrálva a következő könyvjelzőjéhez: „%s”" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "" "Nem sikerült kiterjeszteni a(z) „%s” végrehajtási sort a(z) „%s” URL címmel" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Nem ábrázolható karakter az átalakítási bemenetben" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Részleges karaktersorozat a bemenet végén" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Nem alakítható át a tartalék „%s” a(z) „%s” kódkészletre" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Beágyazott NUL bájt az átalakítás bemenetében" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Beágyazott NUL bájt az átalakítás kimenetében" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "A(z) „%s” URI nem abszolút, a „file” sémát használó URI" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "A(z) „%s” URI érvénytelen" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "A(z) „%s” gépneve érvénytelen" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "" "A(z) „%s” URI érvénytelen, escape sorozatként megadott karaktereket tartalmaz" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "A(z) „%s” elérési út neve nem abszolút útvonal" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%Y. %b. %-e. %a. %H:%M:%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%Y. %m. %d." #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%H:%M:%S" @@ -4678,62 +4900,62 @@ msgstr "%H:%M:%S" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Január" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Február" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Március" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Április" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Május" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Június" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Július" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Augusztus" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Szeptember" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Október" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "November" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "December" @@ -4755,132 +4977,132 @@ msgstr "December" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Febr" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Már" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Ápr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Máj" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jún" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Júl" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Aug" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Szept" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Okt" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Hétfő" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Kedd" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Szerda" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Csütörtök" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Péntek" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Szombat" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Vasárnap" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Hé" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Ke" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Sze" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Csü" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Pé" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Szo" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Va" @@ -4902,62 +5124,62 @@ msgstr "Va" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "január" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "február" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "március" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "április" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "május" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "június" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "július" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "augusztus" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "szeptember" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "október" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "november" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "december" @@ -4979,194 +5201,203 @@ msgstr "december" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "jan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "febr" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "márc" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "ápr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "máj" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "jún" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "júl" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "aug" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "szept" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "okt" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "dec" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "DE" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "DU" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Hiba a(z) „%s” könyvtár megnyitásakor: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Nem sikerült %lu bájtot lefoglalni a(z) „%s” fájl olvasásához" -msgstr[1] "Nem sikerült %lu bájtot lefoglalni a(z) „%s” fájl olvasásához" +#| msgid "Could not allocate %lu byte to read file “%s”" +#| msgid_plural "Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "Nem sikerült a(z) %s lefoglalása a(z) „%s” fájl olvasásához" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Hiba a(z) „%s” fájl olvasásakor: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" -msgstr "A fájl („%s”) túl nagy" +msgstr "A(z) „%s” fájl túl nagy" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Nem sikerült olvasni a(z) „%s” fájlból: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" "Nem sikerült lekérni a(z) „%s” fájl attribútumait. Az fstat() sikertelen: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Nem sikerült megnyitni a(z) „%s” fájlt. Az fdopen() sikertelen: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "Nem sikerült átnevezni a(z) „%s” fájlt erre: „%s”. A g_rename() sikertelen: " "%s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +#| msgid "Failed to write file “%s”: write() failed: %s" +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Nem sikerült írni a(z) „%s” fájlt: az ftruncate() sikertelen: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Nem sikerült írni a(z) „%s” fájlt: a write() sikertelen: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Nem sikerült írni a(z) „%s” fájlt: az fsync() sikertelen: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "A létező „%s” fájl nem távolítható el: a g_unlink() sikertelen: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "A(z) „%s” sablon érvénytelen, „%s” nem lehet benne" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "A(z) „%s” sablon nem tartalmaz XXXXXX karaktersorozatot" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Nem sikerült kiolvasni a(z) „%s” szimbolikus linket: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Az átalakító a(z) „%s” elemről „%s” elemre nem nyitható meg: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_line_string-ben" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Át nem alakított adatok maradtak az olvasási pufferben" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "A csatorna töredék karakterrel ér véget" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Nem lehet nyers (raw) olvasást végezni a g_io_channel_read_to_end-ben" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "A keresési könyvtárakban nem található érvényes kulcsfájl" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Nem szabályos fájl" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5174,52 +5405,52 @@ msgstr "" "A kulcsfájl tartalmazza a(z) „%s” sort, amelyik nem egy kulcs-érték pár, " "csoport, vagy megjegyzés" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Érvénytelen csoportnév: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "A kulcsfájl nem csoporttal kezdődik" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Érvénytelen kulcsnév: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "A kulcsfájl a nem támogatott „%s” kódolást tartalmazza" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "A kulcsfájlból hiányzik a(z) „%s” csoport" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "A kulcsfájl nem tartalmazza a(z) „%s” kulcsot a(z) „%s” csoportban." -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "A kulcsfájl tartalmazza a(z) „%s” kulcsot „%s” értékkel, amelyik azonban nem " "UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "A kulcsfájl tartalmazza a(z) „%s” kulcsot, amelynek értéke nem értelmezhető." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5228,38 +5459,38 @@ msgstr "" "A kulcsfájl tartalmazza a(z) „%s” kulcsot a(z) „%s” csoportban, amelynek " "értéke nem értelmezhető." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "A(z) „%s” kulcs a(z) „%s” csoportban „%s” értékkel rendelkezik a várt %s " "helyett" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "A kulcsfájl escape sorozattal megadott karaktert tartalmaz a sor végén" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "A kulcsfájl érvénytelen escape sorozatot tartalmaz („%s”)" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "A(z) „%s” érték nem értelmezhető számként." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "A(z) „%s” egész érték a tartományon kívülre esik" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "A(z) „%s” érték nem értelmezhető lebegőpontos számként." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "A(z) „%s” érték nem értelmezhető logikai értékként." @@ -5281,32 +5512,32 @@ msgstr "Nem sikerült leképezni a(z) %s%s%s%s fájlt: Az mmap() sikertelen: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Nem sikerült megnyitni a(z) „%s” fájlt: az open() sikertelen: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Hiba a(z) %d. sor %d. karakterénél: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Érvénytelen UTF-8 kódolású szöveg a névben - nem érvényes „%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "A(z) „%s” nem érvényes név" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "A(z) „%s” nem érvényes név: „%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Hiba a(z) %d. sorban: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5315,7 +5546,7 @@ msgstr "" "Nem sikerült feldolgozni ezt: „%-.*s”. Valószínűleg számjegy lett volna egy " "karakterhivatkozáson (mint az ê) belül - lehet, hogy túl nagy a számjegy" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5324,23 +5555,23 @@ msgstr "" "A karakterhivatkozás nem pontosvesszővel ért véget; valószínűleg egy &-jelet " "használt anélkül, hogy entitást akart volna kezdeni - írja & formában." -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "A(z) „%-.*s” karakterhivatkozás nem engedélyezett karaktert kódol" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Üres „&;” entitás; az érvényes entitások: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "A(z) „%-.*s” entitásnév ismeretlen" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5348,11 +5579,11 @@ msgstr "" "Az entitás neve nem pontosvesszővel ért véget; valószínűleg egy &-jelet " "használt anélkül, hogy entitást akart volna kezdeni - írja & formában." -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "A dokumentumnak egy elemmel kell kezdődnie (például: )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5361,7 +5592,7 @@ msgstr "" "A(z) „%s” nem érvényes karakter a „<” karakter után; elem neve nem kezdődhet " "vele" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5370,12 +5601,12 @@ msgstr "" "Furcsa karakter („%s”), „>” karakternek kellett volna jönnie, hogy lezárja " "a(z) „%s” üres elemcímkét" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Túl sok attribútum a(z) „%s” elemben" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5383,7 +5614,7 @@ msgstr "" "Furcsa karakter („%s”), „=” karakternek kellett volna jönnie a(z) „%s” elem " "„%s” attribútumneve után" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5394,7 +5625,7 @@ msgstr "" "„%s” elem kezdő címkéje után, esetleg egy attribútumnak; lehet, hogy " "érvénytelen karaktert használt az attribútum nevében" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5403,7 +5634,7 @@ msgstr "" "Furcsa karakter („%s”), egy nyitó idézőjelnek kellene jönnie az " "egyenlőségjel után, ha értéket ad a(z) „%s” attribútumnak „%s” elemben" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”." -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "A(z) „%s” elem le lett lezárva, jelenleg egy elem sincs nyitva" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "A(z) „%s” elem le lett lezárva, de a jelenleg nyitott elem a(z) „%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "A dokumentum üres volt, vagy csak üres hely karaktereket tartalmazott" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" "A dokumentum váratlanul véget ért egy nyitott hegyes zárójel („<”) után" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5449,7 +5680,7 @@ msgstr "" "A dokumentum váratlanul véget ért, pedig még nyitva vannak elemek - „%s” az " "utoljára megnyitott elem" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5458,19 +5689,19 @@ msgstr "" "A dokumentum váratlanul véget ért; a(z) <%s/> elemet lezáró hegyes " "zárójelnek kellett volna következnie" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "A dokumentum váratlanul véget ért egy elemnéven belül" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "A dokumentum váratlanul véget ért egy attribútumnéven belül" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "A dokumentum váratlanul véget ért egy elemnyitó címkén belül" -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5478,265 +5709,265 @@ msgstr "" "A dokumentum váratlanul véget ért egy az attribútumnevet követő " "egyenlőségjel után; az attribútum értéke nem lett megadva" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "A dokumentum váratlanul véget ért egy attribútumértéken belül" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "A dokumentum váratlanul véget ért a(z) „%s” elem lezáró címkéjén belül" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "A dokumentum váratlanul véget ért egy nem nyitott elem lezáró címkéjén belül" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "A dokumentum váratlanul véget ért egy megjegyzésen vagy feldolgozási " "utasításon belül" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[KAPCSOLÓ…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Súgólehetőségek:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Súgólehetőségek megjelenítése" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Minden súgólehetőség megjelenítése" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Alkalmazás kapcsolói:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Kapcsolók:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nem dolgozható fel a(z) „%s” egész érték a következőhöz: %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "A(z) „%s” egész érték a tartományon kívülre esik a következőhöz: %s" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Nem dolgozható fel a(z) „%s” dupla hosszúságú érték a következőhöz: %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "" "A(z) „%s” dupla hosszúságú érték a tartományon kívülre esik a következőhöz: " "%s" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Hiba a kapcsoló feldolgozásakor: %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Hiányzó paraméter a következőhöz: %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Ismeretlen kapcsoló: %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "sérült objektum" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "elfogyott a memória" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "belső hiba" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" "a minta a részleges mintaillesztés esetén nem támogatott elemeket tartalmaz" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "a visszahivatkozások használata feltételekként nem támogatott a részleges " "mintaillesztéshez" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "az ismétlési korlát elérve" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "hibás eltolás" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekurzív ciklus" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "illesztési mód lett kérve, amely nem lett lefordítva a JIT-hez" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "ismeretlen hiba" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ a minta végén" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c a minta végén" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "ismeretlen karakter következik a \\ után" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "a számok nincsenek sorrendben a {} kvantálóban" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "a szám túl nagy a a {} kvantálóban" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "a karakterosztály befejező ] jele hiányzik" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "érvénytelen escape-sorozat a karakterosztályban" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "a tartomány kívül esik a karakterosztály nagyságán" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nincs mit ismételni" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "ismeretlen karakter a (? vagy (?- után" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "a POSIX elnevezett osztályok csak osztályon belül támogatottak" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "a POSIX leválogató elemek nem támogatottak" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "hiányzó befejező )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "hivatkozás nem létező almintára" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "a megjegyzés utáni ) hiányzik" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "a reguláris kifejezés túl nagy" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "hibásan formázott szám vagy név a (?( után" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "a lookbehind kijelentés nem rögzített hosszúságú" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "a feltételes csoport kettőnél több ágat tartalmaz" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "a (?( után kijelentésnek kellene állnia" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "számozott hivatkozás nem lehet nulla" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "ismeretlen POSIX osztálynév" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "a \\x{...} sorozaton belüli karakterérték túl nagy" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "A \\C nem engedélyezett a lookbehind kijelentésben" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "hiányzó befejező az alminta nevében" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "két elnevezett alminta neve azonos" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "rosszul formázott \\P vagy \\p sorozat" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "ismeretlen tulajdonságnév a \\P vagy \\p után" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "az alminta neve túl hosszú (legfeljebb 32 karakter)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "túl sok elnevezett alminta (legfeljebb 10 000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "az oktális érték nagyobb, mint \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "a DEFINE csoport több ágat tartalmaz" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "inkonzisztens NEWLINE beállítások" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5744,237 +5975,237 @@ msgstr "" "a \\g után nem egy (szögletes) zárójelezett név, idézőjelezett név vagy szám " "vagy egyszerű szám áll" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "" "nem engedélyezett argumentum a (*ACCEPT), (*FAIL) vagy (*COMMIT) egyikéhez " "sem" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) ismeretlen" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "a szám túl nagy" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "hiányzó almintanév a (?& után" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "ugyanazon szám almintáihoz nem engedélyezettek különböző nevek" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "a (*MARK) után argumentumnak kell állnia" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "a \\c után ASCII karakternek kell állnia" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "a \\k után nem egy (szögletes) zárójelezett vagy idézőjelezett név áll" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "a \\N nem támogatott osztályban" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "a név túl hosszú a (*MARK), (*PRUNE), (*SKIP) vagy (*THEN) egyikében" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "kódtúlcsordulás" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "ismeretlen karakter a (?P után" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "a fordítási munkaterület túlcsordult" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "a korábban ellenőrzött hivatkozott alminta nem található" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Hiba a(z) %s reguláris kifejezés illesztésekor: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "A PRCE programkönyvtár UTF-8 támogatás nélkül lett fordítva" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "A PRCE programkönyvtár inkompatibilis beállításokkal lett fordítva" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "Hiba a(z) „%s” reguláris kifejezés fordításakor a(z) %s karakternél: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" -msgstr "a program hexadecimális számjegyet vagy „}” jelet várt" +msgstr "hexadecimális számjegy vagy „}” jel az elvárt" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" -msgstr "a program hexadecimális számjegyet várt" +msgstr "hexadecimális számjegy az elvárt" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "hiányzó „<” jel a szimbolikus hivatkozásban" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "befejezetlen szimbolikus hivatkozás" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "nulla hosszúságú szimbolikus hivatkozás" -#: glib/gregex.c:2983 -msgid "digit expected" -msgstr "re rendszer számjegyet várt" - #: glib/gregex.c:3001 +msgid "digit expected" +msgstr "számjegy az elvárt" + +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "illegális szimbolikus hivatkozás" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "a záró „\\” helye nem megfelelő" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "ismeretlen escape sorozat" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "Hiba a(z) „%s” helyettesítőszöveg elemzésekor a(z) %lu. karakternél: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Az idézett szöveg nem idézőjellel kezdődik" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Pár nélküli idézőjel a parancssorban vagy más, parancsértelmezőből idézett " "szövegben" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "A szöveg egy „\\” karakter után véget ért. (A szöveg: „%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "A szöveg véget ért, mielőtt %c idézőjelpárja meglett volna. (A szöveg: „%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "" "A szöveg üres volt (vagy legfeljebb üres hely karaktereket tartalmazott)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nem sikerült adatokat olvasni a gyermekfolyamatból (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Váratlan hiba egy gyermekfolyamatból történő adatolvasás közben (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Váratlan hiba a waitpid()-ben (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "A gyermekfolyamat a következő kóddal lépett ki: %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "A gyermekfolyamat kilőve %ld szignállal" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "A gyermekfolyamat megállítva %ld szignállal" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "A gyermekfolyamat abnormálisan lépett ki" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Nem sikerült olvasni a gyermek csővezetékből (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Nem sikerült a(z) „%s” gyermekfolyamat végrehajtása (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Nem sikerült folyamatot indítani (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Nem sikerült átváltani a(z) „%s” könyvtárra (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Nem sikerült a gyermekfolyamat („%s”) végrehajtása (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Nem sikerült megnyitni a fájlt a fájlleíró ismételt leképezéséhez (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Nem sikerült kettőzni a gyermekfolyamat fájlleíróját (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Nem sikerült a gyermekfolyamat elindítása (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Nem sikerült lezárni a gyermekfolyamat fájlleíróját (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Ismeretlen hiba a gyermekfolyamat („%s”) végrehajtásakor" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Nem sikerült elég adatot kiolvasni a gyermek pid csővezetékből (%s)" @@ -6031,78 +6262,78 @@ msgstr "" "Váratlan hiba, miközben a g_io_channel_win32_poll() adatokat olvasott egy " "gyermekfolyamatból" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Az üres karakterlánc nem szám" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "„%s” nem érvényes név" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "A(z) „%s” a(z) [%s, %s] intervallumon kívül esik." -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "„%s” nem érvényes név" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Érvénytelen %-kódolás az URI-ban" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Nem megengedett karakter az URI-ban" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Nem UTF-8 karakterek az URI-ban" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Érvénytelen „%.*s” IPv6-cím az URI-ban" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Nem megengedett „%.*s” kódolt IP-cím az URI-ban" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nem megengedett „%.*s” nemzetköziesített gépnév az URI-ban" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "A(z) „%.*s” port nem dolgozható fel az URI-ban" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Az URI-ban lévő „%.*s” port a tartományon kívülre esik" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "A(z) „%s” URI nem abszolút URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "A(z) „%s” URI-ban nincs gép összetevő" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "Az URI nem abszolút, és alap URI nem lett megadva" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Hiányzó „=” és paraméterérték" @@ -6183,65 +6414,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" diff --git a/po/id.po b/po/id.po index 6ba3ff6..78ec005 100644 --- a/po/id.po +++ b/po/id.po @@ -4,14 +4,14 @@ # # Mohammad DAMT , 2005. # Dirgita , 2010, 2012. -# Andika Triwidada , 2010-2013, 2015, 2018, 2022, 2023. +# Andika Triwidada , 2010-2013, 2015, 2018, 2022-2024. # Kukuh Syafaat , 2017-2023. msgid "" msgstr "" "Project-Id-Version: glib main\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-06 04:18+0000\n" -"PO-Revision-Date: 2023-09-06 13:33+0700\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-14 09:23+0000\n" +"PO-Revision-Date: 2024-02-25 13:40+0700\n" "Last-Translator: Andika Triwidada \n" "Language-Team: Indonesian \n" "Language: id\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -40,36 +40,40 @@ msgstr "Gagal menemukan aplikasi bawaan untuk jenis konten '%s'" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Gagal menemukan aplikasi bawaan untuk Skema URI '%s'" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Opsi GAplikasi:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Tunjukkan opsi GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Masuk mode layanan GApplication (pakai dari berkas layanan D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Timpa ID aplikasi" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Mencetak versi aplikasi" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Ganti instance yang berjalan" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Cetak bantuan" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[PERINTAH]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Cetak versi" @@ -124,7 +128,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "PERINTAH" @@ -138,7 +142,7 @@ msgstr "Identifier aplikasi dalam format D-Bus (mis: org.example.viewer)" #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 msgid "FILE" msgstr "BERKAS" @@ -162,7 +166,7 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Parameter opsional untuk pemanggilan aksi, dalam format GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -176,12 +180,12 @@ msgstr "" msgid "Usage:\n" msgstr "Cara pakai:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumen:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARG...]" @@ -274,78 +278,78 @@ msgstr "" "perintah tak dikenal: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Nilai cacah yang dilewatkan ke %s terlalu besar" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Seek tak didukung pada stream basis" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Tak bisa memenggal GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Stream telah ditutup" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Pemenggalan tak didukung pada stream basis" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operasi dibatalkan" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Objek tak valid, tak diinisialisasi" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Rangkaian bita tak lengkap dalam input" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Tak cukup ruang di tujuan" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Rangkaian bita dalam input konversi tidak benar" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Galat ketika konversi: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Inisialisasi yang dapat dibatalkan tak didukung" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Konversi dari gugus karakter \"%s\" ke \"%s\" tak didukung" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Tak bisa membuka pengubah dari \"%s\" ke \"%s\"" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "tipe %s" @@ -359,41 +363,41 @@ msgstr "Tipe tak dikenal" msgid "%s filetype" msgstr "tipe berkas %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials berisi data yang tidak valid" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials tak diimplementasikan di OS ini" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Tidak ada dukungan GCredentials bagi platform Anda" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials tak memuat suatu ID proses di OS ini" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Pemalsuan kredensial tak diimplementasikan di OS ini" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Akhir stream terlalu dini, tak diharapkan" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Kunci \"%s\" tak didukung pada entri alamat \"%s\"" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Kombinasi pasangan kunci/nilai tanpa arti di entri alamat \"%s\"" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -402,28 +406,28 @@ msgstr "" "Alamat \"%s\" tak valid (perlu hanya salah satu dari path, dir, tmpdir, atau " "kunci abstrak)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Galat dalam alamat \"%s\" — atribut \"%s\" salah bentuk" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Transport \"%s\" tak dikenal atau tak didukung bagi alamat \"%s\"" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Elemen alamat \"%s\" tak memuat titik dua (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Nama transport dalam elemen alamat “%s” tidak boleh kosong" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -432,7 +436,7 @@ msgstr "" "Pasangan kunci/nilai %d, \"%s\", dalam elemen alamat \"%s\" tak memuat tanda " "sama dengan" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -440,7 +444,7 @@ msgstr "" "Pasangan kunci/nilai %d, \"%s\", dalam elemen alamat \"%s\" tak boleh " "memiliki kunci kosong" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -449,7 +453,7 @@ msgstr "" "Galat saat membongkar kunci atau nilai dalam pasangan Key/Value %d, \"%s\", " "dalam elemen alamat \"%s\"" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -458,74 +462,74 @@ msgstr "" "Galat dalam alamat \"%s\" — transport unix memerlukan hanya satu dari kunci " "\"path\" atau \"abstract\" untuk ditata" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Galat dalam alamat \"%s\" — atribut host kurang atau salah bentuk" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Galat dalam alamat \"%s\" — atribut portt kurang atau salah bentuk" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "Galat di alamat \"%s\" — atribut berkas nonce kurang atau salah bentuk" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Galat saat meluncurkan otomatis: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Galat saat membuka berkas nonce \"%s\": %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Galat saat membaca berkas nonce \"%s\": %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Galat saat membaca berkas nonce \"%s\", berharap 16 bita, mendapat %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Galat saat menulis isi dari berkas nonce \"%s\" ke stream:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Tidak ada alamat yang diberikan" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Tak bisa spawn suatu bus pesan ketika AT_SECURE ditata" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Tak bisa spawn suatu bus pesan tanpa id-mesin: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Tak bisa meluncurkan mandiri D-Bus tanpa $DISPLAY X11" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Galat saat spawn baris perintah \"%s\": " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Tak bisa menentukan alamat bus sesi (tidak diimplementasi bagi OS ini)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -534,7 +538,7 @@ msgstr "" "Tak bisa menentukan alamat bus dari variabel lingkungan " "DBUS_STARTER_BUS_TYPE — nilai tak dikenal \"%s\"" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -542,21 +546,21 @@ msgstr "" "Tak bisa menentukan alamat bus karena variabel lingkungan " "DBUS_STARTER_BUS_TYPE tak diisi" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Tipe bus %d tak dikenal" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Ketiadaan isi yang tak diharapkan ketika membaca suatu baris" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" "Ketiadaan isi yang tak diharapkan ketika membaca suatu baris (secara aman)" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -564,15 +568,15 @@ msgstr "" "Menghabiskan semua mekanisme autentikasi yang tersedia (dicoba: %s) " "(tersedia: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Ketiadaan isi yang tak diharapkan ketika membaca suatu bita" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "ID Pengguna harus sama untuk rakan (peer) dan peladen" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Dibatalkan melalui GDBusAuthObserver::authorize-authenticated-peer" @@ -593,13 +597,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Galat saat membuat direktori \"%s\": %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operasi tak didukung" @@ -664,15 +668,15 @@ msgstr "Galat saat membuka gantungan kunci \"%s\" untuk ditulisi: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Selain itu, melepas kunci bagi \"%s\" juga gagal: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Sambungan tertutup" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Kehabisan waktu" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -765,61 +769,74 @@ msgstr "Subtree telah diekspor bagi %s" msgid "Object does not exist at path “%s”" msgstr "Objek tidak ada di path \"%s\"" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s pesan: %s bidang header tidak valid; mengharapkan nilai dengan tipe '%s'" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s pesan: %s bidang header kurang atau tidak valid" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s pesan: bidang header TIDAK VALID diberikan" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s pesan: bidang header PATH menggunakan nilai cadangan /org/freedesktop/" +"DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s pesan: bidang header INTERFACE tidak berisi nama antarmuka yang valid" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s pesan: bidang header INTERFACE menggunakan nilai cadangan org.freedesktop." +"DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s pesan: bidang header MEMBER tidak berisi nama anggota yang valid" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s pesan: bidang header ERROR_NAME tidak berisi nama kesalahan yang valid" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "jenisnya INVALID" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Pesan METHOD_CALL: ruas header PATH atau MEMBER kurang atau tidak valid" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "Pesan METHOD_RETURN: ruas header REPLY_SERIAL kurang atau tidak valid" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Pesan ERROR: ruas header REPLY_SERIAL atau ERRORN_NAME kurang atau tidak " -"valid" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Pesan SIGNAL: ruas header PATH, INTERFACE, atau MEMBER kurang atau tidak " -"valid" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Pesan SIGNAL: ruas header PATH memakai nilai khusus /org/freedesktop/DBus/" -"Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Pesan SIGNAL: ruas header INTERFACE memakai nilai khusus org.freedesktop." -"DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Ingin membaca %lu bita tapi hanya memperoleh %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Mengharapkan bita NUL setelah string \"%s\" tapi menemui bita %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -829,21 +846,21 @@ msgstr "" "%d (panjang string adalah %d). String UTF-8 yang valid sampai titik itu " "adalah \"%s\"" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Nilai bersarang terlalu dalam" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Nilai terurai \"%s\" bukan lokasi objek D-Bus yang valid" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Nilai terurai \"%s\" bukan tanda tangan D-Bus yang valid" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -853,7 +870,7 @@ msgstr[0] "" "Menjumpai larik dengan panjang %u bita. Panjang maksimal adalah 2<<26 bita " "(64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -862,16 +879,16 @@ msgstr "" "Menemui larik bertipe \"a%c\", mengharapkan punya panjang kelipatan %u bita, " "tapi menemui panjang %u bita" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Struktur kosong (tuple) tidak diperbolehkan di D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Nilai terurai \"%s\" bagi varian bukan tanda tangan D-Bus yang valid" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -879,7 +896,7 @@ msgstr "" "Galat saat deserialisasi GVariant dengan type string \"%s\" dari format " "kabel D-Bus" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -888,28 +905,28 @@ msgstr "" "Nilai ke-endian-an tak valid. Berharap 0x6c (\"l\") atau (0x42) \"B\" tapi " "menemui 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Versi protokol mayor tak valid. Berharap 1 tapi menemui %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Tajuk tanda tangan ditemukan tetapi bukan tipe tanda tangan" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Header tanda tangan dengan tanda tangan \"%s\" ditemukan tapi body pesan " "kosong" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Nilai terurai \"%s\" bukan tanda tangan D-Bus yang valid (bagi body)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -917,11 +934,11 @@ msgstr[0] "" "Tidak terdapat tajuk tanda tangan pada pesan, tetapi panjang badan pesan " "adalah %u bita" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Tak bisa men-deserialisasi pesan: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -929,23 +946,23 @@ msgstr "" "Kesalahan serialisasi GVariant dengan type string \"%s\" ke format kabel D-" "Bus" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Jumlah deskriptor berkas dalam pesan (%d) berbeda dari field header (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Tak bisa men-serialisasi pesan: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Body pesan punya tanda tangan \"%s\" tapi tak ada header tanda tangan" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -954,17 +971,17 @@ msgstr "" "Tubuh pesan memiliki tanda tangan tipe \"%s\" tapi tanda tangan di ruas " "header adalah \"(%s)\"" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Tubuh pesan kosong tapi tanda tangan pada ruas header adalah \"(%s)\"" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Galat balikan dengan tubuh bertipe \"%s\"" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Galat balikan dengan body kosong" @@ -984,22 +1001,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Tak bisa mendapat profil perangkat keras: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Tak bisa memuat %s or %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Galat sewaktu memanggil StartServiceByName untuk %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Balasan tak diharapkan %d dari metode StartServiceByName(\"%s\")" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1008,25 +1025,25 @@ msgstr "" "Tak bisa menjalankan metode; proksi adalah nama terkenal %s tanpa pemilik " "dan proksi dibangun dengan tanda G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Ruang nama abstrak tak didukung" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Tak bisa menyatakan berkas nonce ketika membuat suatu peladen" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Galat saat menulis berkas nonce pada \"%s\": %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "String \"%s\" bukan suatu GUID D-Bus yang valid" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Tak bisa mendengarkan pada transport yang tak didukung \"%s\"" @@ -1320,72 +1337,73 @@ msgstr "Galat: %s bukan nama bus yang dikenal baik dan valid\n" msgid "Not authorized to change debug settings" msgstr "Tidak berwenang untuk mengubah pengaturan awakutu" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Tanpa nama" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Berkas desktop tak menyatakan ruas Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Tak bisa temukan terminal yang diperlukan bagi aplikasi" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Program '%s' tidak ditemukan di $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "Tak bisa membuat folder %s untuk konfigurasi aplikasi bagi pengguna: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Tak bisa membuat folder %s untuk konfigurasi MIME bagi pengguna: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Informasi aplikasi tak punya identifier" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Tak bisa membuat berkas desktop pengguna %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Definisi gubahan bagi %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "kandar tidak mengimplementasikan eject" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "kandar tidak mengimplementasikan eject atau eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "kandar tidak mengimplementasi poll bagi media" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "kandar tidak mengimplementasi start" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "kandar tidak mengimplementasi stop" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "Backend TLS tidak menerapkan pengambilan pengikatan TLS" @@ -1398,27 +1416,27 @@ msgstr "Dukungan TLS tak tersedia" msgid "DTLS support is not available" msgstr "Dukungan DTLS tak tersedia" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Tak bisa menangani pengkodean GEmblem versi %d" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Cacah token (%d) salah bentuk di pengkodean GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Tak bisa menangani pengkodean versi %d dari GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Cacah token (%d) salah bentuk di pengkodean GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Berharap suatu GEmblem bagi GEmblemedIcon" @@ -1426,129 +1444,134 @@ msgstr "Berharap suatu GEmblem bagi GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Kait yang memuat tak ada" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Tak bisa menyalin direktori atas direktori" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Tak bisa menyalin direktori atas direktori" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Berkas tujuan telah ada" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Tak bisa menyalin direktori secara rekursif" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Rentang berkas salin tak didukung" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Galat saat men-splice berkas: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Splice tidak didukung" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Menyalin (reflink/clone) antar kait tak didukung" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Menyalin (reflink/clone) tak didukung atau tak valid" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Menyalin (reflink/clone) tak didukung atau tak bekerja" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Tidak bisa mengambil atribut %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Tak bisa menyalin berkas spesial" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Diberikan nilai link simbolik yang tak valid" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2399 msgid "Symbolic links not supported" msgstr "Taut simbolik tidak didukung" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Tong sampah tak didukung" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Nama berkas tak boleh mengandung \"%c\"" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Gagal membuat direktori sementara untuk templat \"%s\": %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "volume tak mengimplementasi pengaitan" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Tak ada aplikasi terdaftar yang menangani berkas ini" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator ditutup" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Enumerator berkas memiliki operasi tertunda" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Enumerator berkas telah ditutup" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Tak bisa menangani pengkodean versi %d dari GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Data masukan salah bentuk bagi GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Stream tak mendukung query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Seek tak didukung pada stream" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Pemenggalan tak diijinkan pada stream masukan" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Pemenggalan tak didukung pada stream" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Nama host salah" @@ -1581,64 +1604,64 @@ msgstr "Respons proksi HTTP terlalu besar" msgid "HTTP proxy server closed connection unexpectedly." msgstr "Peladen proksi HTTP menutup koneksi secara tak terduga." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Cacah token yang salah (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Tak ada tipe bagi nama kelas %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Tipe %s tak mengimplementasi antar muka GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Tipe %s tak dikelaskan" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Nomor versi salah bentuk: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Tipe %s tak mengimplementasi from_tokens() pada antar muka GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Tak bisa menangani versi pengkodean ikon yang diberikan" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Tak ada alamat yang dinyatakan" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Panjang %u terlalu panjang bagi alamat" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Alamat memiliki bit yang ditata diluar panjang prefiks" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Tak bisa mengurai \"%s\" sebagai mask alamat IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Tak cukup ruang bagi alamat soket" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Alamat soket tak didukung" @@ -1652,7 +1675,7 @@ msgstr "Stream masukan tak mengimplementasi pembacaan" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Stream memiliki operasi tertunda" @@ -1668,7 +1691,7 @@ msgstr "Pertahankan dengan berkas ketika dipindah" msgid "“version” takes no arguments" msgstr "\"version\" tak menerima argumen" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Penggunaan:" @@ -1676,79 +1699,79 @@ msgstr "Penggunaan:" msgid "Print version information and exit." msgstr "Cetak informasi versi dan keluar." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Perintah:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Sambung berkas berurutan ke keluaran standar" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Salin satu berkas atau lebih" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Tunjukkan informasi tentang lokasi" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Luncurkan aplikasi dari berkas destop" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Tampilkan daftar isi lokasi" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Ambil atau atur penangan bagi suatu mimetype" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Buat direktori" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Pantau perubahan berkas dan direktori" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Kait atau lepas kait lokasi" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Pindah satu berkas atau lebih" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Buka berkas dengan aplikasi baku" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Ubah nama suatu berkas" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Hapus satu berkas atau lebih" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Baca dari masukan standar dan simpan" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Atur atribut berkas" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Pindahkan berkas atau direktori ke tempat sampah" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lihat daftar lokasi dalam suatu pohon" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Perintah:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Gunakan %s untuk memperoleh bantuan terrinci.\n" @@ -1758,7 +1781,7 @@ msgid "Error writing to stdout" msgstr "Galat saat menulis ke stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1781,60 +1804,64 @@ msgstr "" "sebagai ganti berkas lokal: sebagai contoh Anda dapat memakai\n" "seperti smb://peladen/sumberdaya/berkas.txt sebagai lokasi." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Tidak ada lokasi yang diberikan" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Tidak ada direktori tujuan" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Tampilkan kemajuan" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Tanya sebelum menimpa" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Pertahankan semua atribut" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Buat cadangan berkas tujuan yang telah ada" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Jangan pernah ikut taut simbolik" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Gunakan izin bawaan untuk tujuan" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Gunakan stempel waktu modifikasi berkas baku untuk tujuan" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Ditransfer %s dari %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "SUMBER" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "TUJUAN" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Salin satu berkas atau lebih dari SUMBER ke TUJUAN." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1844,12 +1871,12 @@ msgstr "" "sebagai ganti berkas lokal: sebagai contoh Anda dapat memakai\n" "smb://peladen/sumberdaya/berkas.txt sebagai lokasi." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Tujuan %s bukan suatu direktori" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: timpa \"%s\"? " @@ -1890,52 +1917,52 @@ msgstr "nama tampilan: %s\n" msgid "edit name: %s\n" msgstr "sunting nama: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "nama: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tipe: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "ukuran: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "tersembunyi\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "path lokal: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "kait unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Atribut yang dapat ditata:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Namespace atribut yang dapat ditulis:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Tunjukkan informasi tentang lokasi." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -3058,126 +3085,126 @@ msgstr "Galat saat mengambil info sistem berkas bagi %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Kait wadah bagi berkas %s tak ditemukan" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Tak bisa mengubah nama direktori root" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Galat saat mengubah nama berkas %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Tak bisa mengubah nama berkas, nama telah dipakai" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Nama berkas tak valid" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Galat saat membuka berkas %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Galat saat menghapus berkas %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Galat saat memindah berkas %s ke tempat sampah: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Tak bisa membuat direktori tempat sampah %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "" "Tak bisa menemukan direktori puncak %s yang akan dibuang ke tempat sampah" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Penyampahan pada kandar internal sistem tidak didukung" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Tak bisa menemukan atau membuat direktori %s ke tempat %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Tak bisa membuat berkas info pembuangan ke tempat sampah bagi %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "Tak bisa membuang berkas %s ke tempat sampah menyeberang batas sistem berkas" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Tak bisa membuang berkas %s ke tempat sampah: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Tak bisa membuang berkas ke tempat sampah %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Galat saat membuat direktori %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Sistem berkas tak mendukung taut simbolik" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Galat saat membuat taut simbolis %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Galat saat memindah berkas %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Tak bisa memindah direktori atas direktori" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Pembuatan berkas cadangan gagal" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Galat saat menghapus berkas tujuan: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Perpindahan antar kait tak didukung" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Tak bisa menentukan penggunaan diska dari %s: %s" @@ -3199,116 +3226,116 @@ msgstr "Nama atribut tambahan yang tak valid" msgid "Error setting extended attribute “%s”: %s" msgstr "Galat saat menata atribut yang diperluas \"%s\": %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (pengkodean tak valid)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Galat saat mengambil informasi bagi berkas \"%s\": %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Galat saat mengambil informasi bagi descriptor berkas: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Tipe atribut tak valid (diharapkan uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Tipe atribut tak valid (diharapkan uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Jenis atribut tidak sah (diharapkan bita berjenis string)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Tak bisa menata ijin pada taut simbolik" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Galat saat menata ijin: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Galat saat menata pemilik: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symlink tak boleh NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Galat saat menata taut simbolis: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Galat saat menata symlink: berkas bukan suatu link simbolik" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Nanodetik ekstra %d untuk stempel waktu UNIX %lld negatif" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Nanodetik ekstra %d untuk stempel waktu UNIX %lld mencapai 1 detik" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "Stempel waktu UNIX %lld tidak muat ke dalam 64 bit" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "Stempel waktu UNIX %lld berada di luar rentang yang didukung oleh Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Nama berkas \"%s\" tidak dapat dikonversi ke UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Berkas “%s” tidak dapat dibuka: Galat Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Galat saat menata waktu modifikasi atau akses untuk berkas “%s”: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Galat saat menata waktu modifikasi atau akses: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "Konteks SELinux tak boleh NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux tak diaktifkan di sistem ini" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Galat saat menata konteks SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Penataan atribut %s tak didukung" @@ -3361,7 +3388,7 @@ msgid "Error truncating file: %s" msgstr "Galat saat memenggal berkas: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Galat saat membuka berkas \"%s\": %s" @@ -3383,27 +3410,27 @@ msgstr "Berkas telah diubah secara eksternal" msgid "Error removing old file: %s" msgstr "Galat saat menghapus berkas lama: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "GSeekType yang tak valid diberikan" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Permintaan seek yang tak valid" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Tak bisa memenggal GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Memori stream keluaran tak bisa diubah ukuran" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Gagal mengubah ukuran memori stream keluaran" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3411,73 +3438,73 @@ msgstr "" "Banyaknya memori yang diperlukan untuk memroses penulisan lebih besar " "daripada ruang tersedia" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Seek yang diminta sebelum awal stream" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Seek yang diminta setelah akhir stream" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "mount tak mengimplementasi \"unmount\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "mount tak mengimplementasi \"eject\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "mount tak mengimplementasi \"unmount\" atau \"unmount_with_operation\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "mount tak mengimplementasi \"eject\" atau \"eject_with_operation\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "mount tak mengimplementasi \"remount\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "mount tak mengimplementasi penebakan jenis isi" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "mount tak mengimplementasi penebakan sinkron jenis isi" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Nama host \"%s\" mengandung \"[\" tapi tanpa \"]\"" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Jaringan tak dapat dijangkau" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Host tak dapat dihubungi" @@ -3505,7 +3532,7 @@ msgstr "NetworkManager tidak berjalan" msgid "NetworkManager version too old" msgstr "Versi NetworkManager terlalu tua" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Stream keluaran tidak mengimplementasikan penulisan" @@ -3518,38 +3545,38 @@ msgstr "Jumlah vektor yang dilewatkan ke %s terlalu besar" msgid "Source stream is already closed" msgstr "Stream sumber telah ditutup" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Kegagalan pencarian proksi yang tidak ditentukan" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Galat saat mengurai \"%s\": %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s tidak diterapkan" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Domain tidak valid" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Sumber daya pada \"%s\" tidak ada" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Sumber daya di \"%s\" gagal didekompresi" @@ -3567,11 +3594,11 @@ msgstr "Sumber daya pada \"%s\" bukan suatu direktori" msgid "Input stream doesn’t implement seek" msgstr "Stream masukan tidak mengimplementasikan seek" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Seksi daftar memuat sumber daya dalam BERKAS elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3581,15 +3608,15 @@ msgstr "" "Bila SEKSI diberikan, hanya mendaftar sumber daya dalam seksi ini\n" "Bila PATH diberikan, hanya mendaftar sumber daya yang cocok" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "BERKAS [PATH]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SEKSI" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3601,15 +3628,15 @@ msgstr "" "Bila PATH diberikan, hanya mendaftar sumber daya yang cocok\n" "Rincian termasuk seksi, ukuran, dan kompresi" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Ekstrak berkas sumber daya ke stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "BERKAS PATH" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3637,7 +3664,7 @@ msgstr "" "Gunakan 'gresource help PERINTAH' untuk memperoleh bantuan terrinci.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3652,19 +3679,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SEKSI Nama seksi elf (opsional)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " PERINTAH Perintah (opsional) untuk dijelaskan\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " BERKAS Berkas elf (biner atau pustaka bersama)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3672,19 +3699,19 @@ msgstr "" " BERKAS Berkas elf (biner atau pustaka bersama)\n" " atau berkas sumber daya terkompail\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[PATH]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " PATH Path sumber daya (opsional, mungkin parsial)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "PATH" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " PATH Path sumber daya\n" @@ -3915,215 +3942,215 @@ msgstr "Nama skema yang diberikan kosong\n" msgid "No such key “%s”\n" msgstr "Tidak ada kunci seperti \"%s\"\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Soket tak valid, tak diinisialisasi" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Soket tak valid, inisialisasi gagal karena: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Soket telah ditutup" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "I/O soket kehabisan waktu" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "membuat GSocket dari fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Tak bisa membuat soket: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Famili tak dikenal dinyatakan" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Protokol tak dikenal dinyatakan" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Tak bisa memakai operasi datagram pada suatu soket bukan datagram." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Tak bisa memakai operasi datagram pada suatu soket yang tenggang waktunya " "ditata." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "tak bisa mendapat alamat lokal: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "tak bisa mendapat alamat jauh: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "tak bisa mendengarkan: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Galat saat mengikat ke alamat %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Galat saat bergabung dengan grup multicast: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Galat saat meninggalkan grup multicast: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Tak ada dukungan bagi multicast spesifik sumber" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Keluarga soket tak didukung" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "spesifik sumber bukan alamat IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Nama antarmuka terlalu panjang" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Antarmuka tidak ditemukan: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Tak ada dukungan bagi multicast spesifik sumber IPV4" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Tak ada dukungan bagi multicast spesifik sumber IPV6" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Galat saat menerima sambungan: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Penyambungan tengah berlangsung" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Tak bisa mendapat kesalahan yang tertunda: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Galat saat menerima data: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Galat saat mengirim data: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Tak bisa mematikan soket: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Galat saat menutup soket: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Menunggu kondisi soket: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Tak bisa mengirim pesan: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Vektor pesan terlalu besar" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Galat saat menerima pesan: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage tak didukung pada Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Galat saat menerima pesan: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Tak bisa membaca kredensial soket: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials tidak diimplementasikan untuk OS ini" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Tak bisa menyambung ke peladen proksi %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Tak bisa menyambung ke %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Tak bisa menyambung: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Proksi melalui koneksi bukan TCP tidak didukung." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Protokol proksi \"%s\" tidak didukung." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Pendengar telah ditutup" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Soket yang ditambahkan tertutup" @@ -4212,95 +4239,95 @@ msgstr "Proksi SOCSKv5 tidak mendukung jenis alamat yang diberikan." msgid "Unknown SOCKSv5 proxy error." msgstr "Galat tak dikenal pada proksi SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Gagal saat membuat pipe untuk sarana komunikasi dengan proses anak (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Pipa tak didukung pada platform ini" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Tak bisa menangani pengkodean versi %d dari GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Tak ada alamat valid yang ditemukan" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Galat saat mengurai balik \"%s\": %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Galat saat mengurai record %s DNS: paket DNS salah bentuk" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Tidak ada record DNS dengan tipe yang diminta bagi \"%s\"" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Sementara tidak dapat mengurai \"%s\"" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Galat saat mengurai \"%s\"" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Paket DNS salah bentuk" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Gagal mengurai respon DNS untuk \"%s\": " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Tak ditemukan sertifikat terenkode-PEM" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Tak bisa mendekripsi kunci privat terenkode-PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Tak bisa mengurai kunci privat terenkode-PEM" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Tak ditemukan sertifika terenkode-PEM" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Tak bisa mengurai sertifikat terenkode-PEM" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Backend TLS saat ini tidak mendukung PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "GTlsBackend ini tidak mendukung pembuatan sertifikat PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4310,7 +4337,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4318,135 +4345,148 @@ msgstr "" "Beberapa kata sandi yang dimasukkan salah, dan akses Anda akan terkunci " "setelah gagal lagi." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Sandi yang dimasukkan salah." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Mengirim FD tidak didukung" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Mengharapkan 1 pesan kendali, memperoleh %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Tipe yang tak diharapkan dari data ancillary" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Mengharapkan satu fd, tapi mendapat %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Menerima fd yang tak valid" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Menerima FD tidak didukung" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Galat saat mengirim kredensial: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Galat ketika memeriksa apakah SO_PASSCRED diaktifkan bagi soket: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Galat saat mengaktifkan SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Berharap membaca bita tunggal untuk penerimaan kredensial tapi membaca nol " "bita" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Tak mengharapkan pesan kendali, tapi memperoleh %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Galat ketika mematikan SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Galat saat membaca dari descriptor berkas: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Galat saat menutup descriptor berkas: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Akar sistem berkas" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Galat saat menulis ke descriptor berkas: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Alamat soket domain UNIX abstrak tak didukung pada sistem ini" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "volume tidak mengimplementasikan eject" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "volume tidak mengimplementasikan eject atau eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Aplikasi '%s' dalam objek aplikasi tidak memiliki kata kerja" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"Aplikasi '%s' dan penangan '%s' dalam objek aplikasi tidak memiliki kata " +"kerja" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Galat saat membaca dari handle: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Galat saat menutup handle: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Galat saat menulis ke handle: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Tidak cukup memori" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Galat internal: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Perlu masukan lagi" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Data terkompresi tak valid" @@ -4474,148 +4514,148 @@ msgstr "Jalankan layanan dbus" msgid "Wrong args\n" msgstr "Arg salah\n" -#: glib/gbookmarkfile.c:861 +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Atribut \"%s\" yang tidak diharapkan untuk elemen \"%s\"" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atribut \"%s\" dari elemen \"%s\" tak ditemukan" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Tag \"%s\" yang tak diharapkan, diharapkan tag \"%s\"" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Tag \"%s\" yang tak diharapkan di dalam \"%s\"" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Tanggal/waktu ‘%s’ tidak valid dalam berkas markah" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Tak ditemukan markah yang valid di direktori data" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Markah untuk URI \"%s\" telah ada" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Tak ditemukan markah untuk URI \"%s\"" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Tidak ada jenis MIME yang didefinisikan pada markah untuk URI \"%s\"" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Tidak ada tanda privat yang ditetapkan dalam markah untuk URI \"%s\"" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Tidak ada grup yang ditetapkan dalam markah untuk URI \"%s\"" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Tak ditemukan aplikasi terdaftar dengan nama \"%s\" bagi markah \"%s\"" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Gagal mengembangkan baris eksekusi \"%s\" dengan URI \"%s\"" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Karakter yang tidak dapat diterima dalam masukan konversi" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Rangkaian karakter sebagian pada akhir input" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Tak bisa mengonversi fallback \"%s\" menjadi codeset \"%s\"" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "NUL bita tertanam dalam masukan konversi" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "NUL bita tertanam dalam keluaran konversi" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "URI \"%s\" bukanlah URI absolut dengan menggunakan skema \"file\"" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI \"%s\" tidak valid" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Nama host dari URI \"%s\" tidak valid" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI \"%s\" mengandung karakter yang di-escape secara tidak valid" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Nama path \"%s\" bukan lokasi absolut" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %d %b %Y %r %Z" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4636,62 +4676,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Januari" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Februari" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Maret" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "April" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Mei" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Juni" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Juli" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Agustus" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "September" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Oktober" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "November" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Desember" @@ -4713,132 +4753,132 @@ msgstr "Desember" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Mei" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jun" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Jul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Ags" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Okt" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Des" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Senin" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Selasa" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Rabu" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Kamis" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Jumat" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Sabtu" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Minggu" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Sen" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Sel" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Rab" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Kam" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Jum" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Sab" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Min" @@ -4860,62 +4900,62 @@ msgstr "Min" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Januari" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Februari" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Maret" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "April" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Mei" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Juni" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Juli" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Agustus" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "September" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Oktober" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "November" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Desember" @@ -4937,190 +4977,194 @@ msgstr "Desember" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "Mei" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Jun" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Jul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Ags" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Okt" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Des" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Galat saat membuka direktori \"%s\": %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Tak bisa mengalokasikan %lu bita untuk membaca berkas \"%s\"" +#: glib/gfileutils.c:716 glib/gfileutils.c:820 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Tak bisa mengalokasikan %" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:733 #, c-format msgid "Error reading file “%s”: %s" msgstr "Galat saat membaca berkas \"%s\": %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:769 glib/gfileutils.c:803 #, c-format msgid "File “%s” is too large" msgstr "Berkas \"%s\" terlalu besar" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:845 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Gagal membaca dari berkas \"%s\": %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:895 glib/gfileutils.c:970 glib/gfileutils.c:1477 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Gagal membuka berkas \"%s\": %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:908 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Gagal mendapat atribut berkas \"%s\": fstat() gagal: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:939 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Gagal membuka berkas \"%s\": fdopen() gagal: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1040 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Gagal mengubah nama berkas \"%s\" menjadi \"%s\": g_rename() gagal: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1139 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Gagal menulis berkas \"%s\": ftruncate() gagal: %s" + +#: glib/gfileutils.c:1184 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Gagal menulis berkas \"%s\": write() gagal: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1205 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Gagal menulis berkas \"%s\": fsync() gagal: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1366 glib/gfileutils.c:1783 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Gagal membuat berkas \"%s\": %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1411 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Berkas \"%s\" yang ada tidak dapat dibuang: g_unlink() gagal: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1748 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Templat \"%s\" tidak valid, tidak boleh mengandung \"%s\"" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1761 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Templat \"%s\" tidak memuat XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2355 glib/gfileutils.c:2384 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Gagal membaca taut simbolik \"%s\": %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Tak bisa membuka pengubah dari \"%s\" menjadi \"%s\": %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Tak bisa melakukan pembacaan mentah dalam g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Ada data tersisa yang belum dikonversi pada penyangga read" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanal terputus pada karakter sebagian" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Tak bisa melakukan pembacaan mentah dalam g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Berkas kunci yang valid tak ditemukan pada direktori yang dicari" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Bukan berkas biasa" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5128,51 +5172,51 @@ msgstr "" "Berkas kunci mengandung baris \"%s\" yang bukan suatu pasangan kunci-nilai, " "kelompok, atau komentar" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Nama grup tak valid: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Berkas kunci tidak mulai dengan sebuah kelompok" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Nama kunci tak valid: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Berkas kunci mengandung enkoding \"%s\" yang tidak didukung" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Berkas kunci tidak memiliki grup \"%s\"" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Berkas kunci tidak memiliki kunci \"%s\" dalam kelompok \"%s\"" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "Berkas kunci mengandung kunci \"%s\" dengan nilai \"%s\" yang bukan UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Berkas kunci mengandung kunci \"%s\" yang nilainya tidak dapat diterjemahkan." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5181,36 +5225,36 @@ msgstr "" "Berkas kunci mengandung kunci \"%s\" dalam grup \"%s\" yang nilainya tidak " "dapat diterjemahkan." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Kunci \"%s\" dalam grup \"%s\" bernilai \"%s\" padahal diharapkan %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Berkas kunci mengandung karakter escape pada akhir baris" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Berkas kunci memuat urutan escape \"%s\" yang tidak valid" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Nilai \"%s\" tidak bisa diterjemahkan sebagai sebuah bilangan." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Nilai bilangan bulat \"%s\" di luar jangkauan" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Nilai \"%s\" tidak dapat diterjemahkan sebagai sebuah bilangan float." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Nilai \"%s\" tidak dapat diterjemahkan sebagai sebuah boolean." @@ -5230,32 +5274,32 @@ msgstr "Gagal memetakan %s%s%s%s: mmap() gagal: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Gagal membuka berkas \"%s\": open() gagal: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Galat pada baris %d karakter ke-%d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Teks UTF-8 dalam nama tak valid — bukan “%s” yang valid" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” bukan suatu nama yang valid" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” bukan suatu nama yang valid: \"%c\"" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Galat pada baris ke-%d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5264,7 +5308,7 @@ msgstr "" "Gagal saat mengurai \"%-.*s\", yang seharusnya sebuah digit dalam referensi " "karakter (misalnya ê) — mungkin digitnya terlalu besar" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5274,25 +5318,25 @@ msgstr "" "menggunakan karakter ampersand tanpa bermaksud menjadikannya sebagai entitas " "— escape ampersand sebagai &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "" "Referensi karakter \"%-.*s\" tidak mengenkode karakter yang diperbolehkan" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Ada entitas \"&;\" yang kosong; entitas yang benar antara lain adalah: & " "" < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Nama entitas \"%-.*s\" tak dikenal" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5301,11 +5345,11 @@ msgstr "" "ampersand tanpa bermaksud menjadikannya sebagai entitas — escape ampersand " "sebagai &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumen harus dimulai dengan elemen (misalnya )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5314,7 +5358,7 @@ msgstr "" "“%s” bukanlah karakter yang benar bila diikuti dengan karakter \"<\". Ini " "tidak boleh menjadi nama elemen" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5323,12 +5367,12 @@ msgstr "" "Ada karakter aneh “%s”, seharusnya ada \">\" untuk mengakhiri tag elemen " "kosong “%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Terlalu banyak atribut dalam elemen \"%s\"" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5336,7 +5380,7 @@ msgstr "" "Ada karakter aneh “%s”. Seharusnya ada karakter '=' setelah nama atribut " "“%s” pada elemen “%s”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5347,7 +5391,7 @@ msgstr "" "padaelemen “%s”, atau bisa juga ada atribut lain. Mungkin Anda menggunakan " "karakter yang tidak diperbolehkan pada nama atribut" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5356,7 +5400,7 @@ msgstr "" "Ada karakter aneh “%s”. Seharusnya ada tanda kutip buka setelah tanda sama " "dengan saat memberikan nilai atribut “%s” pada elemen “%s”" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “\"" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Elemen “%s” sudah ditutup, tidak ada elemen yang masih terbuka" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Elemen “%s” sudah ditutup, tapi elemen yang masih terbuka adalah “%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokumen kosong atau berisi whitespace saja" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" "Dokumen terpotong tidak sempurna sesaat setelah membuka kurung siku \"<\"" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5402,7 +5446,7 @@ msgstr "" "Dokumen terpotong tidak sempurna dengan elemen yang masih terbuka — “%s” " "adalah elemen terakhir yang dibuka" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5411,19 +5455,19 @@ msgstr "" "Dokumen terpotong tidak sempurna, seharusnya ada kurung siku penutup untuk " "mengakhiri tag <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokumen terpotong tidak sempurna pada dalam nama elemen" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokumen terpotong tidak sempurna di dalam nama atribut" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokumen terpotong tidak sempurna di dalam tag pembukaan elemen." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5431,261 +5475,261 @@ msgstr "" "Dokumen terpotong tidak sempurna setelah tanda sama dengan mengikuti nama " "atribut. Tidak ada nilai atribut yang diperoleh" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokumen tidak sempura saat ada dalam nilai atribut" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokumen terpotong tidak sempurna di dalam tag penutup elemen “%s”" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Dokumen terpotong tidak sempurna di dalam tag penutup untuk elemen yang " "belum dibuka" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokumen terpotong tidak sempurna di dalam keterangan atau instruksi " "pemrosesan" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPSI…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Opsi Bantuan:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Menampilkan opsi bantuan" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Menampilkan semua opsi bantuan" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Opsi Aplikasi:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Opsi:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Tak bisa mengurai nilai bilangan bulat \"%s\" untuk \"%s\"" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Nilai bilangan bulat \"%s\" untuk %s di luar jangkauan" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Tak bisa mengurai nilai double \"%s\" bagi %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Nilai double \"%s\" untuk %s di luar jangkauan" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Galat saat mengurai opsi %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Argumen untuk %s tidak lengkap" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Pilihan tidak diketahui %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "objek rusak" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "kehabisan memori" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "kesalahan internal" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "pola memuat butir yang tak didukung bagi pencocokan sebagian" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "acuan balik sebagai persyaratan tak didukung bagi pencocokan sebagian" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "batas rekursi dicapai" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "nilai offset salah" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "pengulangan rekursi" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "mode pencocokan diminta yang tidak dikompilasi untuk JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "galat tak dikenal" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ di akhir pola" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c di akhir pola" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "karakter tak dikenal setelah \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "angka tak urut di quantifier {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "angka terlalu besar di quantifier {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "pengakhiran ] hilang bagi kelas karakter" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "rangkaian escape tak valid dalam kelas karakter" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "jangkauan tak terurut dalam kelas karakter" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "tak ada yang dapat diulang" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "karakter tak dikenal setelah (? atau (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "kelas POSIX bernama hanya didukung di dalam suatu kelas" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "elemen kolasi POSIX tak didukung" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "pengakhiran ) hilang" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "acuan ke sub pola yang tak ada" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "tak ada ) setelah komentar" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "ekspresi reguler terlalu besar" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "angka atau nama salah bentuk setelah (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "panjang asersi lookbehind tak tetap" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "grup bersyarat mengandung lebih dari dua cabang" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "berharap asersi setelah (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "acuan bernomor tak boleh nol" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nama kelas POSIX tak dikenal" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "nilai karakter dalam urutan \\x{...} terlalu besar" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C tak diijinkan di asersi lookbehind" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "terminator di nama sub pola hilang" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dua sub pola yang bernama memiliki nama sama" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "urutan \\P atau \\p salah bentuk" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "nama properti tak dikenal setelah \\P atau \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "nama sub pola terlalu panjang (maksimum 32 karakter)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "terlalu banyak sub pola yang dinamai (maksimum 10.000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "nilai oktal lebih dari \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "grup DEFINE mengandung lebih dari satu cabang" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "opsi NEWLINE tak konsisten" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5693,235 +5737,235 @@ msgstr "" "\\g tak diikuti oleh bilangan atau nama dalam tanda kutip, kurung siku, atau " "kurung kurawal, atau bilangan polos" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "argumen tak diijinkan bagi (*ACCEPT), (*FAIL), atau (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) tak dikenal" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "angka terlalu besar" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "kurang nama sub pola setelah (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "nama-nama berbeda bagi sub pola dari bilangan yang sama tak diijinkan" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) mesti punya argumen" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c mesti diikuti oleh sebuah karakter ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k tak diikuti oleh nama yang diapit tanda kutip, kurung siku, atau kurung " "kurawal" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N tak didukung dalam suatu kelas" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "nama terlalu panjang dalam (*MARK), (*PRUNE), (*SKIP), atau (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "kode tumpah (overflow)" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "karakter tak dikenal setelah (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "menimpa ruang kerja kompilasi" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "sub pola yang diacu yang sebelumnya diperiksa tak ditemukan" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Galat saat mencocokkan ekspresi reguler %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "Pustaka PCRE dikompail tanpa dukungan UTF-8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "Pustaka PCRE dikompail dengan opsi yang tak kompatibel" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Galat saat mengkompail ekspresi reguler ‘%s’ pada karakter %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "digit heksadesimal atau \"}\" diharapkan" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "digit heksadesimal diharapkan" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "kurang \"<\" dalam acuan simbolis" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "acuan simbolis yang belum selesai" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "acuan simbolis dengan panjang nol" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "diharapkan digit" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "acuan simbolis yang tak legal" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "\"\\\" akhir yang tersesat" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "urutan escape tak dikenal" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Galat saat mengurai teks pengganti \"%s\" pada karakter %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Teks yang dikutip tidak dimulai dengan tanda kutip" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Tanda kutip kurang satu pada perintah atau pada teks yang dikutip dari shell " "lain" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Teks berakhir tepat setelah karakter \"\\\". (Teksnya adalah \"%s\")" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Teks berakhir sebelum tanda kutip pasangannya ditemukan untuk %c. (Teksnya " "adalah \"%s\")" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Teksnya kosong (atau hanya berisi whitespace)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Gagal saat membaca data dari proses anak (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Galat tak terduga dalam membaca data dari proses anak (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Terjadi galat pada fungsi waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Proses anak keluar dengan kode %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Proses anak dimatikan oleh sinyal %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Proses anak dihentikan oleh sinyal %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Proses anak keluar secara tak normal" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Gagal saat membaca dari pipe anak (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Gagal menelurkan proses anak \"%s\" (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Gagal saat fork (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Gagal pindah ke direktori \"%s\" (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Gagal menjalankan proses anak \"%s\" (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Gagal membuka berkas untuk memetakan ulang deskriptor berkas (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Gagal menduplikasi deskriptor berkas untuk proses anak (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Gagal saat fork proses anak (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Gagal menutup deskriptor berkas untuk proses anak (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Galat tak dikenal ketika menjalankan proses anak \"%s\"" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Gagal saat membaca data yang dibutuhkan dai pipe pid anak (%s)" @@ -5978,78 +6022,78 @@ msgstr "" "Terjadi galat pada g_io_channel_win32_poll() ketika membaca data dari anak " "proses" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "String kosong bukan angka" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "\"%s\" bukan bilangan bertanda" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Nomor \"%s\" berada di luar batas [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "\"%s\" bukan bilangan tak bertanda" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "%-encode dalam URI tidak valid" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Karakter ilegal dalam URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Karakter non-UTF-8 dalam URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Alamat IPv6 tidak valid ‘%.*s’ dalam URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Alamat IP dikodekan ilegal ‘%.*s’ dalam URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nama host internasional ilegal '%.*s' di URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Tak bisa menguraikan port ‘%.*s’ dalam URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Port ‘%.*s’ dalam URI di luar jangkauan" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI ‘%s’ bukan URI absolut" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI ‘%s’ tidak memiliki komponen host" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI tidak absolut, dan tidak ada dasar URI yang disediakan" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "'=' dan nilai parameter tidak ada" @@ -6130,65 +6174,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" diff --git a/po/ka.po b/po/ka.po index 0e64f52..5837ff0 100644 --- a/po/ka.po +++ b/po/ka.po @@ -1,14 +1,14 @@ # Georgian translation for glib # Copyright (C) 2023 glib's authors. -# This file is distributed under the same license as the PACKAGE package. -# Ekaterine Papava , 2023. +# This file is distributed under the same license as the glib package. +# Ekaterine Papava , 2023-2024. # msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-10-07 15:03+0000\n" -"PO-Revision-Date: 2023-10-20 07:49+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-27 09:41+0000\n" +"PO-Revision-Date: 2024-02-27 18:18+0100\n" "Last-Translator: Ekaterine Papava \n" "Language-Team: Georgian <(nothing)>\n" "Language: ka\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.4\n" +"X-Generator: Poedit 3.3.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -39,38 +39,42 @@ msgstr "" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "ჩავარდა ნაგულისხმევი აპლიკაციის პოვნის მცდელობა URI-ის სქემისთვის '%s'" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication-ის მორგება:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "GApplication პარამეტრების ჩვენება" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Gapplication-ის სერვისის რეჟიმში შესვლა (გამოიყენება D-Bus-ის სერვისის " "ფაილებიდან)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "აპლიკაციის ID-ის გადაფარვა" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "აპლიკაციის ვერსიის გამოტანა" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "გაშვებული ინტერფეისის შეცვლა" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "დახმარების ჩვენება" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[ბრძანება]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "მიმდინარე ვერსიის დაბეჭდვა" @@ -123,7 +127,7 @@ msgid "APPID" msgstr "აპისID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "ბრძანება" @@ -137,7 +141,9 @@ msgstr "აპლიკაციის იდენტიფიკატორ #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/decompiler/decompiler.c:51 msgid "FILE" msgstr "PROFILEID" @@ -163,7 +169,7 @@ msgstr "პარამეტრი" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "ქმედების ჩაწოდების არასავალდებული პარამეტრი ფორმატში GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -177,12 +183,12 @@ msgstr "" msgid "Usage:\n" msgstr "გამოყენება:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "არგუმენტები:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[არგუმენტები…]" @@ -274,78 +280,78 @@ msgstr "" "უცნობი ბრძანება: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "%s-სთვის გადაცემული რაოდენობის მნიშვნელობა მეტიმეტად დიდია" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "საბაზისო ნაკადში გადახვევა მხარდაუჭერელია" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "GBufferedInputStream-ის წაკვეთა შეუძლებელია" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "ნაკადი უკვე დახურულია" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "საბაზისო ნაკადის წაკვეთა შეუძლებელია" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "ოპერაცია გაუქმდა" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "ობიექტი არასწორია. ინიციალიზებული არაა" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "დანიშნულების წერტილში საკმარისი ადგილი არაა" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "შეტანილ ტექსტში ბაიტების მიმდევრობა მცდარია" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "გარდაქმნის შეცდომა: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "გაუქმებადი ინიციალიზაცია მხარდაჭერილი არაა" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "კოდური გვერდის \"%s\" გარდაქმნა \"%s\" კოდირებაში მხარდაუჭერელია" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "ვერ ხერხდება \"%s\" - \"%s\" გარდამქმნელის გახსნა" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "ტიპი %s" @@ -359,42 +365,42 @@ msgstr "უცნობი ტიპი" msgid "%s filetype" msgstr "ფაილის ტიპი %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials არასწორ მონაცემებს შეიცავს" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials ამ OS-თვის განხორციელებული არაა" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "თვენი პლატფორმისთვის GCredentials მხარდაჭერილი არაა" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials ამ OS-ზე პროცესის ID-ს არ შეიცავს" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "ამ OS-ზე ავტორიზაციის დეტალების ჩანაცვლება შეუძლებელია" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "მოულოდნელი ნაადრევი ნაკადის დასასრული" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "მხარდაუჭერელი გასაღები \"%s\" მისამართის ჩანაწერში \"%s\"" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "" "უაზრო გასაღები/მნიშვნელობის წყვილის კომბინაცია მისამართის ჩანაწერში \"%s\"" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -403,29 +409,29 @@ msgstr "" "მისამართ \"%s\" არასწორია (საჭიროა ზუსტად 1 ბილიკი, დროებითი საქაღალდე ან " "აბსტრაქტული გასაღებები)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "შეცდომა მისამართში \"%s\"- ატრიბუტი \"%s\" არასწორადაა ჩამოყალიბებული" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "უცნობი ან მხარდაუჭერელი ტრანსპორტი \"%s\" მისამართისთვის \"%s\"" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "მისამართის ელემენტი \"%s\" ორწერტილს (:) არ შეიცავს" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "" "ტრანსპორტის სახელი მისამართის ელემენტში \"%s\" ცარიელი არ შეიძლება იყოს" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -434,7 +440,7 @@ msgstr "" "გასაღები/მნიშვნელობის წყვილი %d, \"%s\" მისამართის ელემენტში \"%s\" ტოლობის " "ნიშანს არ შეიცავს" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -442,7 +448,7 @@ msgstr "" "გასაღები/მნიშვნელობის წყვილი %d, \"%s\" მისამართის ელემენტში \"%s\" არ " "შეიძლება, ცარიელ გასაღებს შეიცავდეს" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -451,7 +457,7 @@ msgstr "" "შეცდომა გასაღები/მნიშვნელობის წყვილი %d, \"%s\" მისამართის ელემენტში \"%s\" " "სპეციალური სიმბოლოების მოცილებისას" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -460,84 +466,84 @@ msgstr "" "შეცდომა მისამართში \"%s\" — unix ტრანსპორტზე აუცილებელია \"path\" ან " "\"abstract\"-დან მხოლოდ ერთის დაყენება" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "შეცდომა მისამართში \"%s\" — ჰოსტის ატრიბუტი აკლია ან არასწორადაა " "ჩამოყალიბებული" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "შეცდომა მისამართში \"%s\" — პორტის ატრიბუტი აკლია ან არასწორადაა " "ჩამოყალიბებული" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "შეცდომა მისამართში \"%s\" — ატრიბუტი noncefile აკლია ან არასწორადაა " "ჩამოყალიბებული" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "ავტომატურად გაშვების შეცდომა: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "ერთჯერადი ფაილის (%s) გახსნის შეცდომა: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "ერთჯერადი ფაილიდან (%s) წაკითხვის შეცდომა: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "შეცდომა nonce ფაილიდან \"%s\" წაკითხვისას. მოველოდი 16 ბაიტს. მივიღე %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "შეცდომა nonce ფაილის, \"%s\", შემცველობის ჩაწერისას ნაკადში:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "მითითებული მისამართი ცარიელია" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "" "შეტყობინებების მატარებლის შექმნა შეუძლებელია, როცა AT_SECURE დაყენებულია" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "შეტყობინების მატარებლის შექმნა machine-id-ის გარეშე შეუძლებელია: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "D-Bus-ის ავტომატური გაშვება X11 $DISPLAY-ის გარეშე შეუძლებელია" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "ბრძანების სტრიქონის \"%s\" შექმნის შეცდომა: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "სესიის მატარებლის მისამართის დადგენა შეუძლებელია (ამ ოს-სთვის " "განხორციელებული არაა)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -546,7 +552,7 @@ msgstr "" "გარემოს ცვლადიდან DBUS_STARTER_BUS_TYPE მატარებლის მისამართის დადგენა " "შეუძლებელია - უცნობი მნიშვნელობა \"%s\"" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -554,21 +560,21 @@ msgstr "" "მატარებლის მისამართის დადგენა შეუძლებელია, რადგან გარემოს ცვლადი " "DBUS_STARTER_BUS_TYPE დაყენებული არაა" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "მატარებლის უცნობი ტიპი %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "შემცველობის მოულოდნელი უქონლობა ხაზის წაკითხვის მცდელობისას" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" "შემცველობის მოულოდნელი უქონლობა ხაზის (უსაფრთხოდ) წაკითხვის მცდელობისას" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -576,15 +582,15 @@ msgstr "" "დახარჯულია ყველა ხელმისაწვდომი ავთენტიკაციის მექანიზმი (ვცადე: %s) " "(ხელმისაწვდომია: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "შემცველობის მოულოდნელი უქონლობა ბაიტის წაკითხვის მცდელობისას" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "მომხმარებლის ID-ები პარტნიორისთვის და სერვერისთვის ტოლი უნდა იყოს" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "გაუქმებულია GDBusAuthObserver::authorize-authenticated-peer-ით" @@ -605,13 +611,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "საქაღალდის (\"%s\") შექმნის შეცდომა: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "ოპერაცია მხარდაუჭერელია" @@ -672,15 +678,15 @@ msgstr "ბრელოკის \"%s\" ჩასაწერად გახს msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(დამატებით, \"%s\"-ის ბლოკის მოხსნაც ჩავარდა: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "შეერთება არ დახურულა" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "მოლოდინის ვადა ამიწურა" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "კლიენტის მხრის მიერთების აწყობისას შემჩნეული ალმები მხარდაუჭერელა" @@ -770,63 +776,75 @@ msgstr "%s-სთვის ქვეხე უკვე გატანილი msgid "Object does not exist at path “%s”" msgstr "ობიექტი არ არსებობს ბილიკზე \"%s\"" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s შეტყობინება: %s თავსართის ველი არასწორია. მოველოდი '%s' ტიპის მნიშვნელობას" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s შეტყობინება: %s თავსართის ველი აკლია ან არასწორია" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s შეტყობინება: მოწოდებულია არასწორი თავსართის ველი" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s შეტყობინება: PATH თავსართის ველი იყენებს დაცულ მნიშვნელობას /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s შეტყობინება: INTERFACE თავსართის ველი სწორ ინტერფეისის სახელს არ შეიცავს" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s შეტყობინება: INTERFACE თავსართის ველი იყენებს დაცულ მნიშვნელობას org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s შეტყობინება: MEMBER თავსართის ველი სწორი წევრის სახელს არ შეიცავს" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s შეტყობინება: ERROR_NAME თავსართის ველი სწორ შეცდომის სახელს არ შეიცავს" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "ტიპი არასწორია" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"METHOD_CALL შეტყობინება: PATH ან MEMBER თავსართის ველი აკლია ან არასწორია" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"METHOD_RETURN შეტყობინება: REPLY_SERIAL თავსართის ველი აკლია ან არასწორია" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR შეტყობინება: REPLY_SERIAL ან ERROR_NAME თავსართის ველი აკლია ან " -"არასწორია" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL შეტყობინება: PATH, INTERFACE ან MEMBER თავსართის ველი აკლია ან " -"არასწორია" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL შეტყობინება: PATH თავსართის ველი იყენებს დაცულ მნიშვნელობას /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL შეტყობინება: INTERFACE თავსართის ველი იყენებს დაცულ მნიშვნელობას org." -"freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "მინდოდა წამეკითხა %lu ბაიტი, მაგრამ მივიღე მხოლოდ %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "" "სტრიქონის \"%s\" შემდეგ მოველოდი ბაიტს NUL, მაგრამ აღმოჩენილია ბაიტი %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -835,23 +853,23 @@ msgstr "" "მოველოდი სწორ UTF-8 სტრიქონს, მაგრამ ბაიტის წანაცვლებაზე %d (სტრიქონის " "სიგრძეა %d) აღმოჩენილია არასწორი ბაიტები. სწორი UTF-8 ამ დრომდე იყო \"%s\"" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "მნიშვნელობა მეტისმეტად ღრმადაა ჩადგმული" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "" "დამუშავებული მნიშვნელობა \"%s\" სწორ D-Bus-ის ობიექტის ბილიკს არ წარმოადგენს" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "" "დამუშავებული მნიშვნელობა \"%s\" სწორ D-Bus-ის ხელმოწერას არ წარმოადგენს" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -860,7 +878,7 @@ msgid_plural "" msgstr[0] "" "შემხვდა მასივი სიგრძით %u ბაიტი. მაქსიმალური სიგრძეა 2<<26 ბაიტი (64 მიბ)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -869,18 +887,18 @@ msgstr "" "შემხვდა მასივი ტიპით \"a%c\". მოველოდი, რომ %u ბაიტის ნამრავლის სიგრძე " "ექნებოდა, მაგრამ ის %u ბაიტის სიგრძისაა" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "D-Bus-ში ცარიელი სტრუქტურები (კორტეჟები) მხარდაჭერილი არაა" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" "ვარიანტისთვის დამუშავებული მნიშვნელობა \"%s\" სწორ D-Bus-ის ხელმოწერას არ " "წარმოადგენს" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -888,7 +906,7 @@ msgstr "" "D-Bus-ის მავთულის ფორმატიდან GVariant-ის სტრიქონის ტიპით \"%s\" " "დესერიალიზაციის შეცდომა" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -897,30 +915,30 @@ msgstr "" "არასწორი ბოლოიანობის მნიშვნელობა. მოველოდი 0x6c (“l”) ან 0x42 (“B”) მაგრამ " "მიღებულია მნიშვნელობა: 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "არასწორი პროტოკოლის ძირითადი ვერსია. მოველოდი 1, აღმოჩენილია %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "აღმოჩენილია ხელმოწერის თავსართი, მაგრამ ის ხელმოწერის ტიპი არაა" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "აღმოჩენილია ხელმოწერის თავსართი ხელმოწერით \"%s\", მაგრამ შეტყობინების " "სხეული ცარიელია" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" "დამუშავებული მნიშვნელობა \"%s\" სწორ D-Bus-ის ხელმოწერას არ წარმოადგენს " "(სხეულისთვის)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -928,11 +946,11 @@ msgstr[0] "" "შეტყობინებაში ხელმოწერის თავსართი აღმოჩენილი არაა, მაგრამ შეტყობინების " "სხეული %u ბაიტია" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "დესერიალიზაცია შეუძლებელია შეტყობინებისთვის: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -940,7 +958,7 @@ msgstr "" "D-Bus-ის მავთულის ფორმატიდან GVariant-ის სტრიქონის ტიპით \"%s\" " "სერიალიზაციის შეცდომა" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -948,18 +966,18 @@ msgstr "" "დესკრიპტორების რაოდენობა შეტყობინებაში (%d) განსხვავდება თავსართის ველისგან " "(%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "სერიალიზაცია შეუძლებელია შეტყობინებისთვის: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "შეტყობინების სხეულს გააჩნია ხელმოწერა \"%s\", მაგრამ ხელმოწერის თავსართი " "აღმოჩენილი არაა" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -968,19 +986,19 @@ msgstr "" "შეტყობინების სხეულს გააჩნია ხელმოწერა \"%s\", მაგრამ ხელმოწერა, რომელიც " "თავსართის ველშია, \"%s\"-ია" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "შეტყობინების სხეული ცარელია, მაგრამ ხელმოწერა თავსართის ველში \"(%s)\"-ის " "ტოლია" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "\"%s\" ტიპის სხეულით დაბრუნების შეცდომა" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "შეცდომა ცარიელი სხეულით დაბრუნდა" @@ -1000,22 +1018,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "აპარატურის პროფილის მიღების შეცდომა: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "%s-ის ან %s-ის ჩატვირთვის შეცდომა: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "%s-თვის StartServiceByName-ის გამოძახების შეცდომა: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "მოულოდნელი პასუხი %d StartServiceByName(\"%s\") მეთოდიდან" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1024,25 +1042,25 @@ msgstr "" "მეტოდის ჩაწორება შეუძლებელია. პროქსი კარგად ცნობილი სახელისთვის %s მფლობლის " "გარეშეა და პროქსი G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START ალმით აიგო" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "აბსტრაქტული სახელების სივრცე მხარდაჭერილი არაა" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "სერვერის შექმნისას nonce ფაილს ვერ მიუთითებთ" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "შეცდომა nonce ფაილში ჩაწერისას მისამართზე \"%s\": %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "სტრიქონი \"%s\" სწორ D-Bus-ის GUID-ს არ წარმოადგენს" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "მხარდაუჭერელ ტრანსპორტზე \"%s\" ვერ მოვუსმენ" @@ -1337,71 +1355,72 @@ msgstr "შეცდომა: %s მატარებლის ცნობი msgid "Not authorized to change debug settings" msgstr "გამართვის პარამეტრების შესაცვლელად ავტორიზაცია არ გაგაჩნიათ" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "უსახელო" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr ".desktop ფაილში Exec ველი მითითებული არაა" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "აპლიკაციისთვის აუცილებელი ტერმინალი ვერ ვიპოვე" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "პროგრამა '%s' $PATH-ში აღმოჩენილი არაა" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "ვერ შევქმენი მომხმარებლის აპლიკაციის კონფიგურაციის საქაღალდე %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "ვერ შევქმენი MIME-ის კონფიგურაციის საქაღალდე %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "აპლიკაციის ინფორმაციას იდენტიფიკატორი აკლია" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "მომხმარებლის სამუშაო მაგიდის ფაილის '%s' შექმნა შეუძლებელია" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "ხელით მითითებული აღწერა %s-სთვის" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "ამძრავს გამოღების ფუნქცია არ გააჩნია" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "ამძრავს გამოღების ან eject_with_operations-ის ფუნქცია არ გააჩნია" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "ამძრავს მედიის გამოკითხვის ფუნქცია არ გააჩნია" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "ამძრავს გაშვების ფუნქცია არ გააჩნია" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "ამძრავს გაჩერების ფუნქცია არ გააჩნია" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS უკანაბოლოს TLS მიბმის მიღების მხარდაჭერა არ გააჩნია" @@ -1414,27 +1433,27 @@ msgstr "TLS-ის მხარდაჭერა ხელმისაწვდ msgid "DTLS support is not available" msgstr "DTLS-ის მხარდაჭერა ხელმისაწვდომი არაა" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "GEmblem-ის კოდირების %d ვერსია უცნობია" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "კოდების არასწორი რაოდენობა(%d) GEmblem-ის დაშიფვრაში" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "GEmblemedIcon-ის კოდირების %d ვერსია უცნობია" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "კოდების არასწორი რაოდენობა(%d) GEmblemedIcon-ის დაშიფვრაში" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "GEmblemedIcon-სთვის GEmblem-ს ველოდებოდი" @@ -1442,129 +1461,134 @@ msgstr "GEmblemedIcon-სთვის GEmblem-ს ველოდებოდი #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "შეცველი მიმაგრება არ არსებობს" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "საქაღალდეზე ზემოდან კოპირება შეუძლებელია" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "საქაღალდის საქაღალდეზე კოპირება შეუძლებელია" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "სამიზნე ფაილი უკვე არსებობს" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "საქაღალდის რეკურსიულად კოპირება შეუძლებელია" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "ფაილების დიაპაზონის კოპირება მხარდაჭერილი არაა" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "ფაილის შეერთების შეცდომა: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "შეერთება მხარდაჭერილი არაა" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" -msgstr "" +msgstr "მიმაგრების წერტილებს შორის კოპირება (reflink/clone) მხარდაჭერილი არაა" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" -msgstr "" +msgstr "კოპირება (reflink/clone) მხარდაუჭერელი ან არასწორია" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" -msgstr "" +msgstr "კოპირება (reflink/clone) მხარდაუჭერელია ან არ იმუშავა" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "ვერ მივიღე ატრიბუტი %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "სპეციალური ფაილის კოპირება შეუძლებელია" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "სიმბმბულის მითითებული მნიშვნელობა არასწორია" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2404 msgid "Symbolic links not supported" msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "ნაგავი მხარდაუჭერელია" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "ფაილის სახელი არ შეიძლება, \"%c\"-ს შეიცავდეს" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "შაბლონისთვის \"%s\" დროებითი საქაღალდის შექმნის შეცდომა: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "ტომს მიმაგრების მხარდაჭერა არ გააჩნია" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "ამ ფაილის გასახსნელი პროგრამა დარეგისტრირებული არაა" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "დამთვლელი დახურულია" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "ფაილის დამთვლელი დაკავებულია" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "ფაილის დამთვლელი უკვე დახურულია" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "GFileIcon-ის კოდირების %d ვერსია უცნობია" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "GFileIcon-ს ის შეყვანილი მონაცემები არასწორია" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "ნაკადს query_info-ის მხარდაჭერა არ გააჩნია" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "ნაკადში გადახვევა მხარდაუჭერელია" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "შეყვანის ნაკადზე წაკვეთა დაუშვებელია" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "ნაკადის მოკვეთა მხარდაუჭერელია" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "ჰოსტის არასწორი სახელი" @@ -1597,64 +1621,64 @@ msgstr "HTTP პროქსის პასუხი მეტისმეტ msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP პროქსისთან მიერთება მოულოდნელად დაიხურა." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "კოდების არასწორი რაოდენობა (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "ტიპი კლასის სახელისთვის %s მითითებული არაა" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "ტიპი %s GIcon ინტერფეისის განხორციელებას არ ახდენს" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "ტიპი %s klasSi araa" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "არასწორი ვერსიის ნომერი: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "ტიპი %s GIcon ინტერფეისზე from_tokens()-ის განხორციელებას არ ახდენს" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "ხატულის კოდირების მითითებული ვერსიის დამუშავება შეუძლებელია" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "მისამართი მითითებული არაა" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "სიგრძე %u მისამართისთვის მეტისმეტად გრძელია" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "მისამართს ბიტები პრეფიქსის სიგრძის მიღმა აქვს" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "\"%s\"-ის IP მისამართის ნიღბის სახით დამუშავება შეუძლებელია" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "სოკეტის მისამართისთვის ადგილი საკმარისი არაა" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "სოკეტის მხარდაუჭერელი მისამართი" @@ -1668,7 +1692,7 @@ msgstr "შეყვანის ნაკადს წაკითხვის #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "ნაკადი გადაუდებელ ოპერაციას ასრულებს" @@ -1684,7 +1708,7 @@ msgstr "გადაადგილების შემთხვევაშ msgid "“version” takes no arguments" msgstr "\"version\"-ს არგუმენტები არ აქვს" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "გამოყენება:" @@ -1692,79 +1716,79 @@ msgstr "გამოყენება:" msgid "Print version information and exit." msgstr "ვერსიის ინფორმაციის გამოტანა და გასვლა." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "ბრძანებები:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "სტანდარტულ შეტანაზე არსებული ფაილების შეერთება" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "ერთი ან მეტი ფაილის კოპირება" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "მდებარეობების შესახებ ინფორმაციის ჩვენება" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "აპლიკაციის გაშვება სამუშაო მაგიდის ფაილიდან" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "მდებარეობების შემცველობის სია" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "დამმუშავებლის დაყენება ან მიღება mimetype-სთვის" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "საქაღალდეების შექმნა" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "ფაილების და საქაღალდეების ცვლილებების მონიტორინგი" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "მდებარეობების მიმაგრება ან მოხსნა" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "ერთი ან მეტი ფაილის გადატანა" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "ფაილების ნაგულისხმევი აპლიკაციით გახსნა" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "ფაილის სახელის გადარქმევა" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "ერთი ან მეტი ფაილის აშლა" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "სტანდარტული შეტანიდან წაკითხვა და შენახვა" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "ფაილის ატრიბუტის დაყენება" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "ფაილების ან საქაღალდეების ნაგვის ყუთში გადატანა" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "ხეში მდებარეობების შემცველობის ჩამონათვალი" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "ბრძანებები:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "დეტალური დახმარების მისაღებად გამოიყენეთ %s.\n" @@ -1774,7 +1798,7 @@ msgid "Error writing to stdout" msgstr "შეცდომა stdout-ზე ჩაწერისას" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1793,73 +1817,80 @@ msgid "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" +"gio cat ჩვეულებრივი cat ბრძანებასავით მუშაობს, მაგრამ\n" +"ლოკალური ფაილების მაგიერ GIO მდებარეობებს იყენებს: მაგალითად,\n" +"შეგიძლიათ, მდებარეობად smb://server/resource/file.txt გამოიყენოთ." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "მდებარეობები მითითებული არაა" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "სამიზნე საქაღალდის გარეშე" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "მიმდინარეობის ჩვენება" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "კითხვა თავზე გადაწერამდე" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "ყველა ატრიბუტის შენარჩუნება" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "არსებული სამიზნე ფაილების მარქაფი" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "არასდროს მიჰყვე სიმბმულებს" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "სამიზნისთვის ნაგულისხმევი წვდომების გამოყენება" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "სამიზნისთვის ნაგულისხმევი ფაილის ცვლილების დროის შტამპების გამოყენება" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "გადაცემულია %s %s-დან (%s/წმ)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "წყარო" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "დანიშნულება" -#: gio/gio-tool-copy.c:107 -msgid "Copy one or more files from SOURCE to DESTINATION." -msgstr "" - #: gio/gio-tool-copy.c:109 +msgid "Copy one or more files from SOURCE to DESTINATION." +msgstr "ერთი ან მეტი ფაილის კოპირება მითითებული წყაროდან მითითებულ სამიზნეში." + +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "სამიზნე %s საქაღალდე არაა" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: გადავაწერო %s-ს? " @@ -1900,52 +1931,52 @@ msgstr "საჩვენებელი სახელი :%s\n" msgid "edit name: %s\n" msgstr "სახელის ჩასწორება: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "სახელი: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "ტიპი : %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "ზომა: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "დამალული\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "ლოკალური ბილიკი: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix მიმაგრება: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "დაყენებადი პარამეტრები:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "ჩაწერადი ატრიბუტი სახელის სივრცეები:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "მდებარეობების შესახებ ინფორმაციის ჩვენება." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1981,7 +2012,7 @@ msgstr "%s-ის ჩატვირთვის შეცდომა: %s" #: gio/gio-tool-launch.c:109 #, c-format msgid "Unable to load application information for ‘%s‘" -msgstr "" +msgstr "ვერ ჩავტვირთე აპლიკაციის ინფორმაცია '%s'-სთვის" #: gio/gio-tool-launch.c:121 #, c-format @@ -2038,7 +2069,7 @@ msgstr "" #: gio/gio-tool-mime.c:102 msgid "Must specify a single mimetype, and maybe a handler" -msgstr "" +msgstr "უნდა მიუთითოთ ერთი MIME ტიპი ან, შეიძლება, დამმუშავებელი" #: gio/gio-tool-mime.c:118 #, c-format @@ -2075,6 +2106,7 @@ msgstr "შეცდომა ინფორმაციის ჩატვი #, c-format msgid "Failed to set “%s” as the default handler for “%s”: %s\n" msgstr "" +"შეცდომა \"%s\"-ის ნაგულიხმევ დამმუშავებლად დაყენებისას \"%s\"-სთვის: %s\n" #: gio/gio-tool-mkdir.c:33 msgid "Create parent directories" @@ -2093,11 +2125,11 @@ msgstr "" #: gio/gio-tool-monitor.c:39 msgid "Monitor a directory (default: depends on type)" -msgstr "" +msgstr "საქაღალდის მონიტორინგი (ნაგულისხმევი: დამოკიდებულია ტიპზე)" #: gio/gio-tool-monitor.c:41 msgid "Monitor a file (default: depends on type)" -msgstr "" +msgstr "ფაილის მონიტორინგი (ნაგულისხმევი: დამოკიდებულია ტიპზე)" #: gio/gio-tool-monitor.c:43 msgid "Monitor a file directly (notices changes made via hardlinks)" @@ -2105,7 +2137,7 @@ msgstr "" #: gio/gio-tool-monitor.c:45 msgid "Monitors a file directly, but doesn’t report changes" -msgstr "" +msgstr "ფაილის პირდაპირი მონიტორინგი ცვლილებების გადმოცემის გარეშე" #: gio/gio-tool-monitor.c:47 msgid "Report moves and renames as simple deleted/created events" @@ -2178,7 +2210,7 @@ msgstr "დამატებითი ინფორმაციის ჩვ #: gio/gio-tool-mount.c:77 msgid "The numeric PIM when unlocking a VeraCrypt volume" -msgstr "" +msgstr "რიცხვითი PIM დაშიფრული VeraCrypt ტომის გახსნისას" #: gio/gio-tool-mount.c:77 msgid "PIM" @@ -2214,7 +2246,7 @@ msgstr "" #: gio/gio-tool-move.c:101 msgid "Move one or more files from SOURCE to DEST." -msgstr "" +msgstr "ერთი ან მეტი ფაილის გადატანა მითითებული წყაროდან მითითებულ სამიზნეში." #: gio/gio-tool-move.c:103 msgid "" @@ -2440,6 +2472,8 @@ msgstr "დამუშავების უცნობი პარამე #, c-format msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" msgstr "" +"%s წინასწარი დამუშავება მოთხოვნილია, მაგრამ %s დაყენებული არაა და %s გარემოს " +"ცვლად PATH-ში არაა" #: gio/glib-compile-resources.c:459 #, c-format @@ -2670,12 +2704,12 @@ msgstr " უკვე მითითებულია" #: gio/glib-compile-schemas.c:607 #, c-format msgid "alias target “%s” is not in enumerated type" -msgstr "" +msgstr "ფსევდონიმის სამიზნე “%s” ჩამონათვლის ტიპი არაა" #: gio/glib-compile-schemas.c:608 #, c-format msgid "alias target “%s” is not in " -msgstr "" +msgstr "ფსევდონიმის სამიზნე “%s” სიაში არაა" #: gio/glib-compile-schemas.c:623 #, c-format @@ -2690,6 +2724,7 @@ msgstr "ცარელი სახელები დაუშვებელ #, c-format msgid "Invalid name “%s”: names must begin with a lowercase letter" msgstr "" +"არასწორი სახელი \"%s\": სახელები ქვედა რეგისტრის სიმბოლოებით უნდა იწყებოდეს" #: gio/glib-compile-schemas.c:819 #, c-format @@ -2711,7 +2746,7 @@ msgstr "" #: gio/glib-compile-schemas.c:845 #, c-format msgid "Invalid name “%s”: maximum length is 1024" -msgstr "" +msgstr "არასწორი სახელი \"%s\": მაქსიმალური სიგრძეა 1024" #: gio/glib-compile-schemas.c:917 #, c-format @@ -2758,7 +2793,7 @@ msgstr "" #: gio/glib-compile-schemas.c:1060 #, c-format msgid "No to override" -msgstr "" +msgstr "გადასაფარი -ის გარეშე" #: gio/glib-compile-schemas.c:1068 #, c-format @@ -2803,16 +2838,18 @@ msgid "" " extends but “%s” " "does not extend “%s”" msgstr "" +" აფართოებს -ს, " +"მაგრამ “%s” არ აფართოებს “%s”-ს" #: gio/glib-compile-schemas.c:1224 #, c-format msgid "A path, if given, must begin and end with a slash" -msgstr "" +msgstr "ბილიკი, თუ მითითებულია, უნდა იწყებოდეს და მთავრდებოდეს დახრილი ხაზით" #: gio/glib-compile-schemas.c:1231 #, c-format msgid "The path of a list must end with “:/”" -msgstr "" +msgstr "სიის ბილიკი ':/'-ით უნდა მთავრდებოდეს" #: gio/glib-compile-schemas.c:1240 #, c-format @@ -2834,7 +2871,7 @@ msgstr "" #: gio/glib-compile-schemas.c:1518 #, c-format msgid "Element <%s> not allowed at the top level" -msgstr "" +msgstr "ელემენტი <%s> დაუშვებელია უმაღლეს დონეზე" #: gio/glib-compile-schemas.c:1536 msgid "Element is required in " @@ -2982,126 +3019,126 @@ msgstr "'%s'-სთვის ფაილური სისტემის ი #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "შემცველი მიმაგრების წერტილი ფაილისთვის '%s' აღმოჩენილი არაა" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "საქაღალდის '/' სახელის გადარქმევა შეუძლებელია" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "შეცდომა სახელის გადარქმევისას ფაილისთვის %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "" "ფაილის სახელის გადარქმევა შეუძლებელია, რადგან ფაილის სახელი უკვე არსებობს" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "ფაილის არასწორი სახელი" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "ფაილის (%s) გახსნის შეცდომა: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "ფაილის (%s) წაშლის შეცდომა: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "ფაილის (%s) ნაგვის ყუთში გადატანის შეცდომა: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "სანაგვის საქაღალდის (%s) შექმნის შეცდომა: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "%s-ის წასაშლელად ზედა საქაღალდის პოვნა შეუძლებელი იყო" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "სისტემურ შიდა მიმაგრების წერტილებზე ნაგვის ყუთის შექმნა მხარდაჭერილი არაა" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "სანაგვე საქაღალდის (%s) შექმნა შეუძლებელია %s-ის წასაშლელად" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "წაშლის ინფორმაციის ფაილის (%s) შექმნის შეცდომა: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "ფაილის (%s) წაშლა ფაილური სისტემის საზღვრებს მიღმა შეუძლებელია" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "ფაილის (%s) წაშლა შეუძლებელია: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "ფაილის (%s) წაშლა შეუძლებელია" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "საქაღალდის (%s) შექმნის შეცდომა: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "ფაილურ სისტემას სიმბმულების მხარდაჭერა არ გააჩნია" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "სიმბოლური ბმულის ('%s') შექმნის შეცდომა:%s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "ფაილის (%s) გადატანის შეცდომა: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "საქაღალდის საქაღალდეზე გადატანა შეუძლებელია" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "მარქაფის ფაილის შექმნის შეცდომა" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "სამიზნე ფაილის წაშლა შეუძლებელია: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "მიმაგრების წერტილებს შორის გადატანა მხარდაჭერილი არაა" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "დისკზე %s-ის მიერ დაკავებული ადგილის გამოთვლის შეცდომა: %s" @@ -3123,115 +3160,115 @@ msgstr "გაფართოებული ატრიბუტის არ msgid "Error setting extended attribute “%s”: %s" msgstr "გაფართოებული ატრიბუტის \"%s\" დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (არასწორი კოდირება)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "ფაილის \"%s\" შესახებ ინფორმაციის მიღების შეცდომა: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "შეცდომა ფაილის დესკრიპტორის შესახებ ინფორმაციის მიღებისას: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "ატრიბუტის არასწორი ტიპი (მოველოდი uint32-ს)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "ატრიბუტის არასწორი ტიპი (მოველოდი uint64-ს)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "არასწორი ატრიბუტის ტიპი (მოველოდები ბაიტს ან სტრიქონს)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "სიმბმულებზე წვდომების დაყენების შეცდომა" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "წვდომის დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "მფლობლის დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "სიმბმული არა-ნულოვანი უნდა იყოს" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "სიმბმულის დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "სიმბმულის დაყენების შეცდომა: ფაილი სიმბმული არაა" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" -msgstr "" +msgstr "UNIX დროის შტამპი %lld 64 ბიტში არ ეტევა" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" -msgstr "" +msgstr "UNIX დროის შტამპი %lld Windows-ის მიერ მხარდაჭერილი შუალედის გარეთაა" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "ფაილის სახელის \"%s\" UTF-16-ში გადაყვანა შეუძლებელია" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" -msgstr "" +msgstr "ფაილის \"%s\" გახსნა შეუძლებელია: Windows-ის შეცდომა %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "%s-ისთვის შეცვლის ან წვდომის დროის დაყენების შეცდომა: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "ცვლილების ან წვდომის დროის დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux-ის კონტექსტი ნულოვანი არ უნდა იყოს" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "ამ სისტემაზე SELnux ჩართული არაა" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "SELinux-ის კონტექსტის დაყენების შეცდომა: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "ატრიბუტის (%s) დაყენება მხარდაუჭერელია" @@ -3284,7 +3321,7 @@ msgid "Error truncating file: %s" msgstr "ფაილის წაკვეთის შეცდომა: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "ფაილის (\"%s\") გახსნის შეცდომა: %s" @@ -3306,58 +3343,59 @@ msgstr "ფაილი გარედან შეიცვალა" msgid "Error removing old file: %s" msgstr "ძველი ფაილის წაშლის შეცდომა: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "მიწოდებული GSeekType არასწორია" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "გადახვევის არასწორი მოთხოვნა" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "GMemoryInputStream-ის წაკვეთა შეუძლებელია" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "მეხსიერების გამოტანის ნაკადის ზომა შეცვლადი არაა" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "მეხსიერების გამოტანის ნაკადის ზომის შეცვლა ჩავარდა" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" msgstr "" +"მეხსიერება, რომელიც პროცესს ჩასაწერად სჭირდება, ხელმისაწვდომ სივრცეზე დიდია" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" -msgstr "" +msgstr "მოთხოვნილია გადახვევა ნაკადის დასაწყისამდე" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" -msgstr "" +msgstr "მოთხოვნილა გადახვევა ნაკადის ბოლოს შემდეგ" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "მიმაგრების წერტილს არ გააჩნია მხარდაჭერა ფუნქციის \"unmount\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "მიმაგრების წერტილს არ გააჩნია მხარდაჭერა ფუნქციის \"eject\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "მიმაგრების წერტილს არ გააჩნია მხარდაჭერა ფუნქციის \"unmount\" ან " @@ -3366,7 +3404,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "მიმაგრების წერტილს არ გააჩნია მხარდაჭერა ფუნქციის \"eject\" ან " @@ -3375,14 +3413,14 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "მიმაგრების წერტილს არ გააჩნია მხარდაჭერა ფუნქციის \"remount\"" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "" "მიმაგრების წერტილს შემცველობის ტიპის გამოცნობის ფუნქციის მხარდაჭერა არ " @@ -3391,22 +3429,22 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" "მიმაგრების წერტილს სინქრონული შემცველობის ტიპის გამოცნობის ფუნქციის " "მხარდაჭერა არ გააჩნია" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "ჰოსტის სახელი “%s” შეიცავს “[”-ს, მაგრამ არა “]”-ს" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "ქსელი მიუწვდომელია" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "ჰოსტი მიუწვდომელია" @@ -3434,7 +3472,7 @@ msgstr "NetworkManager-ი გაშვებული არაა" msgid "NetworkManager version too old" msgstr "NetworkManager-ის ვერსია მეტისმეტად ძველია" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "გამოტანის ნაკადს ჩაწერის ფუნქცია განხორციელებული არ აქვს" @@ -3447,38 +3485,38 @@ msgstr "%s-სთვის გადაცემული ვექტორე msgid "Source stream is already closed" msgstr "შეყვანის ნაკადი უკვე დახურულია" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "მიუთითებელი პროქსის მოძებნის შეცდომა" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "'%s'-ის ამოხსნის შეცდომა: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s განხორციელებული არაა" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "დომენის არასწორი სახელი" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "რესურსი მისამართზე \"%s\" არ არსებობს" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "რესურის, მისამართზე \"%s\", გაშლა ჩავარდა" @@ -3496,26 +3534,26 @@ msgstr "რესურსი მისამართზე '%s' საქა msgid "Input stream doesn’t implement seek" msgstr "შეყვანის ნაკადს გადახვევის ფუნქცია განხორციელებული არ აქვს" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" -msgstr "" +msgstr "რესურსების შემცველი სექციების სია მითითებულ elf ფაილში" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" msgstr "" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "ფაილი [ბილიკი]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "სექცია" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3523,15 +3561,15 @@ msgid "" "Details include the section, size and compression" msgstr "" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "რესურსის ფაილის stdout-ზე გაშლა" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "ფაილის ბილიკი" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3547,7 +3585,7 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3562,19 +3600,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " სექცია (არასავალდებულო) elf სექციის სახელი\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " ბრძანება (არასავალდებულო) ასახსნელი ბრძანება\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " ფაილი elf ფაილი (გამშვები ან გაზიარებული ბიბლიოთეკა)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3582,19 +3620,19 @@ msgstr "" " ფაილი elf ფაილი (გამშვები ან გაზიარებული ბიბლიოთეკა)\n" " ან აგებული რესურსის ფაილი\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[ბილიკი]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr "" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "ბილიკი" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " ბილიკი რესურსის ბილიკი\n" @@ -3606,12 +3644,12 @@ msgstr "სქემა \"%s\" არ არსებობს\n" #: gio/gsettings-tool.c:57 #, c-format msgid "Schema “%s” is not relocatable (path must not be specified)\n" -msgstr "" +msgstr "სქემა \"%s\" გადატანადი არაა (ბილიკი მითითებული არ უნდა იყოს)\n" #: gio/gsettings-tool.c:78 #, c-format msgid "Schema “%s” is relocatable (path must be specified)\n" -msgstr "" +msgstr "სქემა \"%s\" გადატანადია (ბილიკი მითითებული არ უნდა იყოს)\n" #: gio/gsettings-tool.c:92 msgid "Empty path given.\n" @@ -3763,7 +3801,7 @@ msgstr "" #: gio/gsettings-tool.c:729 msgid " KEY The (optional) key within the schema\n" -msgstr "" +msgstr " KEY (არასავალდებულო) გასაღები სქემაში\n" #: gio/gsettings-tool.c:733 msgid " KEY The key within the schema\n" @@ -3791,213 +3829,215 @@ msgstr "მიწოდებული სქემის სახელი ც msgid "No such key “%s”\n" msgstr "ასეთი გასაღები \"%s\" არ არსებობს\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "სოკეტი არასწორია. ინიციალიზებული არაა" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "სოკეტი არასწორია. ინიციალიზაცია ჩავარდა მიზეზით: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "სოკეტი უკვე დახურულია" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1445 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "სოკეტის I/O ვადა გავიდა" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "იქმნება GSocket fd-დან: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "სოკეტის შექმნის შეცდომა: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "მითითებული ოჯახი უცნობია" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "მითითებული პროტოკოლი უცნობია" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." -msgstr "" +msgstr "დატაგრამის ოპერაციებს არა-დატაგრამის სოკეტზე ვერ გამოიყენებთ." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" +"დატაგრამის ოპერაციებს სოკეტზე, რომელსაც მოლოდინის დრო დაყენებული აქვს, ვერ " +"გამოიყენებთ." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "ლოკალური მისამართის მიღება შეუძლებელია: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "დაშორებული მისამართის მიღება შეუძლებელია: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "მოსმენა შეუძლებელია: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "მისამართზე '%s' მიბმის შეცდომა: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "შეცდომა multicast ჯგუფში გაწევრებისას: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "შეცდომა multicast ჯგუფის დატოვებისას: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "წყაროზე-დამოკიდებული multicast-ის მხარდაჭერა არ არსებბობს" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "სოკეტის მხარდაუჭერელი ოჯახი" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "წყაროზე-დამოკიდებული IPv4 მისამართი არაა" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "ინტერფეისის სახელი მეტისმეტად გრძელია" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "ინტერფეისი ვერ ვიპოვე: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" -msgstr "" +msgstr "IPv4 წყაროზე-დამოკიდებული multicast-ის მხარდაჭერის გარეშე" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" -msgstr "" +msgstr "IPv6 წყაროზე-დამოკიდებული multicast-ის მხარდაჭერის გარეშე" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "შეერთების მიღების შეცდომა: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "მიმდინარეობს მიერთება" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "დარჩენილი შეცდომის მიღება შეუძლებელია: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "მონაცემები მიღების შეცდომა: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "მონაცემების გაგზავნის შეცდომა: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "სოკეტის გამორთვის შეცდომა: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "სოკეტის დახურვის შეცდომა: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "ველოდები სოკეტის მდგომარეობას: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "შეუძლებელია შეტყობინების გაგზავნა: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "შეტყობინების ვექტორები მეტისმეტად დიდია" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "შეტყობინების გაგზავნის შეცდომა: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" -msgstr "" +msgstr "ფუნქცია GSocketControlMessage Windows-ზე მხარდაჭერილი არაა" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "შეტყობინების მიღების შეცდომა: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "სოკეტის მომხმარებლის/პაროლის წაკითხვის შეცდომა: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" -msgstr "" +msgstr "g_socket_get_credentials ამ OS-სთვის განხორციელებული არაა" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "პროქსი სერვერთან (%s) დაკავშირების შეცდომა: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "%s-სთან მიერთების შეცდომა: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "მიერთების პრობლემა: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "არა-TCP შეერთების ზემოდან პროქსი მხარდაუჭერელია." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "პროქსი პროტოკოლი \"%s\" მხარდაუჭერელია." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "მსმენელი უკვე დახურულია" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "დამატებული სოკეტი დახურულია" @@ -4089,234 +4129,247 @@ msgstr "SOCKSv5 პროქსის მითითებული მის msgid "Unknown SOCKSv5 proxy error." msgstr "უცნობი SOCKSv5 პროქსის შეცდომა." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "არხის შექმნა ქვეპროცესთან დასაკავშირებლად ვერ მოხერხდა (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "ამ პლატფორმაზე ფაიფები მხარდაჭერილი არაა" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "GThemedIcon-ის კოდირების %d ვერსია უცნობია" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "სწორი მისამართები ვერ ვიპოვე" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "\"%s\"-ის უკუამოხსნის შეცდომა: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "DNS %s ჩანაწერის დამუშავება ჩავარდა: DNS პაკეტი შეცდომებს შეიცავს" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" -msgstr "" +msgstr "მოთხოვნილი ტიპის DNS ჩანაწერის გარეშე \"%s\"-სთვის" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "დროებით \"%s\" ვერ ამოვხსენი" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "'%s'-ის ამოხსნის შეცდომა" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "არასწორი DNS პაკეტი" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "\"%s\"-სთვის DNS პასუხის დამუშავება ჩავარდა: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" -msgstr "" +msgstr "PEM-ით კოდირებული პირადი გასაღები ვერ ვიპოვე" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" -msgstr "" +msgstr "PEM-ით დაშიფრული პირადი გასაღების გაშიფვრა შეუძლებელია" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" -msgstr "" +msgstr "PEM-ით დაშიფრული პირადი გასაღების გაშიფვრის შეცდომა" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" -msgstr "" +msgstr "PEM-ით დაშიფრული სერტიფიკატი ვერ ვიპოვე" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" -msgstr "" +msgstr "PEM-ით დაშიფრული სერტიფიკატის გაშიფვრის შეცდომა" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" -msgstr "" +msgstr "მიმდინარე TLS უკანაბოლოს PKCS #12-ის მხარდაჭერა არ გააჩნია" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" -msgstr "" +msgstr "GTlsBackend-ს PKCS #11 სერტიფიკატების შექმნის მხარდაჭერა არ გააჩნია" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." -msgstr "" +msgstr "ბოლო შანსი, შეიყვანოთ სწორი პაროლი, სანამ წვდომა დაგებლოკებათ." #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." msgstr "" +"რამდენიმე პაროლი, რომელიც შეიყვანეთ, არასწორი აღმოჩნდა. თუ ეს განმეორდება, " +"წვდომა დაგებლოკებათ." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "შეყვანილი პაროლი არასწორია." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "FD-ის გაგზავნა მხარდაუჭერელია" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" -msgstr[0] "" +msgstr[0] "მოველოდი 1 საკონტროლო შეტყობინებას. მივიღე %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" -msgstr "" +msgstr "დამატებითი მონაცემების მოულოდნელი ტიპი" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "მოველოდი ერთ fd-ს, მივიღე %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "მიღებულია არასწორი fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "FD-ის მიღება მხარდაუჭერელია" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "შეცდომა ავტორიზაციის დეტალების გაგზავნისას: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" -msgstr "" +msgstr "შეცდომა SO_PASSCRED-ის ჩართვისას: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" -msgstr "" +msgstr "არ მოველოდი საკონტროლო შეტყობინებას. მივიღე %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" -msgstr "" +msgstr "შეცდომა SO_PASSCRED-ის გამორთვისას: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "შეცდომა ფაილის დესკრიპტორიდან კითხვისას: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "შეცდომა ფაილის დესკრიპტორის დახურვისას: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "ფაილური სისტემის საწყისი საქაღალდე" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "შეცდომა ფაილის დესკრიპტორში ჩაწერისას: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "ტომს გამოღების ფუნქცია არ გააჩნია" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "დამმუშავებლიდან წაკითხვის შეცდომა: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "დამმუშავებლის დახურვის შეცდომა: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "დამმუშავებელში ჩაწერის შეცდომა: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "მეხსიერება საკმარისი არ არის" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "შიდა შეცდომა: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "საჭიროა მეტი შეტანა" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "არასწორი შეკუმშული მონაცემები" @@ -4326,7 +4379,7 @@ msgstr "მოსასმენი მისამართი" #: gio/tests/gdbus-daemon.c:19 msgid "Ignored, for compat with GTestDbus" -msgstr "" +msgstr "გამოტოვებულია. GTestDbus-სთან თავსებადობისთვის" #: gio/tests/gdbus-daemon.c:20 msgid "Print address" @@ -4344,149 +4397,289 @@ msgstr "D-Bus სერვისის გაშვება" msgid "Wrong args\n" msgstr "არასწორი არგუმენტები\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to open ‘%s’: %s" +msgstr "'%s'-ის გახსნა ჩავარდა: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "შეცდომა: გამოტანილი ინფორმაციის სრულად ჩაწერა შეუძლებელია: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "შეცდომა: ჩავარდა სახელის გადარქმევა '%s'-დან '%s'-მდე: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:52 +msgid "Include directories in GIR search path" +msgstr "საქაღალდეების ჩასმა GIR-ის ძებნის ბილიკში" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:51 +msgid "Output file" +msgstr "გამოტანის ფაილი" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "გაზიარებული ბიბლიოთეკა" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "გამართვის შეტყობინებების ჩვენება" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "დამატებითი შეტყობინებების ჩვენება" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:54 +msgid "Show program’s version number and exit" +msgstr "პროგრამის ვერსიის ნომრის ჩვენება და გასვლა" + +#: girepository/compiler/compiler.c:174 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "არგუმენტის დამუშავების შეცდომა: %s" + +#: girepository/compiler/compiler.c:201 +msgid "Please specify exactly one input file" +msgstr "მიუთითეთ ზუსტად ერთი შეყვანის ფაილი" + +#: girepository/compiler/compiler.c:217 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "ფაილის ('%s') დამუშავების შეცდომა: %s" + +#: girepository/compiler/compiler.c:242 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Typelib-ის აგება ჩავარდა მოდულისთვის '%s'" + +#: girepository/compiler/compiler.c:244 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "არასწორი typelib მოდულისთვის '%s': %s" + +#: girepository/decompiler/decompiler.c:53 +msgid "Show all available information" +msgstr "ხელმისაწვდომი ინფორმაციის სრულად ჩვენება" + +#: girepository/decompiler/decompiler.c:67 +#, c-format +msgid "Failed to parse: %s" +msgstr "დამუშავება ჩავარდა: %s" + +#: girepository/decompiler/decompiler.c:83 +msgid "No input files" +msgstr "შეყვანის ფაილების გარეშე" + +#: girepository/decompiler/decompiler.c:109 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "'%s'-ის წაკითხვის შეცდომა: %s" + +#: girepository/decompiler/decompiler.c:121 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to create typelib ‘%s’: %s" +msgstr "ვერ შევქმენი typelib '%s': %s" + +#: girepository/decompiler/decompiler.c:125 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "ჩავარდა ჩატვირთვა typelib-სთვის: %s" + +#: girepository/decompiler/decompiler.c:132 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "გაფრთხილება: %u მოდული ამოღებულია" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Typelib-ის ვერსია შესამოწმებლად" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "ვერსია" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "გაზიარებული ბიბლიოთეკების სია, რომელსაც typelib მოითხოვს" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "სხვა typelib-ების სია, რომელსაც დამუშავებადი typelib მოითხოვს" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "დასათვალიერებელი typelib" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "სახელების სივრცე" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- GI typelib-ის დათვალიერება" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "ბრძანებების სტრიქონის პარამეტრების დამუშავება შეუძლებელია: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "მიუთითეთ ზუსტად ერთი სახელების სივრცე" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "მიუთითეთ --print-shlibs, --print-typelibs ან ორივე" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "მოულოდნელი ატრიბუტი '%s' ელემენტ '%s'-თვის" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "ატრიბუტი'%s' ელემენტისთვის '%s' ვერ მოიძებნა" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "უცნობი ჭდე '%s', მოსალოდნელი იყო '%s'" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "უცნობი ჭდე '%s' - '%s'-ში" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" -msgstr "" +msgstr "არასწორი დრო/თარიღი ‘%s’ სანიშნეს ფაილში" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "მონაცემთა დასტებში მართებული საკვანძო ფაილი ვერ მოიძებნა" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "სანიშნე URI-სთვის '%s' უკვე არსებობს" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "URI '%s'-თვის სანიშნე ვერ მოიძებნა" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "URI '%s' სანიშნეში MIME ტიპი მითითებული არაა" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "URI '%s' სანიშნეში პირადი ალამი არ მითითებულა" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "URI '%s' სანიშნეში ჯგუფები დაყენებული არაა" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "პროგრამას სახელით \"%s\" სანიშნე \"%s\" არ დაურეგისტრირებია" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "არასრული სიმბოლო შეტანის ტექსტის ბოლოს" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "ვერ ხერხდება \"%s\" სიმბოლოს გარდაქმნა კოდირებაში \"%s\"" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "გადაყვანისას შეყვანაში ჩაშენებული NUL ბაიტი" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "გადაყვანისას გამოტანაში ჩაშენებული NUL ბაიტი" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "" "URI \"%s\" არ გახლავთ აბსოლუტური იდენტიფიკატორი \"file\" სქემის გამოყენებისას" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI იდენტიფიკატორი \"%s\" მცდარია" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "URI იდენტიფიკატორის \"%s\" ჰოსტის სახელი მცდარია" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI იდენტიფიკატორი \"%s\" შეიცავ მცდარ საკონტროლო სიმბოლოებს" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "ბილიკი \"%s\" აბსოლუტური არ გახლავთ" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%Y წლის %d %B, %T %Z" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%m/%d/%Y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%T" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4507,62 +4700,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "იანვარი" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "თებერვალი" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "მარტი" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "აპრილი" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "მაისი" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "ივნისი" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "ივლისი" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "აგვისტო" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "სექტემბერი" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "ოქტომბერი" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "ნოემბერი" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "დეკემბერი" @@ -4584,132 +4777,132 @@ msgstr "დეკემბერი" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "იან" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "თებ" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "მარ" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "აპრ" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "მაისი" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "ივნ" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "ივლ" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "აგვ" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "სექ" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "ოქტ" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "ნოე" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "დეკ" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "ორშაბათი" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "სამშაბათი" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "ოთხშაბათი" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "ხუთშაბათი" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "პარასკევი" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "შაბათი" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "კვირა" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "ორშ" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "სამ" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "ოთხ" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "ხუთ" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "პარ" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "შაბ" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "კვი" @@ -4731,62 +4924,62 @@ msgstr "კვი" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "იანვარი" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "თებერვალი" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "მარტი" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "აპრილი" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "მაისი" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "ივნისი" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "ივლისი" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "აგვისტო" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "სექტემბერი" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "ოქტომბერი" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "ნოემბერი" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "დეკემბერი" @@ -4808,189 +5001,203 @@ msgstr "დეკემბერი" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "იან" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "თებ" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "მარ" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "აპრ" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "მაისი" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "ივნ" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "ივლ" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "აგვ" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "სექ" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "ოქტ" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "ნოე" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "დეკ" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" -msgstr "" +msgstr "ვერ გავხსენი საქაღალდე \"%s\": %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "ვერ ხერხდება %lu ბაიტის გამოყოფა \"%s\" ფაილის წასაკითხად" +#| msgid "Could not allocate %lu byte to read file “%s”" +#| msgid_plural "Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "ვერ გამოვყავი %s, რომ წავიკითხო ფაილი \"%s\"" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "ფაილის \"%s\" წაკითხვის შეცდომა: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "%s: ფაილი ძალიან დიდია" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:825 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "გამოყოფის შეცდომა %s-სთვის" + +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "ფაილიდან \"%s\" წაკითხვის შეცდომა: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:900 glib/gfileutils.c:975 glib/gfileutils.c:1482 #, c-format msgid "Failed to open file “%s”: %s" msgstr "ფაილის (%s) გახსნა შეუძლებელია: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:913 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "ფაილის \"%s\" ატრიბუტების წაკითხვის შეცდომა: fstat() ჩავარდა: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:944 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "ფაილის \"%s\" გახსნის შეცდომა: fdopen() ჩავარდა: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1045 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "ვერ მოხერხდა '%s' ფაილის გადარქმევა - '%s': g_rename() ვერ შედგა: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1144 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "ვერ ვწერ '%s' ფაილს: ftruncate() ჩავარდა: %s" + +#: glib/gfileutils.c:1189 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1210 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "ვერ ვწერ '%s' ფაილს: fsync() ვერ შედგა: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1371 glib/gfileutils.c:1788 #, c-format msgid "Failed to create file “%s”: %s" msgstr "ვერ ვქმნი '%s' ფაილს: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1416 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "არსებული '%s' ფაილი ვერ ამოიშლება: g_unlink() ვერ შედგა: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1753 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "შაბლონი '%s' მცდარია და '%s'-ს არ უნდა შეიცავდეს" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1766 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "შაბლონი '%s' არ შეიცავს XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2360 glib/gfileutils.c:2389 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "ვერ ხერხდება გარდამქმნელის გახსნა '%s' - '%s': %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_line_string ვერ ხერხდება" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "გარდაუქმნელი მონაცემები წაკითხვის ბუფერში დარჩა" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "არხი არასრული სიმბოლოთი იხურება" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "უშუალოდ წაკითხვა ფუნქციაში g_io_channel_read_to_end ვერ ხერხდება" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "ძიების კატალოგებში შეუძლებელია დამოწმებული გასაღების პოვნა" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "ფაილი ჩვეულებრივი არაა" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -4998,50 +5205,50 @@ msgstr "" "გასაღების ფაილი '%s' შეიცავს სტრიქონს, რომელიც არ წარმოადგენს გასაღები-" "მნიშვნელობას, ჯგუფს ან კომენტარს" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "ჯგუფის მიუღებელი სახელი: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "საკვანძო ფაილი ჯგუფით არ იწყება" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "გასაღების მიუღებელი სახელი: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "გასაღების ფაილი შეიცავს მხარდაუჭერელ კოდირებას '%s'" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "გასაღების ფაილი არ შეიცავს ჯგუფს '%s'" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "გასაღების ფაილი არ შეიცავს გასაღებს '%s' ჯგუფში '%s'" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "ფაილი შეიცავს გასაღებს '%s', რომლის მნიშვნელობაც '%s' UTF-8 კოდირებაში არაა" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "ფაილი შეიცავს გასაღებს '%s', რომლის მნიშვნელობაც ვერ იშიფრება." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5049,36 +5256,36 @@ msgid "" msgstr "" "ფაილი შეიცავს გასაღებს '%s' ჯგუფში '%s', რომლის მნიშვნელობაც ვერ იშიფრება." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "გასაღების ფაილი სტრიქონის ბოლოს escape სიმბოლოს შეიცავს" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "გასაღების ფაილი მცდარ escape მიმდევრობას '%s' შეიცავს" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "მნიშვნელობა '%s' ვერ აღიქმება, როგორც რიცხვი." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "მთელი მნიშვნელობა '%s' დიაპაზონს გარეთაა" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "მნიშვნელობა '%s' ვერ აღიქმება, როგორც წილადი." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "მნიშვნელობა '%s' ვერ აღიქმება, როგორც ლოგიკური ოპერატორი." @@ -5098,32 +5305,32 @@ msgstr "ვერ მოხერხდა '%s%s%s%s:' ფაილის გა msgid "Failed to open file “%s”: open() failed: %s" msgstr "ვერ მოხერხდა '%s' ფაილის გახსნა: open() ვერ შედგა: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " -msgstr "" +msgstr "შეცდომა ხაზზე %d სიმბოლო %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "ტექსტი მიუღებელი UTF-8 კოდირებით - მიუღებელი '%s'" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "არასწორი სახელი: %s" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "\"%s\" არასწორი სახელია: \"%c\"" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "შეცდომა სტრიქონში %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5132,30 +5339,30 @@ msgstr "" "ვერ მუშავდება სტრიქონი '%-.*s', რომელშიც უნდა იყოს სიმბოლოს ნომერი " "(მაგალითად, ê): შესაძლოა რიცხვი მეტისმეტად დიდია" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " "as &" msgstr "" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "ცარიელი ერთეული \"&;\"; შესაძლო ერთეულებია: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "ერთეულის სახელი \"%-.*s\" უცნობია" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5163,11 +5370,11 @@ msgstr "" "ერთეული არ მთავრდება წერტილ-მძიმით; როგორც ჩანს, სახელის დასაწყისში " "გამოყენებულია სიმბოლო \"&\". გამოსახეთ იგი, როგორც &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "დოკუმენტი უნდა დაიწყოს ელემეტით (მაგალითად )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5176,7 +5383,7 @@ msgstr "" "სიმბოლო \"%s\" დაუშვებელია \"<\" სიმბოლოს შემდეგ; ამ სიმბოლოთი ელემენტის " "სახელის დაწყება არ შეიძლება" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5185,12 +5392,12 @@ msgstr "" "უცნაური სიმბოლო \"%s\". მოველოდი სიმბოლოს \">\" ცარიელი ელემენტის ჭდის (%s) " "დასასრულებლად" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" -msgstr "" +msgstr "მეტისმეტად ბევრი ატრიბუტი ელემენტში \"%s\"" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5198,7 +5405,7 @@ msgstr "" "უცნაური სიმბოლო \"%s\". მოველოდი \"=\"-ს ატრიბუტის (%s) სახელის შემდეგ " "ელემენტისთვის \"%s\"" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5209,7 +5416,7 @@ msgstr "" "საწყისი ჭდის დასასრულებლად, ან ატრიბუტს. ალბათ ატრიბუტის სახელში არასწორი " "სიმბოლო გამოიყენეთ" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5218,7 +5425,7 @@ msgstr "" "ზედმეტი სიმბოლო \"%s\", მოსალოდნელია გახსნილი ბრჭყალები ტოლობის ნიშნის " "შემდეგ ატრიბუტისთვის \"%s\" მნიშვნელობის მისანიჭებლად ელემენტისთვის \"%s\"" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “\"" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "ელემენტი \"%s\" დაიხურა, არცერთი ელემენტი არაა გახსნილი" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "ელემენტი \"%s\" დაიხურა, მაგრამ გახსნილია ელემენტი \"%s\"" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "დოკუმენტი ცარიელია ან მხოლოდ ხარეებს შეიცავს" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "დოკუმენტი დასრულდა უშუალოდ კუთხოვანი ფრჩხილის \"<\" შემდეგ" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5263,7 +5470,7 @@ msgstr "" "დოკუმენტი მოულოდნელად დასრულდა გახსნილი ელემენტებით - \"%s\" ბოლო გახსნილი " "ელემენტია" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5271,19 +5478,19 @@ msgid "" msgstr "" "დოკუმენტი მოულოდნელად დასრულდა, მოსალოდნელია ჩამკეტი კუთხოვანი ფრჩხილი <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის სახელის შიგნით" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შიგნით" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის გამხსნელი ჭდის შიგნით." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5291,488 +5498,488 @@ msgstr "" "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის სახელის შემდგომი ტოლობის ნიშნის " "შემდეგ; ატრიბუტის მნიშვნელობა არ მითითებულა" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "დოკუმენტი მოულოდნელად დასრულდა ატრიბუტის მნიშვნელობის შიგნით" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "დოკუმენტი მოულოდნელად დასრულდა ელემენტის \"%s\" ჩამკეტი ჭდის შიგნით" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "დოკუმენტი მოულოდნელად დასრულდა გაუხსნელი ელემენტის ჩამკეტი ჭდის შიგნით" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "დოკუმენტი მოულოდნელად დასრულდა კომენტარის ან დამუშავების ინსტრუქციის შიგნით" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[პარამეტრი...]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "დახმარების პარამეტრები:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "დახმარების პარამეტრების ჩვენება" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "დახმარების ყველა პარამეტრის ჩვენება" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "პროგრამის პარამეტრები:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "პარამეტრები:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "მთელი მნიშვნელობის \"%s\" დამუშავების შეცდომა %s-თვის" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "მთელი მნიშვნელობა '%s' ელემენტისთვის %s დიაპაზონს გარეთაა" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "ორმაგი მნიშვნელობის \"%s\" დამუშავების შეცდომა %s-თვის" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "ორმაგი მნიშვნელობა '%s' ელემენტისთვის %s დიაპაზონს გარეთაა" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "შეცდომის გაანალიზების პარამეტრი: %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "არ არსებული არგუმენტი - %s-თვის" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "უცნობი პარამეტრი %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "დაზიანებული ობიექტი" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "არასაკმარისი მეხსიერება" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "შიდა შეცდომა" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "თარგი შეიცავს ნაწილობრივი დამთხვევისთვის მხარდაუჭერელ ელემეტებს" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "უკუ მიმართვა პირობების სახით მხარდაუჭერელია ნაწილობრივი დამთხვევისთვის" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "რეკურსიის ლიმიტი მიღწეულია" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "არასწორი წანაცვლება" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "რეკურსიის მარყუჟი" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "უცნობი შეცდომა" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ ნიმუშის ბოლოში" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c ნიმუშის ბოლოში" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" -msgstr "" +msgstr "უცნობი სიმბოლო \\-ის შემდეგ" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "მთვლელში რიცხვები დაულაგებელია {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "მთვლელში {} რიცხვები ძალიან დიდია" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "სიმბოლოების კლასს დამაბოლოებელი ] აკლია" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "სიმბოლოების კლასის არასწორი დამაბოლოებელი თანამიმდევრობა" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "სიმბოლოების კლასის დიაპაზონი მიმდევრობის გარეთაა" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "გასამეორებელი არაფერია" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "უცნობი სიმბლოები (? ან (?- ის შემდეგ" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX-ის დასახელებული კლასები მხოლოდ კლასის შიგნითაა ხელმისაწვდომი" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX-ის გადაფარვადი ელემენტები მხარდაუჭერელია" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" -msgstr "" +msgstr "აკლია დამხურავი )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "ბმა არარსებულ ქვეშაბლონთან" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "კომენტარის შემდეგ ) აკლია" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "რეგულარული გამოსახულება ძალიან გრძელია" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "(?(-ის შემდეგ არასწორი რიცხვი ან სახელია" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind assertion is not fixed length" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "პირობითი ჯგუფი ორ ბრენჩზე მეტს შეიცავს" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "assertion expected after (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" -msgstr "" +msgstr "რიცხვითი მიმართვა ნუილის ტოლი ვერ იქნება" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "posix-ის უცნობი კლასის სახელი" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "character value in \\x{...} sequence is too large" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C not allowed in lookbehind assertion" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" -msgstr "" +msgstr "ქვეშაბლონის სახელს დამაბოლოებელი აკლია" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "ორ სხვადასხვა ქვეშაბლონს ერთი და იგივე სახელი აქვთ" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "არასწორი \\P ან \\p მიმდევრობა" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "უცნობი თვისების სახელი \\P-ის ან \\p-ის შემდეგ" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "ქვეშაბლონის სახელი ძალიან გრძელია (მაქს 32 სიმბოლო)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" -msgstr "" +msgstr "მეტისმეტად ბევრი სახელიანი ქვეშაბლონი (მაქს 10000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" -msgstr "" +msgstr "რვაობითი მნიშვნელობა მეტია, ვიდრე \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" -msgstr "" +msgstr "არამდგრადი ახალი ხაზის პარამეტრები" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" msgstr "" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) უცნობია" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "რიცხვი ძალიან დიდია" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" -msgstr "" +msgstr "აკლია ქვეშაბლონის სახელი (?& -ის შემდეგ" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" -msgstr "" +msgstr "(*MARK) არგუმენტის ქონა აუცილებელია" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "კლასში \\N მხარდაუჭერელია" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "სახელი ძალიან გრძელია (*MARK), (*PRUNE), (*SKIP) ან (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "კოდის გადავსება" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "უცნობი სიმბოლო (?P-ის შემდეგ" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "კომპილაციის სამუშაო სივრცის გადავსება" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "დაიშვა შეცდომა სტანდარტული გამოსახულების %s დამთხვევის ძიების დროს: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "ბიბლიოთეკა PCRE-ს არ გააჩნია UTF8-ის მხარდაჭერა" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE ბიბლიოთეკა კომპილირებულია შეუთავსებელი პარამეტრებით" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "შეცდომა რეგულარული გამოსახულება %s-ის კომპილირებისას, სიმბოლოსთან %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "მოსალოდნელია თექვსმეტობითი რიცხვი, ან '}'" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "არ მოიძებნა '<', სიმბოლურ მითითებაში" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "დაუსრულებელი სიმბოლური მითითება" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "ნულოვანი სიგრძის სიმბოლური მითითება" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "მოველოდი ციფრს" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "მიუღებელი სიმბოლური მითითება" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "დაბოლოვება '\\'" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "უცნობი escape სეკვენცია" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "შეცდომა ჩასანაცვლებელი ტექსტის \"%s\" განაალიზებისას, სიმბოლო ნომრით %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "ციტირებული ტექსტი ბრჭყალებით არ იწყება" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "უმართებლო ბრჭყალი ბრძანებაში ან სხვა ტექსტურ გარსში" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "ტექსტი დასრულდა უშუალოდ \"\\\" სიმბოლოს შემდეგ. (ტექსტი - \"%s\")" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "ტექსტი დასრულდა %c შესაბამისი ბრჭყალის წინ. (ტექსტი - \"%s\")" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "ტექსტი ცარიელი იყო (ან მხოლოდ ხარეებს შეიცავდა)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "მონაცემთა წაკითხვა ქვეპროცესიდან ვერ მოხერხდა (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "შვილეული პროცესიდან (%s) მონაცემების წაკითხვის შეცდომა" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "მოულოდნელი შეცდომა ფუნქციაში waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" -msgstr "" +msgstr "შვილეული პროცესი დასრულდა სტატუსით %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" -msgstr "" +msgstr "შვილი პროცესი მოკვდა სიგნალის მიერ: %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" -msgstr "" +msgstr "შვილი პროცესი შეწყდა სიგნალის მიერ: %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" -msgstr "" +msgstr "შვილი პროცესი არანორმალურად დასრულდა" -#: glib/gspawn.c:2039 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "მონაცემთა წაკითხვა ქვეპროცესის არხიდან ვერ მოხერხდა (%s)" -#: glib/gspawn.c:2411 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "ქვეპროცესის (%s) განტოტვის შეცდომა (%s)" -#: glib/gspawn.c:2537 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "განტოტების შეცდომა (%s)" -#: glib/gspawn.c:2697 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "საქაღალდის ცვლილების შეცდომა \"%s\" (%s)" -#: glib/gspawn.c:2707 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "შვილობილი პროცესის %s გაშვების შეცდომა %s" -#: glib/gspawn.c:2717 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "დესკრიპტორისთვის ფაილის გადამაგრების შეცდომა (%s)" -#: glib/gspawn.c:2725 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "შვილეული პროცესისთვის (%s) ფაილის დესკრიპტორის დუბლირების შეცდომა" -#: glib/gspawn.c:2734 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "დამხმარე პროცესის გაშვების შეცდომა (%s)" -#: glib/gspawn.c:2742 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "შვილეული პროცესის (%s) ფაილის დესკრიპტორის დახურვის შეცდომა" -#: glib/gspawn.c:2750 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "შეცდომა შვილეული პროცესის (%s) შესრულებისას" -#: glib/gspawn.c:2774 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "ქვეპროცესის არხიდან საკმარის მონაცემთა წაკითხვა ვერ მოხერხდა (%s)" @@ -5829,78 +6036,78 @@ msgstr "" "მოულოდნელი შეცდომა ფუნქციაში g_io_channel_win32_poll() ქვეპროცესიდან " "მონაცემთა წაკითხვისას" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "ცარიელი სტრიქონი რიცხვი არაა" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "\"%s\" ნიშნიანი რიცხვი არაა" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "რიცხვი \"%s\" დიაპაზონს გარეთაა [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "\"%s\" უნიშნო რიცხვი არაა" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "არასწორი %s-კოდირება URI-ში" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "დაუშვებელი სიმბოლო URI-ში" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "არა-UTF-8 სიმბოლოები URI-ში" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "არასწორი IPv6 მისამართი '%.*s' URI-ში" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "არასწორად კოდირებული IP მისამართი ‘%.*s’ URI-ში" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "არასწორი არა-ASCII ჰოსტის სახელი '%.*s' URI-ში" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "URI-ში პორტის '%.*s'-ის დამუშავების შეცდომა" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URI-ში პორტი '%.*s' დიაპაზონს გარეთაა" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI \"%s\" აბსოლუტური იდენტიფიკატორი არ გახლავთ" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URL-ს '%s' ჰოსტის კომპონენტი არ გააჩნია" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI აბსოლუტური არაა და საბაზისო URI მითითებული არაა" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "აკლია '=' და პარამეტრის მნიშვნელობა" @@ -5981,65 +6188,65 @@ msgstr "პიბ" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "კბ" +msgid "kbit" +msgstr "კბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "მბ" +msgid "Mbit" +msgstr "მბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "გბ" +msgid "Gbit" +msgstr "გბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "ტბ" +msgid "Tbit" +msgstr "ტბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "პბ" +msgid "Pbit" +msgstr "პბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "ებ" +msgid "Ebit" +msgstr "ებიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "კიბ" +msgid "Kibit" +msgstr "კიბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "მიბ" +msgid "Mibit" +msgstr "მიბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "გიბ" +msgid "Gibit" +msgstr "გიბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "ტიბ" +msgid "Tibit" +msgstr "ტიბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "პიბ" +msgid "Pibit" +msgstr "პიბიტ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "ეიბ" +msgid "Eibit" +msgstr "ეიბიტ" #: glib/gutils.c:3056 msgid "byte" @@ -6139,6 +6346,47 @@ msgstr "%.1f პბ" msgid "%.1f EB" msgstr "%.1f ებ" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN შეტყობინება: REPLY_SERIAL თავსართის ველი აკლია ან არასწორია" + +#~ msgid "kb" +#~ msgstr "კბ" + +#~ msgid "Mb" +#~ msgstr "მბ" + +#~ msgid "Gb" +#~ msgstr "გბ" + +#~ msgid "Tb" +#~ msgstr "ტბ" + +#~ msgid "Pb" +#~ msgstr "პბ" + +#~ msgid "Eb" +#~ msgstr "ებ" + +#~ msgid "Kib" +#~ msgstr "კიბ" + +#~ msgid "Mib" +#~ msgstr "მიბ" + +#~ msgid "Gib" +#~ msgstr "გიბ" + +#~ msgid "Tib" +#~ msgstr "ტიბ" + +#~ msgid "Pib" +#~ msgstr "პიბ" + +#~ msgid "Eib" +#~ msgstr "ეიბ" + #, c-format #~ msgid "The local file URI “%s” may not include a “#”" #~ msgstr "" diff --git a/po/kk.po b/po/kk.po index eff319c..df9c604 100644 --- a/po/kk.po +++ b/po/kk.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-13 14:24+0000\n" -"PO-Revision-Date: 2023-08-19 13:43+0600\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-06 08:00+0500\n" "Last-Translator: Baurzhan Muftakhidinov \n" "Language-Team: Kazakh \n" "Language: kk\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -36,37 +36,40 @@ msgstr "" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "" -#: gio/gapplication.c:506 -#| msgid "Application Options:" +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "GApplication опцияларын көрсету" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Қолданба нұсқасын басып шығару" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Көмекті шығару" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[КОМАНДА]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Нұсқа ақпаратын шығару" @@ -119,7 +122,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "КОМАНДА" @@ -131,9 +134,13 @@ msgstr "" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "ФАЙЛ" @@ -157,7 +164,7 @@ msgstr "ПАРАМЕТР" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -169,12 +176,12 @@ msgstr "" msgid "Usage:\n" msgstr "Қолданылуы:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Аргументтер:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[АРГУМЕНТТЕР…]" @@ -261,78 +268,78 @@ msgstr "" "команда танылмады: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Әрекеттен бас тартылды" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Мақсат жерінде жеткілікті орын жоқ" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Түрлендіру кірісінде жарамсыз байттар тізбегі анықталды" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Бас тартуға болатын инициализацияға қолдау жоқ" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s түрі" @@ -346,203 +353,203 @@ msgstr "Белгісіз түрі" msgid "%s filetype" msgstr "%s файл түрі" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" msgstr "" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" msgstr "" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" msgstr "" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" msgstr "" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "" -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "\"%s\" nonce файлынан оқу қатесі: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "" -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "" -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7326 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" msgstr "" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7335 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" msgstr "" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "" @@ -562,13 +569,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "\"%s\" бумасын жасау қатесі: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Әрекетке қолдау жоқ" @@ -629,166 +636,183 @@ msgstr "" msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Байланыс жабылған" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" -#: gio/gdbusconnection.c:4267 gio/gdbusconnection.c:4621 +#: gio/gdbusconnection.c:4277 gio/gdbusconnection.c:4631 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" -#: gio/gdbusconnection.c:4412 +#: gio/gdbusconnection.c:4422 #, c-format msgid "No such property “%s”" msgstr "\"%s\" қасиеті табылмады" -#: gio/gdbusconnection.c:4424 +#: gio/gdbusconnection.c:4434 #, c-format msgid "Property “%s” is not readable" msgstr "\"%s\" қасиетін оқу мүмкін емес" -#: gio/gdbusconnection.c:4435 +#: gio/gdbusconnection.c:4445 #, c-format msgid "Property “%s” is not writable" msgstr "\"%s\" қасиетін жазу мүмкін емес" -#: gio/gdbusconnection.c:4455 +#: gio/gdbusconnection.c:4465 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" -#: gio/gdbusconnection.c:4560 gio/gdbusconnection.c:4775 -#: gio/gdbusconnection.c:6752 +#: gio/gdbusconnection.c:4570 gio/gdbusconnection.c:4785 +#: gio/gdbusconnection.c:6762 #, c-format msgid "No such interface “%s”" msgstr "" -#: gio/gdbusconnection.c:4991 gio/gdbusconnection.c:7266 +#: gio/gdbusconnection.c:5001 gio/gdbusconnection.c:7279 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "" -#: gio/gdbusconnection.c:5092 +#: gio/gdbusconnection.c:5102 #, c-format msgid "No such method “%s”" msgstr "" -#: gio/gdbusconnection.c:5123 +#: gio/gdbusconnection.c:5133 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "" -#: gio/gdbusconnection.c:5326 +#: gio/gdbusconnection.c:5336 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "" -#: gio/gdbusconnection.c:5553 +#: gio/gdbusconnection.c:5563 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "" -#: gio/gdbusconnection.c:5609 +#: gio/gdbusconnection.c:5619 #, c-format msgid "Unable to set property %s.%s" msgstr "%s қасиетін орнату мүмкін емес.%s" -#: gio/gdbusconnection.c:5788 +#: gio/gdbusconnection.c:5798 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "" -#: gio/gdbusconnection.c:6864 +#: gio/gdbusconnection.c:6874 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "" -#: gio/gdbusconnection.c:6985 +#: gio/gdbusconnection.c:6995 #, c-format msgid "A subtree is already exported for %s" msgstr "" -#: gio/gdbusconnection.c:7274 +#: gio/gdbusconnection.c:7287 #, c-format msgid "Object does not exist at path “%s”" msgstr "" -#: gio/gdbusmessage.c:1306 -msgid "type is INVALID" +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" msgstr "" -#: gio/gdbusmessage.c:1317 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" msgstr "" -#: gio/gdbusmessage.c:1328 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" msgstr "" -#: gio/gdbusmessage.c:1340 -msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" -msgstr "" - -#: gio/gdbusmessage.c:1353 -msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" -msgstr "" - -#: gio/gdbusmessage.c:1361 +#: gio/gdbusmessage.c:1424 +#, c-format msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" msgstr "" -#: gio/gdbusmessage.c:1369 +#: gio/gdbusmessage.c:1437 +#, c-format msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." "freedesktop.DBus.Local" msgstr "" -#: gio/gdbusmessage.c:1417 gio/gdbusmessage.c:1477 +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" + +#: gio/gdbusmessage.c:1511 +msgid "type is INVALID" +msgstr "" + +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "" -#: gio/gdbusmessage.c:1431 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "" -#: gio/gdbusmessage.c:1450 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " "(length of string is %d). The valid UTF-8 string up until that point was “%s”" msgstr "" -#: gio/gdbusmessage.c:1514 gio/gdbusmessage.c:1790 gio/gdbusmessage.c:2001 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "" -#: gio/gdbusmessage.c:1682 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "" -#: gio/gdbusmessage.c:1706 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "" -#: gio/gdbusmessage.c:1757 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -796,103 +820,103 @@ msgid_plural "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." msgstr[0] "" -#: gio/gdbusmessage.c:1777 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" msgstr "" -#: gio/gdbusmessage.c:1931 gio/gdbusmessage.c:2650 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "" -#: gio/gdbusmessage.c:1985 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" -#: gio/gdbusmessage.c:2026 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" -#: gio/gdbusmessage.c:2211 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "" -#: gio/gdbusmessage.c:2230 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" -#: gio/gdbusmessage.c:2288 gio/gdbusmessage.c:2886 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "" -#: gio/gdbusmessage.c:2300 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" -#: gio/gdbusmessage.c:2315 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "" -#: gio/gdbusmessage.c:2357 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "" -#: gio/gdbusmessage.c:2703 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" -#: gio/gdbusmessage.c:2840 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" -#: gio/gdbusmessage.c:2848 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "" -#: gio/gdbusmessage.c:2901 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" -#: gio/gdbusmessage.c:2911 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" msgstr "" -#: gio/gdbusmessage.c:2927 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" -#: gio/gdbusmessage.c:3482 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "" -#: gio/gdbusmessage.c:3490 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "" @@ -912,47 +936,47 @@ msgid "Unable to get Hardware profile: %s" msgstr "" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "" -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "" -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " "and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "\"%s\" үшін nonce файлын жазу қатесі: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "" @@ -1006,6 +1030,10 @@ msgstr "" msgid "Connect to given D-Bus address" msgstr "" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "" @@ -1230,71 +1258,72 @@ msgstr "Қате: \"%s\" - кеңінен белгілі шина аты еме msgid "Not authorized to change debug settings" msgstr "" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Атаусыз" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "%s пайдаланушы жұмыс үстел файлын жасау мүмкін емес" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "" @@ -1307,27 +1336,27 @@ msgstr "TLS қолдауы қолжетерсіз" msgid "DTLS support is not available" msgstr "DTLS қолдауы қолжетерсіз" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "" @@ -1335,130 +1364,134 @@ msgstr "" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Бума үстіне көшіру мүмкін емес" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Буманы бума үстіне көшіру мүмкін емес" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Мақсат файлы бар болып тұр" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Буманы рекурсивті көшіру мүмкін емес" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format -#| msgid "Operation not supported" msgid "Copy file range not supported" msgstr "" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Арнайы файлды көшіру мүмкін емес" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Символдық сілтемелерге қолдау жоқ" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Қоқыс шелегіне қолдау жоқ" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "том тіркеуді жүзеге асырмайды" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Хост аты қате" @@ -1491,64 +1524,64 @@ msgstr "HTTP прокси жауабы тым үлкен" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP прокси сервері күтпегенде байланысты үзді." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "" @@ -1562,7 +1595,7 @@ msgstr "" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "" @@ -1578,7 +1611,7 @@ msgstr "" msgid "“version” takes no arguments" msgstr "\"version\" аргументтерді қабылдамайды" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Қолданылуы:" @@ -1586,79 +1619,79 @@ msgstr "Қолданылуы:" msgid "Print version information and exit." msgstr "Нұсқа ақпаратын шығару және шығу." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Командалар:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Бір немесе бірнеше файлды көшіру" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Орналасулар жөнінде ақпаратты көрсету" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Қолданбаны desktop файлынан жөнелту" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Бумаларды жасау" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Файлдар және бумаларды өзгерістерге бақылау" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Орналасуларды тіркеу немесе тіркеуден босату" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Бір немесе бірнеше файлды жылжыту" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Файлдарды үнсіз келісім қолданбасымен ашу" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Файл атын ауыстыру" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Бір немесе бірнеше файлды өшіру" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Қалыпты кірістен оқу және сақтау" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Файл атрибутын орнату" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Файлдар немесе бумаларды қоқыс шелегіне тастау" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Командалар:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "" @@ -1668,7 +1701,7 @@ msgid "Error writing to stdout" msgstr "Қалыпты шығысқа жазу қатесі" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1688,72 +1721,76 @@ msgid "" "like smb://server/resource/file.txt as location." msgstr "" -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Мақсат бумасы жоқ" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Орындалу барысын көрсету" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Үстінен жазу алдында сұрау" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Барлық атрибуттарды сақтап қалу" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Бар болып тұрған мақсат файлдардың қор көшірмелерін жасау" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Символдық сілтемелер соңынан ермеу" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ҚАЙНАР_КӨЗІ" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "МАҚСАТЫ" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "" -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "%s мақсаты бума емес" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: \"%s\" үстінен жазу керек пе? " @@ -1791,56 +1828,55 @@ msgstr "" #. Translators: This is a noun and represents and attribute of a file #: gio/gio-tool-info.c:176 #, c-format -#| msgid "name: %s\n" msgid "edit name: %s\n" msgstr "" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "аты: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "түрі: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "өлшемі: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "жасырын\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Орнатуға болатын атрибуттар:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Орналасулар жөнінде ақпаратты көрсету." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2366,7 +2402,8 @@ msgid "" msgstr "" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "БУМА" @@ -2413,6 +2450,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "" @@ -2875,124 +2916,124 @@ msgstr "%s үшін файлдық жүйе ақпаратын алу қатес #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Түбірлік буманың атын ауыстыру мүмкін емес" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "%s файл атын ауыстыру қатесі: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Файл атын ауыстыру мүмкін емес, ондай файл бар болып тұр" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Файл аты қате" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "%s файлын ашу қатесі: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "%s файлын өшіру қатесі: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "%s файлын қоқысқа тастау қатесі: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "%s қоқыс шелегін жасау мүмкін емес: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "%s файлын қоқысқа тастау мүмкін емес: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "%s файлын қоқысқа тастау мүмкін емес" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "%s бумасын жасау қатесі: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "%s символдық сілтемесін жасау қатесі: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "%s файлын жылжыту қатесі: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Буманы бума үстіне жылжыту мүмкін емес" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Қор көшірме файлын жасау сәтсіз аяқталды" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Мақсат файлын өшіру қатесі: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "" @@ -3014,115 +3055,115 @@ msgstr "" msgid "Error setting extended attribute “%s”: %s" msgstr "\"%s\" кеңейтілген атрибутын орнату қатесі: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (кодталуы қате)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "\"%s\" файлы ақпаратын алу қатесі: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Атрибут түрі жарамсыз (uint64 күтілген)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Рұқсаттарды орнату қатесі: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Иесін орнату қатесі: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "" @@ -3175,7 +3216,7 @@ msgid "Error truncating file: %s" msgstr "" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" @@ -3197,99 +3238,99 @@ msgstr "Файл сыртқы түрде өзгертілді" msgid "Error removing old file: %s" msgstr "Ескі файлды өшіру қатесі: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" msgstr "" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Желі қолжетерсіз" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Хост қолжетерсіз" @@ -3317,7 +3358,7 @@ msgstr "NetworkManager орындалы тұрған жоқ" msgid "NetworkManager version too old" msgstr "NetworkManager нұсқасы тым ескі" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "" @@ -3330,75 +3371,75 @@ msgstr "" msgid "Source stream is already closed" msgstr "" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Хост аты қате" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:478 gio/gresourcefile.c:602 -#: gio/gresourcefile.c:753 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "" -#: gio/gresourcefile.c:659 +#: gio/gresourcefile.c:663 msgid "Resource files cannot be renamed" msgstr "" -#: gio/gresourcefile.c:749 +#: gio/gresourcefile.c:753 #, c-format msgid "The resource at “%s” is not a directory" msgstr "" -#: gio/gresourcefile.c:957 +#: gio/gresourcefile.c:961 msgid "Input stream doesn’t implement seek" msgstr "" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" msgstr "" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3406,15 +3447,15 @@ msgid "" "Details include the section, size and compression" msgstr "" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3430,7 +3471,7 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3440,37 +3481,37 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr "" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr "" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" msgstr "" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr "" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "ЖОЛ" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr "" @@ -3667,213 +3708,213 @@ msgstr "" msgid "No such key “%s”\n" msgstr "" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Сокет Е/Ш күту мерзімі аяқталған" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "" -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Хабарламаны жіберу мүмкін емес: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Хабарламаны жіберу сәтсіз: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "" -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "" -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Байланысу мүмкін емес: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "" -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "" @@ -3962,94 +4003,94 @@ msgstr "" msgid "Unknown SOCKSv5 proxy error." msgstr "" -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "" -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4058,7 +4099,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4066,133 +4107,144 @@ msgstr "" "Парольді енгізудің бірнеше талабы сәтсіз болды, қатынау рұқсаты келесі " "сәтсіз енгізулерде блокталатын болады." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "" -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "" -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Файлдық жүйе түбірі" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Жады жеткіліксіз" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Ішкі қате: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Көбірек кіріс керек" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Жарамсыз сығылған деректер" @@ -4220,148 +4272,300 @@ msgstr "" msgid "Wrong args\n" msgstr "" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to open ‘%s’: %s" +msgstr "" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "" + +#: girepository/compiler/compiler.c:115 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "" + +#: girepository/compiler/compiler.c:175 +#, c-format +#| msgid "Error removing target file: %s" +msgid "Error parsing arguments: %s" +msgstr "" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "" + +#: girepository/compiler/compiler.c:218 +#, c-format +#| msgid "Error opening file “%s”: %s" +msgid "Error parsing file ‘%s’: %s" +msgstr "" + +#: girepository/compiler/compiler.c:243 +#, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to build typelib for module ‘%s’" +msgstr "" + +#: girepository/compiler/compiler.c:245 +#, c-format +#| msgid "Unable to load ‘%s‘: %s" +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "" + +#: girepository/decompiler/decompiler.c:54 +#| msgid "Show extra information" +msgid "Show all available information" +msgstr "Барлық қол жетімді ақпаратты көрсету" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to parse: %s" +msgstr "" + +#: girepository/decompiler/decompiler.c:87 +#| msgid "Show hidden files" +msgid "No input files" +msgstr "Енгізу файлдары жоқ" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to read ‘%s’: %s" +msgstr "" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to create typelib ‘%s’: %s" +msgstr "" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +#| msgid "Failed to allocate memory" +msgid "Failed to load typelib: %s" +msgstr "" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "НҰСҚА" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "" + +#: girepository/inspector/inspector.c:75 +#| msgid "NAME" +msgid "NAMESPACE" +msgstr "" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "" + +#: girepository/inspector/inspector.c:86 +#, c-format +#| msgid "Failed to read from file “%s”: %s" +msgid "Failed to parse command line options: %s" +msgstr "" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI \"%s\" қате" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %d %b %Y %T" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%Y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%T" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4382,62 +4586,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Қаңтар" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Ақпан" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Наурыз" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Сәуір" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Мамыр" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Маусым" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Шілде" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Тамыз" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Қыркүйек" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Қазан" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Қараша" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Желтоқсан" @@ -4459,132 +4663,132 @@ msgstr "Желтоқсан" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Қаң" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Ақп" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Нау" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Сәу" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Мам" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Мау" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Шіл" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Там" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Қыр" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Қаз" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Қар" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Жел" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Дүйсенбі" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Сейсенбі" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Сәрсенбі" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Бейсенбі" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Жұма" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Сенбі" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Жексенбі" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Дс" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Сс" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Ср" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Бс" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Жм" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Сн" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Жк" @@ -4606,62 +4810,62 @@ msgstr "Жк" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Қаңтар" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Ақпан" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Наурыз" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "Сәуір" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Мамыр" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Маусым" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Шілде" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Тамыз" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "Қыркүйек" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Қазан" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "Қараша" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Желтоқсан" @@ -4683,273 +4887,281 @@ msgstr "Желтоқсан" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Қаң" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Ақп" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Нау" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Сәу" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "Мам" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Мау" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Шіл" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Там" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Қыр" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Қаз" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Қар" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Жел" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "\"%s\" бумасын ашу қатесі: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "" +#| msgid "Failed to read from file “%s”: %s" +msgid "Could not allocate %s to read file “%s”" +msgstr "" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "\"%s\" файлын оқу қатесі: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "\"%s\" файлы тым үлкен" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "\"%s\" файлынан оқу қатесі: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "\"%s\" файлын жазу сәтсіз: write() сәтсіз аяқталды: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "\"%s\" файлын жазу сәтсіз: fsync() сәтсіз аяқталды: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "\"%s\" файлын жасау сәтсіз: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Қалыпты файл емес" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Қате топ аты: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." msgstr "" -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" -#: glib/gkeyfile.c:4353 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "" -#: glib/gkeyfile.c:4375 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "" -#: glib/gkeyfile.c:4520 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "" -#: glib/gkeyfile.c:4534 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "" -#: glib/gkeyfile.c:4567 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "" -#: glib/gkeyfile.c:4606 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "" @@ -4969,96 +5181,96 @@ msgstr "" msgid "Failed to open file “%s”: open() failed: %s" msgstr "\"%s\" файлын ашу сәтсіз: open() аяқталды: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "" -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "\"%s\" дұрыс атау емес" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "\"%s\" дұрыс атау емес: \"%c\"" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " "reference (ê for example) — perhaps the digit is too large" msgstr "" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " "as &" msgstr "" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" msgstr "" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" msgstr "" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5066,567 +5278,562 @@ msgid "" "character in an attribute name" msgstr "" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" msgstr "" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" msgstr "" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" msgstr "" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " "the tag <%s/>" msgstr "" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "" -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" msgstr "" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[ОПЦИЯ…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Көмек опциялары:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Көмек опцияларын көрсету" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Барлық көмек опцияларын көрсету" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Қолданба опциялары:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Опциялар:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Белгісіз опция %s" -#: glib/gregex.c:479 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "" -#: glib/gregex.c:481 +#: glib/gregex.c:488 msgid "out of memory" msgstr "жады жеткіліксіз" -#: glib/gregex.c:487 -msgid "backtracking limit reached" -msgstr "" - -#: glib/gregex.c:498 +#: glib/gregex.c:503 msgid "internal error" msgstr "ішкі қате" -#: glib/gregex.c:500 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" -#: glib/gregex.c:502 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" -#: glib/gregex.c:508 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "" -#: glib/gregex.c:510 +#: glib/gregex.c:515 msgid "bad offset" msgstr "қате шегініс" -#: glib/gregex.c:512 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:515 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "" -#: glib/gregex.c:536 glib/gregex.c:1838 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "белгісіз қате" -#: glib/gregex.c:557 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "" -#: glib/gregex.c:561 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "" -#: glib/gregex.c:566 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "" -#: glib/gregex.c:570 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "" -#: glib/gregex.c:574 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "" -#: glib/gregex.c:578 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "" -#: glib/gregex.c:582 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "" -#: glib/gregex.c:586 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "" -#: glib/gregex.c:591 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "" -#: glib/gregex.c:595 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "" -#: glib/gregex.c:599 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "" -#: glib/gregex.c:603 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "" -#: glib/gregex.c:609 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "" -#: glib/gregex.c:613 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "" -#: glib/gregex.c:617 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "" -#: glib/gregex.c:621 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "" -#: glib/gregex.c:625 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "" -#: glib/gregex.c:629 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "" -#: glib/gregex.c:633 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "" -#: glib/gregex.c:637 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "" -#: glib/gregex.c:641 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "" -#: glib/gregex.c:645 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "" -#: glib/gregex.c:650 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "" -#: glib/gregex.c:654 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "" -#: glib/gregex.c:658 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "" -#: glib/gregex.c:662 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "" -#: glib/gregex.c:666 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "" -#: glib/gregex.c:670 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "" -#: glib/gregex.c:674 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "" -#: glib/gregex.c:678 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "" -#: glib/gregex.c:682 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "" -#: glib/gregex.c:686 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "" -#: glib/gregex.c:690 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "" -#: glib/gregex.c:694 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" msgstr "" -#: glib/gregex.c:699 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "" -#: glib/gregex.c:703 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) танылмады" -#: glib/gregex.c:707 +#: glib/gregex.c:712 msgid "number is too big" msgstr "сан тым үлкен" -#: glib/gregex.c:711 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "" -#: glib/gregex.c:715 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "" -#: glib/gregex.c:719 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "" -#: glib/gregex.c:723 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "" -#: glib/gregex.c:727 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" -#: glib/gregex.c:731 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "" -#: glib/gregex.c:735 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "" -#: glib/gregex.c:739 glib/gregex.c:875 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "" -#: glib/gregex.c:743 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "" -#: glib/gregex.c:747 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "" -#: glib/gregex.c:751 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "" -#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "" -#: glib/gregex.c:1721 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "" -#: glib/gregex.c:1729 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "" -#: glib/gregex.c:1847 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" -#: glib/gregex.c:2887 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "" -#: glib/gregex.c:2903 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "" -#: glib/gregex.c:2943 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "" -#: glib/gregex.c:2952 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "" -#: glib/gregex.c:2959 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "" -#: glib/gregex.c:2970 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "сан күтілген" -#: glib/gregex.c:2988 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "" -#: glib/gregex.c:3051 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "" -#: glib/gregex.c:3055 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "белгісіз escape тізбегі" -#: glib/gregex.c:3065 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Мәтін бос болды (немесе тек бос аралықтан тұрды)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "\"%s\" бумасына ауысу сәтсіз аяқталды (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" #: glib/gspawn-private.h:134 #, c-format -#| msgid "Invalid hostname" msgid "Invalid source FDs argument" msgstr "" @@ -5675,78 +5882,78 @@ msgid "" "process" msgstr "" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "\"%s\" таңбасы бар сан емес" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "\"%s\" таңбасы жоқ сан емес" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "" @@ -5827,65 +6034,65 @@ msgstr "ПиБ" msgid "EiB" msgstr "ЭиБ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "кб" +msgid "kbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Мб" +msgid "Mbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Гб" +msgid "Gbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Тб" +msgid "Tbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Пб" +msgid "Pbit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Эб" +msgid "Ebit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Киб" +msgid "Kibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Миб" +msgid "Mibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Гиб" +msgid "Gibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Тиб" +msgid "Tibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Пиб" +msgid "Pibit" +msgstr "" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Эиб" +msgid "Eibit" +msgstr "" #: glib/gutils.c:3056 msgid "byte" @@ -5985,6 +6192,42 @@ msgstr "%.1f ПБ" msgid "%.1f EB" msgstr "%.1f ЭБ" +#~ msgid "kb" +#~ msgstr "кб" + +#~ msgid "Mb" +#~ msgstr "Мб" + +#~ msgid "Gb" +#~ msgstr "Гб" + +#~ msgid "Tb" +#~ msgstr "Тб" + +#~ msgid "Pb" +#~ msgstr "Пб" + +#~ msgid "Eb" +#~ msgstr "Эб" + +#~ msgid "Kib" +#~ msgstr "Киб" + +#~ msgid "Mib" +#~ msgstr "Миб" + +#~ msgid "Gib" +#~ msgstr "Гиб" + +#~ msgid "Tib" +#~ msgstr "Тиб" + +#~ msgid "Pib" +#~ msgstr "Пиб" + +#~ msgid "Eib" +#~ msgstr "Эиб" + #~ msgid "GApplication options" #~ msgstr "GApplication опциялары" @@ -6107,9 +6350,6 @@ msgstr "%.1f ЭБ" #~ msgid "No files to delete" #~ msgstr "Өшіру үшін файлдар жоқ" -#~ msgid "Error setting attribute: %s\n" -#~ msgstr "Атрибутты орнату қатесі: %s\n" - #~ msgid "Error creating directory '%s': %s" #~ msgstr "'%s' бумасын жасау қатесі: %s" diff --git a/po/lt.po b/po/lt.po index c0171af..9d6203c 100644 --- a/po/lt.po +++ b/po/lt.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: lt\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 10:14+0000\n" -"PO-Revision-Date: 2023-08-31 23:15+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-03 22:34+0200\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" @@ -23,7 +23,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" "X-Project-Style: gnome\n" #: gio/gappinfo.c:339 @@ -44,37 +44,41 @@ msgstr "Nepavyko rasti turinio tipui „%s“ numatytos programos" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Nepavyko rasti URI schemai „%s“ numatytos programos" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication parametrai:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Rodyti GApplication parametrus" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Įveskite GApplication tarnybos veikseną (naudoti iš D-Bus tarnybų failų)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Pakeisti programos ID" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Atspausdinti programos verisją" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Pakeisti veikiančią" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Spausdinti pagalbą" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMANDA]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Atspausdinti versiją" @@ -128,7 +132,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "KOMANDA" @@ -140,9 +144,13 @@ msgstr "Komandą, kuriai atspausdinti detalią pagalbą" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Programos identifikatorius D-Bus formatu (pvz.: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FAILAS" @@ -167,7 +175,7 @@ msgstr "PARAMETRAS" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Nebūtinas parametras veiksmo iškvietimui, GVariant formatu" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -181,12 +189,12 @@ msgstr "" msgid "Usage:\n" msgstr "Naudojimas:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumentai:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARG...]" @@ -273,78 +281,78 @@ msgstr "" "nežinoma komanda: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Per didelė skaičiavimo reikšmė perduota %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Pozicijos perkėlimas sraute nepalaikomas" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Nepavyko sutrumpinti GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Srautas jau užvertas" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Trumpinimas sraute nepalaikomas" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operacija nutraukta" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Netinkamas objektas, nepavyko inicijuoti" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Klaidinga baitų seka įvestyje" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Nepakanka paskirties vietos" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Klaidinga baitų seka keitimo įvedime" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Klaida keitimo metu: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Atšaukiamas inicijavimas nepalaikomas" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Keitimas iš koduotės „%s“ į koduotę „%s“ nepalaikomas" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Nepavyko atverti keitiklio iš „%s“ į „%s“" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s tipas" @@ -358,41 +366,41 @@ msgstr "Nežinomas tipas" msgid "%s filetype" msgstr "%s failo tipos" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials turi nekorektiškus duomenis" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials nerealizuota šioje operacinėje sistemoje" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Jūsų platformoje nėra GCredentials palaikymo" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials neturi proceso ID šioje OS" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Įgaliojimų apgavimas neįmanomas šioje operacinėje sistemoje" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Netikėta ankstyva srauto pabaiga" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nepalaikomas raktas „%s“ adreso įvestyje „%s“" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Beprasmė rakto/reikšmės poros kombinacija adreso įvestyje „%s“" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -401,28 +409,28 @@ msgstr "" "Adresas „%s“ nėra tinkamas (reikia įvesti vienintelį path, dir, tmpdir arba " "abstract raktą)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Klaida adrese „%s“ — neteisingai suformuotas atributas „%s“" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Nežinomas arba nepalaikomas duomenų perdavimas „%s“ adresui „%s“" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Adreso elementas „%s“ neturi dvitaškio (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transporto pavadinimas adreso elemente „%s“ negali būti tuščias" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -430,7 +438,7 @@ msgid "" msgstr "" "Rakto/reikšmės pora %d, „%s“, adreso elementas „%s“ neturi lygybės ženklo" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -438,7 +446,7 @@ msgstr "" "Rakto/reikšmės pora %d, „%s“, adreso elemente „%s“ negali turėti lygybės " "ženklo" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -447,7 +455,7 @@ msgstr "" "Klaida šalinant kaitą rakte ar reikšmėje rakto/reikšmės poroje %d, „%s“ " "adreso elemente „%s“" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -456,82 +464,82 @@ msgstr "" "Klaida adrese „%s“ - unix duomenų perdavimas reikalauja nustatyti vienintelį " "iš raktų 'path' arba 'abstract'" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Klaida adrese „%s“ - pagrindinio kompiuterio atributas neįvestas arba blogai " "suformuotas" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Klaida adrese „%s“ - prievado atributas neįvestas arba blogai suformuotas" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Klaida adrese „%s“ - laikino failo atributas neįvestas arba blogai " "suformuotas" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Klaida automatiškai paleidžiant: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Klaida atveriant vienkartinio kodo failą „%s“: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Klaida skaitant iš vienkartinio kodo failo „%s“: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Klaida skaitant iš vienkartinio kodo failo „%s“, tikėtasi 16 baitų, gauta %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Klaida rašant vienkartinio kodo failo turinį „%s“ į srautą:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Pateiktasis adresas yra tuščias" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Negalima paleisti pranešimų magistralės kai nustatyta AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Negalima paleisti pranešimų magistralės be mašinos id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Negalima automatiškai paleisti D-Bus be X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Klaida paleidžiant komandų eilutę „%s“: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Nepavyko nustatyti sesijos magistralės adreso (nerealizuota šiai operacinei " "sistemai)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -540,7 +548,7 @@ msgstr "" "Nepavyko nustatyti magistralės adreso iš DBUS_STARTER_BUS_TYPE aplinkos " "kintamojo - nežinoma reikšmė „%s“" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -548,20 +556,20 @@ msgstr "" "Nepavyko nustatyti magistralės adreso, kadangi DBUS_STARTER_BUS_TYPE " "aplinkos kintamasis nenustatytas" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Nežinomas magistralės tipas %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Netikėtas turinio trūkumas bandant nuskaityti eilutę" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Netikėtas turinio trūkumas bandant (saugiai) nuskaityti eilutę" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -569,15 +577,15 @@ msgstr "" "Baigėsi visi turimi tapatybės patvirtinimo mechanizmai (bandyta: %s) " "(turimi: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Netikėtas turinio trūkumas bandant nuskaityti baitą" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Naudotojų ID turi sutapti porininkui bei serveriui" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Atšaukta per GDBusAuthObserver::authorize-authenticated-peer" @@ -599,13 +607,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Klaida kuriant katalogą %s: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operacija nepalaikoma" @@ -671,15 +679,15 @@ msgstr "Klaida atveriant raktinę „%s“ rašymui: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Papildomai, užrakto atlaisvinimas „%s“ taip pat nepavyko: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Ryšys yra užvertas" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Baigėsi laikas" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "Nepalaikomi požymiai aptikti konstruojant kliento pusės ryšį" @@ -767,52 +775,63 @@ msgstr "Pomedis %s jau yra eksportuotas" msgid "Object does not exist at path “%s”" msgstr "Objekto kelyje „%s“ nėra" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s pranešimas: antraštės laukas %s yra netinkamas; tikėtasi „%s“ tipo vertės" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s pranešimas: trūksta antraštės lauko %s arba jis netinkamas" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s pranešimas: pateiktas NETINKAMAS antraštės laukas" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s pranešimas: antraštės laukas PATH naudoja rezervuotą reikšmę /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s pranešimas: antraštės laukas INTERFACE neturi tinkamos sąsajos pavadinimo" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s pranešimas: antraštės laukas INTERFACE naudoja rezervuotą reikšmę org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s pranešimas: antraštės laukas MEMBER neturi tinkamo nario pavadinimo" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s pranešimas: antraštės laukas ERROR_NAME neturi tinkamo klaidos pavadinimo" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "tipas yra NETINKAMAS" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"METHOD_CALL pranešimas: trūksta antraštės lauko PATH arba MEMBER arba jis " -"netinkamas" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"METHOD_RETURN pranešimas: trūksta REPLY_SERIAL antraštės arba ji netinkama" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR pranešimas: antraštės lauke trūksta REPLY_SERIAL arba ERROR_NAME, arba " -"ji netinkama" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL pranešimas: trūksta antraštės lauko PATH, INTERFACE arba MEMBER, arba " -"ji netinkama" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL pranešimas: antraštės laukas PATH naudoja rezervuotą reikšmę /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL pranešimas: antraštės laukas INTERFACE naudoja rezervuotą reikšmę org." -"freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -820,12 +839,12 @@ msgstr[0] "Norėta nuskaityti %lu baitą, bet gauta tik %lu" msgstr[1] "Norėta nuskaityti %lu baitus, bet gauta tik %lu" msgstr[2] "Norėta nuskaityti %lu baitų, bet gauta tik %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Tikėtasi NUL baito po simbolių eilutės „%s“, bet rastas baitas %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -834,21 +853,21 @@ msgstr "" "Tikėtasi teisingos UTF-8 eilutės, bet rasta neteisingų baitų poslinkiu %d " "(eilutės ilgis yra %d). Teisinga UTF-8 eilutė iki tos vietos buvo „%s“" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Vertė yra per giliai" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Perskaityta reikšmė „%s“ nėra tinkamas D-Bus objekto kelias" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Perskaityta reikšmė „%s“ nėra tinkama D-Bus signatūra" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -861,7 +880,7 @@ msgstr[1] "" msgstr[2] "" "Aptiktas %u baitų ilgio masyvas. Maksimalus ilgis yra 2<<26 baitų (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -870,23 +889,23 @@ msgstr "" "Aptiktas „a%c“ tipo masyvas, tikėtasi %u kartotinio baitų ilgio, bet rasta " "%u baitų ilgyje" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Tuščios struktūros (junginiai) D-Bus neleidžiamos" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Perskaityta reikšmė „%s“ variantui nėra tinkama D-Bus signatūra" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Klaida atstatant GVariant su tipo eilute „%s“ iš D-Bus telegramos formato" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -895,29 +914,29 @@ msgstr "" "Netinkama baitų eiliškumo reikšmė. Tikėtasi 0x6c („l“) arba 0x42 („B“), bet " "rasta 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Netinkama pagrindinė protokolo versija. Tikėtasi 1, bet rasta %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Rasta signatūros antraštė, bet ji nėra signatūros tipo" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Signatūros antraštė su signatūra „%s“ rasta, bet pranešimo pagrindinė dalis " "tuščia" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" "Perskaityta reikšmė „%s“ nėra tinkama D-Bus signatūra (pagrindinei daliai)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -931,35 +950,35 @@ msgstr[2] "" "Nėra signatūros antraštės pranešime, bet pranešimo pagrindinė dalis yra %u " "baitų" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Nepavyko atstatyti pranešimo: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" "Klaida paverčiant GVariant su tipo eilute „%s“ į D-Bus telegramos formatą" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" "Failo deskriptorių skaičius žinutėje (%d) skiriasi nuo antraštės lauko (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Nepavyko išsaugoti pranešimo: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "Pranešimo pagrindinė dalis turi signatūrą „%s“, bet nėra signatūros antraštės" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -968,19 +987,19 @@ msgstr "" "Pranešimo pagrindinė dalis turi tipo signatūrą „%s“, bet signatūra antraštės " "lauke yra „%s“" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "Pranešimo pagrindinė dalis yra tuščia, bet signatūra antraštės lauke yra " "„(%s)“" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Klaidos grąžinimas su pagrindinės dalies tipu „%s“" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Klaidos grąžinimas su tuščia pagrindine dalimi" @@ -1000,22 +1019,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Nepavyko gauti aparatūros profilio: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Nepavyko įkelti %s arba %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Klaida kviečiant StartServiceByName elementui %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Nelauktas atsakas %d iš StartServiceByName(\"%s\") metodo" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1025,25 +1044,25 @@ msgstr "" "savininko ir proxy buvo sukonstruotas su " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START požymiu" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstrakti vardų sritis nepalaikoma" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Negalima nurodyti laikino failo kuriant serverį" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Klaida rašant vienkartinio kodo failą vietoje „%s“: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Eilutė „%s“ nėra tinkamas D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Negalima laukti duomenų iš nepalaikomo perdavimo „%s“" @@ -1106,6 +1125,10 @@ msgstr "Prisijungti prie sesijos magistralės" msgid "Connect to given D-Bus address" msgstr "Prisijungti prie pateikto D-Bus adreso" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "ADRESAS" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Ryšio pabaigos parametrai:" @@ -1336,72 +1359,73 @@ msgstr "Klaida: %s nėra tinkamas gerai žinomas magistralės pavadinimas.\n" msgid "Not authorized to change debug settings" msgstr "Neleidžiama keisti derinimo nuostatų" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Nepavadinta" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Darbalaukio failas nenurodė Exec lauko" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Nerastas terminalas, reikalingas programai" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programa „%s“ nerasta $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Nepavyko sukurti naudotojo nustatymų aplanko %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nepavyko sukurti naudotojo MIME nustatymų aplanko %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Programos informacijai trūksta identifikatoriaus" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nepavyko sukurti naudotojo darbalaukio failo %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Specialus apibrėžimas %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "įrenginys nerealizuoja išstūmimo" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "" "įrenginys nerealizuoja išstūmimo nei su papildoma operacija, nei be jos" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "įrenginys nerealizuoja laikmenos tikrinimo užklausimo" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "įrenginys nerealizuoja startavimo" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "įrenginys nerealizuoja stabdymo" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS realizacija nerealizuoja TLS susiejimų gavimo" @@ -1414,27 +1438,27 @@ msgstr "Nėra TLS palaikymo" msgid "DTLS support is not available" msgstr "Nėra DTLS palaikymo" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Nepavyko apdoroti GEmblem koduotės versijos %d" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Netinkamas leksemų skaičius (%d) GEmblem koduotėje" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Nepavyko apdoroti GEmblemedIcon koduotės versijos %d" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Netinkamas leksemų skaičius (%d) GEmblemedIcon koduotėje" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Tikėtasi GEmblem skirto GEmblemedIcon" @@ -1442,129 +1466,134 @@ msgstr "Tikėtasi GEmblem skirto GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Tėvinis prijungimo taškas neegzistuoja" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Negalima kopijuoti ant aplanko viršaus" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Negalima kopijuoti aplanko ant aplanko" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Nurodytas failas jau egzistuoja" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Negalima rekursyviai kopijuoti aplanko" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Failų rėžio kopijavimas nepalaikomas" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Klaida skaidant failą: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Skaidymas nepalaikomas" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Kopijavimas (reflink/clone) tarp prijungimo taškų nepalaikomas" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopijavimas (reflink/clone) nepalaikomas arba netinkamas" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopijavimas (reflink/clone) nepalaikomas arba nesuveikė" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Nepavyko gauti atributą %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Negalima kopijuoti specialaus failo" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Netaisyklinga simbolinės nuorodos reikšmė" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Simbolinės nuorodos nepalaikomos" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Šiukšlės nepalaikomos" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Failų pavadinimuose negali būti '%c'" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Nepavyko sukurti laikinojo aplanko šablonui „%s“: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "tomas nepalaiko prijungimo" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Nėra programos, priregistruotos kaip skaitančios šį failą" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumeratorius užvartas" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Failų enumeratoriui liko neatlikta operacija" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Failų enumeratorius jau užvertas" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Nepavyko apdoroti GFileIcon koduotės versijos %d" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Netinkami GFileIcon įvesties duomenys" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Srautas nepalaiko query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Pozicijos perkėlimas sraute nepalaikomas" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Trumpinimas įėjimo srauto nepalaikomas" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Trumpinimas srauto nepalaikomas" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Klaidingas kompiuterio vardas" @@ -1597,64 +1626,64 @@ msgstr "HTTP tarpinio serverio atsakymas per didelis" msgid "HTTP proxy server closed connection unexpectedly." msgstr "Ryšys su HTTP tarpiniu serveriu netikėtai užvertas." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Neteisingas leksemų skaičius (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Nėra tipo klasės pavadinimui %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Tipas %s nerealizuoja GIcon sąsajos" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Tipas %s neklasifikuotas" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Netinkamas versijos numeris: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Tipas %s nerealizuoja from_tokens() GIcon sąsajoje" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Nepavyko apdoroti pateiktosios piktogramos koduotės versijos" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Nenurodytas adresas" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "%u yra per didelis ilgis adresui" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adresas turi nustatytus bitus už priešdėlio ilgio" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Nepavyko perskaityti „%s“ kaip IP adreso kaukės" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Nepakanka vietos lizdo adresui" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Nepalaikomas lizdo adresas" @@ -1668,7 +1697,7 @@ msgstr "Šaltinio srautas nerealizuoja skaitymo" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Srautui liko neįvykdyta operacija" @@ -1684,7 +1713,7 @@ msgstr "Palikti kartu su failu kai perkeliama" msgid "“version” takes no arguments" msgstr "„version“ nepriima argumentų" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Naudojimas:" @@ -1692,79 +1721,79 @@ msgstr "Naudojimas:" msgid "Print version information and exit." msgstr "Atspausdinti versijos informaciją ir išeiti." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Komandos:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Išvesti failus į standartinę išvestį" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopijuoti vieną ar daugiau failų" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Rodyti informaciją apie vietas" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Paleisti programą pagal desktop failą" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Išvardinti vietų turinį" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Gauti arba nustatyti MIME tipo doroklę" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Sukurti katalogus" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Stebėti failų bei katalogų pasikeitimus" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Prijungti ar atjungti vietas" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Perkelti vieną ar daugiau failų" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Atverti failus naudojant numatytąją programą" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Pervadinti failą" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Ištrinti vieną ar daugiau failų" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Skaityti iš standartinės įvesties ir įrašyti" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Nustatyti failo atributą" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Perkelti failus ar katalogus į šiukšlinę" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Išvardina vietų turinį medžio pavidalu" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Komandos:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Naudokite %s detaliai pagalbai.\n" @@ -1774,7 +1803,7 @@ msgid "Error writing to stdout" msgstr "Klaida rašant į standartinę išvestį" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1797,60 +1826,64 @@ msgstr "" "GIO vietas vietoj vietinių failų: pavyzdžiui, galite kaip vietą naudoti\n" "smb://serveris/išteklius/failas.txt." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Nepateikta vietų" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Nėra paskirties katalogo" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Rodyti eigą" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Klausti prieš perrašant" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Išlaikyti visus atributus" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Padaryti esamų paskirties failų atsargines kopijas" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Niekada neleisti simbolinių nuorodų" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Naudoti numatytuosius leidimus paskirties vietai" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Naudoti numatytuosias keitimo laiko žymas paskirties vietai" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Perduota %s iš %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ŠALTINIS" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "PASKIRTIS" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopijuoti vieną ar daugiau failų iš ŠALTINIO į PASKIRTĮ." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1860,12 +1893,12 @@ msgstr "" "vietas vietoj vietinių failų: pavyzdžiui galite naudoti kaip vietą\n" "smb://serveris/išteklius/failas.txt." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Paskirtis %s nėra katalogas" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: perrašyti „%s“? " @@ -1906,52 +1939,52 @@ msgstr "rodomas pavadinimas: %s\n" msgid "edit name: %s\n" msgstr "keičiamas pavadinimas: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "pavadinimas: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tipas: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "dydis: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "paslėptas\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "vietinis kelias: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix prijungimas: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Nustatomi atributai:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Rašomų atributų vardų sritys:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Rodyti informaciją apie vietas." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2506,7 +2539,8 @@ msgstr "" "katalogo)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "KATALOGAS" @@ -2554,6 +2588,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "C identifikatoriaus vardas, naudojamas generuojamame kode" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFIKATORIUS" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Paskirties C kompiliatorius (numatyta: aplinkos kintamasis CC)" @@ -3062,124 +3100,124 @@ msgstr "Klaida gaunant %s failų sistemos informaciją: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Nerastas tėvinis prijungimo taškas %s" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Negalima pervadinti šakninio aplanko" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Klaida pervadinant failą %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Nepavyko pervadinti failo, failo vardas jau užimtas" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Netaisyklingas failo vardas" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Klaida atveriant failą %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Klaida trinant failą %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Klaida perkeliant failą %s į šiukšlinę: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Nepavyko sukurti šiukšlių aplanko %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nepavyko rasti šakninio aplanko %s išmesti" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Išmetimas tarp sistemos vidinių prijungimo taškų nepalaikomas" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Nepavyko rasti ar sukurti šiukšlių aplanko %s %s išmesti" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Nepavyko sukurti šiukšlinės informacijos failo %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Nepavyko perkelti failo %s į šiukšlinę per failų sistemos ribas" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nepavyko failo %s išmesti į šiukšlinę: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Nepavyko išmesti į šiukšlinę failo %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Klaida kuriant katalogą %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Failų sistema nepalaiko simbolinių nuorodų" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Klaida kuriant simbolinę nuorodą %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Klaida perkeliant failą %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Negalima perkelti aplanko ant aplanko" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Atsarginės kopijos sukūrimas nesėkmingas" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Klaida trinant nurodytą failą: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Perkėlimas tarp prijungimo taškų nepalaikomas" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nepavyko nustatyti %s disko naudojimo: %s" @@ -3201,115 +3239,115 @@ msgstr "Netaisyklingas išplėstinio atributo pavadinimas" msgid "Error setting extended attribute “%s”: %s" msgstr "Klaida nustatant išplėstinį atributą „%s“: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (netaisyklinga koduotė)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Klaida gaunant informaciją apie failą „%s“: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Klaida gaunant informaciją failo aprašymui: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Klaidingas atributo tipas (tikimasi uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Klaidingas atributo tipas (tikimasi uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Klaidingas atributo tipas (tikimasi baitų sekos)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Simbolinėms nuorodoms teisių nustatyti negalima" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Klaida nustatant teises: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Klaida nustatant savininką: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "simbolinė nuoroda turi būti netuščia" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Klaida nustatant simbolinę nuorodą: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Klaida, nustatant simbolinę nuorodą: failas nėra simbolinė nuoroda" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Papildomos nanosekundės %d UNIX laiko žymai %lld yra neigiamos" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Papildomos nanosekundės %d UNIX laiko žymai %lld pasiekia 1 sekundę" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX laiko žyma %lld netelpa į 64 bitus" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX laiko žyma %lld yra už Windows palaikomų ribų" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Failo pavadinimo „%s“ negalima kontertuoti į UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Failo „%s“ negalima atverti: Windows klaida %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Klaida nustatant pakeitimo arba prieigos laiką failui „%s“: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Klaida nustatant pakeitimo arba prieigos laiką: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux kontekstas būti nelygus NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux šioje sistemoje neįjungtas" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Klaida nustatant SELinux kontekstą: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Atributo %s nustatymas nepalaikomas" @@ -3362,7 +3400,7 @@ msgid "Error truncating file: %s" msgstr "Klaida trumpinant failą: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Klaida atveriant failą %s: %s" @@ -3384,27 +3422,27 @@ msgstr "Failas buvo pakeistas kitos programos" msgid "Error removing old file: %s" msgstr "Klaida ištrinant senąjį failą: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Netaisyklingas GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Netinkama pozicijos keitimo užklausa" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Nepavyko sutrumpinti GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Atminties išvedimo srauto dydis nekeičiamas" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Nepavyko pakeisti atminties išvedimo srauto dydžio" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3412,32 +3450,32 @@ msgstr "" "Atminties kiekis, reikalingas įrašymui apdoroti, netelpa į prieinamą adresų " "erdvę" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Prašoma perkelti poziciją dar prieš srauto pradžią" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Prašoma perkelti poziciją jau už srauto pabaigos" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "prijungtasis objektas nepalaiko atjungimo" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "prijungtasis objektas nepalaiko išstūmimo" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "prijungtasis objektas nepalaiko atjungimo nei su papildoma operacija, nei be " @@ -3446,7 +3484,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "prijungtasis objektas nepalaiko išstūmimo nei su papildoma operacija, nei be " @@ -3455,34 +3493,34 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "prijungtasis objektas nepalaiko pakartotinio prijungimo" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "prijungimo taškas nepalaiko turinio tipo spėjimo" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "prijungimo taškas nepalaiko sinchroninio turinio tipo spėjimo" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Mazgo varde „%s“ yra ženklas „[“, bet nėra „]“" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Tinklas nepasiekiamas" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Serveris nepasiekiamas" @@ -3510,7 +3548,7 @@ msgstr "NetworkManager neveikia" msgid "NetworkManager version too old" msgstr "Per sena NetworkManager versija" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Išvedimo srautas nepalaiko rašymo" @@ -3523,38 +3561,38 @@ msgstr "%s perduotų vektorių suma yra per didelė" msgid "Source stream is already closed" msgstr "Šaltinio srautas jau užvertas" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Nenurodyta tarpinio serverio paieškos klaida" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Klaida surandant „%s“: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s nerealizuota" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Neteisinga sritis" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Ištekliaus ties „%s“ nėra" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Ištekliaus ties „%s“ nepavyko išskleisti" @@ -3572,11 +3610,11 @@ msgstr "Išteklius ties „%s“ nėra katalogas" msgid "Input stream doesn’t implement seek" msgstr "Įvesties srautas nerealizuoja nenuoseklaus skaitymo" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Išvardinti sekcijas, turinčias išteklius elf FAILE" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3586,15 +3624,15 @@ msgstr "" "Jei SEKCIJA pateikta, išvardinti tik išteklius šioje sekcijoje\n" "Jei KELIAS yra pateiktas, išvardinti tik atitinkančius išteklius" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FAILAS [KELIAS]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SEKCIJA" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3606,15 +3644,15 @@ msgstr "" "Jei KELIAS pateiktas, išvardinti tik atitinkamus išteklius\n" "Į detalės įeina sekcija, dydis ir glaudinimas" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Išgauti ištekliaus failą į standartinę išvestį" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FAILO KELIAS" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3642,7 +3680,7 @@ msgstr "" "Naudokite „gresource help KOMANDA“ detalesnei pagalbai.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3657,20 +3695,20 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SEKCIJA (Nebūtinas) elf sekcijos pavadinimas\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMANDA Komanda (nebūtina) paaiškinimui\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" " FAILAS elf failas (dvejetainis arba bendro naudojimo biblioteka)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3678,19 +3716,19 @@ msgstr "" " FAILAS elf failas (dvejetainis arba bendro naudojimo biblioteka)\n" " arba kompiliuotas ištekliaus failas\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[KELIAS]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " KELIAS (Nebūtinas) ištekliaus kelias (gali būti dalinis)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "KELIAS" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " KELIAS Ištekliaus kelias\n" @@ -3921,214 +3959,214 @@ msgstr "Pateiktas tuščias schemos pavadinimas\n" msgid "No such key “%s”\n" msgstr "Nėra rakto „%s“\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Netinkamas lizdas, nepavyko inicijuoti" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Netinkamas lizdas, nepavyko inicijuoti: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Lizdas jau užvertas" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Lizdo I/O baigėsi laikas" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "iš fd kuriamas GSocket: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Nepavyko sukurti lizdo: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Nurodyta nežinoma šeima" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Nurodytas nežinomas protokolas" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Negalima naudoti duomenų paketo operacijų ne duomenų paketo lizdui." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Negalima naudoti duomenų paketo operacijų lizdui su laiko limito rinkiniu." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "nepavyko gauto lokalaus adreso: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "nepavyko gauti nuotolinio adreso: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "nepavyko klausytis: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Susiejimo su adresu %s klaida: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Klaida prisijungian prie transliavimo grupės: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Klaida paliekant transliavimo grupę: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Nėra resursams specifinio transliavimo palaikymo" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Nepalaikoma lizdo šeima" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "ištekliams specifinis nėra IPv4 adresas" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Per ilgas sąsajos pavadinimas" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Sąsaja nerasta: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Nėra IPv4 ištekliams specifinio transliavimo palaikymo" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Nėra palaikymo, skirto IPv4 ištekliams specifiniam transliavimui" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Klaida priimant ryšį: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Prisijungiama" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Nepavyko gauti laukiančios klaidos: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Klaida priimant duomenis: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Klaida siunčiant duomenis: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Nepavyko išjungti lizdo: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Klaida užveriant lizdą: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Laukiama lizdo būsenos: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Nepavyksta išsiųsti pranešimo: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Pranešimų vektoriai per dideli" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Klaida siunčiant pranešimą: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "„Windows“ sistemoje „GSocketControlMessage“ nepalaikoma" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Klaida priimant pranešimą: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nepavyko perskaityti lizdo įgaliojimų: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials nerealizuota šiai operacinei sistemai" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Nepavyko prisijungti prie tarpinio serverio %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Nepavyko prisijungti prie %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Nepavyko prisijungti: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Bandymas naudoti proxy ne per TCP ryšį nepalaikomas." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Tarpinio serverio protokolas „%s“ nepalaikomas." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Gavėjas jau užvertas" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Pridėtasis lizdas yra užvertas" @@ -4220,96 +4258,96 @@ msgstr "SOCKSv5 proxy nepalaiko pateikto adreso tipo." msgid "Unknown SOCKSv5 proxy error." msgstr "Nežinoma SOCKSv5 proxy klaida." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Nepavyko sukurti konvejerio skirto keistis duomenimis su antriniu procesu " "(%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Duomenų kanalai šioje platformoje nepalaikomi" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Nepavyko apdoroti GThemedIcon koduotės versijos %d" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Nerasta tinkamų adresų" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Klaida atvirkščiai surandant „%s“: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Klaida analizuojant DNS %s įrašą: blogai suformuotas DNS paketas" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Nėra DNS įrašo prašomam tipui „%s“" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Laikinai nepavyko surasti „%s“" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Klaida surandant „%s“" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Blogai suformuotas DNS paketas" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Nepavyko išanalizuoti DNS atsakymo į „%s“: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Nerastas PEM užkoduotas privatus raktas" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Nepavyko perskaityti PEM užkoduoto privataus rakto" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Nepavyko perskaityti PEM užkoduoto privataus rakto" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Nerastas PEM užkoduotas sertifikatas" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Nepavyko perskaityti PEM užkoduoto sertifikato" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Dabartinė TLS realizacija nepalaiko PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "GTlsBackend nepalaiko PKCS #11 liudijimų kūrimo" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4319,7 +4357,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4327,15 +4365,15 @@ msgstr "" "Keli įvesti slaptažodžiai buvo neteisingi ir jūsų prieiga bus užblokuota po " "tolesnių nesėkmių." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Įvestas slaptažodis yra neteisingas." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "FD siuntimas nepalaikomas" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4343,11 +4381,11 @@ msgstr[0] "Tikėtasi 1 kontrolinio pranešimo, bet sulaukta %d" msgstr[1] "Tikėtasi 1 kontrolinio pranešimo, bet sulaukta %d" msgstr[2] "Tikėtasi 1 kontrolinio pranešimo, bet sulaukta %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Netikėtas tarnybinių duomenų tipas" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4355,111 +4393,122 @@ msgstr[0] "Tikėtasi vieno fd, bet sulaukta %d\n" msgstr[1] "Tikėtasi vieno fd, bet sulaukta %d\n" msgstr[2] "Tikėtasi vieno fd, bet sulaukta %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Gautas netinkamas fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "FD gavimas nepalaikomas" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Klaida siunčiant įgaliojimus: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Klaida tikrinant, ar SO_PASSCRED įjungta lizdui: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Klaida leidžiant SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Tikimasi nustatyti vienintelį baitą įgaliojimų gavimui, bet nuskaityta nulis " "baitų" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Nesitikėta kontrolinio pranešimo, bet sulaukta %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Klaida išjungiant SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Klaida skaitant failą: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Klaida užveriant failą: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Failų sistemos šaknis" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Klaida rašant į failą: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstrakčiųjų UNIX srities lizdų adresai šioje sistemoje nepalaikomi" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "tomas nerealizuoja išstūmimo" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "tomas nerealizuoja išstūmimo nei su papildoma operacija,nei be jos" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Programa „%s“ programos objekte neturi veiksmų" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "Programa „%s“ ir apdorotojas „%s“ programos objekte neturi veiksmų" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Klaida skaitant iš rankenėlės: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Klaida užveriant rankenėlę: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Klaida rašant į rankenėlę: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Nepakanka atminties" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Vidinė klaida: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Reikia daugiau įvesties" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Netinkami suspausti duomenys" @@ -4487,148 +4536,286 @@ msgstr "Paleisti dbus tarnybą" msgid "Wrong args\n" msgstr "Blogi argumentai\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Nepavyko atverti „%s“: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Klaida: nepavyko įrašyti visos išvesties: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Klaida: nepavyko pervadinti „%s“ į „%s“: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Įtraukti katalogus iš GIR paieškos kelio" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Išvesties failas" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Bendro naudojimo biblioteka" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Rodyti derinimo išvestį" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Rodyti išsamius pranešimus" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Parodyti programos versiją ir išeiti" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Klaida analizuojant argumentus: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Nurodykite vienintelė įvesties failą" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Klaida analizuojant failą „%s“: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Nepavyko sukurti typelib moduliui „%s“" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Netinkamas typelib moduliui „%s“: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Rodyti visą prieinamą informaciją" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Nepavyko išanalizuoti: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Nėra įvesties failų" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Nepavyko perskaityti „%s“: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Nepavyko sukurti typelib „%s“: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Nepavyko įkelti typelib: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Įspėjimas: praleisti %u moduliai" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Inspektuojama typelib versija" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERSIJA" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Bendro naudojimo bibliotekų sąrašas, reikalingas typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Kitų typelib sąrašas, kurių reikia inspektuojamam typelib" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "Inspektuojamas typelib" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "VARDŲSRITIS" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Inspektuoti GI typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Nepavyko išanalizuoti komandų eilutės parametrų: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Nurodykite vienintelę vardų sritį" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Nurodykite -print-shlibs, --print-typelibs arba abu" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Netikėtas atributas „%s“ elementui „%s“" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Nerastas elemento „%2$s“ atributas „%1$s“" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Netikėta žyma „%s“, tikėtasi žymos „%s“" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Netikėta žyma „%s“ „%s“ viduje" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Netinkama data/laikas „%s“ gairių faile" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Duomenų aplankuose nerasta tinkamo žymelių failo" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "URI „%s“ žymelė jau yra" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nerasta žymelė URI „%s“" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "URI „%s“ žymelėje neapibrėžtas MIME tipas" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "URI „%s“ žymelėje neapibrėžta privati vėliavėlė" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "URI „%s“ žymelėje nenurodyta jokia grupė" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Nėra programos pavadinimu „%s“ registravusios „%s“ žymelę" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Nepavyko išskleisti vykdomosios eilutės „%s“ su URI „%s“" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Neatvaizduojamas simbolis keitimo įvestyje" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Nepilna simbolio seka įvedimo pabaigoje" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Negalima keisti atgalinio varianto „%s“ į koduotę „%s“" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Įtaisytas NUL baitas keitimo įvestyje" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Įtaisytas NUL baitas keitimo išvestyje" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "Adresas „%s“ nėra absoliutus adresas naudojantis „file“ schemą" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI „%s“ yra klaidingas" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Kompiuterio vardas URI „%s“ yra netinkamas" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI „%s“ yra klaidingai perkoduoti simboliai" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Kelias „%s“ nėra absoliutus" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a, %Y m. %b %e d., %H:%M:%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%Y-%m-%d" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S" @@ -4649,62 +4836,62 @@ msgstr "%I:%M:%S" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Sausis" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Vasaris" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Kovas" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Balandis" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Gegužė" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Birželis" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Liepa" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Rugpjūtis" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Rugsėjis" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Spalis" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Lapkritis" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Gruodis" @@ -4726,132 +4913,132 @@ msgstr "Gruodis" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Saus" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Vas" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Kov" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Bal" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Geg" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Birž" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Liep" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Rugp" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Rugs" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Spal" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Lapkr" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Gruod" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Pirmadienis" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Antradienis" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Trečiadienis" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Ketvirtadienis" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Penktadienis" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Šeštadienis" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Sekmadienis" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Pir" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Ant" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Tre" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Ket" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Pen" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Šeš" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Sek" @@ -4873,62 +5060,62 @@ msgstr "Sek" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "sausio" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "vasario" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "kovo" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "balandžio" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "gegužės" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "birželio" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "liepos" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "rugpjūčio" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "rugsėjo" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "spalio" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "lapkričio" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "gruodžio" @@ -4950,191 +5137,196 @@ msgstr "gruodžio" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "saus" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "vas" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "kov" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "bal" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "geg" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "birž" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "liep" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "rugp" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "rugs" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "spal" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "lapkr" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "gruod" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Klaida atveriant aplanką „%s“: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Nepavyko išskirti %lu baito failo „%s“ perskaitymui" -msgstr[1] "Nepavyko išskirti %lu baitų failo „%s“ perskaitymui" -msgstr[2] "Nepavyko išskirti %lu baitų failo „%s“ perskaitymui" +msgid "Could not allocate %s to read file “%s”" +msgstr "Nepavyko išskirti %s failo „%s“ perskaitymui" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Klaida skaitant failą „%s“: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Failas „%s“ per didelis" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Nepavyko perskaityti failo „%s“: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Nepavyko atverti failo „%s“: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Nepavyko gauti failo „%s“ atributų: fstat() klaida: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Nepavyko atverti failo „%s“: fdopen() klaida: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Nepavyko pervadinti failo „%s“ į „%s“: g_rename() klaida: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Nepavyko įrašyti failo „%s“: ftruncate() klaida: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Nepavyko įrašyti failo „%s“: write() klaida: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Nepavyko įrašyti failo „%s“: fsync() klaida: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Nepavyko sukurti failo „%s“: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Nepavyko pašalinti egzistuojančio failo „%s“: g_unlink() klaida: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Šablonas „%s“ klaidingas, jame negali būti „%s“" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Šablone „%s“ nėra XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Nepavyko perskaityti simbolinės nuorodos „%s“: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Nepavyko atverti keitiklio iš „%s“ į „%s“: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Nepakeistų duomenų likučiai skaitymo buferyje" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanalas pasibaigia nepilnu simboliu" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Paieškos aplankuose nepavyko rasti tinkamo raktų failo" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Nėra paprastas failas" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5142,49 +5334,49 @@ msgstr "" "Raktų faile yra eilutė „%s“, kuri nėra raktas-reikšmė pora, grupė ar " "komentaras" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Netinkamas grupės pavadinimas: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Raktų failas neprasideda grupe" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Netinkamas rakto pavadinimas: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Raktų faile yra nepalaikoma koduotė „%s“" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Raktų failas neturi grupės „%s“" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Raktų faile nėra rakto „%s“ grupėje „%s“" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Raktų faile yra raktas „%s“ su reikšme „%s“, kuri nėra UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "Raktų faile yra raktas „%s“, turintis nesuprantamą reikšmę." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5193,37 +5385,37 @@ msgstr "" "Raktų faile yra raktas „%s“ grupėje „%s“, kuriame yra reikšmė, kurios " "negalima suprasti." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Raktas „%s“ grupėje „%s“ turi reikšmę „%s“, nors tikimasi %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Raktų faile, eilutės pabaigoje yra pabėgimo simbolis" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Raktų faile yra klaidinga kaitos eilutė „%s“" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Reikšmės „%s“ negalima interpretuoti kaip skaičiaus." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Sveikoji reikšmė „%s“ viršija ribas" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "" "Reikšmės „%s“ negalima interpretuoti kaip slankiojo kablelio skaičiaus." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Reikšmės „%s“ negalima interpretuoti kaip loginės." @@ -5243,32 +5435,32 @@ msgstr "Nepavyko pažymėti failo %s%s%s%s: mmap() klaida: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Nepavyko atverti failo „%s“: open() klaida: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Klaida eilutėje %d simbolyje %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Klaidingai koduotas UTF-8 tekstas varde – netinkamas „%s“" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "„%s“ nėra tinkamas vardas" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "„%s“ nėra tinkamas vardas: „%c“" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Klaida eilutėje %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5277,7 +5469,7 @@ msgstr "" "Nepavyko perskaityti „%-.*s“, kuris galėjo turėti skaičius simbolio aprašyme " "(pvz., ê) – gal skaičius per didelis" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5287,24 +5479,24 @@ msgstr "" "ampersendo simbolį nepradėdami elemento įvedimo – pakeiskite ampersendą " "įvesdami &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Simbolio aprašymas „%-.*s“ neatitinka leistinų simbolių" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Aptiktas tuščias elementas '&;'; galimi elementai yra: & " < " "> '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Elemento vardas „%-.*s“ nežinomas" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5312,11 +5504,11 @@ msgstr "" "Elementas nepasibaigė kabliataškiu; greičiausiai Jūs panaudojote ampersendo " "simbolį nepradėdami elemento įvedimo – pakeiskite ampersendą įvesdami &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumentas turėtų prasidėti elementu (pvz., )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5324,7 +5516,7 @@ msgid "" msgstr "" "„%s“ negali būti rašomas po „<“ simbolio; jis nepradeda jokio elemento vardo" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5333,12 +5525,12 @@ msgstr "" "Neįprastas simbolis „%s“, tikėtasi sulaukti „>“ simbolio, užbaigiančio " "tuščią žymą „%s“" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Per daug atributų elemente „%s“" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5346,7 +5538,7 @@ msgstr "" "Neįprastas simbolis „%1$s“, tikėtasi sulaukti „=“ po elemento „%3$s“ " "atributo vardo „%2$s“" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5357,7 +5549,7 @@ msgstr "" "užbaigiančių elementą „%s“, arba papildomo požymio; gal Jūs panaudojote " "netinkama simbolį požymio varde" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5366,7 +5558,7 @@ msgstr "" "Neįprastas simbolis „%1$s“, po lygybės tikėtasi sulaukti atidarančio " "citavimo simbolio pradedant „%3$s“ elemento „%2$s“ atributo reikšmę." -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters ““" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "" "Elemento „%s“ uždarymo simbolis sutiktas anksčiau už elemento atidarymo " "simbolį" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" "Sutiktas elemento „%s“ uždarymo simbolis, tačiau šiuo metu atidarytas kitas " "elementas „%s“" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokumentas tuščias arba susideda tik iš tarpų" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokumentas netikėtai pasibaigė tuoj po atidarančių skliaustų „<“" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5414,7 +5606,7 @@ msgstr "" "Dokumentas netikėtai pasibaigė neuždarius dalies elementų – „%s“ yra " "paskutinis atviras elementas" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5423,19 +5615,19 @@ msgstr "" "Dokumentas netikėtai pasibaigė, tikėtasi uždarančių skliaustų simbolio, " "užbaigiančio žymą <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokumentas netikėtai pasibaigė elemento varde" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokumentas netikėtai pasibaigė požymio varde" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokumentas netikėtai pasibaigė elemento atvėrimo žyma." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5443,258 +5635,258 @@ msgstr "" "Dokumentas netikėtai pasibaigė lygybės simboliu einančio po požymio vardo; " "nerasta požymio reikšmė" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokumentas netikėtai pasibaigė požymio verte" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokumentas netikėtai pasibaigė žymos „%s“ uždarančiame simbolyje" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Dokumentas netikėtai pasibaigė neatidaryto elemento uždarymo žymoje" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokumentas netikėtai pasibaigė komentaruose arba apdorojimo instrukcijose" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[PARAMETRAS…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Pagalbos parametrai:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Rodyti pagalbos parametrus" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Rodyti visus pagalbos parametrus" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Programos parametrai:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Parametrai:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nepavyko perskaityti sveikosios reikšmės „%s“, reikalingos %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Sveikoji reikšmė „%s“, reikalinga %s, viršija ribas" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Nepavyko apdoroti dvigubos reikšmės „%s“, reikalingos %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Dviguboji reikšmė „%s“, reikalinga %s, viršija ribas" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Klaida apdorojant parametrą %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "%s trūksta argumento" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Nežinomas parametras %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "sugadintas objektas" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "nebėra atminties" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "vidinė klaida" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "šablone yra dalinio atitikimo nepalaikomų elementų" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "atgalinės nuorodos kaip sąlygos nepalaikomos daliniam atitikimui" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "pasiekta rekursijos riba" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "blogas poslinkis" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekursijos ciklas" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "prašoma atitikties veiksena, kuri nebuvo sukompiliuota JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "nežinoma klaida" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ šablono pabaigoje" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c šablono pabaigoje" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "neatpažintas simbolis po \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "skaičiai ne iš eilės {} kvantoriuje" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "skaičius per didelis {} kvantoriuje" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "trūksta baigiamojo ] simbolio klasei" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "klaidinga speciali seka simbolio klasėje" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "ruožas ne iš eilės simbolio klasėje" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nėra ką kartoti" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "neatpažintas simbolis po (? arba (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "klasės POSIX vardais leidžiamos tik klasių viduje" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX gretinimo elementai nepalaikomi" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "trūksta baigiamojo )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "nuoroda į neegzistuojantį pošablonį" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "trūksta ) po komentaro" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "reguliarioji išraiška per didelė" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "netaisyklingas skaičius ar vardas po (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "žiūros atgal teiginys nefiksuoto ilgio" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "sąlyginė grupė turi daugiau negu dvi šakas" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "tikimasi teiginio po (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "numeruota nuoroda turi būti ne nulis" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nežinomas POSIX klasės vardas" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "simbolio reikšmė \\x{...} sekoje per didelė" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C neleistinas žiūros atgal teiginyje" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "trūksta baigiamojo simbolio pošablonio pavadinime" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "du vardiniai pošabloniai turi tą patį vardą" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "netaisyklinga \\P arba \\p seka" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "nežinomas savybės vardas po \\P arba \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "pošablonio vardas per ilgas (turi būti iki 32 simbolių)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "per daug vardinių pošablonių (iki 10000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "aštuntainė reikšmė didesnė už \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE grupėje yra daugiau negu viena šaka" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "nenuoseklūs NEWLINE parametrai" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5702,234 +5894,234 @@ msgstr "" "po \\g nėra vardo riestiniuose arba lenktiniuose skliaustuose ar teigiamo " "skaičiaus, ar tiesiog skaičiaus" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "argumentas neleidžiamas veiksmams (*ACCEPT), (*FAIL), ir (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) neatpažintas" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "numeris per didelis" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "trūksta baigiamojo simbolio pošablonio po (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "skirtingi vardai to paties skaičiaus pošabloniams nėra leistini" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) privalo turėti argumentą" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "Po \\c turi būti ASCII simbolis" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "po \\k nėra vardo riestiniuose arba lenktiniuose skliaustuose arba kabutėse" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N nepalaikomas klasėje" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "pavadinimas yra per ilgas (*MARK), (*PRUNE), (*SKIP), ir (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "kodo perviršis" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "neatpažintas simbolis po (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "perpildyta kompiliavimo darbo sritis" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "anksčiau tikrintas nurodytas pošablonis nerastas" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Klaida ieškant reguliariosios išraiškos %s atitikmens: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE biblioteka sukompiliuota be UTF8 palaikymo" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE biblioteka sukompiliuota su nesuderinamais parametrais" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Klaida kompiliuojanti reguliarią išraišką `%s` ties simboliu %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "laukta šešioliktainio skaitmens arba „}“" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "laukta šešioliktainio skaitmens" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "simbolinėje nuorodoje trūksta „<“" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "nebaigta simbolinė nuoroda" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "nulinio ilgio simbolinė nuoroda" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "laukta skaitmens" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "neleistina simbolinė nuoroda" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "nevietoje galutinis „\\“" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "nežinoma kaitos seka" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Klaida apdorojant pakeitimo tekstą „%s“ ties simboliu %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Cituojamas tekstas neprasideda citavimo ženklu" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Nesutampantis citavimo simbolis komandinėje eilutėje arba kitame terpės " "cituotame tekste" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Tekstas pasibaigė tuoj po „\\“ simbolio. (Tekste buvo įrašyta „%s“)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Tekstas pasibaigė nesulaukus %c atitinkančio citatos ženklo. (Tekste buvo " "įrašyta „%s“)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Tekstas buvo tuščias arba turėjo vien tik tarpo simbolius)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nepavyko gauti duomenis iš antrinio proceso (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Netikėta klaida skaitant duomenis žiš antrinio proceso (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Netikėta waitpid() klaida (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Vaikinis procesas išėjo su kodu %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Vaikinis procesas nutrauktas signalu %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Vaikinis procesas sustabdytas signalu %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Vaikinis procesas išėjo nenormaliai" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Nepavyko perskaityti duomenų iš antrinio konvejerio (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Nepavyko atskirti (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Nepavyko pereiti į aplanką „%s“ (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Nepavyko atverti failo deskriptoriaus pakeitimui (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Nepavyko dubliuoti failo deskriptoriaus antriniam procesui (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Nepavyko atskirti antrinio proceso (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Nepavyko užverti failo deskriptoriaus antriniam procesui (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Nežinoma klaida vykdant antrinį procesą „%s“" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5987,78 +6179,78 @@ msgstr "" "Netikėta klaida tarp g_io_channel_win32_poll() funkcijos duomenų skaitymo iš " "antrinio proceso metu" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Tuščia simbolių eilutė nėra skaičius" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "„%s“ nėra skaičius su ženklu" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Skaičius „%s“ yra už [%s, %s] ribų" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "„%s“ nėra skaičius be ženklo" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "URI yra netinkamas %-kodavimas" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "URI yra neleistinas simbolis" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "URI yra ne UTF-8 simbolių" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "URI yra netinkamas IPv6 adresas „%.*s“" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "URI yra neteisingai koduotas IP adresas „%.*s“" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "URI yra neteisingai internacionalizuotas serverio pavadinimas „%.*s“" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Nepavyko perskaityti URI esančio prievado „%.*s“" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URI esantis prievadas „%.*s“ yra už ribų" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI „%s“ nėra absoliutus URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI „%s“ neturi kompiuterio komponentės" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI nėra absoliutus ir nepateiktas bazinis URI" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Trūksta „=“ bei parametro vertės" @@ -6139,65 +6331,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6307,6 +6499,53 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "Nepavyko išskirti %" +#~ msgstr[1] "Nepavyko išskirti %" +#~ msgstr[2] "Nepavyko išskirti %" + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN pranešimas: trūksta REPLY_SERIAL antraštės arba ji netinkama" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "GApplication options" #~ msgstr "GApplication parametrai" @@ -6502,9 +6741,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[ARGUMENTAI...]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "Nepavyko sukurti laikino failo: %s" - #~ msgid "" #~ "Message has %d file descriptors but the header field indicates %d file " #~ "descriptors" diff --git a/po/lv.po b/po/lv.po index 6f237c1..df1a13a 100644 --- a/po/lv.po +++ b/po/lv.po @@ -3,78 +3,78 @@ # # # Artis Trops , 2002. -# Rūdofls Mazurs , 2011, 2012. +# SPDX-FileCopyrightText: 2011, 2012, 2024 Rūdofls Mazurs # Rūdolfs Mazurs , 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2020, 2021, 2023. msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 10:14+0000\n" -"PO-Revision-Date: 2023-09-18 17:09+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-14 09:23+0000\n" +"PO-Revision-Date: 2024-02-25 13:01+0200\n" "Last-Translator: Rūdolfs Mazurs \n" "Language-Team: Latvian \n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Lokalize 22.12.3\n" +"X-Generator: Lokalize 23.08.1\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 :" " 2);\n" #: gio/gappinfo.c:339 -#| msgid "Setting attribute %s not supported" msgid "Setting default applications not supported yet" msgstr "Noklusējuma lietotnes iestatīšana vēl nav atbalstīta" #: gio/gappinfo.c:372 -#| msgid "Setting attribute %s not supported" msgid "Setting application as last used for type not supported yet" msgstr "Pēdējās izmantotās lietotnes iestatīšana tipam vēl nav atbalstīta" #: gio/gappinfo.c:814 #, c-format -#| msgid "No default applications for “%s”\n" msgid "Failed to find default application for content type ‘%s’" msgstr "Neizdevās atrast noklusējuma lietotni satura tipam “%s”" #: gio/gappinfo.c:874 #, c-format -#| msgid "No default applications for “%s”\n" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Neizdevās atrast noklusējuma lietotni URI shēmai “%s”" -#: gio/gapplication.c:506 -#| msgid "Application Options:" +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication opcijas:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Parādīt GApplication opcijas" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Ievadiet GApplication servisa režīmu (izmantot no D-Bus servisa datnēm)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Pārrakstīt lietotnes ID" #: gio/gapplication.c:575 +#| msgid "List applications" +msgid "Print the application version" +msgstr "Rādīt lietotnes versiju" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Aizvietot palaisto instanci" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Drukāšanas palīdzība" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMANDA]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Drukāt versiju" @@ -128,7 +128,7 @@ msgid "APPID" msgstr "LIETID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 msgid "COMMAND" msgstr "KOMANDA" @@ -142,7 +142,7 @@ msgstr "Lietotnes identifikators D-Bus formātā(piemēram: org.example.viewer)" #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 msgid "FILE" msgstr "DATNE" @@ -167,7 +167,7 @@ msgstr "PARAMETRS" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Neobligāts parametrs darbības izsaukšanai, GVariant formātā" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -181,12 +181,12 @@ msgstr "" msgid "Usage:\n" msgstr "Lietošana:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumenti:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARG…]" @@ -279,78 +279,78 @@ msgstr "" "neatpazīta komanda: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Pārāk liela vērtība tika padota %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Uz bāzes plūsmas meklēšana netiek atbalstīta" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Nevar apraut GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Plūsma jau ir aizvērta" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Uz bāzes plūsmas apraušana nav atbalstīta" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Darbība tika atcelta" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Nederīgs objekts, nav inicializēts" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Nepilnīga vairāku baitu sekvence ievadē" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Mērķī nepietiek brīvās vietas" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Nepareiza baitu secība konversijas ievadē" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Kļūda, konversējot — %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Atceļama inicializācija nav atbalstīta" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Pārveidošana no rakstzīmju kopas “%s” uz “%s” nav atbalstīta" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Nevarēja atvērt pārveidotāju no “%s” uz “%s”" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s tips" @@ -364,41 +364,41 @@ msgstr "Nezināms tips" msgid "%s filetype" msgstr "%s datnes tips" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials satur nederīgus datus" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials nav implementēti šajā OS" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Šajā platformā nav GCredentials atbalsta" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials nesatur procesa ID šajā OS" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Šajā OS nevar viltot akreditācijas datus" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Negaidīti agras plūsmas beigas" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Neatbalstīta atslēga “%s” adreses ierakstā “%s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Bezjēdzīgas atslēgu/vērtību pāru kombinācijas adrešu ierakstā “%s”" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -407,28 +407,28 @@ msgstr "" "Adrese “%s” ir nederīga (vajag tieši vienu atslēgu: path, dir, tmpdir vai " "abstract)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Kļūda adresē “%s” — “%s” atribūts ir slikti noformēts" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Nezināms vai neatbalstīts transports “%s” adresei “%s”" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Adreses elements “%s” nesatur kolu (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transporta nosaukums adreses elementā “%s” nedrīkst būt tukšs" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -437,7 +437,7 @@ msgstr "" "Atslēgas/vērtības pāris %d, “%s”, adreses elementā “%s”, nesatur vienādības " "zīmi" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -445,7 +445,7 @@ msgstr "" "Atslēgas/vērtības pāris %d, “%s”, adreses elementā “%s”, nedrīkst saturēt " "tukšu atslēgu" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -454,7 +454,7 @@ msgstr "" "Kļūda, noņemot atsoli atslēgai vai vērtībai atslēga/vērtība pārī %d. “%s”, " "adreses elementā “%s”" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -463,75 +463,74 @@ msgstr "" "Kļūda adresē “%s” — unix transportam nepieciešams iestatīt tieši vienu " "atslēgu “path” vai “abstract”" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Kļūda adresē “%s” — trūkst vai slikti noformēts resursdatora atribūts" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Kļūda adresē “%s” — trūkst vai slikti noformēts porta atribūts" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "Kļūda adresē “%s” — trūkst vai slikti noformēts noncefile atribūts" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Kļūda, automātiski palaižot: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Kļūda, atverot nonce datni “%s” — %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Kļūda, nolasot no nonce datnes “%s” — %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Kļūda, nolasot no nonce datnes “%s” — gaidīja 16 baitus, saņēma %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Kļūda, rakstot nonce datnes “%s” saturu uz straumi:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Dotā adrese ir tukša" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format -#| msgid "Cannot spawn a message bus when setuid" msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Nevar izveidot ziņojumu kopni, kad ir iestatīts AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Nevar izveidot ziņojumu kopni bez machine-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Nevar automātiski palaist D-Bus bez X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Kļūda, izveidojot komandrindu “%s”: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Nevar noteikt sesijas kopnes adresi (nav implementēts šai OS)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -540,7 +539,7 @@ msgstr "" "Nevar noteikt kopnes adresi no DBUS_STARTER_BUS_TYPE vides mainīgā — " "nezināma vērtība “%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -548,20 +547,20 @@ msgstr "" "Nevar noteikt kopnes adresi, jo DBUS_STARTER_BUS_TYPE vides mainīgais nav " "iestatīts" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Nezināms kopnes tips %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Negaidīts satura trūkums, mēģinot lasīt rindu" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Negaidīts satura trūkums, mēģinot (droši) lasīt rindu" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -569,16 +568,15 @@ msgstr "" "Izsmelti visi pieejamie autentifikācijas mehānismi (mēģināti: %s) (pieejami: " "%s)" -#: gio/gdbusauth.c:1045 -#| msgid "Unexpected lack of content trying to read a line" +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Negaidīts satura trūkums, mēģinot lasīt baitu" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Lietotāja ID ir jābūt vienādiem gan biedram, gan serverim" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Atcelts caur GDBusAuthObserver::authorize-authenticated-peer" @@ -599,13 +597,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Kļūda, veidojot direktoriju “%s” — %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Darbība nav atbalstīta" @@ -670,15 +668,15 @@ msgstr "Kļūda, atverot atslēgu saišķi “%s” rakstīšanai: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Un vēl, “%s” slēguma atbrīvošana neizdevās — %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Savienojums ir aizvērts" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Iestājās noildze" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -768,54 +766,79 @@ msgstr "%s apakškoks jau ir eksportēts " msgid "Object does not exist at path “%s”" msgstr "Ceļā “%s” objekts neeksistē" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s ziņojums — %s galvenes lauks ir nederīgs; sagaidīja vērtību ar tipu “%s”" + +#: gio/gdbusmessage.c:1374 +#, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: %s header field is missing or invalid" +msgstr "%s ziņojums — %s galvenes lauks ir nederīgs vai arī tas nav atrasts" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s ziņojums — ir sniegts NEDERĪGS galvenes lauks" + +#: gio/gdbusmessage.c:1424 +#, c-format +#| msgid "" +#| "SIGNAL message: The PATH header field is using the reserved value /org/" +#| "freedesktop/DBus/Local" +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s ziņojums — PATH galvenes datne izmanto rezervēto vērtību /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +#| msgid "" +#| "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or " +#| "invalid" +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "%s ziņojums — galvene INTERFACE nesatur derīgu saskarnes nosaukumu" + +#: gio/gdbusmessage.c:1446 +#, c-format +#| msgid "" +#| "SIGNAL message: The INTERFACE header field is using the reserved value " +#| "org.freedesktop.DBus.Local" +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s ziņojums — INTERFACE galvenes lauks izmanto rezervēto vērtību org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +#| msgid "" +#| "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"%s ziņojums — MEMBER galvenes lauks nesatur derīgu dalībnieka nosaukumu" + +#: gio/gdbusmessage.c:1472 +#, c-format +#| msgid "" +#| "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or " +#| "invalid" +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s ziņojums — ERROR_NAME galvenes lauks nesatur derīgu kļūdas nosaukumu" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "tips ir INVALID" -#: gio/gdbusmessage.c:1324 -#| msgid "METHOD_CALL message: PATH or MEMBER header field is missing" -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "METHOD_CALL ziņojums — trūkst vai nav derīga PATH vai MEMBER galvene" - -#: gio/gdbusmessage.c:1340 -#| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"METHOD_RETURN ziņojums — trūkst vai nav derīga REPLY_SERIAL galvenes lauks" - -#: gio/gdbusmessage.c:1360 -#| msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR ziņojums — trūkst vai nav derīga REPLY_SERIAL vai ERROR_NAME galvenes" -" lauks" - -#: gio/gdbusmessage.c:1384 -#| msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL ziņojums — trūkst vai nav derīga PATH, INTERFACE vai MEMBER galvenes" -" datne" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL ziņojums — PATH galvenes datne izmanto rezervēto vērtību /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL ziņojums — INTERFACE galvenes dante izmanto rezervēto vērtību org." -"freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -823,12 +846,12 @@ msgstr[0] "Vēlējās lasīt %lu baitu, bet saņēma %lu" msgstr[1] "Vēlējās lasīt %lu baitus, bet saņēma %lu" msgstr[2] "Vēlējās lasīt %lu baitus, bet saņēma %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Gaidīja NUL baitu pēc virknes “%s”, bet atrada baitu %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -837,21 +860,21 @@ msgstr "" "Gaidīja derīgu UTF-8 virkni, bet atrada nederīgus baitus pie baitu nobīdes " "%d (virknes garums ir %d). Derīgā UTF-8 virkne līdz tai vietai bija “%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Vērtība ir iegulta pārāk dziļi" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Parsētā vērtība “%s” nav derīgs D-Bus objekta ceļš" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Parsētā vērtība “%s” nav derīgs D-Bus objekta paraksts" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -867,7 +890,7 @@ msgstr[2] "" "Saskārās ar %u baitu garu masīvu. Maksimālais garums ir 2<<26 baiti (64 " "MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -876,23 +899,23 @@ msgstr "" "Saskārās ar masīvu, kam tips ir “a%c”, kura garumam vajadzētu dalīties ar %u " "baitiem, bet tā garums ir %u baiti" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Tukšas struktūras (korteži) nav atļauti iekš D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Parsētā vērtība “%s” variantam nav derīgs D-Bus paraksts" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Kļūda, deserializējot GVariant ar tipa virkni “%s” no D-Bus vadu formāta" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -901,27 +924,27 @@ msgstr "" "Nederīga secības (endian) vērtība. Gaidīja 0x6c (“l”) vai 0x42 (“B”), bet " "atrada vērību 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Nederīga lielā protokola vērtība. Gaidīja 1, bet saņēma %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Parasta galvene ir atrasta, bet tai nav tipa paraksta" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Paraksta galvene ar parakstu “%s” atrasta, bet vēstules pamatteksts ir tukšs" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Parsētā vērtība “%s” nav derīgs D-Bus paraksts (pamattekstam)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -932,32 +955,32 @@ msgstr[1] "" msgstr[2] "" "Ziņojumā nav paraksta galvenes, bet ziņojuma pamatteksts ir %u baitu" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Nevar deserializēt ziņojumu: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "Kļūda, serializējot GVariant ar tipa virkni “%s” uz D-Bus vadu formātu" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "Datņu deskriptoru skaits (%d) ziņojumā atšķiras no galvenes lauka (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Nevar serializēt ziņojumu: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Ziņojuma pamattekstam ir paraksts “%s”, bet nav paraksta galvenes" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -966,17 +989,17 @@ msgstr "" "Vēstules pamattekstam ir tipa paraksts “%s”, bet paraksts galvenes laukā ir " "“%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Ziņojuma pamatteksts ir tukšs, bet paraksta galvenes lauks ir “(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Kļūdas atgriešana ar pamattekstu ar tipu “%s”" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Kļūdas atgriešana ar tukšu pamattekstu" @@ -996,22 +1019,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Nevar saņemt aparatūras profilu — %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Nevar ielādēt %s vai %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Kļūda, izsaucot StartServiceByName priekš %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Negaidīta atbilde %d no StartServiceByName(“%s”) metodes" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1021,25 +1044,25 @@ msgstr "" "īpašnieka, un starpnieks tika veidots ar " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START slēdzi (flag)" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstraktas nosaukumu telpas nav atbalstītas" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Nevar norādīt nonce datni, kad veido serveri" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Kļūda, rakstot nonce datni pie “%s” — %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Virkne “%s” nav derīga D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Nevar klausīties uz neatbalstīta transporta “%s”" @@ -1214,7 +1237,6 @@ msgid "Timeout in seconds" msgstr "Noildze sekundēs" #: gio/gdbus-tool.c:900 -#| msgid "Show information about locations" msgid "Allow interactive authorization" msgstr "Atļaut interaktīvu pilnvarošanu" @@ -1332,71 +1354,72 @@ msgstr "Kļūda — %s nav derīgs labi zināms kopnes nosaukums.\n" msgid "Not authorized to change debug settings" msgstr "Nav pilnvarots mainīt atkļūdošanas iestatījumus" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Nenosaukts" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Darbvirsmas datne nenorādīja Exec lauku" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Nevarēja atrast termināli, kas ir nepieciešams lietotnei" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programma “%s” nav atrasta iekš $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Nevar izveidot lietotāja lietotnes konfigurācijas mapi %s — %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nevar izveidot lietotāja MIME konfigurācijas mapi %s — %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Lietotnes informācijai trūkst identifikatora" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nevar izveidot lietotāja darbvirsmas datni %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Pielāgotas %s definīcijas" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "dzinis neatbalsta izgrūšanu" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "dzinis neatbalsta izgrūšanu vai eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "dzinis neatbalsta medija aptauju" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "dzinis neatbalsta startēšanu" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "dzinis neatbalsta apturēšanu" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS aizmugure nav implementējusi TLS saistīšanas saņemšanu" @@ -1409,27 +1432,27 @@ msgstr "TLS atbalsts nav pieejams" msgid "DTLS support is not available" msgstr "DTLS atbalsts nav pieejams" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Nevar apstrādāt GEmblem versijas %d kodējumu" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Vairāki slikti formēti marķieri (%d) GEmblem kodējumā" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Nevar apstrādāt GEmblemedIcon versijas %d kodējumu" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Vairāki slikti formēti marķieri (%d) GEmblemedIcon kodējumā" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Gaidīja GEmblem priekš GEmblemedIcon" @@ -1437,131 +1460,135 @@ msgstr "Gaidīja GEmblem priekš GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Saturošais montējums neeksistē" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Nevar kopēt virsū mapei" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Nevar uzkopēt mapi virsū mapei" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Mērķa datne eksistē" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Nevar rekursīvi kopēt mapi" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format -#| msgid "Operation not supported" msgid "Copy file range not supported" msgstr "Datņu intervāla kopēšana nav atbalstīta" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Kļūda, datnei veicot splice — %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Splice nav atbalstīts" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Kopēšana (reflink/clone) starp montētiem sējumiem nav atbalstīta" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopēšana (reflink/clone) nav atbalstīta vai nav derīga" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopēšana (reflink/clone) nav atbalstīta vai nenostrādāja" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +#| msgid "Unset given attribute" +msgid "Cannot retrieve attribute %s" +msgstr "Nevar saņemt atribūtu %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Nevar kopēt īpašu datni" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Ir dota nederīga simboliskās saites vērtība" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2399 msgid "Symbolic links not supported" msgstr "Simboliskās saites nav atbalstītas" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Miskaste nav atbalstīta" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Datņu nosaukums nevar saturēt “%c”" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format -#| msgid "Failed to change to directory “%s” (%s)" msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Neizdevās izveidot pagaidu direktoriju veidnei “%s” — %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "sējums neatbalsta montēšanu" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Neviena lietotne nav reģistrēta, kā šo datni apstrādājoša" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Skaitītājs ir aizvērts" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Datņu skaitītājam ir neizpildīta darbība" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Datņu skaitītājs jau ir aizvērts" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Nevar apstrādāt GFileIcon versijas %d kodējumu" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Slikti formēti GFileIcon ievades dati" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Plūsma neatbalsta query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Uz plūsmas meklēšana netiek atbalstīta" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Uz ievades plūsmas apraušana nav atbalstīta" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Uz plūsmas apraušana nav atbalstīta" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Nepareizs resursdatora nosaukums" @@ -1594,64 +1621,64 @@ msgstr "HTTP starpnieka atbilde ir pārāk liela" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP starpniekserveris negaidīti aizvēra savienojumu." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Nepareizs marķieru skaits (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Nav tips klases nosaukumam %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Tips %s nav realizējis GIcon saskarni" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Tips %s nav klasē" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Slikti formēts versijas numurs — %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Tips %s nerealizē from_tokens() uz GIcon saskarnes" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Nevar apstrādāt piegādāto ikonu kodējumu versiju" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Nav norādītas adreses" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Garums “%u” ir pārāk liels adresēm" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adresei ir biti, kas ir iestatīti pēc prefiksa garuma" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Neizdevās parsēt “%s” kā IP adreses masku" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Nepietiek vietas ligzdas adresei" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Neatbalstīta ligzdas adrese" @@ -1665,7 +1692,7 @@ msgstr "Ievades plūsma neatbalsta lasīšanu" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Plūsmai ir neizpildīta darbība" @@ -1681,7 +1708,7 @@ msgstr "Paturēt ar datni, kad pārvietots" msgid "“version” takes no arguments" msgstr "“version” nepieņem argumentus" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Lietošana:" @@ -1689,79 +1716,79 @@ msgstr "Lietošana:" msgid "Print version information and exit." msgstr "Parādīt informāciju par versiju un iziet." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Komandas:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Savienot datnes uz standarta izvades" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopēt vienu vai vairākas datnes" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Parādīt informāciju par atrašanās vietām" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Palaist lietotni no darbvirsmas datnes" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Uzskaitīt atrašanās vietu saturu" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Iegūt vai iestatīt apdarinātāju priekš mimetype" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Izveidot mapes" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Pārraudzīt datnes un mapes pēc izmaiņām" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Montēt vai atmontēt atrašanās vietas" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Pārvietot vienu vai vairākas datnes" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Atver datnes ar noklusējuma lietotni" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Pārsaukt datni" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Dzēst vienu vai vairākas datnes" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Lasīt no standarta ievades un saglabāt" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Iestatīt datnes atribūtu" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Pārvietot datnes vai mapes uz miskasti" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Uzskaita atrašanās vietu saturu kokā" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Komandas:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Lietojiet %s, lai iegūtu detalizētu palīdzību.\n" @@ -1771,7 +1798,7 @@ msgid "Error writing to stdout" msgstr "Kļūda, rakstot uz stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1795,60 +1822,65 @@ msgstr "" "lietot kaut ko līdzīgu smb://serveris/resurss/datne.txt kā\n" "atrašanās vietu." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Nav dotas atrašanās vietas" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Nav mērķa mapes" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Rādīt progresu" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Uzvedne pirms pārrakstīšanas" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Saglabāt visus atribūtus" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Izveidot rezerves kopijas pastāvošajām mērķa datnēm" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Nekad nesekot simboliskajām saitēm" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Lietot noklusējuma atļaujas mērķim" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +#| msgid "Use default permissions for the destination" +msgid "Use default file modification timestamps for the destination" +msgstr "Lietot noklusējuma datnes modifikācijas laika spiedogu mērķim" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Pārsūtīti %s no %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "AVOTS" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "GALAMĒRĶIS" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopēt vienu vai vairākas datnes no AVOTA uz GALAMĒRĶI." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1859,12 +1891,12 @@ msgstr "" "lietot kaut ko līdzīgu smb://serveris/resurss/datne.txt kā\n" "atrašanās vietu." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Mērķis %s nav mape" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: pārrakstīt “%s”? " @@ -1905,52 +1937,52 @@ msgstr "attēlotais nosaukums: %s\n" msgid "edit name: %s\n" msgstr "rediģēt nosaukumu: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "nosaukums: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tips: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "izmērs: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "paslēpts\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "lokālais ceļš: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix montējums: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Iestatāmie atribūti:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Rakstāmās atribūtu nosaukumu telpas:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Parādīt informāciju par atrašanās vietām." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2353,7 +2385,6 @@ msgid "TYPE" msgstr "TIPS" #: gio/gio-tool-set.c:38 -#| msgid "Set a file attribute" msgid "Unset given attribute" msgstr "Neiestatīt doto atribūtu" @@ -3062,124 +3093,124 @@ msgstr "Kļūda, iegūstot datņu sistēmas informāciju priekš %s — %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Saturošais montējums priekš datnes %s nav atrasts" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Nevar pārsaukt saknes mapi" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Kļūda, pārsaucot datni %s — %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Nevar pārsaukt datni; datnes nosaukums jau eksistē" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Nederīgs datnes nosaukums" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Kļūda, atverot datni %s — %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Kļūda, dzēšot datni %s — %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Kļūda, izmetot miskastē datni %s — %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Nevar izveidot miskastes direktoriju %s — %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nevar atrast augšējā līmeņa mapi, lai izmestu miskastē %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Izmešana uz sistēmas iekšējiem montējumiem nav atbalstīta" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Nevar atrast vai izveidot miskastes direktoriju %s, lai izmestu %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Nevar izveidot miskastē izmešanas informācijas datni priekš %s — %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Nevar izmest miskastē datni %s pāri datņu sistēmas robežām" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nevar izmest miskastē datni %s — %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Nevar izmest miskastē datni %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Kļūda, veidojot mapi %s — %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Datņu sistēma neatbalsta simboliskās saites" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Kļūda, veidojot simbolisko saiti %s — %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Kļūda, pārvietojot datni %s — %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Nevar pārvietot mapi virsū mapei" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Neizdevās izveidot rezerves kopijas datni" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Kļūda, dzēšot mērķa datni — %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Pārvietošana starp montētiem sējumiem nav atbalstīta" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nevarēja noteikt %s diska izmantojumu — %s" @@ -3189,7 +3220,6 @@ msgid "Attribute value must be non-NULL" msgstr "Atribūta vērtībai ir jābūt ne NULL" #: gio/glocalfileinfo.c:772 -#| msgid "Invalid attribute type (string expected)" msgid "Invalid attribute type (string or invalid expected)" msgstr "Nederīgs atribūta tips (tika gaidīts “string” vai “invalid”)" @@ -3202,115 +3232,115 @@ msgstr "Nederīgs paplašinātais atribūta nosaukums" msgid "Error setting extended attribute “%s”: %s" msgstr "Kļūda, iestatot paplašināto atribūtu “%s” — %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (nederīgs kodējums)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Kļūda, saņemot informāciju par datni “%s” — %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Kļūda, saņemot informāciju datnes deskriptoram — %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Nederīgs atribūta tips (tika gaidīts uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Nederīgs atribūta tips (tika gaidīts uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Nederīgs atribūta tips (tika gaidīta baitu virkne)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Nevar iestatīt atļaujas simboliskajām saitēm" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Kļūda, iestatot tiesības — %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Kļūda, iestatot īpašnieku — %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "simboliskajai saitei ir jābūt ne NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Kļūda, iestatot simbolisko saiti — %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Kļūda, iestatot simbolisko saiti — datne nav simboliskā saite" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Papildu nanosekundes %d UNIX laika spiedogiem %lld ir negatīvas" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Papildu nanosekundes %d UNIX laika spiedogiem %lld sasniedza 1 sekundi" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX laika spiedogs %lld neiekļāvās 64 bitos" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX laika spiedogs %lld ir ārpus apgabala, ko atbalsta Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Datnes nosaukumu “%s” nevar pārveidot uz UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Datni “%s” nevar atvērt, Windows kļūda %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Kļūda, iestatot izmaiņu vai piekļuves laiku datnei “%s” — %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Kļūda, iestatot izmaiņu vai piekļuves laiku — %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux kontekstam ir jābūt ne NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux nav ieslēgts uz šīs sistēmas" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Kļūda, iestatot SELinux kontekstu — %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "%s atribūta iestatīšana nav atbalstīta" @@ -3363,7 +3393,7 @@ msgid "Error truncating file: %s" msgstr "Kļūda, apraujot datni — %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Kļūda, atverot datni “%s” — %s" @@ -3385,27 +3415,27 @@ msgstr "Datne tika mainīta no ārpuses" msgid "Error removing old file: %s" msgstr "Kļūda, dzēšot veco datni — %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Piegādāts nederīgs GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Nederīgs meklēšanas pieprasījums" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Nevar apraut GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Atmiņas izvades plūsmai nav maināms izmērs" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Neizdevās mainīt atmiņas izvades plūsmas izmēru" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3413,32 +3443,32 @@ msgstr "" "Atmiņas apjoms, kas nepieciešams, lai apstrādātu rakstīšanu, ir lielāks nekā " "pieejamā atmiņas telpa" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Pieprasītā meklēšana ir pirms plūsmas sākuma" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Pieprasītā meklēšana ir pēc plūsmas beigām" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "montējums neatbalsta “unmount” (atmontēšanu)" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "montējums neatbalsta “eject” (izgrūšanu)" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "montējums neatbalsta “unmount” (atmontēšanu) vai “unmount_with_operation”" @@ -3446,41 +3476,41 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "montējums neatbalsta “eject” (izgrūšanu) vai “eject_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "montējums neatbalsta “remount” (atkārtotu montēšanu)" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "montējums neatbalsta satura tipa minēšanu" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "montējums neatbalsta sinhrono satura tipa minēšanu" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Datora nosaukums “%s” satur “[” bet ne “]”" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Tīkls nav sasniedzams" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Dators nav sasniedzams" @@ -3508,7 +3538,7 @@ msgstr "NetworkManager nav palaists" msgid "NetworkManager version too old" msgstr "NetworkManager versija ir pārāk veca" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Izvades plūsma neatbalsta rakstīšanu" @@ -3521,38 +3551,38 @@ msgstr "Uz %s padoto vektoru summa ir pārāk liela" msgid "Source stream is already closed" msgstr "Avota plūsma jau ir aizvērta" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Nespecifiska starpnieka uzmeklēšanas kļūme" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Kļūda, sameklējot “%s” — %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s nav realizēts" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Nederīgs domēns" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Resurss pie “%s” neeksistē" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Resursam pie “%s” neizdevās atspiesties" @@ -3570,11 +3600,11 @@ msgstr "Resurss pie “%s” nav mape" msgid "Input stream doesn’t implement seek" msgstr "Ievades plūsma neatbalsta meklēšanu" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Uzskaitīt sadaļas, kas satur resursus elf DATNĒ" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3584,15 +3614,15 @@ msgstr "" "Ja ir norādīta SADAĻA, uzskaitīt resursus šajā sadaļā\n" "Ja ir norādīts CEĻŠ, uzskaitīt tikai atbilstošus resursus" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "DATNE [CEĻŠ]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SADAĻA" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3604,15 +3634,15 @@ msgstr "" "Ja ir norādīts CEĻŠ, uzskaitīt tikai atbilstošus resursus\n" "Informācija iekļauj sadaļu, izmēru un saspiešanu" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Izvilkt resursu datni uz stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "DATNE CEĻŠ" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3640,7 +3670,7 @@ msgstr "" "Lietojiet “gresource help KOMANDA”, lai saņemtu detalizētu palīdzību.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3655,19 +3685,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SADAĻA (Neobligāts) elf sadaļas nosaukums\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMANDA (neobligāta) komanda, ko izskaidrot\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " DATNE elf datne (bināra datne vai koplietota bibliotēka)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3675,19 +3705,19 @@ msgstr "" " DATNE elf datne (bināra datne vai koplietota bibliotēka)\n" " vai saspiests resursu datne\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[CEĻŠ]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " CEĻŠ (Neobligāts) resursa ceļš (var būt daļējs)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "CEĻŠ" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " CEĻŠ Resursa ceļš\n" @@ -3918,213 +3948,213 @@ msgstr "Dots tukšs shēmas nosaukums\n" msgid "No such key “%s”\n" msgstr "Nav tādas atslēgas “%s”\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Nederīga ligzda, nav inicializēta" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Nederīga ligzda, inicializācija neizdevās, jo — %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Ligzda jau ir aizvērta" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Ligzdai I/O iestājās noildze" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "izveido GSocket no fd — %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Nevarēja izveidot ligzdu — %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Tika norādīta nezināma saime" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Tika norādīts nezināms protokols" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Nevar izmantot datagrammu operācijas ar ne-datagrammu ligzdu." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Nevar izmantot datagrammu operācijas ar ligzdu, kurai ir noildze." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "nevarēja iegūt lokālo adresi — %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "nevarēja iegūt attālināto adresi — %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "nevar klausīties — %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Kļūda, sasaistoties ar adresi %s — %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Kļūda, pievienojoties multiraides grupai — %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Kļūda, pametot multiraides grupu — %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Nav atbalsta avotam specifiskām multiraidēm" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Neatbalstīta ligzdu saime" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "Avotam specifisks nav IPv4 adrese" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Saskarnes nosaukums ir pārāk garš" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Saskarne nav atrasta: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Nav atbalsta IPv4 avotam specifiskām multiraidēm" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Nav atbalsta IPv6 avotam specifiskām multiraidēm" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Kļūda, pieņemot savienojumu — %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Notiek savienošanās" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Nevar saņemt izpildes gaidīšanas kļūdu:" -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Kļūda, saņemot datus — %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Kļūda, sūtot datus — %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Neizdevās izslēgt ligzdu — %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Kļūda, aizverot ligzdu — %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Gaida ligzdas nosacījumu — %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Nevar nosūtīt ziņojumu — %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Ziņojumu vektors ir pārāk liels" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Kļūda, sūtot ziņojumu — %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage nav atbalstīts uz Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Kļūda, saņemot ziņojumu — %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nevar nolasīt ligzdas datus — %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials nav implementēts šai OS" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Nevarēja savienoties ar starpniekserveri %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Nevarēja savienoties ar %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Nevarēja savienoties:" -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Starpnieka mēģināšana caur ne-TCP savienojumu nav atbalstīta." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Starpnieka protokols “%s” nav atbalstīts." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Klausītājs jau ir aizvērts" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Pievienotā ligzda ir aizvērta" @@ -4215,97 +4245,94 @@ msgstr "SOCKSv5 starpnieks neatbalsta doto adreses tipu." msgid "Unknown SOCKSv5 proxy error." msgstr "Nezināma SOCKSv5 starpnieka kļūda." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Nevarēja izveidot programkanālu komunikācijai ar bērnprocesu (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format -#| msgid "Seek not supported on stream" msgid "Pipes are not supported in this platform" msgstr "Uz šīs platformas koveijeri nav atbalstīti" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Nevar apstrādāt GThemedIcon versijas %d kodējumu" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Netika atrasta neviena derīga adrese" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Kļūda, apgriezti sameklējot “%s” — %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Kļūda, parsējot DNS %s ierakstu — slikti noformēta DNS pakete" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Nav DNS ierakstu “%s” pieprasītajam tipam" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Pagaidām nevar sameklēt “%s”" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Kļūda, sameklējot “%s”" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Slikti noformēta DNS pakete" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format -#| msgid "Failed to read from file “%s”: %s" msgid "Failed to parse DNS response for “%s”: " msgstr "Neizdevās parsēt “%s” DNS atbildi:" -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Nav atrasts PEM iekodēta privāta atslēga" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Nevarēja atšifrēt PEM-iekodētu privāto atslēgu" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Nevarēja parsēt PEM-iekodētu privāto atslēgu" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Nav atrasts PEM-iekodēts sertifikāts" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Nevarēja parsēt PEM-iekodētu sertifikātu" -#: gio/gtlscertificate.c:800 -#| msgid "This GTlsBackend does not support creating PKCS #11 certificates" +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Pašreizējā TLS aizmugure neatbalsta PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Šis GTlsBackend neatbalsta PKCS #11 sertifikātu izveidošanu" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4314,7 +4341,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4322,16 +4349,15 @@ msgstr "" "Vairākas ievadītās paroles ir bijušas nepareizas, un jūs tiksiet izslēgts " "pēc turpmākām neveiksmēm." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Ievadītā parole ir nepareiza." -#: gio/gunixconnection.c:127 -#| msgid "Setting attribute %s not supported" +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "FD sūtīšana nav atbalstīta" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4339,11 +4365,11 @@ msgstr[0] "Gaidīja 1 kontroles ziņojumu, saņēma %d" msgstr[1] "Gaidīja 1 kontroles ziņojumu, saņēma %d" msgstr[2] "Gaidīja 1 kontroles ziņojumu, saņēma %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Negaidīts palīgdatu tips" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4351,112 +4377,122 @@ msgstr[0] "Gaidīja vienu fd, bet saņēma %d\n" msgstr[1] "Gaidīja vienu fd, bet saņēma %d\n" msgstr[2] "Gaidīja vienu fd, bet saņēma %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Saņemts nederīgs fd" -#: gio/gunixconnection.c:242 -#| msgid "Setting attribute %s not supported" +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "FD saņemšana nav atbalstīta" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Kļūda, sūtot rekvizītus: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Kļūda, pārbaudot, vai SO_PASSCRED ir aktivēts ligzdai — %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Kļūda, aktivējot SO_PASSCRED — %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Tikai gaidīts saņemt vienu baitu, lai saņemtu rekvizītus, bet nolasīja nulle " "baitu" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Negaida kontroles ziņojumu, bet saņēma %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Kļūda, deaktivējot SO_PASSCRED — %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Kļūda, nolasot datnes deskriptoru — %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Kļūda, aizverot datnes deskriptoru — %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Datņu sistēmas sakne" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Kļūda, rakstot datnes deskriptorā — %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstraktas UNIX domēna ligzdas uz šīs sistēmas nav atbalstītas" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "sējums neatbalsta izgrūšanu" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "sējums neatbalsta izgrūšanu vai eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Lietotnei “%s” lietotnes objektā nav verbu" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "Lietotnei “%s” un apdarinātājam “%s” lietotnes objektā nav verbu" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Kļūda, lasot no tura — %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Kļūda, aizverot turi — %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Kļūda, rakstot turī — %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Nepietiek atmiņas" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Iekšēja kļūda — %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Vajag vairāk ievades" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Nederīgi saspiestie dati" @@ -4484,148 +4520,148 @@ msgstr "Palaist dbus servisu" msgid "Wrong args\n" msgstr "Nepareizi parametri\n" -#: glib/gbookmarkfile.c:861 +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Negaidīts atribūts “%s” elementam “%s”" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atribūts “%s” elementam “%s” netika atrasts" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Negaidīta birka “%s”, tika gaidīt birka “%s”" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Negaidīta birka “%s” iekš “%s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Nederīgs datums/laiks “%s” grāmatzīmes datnē" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Nav atrasts derīga grāmatzīmes datne datu mapēs" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Grāmatzīme ar URI “%s” jau eksistē" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nav atrasta grāmatzīme URI “%s”" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Nav definēts MIME tips grāmatzīmē URI “%s”" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Nav definēti privātie karogi grāmatzīmēs URI “%s”" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Nav iestatītas grupas grāmatzīmēs URI “%s”" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Neviena lietotne ar nosaukumu “%s” nav reģistrējusi “%s” grāmatzīmi" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Neizdevās izvērst exec rindu “%s” ar URI “%s”" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Neattēlojama rakstzīme konversijas ievadē" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Daļēja simbolu secība ievades beigās" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Nevar pārveidot atkāpšanos “%s” uz rakstzīmju kopu “%s”" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Iegults NUL baits konversijas ievadē" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Iegults NUL baits konversijas izvadē" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "URI “%s” nav absolūtais URI, lietojot “file” shēmu" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI “%s” nav pareizs" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Resursdatora nosaukuma URI “%s” nav pareizs" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI “%s” satur nepareizi veidotas atsoļa rakstzīmes" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Ceļa nosaukums “%s” nav absolūts ceļš" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%A, %Y. gada %e. %B, plkst. %H un %M" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%Y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4646,62 +4682,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Janvāris" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Februāris" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Marts" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Aprīlis" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Maijs" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Jūnijs" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Jūlijs" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Augusts" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Septembris" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Oktobris" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Novembris" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Decembris" @@ -4723,132 +4759,132 @@ msgstr "Decembris" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Mai" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jūn" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Jūl" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Aug" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Oct" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Pirmdiena" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Otrdiena" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Trešdiena" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Ceturdiena" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Piektdiena" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Sestdiena" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Svētdiena" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Pr" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Ot" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Tr" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Ct" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Pk" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Se" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Sv" @@ -4870,62 +4906,62 @@ msgstr "Sv" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "janvāris" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "februāris" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "marts" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "aprīlis" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "maijs" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "jūnijs" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "jūlijs" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "augusts" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "septembris" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "oktobris" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "novembris" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "decembris" @@ -4947,191 +4983,197 @@ msgstr "decembris" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "janv." -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "febr." -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "marts" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "apr." -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "maijs" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "jūn." -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "jūl." -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "aug." -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "sept." -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "okt." -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "nov." -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "dec." #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Kļūda, atverot direktoriju “%s” — %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Nevarēja piešķirt %lu baitu, lai nolasītu datni “%s”" -msgstr[1] "Nevarēja atrast %lu baitus, lai nolasītu datni “%s”" -msgstr[2] "Nevarēja atrast %lu baitus, lai nolasītu datni “%s”" +#: glib/gfileutils.c:716 glib/gfileutils.c:820 +#| msgid "Could not connect: " +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Nevarēja piešķirt %" +msgstr[1] "Nevarēja piešķirt %" +msgstr[2] "Nevarēja piešķirt %" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:733 #, c-format msgid "Error reading file “%s”: %s" msgstr "Kļūda, nolasot datni “%s” — %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:769 glib/gfileutils.c:803 #, c-format msgid "File “%s” is too large" msgstr "Datne “%s” ir pārāk liela" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:845 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Neizdevās nolasīt no datnes “%s” — %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:895 glib/gfileutils.c:970 glib/gfileutils.c:1477 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Neizdevās atvērt datni “%s” — %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:908 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Neizdevās dabūt datnes “%s” atribūtus — fstat() neizdevās — %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:939 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Neizdevās atvērt “%s” — fdopen() neizdevās — %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1040 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Neizdevās pārsaukt datni “%s” uz “%s” — g_rename() neizdevās — %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1139 +#, c-format +#| msgid "Failed to write file “%s”: write() failed: %s" +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Neizdevās rakstīt datnē “%s” — ftruncate() neizdevās — %s" + +#: glib/gfileutils.c:1184 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Neizdevās rakstīt datnē “%s” — write() neizdevās — %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1205 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Neizdevās rakstīt datnē “%s” — fsync() neizdevās — %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1366 glib/gfileutils.c:1783 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Neizdevās izveidot datni “%s” — %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1411 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Nevarēja izdzēst esošo datni “%s” — g_unlink() neizdevās — %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1748 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Veidne “%s” ir nepareiza, nedrīkstētu saturēt “%s”" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1761 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Veidne “%s” nesatur XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2355 glib/gfileutils.c:2384 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Neizdevās nolasīt simbolisko saiti “%s” — %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Nevarēja atvērt pārveidotāju no “%s” uz “%s” — %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Neizdevās izpildīt jēllasīšanu iekš g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Pāpalikušie nepārveidotie dati nolasīšanas buferī" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanāls pārtrūkst daļējā rakstzīmē" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Neizdevās izpildīt jēllasīšanu iekš g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Meklēšanas mapēs nevarēja atrast derīgu atslēgu" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Nav parasta datne" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5139,51 +5181,50 @@ msgstr "" "Atslēgu datne satur rindu “%s”, kura nav atslēgas vērtības pāris, grupa vai " "komentārs" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Nederīgs grupas nosaukums — %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Atslēgu datne nesākas ar grupu" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format -#| msgid "Invalid key name: %s" msgid "Invalid key name: %.*s" msgstr "Nederīgs atslēgas nosaukums — %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Atslēgu datne satur neatbalstītu kodējumu “%s”" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Atslēgu datnei nav grupa “%s”" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Atslēgu datnei nav atslēgas “%s” grupā “%s”" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Atslēgu datne satur atslēgu “%s” ar vērtību “%s” kas nav UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Atslēgu datne satur atslēgu “%s”. kurai ir vērtība, kuru nevar interpretēt." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5192,36 +5233,36 @@ msgstr "" "Atslēgu datne satur atslēgu “%s” grupā “%s” kurai ir vērtība, ko nevar " "interpretēt." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Atslēgai “%s” grupā “%s” ir vērtība “%s”, kur bija jābūt %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Atslēgu datne satur atsoļa rakstzīme rindas beigās" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Atslēgu datne satur nederīgu atsoļa sekvenci “%s”" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Vērtību “%s” nevar interpretēt kā skaitli." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Veselā skaitļa “%s” vērtība ir ārpus apgabala" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Vērtību “%s” nevar interpretēt kā peldošo komatu." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Vērtību “%s” nevar interpretēt kā Būla vērtību." @@ -5241,32 +5282,32 @@ msgstr "Neizdevās kartēt %s%s%s%s — mmap() neizdevās — %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Neizdevās atvērt datni “%s” — open() neizdevās — %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Kļūda rindā %d rakstzīme %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Nepareizi kodēts UTF-8 teksts — nav derīgs “%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” nav derīgs nosaukums" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” nav derīgs nosaukums — “%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Kļūda rindā %d — %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5275,7 +5316,7 @@ msgstr "" "Neizdevās apstrādāt “%-.*s”, kur vajadzētu būt ciparam rakstzīmes atsaucē " "(piemēram, ê) — iespējams, ka cipars ir pārāk liels" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5284,24 +5325,24 @@ msgstr "" "Rakstzīmes atsauce nebeidzās ar semikolu; visdrīzāk jūs lietojāt & zīmi bez " "nodoma sākt entītiju — aizvieto “&” zīmes ar &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Rakstzīmes atsauce “%-.*s” neiekodē atļautu rakstzīmi" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Pamanīta tukša entītija “&;”; derīgas entītijas ir: & " < > " "'" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Entītijas nosaukums “%-.*s” nav zināms" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5309,11 +5350,11 @@ msgstr "" "Entītija nebeidzās ar semikolu; visdrīzāk jūs lietojāt “&” zīmi bez nodoma " "sākt entītiju — aizvieto “&” zīmes ar &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumentam jāsākas ar elementu (piemēram, )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5322,7 +5363,7 @@ msgstr "" "“%s” nav atļauta rakstzīme, sekojoša aiz rakstzīmes “<” tā nedrīkst iesākt " "elementa vārdu." -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5331,19 +5372,19 @@ msgstr "" "Savāda rakstzīme “%s”. Tika gaidīta “>” rakstzīme, kas nobeigtu sākuma birku " "elementam “%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Pārāk daudz atribūtu elementā “%s”" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "Savāda rakstzīme “%s”, gaidīju “=” aiz atribūta nosaukuma “%s” elementam “%s”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5354,7 +5395,7 @@ msgstr "" "sākuma birku elementam “%s” vai fakultatīvi atribūtu; iespējams, jūs " "lietojāt nepareizu rakstzīmi atribūta nosaukumā" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5363,7 +5404,7 @@ msgstr "" "Savāda rakstzīme “%s”, tika gaidītas atvērtās pēdiņas pēc vienādības zīme, " "nosakot vērtību atribūtam “%s” no elementa “%s”" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Elements “%s” tika aizvērts, neviens elements pašlaik nav atvērts" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Elements “%s” tika aizvērts, bet pašlaik atvērtais elements ir “%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokuments bija tukšs vai saturēja tikai tukšu atstarpi" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokuments negaidīti izbeidzās tieši pēc atvērtās leņķa iekavas “<”" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5408,7 +5449,7 @@ msgstr "" "Dokuments negaidīti izbeidzās ar joprojām atvērtiem elementiem — “%s” bija " "pēdējais atvērtais elements" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5417,19 +5458,19 @@ msgstr "" "Dokuments negaidīti izbeidzās, gaidīja ieraudzīt aizverošo leņķa iekavu, " "beidzoties ar tagu <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokuments negaidīti izbeidzās elementa nosaukumā" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokuments negaidīti izbeidzās atribūta nosaukumā" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokuments negaidīti izbeidzās elementa atverošajā birkā." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5437,257 +5478,257 @@ msgstr "" "Dokuments negaidīti beidzās aiz vienādības zīmes, sekojot atribūta " "nosaukumam; nav atribūta vērtības" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokuments negaidīti beidzās kamēr atradās atribūta vērtībā" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokuments negaidīti beidzās elementa “%s” aizverošajā birkā" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Dokuments negaidīti beidzās aizverošajā birkā neatvērtam elementam" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Dokuments negaidīti izbeidzās komentārā vai apstrādes instrukcijā" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[OPCIJA…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Palīdzības opcijas:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Rādīt palīdzības opcijas" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Rādīt visas palīdzības opcijas" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Lietotnes opcijas:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Opcijas:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nevar apstrādāt veselā skaitļa vērtību “%s” priekš %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Veselā skaitļa vērtība “%s” priekš %s ir ārpus apgabala" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Nevar apstrādāt dubulto vērtību “%s” priekš %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Dubultā vērtība “%s” priekš %s ir ārpus apgabala" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Kļūda, parsējot opciju %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Trūkst %s arguments" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Nezināma opcija %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "bojāts objekts" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "beigusies atmiņa" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "iekšēja kļūda" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "raksts satur elementus, kurus neatbalsta daļējā atbilstība" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "atpakaļ atsauces kā nosacījumus neatbalsta daļējā atbilstība" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "rekursiju limits ir sasniegts" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "slikta nobīde" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekursijas cikls" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "tika pieprasīts atbilsmes režīms, kas nav nokompilēts JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "nezināma kļūda" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ raksta beigās" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c raksta beigās" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "pēc \\ seko neatpazīta rakstzīme" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "skaitļi nav pareizā secībā {} kvantorā" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "skaitlis pārāk liels {} kvantorā" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "trūkst beigu “]” rakstzīmju klasei" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "nederīga atsoļu sekvence rakstzīmju klasē" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "rakstzīmju klasē apgabals ir ārpus secības" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "nav ko atkārtot" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "neatpazīta rakstzīme pēc (? vai (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX nosauktās klases ir atbalstītas tikai klasēs" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX savāktie elementi nav atbalstīti" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "trūkst beigu )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "atsauce uz neesošu apakšrakstu" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "trūkst ) pēc komentāra" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "regulārā izteiksme ir pārāk gara" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "slikti formatēts skaitlis vai nosaukums pēc (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind pieņēmums nav fiksēta garuma" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "nosacījuma grupa satur vairāk kā divus zarus" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "pēc (?( tiek sagaidīts pieņēmums" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "skaitliska atsauce nevar būt nulle" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "nezināms POSIX klases nosaukums" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "rakstzīmes vērtība \\x{...} sekvencē ir pārāk liela" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C nav atļauts lookbehind pieņēmumā" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "trūkst nobeiguma apakšraksta nosaukumā" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "divi nosaukti apakšraksti ir ar vienādiem nosaukumiem" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "slikti formatēta \\P vai \\p sekvence" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "nezināms īpašības nosaukums pēc \\P vai \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "apakšraksta nosaukums ir pārāk liels (maksimums ir 32 rakstzīmes)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "pārāk daudz nosauktu apakšrakstu (maksimums ir 10 000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "astotnieku vērtība ir lielāka nekā \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE grupa satur vairāk kā vienu zaru" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "nekonsekventas NEWLINE opcijas" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5695,235 +5736,231 @@ msgstr "" "pēc \\g neseko nosaukums iekavās, leņķa iekavās vai pēdiņās vai vienkāršs " "skaitlis" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "arguments nav atļauts priekš (*ACCEPT), (*FAIL) vai (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) nav atpazīts" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "skaitlis ir pārāk liels" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "trūkst apakšraksta nosaukums pēc (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "dažādi nosaukumi apakšrakstiem ir ar vienādiem numuriem nav atļauti" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) jābūt ar argumentu" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c jāseko ASCII rakstzīmei" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "pēc \\k neseko nosaukums iekavās, leņķa iekavās vai pēdiņās" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N nav atbalstīts klasē" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "nosaukums ir pārāk garš iekš (*MARK), (*PRUNE), (*SKIP) vai (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "koda pārpilde" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "neatpazīta rakstzīme pēc (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "pārtērēta kompilēšanas darba telpa" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "iepriekš pārbaudīts norādītais apakšraksts nav atrasts" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Kļūda, kamēr meklē atbilstības regulārajai izteiksmei %s — %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE bibliotēka ir kompilēta bez UTF8 atbalsta" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE bibliotēka ir kompilēta ar UTF8 īpašību atbalstu" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format -#| msgid "Error while compiling regular expression %s at char %d: %s" msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Kļūda, kompilējot regulāro izteiksmi “%s” pie rakstzīmes %s — %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "tika gaidīts heksadecimālais cipars vai “}”" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "tika gaidīts heksadecimālais cipars" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "simboliskajā norādē trūkst “<”" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "nepabeigta simboliskā norāde" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "simboliskās norādes garums ir nulle" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "tika gaidīts cipars" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "neatļauta simboliskā norāde" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "noklīdis beigu “\\”" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "nezināma atsoļa sekvence" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Kļūda, apstrādājot aizvietošanas tekstu “%s” pie rakstzīmes %lu — %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Citētais teksts nesākas ar jautājuma zīmi" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Neatbilstoša jautājuma zīme komandrindā vai citā čaulas-citētā tekstā" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Teksts beidzās tieši pēc “\\” rakstzīmes. (Teksts bija “%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Teksts beidzās pirms atbilstošais citāts tika atrasts priekš %c. (Teksts " "bija “%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Teksts bija tukšs (vai saturēja tikai tukšumus)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nevarēja nolasīt datus no bērnprocesa (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Negaidīta kļūda, lasot datus no bērnprocesa (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Negaidīta kļūda waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Bērnprocess beidza darbu ar kodu %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Bērnprocess tika pārtraukts ar signālu %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Bērnprocess tika apturēts ar signālu %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Bērnprocess beidza darbu nenormāli" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Neizdevās nolasīt no bērna programkanāla (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Neizdevās radīt bērnprocesu “%s” (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Neizdevās sadalīt (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Neizdevās pāriet uz direktoriju “%s” (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Neizdevās izpildīt bērnprocesu “%s” (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format -#| msgid "Failed to open file “%s”: open() failed: %s" msgid "Failed to open file to remap file descriptor (%s)" msgstr "Neizdevās atvērt datni, lai pārkartētu datnes deskriptoru (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format -#| msgid "Failed to redirect output or input of child process (%s)" msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Neizdevās dublēt datnes deskriptoru bērnprocesam (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Neizdevās sazarot bērnprocesu (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format -#| msgid "Failed to read data from child process (%s)" msgid "Failed to close file descriptor for child process (%s)" msgstr "Neizdevās aizvērt datnes deskriptoru bērnprocesam (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Nezināma kļūda, izpildot bērnprocesu “%s”" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5931,7 +5968,6 @@ msgstr "" #: glib/gspawn-private.h:134 #, c-format -#| msgid "Invalid seek request" msgid "Invalid source FDs argument" msgstr "Nederīgs avots datņu deskriptora argumentam" @@ -5946,7 +5982,6 @@ msgstr "Neizdevās izpildīt bērnprocesu (%s)" #: glib/gspawn-win32.c:519 #, c-format -#| msgid "Failed to fork child process (%s)" msgid "Failed to dup() in child process (%s)" msgstr "Neizdevās dup() bērnprocesā (%s)" @@ -5982,78 +6017,78 @@ msgid "" msgstr "" "Negaidīta kļūda iekš g_io_channel_win32_poll(), lasot datus no bērnprocesa" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Tukša virkne nav skaitlis" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s” nav skaitlis ar zīmi" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Skaitlis “%s” ir ārpus robežām [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s” nav skaitlis bez zīmes" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Nederīgs %-kodējums iekš URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Neatļauta rakstzīme iekš URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Ne-UTF-8 rakstzīmes iekš URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Nederīga IPv6 adrese “%.*s” iekš URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Nepareizi iekodēta IP adrese “%.*s” iekš URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Nepareizi internacionalizēts resursdatora nosaukums “%.*s” iekš URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Nevarēja parsēt portu “%.*s” iekš URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URI ports “%.*s” ir ārpus apgabala" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI “%s” nav absolūts URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI “%s” nav resursdatora komponentes" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI nav absolūts un netika dots bāzes URI" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Trūkst “=” un parametra vērtības" @@ -6134,69 +6169,67 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 -#| msgid "%u byte" -#| msgid_plural "%u bytes" msgid "byte" msgid_plural "bytes" msgstr[0] "baits" @@ -6204,8 +6237,6 @@ msgstr[1] "baiti" msgstr[2] "baitu" #: glib/gutils.c:3060 -#| msgid "%u bit" -#| msgid_plural "%u bits" msgid "bit" msgid_plural "bits" msgstr[0] "bits" @@ -6232,7 +6263,6 @@ msgstr "%u %s" #. * be part of "13.0 MB", but only the number is requested this time. #: glib/gutils.c:3109 #, c-format -#| msgid "%.1f KB" msgctxt "format-size" msgid "%.1f" msgstr "%.1f" @@ -6242,7 +6272,6 @@ msgstr "%.1f" #. * the unit symbol. An example: "13.0 MB" #: glib/gutils.c:3115 #, c-format -#| msgid "%.1f kB" msgctxt "format-size" msgid "%.1f %s" msgstr "%.1f %s" @@ -6308,6 +6337,55 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN ziņojums — trūkst vai nav derīga REPLY_SERIAL galvenes lauks" + +#, c-format +#~ msgid "Could not allocate %lu byte to read file “%s”" +#~ msgid_plural "Could not allocate %lu bytes to read file “%s”" +#~ msgstr[0] "Nevarēja piešķirt %lu baitu, lai nolasītu datni “%s”" +#~ msgstr[1] "Nevarēja atrast %lu baitus, lai nolasītu datni “%s”" +#~ msgstr[2] "Nevarēja atrast %lu baitus, lai nolasītu datni “%s”" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "GApplication options" #~ msgstr "GApplication opcijas" @@ -6501,3 +6579,4 @@ msgstr "%.1f EB" #~ msgid "doing nothing.\n" #~ msgstr "neko nedarīt.\n" + diff --git a/po/nb.po b/po/nb.po index e448ca7..b67158f 100644 --- a/po/nb.po +++ b/po/nb.po @@ -7,138 +7,177 @@ msgid "" msgstr "" "Project-Id-Version: glib 2.59.x\n" -"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=glib&keywords=I18N+L10N&component=general\n" -"POT-Creation-Date: 2017-11-06 12:56+0000\n" -"PO-Revision-Date: 2018-10-07 11:10+0200\n" -"Last-Translator: Kjartan Maraas \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-03 15:40+0100\n" +"Last-Translator: Brage \n" "Language-Team: Norwegian bokmål \n" "Language: nb\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.2\n" -#: ../gio/gapplication.c:490 -msgid "GApplication options" -msgstr "Flagg for GApplication" +#: gio/gappinfo.c:339 +#, fuzzy +#| msgid "Setting attribute %s not supported" +msgid "Setting default applications not supported yet" +msgstr "Støtter ikke å sette attributt %s" -#: ../gio/gapplication.c:490 +#: gio/gappinfo.c:372 +#, fuzzy +#| msgid "Setting attribute %s not supported" +msgid "Setting application as last used for type not supported yet" +msgstr "Støtter ikke å sette attributt %s" + +#: gio/gappinfo.c:814 +#, fuzzy, c-format +#| msgid "No default applications for “%s”\n" +msgid "Failed to find default application for content type ‘%s’" +msgstr "Ingen forvalgte programmer for «%s»\n" + +#: gio/gappinfo.c:874 +#, fuzzy, c-format +#| msgid "No default applications for “%s”\n" +msgid "Failed to find default application for URI Scheme ‘%s’" +msgstr "Ingen forvalgte programmer for «%s»\n" + +#: gio/gapplication.c:507 +#, fuzzy +#| msgid "Application Options:" +msgid "GApplication Options:" +msgstr "Flagg for applikasjonen" + +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Vis flagg for GApplication" -#: ../gio/gapplication.c:535 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Oppgi tjenestemodus for GApplication (bruk fra D-Bus tjenestefiler)" -#: ../gio/gapplication.c:547 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Overstyr programmets ID" -#: ../gio/gapplication-tool.c:45 ../gio/gapplication-tool.c:46 -#: ../gio/gio-tool.c:227 ../gio/gresource-tool.c:488 -#: ../gio/gsettings-tool.c:522 +#: gio/gapplication.c:575 +#, fuzzy +#| msgid "List applications" +msgid "Print the application version" +msgstr "Vis programmer" + +#: gio/gapplication.c:587 +msgid "Replace the running instance" +msgstr "" + +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Skriv ut hjelp" -#: ../gio/gapplication-tool.c:47 ../gio/gresource-tool.c:489 -#: ../gio/gresource-tool.c:557 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMMANDO]" -#: ../gio/gapplication-tool.c:49 ../gio/gio-tool.c:228 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Skriv ut versjon" -#: ../gio/gapplication-tool.c:50 ../gio/gsettings-tool.c:528 +#: gio/gapplication-tool.c:52 gio/gsettings-tool.c:592 msgid "Print version information and exit" msgstr "Skriv versjonsinformasjon og avslutt" -#: ../gio/gapplication-tool.c:52 +#: gio/gapplication-tool.c:55 msgid "List applications" msgstr "Vis programmer" -#: ../gio/gapplication-tool.c:53 +#: gio/gapplication-tool.c:56 msgid "List the installed D-Bus activatable applications (by .desktop files)" msgstr "" "Vis installerte programmer som kan aktiveres via D-Bus (på .desktop-filer)" -#: ../gio/gapplication-tool.c:55 +#: gio/gapplication-tool.c:59 msgid "Launch an application" msgstr "Start et program" -#: ../gio/gapplication-tool.c:56 +#: gio/gapplication-tool.c:60 msgid "Launch the application (with optional files to open)" msgstr "Start programmet (med valgfrie filer som skal åpnes)" -#: ../gio/gapplication-tool.c:57 +#: gio/gapplication-tool.c:61 msgid "APPID [FILE…]" msgstr "PROGID [FIL …]" -#: ../gio/gapplication-tool.c:59 +#: gio/gapplication-tool.c:63 msgid "Activate an action" msgstr "Aktiver en handling" -#: ../gio/gapplication-tool.c:60 +#: gio/gapplication-tool.c:64 msgid "Invoke an action on the application" msgstr "Utfør en handling på programmet" -#: ../gio/gapplication-tool.c:61 +#: gio/gapplication-tool.c:65 msgid "APPID ACTION [PARAMETER]" msgstr "PROGID HANDLING [PARAMETER]" -#: ../gio/gapplication-tool.c:63 +#: gio/gapplication-tool.c:67 msgid "List available actions" msgstr "Vis tilgjengelige handlinger" -#: ../gio/gapplication-tool.c:64 +#: gio/gapplication-tool.c:68 msgid "List static actions for an application (from .desktop file)" msgstr "Vis statiske handlinger for et program (fra .desktop-fil)" -#: ../gio/gapplication-tool.c:65 ../gio/gapplication-tool.c:71 +#: gio/gapplication-tool.c:69 gio/gapplication-tool.c:75 msgid "APPID" msgstr "PROGID" -#: ../gio/gapplication-tool.c:70 ../gio/gapplication-tool.c:133 -#: ../gio/gdbus-tool.c:90 ../gio/gio-tool.c:224 +#: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "KOMMANDO" -#: ../gio/gapplication-tool.c:70 +#: gio/gapplication-tool.c:74 msgid "The command to print detailed help for" msgstr "Vis detaljert hjelp for denne kommandoen" -#: ../gio/gapplication-tool.c:71 +#: gio/gapplication-tool.c:75 msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Programidentifikator i D-Bus-format (f.eks. org.example.viewer)" -#: ../gio/gapplication-tool.c:72 ../gio/glib-compile-resources.c:665 -#: ../gio/glib-compile-resources.c:671 ../gio/glib-compile-resources.c:698 -#: ../gio/gresource-tool.c:495 ../gio/gresource-tool.c:561 +#. Translators: commandline placeholder +#: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 +#: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FIL" -#: ../gio/gapplication-tool.c:72 +#: gio/gapplication-tool.c:76 msgid "Optional relative or absolute filenames, or URIs to open" msgstr "Valgfrie relative eller absolutte filnavn eller URIer som skal åpnes" -#: ../gio/gapplication-tool.c:73 +#: gio/gapplication-tool.c:77 msgid "ACTION" msgstr "HANDLING" -#: ../gio/gapplication-tool.c:73 +#: gio/gapplication-tool.c:77 msgid "The action name to invoke" msgstr "Handling som skal utføres" -#: ../gio/gapplication-tool.c:74 +#: gio/gapplication-tool.c:78 msgid "PARAMETER" msgstr "PARAMETER" -#: ../gio/gapplication-tool.c:74 +#: gio/gapplication-tool.c:78 msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Valgfri parameter til utførelse av handling, i GVariant-format" -#: ../gio/gapplication-tool.c:96 ../gio/gresource-tool.c:526 -#: ../gio/gsettings-tool.c:614 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 +#: gio/gsettings-tool.c:678 #, c-format msgid "" "Unknown command %s\n" @@ -147,26 +186,26 @@ msgstr "" "Ukjent kommando «%s»\n" "\n" -#: ../gio/gapplication-tool.c:101 +#: gio/gapplication-tool.c:105 msgid "Usage:\n" msgstr "Bruk:\n" -#: ../gio/gapplication-tool.c:114 ../gio/gresource-tool.c:551 -#: ../gio/gsettings-tool.c:649 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 +#: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumenter:\n" -#: ../gio/gapplication-tool.c:133 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTER …]" -#: ../gio/gapplication-tool.c:134 +#: gio/gapplication-tool.c:138 #, c-format msgid "Commands:\n" msgstr "Kommandoer:\n" #. Translators: do not translate 'help', but please translate 'COMMAND'. -#: ../gio/gapplication-tool.c:146 +#: gio/gapplication-tool.c:150 #, c-format msgid "" "Use “%s help COMMAND” to get detailed help.\n" @@ -175,20 +214,20 @@ msgstr "" "Bruk «%s help KOMMANDO» for å få detaljert hjelp.\n" "\n" -#: ../gio/gapplication-tool.c:165 +#: gio/gapplication-tool.c:169 #, c-format msgid "" "%s command requires an application id to directly follow\n" "\n" msgstr "%s-kommandoen krever en program-ID etter kommandoen\n" -#: ../gio/gapplication-tool.c:171 +#: gio/gapplication-tool.c:175 #, c-format msgid "invalid application id: “%s”\n" msgstr "ugyldig program-ID: «%s»\n" #. Translators: %s is replaced with a command name like 'list-actions' -#: ../gio/gapplication-tool.c:182 +#: gio/gapplication-tool.c:186 #, c-format msgid "" "“%s” takes no arguments\n" @@ -197,22 +236,21 @@ msgstr "" "«%s» tar ingen argumenter\n" "\n" -#: ../gio/gapplication-tool.c:266 +#: gio/gapplication-tool.c:270 #, c-format msgid "unable to connect to D-Bus: %s\n" msgstr "kan ikke koble til D-Bus: %s\n" -#: ../gio/gapplication-tool.c:286 +#: gio/gapplication-tool.c:290 #, c-format msgid "error sending %s message to application: %s\n" msgstr "feil ved sending av %s-melding til program: %s\n" -#: ../gio/gapplication-tool.c:317 -#, c-format +#: gio/gapplication-tool.c:324 msgid "action name must be given after application id\n" msgstr "navn på handling må oppgis etter program-ID\n" -#: ../gio/gapplication-tool.c:325 +#: gio/gapplication-tool.c:332 #, c-format msgid "" "invalid action name: “%s”\n" @@ -221,27 +259,25 @@ msgstr "" "ugyldig navvn på handling: «%s»\n" "navn på handlinger må kun bestå av tall og bokstaver, «-» og «.»\n" -#: ../gio/gapplication-tool.c:344 +#: gio/gapplication-tool.c:351 #, c-format msgid "error parsing action parameter: %s\n" msgstr "feil under tolking av parameter for handling: %s\n" -#: ../gio/gapplication-tool.c:356 -#, c-format +#: gio/gapplication-tool.c:363 msgid "actions accept a maximum of one parameter\n" msgstr "handlinger godtar ikke mer enn en parameter\n" -#: ../gio/gapplication-tool.c:411 -#, c-format +#: gio/gapplication-tool.c:418 msgid "list-actions command takes only the application id" msgstr "list-actions kommandoen tar kun program-ID" -#: ../gio/gapplication-tool.c:421 +#: gio/gapplication-tool.c:428 #, c-format msgid "unable to find desktop file for application %s\n" msgstr "kan ikke finne skrivebordsfil for program %s\n" -#: ../gio/gapplication-tool.c:466 +#: gio/gapplication-tool.c:473 #, c-format msgid "" "unrecognised command: %s\n" @@ -250,149 +286,160 @@ msgstr "" "ukjent kommando: %s\n" "\n" -#: ../gio/gbufferedinputstream.c:420 ../gio/gbufferedinputstream.c:498 -#: ../gio/ginputstream.c:179 ../gio/ginputstream.c:379 -#: ../gio/ginputstream.c:617 ../gio/ginputstream.c:1019 -#: ../gio/goutputstream.c:203 ../gio/goutputstream.c:834 -#: ../gio/gpollableinputstream.c:205 ../gio/gpollableoutputstream.c:206 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 +#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Tellerverdi gitt til %s er for stor" -#: ../gio/gbufferedinputstream.c:891 ../gio/gbufferedoutputstream.c:575 -#: ../gio/gdataoutputstream.c:562 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Søk er ikke støttet på grunnstrøm" -#: ../gio/gbufferedinputstream.c:937 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Kan ikke avkorte GBufferedInputStream" -#: ../gio/gbufferedinputstream.c:982 ../gio/ginputstream.c:1208 -#: ../gio/giostream.c:300 ../gio/goutputstream.c:1660 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 +#: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Strømmen er allerede lukket" -#: ../gio/gbufferedoutputstream.c:612 ../gio/gdataoutputstream.c:592 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Avkorting er ikke støttet på grunnstrøm" -#: ../gio/gcancellable.c:317 ../gio/gdbusconnection.c:1849 -#: ../gio/gdbusprivate.c:1402 ../gio/gsimpleasyncresult.c:871 -#: ../gio/gsimpleasyncresult.c:897 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Operasjonen ble avbrutt" -#: ../gio/gcharsetconverter.c:260 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Ugyldig objekt, ikke initiert" -#: ../gio/gcharsetconverter.c:281 ../gio/gcharsetconverter.c:309 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Ugyldig multibytesekvens i inndata" -#: ../gio/gcharsetconverter.c:315 ../gio/gcharsetconverter.c:324 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Ikke nok plass i mål" -#: ../gio/gcharsetconverter.c:342 ../gio/gdatainputstream.c:848 -#: ../gio/gdatainputstream.c:1257 ../glib/gconvert.c:438 ../glib/gconvert.c:845 -#: ../glib/giochannel.c:1557 ../glib/giochannel.c:1599 -#: ../glib/giochannel.c:2443 ../glib/gutf8.c:866 ../glib/gutf8.c:1319 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 +#: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Ugyldig bytesekvens i inndata for konvertering" -#: ../gio/gcharsetconverter.c:347 ../glib/gconvert.c:446 ../glib/gconvert.c:770 -#: ../glib/giochannel.c:1564 ../glib/giochannel.c:2455 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Feil under konvertering: %s" -#: ../gio/gcharsetconverter.c:445 ../gio/gsocket.c:1101 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Avbrytbar initiering er ikke støttet" -#: ../gio/gcharsetconverter.c:456 ../glib/gconvert.c:321 -#: ../glib/giochannel.c:1385 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Konvertering fra tegnsett «%s» til «%s» er ikke støttet" -#: ../gio/gcharsetconverter.c:460 ../glib/gconvert.c:325 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Kunne ikke åpne program for å konvertere fra «%s» til «%s»" -#: ../gio/gcontenttype.c:358 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "type %s" -#: ../gio/gcontenttype-win32.c:177 +#: gio/gcontenttype-win32.c:198 msgid "Unknown type" msgstr "Ukjent type" -#: ../gio/gcontenttype-win32.c:179 +#: gio/gcontenttype-win32.c:200 #, c-format msgid "%s filetype" msgstr "filtype %s" -#: ../gio/gcredentials.c:312 ../gio/gcredentials.c:571 +#: gio/gcredentials.c:327 +msgid "GCredentials contains invalid data" +msgstr "" + +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials er ikke implementert på dette OSet" -#: ../gio/gcredentials.c:467 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Det finnes ingen støtte for GCredentials for din plattform" -#: ../gio/gcredentials.c:513 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials har ikke en prosess-ID på dette OSet" -#: ../gio/gcredentials.c:565 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Spoofing av Credentials er ikke mulig på dette OSet" -#: ../gio/gdatainputstream.c:304 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Uventet tidlig slutt på strøm" -#: ../gio/gdbusaddress.c:155 ../gio/gdbusaddress.c:243 -#: ../gio/gdbusaddress.c:324 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Ikke støttet nøkkel «%s» i adresseoppføring «%s»" -#: ../gio/gdbusaddress.c:182 -#, c-format -msgid "" -"Address “%s” is invalid (need exactly one of path, tmpdir or abstract keys)" -msgstr "" -"Adressen «%s» er ugyldig (trenger eksakt en av følgende: sti, tmpdir eller " -"abstrakte nøkler)" - -#: ../gio/gdbusaddress.c:195 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Meningsløst nøkkel-/verdi-par i adresseoppføring «%s»" -#: ../gio/gdbusaddress.c:258 ../gio/gdbusaddress.c:339 -#, c-format -msgid "Error in address “%s” — the port attribute is malformed" +#: gio/gdbusaddress.c:187 +#, fuzzy, c-format +#| msgid "" +#| "Address “%s” is invalid (need exactly one of path, tmpdir or abstract " +#| "keys)" +msgid "" +"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " +"keys)" +msgstr "" +"Adressen «%s» er ugyldig (trenger eksakt en av følgende: sti, tmpdir eller " +"abstrakte nøkler)" + +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 +#, fuzzy, c-format +#| msgid "Error in address “%s” — the port attribute is malformed" +msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Feil i adresse «%s» – portattributten er feilutformet" -#: ../gio/gdbusaddress.c:269 ../gio/gdbusaddress.c:350 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format -msgid "Error in address “%s” — the family attribute is malformed" -msgstr "Feil i adresse «%s» – familieattributten er feilutformet" +msgid "Unknown or unsupported transport “%s” for address “%s”" +msgstr "Ukjent eller ikke støttet transport «%s» for adresse «%s»" -#: ../gio/gdbusaddress.c:460 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Adresseelement «%s» inneholder ikke et kolon (:)" -#: ../gio/gdbusaddress.c:481 +#: gio/gdbusaddress.c:473 +#, c-format +msgid "Transport name in address element “%s” must not be empty" +msgstr "" + +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -401,7 +448,18 @@ msgstr "" "Nøkkel/verdi-par %d, «%s», i adresseelement «%s» inneholder ikke et " "likhetstegn" -#: ../gio/gdbusaddress.c:495 +#: gio/gdbusaddress.c:505 +#, fuzzy, c-format +#| msgid "" +#| "Key/Value pair %d, “%s”, in address element “%s” does not contain an " +#| "equal sign" +msgid "" +"Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" +msgstr "" +"Nøkkel/verdi-par %d, «%s», i adresseelement «%s» inneholder ikke et " +"likhetstegn" + +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -410,7 +468,7 @@ msgstr "" "Feil ved unescaping av nøkkel eller verdi i nøkkel/verdi par %d, «%s», i " "adresseelement «%s»" -#: ../gio/gdbusaddress.c:573 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -419,90 +477,76 @@ msgstr "" "Feil i adresse «%s» – unix-transport krever at eksakt en av nøklene «path» " "eller «abstract» er satt" -#: ../gio/gdbusaddress.c:609 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Feil i adresse «%s» – vertsattributt mangler eller er feilutformet" -#: ../gio/gdbusaddress.c:623 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Feil i adresse «%s» – portattributt mangler eller er feilutformet" -#: ../gio/gdbusaddress.c:637 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "Feil i adresse «%s» – noncefil-attributt mangler eller er feilutformet" -#: ../gio/gdbusaddress.c:658 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Feil under automatisk oppstart: " -#: ../gio/gdbusaddress.c:666 -#, c-format -msgid "Unknown or unsupported transport “%s” for address “%s”" -msgstr "Ukjent eller ikke støttet transport «%s» for adresse «%s»" - -#: ../gio/gdbusaddress.c:704 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Feil under åpning av nonce-fil «%s»: %s" -#: ../gio/gdbusaddress.c:723 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Feil under lesing fra nonce-fil «%s»: %s" -#: ../gio/gdbusaddress.c:732 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Feil under lesing fra nonce-fil «%s», forventet 16 bytes, fikk %d" -#: ../gio/gdbusaddress.c:750 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Feil under skriving av innhold i nonce-fil «%s» til strøm:" -#: ../gio/gdbusaddress.c:959 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Gitt adresse er tom" -#: ../gio/gdbusaddress.c:1072 -#, c-format -msgid "Cannot spawn a message bus when setuid" +#: gio/gdbusaddress.c:1098 +#, fuzzy, c-format +#| msgid "Cannot spawn a message bus when setuid" +msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Kan ikke starte en meldingsbuss med setuid" -#: ../gio/gdbusaddress.c:1079 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Kan ikke starte en meldingsbuss uten en machine-id: " -#: ../gio/gdbusaddress.c:1086 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Kan ikke starte D-Bus automatisk uten X11 $DISPLAY" -#: ../gio/gdbusaddress.c:1128 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Feil under start av kommandolinje «%s»: " -#: ../gio/gdbusaddress.c:1345 -#, c-format -msgid "(Type any character to close this window)\n" -msgstr "(Trykk en tast for å lukke dette vinduet)\n" - -#: ../gio/gdbusaddress.c:1499 -#, c-format -msgid "Session dbus not running, and autolaunch failed" -msgstr "D-Bus for økten kjører ikke og automatisk start feilet" - -#: ../gio/gdbusaddress.c:1510 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Kan ikke bestemme adresse til øktbussen (ikke implementert på dette OSet)" -#: ../gio/gdbusaddress.c:1648 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -511,7 +555,7 @@ msgstr "" "Kan ikke bestemme adresse for buss fra miljøvariabelen DBUS_STARTER_BUS_TYPE " "– ukjent verdi «%s»" -#: ../gio/gdbusaddress.c:1657 ../gio/gdbusconnection.c:7155 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -519,20 +563,20 @@ msgstr "" "Kan ikke bestemme adressen til bussen fordi miljøvariabelen " "DBUS_STARTER_BUS_TYPE ikke er satt" -#: ../gio/gdbusaddress.c:1667 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Ukjent type buss %d" -#: ../gio/gdbusauth.c:293 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Uventet mangel på innhold ved forsøk på å lese en linje" -#: ../gio/gdbusauth.c:337 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Uventet mangel på innhold ved forsøk på å lese en linje på trygg måte" -#: ../gio/gdbusauth.c:508 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -540,38 +584,58 @@ msgstr "" "Brukte opp alle tilgjengelige autentiseringsmekanismer (forsøkt: %s) " "(tilgjengelig: %s)" -#: ../gio/gdbusauth.c:1171 +#: gio/gdbusauth.c:1043 +#, fuzzy +#| msgid "Unexpected lack of content trying to read a line" +msgid "Unexpected lack of content trying to read a byte" +msgstr "Uventet mangel på innhold ved forsøk på å lese en linje" + +#: gio/gdbusauth.c:1193 +msgid "User IDs must be the same for peer and server" +msgstr "" + +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Avbrutt via GDBusAuthObserver::authorize-authenticated-peer" -#: ../gio/gdbusauthmechanismsha1.c:262 +#: gio/gdbusauthmechanismsha1.c:307 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "Feil under henting av informasjon for katalog «%s»: %s" -#: ../gio/gdbusauthmechanismsha1.c:274 +#: gio/gdbusauthmechanismsha1.c:322 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" msgstr "" "Rettigheter for katalog «%s» er feilutformet. Forventet modus 0700, fikk 0%o" -#: ../gio/gdbusauthmechanismsha1.c:296 +#: gio/gdbusauthmechanismsha1.c:355 gio/gdbusauthmechanismsha1.c:366 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Feil under oppretting av katalog «%s»: %s" -#: ../gio/gdbusauthmechanismsha1.c:379 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 +msgid "Operation not supported" +msgstr "Operasjonen er ikke støttet" + +#: gio/gdbusauthmechanismsha1.c:411 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "Feil under åpning av nøkkelring «%s» for lesing: " -#: ../gio/gdbusauthmechanismsha1.c:402 ../gio/gdbusauthmechanismsha1.c:720 +#: gio/gdbusauthmechanismsha1.c:434 gio/gdbusauthmechanismsha1.c:775 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "Linje %d av nøkkelring ved «%s» med innhold «%s» er feilutformet" -#: ../gio/gdbusauthmechanismsha1.c:416 ../gio/gdbusauthmechanismsha1.c:734 +#: gio/gdbusauthmechanismsha1.c:448 gio/gdbusauthmechanismsha1.c:789 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -579,7 +643,7 @@ msgstr "" "Første symbol på linje %d av nøkkelring ved «%s» med innhold «%s» er " "feilutformet" -#: ../gio/gdbusauthmechanismsha1.c:430 ../gio/gdbusauthmechanismsha1.c:748 +#: gio/gdbusauthmechanismsha1.c:462 gio/gdbusauthmechanismsha1.c:803 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -587,190 +651,223 @@ msgstr "" "Andre symbol av linje %d i nøkkelring ved «%s» med innhold «%s» er " "feilutformet" -#: ../gio/gdbusauthmechanismsha1.c:454 +#: gio/gdbusauthmechanismsha1.c:486 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "Fant ingen informasjonskapsel med id %d i nøkkelring ved «%s»" -#: ../gio/gdbusauthmechanismsha1.c:536 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Feil under sletting av gammel låsfil «%s»: %s" - -#: ../gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:543 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "Feil under oppretting av låsfil «%s»: %s" -#: ../gio/gdbusauthmechanismsha1.c:599 +#: gio/gdbusauthmechanismsha1.c:616 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Feil under sletting av gammel låsfil «%s»: %s" + +#: gio/gdbusauthmechanismsha1.c:655 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "Feil under lukking av (unlink()et) låsfil «%s»: %s" -#: ../gio/gdbusauthmechanismsha1.c:610 +#: gio/gdbusauthmechanismsha1.c:666 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "Feil under unlink()ing av låsfil «%s»: %s" -#: ../gio/gdbusauthmechanismsha1.c:687 +#: gio/gdbusauthmechanismsha1.c:742 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "Feil under åpning av nøkkelring «%s» for skriving: " -#: ../gio/gdbusauthmechanismsha1.c:883 +#: gio/gdbusauthmechanismsha1.c:936 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(I tillegg feilet frislipp av lås for «%s» også: %s) " -#: ../gio/gdbusconnection.c:612 ../gio/gdbusconnection.c:2378 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Tilkoblingen er lukket" -#: ../gio/gdbusconnection.c:1879 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Tidsavbrudd ble nådd" -#: ../gio/gdbusconnection.c:2500 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "Ikke støttede flagg funnet ved oppretting av en klientside tilkobling" -#: ../gio/gdbusconnection.c:4124 ../gio/gdbusconnection.c:4471 -#, c-format +#: gio/gdbusconnection.c:4277 gio/gdbusconnection.c:4631 +#, fuzzy, c-format +#| msgid "" +#| "No such interface 'org.freedesktop.DBus.Properties' on object at path %s" msgid "" -"No such interface 'org.freedesktop.DBus.Properties' on object at path %s" +"No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" "Grensesnitt «org.freedesktop.DBus.Properties» finnes ikke på objekt i sti %s" -#: ../gio/gdbusconnection.c:4266 -#, c-format -msgid "No such property '%s'" +#: gio/gdbusconnection.c:4422 +#, fuzzy, c-format +#| msgid "No such property '%s'" +msgid "No such property “%s”" msgstr "Egenskap «%s» finnes ikke" -#: ../gio/gdbusconnection.c:4278 -#, c-format -msgid "Property '%s' is not readable" +#: gio/gdbusconnection.c:4434 +#, fuzzy, c-format +#| msgid "Property '%s' is not readable" +msgid "Property “%s” is not readable" msgstr "Egenskap «%s» er er ikke lesbar" -#: ../gio/gdbusconnection.c:4289 -#, c-format -msgid "Property '%s' is not writable" +#: gio/gdbusconnection.c:4445 +#, fuzzy, c-format +#| msgid "Property '%s' is not writable" +msgid "Property “%s” is not writable" msgstr "Egenskap «%s» er er ikke skrivbar" -#: ../gio/gdbusconnection.c:4309 -#, c-format -msgid "Error setting property '%s': Expected type '%s' but got '%s'" +#: gio/gdbusconnection.c:4465 +#, fuzzy, c-format +#| msgid "Error setting property '%s': Expected type '%s' but got '%s'" +msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "Feil ved setting av egenskap «%s»: Forventet type «%s», men fikk «%s»" -#: ../gio/gdbusconnection.c:4414 ../gio/gdbusconnection.c:4622 -#: ../gio/gdbusconnection.c:6586 -#, c-format -msgid "No such interface '%s'" +#: gio/gdbusconnection.c:4570 gio/gdbusconnection.c:4785 +#: gio/gdbusconnection.c:6762 +#, fuzzy, c-format +#| msgid "No such interface '%s'" +msgid "No such interface “%s”" msgstr "Grensesnitt «%s» finnes ikke" -#: ../gio/gdbusconnection.c:4840 ../gio/gdbusconnection.c:7095 -#, c-format -msgid "No such interface '%s' on object at path %s" +#: gio/gdbusconnection.c:5001 gio/gdbusconnection.c:7279 +#, fuzzy, c-format +#| msgid "No such interface '%s' on object at path %s" +msgid "No such interface “%s” on object at path %s" msgstr "Grensesnitt «%s» finnes ikke på objektsti %s" -#: ../gio/gdbusconnection.c:4938 -#, c-format -msgid "No such method '%s'" -msgstr "Metoden «%s» finnes ikke" +#: gio/gdbusconnection.c:5102 +#, fuzzy, c-format +#| msgid "No such key “%s”\n" +msgid "No such method “%s”" +msgstr "Nøkkel «%s» finnes ikke\n" -#: ../gio/gdbusconnection.c:4969 -#, c-format -msgid "Type of message, '%s', does not match expected type '%s'" +#: gio/gdbusconnection.c:5133 +#, fuzzy, c-format +#| msgid "Type of message, '%s', does not match expected type '%s'" +msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "Type melding, «%s», stemmer ikke overens med forventet type «%s»" -#: ../gio/gdbusconnection.c:5167 +#: gio/gdbusconnection.c:5336 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Et objekt er allerede eksportert for grensesnitt %s ved %s" -#: ../gio/gdbusconnection.c:5393 +#: gio/gdbusconnection.c:5563 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "Kunne ikke hente egenskap %s.%s" -#: ../gio/gdbusconnection.c:5449 +#: gio/gdbusconnection.c:5619 #, c-format msgid "Unable to set property %s.%s" msgstr "Kan ikke sette egenskap %s.%s" -#: ../gio/gdbusconnection.c:5625 -#, c-format -msgid "Method '%s' returned type '%s', but expected '%s'" +#: gio/gdbusconnection.c:5798 +#, fuzzy, c-format +#| msgid "Method '%s' returned type '%s', but expected '%s'" +msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "Metode «%s» returnerte type «%s», men forventet «%s»" -#: ../gio/gdbusconnection.c:6697 -#, c-format -msgid "Method '%s' on interface '%s' with signature '%s' does not exist" +#: gio/gdbusconnection.c:6874 +#, fuzzy, c-format +#| msgid "Method '%s' on interface '%s' with signature '%s' does not exist" +msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "Metode «%s» på grensesnitt «%s» med signatur «%s» eksisterer ikke" -#: ../gio/gdbusconnection.c:6818 +#: gio/gdbusconnection.c:6995 #, c-format msgid "A subtree is already exported for %s" msgstr "Et undertre er allerede eksportert for %s" -#: ../gio/gdbusconnection.c:7146 +#: gio/gdbusconnection.c:7287 +#, fuzzy, c-format +#| msgid "Key file does not have group “%s”" +msgid "Object does not exist at path “%s”" +msgstr "Nøkkelfil har ikke gruppe «%s»" + +#: gio/gdbusmessage.c:1351 #, c-format -msgid "" -"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " -"- unknown value '%s'" +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" msgstr "" -"Kan ikke bestemme adresse for buss fra miljøvariabelen DBUS_STARTER_BUS_TYPE " -"- ukjent verdi «%s»" -#: ../gio/gdbusmessage.c:1246 -msgid "type is INVALID" -msgstr "UGYLDIG type" - -#: ../gio/gdbusmessage.c:1257 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +#: gio/gdbusmessage.c:1374 +#, fuzzy, c-format +#| msgid "METHOD_CALL message: PATH or MEMBER header field is missing" +msgid "%s message: %s header field is missing or invalid" msgstr "METHOD_CALL melding: Topptekstfelt PATH eller MEMBER mangler" -#: ../gio/gdbusmessage.c:1268 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" -msgstr "METHOD_RETURN melding: Topptekstfelt REPLY_SERIAL mangler" +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "" -#: ../gio/gdbusmessage.c:1280 -msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" -msgstr "ERROR melding: Topptekstfelt REPLY_SERIAL eller ERROR_NAME mangler" - -#: ../gio/gdbusmessage.c:1293 -msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" -msgstr "SIGNAL melding: Topptekstfelt for PATH, INTERFACE eller MEMBER mangler" - -#: ../gio/gdbusmessage.c:1301 +#: gio/gdbusmessage.c:1424 +#, fuzzy, c-format +#| msgid "" +#| "SIGNAL message: The PATH header field is using the reserved value /org/" +#| "freedesktop/DBus/Local" msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" msgstr "" "SIGNAL-melding: Topptekstfelt for PATH bruker reservert verdi /org/" "freedesktop/DBus/Local" -#: ../gio/gdbusmessage.c:1309 +#: gio/gdbusmessage.c:1437 +#, c-format msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" + +#: gio/gdbusmessage.c:1446 +#, fuzzy, c-format +#| msgid "" +#| "SIGNAL message: The INTERFACE header field is using the reserved value " +#| "org.freedesktop.DBus.Local" +msgid "" +"%s message: INTERFACE header field is using the reserved value org." "freedesktop.DBus.Local" msgstr "" "SIGNAL melding: Topptekstfelt for INTERFACE bruker reservert verdi org." "freedesktop.DBus.Local" -#: ../gio/gdbusmessage.c:1357 ../gio/gdbusmessage.c:1417 +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" + +#: gio/gdbusmessage.c:1511 +msgid "type is INVALID" +msgstr "UGYLDIG type" + +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Ønsket å lese %lu byte men fikk bare %lu" msgstr[1] "Ønsket å lese %lu bytes men fikk bare %lu" -#: ../gio/gdbusmessage.c:1371 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Forventet NUL-byte etter strengen «%s», men fant byte %d" -#: ../gio/gdbusmessage.c:1390 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -780,17 +877,21 @@ msgstr "" "(lengden av strengen er %d). Gydldig UTF-8 streng opp til det punktet var " "«%s»" -#: ../gio/gdbusmessage.c:1593 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 +msgid "Value nested too deeply" +msgstr "" + +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Lest verdi «%s» er ikke en gyldig objektsti for D-Bus" -#: ../gio/gdbusmessage.c:1615 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Tolket verdi «%s» er ikke en gyldig D-Bus-signatur" -#: ../gio/gdbusmessage.c:1662 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -801,7 +902,7 @@ msgstr[0] "" msgstr[1] "" "Fant en array med lengde %u bytes. Maksimal lengde er 2<<26 byte (64 MiB)." -#: ../gio/gdbusmessage.c:1682 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -810,19 +911,23 @@ msgstr "" "Fant en matrise av type «a%c» som var forventet å ha en lengde som er en " "multippel av %u bytes, men var %u bytes lang" -#: ../gio/gdbusmessage.c:1849 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 +msgid "Empty structures (tuples) are not allowed in D-Bus" +msgstr "" + +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Lest verdi «%s» for variant er ikke en gyldig D-Bus-signatur" -#: ../gio/gdbusmessage.c:1873 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Feil ved deserialisering av GVariant med strengtype «%s» fra D-Bus-format" -#: ../gio/gdbusmessage.c:2055 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -831,22 +936,26 @@ msgstr "" "Ugyldig verdi for endianness. Forventet 0x6c ('l') eller 0x42 ('B'), men " "fant verdien 0x%02x" -#: ../gio/gdbusmessage.c:2068 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Ugyldig hovedversjon for protokoll. Forventet en men fikk %d" -#: ../gio/gdbusmessage.c:2124 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 +msgid "Signature header found but is not of type signature" +msgstr "" + +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Signaturtopptekst med signatur «%s» funnet, men meldingskroppen er tom" -#: ../gio/gdbusmessage.c:2138 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Lest verdi «%s» er ikke en gyldig D-Bus-signatur (for kropp)" -#: ../gio/gdbusmessage.c:2168 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -854,37 +963,34 @@ msgstr[0] "Ingen signaturtopptekst i meldingen, men meldingskroppen er %u byte" msgstr[1] "" "Ingen signaturtopptekst i meldingen, men meldingskroppen er %u bytes" -#: ../gio/gdbusmessage.c:2178 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Kan ikke deserialisere melding: " -#: ../gio/gdbusmessage.c:2519 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" "Feil ved serialisering av GVariant med strengtype «%s» til D-Bus-format" -#: ../gio/gdbusmessage.c:2656 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" -"Message has %d file descriptors but the header field indicates %d file " -"descriptors" +"Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" -"Meldingen har %d fildeskriptorer men topptekstfeltet indikerer %d " -"fildeskriptorer" -#: ../gio/gdbusmessage.c:2664 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Kan ikke serialisere melding: " -#: ../gio/gdbusmessage.c:2708 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "Meldingskroppen har signatur «%s» men det finnes ingen signaturtopptekst" -#: ../gio/gdbusmessage.c:2718 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -893,71 +999,90 @@ msgstr "" "Meldingskroppen har signaturtype «%s», men signaturen i topptekstfeltet et " "«%s»" -#: ../gio/gdbusmessage.c:2734 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Meldingskroppen er tom men signatur i topptekstfeltet er «(%s)»" -#: ../gio/gdbusmessage.c:3287 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Feil retur med kropp av type «%s»" -#: ../gio/gdbusmessage.c:3295 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Feil retur med tom kropp" -#: ../gio/gdbusprivate.c:2066 +#: gio/gdbusprivate.c:2201 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "(Trykk en tast for å lukke dette vinduet)\n" + +#: gio/gdbusprivate.c:2387 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "D-Bus for økten kjører ikke og automatisk start feilet" + +#: gio/gdbusprivate.c:2410 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "Kan ikke hente maskinvareprofil: %s" -#: ../gio/gdbusprivate.c:2111 -msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " -msgstr "Kan ikke laste /var/lib/dbus/machine-id eller /etc/machine-id: " +#. Translators: Both placeholders are file paths +#: gio/gdbusprivate.c:2466 +#, fuzzy, c-format +#| msgid "Unable to trash file %s: %s" +msgid "Unable to load %s or %s: " +msgstr "Kan ikke legge fil %s i papirkurven: %s" -#: ../gio/gdbusproxy.c:1611 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Feil ved kall til StartServiceByName for %s: " -#: ../gio/gdbusproxy.c:1634 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Uventet svar %d fra metoden StartServiceByName(«%s»)" -#: ../gio/gdbusproxy.c:2719 ../gio/gdbusproxy.c:2853 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 +#, fuzzy, c-format +#| msgid "" +#| "Cannot invoke method; proxy is for a well-known name without an owner and " +#| "proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgid "" -"Cannot invoke method; proxy is for a well-known name without an owner and " -"proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" +"Cannot invoke method; proxy is for the well-known name %s without an owner, " +"and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "" "Kan ikke invokere metode; proxy er for et velkjent navn uten en eier og " "proxy ble opprettet med flagget G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: ../gio/gdbusserver.c:708 -msgid "Abstract name space not supported" +#: gio/gdbusserver.c:739 +#, fuzzy +#| msgid "Abstract name space not supported" +msgid "Abstract namespace not supported" msgstr "Abstrakt navneområde er ikke støttet" -#: ../gio/gdbusserver.c:795 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Kan ikke oppgi nonce-fil når en tjener opprettes" -#: ../gio/gdbusserver.c:876 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Feil under skriving av nonce-fil i «%s»: %s" -#: ../gio/gdbusserver.c:1047 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Strengen «%s» er ikke en gyldig D-Bus-GUID" -#: ../gio/gdbusserver.c:1087 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Kan ikke lytte på en transport «%s» som ikke er støttet" -#: ../gio/gdbus-tool.c:95 +#: gio/gdbus-tool.c:113 #, c-format msgid "" "Commands:\n" @@ -980,61 +1105,71 @@ msgstr "" " \n" "Bruk «%s COMMAND --help» for å få hjelp om hver kommando.\n" -#: ../gio/gdbus-tool.c:167 ../gio/gdbus-tool.c:234 ../gio/gdbus-tool.c:306 -#: ../gio/gdbus-tool.c:330 ../gio/gdbus-tool.c:811 ../gio/gdbus-tool.c:1150 -#: ../gio/gdbus-tool.c:1592 +#: gio/gdbus-tool.c:204 gio/gdbus-tool.c:276 gio/gdbus-tool.c:347 +#: gio/gdbus-tool.c:371 gio/gdbus-tool.c:861 gio/gdbus-tool.c:1246 +#: gio/gdbus-tool.c:1733 #, c-format msgid "Error: %s\n" msgstr "Feil: %s\n" -#: ../gio/gdbus-tool.c:178 ../gio/gdbus-tool.c:247 ../gio/gdbus-tool.c:1608 +#: gio/gdbus-tool.c:215 gio/gdbus-tool.c:289 gio/gdbus-tool.c:1749 #, c-format msgid "Error parsing introspection XML: %s\n" msgstr "Feil under tolking av introspeksjons-XML: %s\n" -#: ../gio/gdbus-tool.c:216 +#: gio/gdbus-tool.c:253 #, c-format msgid "Error: %s is not a valid name\n" msgstr "Feil: %s er ikke et gyldig navn\n" -#: ../gio/gdbus-tool.c:364 +#: gio/gdbus-tool.c:258 gio/gdbus-tool.c:747 gio/gdbus-tool.c:1065 +#: gio/gdbus-tool.c:1899 gio/gdbus-tool.c:2139 +#, c-format +msgid "Error: %s is not a valid object path\n" +msgstr "Feil: %s er ikke en gyldig objektsti\n" + +#: gio/gdbus-tool.c:405 msgid "Connect to the system bus" msgstr "Koble til systembussen" -#: ../gio/gdbus-tool.c:365 +#: gio/gdbus-tool.c:406 msgid "Connect to the session bus" msgstr "Koble til øktbussen" -#: ../gio/gdbus-tool.c:366 +#: gio/gdbus-tool.c:407 msgid "Connect to given D-Bus address" msgstr "Koble til gitt D-Bus-adresse" -#: ../gio/gdbus-tool.c:376 +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "" + +#: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Alternativer for tilkoblingssluttpunkt:" -#: ../gio/gdbus-tool.c:377 +#: gio/gdbus-tool.c:418 msgid "Options specifying the connection endpoint" msgstr "Alternativer som spesifiserer sluttpunkt for tilkobling" -#: ../gio/gdbus-tool.c:399 +#: gio/gdbus-tool.c:441 #, c-format msgid "No connection endpoint specified" msgstr "Sluttpunkt for tilkobling ikke oppgitt" -#: ../gio/gdbus-tool.c:409 +#: gio/gdbus-tool.c:451 #, c-format msgid "Multiple connection endpoints specified" msgstr "Flere sluttpunkt oppgitt for tilkobling" -#: ../gio/gdbus-tool.c:479 +#: gio/gdbus-tool.c:524 #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "" "Advarsel: I følge introspeksjonsdata eksisterer ikke grensesnitt «%s»\n" -#: ../gio/gdbus-tool.c:488 +#: gio/gdbus-tool.c:533 #, c-format msgid "" "Warning: According to introspection data, method “%s” does not exist on " @@ -1043,507 +1178,535 @@ msgstr "" "Advarsel: I følge introspeksjonsdata eksisterer ikke metode «%s» på " "grensesnitt «%s»\n" -#: ../gio/gdbus-tool.c:550 +#: gio/gdbus-tool.c:595 msgid "Optional destination for signal (unique name)" msgstr "Valgfri destinasjon for signal (unikt navn)" -#: ../gio/gdbus-tool.c:551 +#: gio/gdbus-tool.c:596 msgid "Object path to emit signal on" msgstr "Objektsti signal skal sendes ut på" -#: ../gio/gdbus-tool.c:552 +#: gio/gdbus-tool.c:597 msgid "Signal and interface name" msgstr "Navn på signal og grensesnitt" -#: ../gio/gdbus-tool.c:587 +#: gio/gdbus-tool.c:630 msgid "Emit a signal." msgstr "Send ut et signal." -#: ../gio/gdbus-tool.c:642 ../gio/gdbus-tool.c:944 ../gio/gdbus-tool.c:1698 -#: ../gio/gdbus-tool.c:1931 ../gio/gdbus-tool.c:2152 +#: gio/gdbus-tool.c:685 gio/gdbus-tool.c:1002 gio/gdbus-tool.c:1836 +#: gio/gdbus-tool.c:2068 gio/gdbus-tool.c:2288 #, c-format msgid "Error connecting: %s\n" msgstr "Feil under tilkobling: %s\n" -#: ../gio/gdbus-tool.c:659 ../gio/gdbus-tool.c:961 ../gio/gdbus-tool.c:1715 -#: ../gio/gdbus-tool.c:1956 -#, c-format -msgid "Error: Destination is not specified\n" -msgstr "Feil: Mål er ikke oppgitt\n" - -#: ../gio/gdbus-tool.c:670 +#: gio/gdbus-tool.c:705 #, c-format msgid "Error: %s is not a valid unique bus name.\n" msgstr "Feil: %s er ikke et gyldig unikt bussnavn.\n" -#: ../gio/gdbus-tool.c:685 ../gio/gdbus-tool.c:987 ../gio/gdbus-tool.c:1741 -#, c-format +#: gio/gdbus-tool.c:724 gio/gdbus-tool.c:1045 gio/gdbus-tool.c:1879 msgid "Error: Object path is not specified\n" msgstr "Feil: Objektsti er ikke oppgitt\n" -#: ../gio/gdbus-tool.c:705 ../gio/gdbus-tool.c:1007 ../gio/gdbus-tool.c:1761 -#: ../gio/gdbus-tool.c:2002 -#, c-format -msgid "Error: %s is not a valid object path\n" -msgstr "Feil: %s er ikke en gyldig objektsti\n" - -#: ../gio/gdbus-tool.c:720 -#, c-format +#: gio/gdbus-tool.c:767 msgid "Error: Signal name is not specified\n" msgstr "Feil: Signalnavn er ikke oppgitt\n" -#: ../gio/gdbus-tool.c:731 +#: gio/gdbus-tool.c:781 #, c-format msgid "Error: Signal name “%s” is invalid\n" msgstr "Feil: Signalnavn «%s» er ugyldig\n" -#: ../gio/gdbus-tool.c:743 +#: gio/gdbus-tool.c:793 #, c-format msgid "Error: %s is not a valid interface name\n" msgstr "Feil: %s er ikke en gyldig navn på grensesnitt\n" -#: ../gio/gdbus-tool.c:749 +#: gio/gdbus-tool.c:799 #, c-format msgid "Error: %s is not a valid member name\n" msgstr "Feil: %s er ikke et gyldig medlemsnavn\n" #. Use the original non-"parse-me-harder" error -#: ../gio/gdbus-tool.c:786 ../gio/gdbus-tool.c:1119 +#: gio/gdbus-tool.c:836 gio/gdbus-tool.c:1177 #, c-format msgid "Error parsing parameter %d: %s\n" msgstr "Feil under tolking av parameter %d: %s\n" -#: ../gio/gdbus-tool.c:818 +#: gio/gdbus-tool.c:868 #, c-format msgid "Error flushing connection: %s\n" msgstr "Feil ved nullstilling av tilkobling: %s\n" -#: ../gio/gdbus-tool.c:845 +#: gio/gdbus-tool.c:896 msgid "Destination name to invoke method on" msgstr "Målnavn metoden skal invokeres på" -#: ../gio/gdbus-tool.c:846 +#: gio/gdbus-tool.c:897 msgid "Object path to invoke method on" msgstr "Objektsti metoden skal invokeres på" -#: ../gio/gdbus-tool.c:847 +#: gio/gdbus-tool.c:898 msgid "Method and interface name" msgstr "Navn på metode og grensesnitt" -#: ../gio/gdbus-tool.c:848 +#: gio/gdbus-tool.c:899 msgid "Timeout in seconds" msgstr "Tidsavbrudd i sekunder" -#: ../gio/gdbus-tool.c:889 +#: gio/gdbus-tool.c:900 +#, fuzzy +#| msgid "Show information about locations" +msgid "Allow interactive authorization" +msgstr "Vis informasjon om lokasjoner" + +#: gio/gdbus-tool.c:947 msgid "Invoke a method on a remote object." msgstr "Kjør en metode på et eksternt objekt." -#: ../gio/gdbus-tool.c:972 ../gio/gdbus-tool.c:1732 ../gio/gdbus-tool.c:1967 +#: gio/gdbus-tool.c:1019 gio/gdbus-tool.c:1853 gio/gdbus-tool.c:2093 +msgid "Error: Destination is not specified\n" +msgstr "Feil: Mål er ikke oppgitt\n" + +#: gio/gdbus-tool.c:1030 gio/gdbus-tool.c:1870 gio/gdbus-tool.c:2104 #, c-format msgid "Error: %s is not a valid bus name\n" msgstr "Feil: %s er ikke et gyldig navn på buss\n" -#: ../gio/gdbus-tool.c:1022 -#, c-format +#: gio/gdbus-tool.c:1080 msgid "Error: Method name is not specified\n" msgstr "Feil: metodenavn er ikke oppgitt\n" -#: ../gio/gdbus-tool.c:1033 +#: gio/gdbus-tool.c:1091 #, c-format msgid "Error: Method name “%s” is invalid\n" msgstr "Feil: metodenavn «%s» er ugyldig\n" -#: ../gio/gdbus-tool.c:1111 +#: gio/gdbus-tool.c:1169 #, c-format msgid "Error parsing parameter %d of type “%s”: %s\n" msgstr "Feil under tolking av parameter %d av type «%s»: %s\n" -#: ../gio/gdbus-tool.c:1555 +#: gio/gdbus-tool.c:1195 +#, fuzzy, c-format +#| msgid "Error reading from handle: %s" +msgid "Error adding handle %d: %s\n" +msgstr "Feil under lesing fra håndtak: %s" + +#: gio/gdbus-tool.c:1695 msgid "Destination name to introspect" msgstr "Målnavn som skal inspiseres" -#: ../gio/gdbus-tool.c:1556 +#: gio/gdbus-tool.c:1696 msgid "Object path to introspect" msgstr "Objektsti som skal inspiseres" -#: ../gio/gdbus-tool.c:1557 +#: gio/gdbus-tool.c:1697 msgid "Print XML" msgstr "Skriv ut XML" -#: ../gio/gdbus-tool.c:1558 +#: gio/gdbus-tool.c:1698 msgid "Introspect children" msgstr "Bruk introspeksjon for barn" -#: ../gio/gdbus-tool.c:1559 +#: gio/gdbus-tool.c:1699 msgid "Only print properties" msgstr "Skriv kun ut egenskaper" -#: ../gio/gdbus-tool.c:1650 +#: gio/gdbus-tool.c:1788 msgid "Introspect a remote object." msgstr "Inspiser et eksternt objekt." -#: ../gio/gdbus-tool.c:1853 +#: gio/gdbus-tool.c:1994 msgid "Destination name to monitor" msgstr "Navn på mål som skal overvåkes" -#: ../gio/gdbus-tool.c:1854 +#: gio/gdbus-tool.c:1995 msgid "Object path to monitor" msgstr "Objektsti som skal overvåkes" -#: ../gio/gdbus-tool.c:1883 +#: gio/gdbus-tool.c:2020 msgid "Monitor a remote object." msgstr "Overvåk et eksternt objekt." -#: ../gio/gdbus-tool.c:1941 -#, c-format +#: gio/gdbus-tool.c:2078 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "" -#: ../gio/gdbus-tool.c:2065 +#: gio/gdbus-tool.c:2202 msgid "Service to activate before waiting for the other one (well-known name)" msgstr "" -#: ../gio/gdbus-tool.c:2068 +#: gio/gdbus-tool.c:2205 msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" msgstr "" -#: ../gio/gdbus-tool.c:2116 +#: gio/gdbus-tool.c:2253 msgid "[OPTION…] BUS-NAME" msgstr "[FLAGG …] BUSS-NAVN" -#: ../gio/gdbus-tool.c:2118 +#: gio/gdbus-tool.c:2254 msgid "Wait for a bus name to appear." msgstr "Vent på et bussnavn." -#: ../gio/gdbus-tool.c:2194 -#, c-format +#: gio/gdbus-tool.c:2330 msgid "Error: A service to activate for must be specified.\n" msgstr "Feil: En tjeneste å aktivere for må oppgis.\n" -#: ../gio/gdbus-tool.c:2199 -#, c-format +#: gio/gdbus-tool.c:2335 msgid "Error: A service to wait for must be specified.\n" msgstr "Feil: En tjeneste å vente på må oppgis.\n" -#: ../gio/gdbus-tool.c:2204 -#, c-format +#: gio/gdbus-tool.c:2340 msgid "Error: Too many arguments.\n" msgstr "Feil: For mange argumenter.\n" -#: ../gio/gdbus-tool.c:2212 ../gio/gdbus-tool.c:2219 +#: gio/gdbus-tool.c:2348 gio/gdbus-tool.c:2355 #, c-format msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Feil: %s er ikke et gyldig og velkjent navn på en buss.\n" -#: ../gio/gdesktopappinfo.c:2001 ../gio/gdesktopappinfo.c:4531 +#: gio/gdebugcontrollerdbus.c:361 +#, c-format +msgid "Not authorized to change debug settings" +msgstr "" + +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Uten navn" -#: ../gio/gdesktopappinfo.c:2411 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Desktop-filen hadde ingen verdi i Exec-feltet" -#: ../gio/gdesktopappinfo.c:2694 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Kan ikke finne terminalen som kreves for programmet" -#: ../gio/gdesktopappinfo.c:3127 +#: gio/gdesktopappinfo.c:2995 +#, c-format +msgid "Program ‘%s’ not found in $PATH" +msgstr "" + +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Kan ikke opprette konfigurasjonsmappe %s for brukers program: %s" -#: ../gio/gdesktopappinfo.c:3131 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Kan ikke opprette brukers konfigurasjonsmappe %s for MIME: %s" -#: ../gio/gdesktopappinfo.c:3371 ../gio/gdesktopappinfo.c:3395 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Programinformasjonen mangler en identifikator" -#: ../gio/gdesktopappinfo.c:3629 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Kan ikke opprette brukers desktop-fil %s" -#: ../gio/gdesktopappinfo.c:3763 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Egendefinert definisjon for %s" -#: ../gio/gdrive.c:417 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "stasjonen implementerer ikke utløsing" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: ../gio/gdrive.c:495 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "stasjonen implementerer ikke eject eller eject_with_operation" -#: ../gio/gdrive.c:571 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "stasjonen implementerer ikke sjekk om medie er satt inn" -#: ../gio/gdrive.c:776 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "stasjonen implementerer ikke start" -#: ../gio/gdrive.c:878 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "stasjonen implementerer ikke stopp" -#: ../gio/gdummytlsbackend.c:195 ../gio/gdummytlsbackend.c:317 -#: ../gio/gdummytlsbackend.c:509 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "" + +#: gio/gdummytlsbackend.c:197 gio/gdummytlsbackend.c:323 +#: gio/gdummytlsbackend.c:515 msgid "TLS support is not available" msgstr "TLS-støtte er ikke tilgjengelig" -#: ../gio/gdummytlsbackend.c:419 +#: gio/gdummytlsbackend.c:425 msgid "DTLS support is not available" msgstr "DTLS-støtte er ikke tilgjengelig" -#: ../gio/gemblem.c:323 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Kan ikke håndtere versjon %d av GEmblem-koding" -#: ../gio/gemblem.c:333 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Feil antall tegn (%d) i GEmblem-koding" -#: ../gio/gemblemedicon.c:362 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Kan ikke håndtere versjon %d av GEmblemedIcon-koding" -#: ../gio/gemblemedicon.c:372 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Feil antall tegn (%d) i GEmblemedIcon-koding" -#: ../gio/gemblemedicon.c:395 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Ventet et GEmblem for GEmblemedIcon" -#: ../gio/gfile.c:969 ../gio/gfile.c:1207 ../gio/gfile.c:1345 -#: ../gio/gfile.c:1583 ../gio/gfile.c:1638 ../gio/gfile.c:1696 -#: ../gio/gfile.c:1780 ../gio/gfile.c:1837 ../gio/gfile.c:1901 -#: ../gio/gfile.c:1956 ../gio/gfile.c:3602 ../gio/gfile.c:3657 -#: ../gio/gfile.c:3893 ../gio/gfile.c:3935 ../gio/gfile.c:4403 -#: ../gio/gfile.c:4814 ../gio/gfile.c:4899 ../gio/gfile.c:4989 -#: ../gio/gfile.c:5086 ../gio/gfile.c:5173 ../gio/gfile.c:5274 -#: ../gio/gfile.c:7817 ../gio/gfile.c:7907 ../gio/gfile.c:7991 -#: ../gio/win32/gwinhttpfile.c:437 -msgid "Operation not supported" -msgstr "Operasjonen er ikke støttet" - #. Translators: This is an error message when #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: ../gio/gfile.c:1468 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Omsluttende monteringspunkt finnes ikke" -#: ../gio/gfile.c:2515 ../gio/glocalfile.c:2380 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Kan ikke kopiere over katalog" -#: ../gio/gfile.c:2575 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Kan ikke kopiere katalog over katalog" -#: ../gio/gfile.c:2583 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Målfilen eksisterer" -#: ../gio/gfile.c:2602 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Kan ikke kopiere katalog rekursivt" -#: ../gio/gfile.c:2877 -msgid "Splice not supported" -msgstr "Splice er ikke støttet" +#: gio/gfile.c:3050 gio/gfile.c:3098 +#, fuzzy, c-format +#| msgid "Operation not supported" +msgid "Copy file range not supported" +msgstr "Operasjonen er ikke støttet" -#: ../gio/gfile.c:2881 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Feil ved bruk av splice(2) på fil: %s" -#: ../gio/gfile.c:3013 +#: gio/gfile.c:3163 +msgid "Splice not supported" +msgstr "Splice er ikke støttet" + +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Kopiering (reflink/clone) mellom monteringspunkter er ikke støttet" -#: ../gio/gfile.c:3017 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopiering (reflink/clone) er ikke støttet eller ugyldig" -#: ../gio/gfile.c:3022 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopiering (reflink/clone) er ikke støttet eller virket ikke" -#: ../gio/gfile.c:3085 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, fuzzy, c-format +#| msgid "Preserve all attributes" +msgid "Cannot retrieve attribute %s" +msgstr "Behold alle attributter" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Kan ikke kopiere spesiell fil" -#: ../gio/gfile.c:3883 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Ugyldig verdi oppgitt for symbolsk lenke" -#: ../gio/gfile.c:4044 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 +msgid "Symbolic links not supported" +msgstr "Symbolske lenker er ikke støttet" + +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Papirkurv er ikke støttet" -#: ../gio/gfile.c:4156 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Filnavn kan ikke inneholde «%c»" -#: ../gio/gfile.c:6602 ../gio/gvolume.c:363 +#: gio/gfile.c:7159 gio/gfile.c:7285 +#, fuzzy, c-format +#| msgid "Failed to change to directory “%s” (%s)" +msgid "Failed to create a temporary directory for template “%s”: %s" +msgstr "Klarte ikke å skifte til katalog «%s» (%s)" + +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "volumet implementerer ikke montering" -#: ../gio/gfile.c:6711 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Ingen program registrert for å håndtere denne filen" -#: ../gio/gfileenumerator.c:212 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator er lukket" -#: ../gio/gfileenumerator.c:219 ../gio/gfileenumerator.c:278 -#: ../gio/gfileenumerator.c:377 ../gio/gfileenumerator.c:476 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Filenumerator har utestående operasjon" -#: ../gio/gfileenumerator.c:368 ../gio/gfileenumerator.c:467 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Filenumerator er allerede lukket" -#: ../gio/gfileicon.c:236 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Kan ikke håndtere versjon %d av GFileIcon-koding" -#: ../gio/gfileicon.c:246 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Feil inndata for GFileIcon" -#: ../gio/gfileinputstream.c:149 ../gio/gfileinputstream.c:394 -#: ../gio/gfileiostream.c:167 ../gio/gfileoutputstream.c:164 -#: ../gio/gfileoutputstream.c:497 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Strømmen støtter ikke query_info" -#: ../gio/gfileinputstream.c:325 ../gio/gfileiostream.c:379 -#: ../gio/gfileoutputstream.c:371 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Søking ikke støttet på strøm" -#: ../gio/gfileinputstream.c:369 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Avkorting er ikke tillatt på en inndatastrøm" -#: ../gio/gfileiostream.c:455 ../gio/gfileoutputstream.c:447 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Avkorting er ikke støttet på strømmen" -#: ../gio/ghttpproxy.c:91 ../gio/gresolver.c:410 ../gio/gresolver.c:476 -#: ../glib/gconvert.c:1650 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Ugyldig vertsnavn" -#: ../gio/ghttpproxy.c:143 +#: gio/ghttpproxy.c:145 msgid "Bad HTTP proxy reply" msgstr "Ugyldig svar fra HTTP-proxy" -#: ../gio/ghttpproxy.c:159 +#: gio/ghttpproxy.c:161 msgid "HTTP proxy connection not allowed" msgstr "HTTP-proxytilkobling tillates ikke" -#: ../gio/ghttpproxy.c:164 +#: gio/ghttpproxy.c:166 msgid "HTTP proxy authentication failed" msgstr "Autentisering for HTTP-proxy feilet" -#: ../gio/ghttpproxy.c:167 +#: gio/ghttpproxy.c:169 msgid "HTTP proxy authentication required" msgstr "Autentisering kreves for HTTP-proxy" -#: ../gio/ghttpproxy.c:171 +#: gio/ghttpproxy.c:173 #, c-format msgid "HTTP proxy connection failed: %i" msgstr "HTTP-proxytilkobling feilet: %i" -#: ../gio/ghttpproxy.c:269 +#: gio/ghttpproxy.c:268 +#, fuzzy +#| msgid "HTTP proxy connection failed: %i" +msgid "HTTP proxy response too big" +msgstr "HTTP-proxytilkobling feilet: %i" + +#: gio/ghttpproxy.c:285 msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP-proxytjener lukket tilkoblingen uventet." -#: ../gio/gicon.c:290 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Feil antall tegn (%d)" -#: ../gio/gicon.c:310 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Ingen type for klassenavn %s" -#: ../gio/gicon.c:320 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Type %s implementerer ikke GIcon-grensesnittet" -#: ../gio/gicon.c:331 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Type %s er er ikke en klasse" -#: ../gio/gicon.c:345 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Feil versjonsnummer: %s" -#: ../gio/gicon.c:359 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Type %s implementerer ikke from_tokens() på GIcon-grensesnittet" -#: ../gio/gicon.c:461 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Kan ikke håndtere oppgitt versjon i ikon-koding" -#: ../gio/ginetaddressmask.c:182 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Ingen adresse oppgitt" -#: ../gio/ginetaddressmask.c:190 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Lengde %u er for lang for adressen" -#: ../gio/ginetaddressmask.c:223 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adressen har biter satt forbi lengde på prefiks" -#: ../gio/ginetaddressmask.c:300 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Kunne ikke lese «%s» som IP-adressemaske" -#: ../gio/ginetsocketaddress.c:203 ../gio/ginetsocketaddress.c:220 -#: ../gio/gnativesocketaddress.c:106 ../gio/gunixsocketaddress.c:218 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Ikke nok plass til adresse for plugg" -#: ../gio/ginetsocketaddress.c:235 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Adresse for plugg er ikke støttet" -#: ../gio/ginputstream.c:188 +#: gio/ginputstream.c:190 msgid "Input stream doesn’t implement read" msgstr "Inndatastrøm implementerer ikke lesing" @@ -1553,280 +1716,290 @@ msgstr "Inndatastrøm implementerer ikke lesing" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: ../gio/ginputstream.c:1218 ../gio/giostream.c:310 -#: ../gio/goutputstream.c:1670 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Strømmen har utestående operasjoner" -#: ../gio/gio-tool.c:160 +#: gio/gio-tool.c:162 msgid "Copy with file" msgstr "Kopier med fil" -#: ../gio/gio-tool.c:164 +#: gio/gio-tool.c:166 msgid "Keep with file when moved" msgstr "Behold med fil når den flyttes" -#: ../gio/gio-tool.c:205 +#: gio/gio-tool.c:207 msgid "“version” takes no arguments" msgstr "«version» tar ingen argumenter" -#: ../gio/gio-tool.c:207 ../gio/gio-tool.c:223 ../glib/goption.c:857 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Bruk:" -#: ../gio/gio-tool.c:210 +#: gio/gio-tool.c:212 msgid "Print version information and exit." msgstr "Skriv versjonsinformasjon og avslutt." -#: ../gio/gio-tool.c:224 -msgid "[ARGS...]" -msgstr "[ARGUMENTER …]" - -#: ../gio/gio-tool.c:226 -msgid "Commands:" -msgstr "Kommandoer:" - -#: ../gio/gio-tool.c:229 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Spleis filer til standard utdata" -#: ../gio/gio-tool.c:230 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopier en eller flere filer" -#: ../gio/gio-tool.c:231 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Vis informasjon om lokasjoner" -#: ../gio/gio-tool.c:232 +#: gio/gio-tool.c:235 +#, fuzzy +#| msgid "List static actions for an application (from .desktop file)" +msgid "Launch an application from a desktop file" +msgstr "Vis statiske handlinger for et program (fra .desktop-fil)" + +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Vis innholdet i lokasjoner" -#: ../gio/gio-tool.c:233 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Hent eller sett håndterer for en MIME-type" -#: ../gio/gio-tool.c:234 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Lag kataloger" -#: ../gio/gio-tool.c:235 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Overvåk filer og kataloger for endringer" -#: ../gio/gio-tool.c:236 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Monter eller avmonter lokasjoner" -#: ../gio/gio-tool.c:237 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Flytt en eller flere filer" -#: ../gio/gio-tool.c:238 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Åpne filer med forvalgt program" -#: ../gio/gio-tool.c:239 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Endre navn på en fil" -#: ../gio/gio-tool.c:240 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Slett en eller flere filer" -#: ../gio/gio-tool.c:241 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Les fra standard inndata og lagre" -#: ../gio/gio-tool.c:242 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Sett en filattributt" -#: ../gio/gio-tool.c:243 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Flytt filer eller kataloger til papirkurven" -#: ../gio/gio-tool.c:244 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lister innholdet av lokasjoner i et tre" -#: ../gio/gio-tool.c:246 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Kommandoer:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Bruk %s for å få detaljert hjelp.\n" -#: ../gio/gio-tool-cat.c:87 +#: gio/gio-tool-cat.c:89 msgid "Error writing to stdout" msgstr "Feil under skriving til standard utdata" #. Translators: commandline placeholder -#: ../gio/gio-tool-cat.c:133 ../gio/gio-tool-info.c:282 -#: ../gio/gio-tool-list.c:165 ../gio/gio-tool-mkdir.c:48 -#: ../gio/gio-tool-monitor.c:37 ../gio/gio-tool-monitor.c:39 -#: ../gio/gio-tool-monitor.c:41 ../gio/gio-tool-monitor.c:43 -#: ../gio/gio-tool-monitor.c:203 ../gio/gio-tool-mount.c:1141 -#: ../gio/gio-tool-open.c:113 ../gio/gio-tool-remove.c:48 -#: ../gio/gio-tool-rename.c:45 ../gio/gio-tool-set.c:89 -#: ../gio/gio-tool-trash.c:81 ../gio/gio-tool-tree.c:239 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 +#: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 +#: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 +#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 +#: gio/gio-tool-remove.c:50 gio/gio-tool-rename.c:47 gio/gio-tool-set.c:95 +#: gio/gio-tool-trash.c:222 gio/gio-tool-tree.c:246 msgid "LOCATION" msgstr "LOKASJON" -#: ../gio/gio-tool-cat.c:138 +#: gio/gio-tool-cat.c:140 msgid "Concatenate files and print to standard output." msgstr "Slå sammen filer og skriv til standard utdata." -#: ../gio/gio-tool-cat.c:140 +#: gio/gio-tool-cat.c:142 msgid "" "gio cat works just like the traditional cat utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" -#: ../gio/gio-tool-cat.c:162 ../gio/gio-tool-info.c:313 -#: ../gio/gio-tool-mkdir.c:76 ../gio/gio-tool-monitor.c:228 -#: ../gio/gio-tool-open.c:139 ../gio/gio-tool-remove.c:72 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 +#: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Ingen lokasjoner oppgitt" -#: ../gio/gio-tool-copy.c:42 ../gio/gio-tool-move.c:38 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Ingen målkatalog" -#: ../gio/gio-tool-copy.c:43 ../gio/gio-tool-move.c:39 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Vis fremdrift" -#: ../gio/gio-tool-copy.c:44 ../gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Spør før overskriving" -#: ../gio/gio-tool-copy.c:45 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Behold alle attributter" -#: ../gio/gio-tool-copy.c:46 ../gio/gio-tool-move.c:41 -#: ../gio/gio-tool-save.c:49 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Ta sikkerhetskopi av eksisterende målfiler" -#: ../gio/gio-tool-copy.c:47 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Aldri følg symbolske lenker" -#: ../gio/gio-tool-copy.c:72 ../gio/gio-tool-move.c:67 +#: gio/gio-tool-copy.c:52 +msgid "Use default permissions for the destination" +msgstr "" + +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "%s av %s er overført (%s/s)" #. Translators: commandline placeholder -#: ../gio/gio-tool-copy.c:98 ../gio/gio-tool-move.c:94 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "KILDE" #. Translators: commandline placeholder -#: ../gio/gio-tool-copy.c:98 ../gio/gio-tool-move.c:94 -#: ../gio/gio-tool-save.c:160 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "MÅL" -#: ../gio/gio-tool-copy.c:103 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopier en eller flere filer fra KILDE til MÅL." -#: ../gio/gio-tool-copy.c:105 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" -#: ../gio/gio-tool-copy.c:147 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Mål %s er ikke en katalog" -#: ../gio/gio-tool-copy.c:192 ../gio/gio-tool-move.c:185 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: overskriv «%s»? " -#: ../gio/gio-tool-info.c:34 +#: gio/gio-tool-info.c:39 msgid "List writable attributes" msgstr "Vis skrivbare attributter" -#: ../gio/gio-tool-info.c:35 +#: gio/gio-tool-info.c:40 msgid "Get file system info" msgstr "Hent informasjon om filsystem" -#: ../gio/gio-tool-info.c:36 ../gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:41 gio/gio-tool-list.c:37 msgid "The attributes to get" msgstr "Attributter som skal hentes" -#: ../gio/gio-tool-info.c:36 ../gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:41 gio/gio-tool-list.c:37 msgid "ATTRIBUTES" msgstr "ATTRIBUTTER" -#: ../gio/gio-tool-info.c:37 ../gio/gio-tool-list.c:38 ../gio/gio-tool-set.c:34 +#: gio/gio-tool-info.c:42 gio/gio-tool-list.c:40 gio/gio-tool-set.c:37 msgid "Don’t follow symbolic links" msgstr "Aldri følg symbolske lenker" -#: ../gio/gio-tool-info.c:75 -#, c-format +#: gio/gio-tool-info.c:105 msgid "attributes:\n" msgstr "attributter:\n" #. Translators: This is a noun and represents and attribute of a file -#: ../gio/gio-tool-info.c:127 +#: gio/gio-tool-info.c:166 #, c-format msgid "display name: %s\n" msgstr "vis navn: %s\n" #. Translators: This is a noun and represents and attribute of a file -#: ../gio/gio-tool-info.c:132 +#: gio/gio-tool-info.c:176 #, c-format msgid "edit name: %s\n" msgstr "rediger navn: %s\n" -#: ../gio/gio-tool-info.c:138 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "navn: %s\n" -#: ../gio/gio-tool-info.c:145 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "type: %s\n" -#: ../gio/gio-tool-info.c:151 -#, c-format +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "størrelse: " -#: ../gio/gio-tool-info.c:156 -#, c-format +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "skjult\n" -#: ../gio/gio-tool-info.c:159 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: ../gio/gio-tool-info.c:228 +#: gio/gio-tool-info.c:214 #, c-format +msgid "local path: %s\n" +msgstr "" + +#: gio/gio-tool-info.c:248 +#, c-format +msgid "unix mount: %s%s %s %s %s\n" +msgstr "" + +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Attributter som kan settes:\n" -#: ../gio/gio-tool-info.c:252 -#, c-format +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Navneområder for skrivbar attributt:\n" -#: ../gio/gio-tool-info.c:287 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Vis informasjon om lokasjoner." -#: ../gio/gio-tool-info.c:289 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1835,23 +2008,70 @@ msgid "" "namespace, e.g. unix, or by “*”, which matches all attributes" msgstr "" -#: ../gio/gio-tool-list.c:36 ../gio/gio-tool-tree.c:32 +#. Translators: commandline placeholder +#: gio/gio-tool-launch.c:56 +msgid "DESKTOP-FILE [FILE-ARG …]" +msgstr "" + +#: gio/gio-tool-launch.c:59 +msgid "" +"Launch an application from a desktop file, passing optional filename " +"arguments to it." +msgstr "" + +#: gio/gio-tool-launch.c:79 +#, fuzzy +#| msgid "No destination given" +msgid "No desktop file given" +msgstr "Ingen mål oppgitt" + +#: gio/gio-tool-launch.c:87 +#, fuzzy +#| msgid "There is no GCredentials support for your platform" +msgid "The launch command is not currently supported on this platform" +msgstr "Det finnes ingen støtte for GCredentials for din plattform" + +#: gio/gio-tool-launch.c:100 +#, fuzzy, c-format +#| msgid "Unable to trash file %s: %s" +msgid "Unable to load ‘%s‘: %s" +msgstr "Kan ikke legge fil %s i papirkurven: %s" + +#: gio/gio-tool-launch.c:109 +#, fuzzy, c-format +#| msgid "Failed to load info for handler “%s”" +msgid "Unable to load application information for ‘%s‘" +msgstr "Klarte ikke å laste info for håndterer «%s»" + +#: gio/gio-tool-launch.c:121 +#, fuzzy, c-format +#| msgid "Default application for “%s”: %s\n" +msgid "Unable to launch application ‘%s’: %s" +msgstr "Forvalgt program for «%s»: %s\n" + +#: gio/gio-tool-list.c:38 gio/gio-tool-tree.c:34 msgid "Show hidden files" msgstr "Vis skjulte filer" -#: ../gio/gio-tool-list.c:37 +#: gio/gio-tool-list.c:39 msgid "Use a long listing format" msgstr "Bruk langt listeformat" -#: ../gio/gio-tool-list.c:39 +#: gio/gio-tool-list.c:41 +#, fuzzy +#| msgid "display name: %s\n" +msgid "Print display names" +msgstr "vis navn: %s\n" + +#: gio/gio-tool-list.c:42 msgid "Print full URIs" msgstr "Skriv ut fulle URIer" -#: ../gio/gio-tool-list.c:170 +#: gio/gio-tool-list.c:181 msgid "List the contents of the locations." msgstr "Vis innhold fra lokasjonene." -#: ../gio/gio-tool-list.c:172 +#: gio/gio-tool-list.c:183 msgid "" "gio list is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1860,442 +2080,550 @@ msgid "" msgstr "" #. Translators: commandline placeholder -#: ../gio/gio-tool-mime.c:71 +#: gio/gio-tool-mime.c:73 msgid "MIMETYPE" msgstr "MIMETYPE" -#: ../gio/gio-tool-mime.c:71 +#: gio/gio-tool-mime.c:73 msgid "HANDLER" msgstr "HÅNDTERER" -#: ../gio/gio-tool-mime.c:76 +#: gio/gio-tool-mime.c:78 msgid "Get or set the handler for a mimetype." msgstr "Hent eller sett håndterer for en MIME-type." -#: ../gio/gio-tool-mime.c:78 +#: gio/gio-tool-mime.c:80 msgid "" "If no handler is given, lists registered and recommended applications\n" "for the mimetype. If a handler is given, it is set as the default\n" "handler for the mimetype." msgstr "" -#: ../gio/gio-tool-mime.c:100 +#: gio/gio-tool-mime.c:102 msgid "Must specify a single mimetype, and maybe a handler" msgstr "Må oppgi en enkelt MIME-type og kanskje en håndterer" -#: ../gio/gio-tool-mime.c:116 +#: gio/gio-tool-mime.c:118 #, c-format msgid "No default applications for “%s”\n" msgstr "Ingen forvalgte programmer for «%s»\n" -#: ../gio/gio-tool-mime.c:122 +#: gio/gio-tool-mime.c:124 #, c-format msgid "Default application for “%s”: %s\n" msgstr "Forvalgt program for «%s»: %s\n" -#: ../gio/gio-tool-mime.c:127 -#, c-format +#: gio/gio-tool-mime.c:129 msgid "Registered applications:\n" msgstr "Registrerte programmer:\n" -#: ../gio/gio-tool-mime.c:129 -#, c-format +#: gio/gio-tool-mime.c:131 msgid "No registered applications\n" msgstr "Ingen registrerte programmer\n" -#: ../gio/gio-tool-mime.c:140 -#, c-format +#: gio/gio-tool-mime.c:142 msgid "Recommended applications:\n" msgstr "Anbefalte programmer:\n" -#: ../gio/gio-tool-mime.c:142 -#, c-format +#: gio/gio-tool-mime.c:144 msgid "No recommended applications\n" msgstr "Ingen anbefalte programmer\n" -#: ../gio/gio-tool-mime.c:162 +#: gio/gio-tool-mime.c:164 #, c-format msgid "Failed to load info for handler “%s”" msgstr "Klarte ikke å laste info for håndterer «%s»" -#: ../gio/gio-tool-mime.c:168 +#: gio/gio-tool-mime.c:170 #, c-format msgid "Failed to set “%s” as the default handler for “%s”: %s\n" msgstr "Klarte ikke å sette «%s» som forvalgt håndterer for «%s»: %s\n" -#: ../gio/gio-tool-mkdir.c:31 +#: gio/gio-tool-mkdir.c:33 msgid "Create parent directories" msgstr "Lag opphavsmapper" -#: ../gio/gio-tool-mkdir.c:52 +#: gio/gio-tool-mkdir.c:54 msgid "Create directories." msgstr "Lag kataloger." -#: ../gio/gio-tool-mkdir.c:54 +#: gio/gio-tool-mkdir.c:56 msgid "" "gio mkdir is similar to the traditional mkdir utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/mydir as location." msgstr "" -#: ../gio/gio-tool-monitor.c:37 +#: gio/gio-tool-monitor.c:39 msgid "Monitor a directory (default: depends on type)" msgstr "Overvåk en katalog (forvalg: avhenger av type)" -#: ../gio/gio-tool-monitor.c:39 +#: gio/gio-tool-monitor.c:41 msgid "Monitor a file (default: depends on type)" msgstr "Overvåk en fil (forvalg: avhenger av type)" -#: ../gio/gio-tool-monitor.c:41 +#: gio/gio-tool-monitor.c:43 msgid "Monitor a file directly (notices changes made via hardlinks)" msgstr "Overvåk en fil direkte (merker endringer gjort via harde lenker)" -#: ../gio/gio-tool-monitor.c:43 +#: gio/gio-tool-monitor.c:45 msgid "Monitors a file directly, but doesn’t report changes" msgstr "Overvåker en fil direkte, men rapporterer ikke endringer" -#: ../gio/gio-tool-monitor.c:45 +#: gio/gio-tool-monitor.c:47 msgid "Report moves and renames as simple deleted/created events" -msgstr "Rapporter flytting og endring av navn som enkle slette- og opprettelseshendelser" +msgstr "" +"Rapporter flytting og endring av navn som enkle slette- og " +"opprettelseshendelser" -#: ../gio/gio-tool-monitor.c:47 +#: gio/gio-tool-monitor.c:49 msgid "Watch for mount events" msgstr "Se etter monteringshendelser" -#: ../gio/gio-tool-monitor.c:208 +#: gio/gio-tool-monitor.c:211 msgid "Monitor files or directories for changes." msgstr "Overvåk filer eller kataloger for endringer." -#: ../gio/gio-tool-mount.c:58 +#: gio/gio-tool-mount.c:65 msgid "Mount as mountable" msgstr "Monter som monterbar" -#: ../gio/gio-tool-mount.c:59 -msgid "Mount volume with device file" +#: gio/gio-tool-mount.c:66 +#, fuzzy +#| msgid "Mount volume with device file" +msgid "Mount volume with device file, or other identifier" msgstr "Monter volum med en enhetsfil" -#: ../gio/gio-tool-mount.c:59 -msgid "DEVICE" -msgstr "ENHET" +#: gio/gio-tool-mount.c:66 +msgid "ID" +msgstr "" -#: ../gio/gio-tool-mount.c:60 +#: gio/gio-tool-mount.c:67 msgid "Unmount" msgstr "Avmonter" -#: ../gio/gio-tool-mount.c:61 +#: gio/gio-tool-mount.c:68 msgid "Eject" msgstr "Løs ut" -#: ../gio/gio-tool-mount.c:62 +#: gio/gio-tool-mount.c:69 +#, fuzzy +#| msgid "Mount volume with device file" +msgid "Stop drive with device file" +msgstr "Monter volum med en enhetsfil" + +#: gio/gio-tool-mount.c:69 +msgid "DEVICE" +msgstr "ENHET" + +#: gio/gio-tool-mount.c:70 msgid "Unmount all mounts with the given scheme" msgstr "Avmonter alle monteringspunkter med oppgitt schema" -#: ../gio/gio-tool-mount.c:62 +#: gio/gio-tool-mount.c:70 msgid "SCHEME" msgstr "SCHEMA" -#: ../gio/gio-tool-mount.c:63 +#: gio/gio-tool-mount.c:71 msgid "Ignore outstanding file operations when unmounting or ejecting" msgstr "Overse utestående filoperasjoner ved avmontering eller utløsing" -#: ../gio/gio-tool-mount.c:64 +#: gio/gio-tool-mount.c:72 msgid "Use an anonymous user when authenticating" msgstr "Bruk en anonym bruker ved autentisering" #. Translator: List here is a verb as in 'List all mounts' -#: ../gio/gio-tool-mount.c:66 +#: gio/gio-tool-mount.c:74 msgid "List" msgstr "Vis" -#: ../gio/gio-tool-mount.c:67 +#: gio/gio-tool-mount.c:75 msgid "Monitor events" msgstr "Overvåk hendelser" -#: ../gio/gio-tool-mount.c:68 +#: gio/gio-tool-mount.c:76 msgid "Show extra information" msgstr "Vis ekstra informasjon" -#: ../gio/gio-tool-mount.c:246 ../gio/gio-tool-mount.c:276 +#: gio/gio-tool-mount.c:77 +msgid "The numeric PIM when unlocking a VeraCrypt volume" +msgstr "" + +#: gio/gio-tool-mount.c:77 +#, fuzzy +#| msgctxt "GDateTime" +#| msgid "PM" +msgid "PIM" +msgstr "PM" + +#: gio/gio-tool-mount.c:78 +msgid "Mount a TCRYPT hidden volume" +msgstr "" + +#: gio/gio-tool-mount.c:79 +msgid "Mount a TCRYPT system volume" +msgstr "" + +#: gio/gio-tool-mount.c:276 gio/gio-tool-mount.c:308 msgid "Anonymous access denied" msgstr "Anonym tilgang nektet" -#: ../gio/gio-tool-mount.c:897 -#, c-format -msgid "Mounted %s at %s\n" -msgstr "Monterte %s under %s\n" - -#: ../gio/gio-tool-mount.c:950 -msgid "No volume for device file" +#: gio/gio-tool-mount.c:559 +#, fuzzy +#| msgid "No volume for device file" +msgid "No drive for device file" msgstr "Ingen volum for enhetsfil" -#: ../gio/gio-tool-mount.c:1145 +#: gio/gio-tool-mount.c:1051 +#, fuzzy +#| msgid "No volume for device file" +msgid "No volume for given ID" +msgstr "Ingen volum for enhetsfil" + +#: gio/gio-tool-mount.c:1240 msgid "Mount or unmount the locations." msgstr "M not allowed inside <%s>" msgstr "Element <%s> er ikke tillatt inne i <%s>" -#: ../gio/glib-compile-resources.c:146 +#: gio/glib-compile-resources.c:146 #, c-format msgid "Element <%s> not allowed at toplevel" msgstr "Element <%s> er ikke tillatt på toppnivå" -#: ../gio/glib-compile-resources.c:237 +#: gio/glib-compile-resources.c:236 #, c-format msgid "File %s appears multiple times in the resource" msgstr "Filen %s finnes flere ganger i ressursen" -#: ../gio/glib-compile-resources.c:248 +#: gio/glib-compile-resources.c:247 #, c-format msgid "Failed to locate “%s” in any source directory" msgstr "Klarte ikke å finne «%s» i noen kildekatalog" -#: ../gio/glib-compile-resources.c:259 +#: gio/glib-compile-resources.c:258 #, c-format msgid "Failed to locate “%s” in current directory" msgstr "Klarte ikke å finne «%s» i aktiv katalog" -#: ../gio/glib-compile-resources.c:290 +#: gio/glib-compile-resources.c:292 #, c-format msgid "Unknown processing option “%s”" msgstr "Ukjente flagg for preprosessering «%s»" -#: ../gio/glib-compile-resources.c:308 ../gio/glib-compile-resources.c:354 +#. Translators: the first %s is a gresource XML attribute, +#. * the second %s is an environment variable, and the third +#. * %s is a command line tool +#. +#: gio/glib-compile-resources.c:312 gio/glib-compile-resources.c:369 +#: gio/glib-compile-resources.c:426 #, c-format -msgid "Failed to create temp file: %s" -msgstr "Klarte ikke å opprette midlertidig fil: %s" +msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" +msgstr "" -#: ../gio/glib-compile-resources.c:382 +#: gio/glib-compile-resources.c:459 #, c-format msgid "Error reading file %s: %s" msgstr "Feil ved lesing av fil %s: %s" -#: ../gio/glib-compile-resources.c:402 +#: gio/glib-compile-resources.c:479 #, c-format msgid "Error compressing file %s" msgstr "Feil ved komprimering av fil %s" -#: ../gio/glib-compile-resources.c:469 +#: gio/glib-compile-resources.c:543 #, c-format msgid "text may not appear inside <%s>" msgstr "tekst kan ikke forekomme inne i <%s>" -#: ../gio/glib-compile-resources.c:664 ../gio/glib-compile-schemas.c:2067 +#: gio/glib-compile-resources.c:821 gio/glib-compile-schemas.c:2172 msgid "Show program version and exit" msgstr "Vis programmets versjon og avslutt" -#: ../gio/glib-compile-resources.c:665 -msgid "name of the output file" +#: gio/glib-compile-resources.c:822 +#, fuzzy +#| msgid "name of the output file" +msgid "Name of the output file" msgstr "navn på utdatafil" -#: ../gio/glib-compile-resources.c:666 +#: gio/glib-compile-resources.c:823 +#, fuzzy +#| msgid "" +#| "The directories where files are to be read from (default to current " +#| "directory)" msgid "" -"The directories where files are to be read from (default to current " +"The directories to load files referenced in FILE from (default: current " "directory)" msgstr "Kataloger filene skal leses fra (aktiv katalog er forvalgt)" -#: ../gio/glib-compile-resources.c:666 ../gio/glib-compile-schemas.c:2068 -#: ../gio/glib-compile-schemas.c:2096 +#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "KATALOG" -#: ../gio/glib-compile-resources.c:667 +#: gio/glib-compile-resources.c:824 msgid "" "Generate output in the format selected for by the target filename extension" msgstr "Lag utdata i formatet som er valgt for målets filtype" -#: ../gio/glib-compile-resources.c:668 +#: gio/glib-compile-resources.c:825 msgid "Generate source header" msgstr "Lag hode for kildekode" -#: ../gio/glib-compile-resources.c:669 -msgid "Generate sourcecode used to link in the resource file into your code" +#: gio/glib-compile-resources.c:826 +#, fuzzy +#| msgid "Generate sourcecode used to link in the resource file into your code" +msgid "Generate source code used to link in the resource file into your code" msgstr "Lag kildekode som skal brukes til å lenke inn ressursfilen i din kode" -#: ../gio/glib-compile-resources.c:670 +#: gio/glib-compile-resources.c:827 msgid "Generate dependency list" msgstr "Lag listet med avhengigheter" -#: ../gio/glib-compile-resources.c:671 -msgid "name of the dependency file to generate" +#: gio/glib-compile-resources.c:828 +#, fuzzy +#| msgid "name of the dependency file to generate" +msgid "Name of the dependency file to generate" msgstr "navn på avhengighetsfil som skal lages" -#: ../gio/glib-compile-resources.c:672 +#: gio/glib-compile-resources.c:829 msgid "Include phony targets in the generated dependency file" msgstr "" -#: ../gio/glib-compile-resources.c:673 +#: gio/glib-compile-resources.c:830 msgid "Don’t automatically create and register resource" msgstr "Ikke lag og registrer ressursen automatisk" -#: ../gio/glib-compile-resources.c:674 +#: gio/glib-compile-resources.c:831 msgid "Don’t export functions; declare them G_GNUC_INTERNAL" msgstr "Ikke ekporter funksjoner. Deklarer dem som G_GNUC_INTERNAL" -#: ../gio/glib-compile-resources.c:675 +#: gio/glib-compile-resources.c:832 +msgid "" +"Don’t embed resource data in the C file; assume it's linked externally " +"instead" +msgstr "" + +#: gio/glib-compile-resources.c:833 msgid "C identifier name used for the generated source code" msgstr "Navn på C-identifikator som brukes for generert kildekode" -#: ../gio/glib-compile-resources.c:701 +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "" + +#: gio/glib-compile-resources.c:834 +msgid "The target C compiler (default: the CC environment variable)" +msgstr "" + +#: gio/glib-compile-resources.c:861 msgid "" "Compile a resource specification into a resource file.\n" "Resource specification files have the extension .gresource.xml,\n" @@ -2305,169 +2633,168 @@ msgstr "" "Ressursspesifikasjonsfiler har type .gresource.xml,\n" "og ressufsfilen har etternavn .gresource." -#: ../gio/glib-compile-resources.c:723 -#, c-format +#: gio/glib-compile-resources.c:893 msgid "You should give exactly one file name\n" msgstr "Du må kun oppgi ett filnavn\n" -#: ../gio/glib-compile-schemas.c:95 +#: gio/glib-compile-schemas.c:95 #, c-format msgid "nick must be a minimum of 2 characters" msgstr "kallenavn må være minst 2 tegn" -#: ../gio/glib-compile-schemas.c:106 +#: gio/glib-compile-schemas.c:106 #, c-format msgid "Invalid numeric value" msgstr "Ugyldig numerisk verdi" -#: ../gio/glib-compile-schemas.c:114 +#: gio/glib-compile-schemas.c:114 #, c-format msgid " already specified" msgstr " er allerede spesifisert" -#: ../gio/glib-compile-schemas.c:122 +#: gio/glib-compile-schemas.c:122 #, c-format msgid "value='%s' already specified" msgstr "value='%s' er allerede oppgitt" -#: ../gio/glib-compile-schemas.c:136 +#: gio/glib-compile-schemas.c:136 #, c-format msgid "flags values must have at most 1 bit set" msgstr "" -#: ../gio/glib-compile-schemas.c:161 +#: gio/glib-compile-schemas.c:161 #, c-format msgid "<%s> must contain at least one " msgstr "<%s> må inneholde minst en " -#: ../gio/glib-compile-schemas.c:315 +#: gio/glib-compile-schemas.c:317 #, c-format msgid "<%s> is not contained in the specified range" msgstr "<%s> finnes ikke i oppgitt område" -#: ../gio/glib-compile-schemas.c:327 +#: gio/glib-compile-schemas.c:329 #, c-format msgid "<%s> is not a valid member of the specified enumerated type" msgstr "" -#: ../gio/glib-compile-schemas.c:333 +#: gio/glib-compile-schemas.c:335 #, c-format msgid "<%s> contains string not in the specified flags type" msgstr "" -#: ../gio/glib-compile-schemas.c:339 +#: gio/glib-compile-schemas.c:341 #, c-format msgid "<%s> contains a string not in " msgstr "" -#: ../gio/glib-compile-schemas.c:373 +#: gio/glib-compile-schemas.c:375 msgid " already specified for this key" msgstr " er allerede oppgitt for denne nøkkelen" -#: ../gio/glib-compile-schemas.c:391 +#: gio/glib-compile-schemas.c:393 #, c-format msgid " not allowed for keys of type “%s”" msgstr "" -#: ../gio/glib-compile-schemas.c:408 +#: gio/glib-compile-schemas.c:410 #, c-format msgid " specified minimum is greater than maximum" msgstr "" -#: ../gio/glib-compile-schemas.c:433 +#: gio/glib-compile-schemas.c:435 #, c-format msgid "unsupported l10n category: %s" msgstr "" -#: ../gio/glib-compile-schemas.c:441 +#: gio/glib-compile-schemas.c:443 msgid "l10n requested, but no gettext domain given" msgstr "" -#: ../gio/glib-compile-schemas.c:453 +#: gio/glib-compile-schemas.c:455 msgid "translation context given for value without l10n enabled" msgstr "" -#: ../gio/glib-compile-schemas.c:475 +#: gio/glib-compile-schemas.c:477 #, c-format msgid "Failed to parse value of type “%s”: " msgstr "Klarte ikke å tolke verdi av type «%s»: " -#: ../gio/glib-compile-schemas.c:492 +#: gio/glib-compile-schemas.c:494 msgid "" " cannot be specified for keys tagged as having an enumerated type" msgstr "" -#: ../gio/glib-compile-schemas.c:501 +#: gio/glib-compile-schemas.c:503 msgid " already specified for this key" msgstr " allerede oppgitt for denne nøkkelen" -#: ../gio/glib-compile-schemas.c:513 +#: gio/glib-compile-schemas.c:515 #, c-format msgid " not allowed for keys of type “%s”" msgstr " ikke tillatt for nøkler av type «%s»" -#: ../gio/glib-compile-schemas.c:529 +#: gio/glib-compile-schemas.c:531 #, c-format msgid " already given" msgstr " allerede oppgitt" -#: ../gio/glib-compile-schemas.c:544 +#: gio/glib-compile-schemas.c:546 #, c-format msgid " must contain at least one " msgstr "" -#: ../gio/glib-compile-schemas.c:558 +#: gio/glib-compile-schemas.c:560 msgid " already specified for this key" msgstr " er allerede oppgitt for denne nøkkelen" -#: ../gio/glib-compile-schemas.c:562 +#: gio/glib-compile-schemas.c:564 msgid "" " can only be specified for keys with enumerated or flags types or " "after " msgstr "" -#: ../gio/glib-compile-schemas.c:581 +#: gio/glib-compile-schemas.c:583 #, c-format msgid "" " given when “%s” is already a member of the enumerated " "type" msgstr "" -#: ../gio/glib-compile-schemas.c:587 +#: gio/glib-compile-schemas.c:589 #, c-format msgid " given when was already given" msgstr "" -#: ../gio/glib-compile-schemas.c:595 +#: gio/glib-compile-schemas.c:597 #, c-format msgid " already specified" msgstr " er allerede spesifisert" -#: ../gio/glib-compile-schemas.c:605 +#: gio/glib-compile-schemas.c:607 #, c-format msgid "alias target “%s” is not in enumerated type" msgstr "alias target «%s» er ikke i opplistet type" -#: ../gio/glib-compile-schemas.c:606 +#: gio/glib-compile-schemas.c:608 #, c-format msgid "alias target “%s” is not in " msgstr "" -#: ../gio/glib-compile-schemas.c:621 +#: gio/glib-compile-schemas.c:623 #, c-format msgid " must contain at least one " msgstr " må inneholde minst ett " -#: ../gio/glib-compile-schemas.c:786 +#: gio/glib-compile-schemas.c:797 msgid "Empty names are not permitted" msgstr "Tomme navn er ikke tillatt" -#: ../gio/glib-compile-schemas.c:796 +#: gio/glib-compile-schemas.c:807 #, c-format msgid "Invalid name “%s”: names must begin with a lowercase letter" msgstr "Ugyldig navn «%s»: navn må starte med liten bokstav" -#: ../gio/glib-compile-schemas.c:808 +#: gio/glib-compile-schemas.c:819 #, c-format msgid "" "Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers " @@ -2476,37 +2803,37 @@ msgstr "" "Ugyldig navn «%s»: ugyldig tegn «%c»; kun små bokstaver, tall og bindestrek " "(«-») er tillatt" -#: ../gio/glib-compile-schemas.c:817 +#: gio/glib-compile-schemas.c:828 #, c-format msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" msgstr "" "Ugyldig navn «%s»: to etterfølgende bindestreker («--») er ikke tillatt" -#: ../gio/glib-compile-schemas.c:826 +#: gio/glib-compile-schemas.c:837 #, c-format msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)" msgstr "Ugyldig navn «%s»: siste tegn kan ikke være en bindestrek («-»)" -#: ../gio/glib-compile-schemas.c:834 +#: gio/glib-compile-schemas.c:845 #, c-format msgid "Invalid name “%s”: maximum length is 1024" msgstr "Ugyldig navn «%s»: maksimal lengde er 1024" -#: ../gio/glib-compile-schemas.c:904 +#: gio/glib-compile-schemas.c:917 #, c-format msgid " already specified" msgstr " allerede oppgitt" -#: ../gio/glib-compile-schemas.c:930 +#: gio/glib-compile-schemas.c:943 msgid "Cannot add keys to a “list-of” schema" msgstr "Kan ikke legge til nøkler i et «list-of»-schema" -#: ../gio/glib-compile-schemas.c:941 +#: gio/glib-compile-schemas.c:954 #, c-format msgid " already specified" msgstr " allerede oppgitt" -#: ../gio/glib-compile-schemas.c:959 +#: gio/glib-compile-schemas.c:972 #, c-format msgid "" " shadows in ; use " @@ -2515,7 +2842,7 @@ msgstr "" " overskygger i ; bruk " " for å endre verdien" -#: ../gio/glib-compile-schemas.c:970 +#: gio/glib-compile-schemas.c:983 #, c-format msgid "" "Exactly one of “type”, “enum” or “flags” must be specified as an attribute " @@ -2524,56 +2851,56 @@ msgstr "" "Eksakt en av 'type', 'enum' eller 'flags' må oppgis som en attributt for " "" -#: ../gio/glib-compile-schemas.c:989 +#: gio/glib-compile-schemas.c:1002 #, c-format msgid "<%s id='%s'> not (yet) defined." msgstr "<%s id='%s'>ikke definert ennå." -#: ../gio/glib-compile-schemas.c:1004 +#: gio/glib-compile-schemas.c:1017 #, c-format msgid "Invalid GVariant type string “%s”" msgstr "Ugyldig GVariant-typestreng «%s»" -#: ../gio/glib-compile-schemas.c:1034 +#: gio/glib-compile-schemas.c:1047 msgid " given but schema isn’t extending anything" msgstr " ble gitt men schema utvider ingenting" -#: ../gio/glib-compile-schemas.c:1047 +#: gio/glib-compile-schemas.c:1060 #, c-format msgid "No to override" msgstr "Ingen å overstyre" -#: ../gio/glib-compile-schemas.c:1055 +#: gio/glib-compile-schemas.c:1068 #, c-format msgid " already specified" msgstr " allerede oppgitt" -#: ../gio/glib-compile-schemas.c:1128 +#: gio/glib-compile-schemas.c:1141 #, c-format msgid " already specified" msgstr " allerede oppgitt" -#: ../gio/glib-compile-schemas.c:1140 +#: gio/glib-compile-schemas.c:1153 #, c-format msgid " extends not yet existing schema “%s”" msgstr " utvider et schema som ikke eksisterer ennå «%s»" -#: ../gio/glib-compile-schemas.c:1156 +#: gio/glib-compile-schemas.c:1169 #, c-format msgid " is list of not yet existing schema “%s”" msgstr " er en liste med schema som ikke eksisterer ennå «%s»" -#: ../gio/glib-compile-schemas.c:1164 +#: gio/glib-compile-schemas.c:1177 #, c-format msgid "Cannot be a list of a schema with a path" msgstr "Kan ikke være en liste av et schema med en sti" -#: ../gio/glib-compile-schemas.c:1174 +#: gio/glib-compile-schemas.c:1187 #, c-format msgid "Cannot extend a schema with a path" msgstr "Kan ikke utvide et schema med en sti" -#: ../gio/glib-compile-schemas.c:1184 +#: gio/glib-compile-schemas.c:1197 #, c-format msgid "" " is a list, extending which is not a list" @@ -2581,7 +2908,7 @@ msgstr "" " er en liste som utvider som ikke er en " "liste" -#: ../gio/glib-compile-schemas.c:1194 +#: gio/glib-compile-schemas.c:1207 #, c-format msgid "" " extends but “%s” " @@ -2590,134 +2917,192 @@ msgstr "" " utvider men «%s» " "utvider ikke «%s»" -#: ../gio/glib-compile-schemas.c:1211 +#: gio/glib-compile-schemas.c:1224 #, c-format msgid "A path, if given, must begin and end with a slash" msgstr "Hvis en sti oppgis må denne begynne med «slash»" -#: ../gio/glib-compile-schemas.c:1218 +#: gio/glib-compile-schemas.c:1231 #, c-format msgid "The path of a list must end with “:/”" msgstr "Stien for en liste må slutte med «:/»" -#: ../gio/glib-compile-schemas.c:1227 +#: gio/glib-compile-schemas.c:1240 #, c-format msgid "" "Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/" "desktop/” or “/system/” are deprecated." msgstr "" -#: ../gio/glib-compile-schemas.c:1257 +#: gio/glib-compile-schemas.c:1270 #, c-format msgid "<%s id='%s'> already specified" msgstr "<%s id='%s'> er allerede spesifisert" -#: ../gio/glib-compile-schemas.c:1407 ../gio/glib-compile-schemas.c:1423 +#: gio/glib-compile-schemas.c:1420 gio/glib-compile-schemas.c:1436 #, c-format msgid "Only one <%s> element allowed inside <%s>" msgstr "Kun ett <%s>-element er tillatt inne i <%s>" -#: ../gio/glib-compile-schemas.c:1505 +#: gio/glib-compile-schemas.c:1518 #, c-format msgid "Element <%s> not allowed at the top level" msgstr "Element <%s> er ikke tillatt på toppnivå" -#: ../gio/glib-compile-schemas.c:1523 +#: gio/glib-compile-schemas.c:1536 msgid "Element is required in " msgstr "" -#: ../gio/glib-compile-schemas.c:1613 +#: gio/glib-compile-schemas.c:1626 #, c-format msgid "Text may not appear inside <%s>" msgstr "Tekst kan ikke forekomme inne i <%s>" -#: ../gio/glib-compile-schemas.c:1681 +#: gio/glib-compile-schemas.c:1694 #, c-format msgid "Warning: undefined reference to " msgstr "" #. Translators: Do not translate "--strict". -#: ../gio/glib-compile-schemas.c:1820 ../gio/glib-compile-schemas.c:1894 -#: ../gio/glib-compile-schemas.c:1970 -#, c-format -msgid "--strict was specified; exiting.\n" +#: gio/glib-compile-schemas.c:1833 gio/glib-compile-schemas.c:1912 +#, fuzzy +#| msgid "--strict was specified; exiting.\n" +msgid "--strict was specified; exiting." msgstr "--strict ble oppgitt; avslutter.\n" -#: ../gio/glib-compile-schemas.c:1830 -#, c-format -msgid "This entire file has been ignored.\n" +#: gio/glib-compile-schemas.c:1845 +#, fuzzy +#| msgid "This entire file has been ignored.\n" +msgid "This entire file has been ignored." msgstr "Hele filen ble ignorert.\n" -#: ../gio/glib-compile-schemas.c:1890 -#, c-format -msgid "Ignoring this file.\n" +#: gio/glib-compile-schemas.c:1908 +#, fuzzy +#| msgid "Ignoring this file.\n" +msgid "Ignoring this file." msgstr "Ignorerer denne filen.\n" -#: ../gio/glib-compile-schemas.c:1930 -#, c-format -msgid "No such key '%s' in schema '%s' as specified in override file '%s'" +#: gio/glib-compile-schemas.c:1963 +#, fuzzy, c-format +#| msgid "No such key '%s' in schema '%s' as specified in override file '%s'" +msgid "" +"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " +"override for this key." msgstr "Ingen nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil «%s»" -#: ../gio/glib-compile-schemas.c:1936 ../gio/glib-compile-schemas.c:1994 -#: ../gio/glib-compile-schemas.c:2022 -#, c-format -msgid "; ignoring override for this key.\n" -msgstr "; ignorerer overstyring for denne nøkkelen.\n" +#: gio/glib-compile-schemas.c:1971 +#, fuzzy, c-format +#| msgid "No such key '%s' in schema '%s' as specified in override file '%s'" +msgid "" +"No such key “%s” in schema “%s” as specified in override file “%s” and --" +"strict was specified; exiting." +msgstr "Ingen nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil «%s»" -#: ../gio/glib-compile-schemas.c:1940 ../gio/glib-compile-schemas.c:1998 -#: ../gio/glib-compile-schemas.c:2026 -#, c-format -msgid " and --strict was specified; exiting.\n" -msgstr " og --strict ble oppgitt; avslutter.\n" - -#: ../gio/glib-compile-schemas.c:1956 +#: gio/glib-compile-schemas.c:1993 #, c-format msgid "" -"error parsing key '%s' in schema '%s' as specified in override file '%s': %s." +"Cannot provide per-desktop overrides for localized key “%s” in schema " +"“%s” (override file “%s”); ignoring override for this key." +msgstr "" + +#: gio/glib-compile-schemas.c:2002 +#, c-format +msgid "" +"Cannot provide per-desktop overrides for localized key “%s” in schema " +"“%s” (override file “%s”) and --strict was specified; exiting." +msgstr "" + +#: gio/glib-compile-schemas.c:2026 +#, fuzzy, c-format +#| msgid "" +#| "error parsing key '%s' in schema '%s' as specified in override file '%s': " +#| "%s." +msgid "" +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " +"%s. Ignoring override for this key." msgstr "" "feil ved lesing av nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil " "«%s»: %s. " -#: ../gio/glib-compile-schemas.c:1966 -#, c-format -msgid "Ignoring override for this key.\n" -msgstr "Ignorerer overstyring for denne nøkkelen.\n" - -#: ../gio/glib-compile-schemas.c:1984 -#, c-format +#: gio/glib-compile-schemas.c:2038 +#, fuzzy, c-format +#| msgid "" +#| "error parsing key '%s' in schema '%s' as specified in override file '%s': " +#| "%s." msgid "" -"override for key '%s' in schema '%s' in override file '%s' is outside the " -"range given in the schema" +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " +"%s. --strict was specified; exiting." +msgstr "" +"feil ved lesing av nøkkel «%s» i skjema «%s» som oppgitt i overstyringsfil " +"«%s»: %s. " + +#: gio/glib-compile-schemas.c:2065 +#, fuzzy, c-format +#| msgid "" +#| "override for key '%s' in schema '%s' in override file '%s' is outside the " +#| "range given in the schema" +msgid "" +"Override for key “%s” in schema “%s” in override file “%s” is outside the " +"range given in the schema; ignoring override for this key." msgstr "" "overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er utenfor " "området som er oppgitt i skjema" -#: ../gio/glib-compile-schemas.c:2012 -#, c-format +#: gio/glib-compile-schemas.c:2075 +#, fuzzy, c-format +#| msgid "" +#| "override for key '%s' in schema '%s' in override file '%s' is outside the " +#| "range given in the schema" msgid "" -"override for key '%s' in schema '%s' in override file '%s' is not in the " -"list of valid choices" +"Override for key “%s” in schema “%s” in override file “%s” is outside the " +"range given in the schema and --strict was specified; exiting." +msgstr "" +"overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er utenfor " +"området som er oppgitt i skjema" + +#: gio/glib-compile-schemas.c:2101 +#, fuzzy, c-format +#| msgid "" +#| "override for key '%s' in schema '%s' in override file '%s' is not in the " +#| "list of valid choices" +msgid "" +"Override for key “%s” in schema “%s” in override file “%s” is not in the " +"list of valid choices; ignoring override for this key." msgstr "" "overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er ikke i " "listen med gyldige valg" -#: ../gio/glib-compile-schemas.c:2068 -msgid "where to store the gschemas.compiled file" +#: gio/glib-compile-schemas.c:2111 +#, fuzzy, c-format +#| msgid "" +#| "override for key '%s' in schema '%s' in override file '%s' is not in the " +#| "list of valid choices" +msgid "" +"Override for key “%s” in schema “%s” in override file “%s” is not in the " +"list of valid choices and --strict was specified; exiting." +msgstr "" +"overstyring for nøkkel «%s» i skjema «%s» i overstyringsfil «%s» er ikke i " +"listen med gyldige valg" + +#: gio/glib-compile-schemas.c:2173 +#, fuzzy +#| msgid "where to store the gschemas.compiled file" +msgid "Where to store the gschemas.compiled file" msgstr "gschemas.compiled filen lagres her" -#: ../gio/glib-compile-schemas.c:2069 +#: gio/glib-compile-schemas.c:2174 msgid "Abort on any errors in schemas" msgstr "Avbryt ved feil i schema" -#: ../gio/glib-compile-schemas.c:2070 +#: gio/glib-compile-schemas.c:2175 msgid "Do not write the gschema.compiled file" msgstr "Ikke skriv filen gschema.compiled" -#: ../gio/glib-compile-schemas.c:2071 +#: gio/glib-compile-schemas.c:2176 msgid "Do not enforce key name restrictions" msgstr "Ikke sett restriksjoner på navn på nøkler" -#: ../gio/glib-compile-schemas.c:2099 +#: gio/glib-compile-schemas.c:2206 msgid "" "Compile all GSettings schema files into a schema cache.\n" "Schema files are required to have the extension .gschema.xml,\n" @@ -2727,32 +3112,30 @@ msgstr "" "Skjemafiler må ha type .gschema.xml, og mellomlagerfilen\n" "kalles gschemas.compiled." -#: ../gio/glib-compile-schemas.c:2120 -#, c-format -msgid "You should give exactly one directory name\n" +#: gio/glib-compile-schemas.c:2238 +#, fuzzy +#| msgid "You should give exactly one directory name\n" +msgid "You should give exactly one directory name" msgstr "Du må kun oppgi navn på én katalog\n" -#: ../gio/glib-compile-schemas.c:2162 -#, c-format -msgid "No schema files found: " +#: gio/glib-compile-schemas.c:2285 +#, fuzzy +#| msgid "No schema files found: " +msgid "No schema files found: doing nothing." msgstr "Ingen schema-filer funnet: " -#: ../gio/glib-compile-schemas.c:2165 -#, c-format -msgid "doing nothing.\n" -msgstr "gjør ingenting.\n" - -#: ../gio/glib-compile-schemas.c:2168 -#, c-format -msgid "removed existing output file.\n" +#: gio/glib-compile-schemas.c:2287 +#, fuzzy +#| msgid "removed existing output file.\n" +msgid "No schema files found: removed existing output file." msgstr "fjernet eksisterende utdatafil.\n" -#: ../gio/glocalfile.c:643 ../gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:570 gio/win32/gwinhttpfile.c:436 #, c-format msgid "Invalid filename %s" msgstr "Ugyldig filnavn %s" -#: ../gio/glocalfile.c:1039 +#: gio/glocalfile.c:1012 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "Feil under lesing av informasjon om filsystem %s: %s" @@ -2761,313 +3144,357 @@ msgstr "Feil under lesing av informasjon om filsystem %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: ../gio/glocalfile.c:1178 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Fant ikke omsluttende monteringspunkt for fil %s" -#: ../gio/glocalfile.c:1201 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Kan ikke endre navn på rotkatalogen" -#: ../gio/glocalfile.c:1219 ../gio/glocalfile.c:1242 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Feil ved endring av navn på fil %s: %s" -#: ../gio/glocalfile.c:1226 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Kan ikke endre navn på filen. Filnavnet eksisterer allerede" -#: ../gio/glocalfile.c:1239 ../gio/glocalfile.c:2256 ../gio/glocalfile.c:2284 -#: ../gio/glocalfile.c:2441 ../gio/glocalfileoutputstream.c:551 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Ugyldig filnavn" -#: ../gio/glocalfile.c:1407 ../gio/glocalfile.c:1422 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Feil under åpning av fil %s: %s" -#: ../gio/glocalfile.c:1547 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Feil ved fjerning av fil %s: %s" -#: ../gio/glocalfile.c:1931 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Feil ved plassering av fil %s i papirkurv : %s" -#: ../gio/glocalfile.c:1954 -#, c-format -msgid "Unable to create trash dir %s: %s" +#: gio/glocalfile.c:2067 +#, fuzzy, c-format +#| msgid "Unable to create trash dir %s: %s" +msgid "Unable to create trash directory %s: %s" msgstr "Kan ikke legge katalog %s i papirkurven: %s" -#: ../gio/glocalfile.c:1974 +#: gio/glocalfile.c:2088 #, fuzzy, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Kan ikke finne toppnivå for papirkurv" -#: ../gio/glocalfile.c:2053 ../gio/glocalfile.c:2073 -#, c-format -msgid "Unable to find or create trash directory for %s" +#: gio/glocalfile.c:2096 +#, fuzzy, c-format +#| msgid "Copy (reflink/clone) between mounts is not supported" +msgid "Trashing on system internal mounts is not supported" +msgstr "Kopiering (reflink/clone) mellom monteringspunkter er ikke støttet" + +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 +#, fuzzy, c-format +#| msgid "Unable to find or create trash directory for %s" +msgid "Unable to find or create trash directory %s to trash %s" msgstr "Kan ikke finne eller opprette mappe for papirkurv for %s" -#: ../gio/glocalfile.c:2108 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Kan ikke opprette informasjonsfil for papirkurv for %s: %s" -#: ../gio/glocalfile.c:2167 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Kan ikke legge fil %s i papirkurven på tvers av filsystemgrenser" -#: ../gio/glocalfile.c:2171 ../gio/glocalfile.c:2227 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Kan ikke legge fil %s i papirkurven: %s" -#: ../gio/glocalfile.c:2233 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Kan ikke legge fil %s i papirkurven" -#: ../gio/glocalfile.c:2259 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Feil under oppretting av katalog %s: %s" -#: ../gio/glocalfile.c:2288 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Filsystemet støtter ikke symbolske lenker" -#: ../gio/glocalfile.c:2291 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Feil ved oppretting av symbolsk lenke %s: %s" -#: ../gio/glocalfile.c:2297 ../glib/gfileutils.c:2101 -msgid "Symbolic links not supported" -msgstr "Symbolske lenker er ikke støttet" - -#: ../gio/glocalfile.c:2352 ../gio/glocalfile.c:2387 ../gio/glocalfile.c:2444 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Feil under flytting av fil %s: %s" -#: ../gio/glocalfile.c:2375 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Kan ikke flytte katalog over katalog" -#: ../gio/glocalfile.c:2401 ../gio/glocalfileoutputstream.c:935 -#: ../gio/glocalfileoutputstream.c:949 ../gio/glocalfileoutputstream.c:964 -#: ../gio/glocalfileoutputstream.c:981 ../gio/glocalfileoutputstream.c:995 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 +#: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Oppretting av sikkerhetskopi feilet" -#: ../gio/glocalfile.c:2420 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Feil under fjerning av målfil: %s" -#: ../gio/glocalfile.c:2434 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Flytting mellom monteringspunkter er ikke støttet" -#: ../gio/glocalfile.c:2625 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Kunne ikke bestemme diskbruk for %s: %s" -#: ../gio/glocalfileinfo.c:742 +#: gio/glocalfileinfo.c:765 msgid "Attribute value must be non-NULL" msgstr "Attributtverdi må ikke være NULL" -#: ../gio/glocalfileinfo.c:749 -msgid "Invalid attribute type (string expected)" +#: gio/glocalfileinfo.c:772 +#, fuzzy +#| msgid "Invalid attribute type (string expected)" +msgid "Invalid attribute type (string or invalid expected)" msgstr "Ugyldig type attributt (streng forventet)" -#: ../gio/glocalfileinfo.c:756 +#: gio/glocalfileinfo.c:779 msgid "Invalid extended attribute name" msgstr "Ugyldig navn på utvidet attributt" -#: ../gio/glocalfileinfo.c:796 +#: gio/glocalfileinfo.c:830 #, c-format msgid "Error setting extended attribute “%s”: %s" msgstr "Feil under setting av utvidet attributt «%s»: %s" -#: ../gio/glocalfileinfo.c:1604 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (ugyldig koding)" -#: ../gio/glocalfileinfo.c:1773 ../gio/glocalfileoutputstream.c:813 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Feil ved henting av informasjon for fil «%s»: %s" -#: ../gio/glocalfileinfo.c:2031 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Feil ved henting av informasjon om fildeskriptor: %s" -#: ../gio/glocalfileinfo.c:2076 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Ugyldig type attributt (uint32 forventet)" -#: ../gio/glocalfileinfo.c:2094 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Ugyldig type attributt (uint64 forventet)" -#: ../gio/glocalfileinfo.c:2113 ../gio/glocalfileinfo.c:2132 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Ugyldig type attributt (byte-streng forventet)" -#: ../gio/glocalfileinfo.c:2177 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Kan ikke sette rettigheter på symbolske lenker" -#: ../gio/glocalfileinfo.c:2193 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Feil ved setting av rettigheter: %s" -#: ../gio/glocalfileinfo.c:2244 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Feil ved setting av eier: %s" -#: ../gio/glocalfileinfo.c:2267 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symbolsk lenke kan ikke være NULL" -#: ../gio/glocalfileinfo.c:2277 ../gio/glocalfileinfo.c:2296 -#: ../gio/glocalfileinfo.c:2307 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Feil ved setting av symbolsk lenke: %s" -#: ../gio/glocalfileinfo.c:2286 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Feil ved setting av symbolsk lenke: filen er ikke en symbolsk lenke" -#: ../gio/glocalfileinfo.c:2412 +#: gio/glocalfileinfo.c:2603 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" +msgstr "" + +#: gio/glocalfileinfo.c:2612 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" +msgstr "" + +#: gio/glocalfileinfo.c:2622 +#, c-format +msgid "UNIX timestamp %lld does not fit into 64 bits" +msgstr "" + +#: gio/glocalfileinfo.c:2633 +#, c-format +msgid "UNIX timestamp %lld is outside of the range supported by Windows" +msgstr "" + +#: gio/glocalfileinfo.c:2765 +#, fuzzy, c-format +#| msgid "Value “%s” cannot be interpreted as a number." +msgid "File name “%s” cannot be converted to UTF-16" +msgstr "Vedi «%s» kan ikke tolkes som et tall." + +#: gio/glocalfileinfo.c:2784 +#, fuzzy, c-format +#| msgid "Value “%s” cannot be interpreted as a number." +msgid "File “%s” cannot be opened: Windows Error %lu" +msgstr "Vedi «%s» kan ikke tolkes som et tall." + +#: gio/glocalfileinfo.c:2797 +#, fuzzy, c-format +#| msgid "Error setting modification or access time: %s" +msgid "Error setting modification or access time for file “%s”: %lu" +msgstr "Feil ved setting av endrings- eller aksesstid: %s" + +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Feil ved setting av endrings- eller aksesstid: %s" -#: ../gio/glocalfileinfo.c:2435 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux-kontekst kan ikke være NULL" -#: ../gio/glocalfileinfo.c:2450 +#: gio/glocalfileinfo.c:3004 +msgid "SELinux is not enabled on this system" +msgstr "SELinux er ikke slått på på dette systemet" + +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Feil ved setting av SELinux-kontekst: %s" -#: ../gio/glocalfileinfo.c:2457 -msgid "SELinux is not enabled on this system" -msgstr "SELinux er ikke slått på på dette systemet" - -#: ../gio/glocalfileinfo.c:2549 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Støtter ikke å sette attributt %s" -#: ../gio/glocalfileinputstream.c:168 ../gio/glocalfileoutputstream.c:696 +#: gio/glocalfileinputstream.c:165 gio/glocalfileoutputstream.c:803 #, c-format msgid "Error reading from file: %s" msgstr "Feil under lesing fra fil: %s" -#: ../gio/glocalfileinputstream.c:199 ../gio/glocalfileinputstream.c:211 -#: ../gio/glocalfileinputstream.c:225 ../gio/glocalfileinputstream.c:333 -#: ../gio/glocalfileoutputstream.c:458 ../gio/glocalfileoutputstream.c:1013 -#, c-format -msgid "Error seeking in file: %s" -msgstr "Feil under søking i fil: %s" - -#: ../gio/glocalfileinputstream.c:255 ../gio/glocalfileoutputstream.c:248 -#: ../gio/glocalfileoutputstream.c:342 +#: gio/glocalfileinputstream.c:196 gio/glocalfileoutputstream.c:355 +#: gio/glocalfileoutputstream.c:449 #, c-format msgid "Error closing file: %s" msgstr "Feil under lukking av fil: %s" -#: ../gio/glocalfilemonitor.c:840 +#: gio/glocalfileinputstream.c:274 gio/glocalfileoutputstream.c:565 +#: gio/glocalfileoutputstream.c:1188 +#, c-format +msgid "Error seeking in file: %s" +msgstr "Feil under søking i fil: %s" + +#: gio/glocalfilemonitor.c:882 msgid "Unable to find default local file monitor type" msgstr "Kan ikke finne forvalgt lokal filovervåkingstype" -#: ../gio/glocalfileoutputstream.c:196 ../gio/glocalfileoutputstream.c:228 -#: ../gio/glocalfileoutputstream.c:717 +#: gio/glocalfileoutputstream.c:222 gio/glocalfileoutputstream.c:300 +#: gio/glocalfileoutputstream.c:336 gio/glocalfileoutputstream.c:824 #, c-format msgid "Error writing to file: %s" msgstr "Feil under skriving til fil: %s" -#: ../gio/glocalfileoutputstream.c:275 +#: gio/glocalfileoutputstream.c:382 #, c-format msgid "Error removing old backup link: %s" msgstr "Feil ved fjerning av gammel sikkerhetskopi av lenke: %s" -#: ../gio/glocalfileoutputstream.c:289 ../gio/glocalfileoutputstream.c:302 +#: gio/glocalfileoutputstream.c:396 gio/glocalfileoutputstream.c:409 #, c-format msgid "Error creating backup copy: %s" msgstr "Feil under oppretting av sikkerhetskopi: %s" -#: ../gio/glocalfileoutputstream.c:320 +#: gio/glocalfileoutputstream.c:427 #, c-format msgid "Error renaming temporary file: %s" msgstr "Feil ved endring av navn på midlertidig fil: %s" -#: ../gio/glocalfileoutputstream.c:504 ../gio/glocalfileoutputstream.c:1064 +#: gio/glocalfileoutputstream.c:611 gio/glocalfileoutputstream.c:1242 #, c-format msgid "Error truncating file: %s" msgstr "Feil under avkorting av fil: %s" -#: ../gio/glocalfileoutputstream.c:557 ../gio/glocalfileoutputstream.c:795 -#: ../gio/glocalfileoutputstream.c:1045 ../gio/gsubprocess.c:380 +#: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Feil under åpning av fil «%s»: %s" -#: ../gio/glocalfileoutputstream.c:826 +#: gio/glocalfileoutputstream.c:959 msgid "Target file is a directory" msgstr "Målfilen er en katalog" -#: ../gio/glocalfileoutputstream.c:831 +#: gio/glocalfileoutputstream.c:973 msgid "Target file is not a regular file" msgstr "Målfilen er ikke en vanlig fil" -#: ../gio/glocalfileoutputstream.c:843 +#: gio/glocalfileoutputstream.c:1015 msgid "The file was externally modified" msgstr "Filen ble endret eksternt" -#: ../gio/glocalfileoutputstream.c:1029 +#: gio/glocalfileoutputstream.c:1205 #, c-format msgid "Error removing old file: %s" msgstr "Feil ved fjerning av gammel fil: %s" -#: ../gio/gmemoryinputstream.c:474 ../gio/gmemoryoutputstream.c:772 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Ugyldig GSeekType oppgitt" -#: ../gio/gmemoryinputstream.c:484 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Ugyldig søkeforespørsel" -#: ../gio/gmemoryinputstream.c:508 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Kan ikke avkorte GMemoryInputStream" -#: ../gio/gmemoryoutputstream.c:567 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Kan ikke endre størrelse på utdatastrøm for minne" -#: ../gio/gmemoryoutputstream.c:583 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Klarte ikke å endre størrelse på utdatastrøm for minne" -#: ../gio/gmemoryoutputstream.c:673 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3075,32 +3502,32 @@ msgstr "" "Mengden minne som kreves for å prosessere skriveoperasjonen er større enn " "tilgjengelig adresseområde" -#: ../gio/gmemoryoutputstream.c:782 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Forespurt søk før begynnelsen på strømmen" -#: ../gio/gmemoryoutputstream.c:797 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Forespurt søk forbi slutten på strømmen" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: ../gio/gmount.c:396 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "monteringspunkt implementerer ikke «unmount»" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: ../gio/gmount.c:472 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "monteringspunkt implementerer ikke «eject»" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: ../gio/gmount.c:550 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "monteringspunkt implementerer ikke «unmount» eller «unmount_with_operation»" @@ -3108,7 +3535,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: ../gio/gmount.c:635 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "monteringspunkt implementerer ikke «eject» eller «eject_with_operation»" @@ -3116,97 +3543,131 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: ../gio/gmount.c:723 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "monteringspunkt implementerer ikke «remount»" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: ../gio/gmount.c:805 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "monteringspunkt implementerer ikke gjetting av innholdstype" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: ../gio/gmount.c:892 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "monteringspunkt implementerer ikke synkron gjetting av innholdstype" -#: ../gio/gnetworkaddress.c:378 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Vertsnavn «%s» inneholder «[» men ikke «]»" -#: ../gio/gnetworkmonitorbase.c:206 ../gio/gnetworkmonitorbase.c:310 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Nettverk kan ikke nås" -#: ../gio/gnetworkmonitorbase.c:244 ../gio/gnetworkmonitorbase.c:274 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Kan ikke nå vert" -#: ../gio/gnetworkmonitornetlink.c:96 ../gio/gnetworkmonitornetlink.c:108 -#: ../gio/gnetworkmonitornetlink.c:127 +#: gio/gnetworkmonitornetlink.c:101 gio/gnetworkmonitornetlink.c:113 +#: gio/gnetworkmonitornetlink.c:132 #, c-format msgid "Could not create network monitor: %s" msgstr "Kunne ikke lage nettverksovervåker: %s" -#: ../gio/gnetworkmonitornetlink.c:117 +#: gio/gnetworkmonitornetlink.c:122 msgid "Could not create network monitor: " msgstr "Kunne ikke lage nettverksovervåker: " -#: ../gio/gnetworkmonitornetlink.c:175 +#: gio/gnetworkmonitornetlink.c:185 msgid "Could not get network status: " msgstr "Kunne ikke hente nettverksstatus: " -#: ../gio/gnetworkmonitornm.c:329 +#: gio/gnetworkmonitornm.c:313 +#, fuzzy, c-format +#| msgid "NetworkManager version too old" +msgid "NetworkManager not running" +msgstr "For gammel versjon av NetworkManager" + +#: gio/gnetworkmonitornm.c:324 #, c-format msgid "NetworkManager version too old" msgstr "For gammel versjon av NetworkManager" -#: ../gio/goutputstream.c:212 ../gio/goutputstream.c:560 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Utdatastrømmen implementerer ikke skriving" -#: ../gio/goutputstream.c:521 ../gio/goutputstream.c:1224 +#: gio/goutputstream.c:474 gio/goutputstream.c:1539 +#, c-format +msgid "Sum of vectors passed to %s too large" +msgstr "" + +#: gio/goutputstream.c:738 gio/goutputstream.c:1769 msgid "Source stream is already closed" msgstr "Kildestrømmen er allerede lukket" -#: ../gio/gresolver.c:342 ../gio/gthreadedresolver.c:116 -#: ../gio/gthreadedresolver.c:126 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 +msgid "Unspecified proxy lookup failure" +msgstr "" + +#. Translators: the first placeholder is a domain name, the +#. * second is an error message +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Feil under oppslag av «%s»: %s" -#: ../gio/gresource.c:606 ../gio/gresource.c:857 ../gio/gresource.c:874 -#: ../gio/gresource.c:998 ../gio/gresource.c:1070 ../gio/gresource.c:1143 -#: ../gio/gresource.c:1213 ../gio/gresourcefile.c:453 -#: ../gio/gresourcefile.c:576 ../gio/gresourcefile.c:713 +#. Translators: The placeholder is for a function name. +#: gio/gresolver.c:541 gio/gresolver.c:701 +#, c-format +msgid "%s not implemented" +msgstr "" + +#: gio/gresolver.c:1070 gio/gresolver.c:1122 +#, fuzzy +#| msgid "Invalid hostname" +msgid "Invalid domain" +msgstr "Ugyldig vertsnavn" + +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Ressurs ved «%s» eksisterer ikke" -#: ../gio/gresource.c:771 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Ressursen ved «%s» kunne ikke dekomprimeres" -#: ../gio/gresourcefile.c:709 +#: gio/gresourcefile.c:663 +msgid "Resource files cannot be renamed" +msgstr "" + +#: gio/gresourcefile.c:753 #, c-format msgid "The resource at “%s” is not a directory" msgstr "Ressurs ved «%s» er ikke en katalog" -#: ../gio/gresourcefile.c:917 +#: gio/gresourcefile.c:961 msgid "Input stream doesn’t implement seek" msgstr "Inndatastrøm implementerer ikke søk" -#: ../gio/gresource-tool.c:494 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Vis seksjoner som inneholder ressurser i en elf FIL" -#: ../gio/gresource-tool.c:500 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3216,16 +3677,15 @@ msgstr "" "Hvis SEKSJON oppgis skal kun ressurser i denne seksjonen vises\n" "Hvis STI oppgis skal kun relevante ressurser vises" -#: ../gio/gresource-tool.c:503 ../gio/gresource-tool.c:513 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FIL [STI]" -#: ../gio/gresource-tool.c:504 ../gio/gresource-tool.c:514 -#: ../gio/gresource-tool.c:521 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SEKSJON" -#: ../gio/gresource-tool.c:509 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3237,15 +3697,15 @@ msgstr "" "Hvis STI oppgis vises kun relevante ressurser\n" "Detaljer inkluderer seksjon, størrelse og komprimering" -#: ../gio/gresource-tool.c:519 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Hent ut en ressursfil til stdout" -#: ../gio/gresource-tool.c:520 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "STI TIL FIL" -#: ../gio/gresource-tool.c:534 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3273,7 +3733,7 @@ msgstr "" "Bruk «gresource help KOMMANDO» for å få detaljert hjelp.\n" "\n" -#: ../gio/gresource-tool.c:548 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3288,19 +3748,19 @@ msgstr "" "%s\n" "\n" -#: ../gio/gresource-tool.c:555 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SEKSJON Et valgfritt navn på en elf seksjon\n" -#: ../gio/gresource-tool.c:559 ../gio/gsettings-tool.c:656 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMMANDO Valgfri kommando som skal forklares\n" -#: ../gio/gresource-tool.c:565 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FIL En elf-fil. Binærfil eller delt bibliotek\n" -#: ../gio/gresource-tool.c:568 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3308,90 +3768,82 @@ msgstr "" " FIL En elf-fil - binær eller delt bibliotek\n" " eller en kompilert ressursfil\n" -#: ../gio/gresource-tool.c:572 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[STI]" -#: ../gio/gresource-tool.c:574 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " STI En valgfri ressurssti - kan være ufullstendig\n" -#: ../gio/gresource-tool.c:575 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "STI" -#: ../gio/gresource-tool.c:577 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " STI En ressurssti\n" -#: ../gio/gsettings-tool.c:51 ../gio/gsettings-tool.c:72 -#: ../gio/gsettings-tool.c:853 +#: gio/gsettings-tool.c:51 gio/gsettings-tool.c:72 gio/gsettings-tool.c:925 #, c-format msgid "No such schema “%s”\n" msgstr "Skjema «%s» finnes ikke\n" -#: ../gio/gsettings-tool.c:57 +#: gio/gsettings-tool.c:57 #, c-format msgid "Schema “%s” is not relocatable (path must not be specified)\n" msgstr "Skjema «%s» er ikke omplasserbar (stien må ikke oppgis)\n" -#: ../gio/gsettings-tool.c:78 +#: gio/gsettings-tool.c:78 #, c-format msgid "Schema “%s” is relocatable (path must be specified)\n" msgstr "Skjema «%s» er omplasserbart (sti må oppgis)\n" -#: ../gio/gsettings-tool.c:92 -#, c-format +#: gio/gsettings-tool.c:92 msgid "Empty path given.\n" msgstr "Stien som ble oppgitt er tom.\n" -#: ../gio/gsettings-tool.c:98 -#, c-format +#: gio/gsettings-tool.c:98 msgid "Path must begin with a slash (/)\n" msgstr "Stien må starte med en skråstrek (/)\n" -#: ../gio/gsettings-tool.c:104 -#, c-format +#: gio/gsettings-tool.c:104 msgid "Path must end with a slash (/)\n" msgstr "Stien må slutte med skråstrek (/)\n" -#: ../gio/gsettings-tool.c:110 -#, c-format +#: gio/gsettings-tool.c:110 msgid "Path must not contain two adjacent slashes (//)\n" msgstr "Sti må ikke inneholde to etterfølgende skråstreker (//)\n" -#: ../gio/gsettings-tool.c:491 -#, c-format +#: gio/gsettings-tool.c:555 msgid "The provided value is outside of the valid range\n" msgstr "Oppgitt verdi er utenfor gyldig område\n" -#: ../gio/gsettings-tool.c:498 -#, c-format +#: gio/gsettings-tool.c:562 msgid "The key is not writable\n" msgstr "Nøkkelen er er ikke skrivbar\n" -#: ../gio/gsettings-tool.c:534 +#: gio/gsettings-tool.c:598 msgid "List the installed (non-relocatable) schemas" msgstr "Vis installerte (ikke-flyttbare) schema" -#: ../gio/gsettings-tool.c:540 +#: gio/gsettings-tool.c:604 msgid "List the installed relocatable schemas" msgstr "Vis installerte flyttbare schema" -#: ../gio/gsettings-tool.c:546 +#: gio/gsettings-tool.c:610 msgid "List the keys in SCHEMA" msgstr "Vis nøklene i SCHEMA" -#: ../gio/gsettings-tool.c:547 ../gio/gsettings-tool.c:553 -#: ../gio/gsettings-tool.c:596 +#: gio/gsettings-tool.c:611 gio/gsettings-tool.c:617 gio/gsettings-tool.c:660 msgid "SCHEMA[:PATH]" msgstr "SKJEMA[:STI]" -#: ../gio/gsettings-tool.c:552 +#: gio/gsettings-tool.c:616 msgid "List the children of SCHEMA" msgstr "Vis barn av SCHEMA" -#: ../gio/gsettings-tool.c:558 +#: gio/gsettings-tool.c:622 msgid "" "List keys and values, recursively\n" "If no SCHEMA is given, list all keys\n" @@ -3399,49 +3851,48 @@ msgstr "" "Vis nøkler og verdier rekursivt\n" "Vis alle nøkler hvis SKJEMA ikke oppgis\n" -#: ../gio/gsettings-tool.c:560 +#: gio/gsettings-tool.c:624 msgid "[SCHEMA[:PATH]]" msgstr "SKJEMA[:STI]" -#: ../gio/gsettings-tool.c:565 +#: gio/gsettings-tool.c:629 msgid "Get the value of KEY" msgstr "Hent verdi for NØKKEL" -#: ../gio/gsettings-tool.c:566 ../gio/gsettings-tool.c:572 -#: ../gio/gsettings-tool.c:578 ../gio/gsettings-tool.c:590 -#: ../gio/gsettings-tool.c:602 +#: gio/gsettings-tool.c:630 gio/gsettings-tool.c:636 gio/gsettings-tool.c:642 +#: gio/gsettings-tool.c:654 gio/gsettings-tool.c:666 msgid "SCHEMA[:PATH] KEY" msgstr "SKJEMA[:STI] NØKKEL" -#: ../gio/gsettings-tool.c:571 +#: gio/gsettings-tool.c:635 msgid "Query the range of valid values for KEY" msgstr "Spør på gyldig verdiområde for NØKKEL" -#: ../gio/gsettings-tool.c:577 +#: gio/gsettings-tool.c:641 msgid "Query the description for KEY" msgstr "Spør på beskrivelse for NØKKEL" -#: ../gio/gsettings-tool.c:583 +#: gio/gsettings-tool.c:647 msgid "Set the value of KEY to VALUE" msgstr "Sett verdien for NØKKEL til VERDI" -#: ../gio/gsettings-tool.c:584 +#: gio/gsettings-tool.c:648 msgid "SCHEMA[:PATH] KEY VALUE" msgstr "SKJEMA[:STI] NØKKEL VERDI" -#: ../gio/gsettings-tool.c:589 +#: gio/gsettings-tool.c:653 msgid "Reset KEY to its default value" msgstr "Nullstill NØKKEL til forvalgt verdi" -#: ../gio/gsettings-tool.c:595 +#: gio/gsettings-tool.c:659 msgid "Reset all keys in SCHEMA to their defaults" msgstr "Nullstill alle nøkler i SKJEMA til sine forvalgte verdier" -#: ../gio/gsettings-tool.c:601 +#: gio/gsettings-tool.c:665 msgid "Check if KEY is writable" msgstr "Sjekk om NØKKEL er skrivbar" -#: ../gio/gsettings-tool.c:607 +#: gio/gsettings-tool.c:671 msgid "" "Monitor KEY for changes.\n" "If no KEY is specified, monitor all keys in SCHEMA.\n" @@ -3451,11 +3902,11 @@ msgstr "" "Hvis ingen NØKKEL oppgis overvåkes alle nøkler i SKJEMA.\n" "Bruk Ctrl+C for å stoppe overvåking.\n" -#: ../gio/gsettings-tool.c:610 +#: gio/gsettings-tool.c:674 msgid "SCHEMA[:PATH] [KEY]" msgstr "SCHEMA[:STI] [NØKKEL]" -#: ../gio/gsettings-tool.c:622 +#: gio/gsettings-tool.c:686 msgid "" "Usage:\n" " gsettings --version\n" @@ -3503,7 +3954,7 @@ msgstr "" "Bruk «gsettings help KOMMANDO» for å få detaljert hjelp.\n" "\n" -#: ../gio/gsettings-tool.c:646 +#: gio/gsettings-tool.c:710 #, c-format msgid "" "Usage:\n" @@ -3518,11 +3969,11 @@ msgstr "" "%s\n" "\n" -#: ../gio/gsettings-tool.c:652 +#: gio/gsettings-tool.c:716 msgid " SCHEMADIR A directory to search for additional schemas\n" msgstr " SCHEMAKATALOG en katalog for søk etter ekstra schemas\n" -#: ../gio/gsettings-tool.c:660 +#: gio/gsettings-tool.c:724 msgid "" " SCHEMA The name of the schema\n" " PATH The path, for relocatable schemas\n" @@ -3531,383 +3982,425 @@ msgstr "" " SCHEMA Id for schema\n" " PATH Sti, for schema som kan relokeres\n" -#: ../gio/gsettings-tool.c:665 +#: gio/gsettings-tool.c:729 msgid " KEY The (optional) key within the schema\n" msgstr " NØKKEL Valgfri nøkkel i schema\n" -#: ../gio/gsettings-tool.c:669 +#: gio/gsettings-tool.c:733 msgid " KEY The key within the schema\n" msgstr " NØKKEL Nøkkel i schema\n" -#: ../gio/gsettings-tool.c:673 +#: gio/gsettings-tool.c:737 msgid " VALUE The value to set\n" msgstr " VERDI Verdi som skal settes\n" -#: ../gio/gsettings-tool.c:728 +#: gio/gsettings-tool.c:792 #, c-format msgid "Could not load schemas from %s: %s\n" msgstr "Kunne ikke laste skjema fra %s: %s\n" -#: ../gio/gsettings-tool.c:740 -#, c-format +#: gio/gsettings-tool.c:804 msgid "No schemas installed\n" msgstr "Ingen schema-filer installert\n" -#: ../gio/gsettings-tool.c:811 -#, c-format +#: gio/gsettings-tool.c:883 msgid "Empty schema name given\n" msgstr "Tomt navn på schema oppgitt\n" -#: ../gio/gsettings-tool.c:866 +#: gio/gsettings-tool.c:938 #, c-format msgid "No such key “%s”\n" msgstr "Nøkkel «%s» finnes ikke\n" -#: ../gio/gsocket.c:384 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Ugyldig plugg, ikke initiert" -#: ../gio/gsocket.c:391 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Ugyldig plugg, initiering feilet pga: %s" -#: ../gio/gsocket.c:399 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Pluggen er allerede lukket" -#: ../gio/gsocket.c:414 ../gio/gsocket.c:2995 ../gio/gsocket.c:4205 -#: ../gio/gsocket.c:4263 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Tidsavbrudd for I/U mot plugg" -#: ../gio/gsocket.c:546 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "lager GSocket fra fd: %s" -#: ../gio/gsocket.c:575 ../gio/gsocket.c:629 ../gio/gsocket.c:636 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Kunne ikke lage plugg: %s" -#: ../gio/gsocket.c:629 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Ukjent familie ble oppgitt" -#: ../gio/gsocket.c:636 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Ukjent protokoll ble oppgitt" -#: ../gio/gsocket.c:1127 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "Kan ikke bruke datagramoperasjoner på en plugg som ikke er av type datagram." -#: ../gio/gsocket.c:1144 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Kan ikke bruke datagramoperasjoner på en plugg med tidsavbrudd satt." -#: ../gio/gsocket.c:1948 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "kunne ikke hente lokal adresse: %s" -#: ../gio/gsocket.c:1991 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "kunne ikke hente ekstern adresse: %s" -#: ../gio/gsocket.c:2057 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "kunne ikke lytte: %s" -#: ../gio/gsocket.c:2156 -#, c-format -msgid "Error binding to address: %s" +#: gio/gsocket.c:2283 +#, fuzzy, c-format +#| msgid "Error binding to address: %s" +msgid "Error binding to address %s: %s" msgstr "Feil ved binding til adresse: %s" -#: ../gio/gsocket.c:2214 ../gio/gsocket.c:2251 ../gio/gsocket.c:2361 -#: ../gio/gsocket.c:2379 ../gio/gsocket.c:2449 ../gio/gsocket.c:2507 -#: ../gio/gsocket.c:2525 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Feil ved forsøk på å bli med i multicast-gruppe: %s" -#: ../gio/gsocket.c:2215 ../gio/gsocket.c:2252 ../gio/gsocket.c:2362 -#: ../gio/gsocket.c:2380 ../gio/gsocket.c:2450 ../gio/gsocket.c:2508 -#: ../gio/gsocket.c:2526 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Feil ved forsøk på å forlate multicast-gruppe: %s" -#: ../gio/gsocket.c:2216 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Ingen støtte for kildespesifikk multicast" -#: ../gio/gsocket.c:2363 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Familie for plugg er ikke støttet" -#: ../gio/gsocket.c:2381 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "kildespesifikk er ikke en IPv4 adresse" -#: ../gio/gsocket.c:2399 ../gio/gsocket.c:2428 ../gio/gsocket.c:2475 -#, c-format -msgid "Interface not found: %s" -msgstr "Fant ikke grensesnitt: %s" - -#: ../gio/gsocket.c:2415 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Navnet på grensesnittet er for langt" -#: ../gio/gsocket.c:2451 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 +#, c-format +msgid "Interface not found: %s" +msgstr "Fant ikke grensesnitt: %s" + +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Ingen støtte for IPv4 kildespesifikk multicast" -#: ../gio/gsocket.c:2509 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Ingen støtte for IPv6 kildespesifikk multicast" -#: ../gio/gsocket.c:2718 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Feil ved godkjenning av tilkobling: %s" -#: ../gio/gsocket.c:2839 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Tilkobling pågår" -#: ../gio/gsocket.c:2888 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Kan ikke hente utestående feil: " -#: ../gio/gsocket.c:3058 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Feil ved mottak av data: %s" -#: ../gio/gsocket.c:3253 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Feil ved sending av data: %s" -#: ../gio/gsocket.c:3440 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Kan ikke stenge ned plugg: %s" -#: ../gio/gsocket.c:3521 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Feil ved lukking av plugg: %s" -#: ../gio/gsocket.c:4198 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Venter på tilstand for plugg: %s" -#: ../gio/gsocket.c:4672 ../gio/gsocket.c:4752 ../gio/gsocket.c:4930 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 +#, fuzzy, c-format +#| msgid "Error sending message: %s" +msgid "Unable to send message: %s" +msgstr "Feil ved sending av melding: %s" + +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 +msgid "Message vectors too large" +msgstr "" + +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Feil ved sending av melding: %s" -#: ../gio/gsocket.c:4696 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage er ikke støttet på Windows" -#: ../gio/gsocket.c:5149 ../gio/gsocket.c:5222 ../gio/gsocket.c:5448 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Feil ved mottak av melding: %s" -#: ../gio/gsocket.c:5720 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Kunne ikke lese autentiseringsinformasjon for plugg: %s" -#: ../gio/gsocket.c:5729 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials ikke implementert for dette OSet" -#: ../gio/gsocketclient.c:176 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Kunne ikke koble til proxy-tjener %s: " -#: ../gio/gsocketclient.c:190 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Kunne ikke koble til «%s»: " -#: ../gio/gsocketclient.c:192 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Kunne ikke koble til: " -#: ../gio/gsocketclient.c:1027 ../gio/gsocketclient.c:1599 -msgid "Unknown error on connect" -msgstr "Ukjent feil ved tilkobling" - -#: ../gio/gsocketclient.c:1081 ../gio/gsocketclient.c:1535 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Proxy over annet enn TCP-forbindelser er ikke støttet." -#: ../gio/gsocketclient.c:1110 ../gio/gsocketclient.c:1561 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Mellomtjenerprotokoll «%s» er er ikke støttet." -#: ../gio/gsocketlistener.c:218 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Lytter er allerede lukket" -#: ../gio/gsocketlistener.c:264 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Tillagt plugg er lukket" -#: ../gio/gsocks4aproxy.c:118 +#: gio/gsocks4aproxy.c:120 #, c-format msgid "SOCKSv4 does not support IPv6 address “%s”" msgstr "SOCKSv4 støtter ikke IPv6-adresse «%s»" -#: ../gio/gsocks4aproxy.c:136 +#: gio/gsocks4aproxy.c:138 msgid "Username is too long for SOCKSv4 protocol" msgstr "Brukernavn er for langt for SOCKSv4-protokollen" -#: ../gio/gsocks4aproxy.c:153 +#: gio/gsocks4aproxy.c:155 #, c-format msgid "Hostname “%s” is too long for SOCKSv4 protocol" msgstr "Vertsnavn «%s» er for langt for SOCKSv4-protokollen" -#: ../gio/gsocks4aproxy.c:179 +#: gio/gsocks4aproxy.c:181 msgid "The server is not a SOCKSv4 proxy server." msgstr "Tjeneren er ikke en SOCKSv4-proxytjener." -#: ../gio/gsocks4aproxy.c:186 +#: gio/gsocks4aproxy.c:188 msgid "Connection through SOCKSv4 server was rejected" msgstr "Tilkobling gjennom SOCKSv4-tjener ble avvist" -#: ../gio/gsocks5proxy.c:153 ../gio/gsocks5proxy.c:324 -#: ../gio/gsocks5proxy.c:334 +#: gio/gsocks5proxy.c:155 gio/gsocks5proxy.c:340 gio/gsocks5proxy.c:350 msgid "The server is not a SOCKSv5 proxy server." msgstr "Tjeneren er ikke en SOCKSv5-proxytjener." -#: ../gio/gsocks5proxy.c:167 +#: gio/gsocks5proxy.c:169 gio/gsocks5proxy.c:186 msgid "The SOCKSv5 proxy requires authentication." msgstr "SOCSv5-proxy krever autentisering." -#: ../gio/gsocks5proxy.c:177 +#: gio/gsocks5proxy.c:193 msgid "" "The SOCKSv5 proxy requires an authentication method that is not supported by " "GLib." msgstr "SOCKSv5-proxy krever en autentiseringsmetode som ikke støttes av GLib." -#: ../gio/gsocks5proxy.c:206 +#: gio/gsocks5proxy.c:222 msgid "Username or password is too long for SOCKSv5 protocol." msgstr "Brukernavn eller passord er for langt for SOCKSv5-protokollen." -#: ../gio/gsocks5proxy.c:236 +#: gio/gsocks5proxy.c:252 msgid "SOCKSv5 authentication failed due to wrong username or password." msgstr "" "SOCKSv5-autentisering feilet på grunn av feil brukernavn eller passord." -#: ../gio/gsocks5proxy.c:286 +#: gio/gsocks5proxy.c:302 #, c-format msgid "Hostname “%s” is too long for SOCKSv5 protocol" msgstr "Vertsnavn «%s» er for langt for SOCKSv5-protokollen" -#: ../gio/gsocks5proxy.c:348 +#: gio/gsocks5proxy.c:364 msgid "The SOCKSv5 proxy server uses unknown address type." msgstr "SOCKSv5-proxytjener bruker ukjent adressetype." -#: ../gio/gsocks5proxy.c:355 +#: gio/gsocks5proxy.c:371 msgid "Internal SOCKSv5 proxy server error." msgstr "Intern feil i SOCKSv5-proxytjener." -#: ../gio/gsocks5proxy.c:361 +#: gio/gsocks5proxy.c:377 msgid "SOCKSv5 connection not allowed by ruleset." msgstr "SOCKSv5-tilkobling tillates ikke av regelsett." -#: ../gio/gsocks5proxy.c:368 +#: gio/gsocks5proxy.c:384 msgid "Host unreachable through SOCKSv5 server." msgstr "Vert kan ikke nås via SOCKSv5-tjener." -#: ../gio/gsocks5proxy.c:374 +#: gio/gsocks5proxy.c:390 msgid "Network unreachable through SOCKSv5 proxy." msgstr "Nettverk kan ikke nås via SOCKSv5-proxy." -#: ../gio/gsocks5proxy.c:380 +#: gio/gsocks5proxy.c:396 msgid "Connection refused through SOCKSv5 proxy." msgstr "Tilkobling nektet via SOCKSv5-proxy." -#: ../gio/gsocks5proxy.c:386 +#: gio/gsocks5proxy.c:402 msgid "SOCKSv5 proxy does not support “connect” command." msgstr "SOCKSv5-proxy støtter ikke «connect»-kommando." -#: ../gio/gsocks5proxy.c:392 +#: gio/gsocks5proxy.c:408 msgid "SOCKSv5 proxy does not support provided address type." msgstr "SOCKSv5-proxy støtter ikke oppgitt type adresse." -#: ../gio/gsocks5proxy.c:398 +#: gio/gsocks5proxy.c:414 msgid "Unknown SOCKSv5 proxy error." msgstr "Ukjent feil i SOCKSv5-proxy." -#: ../gio/gthemedicon.c:518 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 +#, c-format +msgid "Failed to create pipe for communicating with child process (%s)" +msgstr "Feil under oppretting av rør for kommunikasjon med underprosess (%s)" + +#: gio/gtestdbus.c:615 +#, fuzzy, c-format +#| msgid "Seek not supported on stream" +msgid "Pipes are not supported in this platform" +msgstr "Søking ikke støttet på strøm" + +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Kan ikke håndtere versjon %d av GThemedIcon-koding" -#: ../gio/gthreadedresolver.c:118 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Ingen gyldige adresser ble funnet" -#: ../gio/gthreadedresolver.c:213 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Feil under omvendt oppslag av «%s»: %s" -#: ../gio/gthreadedresolver.c:549 ../gio/gthreadedresolver.c:628 -#: ../gio/gthreadedresolver.c:726 ../gio/gthreadedresolver.c:776 +#. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 +#, c-format +msgid "Error parsing DNS %s record: malformed DNS packet" +msgstr "" + +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Ingen DNS-oppføring av forespurt type for «%s»" -#: ../gio/gthreadedresolver.c:554 ../gio/gthreadedresolver.c:731 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Midlertidig ute av stand til å slå opp «%s»" -#: ../gio/gthreadedresolver.c:559 ../gio/gthreadedresolver.c:736 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Feil ved oppslag av «%s»" -#: ../gio/gtlscertificate.c:250 -msgid "Cannot decrypt PEM-encoded private key" -msgstr "Kunne ikke dekryptere PEM-kodet privat nøkkel" +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 +msgid "Malformed DNS packet" +msgstr "" -#: ../gio/gtlscertificate.c:255 +#: gio/gthreadedresolver.c:1090 +#, fuzzy, c-format +#| msgid "Failed to read from file “%s”: %s" +msgid "Failed to parse DNS response for “%s”: " +msgstr "Klarte ikke å lese fra fil «%s»: %s" + +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Fant ikke PEM-kodet privat nøkkel" -#: ../gio/gtlscertificate.c:265 +#: gio/gtlscertificate.c:448 +msgid "Cannot decrypt PEM-encoded private key" +msgstr "Kunne ikke dekryptere PEM-kodet privat nøkkel" + +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Kunne ikke lese PEM-kodet privat nøkkel" -#: ../gio/gtlscertificate.c:290 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Fant ikke PEM-kodet sertifikat" -#: ../gio/gtlscertificate.c:299 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Kunne ikke lese PEM-kodet sertifikat" -#: ../gio/gtlspassword.c:111 +#: gio/gtlscertificate.c:758 +msgid "The current TLS backend does not support PKCS #12" +msgstr "" + +#: gio/gtlscertificate.c:975 +msgid "This GTlsBackend does not support creating PKCS #11 certificates" +msgstr "" + +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -3916,7 +4409,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: ../gio/gtlspassword.c:115 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -3924,604 +4417,1001 @@ msgstr "" "Passord har blitt oppgitt feil flere ganger, og tilgangen vil bli låst hvis " "det oppgis feil på nytt." -#: ../gio/gtlspassword.c:117 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Oppgitt passord er ikke korrekt." -#: ../gio/gunixconnection.c:166 ../gio/gunixconnection.c:563 +#: gio/gunixconnection.c:116 +#, fuzzy +#| msgid "Setting attribute %s not supported" +msgid "Sending FD is not supported" +msgstr "Støtter ikke å sette attributt %s" + +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Ventet 1 kontrollmelding, fikk %d" msgstr[1] "Ventet 1 kontrollmelding, fikk %d" -#: ../gio/gunixconnection.c:182 ../gio/gunixconnection.c:575 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Uventet type data" -#: ../gio/gunixconnection.c:200 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Ventet en fd, men fikk %d\n" msgstr[1] "Ventet en fd, men fikk %d\n" -#: ../gio/gunixconnection.c:219 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Mottok ugyldig fd" -#: ../gio/gunixconnection.c:355 +#: gio/gunixconnection.c:231 +#, fuzzy +#| msgid "Setting attribute %s not supported" +msgid "Receiving FD is not supported" +msgstr "Støtter ikke å sette attributt %s" + +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Feil ved sending av påloggingsinformasjon: " -#: ../gio/gunixconnection.c:504 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Feil under sjekk om SO_PASSCRED er slått på for plugg: %s" -#: ../gio/gunixconnection.c:520 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Feil under forsøk på å slå på SO_PASSCRED: %s" -#: ../gio/gunixconnection.c:549 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Forventer å lese en enkelt byte for mottak av påloggingsinformasjon, men " "leste null byte" -#: ../gio/gunixconnection.c:589 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Forventet ikke kontrollmelding, men fikk %d" -#: ../gio/gunixconnection.c:614 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Feil ved forsøk på å slå av SO_PASSCRED: %s" -#: ../gio/gunixinputstream.c:372 ../gio/gunixinputstream.c:393 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Feil under lesing fra fildeskriptor: %s" -#: ../gio/gunixinputstream.c:426 ../gio/gunixoutputstream.c:411 -#: ../gio/gwin32inputstream.c:217 ../gio/gwin32outputstream.c:204 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Feil under lukking av fildeskriptor: %s" -#: ../gio/gunixmounts.c:2539 ../gio/gunixmounts.c:2592 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Filsystemrot" -#: ../gio/gunixoutputstream.c:358 ../gio/gunixoutputstream.c:378 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Feil under skriving til fildeskriptor: %s" -#: ../gio/gunixsocketaddress.c:241 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstrakte UNIX domenepluggadresser er ikke støttet på dette systemet" -#: ../gio/gvolume.c:437 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "volumet implementerer ikke utløsing" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: ../gio/gvolume.c:514 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "volumet implementerer ikke eject eller eject_with_operation" -#: ../gio/gwin32inputstream.c:185 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Feil under lesing fra håndtak: %s" -#: ../gio/gwin32inputstream.c:232 ../gio/gwin32outputstream.c:219 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Feil under lukking av håndtak: %s" -#: ../gio/gwin32outputstream.c:172 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Feil under skriving til håndtak: %s" -#: ../gio/gzlibcompressor.c:394 ../gio/gzlibdecompressor.c:347 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Ikke nok minne" -#: ../gio/gzlibcompressor.c:401 ../gio/gzlibdecompressor.c:354 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Intern feil: %s" -#: ../gio/gzlibcompressor.c:414 ../gio/gzlibdecompressor.c:368 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Trenger med inndata" -#: ../gio/gzlibdecompressor.c:340 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Ugyldige komprimerte data" -#: ../gio/tests/gdbus-daemon.c:18 +#: gio/tests/gdbus-daemon.c:18 msgid "Address to listen on" msgstr "Lytteadresse" -#: ../gio/tests/gdbus-daemon.c:19 +#: gio/tests/gdbus-daemon.c:19 msgid "Ignored, for compat with GTestDbus" msgstr "Oversett. For kompatibilitet med GTestDbus" -#: ../gio/tests/gdbus-daemon.c:20 +#: gio/tests/gdbus-daemon.c:20 msgid "Print address" msgstr "Skriv ut adresse" -#: ../gio/tests/gdbus-daemon.c:21 +#: gio/tests/gdbus-daemon.c:21 msgid "Print address in shell mode" msgstr "Skriv ut adresse i skallmodus" -#: ../gio/tests/gdbus-daemon.c:28 +#: gio/tests/gdbus-daemon.c:28 msgid "Run a dbus service" msgstr "Kjør en dbus-tjeneste" -#: ../gio/tests/gdbus-daemon.c:42 -#, c-format +#: gio/tests/gdbus-daemon.c:42 msgid "Wrong args\n" msgstr "Feil argument\n" -#: ../glib/gbookmarkfile.c:754 +#: girepository/compiler/compiler.c:93 +#, fuzzy, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Failed to open ‘%s’: %s" +msgstr "Klarte ikke å åpne fil «%s»: %s" + +#: girepository/compiler/compiler.c:103 +#, fuzzy, c-format +#| msgid "Could not create network monitor: %s" +msgid "Error: Could not write the whole output: %s" +msgstr "Kunne ikke lage nettverksovervåker: %s" + +#: girepository/compiler/compiler.c:115 +#, fuzzy, c-format +#| msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Klarte ikke å endre navn på fil «%s» til «%s»: g_rename() feilet: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +#, fuzzy +#| msgid "Show program version and exit" +msgid "Show program’s version number and exit" +msgstr "Vis programmets versjon og avslutt" + +#: girepository/compiler/compiler.c:175 +#, fuzzy, c-format +#| msgid "Error parsing parameter %d: %s\n" +msgid "Error parsing arguments: %s" +msgstr "Feil under tolking av parameter %d: %s\n" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "" + +#: girepository/compiler/compiler.c:218 +#, fuzzy, c-format +#| msgid "Error opening file “%s”: %s" +msgid "Error parsing file ‘%s’: %s" +msgstr "Feil under åpning av fil «%s»: %s" + +#: girepository/compiler/compiler.c:243 +#, fuzzy, c-format +#| msgid "Failed to load info for handler “%s”" +msgid "Failed to build typelib for module ‘%s’" +msgstr "Klarte ikke å laste info for håndterer «%s»" + +#: girepository/compiler/compiler.c:245 +#, fuzzy, c-format +#| msgid "Failed to open file “%s”: %s" +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Klarte ikke å åpne fil «%s»: %s" + +#: girepository/decompiler/decompiler.c:54 +#, fuzzy +#| msgid "Show extra information" +msgid "Show all available information" +msgstr "Vis ekstra informasjon" + +#: girepository/decompiler/decompiler.c:71 +#, fuzzy, c-format +#| msgid "Failed to fork (%s)" +msgid "Failed to parse: %s" +msgstr "Feil under kjøring av fork (%s)" + +#: girepository/decompiler/decompiler.c:87 +#, fuzzy +#| msgid "Show hidden files" +msgid "No input files" +msgstr "Vis skjulte filer" + +#: girepository/decompiler/decompiler.c:113 +#, fuzzy, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to read ‘%s’: %s" +msgstr "Klarte ikke å opprette fil «%s»: %s" + +#: girepository/decompiler/decompiler.c:125 +#, fuzzy, c-format +#| msgid "Failed to create file “%s”: %s" +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Klarte ikke å opprette fil «%s»: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, fuzzy, c-format +#| msgid "Failed to create temp file: %s" +msgid "Failed to load typelib: %s" +msgstr "Klarte ikke å opprette midlertidig fil: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "" + +#: girepository/inspector/inspector.c:75 +#, fuzzy +#| msgid "The attributes to get" +msgid "The typelib to inspect" +msgstr "Attributter som skal hentes" + +#: girepository/inspector/inspector.c:75 +#, fuzzy +#| msgid "NAME" +msgid "NAMESPACE" +msgstr "NAVN" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "" + +#: girepository/inspector/inspector.c:86 +#, fuzzy, c-format +#| msgid "Failed to read from file “%s”: %s" +msgid "Failed to parse command line options: %s" +msgstr "Klarte ikke å lese fra fil «%s»: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Uventet attributt «%s» for element «%s»" -#: ../glib/gbookmarkfile.c:765 ../glib/gbookmarkfile.c:836 -#: ../glib/gbookmarkfile.c:846 ../glib/gbookmarkfile.c:953 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Attributt «%s» i element «%s» ble ikke funnet" -#: ../glib/gbookmarkfile.c:1123 ../glib/gbookmarkfile.c:1188 -#: ../glib/gbookmarkfile.c:1252 ../glib/gbookmarkfile.c:1262 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Uventet etikett «%s», etikett «%s» forventet" -#: ../glib/gbookmarkfile.c:1148 ../glib/gbookmarkfile.c:1162 -#: ../glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Uventet etikett «%s» i «%s»" -#: ../glib/gbookmarkfile.c:1756 +#: glib/gbookmarkfile.c:1672 +#, c-format +msgid "Invalid date/time ‘%s’ in bookmark file" +msgstr "" + +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Ingen gyldig bokmerkefil ble funnet i datakatalogene" -#: ../glib/gbookmarkfile.c:1957 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Et bokmerke eksisterer allerede for URI «%s»" -#: ../glib/gbookmarkfile.c:2003 ../glib/gbookmarkfile.c:2161 -#: ../glib/gbookmarkfile.c:2246 ../glib/gbookmarkfile.c:2326 -#: ../glib/gbookmarkfile.c:2411 ../glib/gbookmarkfile.c:2494 -#: ../glib/gbookmarkfile.c:2572 ../glib/gbookmarkfile.c:2651 -#: ../glib/gbookmarkfile.c:2693 ../glib/gbookmarkfile.c:2790 -#: ../glib/gbookmarkfile.c:2910 ../glib/gbookmarkfile.c:3100 -#: ../glib/gbookmarkfile.c:3176 ../glib/gbookmarkfile.c:3344 -#: ../glib/gbookmarkfile.c:3433 ../glib/gbookmarkfile.c:3522 -#: ../glib/gbookmarkfile.c:3638 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Ingen bokmerker funnet for URI «%s»" -#: ../glib/gbookmarkfile.c:2335 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Ingen MIME-type definert i bokmerke for URI «%s»" -#: ../glib/gbookmarkfile.c:2420 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Ingen private flagg er definert i bokmerke for URI «%s»" -#: ../glib/gbookmarkfile.c:2799 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Ingen grupper satt i bokmerke for URI «%s»" -#: ../glib/gbookmarkfile.c:3197 ../glib/gbookmarkfile.c:3354 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Ingen programmer med navn «%s» har registrert et bokmerke for «%s»" -#: ../glib/gbookmarkfile.c:3377 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Feil under utvidelse av exec-linje «%s» med URI «%s»" -#: ../glib/gconvert.c:477 ../glib/gutf8.c:862 ../glib/gutf8.c:1074 -#: ../glib/gutf8.c:1211 ../glib/gutf8.c:1315 +#: glib/gconvert.c:379 +#, fuzzy +#| msgid "Invalid sequence in conversion input" +msgid "Unrepresentable character in conversion input" +msgstr "Ugyldig sekvens i inndata for konvertering" + +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Ufullstendig tegnsekvens ved slutten på inndata" -#: ../glib/gconvert.c:742 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Kan ikke konvertere \"fallback\" «%s» til tegnsett «%s»" -#: ../glib/gconvert.c:1513 +#: glib/gconvert.c:849 +#, fuzzy +#| msgid "Invalid byte sequence in conversion input" +msgid "Embedded NUL byte in conversion input" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: glib/gconvert.c:870 +#, fuzzy +#| msgid "Invalid byte sequence in conversion input" +msgid "Embedded NUL byte in conversion output" +msgstr "Ugyldig bytesekvens i inndata for konvertering" + +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "URI «%s» er ikke en absolutt URI som bruker skjema for filer" -#: ../glib/gconvert.c:1523 -#, c-format -msgid "The local file URI “%s” may not include a “#”" -msgstr "Lokal fil-URI «%s» kan ikke inneholde en «#»" - -#: ../glib/gconvert.c:1540 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI «%s» er ugyldig" -#: ../glib/gconvert.c:1552 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Vertsnavnet for URI «%s» er ugyldig" -#: ../glib/gconvert.c:1568 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "Vertsnavnet for URI «%s» inneholder ugyldige escape-tegn" -#: ../glib/gconvert.c:1640 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Stinavnet «%s» er ikke en absolutt sti" #. Translators: this is the preferred format for expressing the date and the time -#: ../glib/gdatetime.c:203 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %e %b %H.%M.%S" #. Translators: this is the preferred format for expressing the date -#: ../glib/gdatetime.c:206 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%y" #. Translators: this is the preferred format for expressing the time -#: ../glib/gdatetime.c:209 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H.%M.%S" #. Translators: this is the preferred format for expressing 12 hour time -#: ../glib/gdatetime.c:212 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%H.%M.%S" -#: ../glib/gdatetime.c:225 +#. Translators: Some languages (Baltic, Slavic, Greek, and some more) +#. * need different grammatical forms of month names depending on whether +#. * they are standalone or in a complete date context, with the day +#. * number. Some other languages may prefer starting with uppercase when +#. * they are standalone and with lowercase when they are in a complete +#. * date context. Here are full month names in a form appropriate when +#. * they are used standalone. If your system is Linux with the glibc +#. * version 2.27 (released Feb 1, 2018) or newer or if it is from the BSD +#. * family (which includes OS X) then you can refer to the date command +#. * line utility and see what the command `date +%OB' produces. Also in +#. * the latest Linux the command `locale alt_mon' in your native locale +#. * produces a complete list of month names almost ready to copy and +#. * paste here. Note that in most of the languages (western European, +#. * non-European) there is no difference between the standalone and +#. * complete date form. +#. +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Januar" -#: ../glib/gdatetime.c:227 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Februar" -#: ../glib/gdatetime.c:229 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Mars" -#: ../glib/gdatetime.c:231 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "April" -#: ../glib/gdatetime.c:233 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Mai" -#: ../glib/gdatetime.c:235 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Juni" -#: ../glib/gdatetime.c:237 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Juli" -#: ../glib/gdatetime.c:239 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "August" -#: ../glib/gdatetime.c:241 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "September" -#: ../glib/gdatetime.c:243 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Oktober" -#: ../glib/gdatetime.c:245 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "November" -#: ../glib/gdatetime.c:247 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Desember" -#: ../glib/gdatetime.c:262 +#. Translators: Some languages need different grammatical forms of +#. * month names depending on whether they are standalone or in a complete +#. * date context, with the day number. Some may prefer starting with +#. * uppercase when they are standalone and with lowercase when they are +#. * in a full date context. However, as these names are abbreviated +#. * the grammatical difference is visible probably only in Belarusian +#. * and Russian. In other languages there is no difference between +#. * the standalone and complete date form when they are abbreviated. +#. * If your system is Linux with the glibc version 2.27 (released +#. * Feb 1, 2018) or newer then you can refer to the date command line +#. * utility and see what the command `date +%Ob' produces. Also in +#. * the latest Linux the command `locale ab_alt_mon' in your native +#. * locale produces a complete list of month names almost ready to copy +#. * and paste here. Note that this feature is not yet supported by any +#. * other platform. Here are abbreviated month names in a form +#. * appropriate when they are used standalone. +#. +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: ../glib/gdatetime.c:264 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: ../glib/gdatetime.c:266 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: ../glib/gdatetime.c:268 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr" -#: ../glib/gdatetime.c:270 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Mai" -#: ../glib/gdatetime.c:272 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jun" -#: ../glib/gdatetime.c:274 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Jul" -#: ../glib/gdatetime.c:276 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Aug" -#: ../glib/gdatetime.c:278 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: ../glib/gdatetime.c:280 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Okt" -#: ../glib/gdatetime.c:282 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: ../glib/gdatetime.c:284 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Des" -#: ../glib/gdatetime.c:299 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Mandag" -#: ../glib/gdatetime.c:301 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Tirsdag" -#: ../glib/gdatetime.c:303 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Onsdag" -#: ../glib/gdatetime.c:305 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Torsdag" -#: ../glib/gdatetime.c:307 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Fredag" -#: ../glib/gdatetime.c:309 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Lørdag" -#: ../glib/gdatetime.c:311 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Søndag" -#: ../glib/gdatetime.c:326 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Man" -#: ../glib/gdatetime.c:328 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Tir" -#: ../glib/gdatetime.c:330 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Ons" -#: ../glib/gdatetime.c:332 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Tor" -#: ../glib/gdatetime.c:334 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Fre" -#: ../glib/gdatetime.c:336 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Lør" -#: ../glib/gdatetime.c:338 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Søn" +#. Translators: Some languages need different grammatical forms of +#. * month names depending on whether they are standalone or in a full +#. * date context, with the day number. Some may prefer starting with +#. * uppercase when they are standalone and with lowercase when they are +#. * in a full date context. Here are full month names in a form +#. * appropriate when they are used in a full date context, with the +#. * day number. If your system is Linux with the glibc version 2.27 +#. * (released Feb 1, 2018) or newer or if it is from the BSD family +#. * (which includes OS X) then you can refer to the date command line +#. * utility and see what the command `date +%B' produces. Also in +#. * the latest Linux the command `locale mon' in your native locale +#. * produces a complete list of month names almost ready to copy and +#. * paste here. In older Linux systems due to a bug the result is +#. * incorrect in some languages. Note that in most of the languages +#. * (western European, non-European) there is no difference between the +#. * standalone and complete date form. +#. +#: glib/gdatetime.c:441 +msgctxt "full month name with day" +msgid "January" +msgstr "januar" + +#: glib/gdatetime.c:443 +msgctxt "full month name with day" +msgid "February" +msgstr "februar" + +#: glib/gdatetime.c:445 +msgctxt "full month name with day" +msgid "March" +msgstr "mars" + +#: glib/gdatetime.c:447 +msgctxt "full month name with day" +msgid "April" +msgstr "april" + +#: glib/gdatetime.c:449 +msgctxt "full month name with day" +msgid "May" +msgstr "mai" + +#: glib/gdatetime.c:451 +msgctxt "full month name with day" +msgid "June" +msgstr "juni" + +#: glib/gdatetime.c:453 +msgctxt "full month name with day" +msgid "July" +msgstr "juli" + +#: glib/gdatetime.c:455 +msgctxt "full month name with day" +msgid "August" +msgstr "august" + +#: glib/gdatetime.c:457 +msgctxt "full month name with day" +msgid "September" +msgstr "september" + +#: glib/gdatetime.c:459 +msgctxt "full month name with day" +msgid "October" +msgstr "oktober" + +#: glib/gdatetime.c:461 +msgctxt "full month name with day" +msgid "November" +msgstr "november" + +#: glib/gdatetime.c:463 +msgctxt "full month name with day" +msgid "December" +msgstr "desember" + +#. Translators: Some languages need different grammatical forms of +#. * month names depending on whether they are standalone or in a full +#. * date context, with the day number. Some may prefer starting with +#. * uppercase when they are standalone and with lowercase when they are +#. * in a full date context. Here are abbreviated month names in a form +#. * appropriate when they are used in a full date context, with the +#. * day number. However, as these names are abbreviated the grammatical +#. * difference is visible probably only in Belarusian and Russian. +#. * In other languages there is no difference between the standalone +#. * and complete date form when they are abbreviated. If your system +#. * is Linux with the glibc version 2.27 (released Feb 1, 2018) or newer +#. * then you can refer to the date command line utility and see what the +#. * command `date +%b' produces. Also in the latest Linux the command +#. * `locale abmon' in your native locale produces a complete list of +#. * month names almost ready to copy and paste here. In other systems +#. * due to a bug the result is incorrect in some languages. +#. +#: glib/gdatetime.c:528 +msgctxt "abbreviated month name with day" +msgid "Jan" +msgstr "jan" + +#: glib/gdatetime.c:530 +msgctxt "abbreviated month name with day" +msgid "Feb" +msgstr "feb" + +#: glib/gdatetime.c:532 +msgctxt "abbreviated month name with day" +msgid "Mar" +msgstr "mar" + +#: glib/gdatetime.c:534 +msgctxt "abbreviated month name with day" +msgid "Apr" +msgstr "apr" + +#: glib/gdatetime.c:536 +msgctxt "abbreviated month name with day" +msgid "May" +msgstr "mai" + +#: glib/gdatetime.c:538 +msgctxt "abbreviated month name with day" +msgid "Jun" +msgstr "jun" + +#: glib/gdatetime.c:540 +msgctxt "abbreviated month name with day" +msgid "Jul" +msgstr "jul" + +#: glib/gdatetime.c:542 +msgctxt "abbreviated month name with day" +msgid "Aug" +msgstr "aug" + +#: glib/gdatetime.c:544 +msgctxt "abbreviated month name with day" +msgid "Sep" +msgstr "sep" + +#: glib/gdatetime.c:546 +msgctxt "abbreviated month name with day" +msgid "Oct" +msgstr "okt" + +#: glib/gdatetime.c:548 +msgctxt "abbreviated month name with day" +msgid "Nov" +msgstr "nov" + +#: glib/gdatetime.c:550 +msgctxt "abbreviated month name with day" +msgid "Dec" +msgstr "des" + #. Translators: 'before midday' indicator -#: ../glib/gdatetime.c:355 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: ../glib/gdatetime.c:358 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: ../glib/gdir.c:155 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Feil under åpning av katalog «%s»: %s" -#: ../glib/gfileutils.c:716 ../glib/gfileutils.c:808 -#, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Kunne ikke allokere %lu byte til lest fil «%s»" -msgstr[1] "Kunne ikke allokere %lu bytes til lest fil «%s»" +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 +#, fuzzy, c-format +#| msgid "Could not allocate %lu byte to read file “%s”" +#| msgid_plural "Could not allocate %lu bytes to read file “%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "Kunne ikke allokere %lu byte til lest fil «%s»" -#: ../glib/gfileutils.c:733 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Feil ved lesing av fil «%s»: %s" -#: ../glib/gfileutils.c:769 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Fil «%s» er for stor" -#: ../glib/gfileutils.c:833 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Klarte ikke å lese fra fil «%s»: %s" -#: ../glib/gfileutils.c:881 ../glib/gfileutils.c:953 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Klarte ikke å åpne fil «%s»: %s" -#: ../glib/gfileutils.c:893 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Klarte ikke å hente attributter for fil «%s»: fstat() feilet: %s" -#: ../glib/gfileutils.c:923 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Klarte ikke å åpne fil «%s»: fdopen() feilet: %s" -#: ../glib/gfileutils.c:1022 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Klarte ikke å endre navn på fil «%s» til «%s»: g_rename() feilet: %s" -#: ../glib/gfileutils.c:1057 ../glib/gfileutils.c:1564 -#, c-format -msgid "Failed to create file “%s”: %s" -msgstr "Klarte ikke å opprette fil «%s»: %s" +#: glib/gfileutils.c:1149 +#, fuzzy, c-format +#| msgid "Failed to write file “%s”: write() failed: %s" +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Klarte ikke å skrive fil «%s»: write() feilet: %s" -#: ../glib/gfileutils.c:1084 +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Klarte ikke å skrive fil «%s»: write() feilet: %s" -#: ../glib/gfileutils.c:1127 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Klarte ikke å skrive fil «%s»: fsync() feilet: %s" -#: ../glib/gfileutils.c:1251 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 +#, c-format +msgid "Failed to create file “%s”: %s" +msgstr "Klarte ikke å opprette fil «%s»: %s" + +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Eksisterende fil «%s» kunne ikke fjernes: g_unlink() feilet: %s" -#: ../glib/gfileutils.c:1530 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Mal «%s» er ugyldig, må ikke inneholde «%s»" -#: ../glib/gfileutils.c:1543 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Mal «%s» inneholder ikke XXXXXX" -#: ../glib/gfileutils.c:2079 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Klarte ikke å lese symbolsk lenke «%s»: %s" -#: ../glib/giochannel.c:1389 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Kunne ikke åpne konverterer fra «%s» til «%s»: %s" -#: ../glib/giochannel.c:1734 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Kan ikke utføre rå avlesing i g_io_channel_read_line_string" -#: ../glib/giochannel.c:1781 ../glib/giochannel.c:2039 -#: ../glib/giochannel.c:2126 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Overflødig ikke-konvertert data i innlesingsbuffer" -#: ../glib/giochannel.c:1862 ../glib/giochannel.c:1939 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanalen terminerer i et oppdelt tegn" -#: ../glib/giochannel.c:1925 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Kan ikke utføre rå avlesing i g_io_channel_read_to_end" -#: ../glib/gkeyfile.c:788 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Gyldig nøkkelfil ble ikke funnet i søkemapper" -#: ../glib/gkeyfile.c:825 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Ikke en vanlig fil" -#: ../glib/gkeyfile.c:1270 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -4529,50 +5419,51 @@ msgstr "" "Nøkkelfil inneholder linjen «%s» som ikke er et par med nøkkelverdier, " "gruppe eller kommentar" -#: ../glib/gkeyfile.c:1327 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Ugyldig navn på gruppe: %s" -#: ../glib/gkeyfile.c:1349 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Nøkkelfil starter ikke med en gruppe" -#: ../glib/gkeyfile.c:1375 -#, c-format -msgid "Invalid key name: %s" +#: glib/gkeyfile.c:1391 +#, fuzzy, c-format +#| msgid "Invalid key name: %s" +msgid "Invalid key name: %.*s" msgstr "Ugyldig navn på nøkkel: %s" -#: ../glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Nøkkelfil inneholder ustøttet tegnkoding «%s»" -#: ../glib/gkeyfile.c:1645 ../glib/gkeyfile.c:1818 ../glib/gkeyfile.c:3198 -#: ../glib/gkeyfile.c:3261 ../glib/gkeyfile.c:3391 ../glib/gkeyfile.c:3521 -#: ../glib/gkeyfile.c:3665 ../glib/gkeyfile.c:3894 ../glib/gkeyfile.c:3961 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Nøkkelfil har ikke gruppe «%s»" -#: ../glib/gkeyfile.c:1773 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Nøkkelfilen har ikke nøkkel «%s» i gruppe «%s»" -#: ../glib/gkeyfile.c:1935 ../glib/gkeyfile.c:2051 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Nøkkelfilen inneholder nøkkel «%s» med verdi «%s» som ikke er UTF-8" -#: ../glib/gkeyfile.c:1955 ../glib/gkeyfile.c:2071 ../glib/gkeyfile.c:2440 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Nøkkelfilen inneholder nøkkel «%s» som har en verdi som ikke kan bli tolket." -#: ../glib/gkeyfile.c:2658 ../glib/gkeyfile.c:3027 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -4581,218 +5472,273 @@ msgstr "" "Nøkkelfilen inneholder nøkkel «%s» i gruppe «%s» som har en verdi som ikke " "kan bli tolket." -#: ../glib/gkeyfile.c:2736 ../glib/gkeyfile.c:2813 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Nøkkel «%s» i gruppe «%s» har en verdi «%s» hvor %s var forventet" -#: ../glib/gkeyfile.c:4201 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Nøkkelfilen inneholder skiftetegn ved linjeslutt" -#: ../glib/gkeyfile.c:4223 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Nøkkelfil inneholder ugyldig skiftesekvens «%s»" -#: ../glib/gkeyfile.c:4367 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Vedi «%s» kan ikke tolkes som et tall." -#: ../glib/gkeyfile.c:4381 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Heltallsverdi «%s» er utenfor gyldig område" -#: ../glib/gkeyfile.c:4414 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Verdi «%s» kan ikke tolkes som et flyttall." -#: ../glib/gkeyfile.c:4453 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Verdi «%s» kan ikke tolkes som en bolsk verdi." -#: ../glib/gmappedfile.c:129 +#: glib/gmappedfile.c:135 #, c-format msgid "Failed to get attributes of file “%s%s%s%s”: fstat() failed: %s" msgstr "Klarte ikke å hente attributter for fil «%s%s%s%s»: fstat() feilet: %s" -#: ../glib/gmappedfile.c:195 +#: glib/gmappedfile.c:201 #, c-format msgid "Failed to map %s%s%s%s: mmap() failed: %s" msgstr "Kunne ikke lese fil «%s%s%s%s» inn i minnet: mmap() feilet: %s" -#: ../glib/gmappedfile.c:262 +#: glib/gmappedfile.c:268 #, c-format msgid "Failed to open file “%s”: open() failed: %s" msgstr "Klarte ikke å åpne fil «%s»: open() feilet: %s" -#: ../glib/gmarkup.c:397 ../glib/gmarkup.c:439 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Feil på linje %d tegn %d: " -#: ../glib/gmarkup.c:461 ../glib/gmarkup.c:544 -#, c-format -msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +#: glib/gmarkup.c:408 glib/gmarkup.c:491 +#, fuzzy, c-format +#| msgid "Invalid UTF-8 encoded text in name - not valid '%s'" +msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Ugyldig UTF-8 kodet tekst i navn - ikke gyldig «%s»" -#: ../glib/gmarkup.c:472 -#, c-format -msgid "'%s' is not a valid name" +#: glib/gmarkup.c:419 +#, fuzzy, c-format +#| msgid "'%s' is not a valid name" +msgid "“%s” is not a valid name" msgstr "«%s» er ikke et gyldig navn" -#: ../glib/gmarkup.c:488 -#, c-format -msgid "'%s' is not a valid name: '%c'" +#: glib/gmarkup.c:435 +#, fuzzy, c-format +#| msgid "'%s' is not a valid name: '%c'" +msgid "“%s” is not a valid name: “%c”" msgstr "«%s» er ikke et gyldig navn: «%c»" -#: ../glib/gmarkup.c:598 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Feil på linje %d: %s" -#: ../glib/gmarkup.c:675 -#, c-format +#: glib/gmarkup.c:636 +#, fuzzy, c-format +#| msgid "" +#| "Failed to parse '%-.*s', which should have been a digit inside a " +#| "character reference (ê for example) - perhaps the digit is too large" msgid "" -"Failed to parse '%-.*s', which should have been a digit inside a character " -"reference (ê for example) - perhaps the digit is too large" +"Failed to parse “%-.*s”, which should have been a digit inside a character " +"reference (ê for example) — perhaps the digit is too large" msgstr "" "Feil under lesing av «%-.*s», som skulle vært et tall inne i en " "tegnreferanse (ê for eksempel) - tallet er muligens for stort" -#: ../glib/gmarkup.c:687 +#: glib/gmarkup.c:648 +#, fuzzy +#| msgid "" +#| "Character reference did not end with a semicolon; most likely you used an " +#| "ampersand character without intending to start an entity - escape " +#| "ampersand as &" msgid "" "Character reference did not end with a semicolon; most likely you used an " -"ampersand character without intending to start an entity - escape ampersand " +"ampersand character without intending to start an entity — escape ampersand " "as &" msgstr "" "Tegnreferansen sluttet ikke med et semikolon; du har sannsynligvis brukt et " "og-tegn uten at det var ment å starte en entitet - unngå ved å bruke & i " "stedet" -#: ../glib/gmarkup.c:713 -#, c-format -msgid "Character reference '%-.*s' does not encode a permitted character" +#: glib/gmarkup.c:674 +#, fuzzy, c-format +#| msgid "Character reference '%-.*s' does not encode a permitted character" +msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Tegnreferanse «%-.*s» koder ikke et tillatt tegn" -#: ../glib/gmarkup.c:751 +#: glib/gmarkup.c:712 +#, fuzzy +#| msgid "" +#| "Empty entity '&;' seen; valid entities are: & " < > '" msgid "" -"Empty entity '&;' seen; valid entities are: & " < > '" +"Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Tom entitet «&;» funnet; gyldige entiteter er: & " < > '" -#: ../glib/gmarkup.c:759 -#, c-format -msgid "Entity name '%-.*s' is not known" +#: glib/gmarkup.c:720 +#, fuzzy, c-format +#| msgid "Entity name '%-.*s' is not known" +msgid "Entity name “%-.*s” is not known" msgstr "Entitetsnavn «%-.*s» er ikke kjent" -#: ../glib/gmarkup.c:764 +#: glib/gmarkup.c:725 +#, fuzzy +#| msgid "" +#| "Entity did not end with a semicolon; most likely you used an ampersand " +#| "character without intending to start an entity - escape ampersand as &" msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " -"character without intending to start an entity - escape ampersand as &" +"character without intending to start an entity — escape ampersand as &" msgstr "" "Entiteten sluttet ikke med et semikolon; du har sannsynligvis brukt et og-" "tegn uten at det var ment å starte en entitet - ungå ved å bruke & i " "stedet" -#: ../glib/gmarkup.c:1170 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumentet må starte med et element (f.eks )" -#: ../glib/gmarkup.c:1210 -#, c-format +#: glib/gmarkup.c:1179 +#, fuzzy, c-format +#| msgid "" +#| "'%s' is not a valid character following a '<' character; it may not begin " +#| "an element name" msgid "" -"'%s' is not a valid character following a '<' character; it may not begin an " +"“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "" "«%s» er ikke et gyldig tegn etter en «<» tegn; det kan ikke være begynnelsen " "på et elementnavn" -#: ../glib/gmarkup.c:1252 -#, c-format +#: glib/gmarkup.c:1222 +#, fuzzy, c-format +#| msgid "" +#| "Odd character '%s', expected a '>' character to end the empty-element tag " +#| "'%s'" msgid "" -"Odd character '%s', expected a '>' character to end the empty-element tag " -"'%s'" +"Odd character “%s”, expected a “>” character to end the empty-element tag " +"“%s”" msgstr "" "Rart tegn «%s», forventet et «>» tegn for å avslutte start-taggen til det " "tomme elementet «%s»" -#: ../glib/gmarkup.c:1333 -#, c-format +#: glib/gmarkup.c:1292 +#, fuzzy, c-format +#| msgid "Unexpected attribute “%s” for element “%s”" +msgid "Too many attributes in element “%s”" +msgstr "Uventet attributt «%s» for element «%s»" + +#: glib/gmarkup.c:1312 +#, fuzzy, c-format +#| msgid "" +#| "Odd character '%s', expected a '=' after attribute name '%s' of element " +#| "'%s'" msgid "" -"Odd character '%s', expected a '=' after attribute name '%s' of element '%s'" +"Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" "Rart tegn «%s», forventet et «=» etter attributtnavn «%s» for element «%s»" -#: ../glib/gmarkup.c:1374 -#, c-format +#: glib/gmarkup.c:1354 +#, fuzzy, c-format +#| msgid "" +#| "Odd character '%s', expected a '>' or '/' character to end the start tag " +#| "of element '%s', or optionally an attribute; perhaps you used an invalid " +#| "character in an attribute name" msgid "" -"Odd character '%s', expected a '>' or '/' character to end the start tag of " -"element '%s', or optionally an attribute; perhaps you used an invalid " +"Odd character “%s”, expected a “>” or “/” character to end the start tag of " +"element “%s”, or optionally an attribute; perhaps you used an invalid " "character in an attribute name" msgstr "" "Rart tegn «%s», forventet «>» eller «/» tegn for å avslutte start-taggen til " "element «%s», eller alternativt en attributt; kanskje du brukte et ugyldig " "tegn i attributtnavnet" -#: ../glib/gmarkup.c:1418 -#, c-format +#: glib/gmarkup.c:1399 +#, fuzzy, c-format +#| msgid "" +#| "Odd character '%s', expected an open quote mark after the equals sign " +#| "when giving value for attribute '%s' of element '%s'" msgid "" -"Odd character '%s', expected an open quote mark after the equals sign when " -"giving value for attribute '%s' of element '%s'" +"Odd character “%s”, expected an open quote mark after the equals sign when " +"giving value for attribute “%s” of element “%s”" msgstr "" "Rart tegn «%s», ventet et åpent sitattegn etter likhetstegnet når verdi for " "attributt «%s» for element «%s» oppgis" -#: ../glib/gmarkup.c:1551 -#, c-format +#: glib/gmarkup.c:1533 +#, fuzzy, c-format +#| msgid "" +#| "'%s' is not a valid character following the characters ''" msgid "" -"'%s' is not a valid character following the close element name '%s'; the " -"allowed character is '>'" +"“%s” is not a valid character following the close element name “%s”; the " +"allowed character is “>”" msgstr "" "«%s» er ikke et gyldig tegn etter element for lukking med navn «%s»; tillatt " "tegn er «>»" -#: ../glib/gmarkup.c:1598 -#, c-format -msgid "Element '%s' was closed, no element is currently open" +#: glib/gmarkup.c:1583 +#, fuzzy, c-format +#| msgid "Element '%s' was closed, no element is currently open" +msgid "Element “%s” was closed, no element is currently open" msgstr "Element «%s» ble lukket, ingen åpne elementer nå" -#: ../glib/gmarkup.c:1607 -#, c-format -msgid "Element '%s' was closed, but the currently open element is '%s'" +#: glib/gmarkup.c:1592 +#, fuzzy, c-format +#| msgid "Element '%s' was closed, but the currently open element is '%s'" +msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Element «%s» ble lukket, men aktivt åpent element er «%s»" -#: ../glib/gmarkup.c:1760 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokumentet var tomt eller inneholdt kun blanke tegn" -#: ../glib/gmarkup.c:1774 -msgid "Document ended unexpectedly just after an open angle bracket '<'" +#: glib/gmarkup.c:1759 +#, fuzzy +#| msgid "Document ended unexpectedly just after an open angle bracket '<'" +msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokumentet sluttet uventet rett etter en åpen vinkelparantes «<»" -#: ../glib/gmarkup.c:1782 ../glib/gmarkup.c:1827 -#, c-format +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 +#, fuzzy, c-format +#| msgid "" +#| "Document ended unexpectedly with elements still open - '%s' was the last " +#| "element opened" msgid "" -"Document ended unexpectedly with elements still open - '%s' was the last " +"Document ended unexpectedly with elements still open — “%s” was the last " "element opened" msgstr "" "Dokumentet sluttet uventet med åpne elementer - «%s» var siste åpne element" -#: ../glib/gmarkup.c:1790 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -4801,19 +5747,19 @@ msgstr "" "Dokumentet sluttet uventet, forventet å se en vinkelparantes for å slutte av " "den siste taggen <%s/>" -#: ../glib/gmarkup.c:1796 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokumentet sluttet uventet inni et elementnavn" -#: ../glib/gmarkup.c:1802 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokumentet sluttet uventet inni et attributtnavn" -#: ../glib/gmarkup.c:1807 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokumentet sluttet uventet inni en tagg for åpning av element." -#: ../glib/gmarkup.c:1813 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -4821,311 +5767,261 @@ msgstr "" "Dokumentet sluttet uventet etter likhetstegnet som følger et attributtnavn; " "ingen attributtverdi" -#: ../glib/gmarkup.c:1820 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokumentet sluttet uventet inni en attributtverdi" -#: ../glib/gmarkup.c:1836 -#, c-format -msgid "Document ended unexpectedly inside the close tag for element '%s'" +#: glib/gmarkup.c:1822 +#, fuzzy, c-format +#| msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokumentet sluttet uventet inni tagg for lukking av element «%s»" -#: ../glib/gmarkup.c:1842 +#: glib/gmarkup.c:1826 +#, fuzzy +#| msgid "Document ended unexpectedly inside the close tag for element '%s'" +msgid "" +"Document ended unexpectedly inside the close tag for an unopened element" +msgstr "Dokumentet sluttet uventet inni tagg for lukking av element «%s»" + +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokumentet sluttet uventet inni en kommentar eller prosesseringsinstruksjon" -#: ../glib/goption.c:861 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[FLAGG …]" -#: ../glib/goption.c:977 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Flagg for hjelp:" -#: ../glib/goption.c:978 +#: glib/goption.c:833 msgid "Show help options" msgstr "Vis flagg for hjelp" -#: ../glib/goption.c:984 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Vis alle flagg for hjelp" -#: ../glib/goption.c:1047 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Flagg for applikasjonen" -#: ../glib/goption.c:1049 +#: glib/goption.c:904 msgid "Options:" msgstr "Flagg:" -#: ../glib/goption.c:1113 ../glib/goption.c:1183 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Kan ikke lese heltallsverdi «%s» for %s" -#: ../glib/goption.c:1123 ../glib/goption.c:1191 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Heltallsverdi «%s» for %s er utenfor gyldig område" -#: ../glib/goption.c:1148 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Kan ikke lese verdi for double «%s» for %s" -#: ../glib/goption.c:1156 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Double-verdi «%s» for %s er utenfor gyldig område" -#: ../glib/goption.c:1448 ../glib/goption.c:1527 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Feil under tolking av flagg %s" -#: ../glib/goption.c:1558 ../glib/goption.c:1671 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Mangler argument for %s" -#: ../glib/goption.c:2132 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Ukjent flagg %s" -#: ../glib/gregex.c:257 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "korrupt objekt" -#: ../glib/gregex.c:259 -msgid "internal error or corrupted object" -msgstr "intern feil eller korrupt objekt" - -#: ../glib/gregex.c:261 +#: glib/gregex.c:488 msgid "out of memory" msgstr "ikke mer minne" -#: ../glib/gregex.c:266 -msgid "backtracking limit reached" -msgstr "grense for liste av funksjonskall nådd" - -#: ../glib/gregex.c:278 ../glib/gregex.c:286 -msgid "the pattern contains items not supported for partial matching" -msgstr "mønsteret inneholder oppføringer som ikke støttes for delvise treff" - -#: ../glib/gregex.c:280 +#: glib/gregex.c:503 msgid "internal error" msgstr "intern feil" -#: ../glib/gregex.c:288 +#: glib/gregex.c:505 +msgid "the pattern contains items not supported for partial matching" +msgstr "mønsteret inneholder oppføringer som ikke støttes for delvise treff" + +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "bakoverreferanser som betingelser er ikke støttet for delvise treff" -#: ../glib/gregex.c:297 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "rekursjonsgrense nådd" -#: ../glib/gregex.c:299 -msgid "invalid combination of newline flags" -msgstr "ugyldig kombinasjon av flagg for nye linjer" - -#: ../glib/gregex.c:301 +#: glib/gregex.c:515 msgid "bad offset" msgstr "ugyldig offset" -#: ../glib/gregex.c:303 -msgid "short utf8" -msgstr "kort utf8" - -#: ../glib/gregex.c:305 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekursjonsløkke" -#: ../glib/gregex.c:309 +#. should not happen in GRegex since we check modes before each match +#: glib/gregex.c:520 +msgid "matching mode is requested that was not compiled for JIT" +msgstr "" + +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "ukjent feil" -#: ../glib/gregex.c:329 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ på slutten av mønsteret" -#: ../glib/gregex.c:332 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c på slutten av mønsteret" -#: ../glib/gregex.c:335 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "ugjenkjennelig tegn følger \\" -#: ../glib/gregex.c:338 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "tall ute av rekkefølge i {}-kvantifikator" -#: ../glib/gregex.c:341 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "for stort tall i {}-kvantifikator" -#: ../glib/gregex.c:344 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "mangler terminerende ] for tegnklassen" -#: ../glib/gregex.c:347 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "ugyldig escape-sekvens i tegnklassen" -#: ../glib/gregex.c:350 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "område utenfor rekkefølge i tegnklassen" -#: ../glib/gregex.c:353 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "ingenting å gjenta" -#: ../glib/gregex.c:357 -msgid "unexpected repeat" -msgstr "uventet gjentagelse" - -#: ../glib/gregex.c:360 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "ikke gjenkjent tegn etter (? eller (?-" -#: ../glib/gregex.c:363 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "klasser med POSIX-navngivning støttes kun innen en klasse" -#: ../glib/gregex.c:366 -msgid "missing terminating )" -msgstr "mangler terminerende )" - -#: ../glib/gregex.c:369 -msgid "reference to non-existent subpattern" -msgstr "referanse til ikke-eksisterende undermønster" - -#: ../glib/gregex.c:372 -msgid "missing ) after comment" -msgstr "mangler ) etter kommentar" - -#: ../glib/gregex.c:375 -msgid "regular expression is too large" -msgstr "regulært uttrykk er for stort" - -#: ../glib/gregex.c:378 -msgid "failed to get memory" -msgstr "ikke nok minne" - -#: ../glib/gregex.c:382 -msgid ") without opening (" -msgstr ") uten åpnende (" - -#: ../glib/gregex.c:386 -msgid "code overflow" -msgstr "kodeoverflyt" - -#: ../glib/gregex.c:390 -msgid "unrecognized character after (?<" -msgstr "ikke gjenkjent tegn etter (?<" - -#: ../glib/gregex.c:393 -msgid "lookbehind assertion is not fixed length" -msgstr "lookbehind-regel er ikke av fast lengde" - -#: ../glib/gregex.c:396 -msgid "malformed number or name after (?(" -msgstr "ugyldig tall eller navn etter (?(" - -#: ../glib/gregex.c:399 -msgid "conditional group contains more than two branches" -msgstr "betinget gruppe inneholder mer enn to grener" - -#: ../glib/gregex.c:402 -msgid "assertion expected after (?(" -msgstr "assert forventet etter (?(" - -#. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) -#. * sequences here, '(?-54' would be an example for the second group. -#. -#: ../glib/gregex.c:409 -msgid "(?R or (?[+-]digits must be followed by )" -msgstr "(?R eller (?[+-]tall må følges av )" - -#: ../glib/gregex.c:412 -msgid "unknown POSIX class name" -msgstr "ukjent navn på POSIX-klasse" - -#: ../glib/gregex.c:415 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX elementer for sammenslåing er ikke støttet" -#: ../glib/gregex.c:418 +#: glib/gregex.c:614 +msgid "missing terminating )" +msgstr "mangler terminerende )" + +#: glib/gregex.c:618 +msgid "reference to non-existent subpattern" +msgstr "referanse til ikke-eksisterende undermønster" + +#: glib/gregex.c:622 +msgid "missing ) after comment" +msgstr "mangler ) etter kommentar" + +#: glib/gregex.c:626 +msgid "regular expression is too large" +msgstr "regulært uttrykk er for stort" + +#: glib/gregex.c:630 +msgid "malformed number or name after (?(" +msgstr "ugyldig tall eller navn etter (?(" + +#: glib/gregex.c:634 +msgid "lookbehind assertion is not fixed length" +msgstr "lookbehind-regel er ikke av fast lengde" + +#: glib/gregex.c:638 +msgid "conditional group contains more than two branches" +msgstr "betinget gruppe inneholder mer enn to grener" + +#: glib/gregex.c:642 +msgid "assertion expected after (?(" +msgstr "assert forventet etter (?(" + +#: glib/gregex.c:646 +msgid "a numbered reference must not be zero" +msgstr "en nummerert referanse må ikke være null" + +#: glib/gregex.c:650 +msgid "unknown POSIX class name" +msgstr "ukjent navn på POSIX-klasse" + +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "tegnverdi i \\x{…} sekvens er for stor" -#: ../glib/gregex.c:421 -msgid "invalid condition (?(0)" -msgstr "ugyldig betingelse (?(0)" - -#: ../glib/gregex.c:424 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C er ikke tillatt i «lookbehind assertion»" -#: ../glib/gregex.c:431 -msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" -msgstr "escape-verdier \\L, \\l, \\N{name}, \\U og \\u er ikke støttet" - -#: ../glib/gregex.c:434 -msgid "recursive call could loop indefinitely" -msgstr "rekursivt kall kunne gå i uendelig løkke" - -#: ../glib/gregex.c:438 -msgid "unrecognized character after (?P" -msgstr "ikke gjenkjent tegn etter (?P" - -#: ../glib/gregex.c:441 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "mangler terminering av navn på undermønster" -#: ../glib/gregex.c:444 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "to navngitte undermønster har samme navn" -#: ../glib/gregex.c:447 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "ugyldig \\P- eller \\p-sekvens" -#: ../glib/gregex.c:450 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "ukjent navn på egenskap etter \\P eller \\p" -#: ../glib/gregex.c:453 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "navn på undermønster er for langt (maks 32 tegn)" -#: ../glib/gregex.c:456 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "for mange navngitte undermønster (maks 10.000)" -#: ../glib/gregex.c:459 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "oktal verdi er større enn \\377" -#: ../glib/gregex.c:463 -msgid "overran compiling workspace" -msgstr "gikk ut over arbeidsområde for kompilering" - -#: ../glib/gregex.c:467 -msgid "previously-checked referenced subpattern not found" -msgstr "tidligere sjekket og referert undermønster ikke funnet" - -#: ../glib/gregex.c:470 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE-gruppe inneholder mer enn en gren" -#: ../glib/gregex.c:473 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "inkonsistente NEWLINE-alternativer" -#: ../glib/gregex.c:476 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5133,274 +6029,289 @@ msgstr "" "\\g etterfølges ikke av et navn, eller tall i klammeparanteser, hakeparantes " "eller sitattegn" -#: ../glib/gregex.c:480 -msgid "a numbered reference must not be zero" -msgstr "en nummerert referanse må ikke være null" - -#: ../glib/gregex.c:483 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "et argument tillates ikke for (*ACCEPT), (*FAIL) eller (*COMMIT)" -#: ../glib/gregex.c:486 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) gjenkjennes ikke" -#: ../glib/gregex.c:489 +#: glib/gregex.c:712 msgid "number is too big" msgstr "tallet er for stort" -#: ../glib/gregex.c:492 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "mangler navn på undermønster etter (?&" -#: ../glib/gregex.c:495 -msgid "digit expected after (?+" -msgstr "tall forventet etter (?+" - -#: ../glib/gregex.c:498 -msgid "] is an invalid data character in JavaScript compatibility mode" -msgstr "] er et ugyldig datategn i kompatibilitetsmodus for JavaScript" - -#: ../glib/gregex.c:501 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "forskjellige navn for undermønster med samme nummer tillates ikke" -#: ../glib/gregex.c:504 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) må ha et argument" -#: ../glib/gregex.c:507 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c må etterfølges av et ASCII-tegn" -#: ../glib/gregex.c:510 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k etterfølges ikke av et navn i klammeparanteser, hakeparantes eller " "sitattegn" -#: ../glib/gregex.c:513 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N er ikke støttet i en klasse" -#: ../glib/gregex.c:516 -msgid "too many forward references" -msgstr "for mange fremoverreferanser" - -#: ../glib/gregex.c:519 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "for langt navn i (*MARK), (*PRUNE), (*SKIP) eller (*THEN)" -#: ../glib/gregex.c:522 -msgid "character value in \\u.... sequence is too large" -msgstr "tegnverdi i \\u.... sekvens er for stor" +#: glib/gregex.c:744 glib/gregex.c:880 +msgid "code overflow" +msgstr "kodeoverflyt" -#: ../glib/gregex.c:745 ../glib/gregex.c:1977 +#: glib/gregex.c:748 +msgid "unrecognized character after (?P" +msgstr "ikke gjenkjent tegn etter (?P" + +#: glib/gregex.c:752 +msgid "overran compiling workspace" +msgstr "gikk ut over arbeidsområde for kompilering" + +#: glib/gregex.c:756 +msgid "previously-checked referenced subpattern not found" +msgstr "tidligere sjekket og referert undermønster ikke funnet" + +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Feil under treff på regulært uttrykk %s: %s" -#: ../glib/gregex.c:1316 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8" -#: ../glib/gregex.c:1320 -msgid "PCRE library is compiled without UTF8 properties support" -msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8-egenskaper" - -#: ../glib/gregex.c:1328 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE-biblioteket er kompilert med inkompatible alternativer" -#: ../glib/gregex.c:1357 -#, c-format -msgid "Error while optimizing regular expression %s: %s" -msgstr "Feil under optimering av reguært utrykk %s: %s" - -#: ../glib/gregex.c:1437 -#, c-format -msgid "Error while compiling regular expression %s at char %d: %s" +#: glib/gregex.c:1878 +#, fuzzy, c-format +#| msgid "Error while compiling regular expression %s at char %d: %s" +msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Feil under sammensetting av regulært utrykk %s ved tegn %d: %s" -#: ../glib/gregex.c:2413 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "heksadesimalt tall eller «}» forventet" -#: ../glib/gregex.c:2429 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "heksadesimalt tall forventet" -#: ../glib/gregex.c:2469 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "mangler «<» i symbolsk referanse" -#: ../glib/gregex.c:2478 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "uferdig symbolsk referanse" -#: ../glib/gregex.c:2485 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "symbolsk referanse med null lengde" -#: ../glib/gregex.c:2496 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "tall forventet" -#: ../glib/gregex.c:2514 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "ugyldig symbolsk referanse" -#: ../glib/gregex.c:2576 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "feilplassert siste «\\\\»" -#: ../glib/gregex.c:2580 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "ukjent escapesekvens" -#: ../glib/gregex.c:2590 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Feil under tolking av erstatningstekst «%s» ved tegn %lu: %s" -#: ../glib/gshell.c:94 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Sitert tekst begynner ikke med sitattegn" -#: ../glib/gshell.c:184 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Ubalansert sitattegn i kommandolinje eller annen skall-sitert tekst" -#: ../glib/gshell.c:580 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Teksten sluttet rett etter et «\\» tegn. (Teksten var «%s»)" -#: ../glib/gshell.c:587 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Teksten sluttet før likt sitattegn ble funnet for %c. (Teksten var «%s»)" -#: ../glib/gshell.c:599 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Teksten var tom (eller inneholdt kun blanke tegn)" -#: ../glib/gspawn.c:253 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Feil under lesing av data fra underprosess (%s)" -#: ../glib/gspawn.c:401 -#, c-format -msgid "Unexpected error in select() reading data from a child process (%s)" +#: glib/gspawn.c:395 +#, fuzzy, c-format +#| msgid "Unexpected error in select() reading data from a child process (%s)" +msgid "Unexpected error in reading data from a child process (%s)" msgstr "Uventet feil i select() ved lesing av data fra underprosess (%s)" -#: ../glib/gspawn.c:486 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Uventet feil i waitpid() (%s)" -#: ../glib/gspawn.c:897 ../glib/gspawn-win32.c:1231 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Underprosess avsluttet med kode %ld" -#: ../glib/gspawn.c:905 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Underprosess terminert av signal %ld" -#: ../glib/gspawn.c:912 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Underprosess stoppet av signal %ld" -#: ../glib/gspawn.c:919 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Underprosess avsluttet unormalt" -#: ../glib/gspawn.c:1324 ../glib/gspawn-win32.c:337 ../glib/gspawn-win32.c:345 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Feil under lesing fra \"child pipe\" (%s)" -#: ../glib/gspawn.c:1394 +#: glib/gspawn.c:2001 +#, fuzzy, c-format +#| msgid "Failed to execute child process “%s” (%s)" +msgid "Failed to spawn child process “%s” (%s)" +msgstr "Klarte ikke å kjøre underprosess «%s» (%s)" + +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Feil under kjøring av fork (%s)" -#: ../glib/gspawn.c:1543 ../glib/gspawn-win32.c:368 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Klarte ikke å skifte til katalog «%s» (%s)" -#: ../glib/gspawn.c:1553 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Klarte ikke å kjøre underprosess «%s» (%s)" -#: ../glib/gspawn.c:1563 -#, c-format -msgid "Failed to redirect output or input of child process (%s)" +#: glib/gspawn.c:2306 +#, fuzzy, c-format +#| msgid "Failed to open file “%s”: open() failed: %s" +msgid "Failed to open file to remap file descriptor (%s)" +msgstr "Klarte ikke å åpne fil «%s»: open() feilet: %s" + +#: glib/gspawn.c:2314 +#, fuzzy, c-format +#| msgid "Failed to redirect output or input of child process (%s)" +msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Feil under omdirigering av utdata eller inndata for underprosess (%s)" -#: ../glib/gspawn.c:1572 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Feil under kjøring av fork() for underprosess (%s)" -#: ../glib/gspawn.c:1580 +#: glib/gspawn.c:2331 +#, fuzzy, c-format +#| msgid "Failed to read data from child process (%s)" +msgid "Failed to close file descriptor for child process (%s)" +msgstr "Feil under lesing av data fra underprosess (%s)" + +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Ukjent feil under kjøring av underprosess «%s»" -#: ../glib/gspawn.c:1604 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Klarte ikke å lese nok data fra underprosessens pid-rør (%s)" -#: ../glib/gspawn-win32.c:281 +#: glib/gspawn-private.h:134 +#, fuzzy, c-format +#| msgid "Invalid seek request" +msgid "Invalid source FDs argument" +msgstr "Ugyldig søkeforespørsel" + +#: glib/gspawn-win32.c:416 msgid "Failed to read data from child process" msgstr "Feil under lesing av data fra underprosess" -#: ../glib/gspawn-win32.c:298 -#, c-format -msgid "Failed to create pipe for communicating with child process (%s)" -msgstr "Feil under oppretting av rør for kommunikasjon med underprosess (%s)" - -#: ../glib/gspawn-win32.c:374 ../glib/gspawn-win32.c:493 +#: glib/gspawn-win32.c:509 glib/gspawn-win32.c:514 glib/gspawn-win32.c:640 #, c-format msgid "Failed to execute child process (%s)" msgstr "Feil under kjøring av underprosess (%s)" -#: ../glib/gspawn-win32.c:443 +#: glib/gspawn-win32.c:519 +#, fuzzy, c-format +#| msgid "Failed to fork child process (%s)" +msgid "Failed to dup() in child process (%s)" +msgstr "Feil under kjøring av fork() for underprosess (%s)" + +#: glib/gspawn-win32.c:590 #, c-format msgid "Invalid program name: %s" msgstr "Ugyldig programnavn: %s" -#: ../glib/gspawn-win32.c:453 ../glib/gspawn-win32.c:720 +#: glib/gspawn-win32.c:600 glib/gspawn-win32.c:940 #, c-format msgid "Invalid string in argument vector at %d: %s" msgstr "Ugyldig streng i argumentvektor på %d: %s" -#: ../glib/gspawn-win32.c:464 ../glib/gspawn-win32.c:735 +#: glib/gspawn-win32.c:611 glib/gspawn-win32.c:956 #, c-format msgid "Invalid string in environment: %s" msgstr "Ugyldig streng i miljø: %s" -#: ../glib/gspawn-win32.c:716 +#: glib/gspawn-win32.c:936 #, c-format msgid "Invalid working directory: %s" msgstr "Ugyldig arbeidsmappe: %s" -#: ../glib/gspawn-win32.c:781 +#: glib/gspawn-win32.c:1001 #, c-format msgid "Failed to execute helper program (%s)" msgstr "Feil under kjøring av hjelpeprogram (%s)" -#: ../glib/gspawn-win32.c:995 +#: glib/gspawn-win32.c:1230 msgid "" "Unexpected error in g_io_channel_win32_poll() reading data from a child " "process" @@ -5408,178 +6319,276 @@ msgstr "" "Uventet feil i g_io_channel_win32_poll() under lesing av data fra en " "underprosess" -#: ../glib/gstrfuncs.c:3247 ../glib/gstrfuncs.c:3348 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Tom streng er ikke et tall" -#: ../glib/gstrfuncs.c:3271 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» er ikke et tall med fortegn" -#: ../glib/gstrfuncs.c:3281 ../glib/gstrfuncs.c:3384 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Tallet «%s» er utenfor grensene [%s, %s]" -#: ../glib/gstrfuncs.c:3374 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» er ikke et tall uten fortegn" -#: ../glib/gutf8.c:808 +#: glib/guri.c:309 +#, fuzzy, no-c-format +#| msgid " (invalid encoding)" +msgid "Invalid %-encoding in URI" +msgstr " (ugyldig koding)" + +#: glib/guri.c:326 +msgid "Illegal character in URI" +msgstr "" + +#: glib/guri.c:360 +msgid "Non-UTF-8 characters in URI" +msgstr "" + +#: glib/guri.c:540 +#, c-format +msgid "Invalid IPv6 address ‘%.*s’ in URI" +msgstr "" + +#: glib/guri.c:595 +#, c-format +msgid "Illegal encoded IP address ‘%.*s’ in URI" +msgstr "" + +#: glib/guri.c:607 +#, c-format +msgid "Illegal internationalized hostname ‘%.*s’ in URI" +msgstr "" + +#: glib/guri.c:639 glib/guri.c:651 +#, fuzzy, c-format +#| msgid "Could not parse “%s” as IP address mask" +msgid "Could not parse port ‘%.*s’ in URI" +msgstr "Kunne ikke lese «%s» som IP-adressemaske" + +#: glib/guri.c:658 +#, fuzzy, c-format +#| msgid "Double value “%s” for %s out of range" +msgid "Port ‘%.*s’ in URI is out of range" +msgstr "Double-verdi «%s» for %s er utenfor gyldig område" + +#: glib/guri.c:1221 glib/guri.c:1285 +#, fuzzy, c-format +#| msgid "The pathname “%s” is not an absolute path" +msgid "URI ‘%s’ is not an absolute URI" +msgstr "Stinavnet «%s» er ikke en absolutt sti" + +#: glib/guri.c:1227 +#, c-format +msgid "URI ‘%s’ has no host component" +msgstr "" + +#: glib/guri.c:1457 +msgid "URI is not absolute, and no base URI was provided" +msgstr "" + +#: glib/guri.c:2243 +msgid "Missing ‘=’ and parameter value" +msgstr "" + +#: glib/gutf8.c:900 msgid "Failed to allocate memory" msgstr "Klarte ikke å allokere minne" -#: ../glib/gutf8.c:941 +#: glib/gutf8.c:1033 msgid "Character out of range for UTF-8" msgstr "Tegn utenfor gyldig område for UTF-8" -#: ../glib/gutf8.c:1042 ../glib/gutf8.c:1051 ../glib/gutf8.c:1181 -#: ../glib/gutf8.c:1190 ../glib/gutf8.c:1329 ../glib/gutf8.c:1426 +#: glib/gutf8.c:1135 glib/gutf8.c:1144 glib/gutf8.c:1274 glib/gutf8.c:1283 +#: glib/gutf8.c:1422 glib/gutf8.c:1519 msgid "Invalid sequence in conversion input" msgstr "Ugyldig sekvens i inndata for konvertering" -#: ../glib/gutf8.c:1340 ../glib/gutf8.c:1437 +#: glib/gutf8.c:1433 glib/gutf8.c:1530 msgid "Character out of range for UTF-16" msgstr "Tegn utenfor gyldig område for UTF-16" -#: ../glib/gutils.c:2229 -#, c-format -msgid "%.1f kB" -msgstr "%.1f kB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kB" +#: glib/gutils.c:2966 +msgid "kB" +msgstr "" -#: ../glib/gutils.c:2230 ../glib/gutils.c:2436 -#, c-format -msgid "%.1f MB" -msgstr "%.1f MB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 MB" +#: glib/gutils.c:2968 +msgid "MB" +msgstr "" -#: ../glib/gutils.c:2231 ../glib/gutils.c:2441 -#, c-format -msgid "%.1f GB" -msgstr "%.1f GB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 GB" +#: glib/gutils.c:2970 +msgid "GB" +msgstr "" -#: ../glib/gutils.c:2232 ../glib/gutils.c:2446 -#, c-format -msgid "%.1f TB" -msgstr "%.1f TB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 TB" +#: glib/gutils.c:2972 +msgid "TB" +msgstr "" -#: ../glib/gutils.c:2233 ../glib/gutils.c:2451 -#, c-format -msgid "%.1f PB" -msgstr "%.1f PB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 PB" +#: glib/gutils.c:2974 +msgid "PB" +msgstr "" -#: ../glib/gutils.c:2234 ../glib/gutils.c:2456 -#, c-format -msgid "%.1f EB" -msgstr "%.1f EB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 EB" +#: glib/gutils.c:2976 +msgid "EB" +msgstr "" -#: ../glib/gutils.c:2237 -#, c-format -msgid "%.1f KiB" -msgstr "%.1f KiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 KiB" +#: glib/gutils.c:2980 +msgid "KiB" +msgstr "" -#: ../glib/gutils.c:2238 -#, c-format -msgid "%.1f MiB" -msgstr "%.1f MiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 MiB" +#: glib/gutils.c:2982 +msgid "MiB" +msgstr "" -#: ../glib/gutils.c:2239 -#, c-format -msgid "%.1f GiB" -msgstr "%.1f GiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 GiB" +#: glib/gutils.c:2984 +msgid "GiB" +msgstr "" -#: ../glib/gutils.c:2240 -#, c-format -msgid "%.1f TiB" -msgstr "%.1f TiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 TiB" +#: glib/gutils.c:2986 +msgid "TiB" +msgstr "" -#: ../glib/gutils.c:2241 -#, c-format -msgid "%.1f PiB" -msgstr "%.1f PiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 PiB" +#: glib/gutils.c:2988 +msgid "PiB" +msgstr "" -#: ../glib/gutils.c:2242 -#, c-format -msgid "%.1f EiB" -msgstr "%.1f EiB" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 EiB" +#: glib/gutils.c:2990 +msgid "EiB" +msgstr "" -#: ../glib/gutils.c:2245 -#, c-format -msgid "%.1f kb" -msgstr "%.1f kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" +#: glib/gutils.c:2994 +msgid "kbit" +msgstr "" -#: ../glib/gutils.c:2246 -#, c-format -msgid "%.1f Mb" -msgstr "%.1f Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" +#: glib/gutils.c:2996 +msgid "Mbit" +msgstr "" -#: ../glib/gutils.c:2247 -#, c-format -msgid "%.1f Gb" -msgstr "%.1f Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" +#: glib/gutils.c:2998 +msgid "Gbit" +msgstr "" -#: ../glib/gutils.c:2248 -#, c-format -msgid "%.1f Tb" -msgstr "%.1f Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" +#: glib/gutils.c:3000 +msgid "Tbit" +msgstr "" -#: ../glib/gutils.c:2249 -#, c-format -msgid "%.1f Pb" -msgstr "%.1f Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" +#: glib/gutils.c:3002 +msgid "Pbit" +msgstr "" -#: ../glib/gutils.c:2250 -#, c-format -msgid "%.1f Eb" -msgstr "%.1f Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" +#: glib/gutils.c:3004 +msgid "Ebit" +msgstr "" -#: ../glib/gutils.c:2253 -#, c-format -msgid "%.1f Kib" -msgstr "%.1f Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" +#: glib/gutils.c:3008 +msgid "Kibit" +msgstr "" -#: ../glib/gutils.c:2254 -#, c-format -msgid "%.1f Mib" -msgstr "%.1f Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" +#: glib/gutils.c:3010 +msgid "Mibit" +msgstr "" -#: ../glib/gutils.c:2255 -#, c-format -msgid "%.1f Gib" -msgstr "%.1f Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" +#: glib/gutils.c:3012 +msgid "Gibit" +msgstr "" -#: ../glib/gutils.c:2256 -#, c-format -msgid "%.1f Tib" -msgstr "%.1f Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" +#: glib/gutils.c:3014 +msgid "Tibit" +msgstr "" -#: ../glib/gutils.c:2257 -#, c-format -msgid "%.1f Pib" -msgstr "%.1f Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" +#: glib/gutils.c:3016 +msgid "Pibit" +msgstr "" -#: ../glib/gutils.c:2258 -#, c-format -msgid "%.1f Eib" -msgstr "%.1f Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" +#: glib/gutils.c:3018 +msgid "Eibit" +msgstr "" -#: ../glib/gutils.c:2292 ../glib/gutils.c:2418 -#, c-format -msgid "%u byte" -msgid_plural "%u bytes" +#: glib/gutils.c:3056 +#, fuzzy +#| msgid "%u byte" +#| msgid_plural "%u bytes" +msgid "byte" +msgid_plural "bytes" msgstr[0] "%u byte" msgstr[1] "%u bytes" -#: ../glib/gutils.c:2296 -#, c-format -msgid "%u bit" -msgid_plural "%u bits" +#: glib/gutils.c:3060 +#, fuzzy +#| msgid "%u bit" +#| msgid_plural "%u bits" +msgid "bit" +msgid_plural "bits" msgstr[0] "%u bit" msgstr[1] "%u bits" +#. Translators: The "%u" is replaced with the size value, like "13"; it could +#. * be part of "13 bytes", but only the number is requested this time. +#: glib/gutils.c:3068 +#, c-format +msgctxt "format-size" +msgid "%u" +msgstr "" + +#. Translators: The first "%u" is replaced with the value, the "%s" with a unit of the value. +#. * The order can be changed with "%$2s %$1u". An example: "13 bytes" +#: glib/gutils.c:3073 +#, c-format +msgctxt "format-size" +msgid "%u %s" +msgstr "" + +#. Translators: The "%.1f" is replaced with the size value, like "13.0"; it could +#. * be part of "13.0 MB", but only the number is requested this time. +#: glib/gutils.c:3109 +#, fuzzy, c-format +#| msgid "%.1f kB" +msgctxt "format-size" +msgid "%.1f" +msgstr "%.1f kB" + +#. Translators: The first "%.1f" is replaced with the value, the "%s" with a unit of the value. +#. * The order can be changed with "%$2s %$1.1f". Keep the no-break space between the value and +#. * the unit symbol. An example: "13.0 MB" +#: glib/gutils.c:3115 +#, c-format +msgctxt "format-size" +msgid "%.1f %s" +msgstr "" + #. Translators: the %s in "%s bytes" will always be replaced by a number. -#: ../glib/gutils.c:2363 +#: glib/gutils.c:3155 #, c-format msgid "%s byte" msgid_plural "%s bytes" @@ -5587,115 +6596,248 @@ msgstr[0] "%s byte" msgstr[1] "%s bytes" #. Translators: the %s in "%s bits" will always be replaced by a number. -#: ../glib/gutils.c:2368 +#: glib/gutils.c:3160 #, c-format msgid "%s bit" msgid_plural "%s bits" msgstr[0] "%s bit" msgstr[1] "%s bits" +#: glib/gutils.c:3201 +#, c-format +msgid "%u byte" +msgid_plural "%u bytes" +msgstr[0] "%u byte" +msgstr[1] "%u bytes" + #. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to #. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of #. * compatibility. Users will not see this string unless a program is using this deprecated function. #. * Please translate as literally as possible. #. -#: ../glib/gutils.c:2431 +#: glib/gutils.c:3214 #, c-format msgid "%.1f KB" msgstr "%.1f KB" -msgctxt "full month name with day" -msgid "January" -msgstr "Januar" +#: glib/gutils.c:3219 +#, c-format +msgid "%.1f MB" +msgstr "%.1f MB" -msgctxt "full month name with day" -msgid "February" -msgstr "Februar" +#: glib/gutils.c:3224 +#, c-format +msgid "%.1f GB" +msgstr "%.1f GB" -msgctxt "full month name with day" -msgid "March" -msgstr "Mars" +#: glib/gutils.c:3229 +#, c-format +msgid "%.1f TB" +msgstr "%.1f TB" -msgctxt "full month name with day" -msgid "April" -msgstr "April" +#: glib/gutils.c:3234 +#, c-format +msgid "%.1f PB" +msgstr "%.1f PB" -msgctxt "full month name with day" -msgid "May" -msgstr "Mai" +#: glib/gutils.c:3239 +#, c-format +msgid "%.1f EB" +msgstr "%.1f EB" -msgctxt "full month name with day" -msgid "June" -msgstr "Juni" +#~ msgid "GApplication options" +#~ msgstr "Flagg for GApplication" -msgctxt "full month name with day" -msgid "July" -msgstr "Juli" +#, c-format +#~ msgid "Error in address “%s” — the family attribute is malformed" +#~ msgstr "Feil i adresse «%s» – familieattributten er feilutformet" -msgctxt "full month name with day" -msgid "August" -msgstr "August" +#, c-format +#~ msgid "No such method '%s'" +#~ msgstr "Metoden «%s» finnes ikke" -msgctxt "full month name with day" -msgid "September" -msgstr "September" +#, c-format +#~ msgid "" +#~ "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment " +#~ "variable - unknown value '%s'" +#~ msgstr "" +#~ "Kan ikke bestemme adresse for buss fra miljøvariabelen " +#~ "DBUS_STARTER_BUS_TYPE - ukjent verdi «%s»" -msgctxt "full month name with day" -msgid "October" -msgstr "Oktober" +#~ msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" +#~ msgstr "METHOD_RETURN melding: Topptekstfelt REPLY_SERIAL mangler" -msgctxt "full month name with day" -msgid "November" -msgstr "November" +#~ msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" +#~ msgstr "ERROR melding: Topptekstfelt REPLY_SERIAL eller ERROR_NAME mangler" -msgctxt "full month name with day" -msgid "December" -msgstr "Desember" +#~ msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" +#~ msgstr "" +#~ "SIGNAL melding: Topptekstfelt for PATH, INTERFACE eller MEMBER mangler" -msgctxt "abbreviated month name with day" -msgid "Jan" -msgstr "Jan" +#, c-format +#~ msgid "" +#~ "Message has %d file descriptors but the header field indicates %d file " +#~ "descriptors" +#~ msgstr "" +#~ "Meldingen har %d fildeskriptorer men topptekstfeltet indikerer %d " +#~ "fildeskriptorer" -msgctxt "abbreviated month name with day" -msgid "Feb" -msgstr "Feb" +#~ msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " +#~ msgstr "Kan ikke laste /var/lib/dbus/machine-id eller /etc/machine-id: " -msgctxt "abbreviated month name with day" -msgid "Mar" -msgstr "Mar" +#~ msgid "[ARGS...]" +#~ msgstr "[ARGUMENTER …]" -msgctxt "abbreviated month name with day" -msgid "Apr" -msgstr "Apr" +#, c-format +#~ msgid "Mounted %s at %s\n" +#~ msgstr "Monterte %s under %s\n" -msgctxt "abbreviated month name with day" -msgid "May" -msgstr "Mai" +#, c-format +#~ msgid "; ignoring override for this key.\n" +#~ msgstr "; ignorerer overstyring for denne nøkkelen.\n" -msgctxt "abbreviated month name with day" -msgid "Jun" -msgstr "Jun" +#, c-format +#~ msgid " and --strict was specified; exiting.\n" +#~ msgstr " og --strict ble oppgitt; avslutter.\n" -msgctxt "abbreviated month name with day" -msgid "Jul" -msgstr "Jul" +#, c-format +#~ msgid "Ignoring override for this key.\n" +#~ msgstr "Ignorerer overstyring for denne nøkkelen.\n" -msgctxt "abbreviated month name with day" -msgid "Aug" -msgstr "Aug" +#, c-format +#~ msgid "doing nothing.\n" +#~ msgstr "gjør ingenting.\n" -msgctxt "abbreviated month name with day" -msgid "Sep" -msgstr "Sep" +#~ msgid "Unknown error on connect" +#~ msgstr "Ukjent feil ved tilkobling" -msgctxt "abbreviated month name with day" -msgid "Oct" -msgstr "Okt" +#, c-format +#~ msgid "The local file URI “%s” may not include a “#”" +#~ msgstr "Lokal fil-URI «%s» kan ikke inneholde en «#»" -msgctxt "abbreviated month name with day" -msgid "Nov" -msgstr "Nov" +#~ msgid "internal error or corrupted object" +#~ msgstr "intern feil eller korrupt objekt" -msgctxt "abbreviated month name with day" -msgid "Dec" -msgstr "Des" +#~ msgid "backtracking limit reached" +#~ msgstr "grense for liste av funksjonskall nådd" + +#~ msgid "invalid combination of newline flags" +#~ msgstr "ugyldig kombinasjon av flagg for nye linjer" + +#~ msgid "short utf8" +#~ msgstr "kort utf8" + +#~ msgid "unexpected repeat" +#~ msgstr "uventet gjentagelse" + +#~ msgid "failed to get memory" +#~ msgstr "ikke nok minne" + +#~ msgid ") without opening (" +#~ msgstr ") uten åpnende (" + +#~ msgid "unrecognized character after (?<" +#~ msgstr "ikke gjenkjent tegn etter (?<" + +#~ msgid "(?R or (?[+-]digits must be followed by )" +#~ msgstr "(?R eller (?[+-]tall må følges av )" + +#~ msgid "invalid condition (?(0)" +#~ msgstr "ugyldig betingelse (?(0)" + +#~ msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" +#~ msgstr "escape-verdier \\L, \\l, \\N{name}, \\U og \\u er ikke støttet" + +#~ msgid "recursive call could loop indefinitely" +#~ msgstr "rekursivt kall kunne gå i uendelig løkke" + +#~ msgid "digit expected after (?+" +#~ msgstr "tall forventet etter (?+" + +#~ msgid "] is an invalid data character in JavaScript compatibility mode" +#~ msgstr "] er et ugyldig datategn i kompatibilitetsmodus for JavaScript" + +#~ msgid "too many forward references" +#~ msgstr "for mange fremoverreferanser" + +#~ msgid "character value in \\u.... sequence is too large" +#~ msgstr "tegnverdi i \\u.... sekvens er for stor" + +#~ msgid "PCRE library is compiled without UTF8 properties support" +#~ msgstr "PCRE-biblioteket er kompilert uten støtte for UTF8-egenskaper" + +#, c-format +#~ msgid "Error while optimizing regular expression %s: %s" +#~ msgstr "Feil under optimering av reguært utrykk %s: %s" + +#, c-format +#~ msgid "%.1f KiB" +#~ msgstr "%.1f KiB" + +#, c-format +#~ msgid "%.1f MiB" +#~ msgstr "%.1f MiB" + +#, c-format +#~ msgid "%.1f GiB" +#~ msgstr "%.1f GiB" + +#, c-format +#~ msgid "%.1f TiB" +#~ msgstr "%.1f TiB" + +#, c-format +#~ msgid "%.1f PiB" +#~ msgstr "%.1f PiB" + +#, c-format +#~ msgid "%.1f EiB" +#~ msgstr "%.1f EiB" + +#, c-format +#~ msgid "%.1f kb" +#~ msgstr "%.1f kb" + +#, c-format +#~ msgid "%.1f Mb" +#~ msgstr "%.1f Mb" + +#, c-format +#~ msgid "%.1f Gb" +#~ msgstr "%.1f Gb" + +#, c-format +#~ msgid "%.1f Tb" +#~ msgstr "%.1f Tb" + +#, c-format +#~ msgid "%.1f Pb" +#~ msgstr "%.1f Pb" + +#, c-format +#~ msgid "%.1f Eb" +#~ msgstr "%.1f Eb" + +#, c-format +#~ msgid "%.1f Kib" +#~ msgstr "%.1f Kib" + +#, c-format +#~ msgid "%.1f Mib" +#~ msgstr "%.1f Mib" + +#, c-format +#~ msgid "%.1f Gib" +#~ msgstr "%.1f Gib" + +#, c-format +#~ msgid "%.1f Tib" +#~ msgstr "%.1f Tib" + +#, c-format +#~ msgid "%.1f Pib" +#~ msgstr "%.1f Pib" + +#, c-format +#~ msgid "%.1f Eib" +#~ msgstr "%.1f Eib" diff --git a/po/ro.po b/po/ro.po index 36165bc..0ca8941 100644 --- a/po/ro.po +++ b/po/ro.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: glib\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-10-18 18:26+0000\n" -"PO-Revision-Date: 2023-10-18 20:27+0200\n" +"POT-Creation-Date: 2023-10-04 22:23+0000\n" +"PO-Revision-Date: 2023-10-09 15:17+0300\n" "Last-Translator: Florentina Mușat \n" "Language-Team: Gnome Romanian Translation Team 0 && n%100 < " "20)) ? 1 : 2);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4\n" "X-Project-Style: gnome\n" "X-Poedit-SourceCharset: UTF-8\n" @@ -306,7 +306,7 @@ msgstr "Flux deja închis" msgid "Truncate not supported on base stream" msgstr "Trunchierea fluxului de bază nu este suportată" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1432 #: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 #, c-format msgid "Operation was cancelled" @@ -612,8 +612,8 @@ msgstr "Eroare la crearea directorului „%s”: %s" #: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 #: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 #: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:8996 gio/gfile.c:9086 -#: gio/gfile.c:9170 gio/win32/gwinhttpfile.c:453 +#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 +#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Operațiune neimplementată" @@ -1000,23 +1000,23 @@ msgstr "Eroare la întoarcere cu corpul de tipul „%s”" msgid "Error return with empty body" msgstr "Rezultat de eroare cu corp vid" -#: gio/gdbusprivate.c:2201 +#: gio/gdbusprivate.c:2199 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Tastați orice caracter pentru a închide această fereastră)\n" -#: gio/gdbusprivate.c:2387 +#: gio/gdbusprivate.c:2385 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "Sesiunea dbus nu rulează, și lansarea automată a eșuat" -#: gio/gdbusprivate.c:2410 +#: gio/gdbusprivate.c:2408 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "Nu se poate obține profilul hardware: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2459 #, c-format msgid "Unable to load %s or %s: " msgstr "Nu s-a putut încărca %s sau %s: " @@ -1361,45 +1361,45 @@ msgstr "Eroare: %s nu este un nume de magistrală popular valid.\n" msgid "Not authorized to change debug settings" msgstr "Neautorizat pentru a modifica configurările de depanare" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2243 gio/gdesktopappinfo.c:5227 msgid "Unnamed" msgstr "Nedenumit" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2653 msgid "Desktop file didn’t specify Exec field" msgstr "Fișierul desktop nu a specificat un câmp Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2943 msgid "Unable to find terminal required for application" msgstr "Nu s-a găsit un terminal pentru pornirea aplicației" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:3003 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programul „%s” nu a fost găsit în $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3739 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "Nu se poate crea dosarul de configurare pentru aplicațiile utilizatorului " "%s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3743 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nu se poate crea dosarul de configurare MIME al utilizatorului %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3985 gio/gdesktopappinfo.c:4009 msgid "Application information lacks an identifier" msgstr "Informațiile despre aplicație nu au un indentificator" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4245 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nu se poate crea fișierul desktop al utilizatorului %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4381 #, c-format msgid "Custom definition for %s" msgstr "Definiție personalizată pentru %s" @@ -1540,16 +1540,16 @@ msgstr "Nu există o implementare pentru coșul de gunoi" msgid "File names cannot contain “%c”" msgstr "Numele de fișiere nu pot conține „%c”" -#: gio/gfile.c:7151 gio/gfile.c:7277 +#: gio/gfile.c:7155 gio/gfile.c:7281 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Nu s-a putut crea un director temporar pentru șablonul „%s”: %s" -#: gio/gfile.c:7595 gio/gvolume.c:366 +#: gio/gfile.c:7599 gio/gvolume.c:366 msgid "volume doesn’t implement mount" msgstr "volumul nu implementează montarea" -#: gio/gfile.c:7709 gio/gfile.c:7786 +#: gio/gfile.c:7713 gio/gfile.c:7790 msgid "No application is registered as handling this file" msgstr "Nu există o aplicație înregistrată pentru deschiderea acestui fișier" @@ -4293,13 +4293,13 @@ msgstr "Proxy-ul SOCKSv5 nu acceptă tipul de adresă furnizat." msgid "Unknown SOCKSv5 proxy error." msgstr "Eroare necunoscută a proxy-ului SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:611 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "" "Nu s-a putut crea conectorul „pipe” pentru comunicarea cu procesul copil (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:618 #, c-format msgid "Pipes are not supported in this platform" msgstr "Conductele nu sunt suportate pe această platformă" @@ -6400,11 +6400,6 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" -#, fuzzy -#~| msgid "Use default permissions for the destination" -#~ msgid "Use default file modification timestamps for the destination" -#~ msgstr "Utilizează permisiunile implicite pentru destinație" - #~ msgid "backtracking limit reached" #~ msgstr "s-a atins limita de backtracking" diff --git a/po/ru.po b/po/ru.po index 1dc4d39..5ded4e1 100644 --- a/po/ru.po +++ b/po/ru.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ru\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-08-31 14:09+0000\n" -"PO-Revision-Date: 2023-08-31 18:12+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-29 10:40+0000\n" +"PO-Revision-Date: 2024-02-29 16:32+0300\n" "Last-Translator: Artur So \n" "Language-Team: Русский \n" "Language: ru\n" @@ -26,7 +26,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -48,38 +48,42 @@ msgstr "Не удалось найти приложение по умолчан msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Не удалось найти приложение по умолчанию для схемы URI '%s'" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Параметры GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Показать параметры GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Запустить GApplication в режиме сервиса (использовать из сервисных файлов D-" "Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Переопределить идентификатор приложения" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Вывести версию приложения" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Заменить запущенный экземпляр" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" -msgstr "Напечатать справку" +msgstr "Вывести справку" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[КОМАНДА]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Вывести номер верии" @@ -89,13 +93,12 @@ msgstr "Вывести информацию о версии и выйти" #: gio/gapplication-tool.c:55 msgid "List applications" -msgstr "Вывести список приложений" +msgstr "Список приложений" #: gio/gapplication-tool.c:56 msgid "List the installed D-Bus activatable applications (by .desktop files)" msgstr "" -"Вывести список установленных активируемых по D-Bus приложений (по desktop-" -"файлам)" +"Список установленных активируемых по D-Bus приложений (по desktop-файлам)" #: gio/gapplication-tool.c:59 msgid "Launch an application" @@ -134,7 +137,7 @@ msgid "APPID" msgstr "ID_ПРИЛОЖЕНИЯ" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "КОМАНДА" @@ -146,9 +149,13 @@ msgstr "Команда, по которой выводится подробна msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Идентификатор приложения в формате D-Bus (напр.: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "ФАЙЛ" @@ -174,7 +181,7 @@ msgstr "ПАРАМЕТР" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Необязательный параметр для вызова действия в формате GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -188,12 +195,12 @@ msgstr "" msgid "Usage:\n" msgstr "Использование:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Аргументы:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[АРГУМЕНТЫ…]" @@ -286,78 +293,78 @@ msgstr "" "нераспознанная команда %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Слишком большое значение количества передано в %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Переход в базовом потоке не поддерживается" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Нельзя усечь GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Поток уже закрыт" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Усечение не поддерживается в базовом потоке" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Действие было отменено" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Недопустимый объект, не инициализировано" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Неполная многобайтовая последовательность во входных данных" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Недостаточно места в целевом расположении" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Недопустимая последовательность байтов во входных преобразуемых данных" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Произошла ошибка при преобразовании: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Прерываемая инициализация не поддерживается" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Преобразование из набора символов «%s» в «%s» не поддерживается" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Не удалось открыть преобразователь из «%s» в «%s»" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "Тип %s" @@ -371,41 +378,41 @@ msgstr "Неизвестный тип" msgid "%s filetype" msgstr "Тип файлов %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "Объект GCredentials содержит некорректные данные" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "Тип GCredentials не реализован для этой ОС" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Поддержка GCredentials для вашей платформы отсутствует" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "Тип GCredentials не содержит идентификатора процесса для этой ОС" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Спуфинг учётных данных невозможен в этой ОС" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Неожиданный ранний конец потока" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Неподдерживаемый ключ «%s» в элементе адреса «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Бессмысленная комбинация ключ/значение в элементе адреса «%s»" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -414,28 +421,28 @@ msgstr "" "Неправильный адрес «%s» (требуется путь, временный каталог или один из " "абстрактных ключей)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Ошибка в адресе «%s» — неправильный формат атрибута «%s»" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Неизвестный или неподдерживаемый транспорт «%s» для адреса «%s»" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "В элементе адреса «%s» отсутствует двоеточие (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Название протокола в элементе адреса “%s” не должен быть пустым" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -444,7 +451,7 @@ msgstr "" "Пара ключ/значение %d, «%s», в элементе адреса «%s» не содержит знака " "равенства" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -452,7 +459,7 @@ msgstr "" "Пара ключ/значение %d, «%s», в элементе адреса «%s» не должна иметь пустого " "ключа" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -461,7 +468,7 @@ msgstr "" "Ошибка снятия экранирования ключа или значения в паре ключ/значение %d, " "«%s», в элементе адреса «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -470,82 +477,82 @@ msgstr "" "Ошибка в адресе «%s» — для транспорта unix требуется только один " "установленный ключ «path» или «abstract»" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Ошибка в адресе «%s» — атрибут узла отсутствует или имеет неправильный формат" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Ошибка в адресе «%s» — атрибут порта отсутствует или имеет неправильный " "формат" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Ошибка в адресе «%s» — атрибут noncefile отсутствует или имеет неправильный " "формат" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Ошибка автоматического запуска: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Произошла ошибка при открытии nonce-файла «%s»: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Произошла ошибка при чтении nonce-файла «%s»: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Произошла ошибка при чтении nonce-файла «%s», ожидалось 16 байт, получено %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Произошла ошибка записи содержимого nonce-файла «%s» в поток:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Указанный адрес пуст" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "" "Невозможно создать шину сообщений, когда установлено значение AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Невозможно породить процесс шины сообщений без идентификатора машины: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Невозможно автоматически запустить D-Bus без X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Произошла ошибка при создании процесса командной строки «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Не удалось определить адрес сеансовой шины (не реализовано для этой ОС)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -554,7 +561,7 @@ msgstr "" "Не удалось определить адрес шины из значения переменной окружения " "DBUS_STARTER_BUS_TYPE — неизвестное значение «%s»" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -562,20 +569,20 @@ msgstr "" "Не удалось определить адрес шины, т. к. значение переменной окружения " "DBUS_STARTER_BUS_TYPE не установлено" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Неизвестный тип шины %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Неожиданное отсутствие содержимого при чтении строки" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Неожиданное отсутствие содержимого при (надёжном) чтении строки" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -583,15 +590,15 @@ msgstr "" "Перепробованы все доступные механизмы аутентификации (проведено: %s) " "(доступно: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Неожиданное отсутствие содержимого при попытке прочитать байт" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Идентификаторы пользователя должны быть и на клиенте и на сервере" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Отменено через GDBusAuthObserver::authorize-authenticated-peer" @@ -611,13 +618,13 @@ msgstr "Ошибочные права на каталог «%s». Ожидало msgid "Error creating directory “%s”: %s" msgstr "Произошла ошибка при создании каталога «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Действие не поддерживается" @@ -682,15 +689,15 @@ msgstr "Произошла ошибка при открытии связки к msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Также, не удалось освободить блокировку для «%s»: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Соединение закрыто" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Время ожидания истекло" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "При создании клиентского соединения обнаружены неподдерживаемые флаги" @@ -778,53 +785,67 @@ msgstr "Поддерево уже экспортировано для %s" msgid "Object does not exist at path “%s”" msgstr "Объект по пути «%s» не существует" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s сообщение: поле заголовка %s недействительно; ожидаемое значение типа '%s'" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s cообщение: отсутствует или недопустимо поле заголовка %s" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s сообщение: поле заголовка INVALID предоставлено" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s сообщение: поле заголовка PATH использует зарезервированное значение /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s сообщение: поле заголовка INTERFACE не содержит действительного имени " +"интерфейса" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s сообщение: поле заголовка INTERFACE использует зарезервированное значение " +"org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"%s сообщение: поле заголовка MEMBER не содержит действительного имени " +"участника" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s сообщение: поле заголовка ERROR_NAME не содержит действительного имени " +"ошибки" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "тип является НЕДОПУСТИМЫМ" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Сообщение METHOD_CALL: отсутствует или недопустимо поле заголовка PATH или " -"MEMBER" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Сообщение METHOD_RETURN: отсутствует или недопустимо поле заголовка " -"REPLY_SERIAL" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Сообщение ERROR: отсутствует или недопустимо поле заголовка REPLY_SERIAL или " -"ERROR_NAME" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Сообщение SIGNAL: отсутствует или недопустимо поле заголовка PATH, INTERFACE " -"или MEMBER" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Сообщение SIGNAL: поле заголовка PATH использует зарезервированное значение /" -"org/freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Сообщение SIGNAL: поле заголовка INTERFACE использует зарезервированное " -"значение org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -832,12 +853,12 @@ msgstr[0] "Требовалось прочитать %lu байт, но проч msgstr[1] "Требовалось прочитать %lu байта, но прочитано только %lu" msgstr[2] "Требовалось прочитать %lu байт, но прочитано только %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Ожидался байт NUL после строки «%s», но найден байт %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -847,21 +868,21 @@ msgstr "" "(смещение %d, длина строки %d). Корректная строка UTF-8 вплоть до тех байт: " "«%s»" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Слишком глубокая иерархия" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Разобранное значение «%s» не является допустимым путём объекта D-Bus" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Разобранное значение «%s» не является допустимой подписью D-Bus" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -877,7 +898,7 @@ msgstr[2] "" "Обнаружен массив длинной %u байт. Максимальная длина равна 2<<26 байт (64 " "МиБ)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -886,24 +907,24 @@ msgstr "" "Получен массив типа «a%c», который должен иметь размер кратный %u (байт), но " "массив имеет длину %u (байт)" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Пустые структуры (записи) не допускаются в D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" "Разобранное значение «%s» для варианта не является допустимой подписью D-Bus" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Ошибка десериализации GVariant с типом строки «%s» из формата D-Bus wire" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -912,27 +933,27 @@ msgstr "" "Неправильный порядок байтов в значении. Ожидался 0x6c ('l') или 0x42 ('B'), " "но найдено значение 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Неправильный старший номер версии протокола. Ожидался 1, но найден %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Заголовок подписи найден, но его тип отличается от подписи" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "Найден заголовок подписи с подписью «%s», но тело сообщения пусто" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" "Разобранное значение «%s» не является допустимой подписью D-Bus (для тела)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -944,17 +965,17 @@ msgstr[1] "" msgstr[2] "" "Отсутствует заголовок подписи в сообщении, но тело сообщения занимает %u байт" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Не удалось выполнить извлечение сообщения: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "Ошибка сериализации GVariant с типом строки «%s» в формат D-Bus wire" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -962,16 +983,16 @@ msgstr "" "Количество дескрипторов файлов в сообщении (%d) отличается от указанного в " "заголовке (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Не удалось сериализовать сообщение: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Тело сообщения имеет подпись «%s», но нет заголовка подписи" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -980,18 +1001,18 @@ msgstr "" "Тело сообщения имеет тип подписи «%s», но значение подписи в поле заголовка " "равно «%s»" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "Тело сообщения пусто, но значение подписи в поле заголовка равно «(%s)»" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Возвращена ошибка с телом типа «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Возвращена ошибка с пустым телом" @@ -1011,22 +1032,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Не удалось получить профиль аппаратуры: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Не удалось загрузить %s или %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Ошибка вызова StartServiceByName для %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Неожиданный ответ %d из метода StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1035,25 +1056,25 @@ msgstr "" "Не удалось вызвать метод; у прокси с хорошо известным именем %s нет " "владельца и прокси создать с флагом G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Абстрактное пространство имён не поддерживается" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Не удалось задать nonce-файл при создании сервера" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Произошла ошибка при записи в nonce-файл у «%s»: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Строка «%s» не является допустимым D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Невозможно прослушивать неподдерживаемый транспорт «%s»" @@ -1116,6 +1137,10 @@ msgstr "Подключиться к пользовательской шине" msgid "Connect to given D-Bus address" msgstr "Подключиться к заданному адресу D-Bus" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "АДРЕС" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Параметры оконечной точки соединения:" @@ -1345,71 +1370,72 @@ msgstr "Ошибка: %s не является допустимым извест msgid "Not authorized to change debug settings" msgstr "Не вправе изменять настройки отладки" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Без имени" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "В desktop-файле не указано поле Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Не удалось найти терминал, требуемый для приложения" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Программа '%s' не найдена в $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Не удалось создать пользовательскую папку настроек приложения %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Не удалось создать пользовательскую папку настроек MIME %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "В информации о приложении отсутствует идентификатор" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Не удалось создать пользовательский desktop-файл %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Особое определение для %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "привод не поддерживает извлечение" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "привод не поддерживает извлечение или извлечение_с_операцией" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "привод не поддерживает опрос носителя" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "привод не поддерживает запуск" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "привод не поддерживает остановку" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "Библиотека TLS не реализует запрос на TLS binding" @@ -1422,27 +1448,27 @@ msgstr "Поддержка TLS недоступна" msgid "DTLS support is not available" msgstr "Поддержка DTLS недоступна" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Не удалось обработать версию %d текстового представления GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Некорректное число лексем (%d) текстового представления GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Не удалось обработать версию %d текстового представления GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Некорректное число лексем (%d) текстового представления GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Для GEmblemedIcon ожидается GEmblem" @@ -1450,130 +1476,135 @@ msgstr "Для GEmblemedIcon ожидается GEmblem" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Содержащая точка монтирования не существует" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Нельзя скопировать поверх каталога" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Нельзя скопировать каталог поверх каталога" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Целевой файл существует" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Не удалось рекурсивно скопировать каталог" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Диапазон копируемых файлов не поддерживается" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Произошла ошибка при соединении файла: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Соединение не поддерживается" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "Копирование (reflink/clone) между точками монтирования не поддерживается" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Копирование (reflink/clone) не поддерживается или некорректно" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Копирование (reflink/clone) не поддерживается или не работает" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Невозможно получить атрибут %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Нельзя скопировать специальный файл" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Дано неверное значение символьной ссылки" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2404 msgid "Symbolic links not supported" msgstr "Символьные ссылки не поддерживаются" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Корзина не поддерживается" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Имена файлов не могут содержать «%c»" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Не удалось создать временный каталог для шаблона \"%s\": %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "том не поддерживает присоединение" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Нет зарегистрированного приложения для обработки данного файла" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Перечислитель закрыт" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Перечислитель файлов имеет незавершённое действие" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Перечислитель файлов уже закрыт" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Не удалось обработать версию %d текстового представления GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Некорректные входные данные для GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Поток не поддерживает query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Переход по потоку не поддерживается" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Усечение на входном потоке не разрешено" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Усечение не поддерживается на потоке" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Недопустимое имя узла" @@ -1606,64 +1637,64 @@ msgstr "Ответ HTTP с прокси слишком большой" msgid "HTTP proxy server closed connection unexpectedly." msgstr "Cервер прокси HTTP неожиданно закрыл соединение." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Неверное число лексем (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Нет типа для класса с именем %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Тип %s не реализует интерфейс GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Тип %s не является классифицируемым" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Некорректный номер версии: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Тип %s не реализует from_tokens() интерфейса GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Не удалось обработать данную версию текстового представления значка" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Адрес не указан" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Значение длины %u слишком велико для адреса" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "В адресе установлены биты вне пределов длины префикса" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Невозможно считать «%s» маской IP-адреса" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Недостаточно места для адреса сокета" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Неподдерживаемый адрес сокета" @@ -1677,7 +1708,7 @@ msgstr "Входной поток не поддерживает чтение" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Поток имеет незавершённое действие" @@ -1693,7 +1724,7 @@ msgstr "Сохранять с файлом при перемещении" msgid "“version” takes no arguments" msgstr "«version» не принимает аргументов" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Использование:" @@ -1701,79 +1732,79 @@ msgstr "Использование:" msgid "Print version information and exit." msgstr "Вывести информацию о версии и выйти." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Команды:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Объединить файлы и вывести в стандартный вывод" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Копировать один или несколько файлов" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Показать информацию о расположениях" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Запустить приложение из desktop-файла" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Показать содержимое расположений" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Получить или установить обработчик для типа MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Создать каталоги" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Отслеживать изменение файлов и каталогов" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Монтирование или размонтирование расположений" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Переместить один или несколько файлов" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Открыть файлы приложением по умолчанию" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Переименовать файл" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Удалить один или несколько файлов" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Прочитать со стандартного входа и сохранить" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Установить атрибут файла" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Переместить файлы или каталоги в корзину" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Показать содержимое расположений в виде дерева" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Команды:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Используйте команду %s для получения подробной справки.\n" @@ -1783,7 +1814,7 @@ msgid "Error writing to stdout" msgstr "Ошибка при записи в stdout" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1806,61 +1837,67 @@ msgstr "" "расположения вместо локальных файлов: например, вы можете использовать что-" "то вроде smb://server/resource/file.txt в качестве расположения." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Не указаны адреса" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Не указан целевой каталог" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Показать ход выполнения" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Спрашивать перед перезаписью" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Сохранять все атрибуты" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Создать резервную копию существующих файлов назначения" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Никогда не переходить по символическим ссылкам" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Использовать разрешения по умолчанию" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" +"Использовать временные метки модификации файлов по умолчанию для места " +"назначения" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Передано %s из %s (%s/с)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ИСТОЧНИК" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "ПРИЁМНИК" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "" "Копировать один или несколько файлов из ИСТОЧНИКА в каталог НАЗНАЧЕНИЯ." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1870,12 +1907,12 @@ msgstr "" "GIO-расположения вместо локальных файлов: например, вы можете использовать\n" "что-то вроде smb://server/resource/file.txt в качестве расположения." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Цель «%s» не является каталогом" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: перезаписать «%s»? " @@ -1916,52 +1953,52 @@ msgstr "отображаемое имя: %s\n" msgid "edit name: %s\n" msgstr "редактируемое имя: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "имя: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "тип: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "размер: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "скрытый\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "локальный путь: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "подключения unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Устанавливаемые атрибуты:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Пространства имён записываемых атрибутов:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Показать информацию о расположениях." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2526,7 +2563,8 @@ msgstr "" "текущий каталог)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "КАТАЛОГ" @@ -2578,6 +2616,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "Имя C-идентификатора, используемое для генерации исходного кода" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "ИДЕНТИФИКАТОР" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Целевой компилятор языка C (по умолчанию: переменная окружения CC)" @@ -3081,125 +3123,125 @@ msgstr "Произошла ошибка при получении сведени #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Точка монтирования для файла %s не найдена" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Нельзя переименовать корневой каталог" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Произошла ошибка при переименовании файла %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Невозможно переименовать файл, имя файла уже существует" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Недопустимое имя файла" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Произошла ошибка открытия файла %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Произошла ошибка при удалении файла %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Произошла ошибка при удалении файла в корзину %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Не удалось создать каталог корзины %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Не удалось найти каталог верхнего уровня для корзины %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Удаление в корзину на системных томах не поддерживается" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Не удалось найти или создать каталог корзины %s для удаления %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Не удалось создать запись о файле в корзине %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "Не удалось удалить файл %s в корзину, из-за ограничений файловой системы" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Не удалось удалить файл в корзину %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Не удалось удалить файл в корзину %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Произошла ошибка при создании каталога %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Файловая система не поддерживает символьные ссылки" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Произошла ошибка при создании символьной ссылки %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Произошла ошибка при перемещении файла %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Нельзя переместить каталог поверх каталога" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Не удалось создать резервный файл" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Произошла ошибка при удалении целевого файла: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Перемещение между точками монтирования не поддерживается" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Не удалось определить использование диска %s: %s" @@ -3222,123 +3264,123 @@ msgstr "Недопустимое имя расширенного атрибут msgid "Error setting extended attribute “%s”: %s" msgstr "Произошла ошибка при установке расширенного атрибута «%s»: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (неверная кодировка)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Ошибка при получении информации о файле «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Ошибка при получении информации о файловом дескрипторе: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Неверный тип атрибута (ожидался uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Неверный тип атрибута (ожидался uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Неверный тип атрибута (ожидалась строка byte)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Не удалось установить права на символические ссылки" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Произошла ошибка при установке прав: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Произошла ошибка при установке владельца: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "символьная ссылка не должна быть NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Произошла ошибка при установке символьной ссылки: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "Произошла ошибка при установке символьной ссылки: файл не является " "символьной ссылкой" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "" "Дополнительные нано-секунды %d во временной метке UNIX %lld имеют " "отрицательное значение" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "Дополнительные нано-секунды %d во временной метке UNIX %lld достигли одной " "секунды" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "Временная метка UNIX %lld не помещается в 64 бита" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "Временная метка UNIX %lld не входит в диапазон, поддерживаемый Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Не удалось преобразовать имя файла «%s» в строку UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Не удалось открыть файл «%s»: ошибка Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "Произошла ошибка при установке времени модификации или доступа файла «%s»: " "%lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Произошла ошибка при установке времени модификации или доступа: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "Контекст SELinux не должен быть равен NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "В этой системе не включён SELinux" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Произошла ошибка при установке контекста SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Установка атрибута %s не поддерживается" @@ -3391,7 +3433,7 @@ msgid "Error truncating file: %s" msgstr "Произошла ошибка при усечении файла: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Произошла ошибка при открытии файла «%s»: %s" @@ -3413,27 +3455,27 @@ msgstr "Файл был изменён извне" msgid "Error removing old file: %s" msgstr "Произошла ошибка при удалении старого файла: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Передан недопустимый GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Недопустимый запрос на переход" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Нельзя усечь GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Невозможно изменить размер выходного потока в память" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Не удалось изменить размер выходного потока в память" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3441,32 +3483,32 @@ msgstr "" "Количество памяти, требуемое процессом записи, больше чем доступное адресное " "пространство" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Выполнять перемещение в начало потока" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Выполнять перемещение в конец потока" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "точка монтирования не поддерживает «отсоединение»" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "точка монтирования не поддерживает «извлечение»" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "точка монтирования не поддерживает «отсоединение» или " @@ -3475,7 +3517,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "точка монтирования не поддерживает «извлечение» или «извлечение_с_операцией»" @@ -3483,14 +3525,14 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "точка монтирования не поддерживает «переподсоединение»" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "" "точка монтирования не поддерживает возможность определения типа содержимого" @@ -3498,22 +3540,22 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" "точка монтирования не поддерживает возможность синхронного определения типа " "содержимого" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Имя узла «%s» содержит «[», но не «]»" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Сеть недоступна" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Узел недоступен" @@ -3541,7 +3583,7 @@ msgstr "NetworkManager не запущен" msgid "NetworkManager version too old" msgstr "Версия NetworkManager слишком старая" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Выходной поток не поддерживает запись" @@ -3554,38 +3596,38 @@ msgstr "Сумма массивов, переданных в «%s» слишко msgid "Source stream is already closed" msgstr "Исходный поток уже закрыт" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Неуказанный сбой поиска прокси-сервера" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Ошибка разрешения «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "«%s» не реализовано" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Недопустимый домен" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Ресурс из «%s» не существует" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Не удалось распаковать ресурс из «%s»" @@ -3603,11 +3645,11 @@ msgstr "Ресурс из «%s» не является каталогом" msgid "Input stream doesn’t implement seek" msgstr "По входному потоку перемещение не поддерживается" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Вывести разделы, содержащие ресурсы в elf-ФАЙЛЕ" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3617,15 +3659,15 @@ msgstr "" "Если указан РАЗДЕЛ, то выводится список ресурсов только из этого раздела\n" "Если указан ПУТЬ, то выводится список совпадающих ресурсов" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "ФАЙЛ [ПУТЬ]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "РАЗДЕЛ" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3637,15 +3679,15 @@ msgstr "" "Если указан ПУТЬ, то выводится список совпадающих ресурсов\n" "Дополнительно выводится раздел, размер и сжатие" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Извлечь файл ресурса в stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "ФАЙЛ ПУТЬ" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3673,7 +3715,7 @@ msgstr "" "Для получения справки используйте «gresource help КОМАНДА».\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3688,19 +3730,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " РАЗДЕЛ Имя раздела elf (необязательный)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " КОМАНДА Команда для пояснения (необязательный)\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " ФАЙЛ Файл elf (исполняемый или общая библиотека)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3708,20 +3750,20 @@ msgstr "" " ФАЙЛ Файл elf (исполняемый или общая библиотека)\n" " или скомпилированный файл ресурсов\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[ПУТЬ]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr "" " ПУТЬ Путь ресурса (необязательный, можно указать только часть)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "ПУТЬ" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " ПУТЬ Путь ресурса\n" @@ -3953,216 +3995,216 @@ msgstr "Указано пустое имя схемы\n" msgid "No such key “%s”\n" msgstr "Ключ «%s» отсутствует\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Недопустимый сокет, не инициализировано" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Недопустимый сокет, инициализация не удалась по причине: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Сокет уже закрыт" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Превышено время ожидания ввода-вывода сокета" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "создаётся GSocket из fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Не удалось создать сокет: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Указано неизвестное семейство" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Указан неизвестный протокол" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "Невозможно использовать дейтаграммные операции на не-дейтаграммном сокете." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Невозможно использовать дейтаграммные операции на сокете с установленным " "тайм-аутом." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "не удалось получить локальный адрес: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "не удалось получить удаленный адрес: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "не удалось слушать: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Произошла ошибка при связывании к адресу %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Ошибка при вступлении в мультикастовую группу: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Ошибка при выходе из мультикастовой группы: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Отсутствует поддержка мультикаста по источнику" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Неподдерживаемое семейство сокетов" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "специфичный источник, не адрес IP4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Имя интерфейса слишком длинное" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Интерфейс не найден: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Отсутствует поддержка IPv4 мультикаста по источнику" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Отсутствует поддержка IPv6 мультикаста по источнику" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Ошибка приёма подключения: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Выполняется соединение" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Не удалось получить ошибку ожидания: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Ошибка при получении данных: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Ошибка при отправлении данных: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Не удалось выключить сокет: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Произошла ошибка при закрытии сокета: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Ожидание состояния сокета: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Не удалось отправить сообщение: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Слишком большие массивы сообщения" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Произошла ошибка при отправлении сообщения: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage не поддерживается в Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Произошла ошибка при получении сообщения: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Не удалось прочитать полномочия сокета: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials не реализован для данной ОС" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Не удалось подключиться к прокси-серверу %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Не удалось подключиться к %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Не удалось подключиться к: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Проксирование через не-TCP соединение не поддерживается." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Протокол прокси «%s» не поддерживается." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Слушатель уже закрыт" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Добавленный сокет закрыт" @@ -4255,94 +4297,94 @@ msgstr "Прокси SOCKSv5 не поддерживает предложенн msgid "Unknown SOCKSv5 proxy error." msgstr "Неизвестная ошибка прокси SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Не удалось создать канал для сообщения с процессом-потомком (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Каналы не поддерживаются на этой платформе" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Не удалось обработать версию %d текстового представления GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Не найдено ни одного допустимого адреса" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Ошибка обратного разрешения «%s»: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Ошибка при разборе записи DNS %s: некорректный DNS-пакет" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Запись DNS с запрашиваемым типом «%s» отсутствует" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Временно невозможно разрешить «%s»" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Произошла ошибка разрешения «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Некорректный DNS-пакет" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Не удалось разобрать ответ DNS для \"%s\": " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Не найден секретный ключ в формате PEM" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Не удалось расшифровать секретный ключ в формате PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Не удалось разобрать секретный ключ в формате PEM" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Не найден сертификат в формате PEM" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Не удалось разобрать сертификат в формате PEM" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Текущий бэкенд TLS не поддерживает PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Сервис GTlsBackend не поддерживает создание сертификатов PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4352,7 +4394,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4360,15 +4402,15 @@ msgstr "" "Пароль был несколько раз введён неправильно, после следующих отказов ваш " "доступ будет заблокирован." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Введённый пароль неверен." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Отправка дескриптора файла не поддерживается" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4376,11 +4418,11 @@ msgstr[0] "Ожидается 1 контрольное сообщение, по msgstr[1] "Ожидается 1 контрольное сообщение, получено %d" msgstr[2] "Ожидается 1 контрольное сообщение, получено %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Неожиданный тип вспомогательных данных" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4388,112 +4430,124 @@ msgstr[0] "Ожидается один файловый дескриптор н msgstr[1] "Ожидается один файловый дескриптор но получено %d\n" msgstr[2] "Ожидается один файловый дескриптор но получено %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Получен недопустимый файловый дескриптор" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Получение дескриптора файла не поддерживается" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Произошла ошибка при отправлении мандата: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Произошла ошибка при проверке включения SO_PASSCRED для сокета: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Произошла ошибка при включении SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Ожидалось прочитать один байт идентификационной информации (credentials), но " "не прочитано ни одного байта" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Контрольное сообщение не ожидалось, но получено %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Произошла ошибка при отключении SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Ошибка при чтении из файлового дескриптора: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Ошибка при закрытии файлового дескриптора: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Корень файловой системы" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Ошибка при записи в файловый дескриптор: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" "Абстрактные адреса доменных сокетов UNIX не поддерживаются на этой системе" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "том не поддерживает извлечение" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "том не поддерживает извлечение или извлечение_с_операцией" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Приложение '%s' в объекте приложения не имеет глаголов" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"Приложение '%s' и обработчик '%s' в объекте приложения не имеют глаголов" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Произошла ошибка при чтении из дескриптора: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Произошла ошибка при закрытии дескриптора: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Произошла ошибка при записи в дескриптор: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Недостаточно памяти" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Внутренняя ошибка: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Требуется больше входных данных" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Неправильные сжатые данные" @@ -4521,151 +4575,289 @@ msgstr "Запуск службы dbus" msgid "Wrong args\n" msgstr "Неверные параметры\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Не удалось открыть «%s»: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Ошибка: Не удалось записать весь вывод целиком: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Ошибка: Не удалось переименовать ‘%s’ в ‘%s’: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Включить каталоги в путь поиска GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Выходной файл" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Общая библиотека" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Показывать сообщения об отладке" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Показывать подробные сообщения" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Показать номер версии программы и выйти" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Ошибка при разборе аргументов: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Укажите только один входной файл" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Ошибка при разборе файла ‘%s’: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Не удалось собрать typelib для модуля ‘%s’" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Недопустимый typelib для модуля ‘%s’: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Показать всю доступную информацию" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Не удалось разобрать: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Нет входных файлов" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Не удалось прочитать «%s»: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Не удалось создать typelib «%s»: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Не удалось загрузить typelib: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Предупреждение: %u модуля(ей) пропущено" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Версия typelib для проверки" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "ВЕРСИЯ" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Список общих библиотек, которые требуются typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Список других typelibs, которые требуются проверяемой typelib" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "Typelib для проверки" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "ПРОСТРАНСТВО ИМЕН" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Осмотр GI typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Не удалось проанализировать параметры командной строки: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Укажите только одно пространство имен" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Укажите --print-shlibs, --print-typelibs или оба варианта" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Неожиданный атрибут «%s» для элемента «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Не найден атрибут «%s» элемента «%s»" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Неожиданный тэг «%s», ожидался тэг «%s»" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Неожиданный тэг «%s» внутри «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Неверная дата и время ‘%s’ в файле закладок" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Не удалось найти допустимый файл закладок в каталогах поиска" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Закладка для ресурса URI «%s» уже существует" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Для ресурса URI «%s» закладок не найдено" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "В закладке на ресурс «%s» не определён тип MIME" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Отметка о приватности данных в закладке для URI «%s» не определена" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "В закладке для URI «%s» не определена группа" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Нет приложения с именем «%s», создавшего закладку для «%s»" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Не удалось дополнить строку выполнения «%s» с помощью URI «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Во входной строке для преобразования обнаружен неотображаемый символ" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "" "Неполная символьная последовательность содержится в конце входных данных" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Невозможно корректно преобразовать символ «%s» в символ из набора «%s»" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Байт со значением NUL во входных преобразуемых данных" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Байт со значением NUL в выходных преобразованных данных" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "" "URI «%s» не является абсолютным идентификатором при использовании схемы " "«file»" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "Недопустимый URI «%s»" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Недопустимое имя узла в URI «%s»" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI «%s» содержит недопустимо экранированные символы" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Путь «%s» не является абсолютным" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a, %-d %b %Y, %H∶%M∶%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%-I∶%M∶%S %p" @@ -4686,62 +4878,62 @@ msgstr "%-I∶%M∶%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Январь" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Февраль" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Март" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Апрель" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Май" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Июнь" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Июль" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Август" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Сентябрь" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Октябрь" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Ноябрь" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Декабрь" @@ -4763,132 +4955,132 @@ msgstr "Декабрь" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Янв" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Фев" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Мар" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Апр" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Май" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Июн" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Июл" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Авг" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Сен" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Окт" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Ноя" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Дек" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Понедельник" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Вторник" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Среда" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Четверг" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Пятница" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Суббота" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Воскресенье" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Пн" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Вт" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Ср" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Чт" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Пт" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Сб" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Вс" @@ -4910,62 +5102,62 @@ msgstr "Вс" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Января" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Февраля" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Марта" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "Апреля" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Мая" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Июня" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Июля" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Августа" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "Сентября" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Октября" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "Ноября" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Декабря" @@ -4987,197 +5179,209 @@ msgstr "Декабря" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Янв" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Фев" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Мар" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Апр" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "Мая" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Июн" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Июл" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Авг" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Сен" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Окт" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Ноя" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Дек" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "ДП (AM)" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "ПП (PM)" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Произошла ошибка при открытии каталога «%s»: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Не удалось выделить %lu байт для чтения файла «%s»" -msgstr[1] "Не удалось выделить %lu байта для чтения файла «%s»" -msgstr[2] "Не удалось выделить %lu байт для чтения файла «%s»" +msgid "Could not allocate %s to read file “%s”" +msgstr "Не удалось выделить %s для чтения файла «%s»" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Ошибка при чтении файла «%s»: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Файл «%s» слишком велик" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:825 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Не удалось распределить %" +msgstr[1] "Не удалось распределить %" +msgstr[2] "Не удалось распределить %" + +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Не удалось прочитать из файла «%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:900 glib/gfileutils.c:975 glib/gfileutils.c:1482 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Не удалось открыть файл «%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:913 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Не удалось получить атрибуты файла «%s»: сбой в функции fstat(): %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:944 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Не удалось открыть файл «%s»: сбой в функции fdopen(): %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1045 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "Не удалось переименовать файл «%s» в «%s»: сбой в функции g_rename(): %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1144 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Не удалось записать файл «%s»: сбой в функции ftruncate(): %s" + +#: glib/gfileutils.c:1189 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Не удалось записать файл «%s»: сбой в функции write(): %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1210 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Не удалось записать файл «%s»: сбой в функции fsync(): %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1371 glib/gfileutils.c:1788 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Не удалось создать файл «%s»: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1416 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" "Не удалось удалить существующий файл «%s»: сбой в функции g_unlink(): %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1753 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Шаблон «%s» недопустим: он не должен содержать «%s»" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1766 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Шаблон «%s» не содержит XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2360 glib/gfileutils.c:2389 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Не удалось прочитать символьную ссылку «%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Не удалось открыть преобразователь из «%s» в «%s»: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Невозможно выполнить непосредственное чтение в функции " "g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "В буфере чтения остались непреобразованные данные" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Канал закрывается на неполном символе" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" "Невозможно выполнить непосредственное чтение в функции " "g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "В каталогах поиска не удалось найти допустимый файл ключей" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Не является обычным файлом" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5185,44 +5389,44 @@ msgstr "" "Файл ключей содержит строку «%s», которая не является парой «ключ-значение», " "группой или комментарием" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Недопустимое имя группы: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Файл ключей не начинается с группы" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Недопустимое имя ключа: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Файл ключей содержит неподдерживаемую кодировку «%s»" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Файл ключей не содержит группу «%s»" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Файл ключей не содержит ключа «%s» в группе «%s»" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "Файл ключей содержит ключ «%s», значение которого «%s» не в кодировке UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." @@ -5230,7 +5434,7 @@ msgstr "" "Файл ключей содержит ключ «%s», значение которого не удалось " "интерпретировать." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5239,36 +5443,36 @@ msgstr "" "Файл ключей содержит ключ «%s» в группе «%s», значение которого не удалось " "интерпретировать." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Значение ключа «%s» в группе «%s» имеет значение «%s», но ожидалось %s" -#: glib/gkeyfile.c:4356 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Файл ключей содержит символ escape в конце строки" -#: glib/gkeyfile.c:4378 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Файл ключей содержит неверную экранирующую последовательность «%s»" -#: glib/gkeyfile.c:4530 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Не удалось преобразовать значение «%s» в число." -#: glib/gkeyfile.c:4544 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Целочисленное значение «%s» выходит за пределы" -#: glib/gkeyfile.c:4577 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Не удалось преобразовать «%s» в число с плавающей запятой." -#: glib/gkeyfile.c:4616 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Не удалось преобразовать «%s» в булево значение." @@ -5289,33 +5493,33 @@ msgstr "Не удалось отобразить файл «%s%s%s%s»: сбой msgid "Failed to open file “%s”: open() failed: %s" msgstr "Не удалось открыть файл «%s»: сбой в функции open(): %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Ошибка в строке %d на символе %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "" "Недопустимый UTF-8 текст в имени — неправильная последовательность «%s»" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "Имя «%s» недопустимо" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "Имя «%s» недопустимо: «%c»" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Ошибка в строке %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5324,7 +5528,7 @@ msgstr "" "Не удалось разобрать строку «%-.*s», которая должна быть числом внутри кода " "символа (например ê) — возможно, число слишком велико" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5333,24 +5537,24 @@ msgstr "" "Код символа не оканчивается точкой с запятой; похоже, символ «&» был " "использован не для обозначения начала конструкции — экранируйте его как &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Код «%-.*s» не определяет допустимый символ" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Обнаружена пустая конструкция «&;»; допустимыми конструкциями являются: " "& " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Имя сущности «%-.*s» неизвестно" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5359,11 +5563,11 @@ msgstr "" "использован не для обозначения начала конструкции — экранируйте его как " "«&" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Документ должен начинаться с элемента (например )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5372,7 +5576,7 @@ msgstr "" "Символ «%s» является недопустимым после символа «<»; этот символ не может " "начинать имя элемента" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5381,12 +5585,12 @@ msgstr "" "Встретился лишний символ «%s», ожидался символ «>» для завершения пустого " "элемента тэга «%s»" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Слишком много атрибутов для элемента «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5394,7 +5598,7 @@ msgstr "" "Встретился лишний символ «%s», ожидался символ «=» после имени атрибута «%s» " "элемента «%s»" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5405,7 +5609,7 @@ msgstr "" "открывающего тэга элемента «%s», либо, возможно, атрибут; может быть, был " "использован недопустимый символ в имени атрибута" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5414,7 +5618,7 @@ msgstr "" "Встретился лишний символ «%s», ожидалась открывающая двойная кавычка после " "знака равенства при присваивании значения атрибуту «%s» элемента «%s»" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “»" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Элемент «%s» был закрыт, ни один элемент в настоящий момент не открыт" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" "Элемент «%s» был закрыт, но открытым в настоящий момент является элемент «%s»" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Документ был пуст или содержал только пробелы" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" "Документ неожиданно окончился сразу же после открывающей угловой скобки «<»" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5461,7 +5665,7 @@ msgstr "" "Документ неожиданно окончился, когда ещё были открыты элементы — «%s» был " "последним открытым элементом" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5469,19 +5673,19 @@ msgid "" msgstr "" "Документ неожиданно окончился, ожидалась закрывающая тэг <%s/> угловая скобка" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Документ неожиданно окончился внутри имени элемента" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Документ неожиданно окончился внутри имени атрибута" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Документ неожиданно окончился внутри открывающего элемент тэга." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5489,262 +5693,262 @@ msgstr "" "Документ неожиданно окончился после знака равенства, следующего за именем " "атрибута; значение атрибута не указано" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Документ неожиданно окончился внутри значения атрибута" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Документ неожиданно окончился внутри тэга, закрывающего элемент «%s»" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Документ неожиданно окончился внутри закрывающего элемент тэга" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Документ неожиданно окончился внутри комментария или инструкции обработки" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[ПАРАМЕТР…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Параметры справки:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Показать параметры справки" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Показать все параметры справки" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Параметры приложения:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Параметры:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Не удалось разобрать целочисленное значение «%s» для %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Целочисленное значение «%s» для %s выходит за пределы" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Не удалось разобрать дробное значение двойной точности «%s» для %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Дробное значение двойной точности «%s» для %s выходит за пределы" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Произошла ошибка при разборе параметра %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Отсутствует аргумент для %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Неизвестный параметр %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "повреждённый объект" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "закончилась память" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "внутренняя ошибка" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" "шаблон содержит элементы, которые не поддерживаются при поиске частичного " "совпадения" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "условия в виде обратных ссылок при поиске частичного совпадения не " "поддерживаются" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "достигнут предел рекурсии" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "неправильное смещение" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "зацикливание рекурсии" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "запрашивается режим согласования, который не был скомпилирован для JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "неизвестная ошибка" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ в конце шаблона" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c в конце шаблона" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "неопознанный символ следует за \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "числа в квантификаторе {} в неправильном порядке" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "слишком большое число в квантификаторе {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "отсутствует завершающая ] для класса символов" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "неверное экранирование в классе символов" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "диапазон в классе символов в неправильном порядке" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "нечего повторять" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "неопознанный символ после (? или (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "Именованные классы POSIX поддерживаются только внутри класса" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "Сортировочные элементы POSIX не поддерживаются" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "отсутствует завершающая )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "ссылка на несуществующий подшаблон" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "отсутствует ) после комментария" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "слишком длинное регулярное выражение" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "ошибочное число или имя после (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind-утверждение не имеет фиксированную длину" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "условная группа содержит более двух ветвей" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "ожидалось утверждение после (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "номерная ссылка не может быть нулём" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "неизвестное имя класса POSIX" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "значение символа в последовательности \\x{...} слишком велико" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C запрещено в lookbehind-утверждениях" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "отсутствует завершающий символ в имени подшаблона" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "два именованных подшаблона имеют одинаковое имя" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "ошибочная последовательность \\P или \\p" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "неизвестное имя свойства после \\P или \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "имя подшаблона слишком длинное (не должно превышать 32 символа)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "слишком много именованных подшаблонов (не должно быть больше 10 000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "восьмеричное значение превышает \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "Группа DEFINE содержит более одной ветви" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "противоречивые параметры NEWLINE" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5752,240 +5956,240 @@ msgstr "" "за \\g не следует имя или число в скобках, угловых скобках или кавычках, или " "просто число" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "нельзя указать параметр для (*ACCEPT), (*FAIL) или (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "значение (*VERB) не распознано" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "слишком большое число" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "отсутствует имя подшаблона после (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "" "не допускаются использовать различные имена для подшаблонов с одинаковым " "номером" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "для (*MARK) требуется параметр" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "за \\c должен быть символ ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "за \\k не следует имя в скобках, угловых скобках или кавычках" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N в классе не поддерживается" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "слишком длинное имя в (*MARK), (*PRUNE), (*SKIP) или (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "переполнение кода" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "неопознанный символ после (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "переполнение рабочего пространства компиляции" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "не найден ранее проверенный подшаблон со ссылкой" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "" "Во время поиска совпадений с регулярным выражением %s возникла ошибка: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "Библиотека PCRE собрана без поддержки UTF-8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "Библиотека PCRE собрана с несовместимыми параметрами" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "Произошла ошибка при компиляции регулярного выражения '%s' у символа с " "номером %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "ожидалась шестнадцатеричная цифра или символ «}»" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "ожидалась шестнадцатеричная цифра" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "в символьной ссылке отсутствует «<»" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "незаконченная символьная ссылка" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "символьная ссылка нулевой длины" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "ожидалась цифра" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "недопустимая символьная ссылка" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "лишний «\\» в конце" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "неизвестная экранирующая последовательность" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "Произошла ошибка во время разбора текста замен «%s» у символа с номером %lu: " "%s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Текст в кавычках не начинается с символа кавычки" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Обнаружена незакрытая кавычка в командной строке или другом тексте от " "оболочки" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Текст закончился сразу после символа «\\» (текст был «%s»)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Текст закончился до того, как была найдена закрывающая кавычка для %c. " "(Текст был «%s»)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Текст был пуст (или содержал только пробелы)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Не удалось прочитать данные из дочернего процесса (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Неожиданная ошибка при чтении данных из дочернего процесса (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Произошла неожиданная ошибка в функции waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Дочерний процесс завершился с кодом %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Дочерний процесс убит по сигналу %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Дочерний процесс остановлен по сигналу %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Дочерний процесс аварийно завершил работу" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Не удалось выполнить чтение из дочернего канала (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Не удалось запустить дочерний процесс \"%s\" (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Функция fork завершилась неудачно (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Не удалось сменить каталог на «%s» (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Не удалось выполнить дочерний процесс \"%s\" (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Не удалось открыть файл для изменения дескриптора файла (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Не удалось дублировать дескриптор файла для дочернего процесса (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "При создании дочернего процесса функция fork завершилась неудачно (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Не удалось закрыть дескриптор файла для дочернего процесса (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Произошла неизвестная ошибка при выполнении дочернего процесса «%s»" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -6044,78 +6248,78 @@ msgstr "" "Произошла неожиданная ошибка в функции g_io_channel_win32_poll() при чтении " "данных из процесса-потомка" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Пустая строка не является числом" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» не является числом со знаком" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Число «%s» is out of bounds [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» не является числом без знака" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Неверная %-кодировка в URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Недопустимый символ в URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Не UTF-8 символ в URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Недопустимый IPv6 адрес ‘%.*s’ в URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Недопустимый закодированный IP адрес ‘%.*s’ в URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Недопустимое интернациональное имя хоста ‘%.*s’ в URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Невозможно разобрать порт ‘%.*s’ в URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Порт ‘%.*s’ в URI выходит за разрешённые границы" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "Путь «%s» не является абсолютным URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI ‘%s’ не содержит имени или адреса сервера" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI не абсолютный, базовый адрес URI не указан" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Не хватает символа ‘=’ и значения параметра" @@ -6198,64 +6402,64 @@ msgstr "ПиБ" msgid "EiB" msgstr "ЭиБ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" +msgid "kbit" msgstr "кбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" +msgid "Mbit" msgstr "Мбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" +msgid "Gbit" msgstr "Гбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" +msgid "Tbit" msgstr "Тбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" +msgid "Pbit" msgstr "Пбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" +msgid "Ebit" msgstr "Эбит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" +msgid "Kibit" msgstr "Кибит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" +msgid "Mibit" msgstr "Мибит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" +msgid "Gibit" msgstr "Гибит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" +msgid "Tibit" msgstr "Тибит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" +msgid "Pibit" msgstr "Пибит" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" +msgid "Eibit" msgstr "Эибит" #: glib/gutils.c:3056 @@ -6366,6 +6570,48 @@ msgstr "%.1f ПБ" msgid "%.1f EB" msgstr "%.1f ЭБ" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Сообщение METHOD_RETURN: отсутствует или недопустимо поле заголовка " +#~ "REPLY_SERIAL" + +#~ msgid "kb" +#~ msgstr "кбит" + +#~ msgid "Mb" +#~ msgstr "Мбит" + +#~ msgid "Gb" +#~ msgstr "Гбит" + +#~ msgid "Tb" +#~ msgstr "Тбит" + +#~ msgid "Pb" +#~ msgstr "Пбит" + +#~ msgid "Eb" +#~ msgstr "Эбит" + +#~ msgid "Kib" +#~ msgstr "Кибит" + +#~ msgid "Mib" +#~ msgstr "Мибит" + +#~ msgid "Gib" +#~ msgstr "Гибит" + +#~ msgid "Tib" +#~ msgstr "Тибит" + +#~ msgid "Pib" +#~ msgstr "Пибит" + +#~ msgid "Eib" +#~ msgstr "Эибит" + #~ msgid "backtracking limit reached" #~ msgstr "достигнут предел обратного хода" diff --git a/po/sl.po b/po/sl.po index ec495ed..47f67a8 100644 --- a/po/sl.po +++ b/po/sl.po @@ -3,14 +3,14 @@ # This file is distributed under the same license as the glib package. # # Andraž Tori 2000. -# Matej Urbančič , 2007–2023. +# Matej Urbančič , 2007–2024. # msgid "" msgstr "" "Project-Id-Version: glib master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-08 13:55+0000\n" -"PO-Revision-Date: 2023-09-10 22:59+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-04 21:35+0000\n" +"PO-Revision-Date: 2024-03-05 12:47+0100\n" "Last-Translator: Matej Urbančič \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" @@ -20,7 +20,7 @@ msgstr "" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Generator: Poedit 3.0.1\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -41,36 +41,40 @@ msgstr "Iskanje privzetega programa za vrsto vsebine »%s« je spodletelo" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Iskanje privzetega programa za shemo »%s« je spodletelo" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Možnosti GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Prikaže možnosti programa" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Vstopi v način storitev (uporabi iz storitvenih datotek D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Prepiši ID programa" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Izpiši različico programa" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Zamenjaj trenutno zagnan primerek" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Izpiši pomoč" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[UKAZ]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Izpiši različico" @@ -125,7 +129,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "UKAZ" @@ -138,9 +142,13 @@ msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "" "Določila programa v zapisu vodila D-Bus (na primer: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "DATOTEKA" @@ -165,7 +173,7 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Neobvezen parameter za priklic dejanja, v zapisu GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -179,12 +187,12 @@ msgstr "" msgid "Usage:\n" msgstr "Uporaba:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argumenti:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENTI ...]" @@ -277,78 +285,78 @@ msgstr "" "neprepoznan ukaz: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "Prevelika vrednost štetja poslana na %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Iskanje po osnovnem pretoku ni podprto" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Ni mogoče razčleniti GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Pretok je že zaprt" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Razčlenitev na osnovnem pretoku ni dovoljena" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Opravilo je bilo preklicano." -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Neveljaven predmet, opravilo ni začeto" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Neveljavno večbitno zaporedje na vhodu" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Ni dovolj prostora za cilju" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Neveljavno zaporedje bajtov na vhodu pretvorbe" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Napaka med pretvorbo: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Dejanje prekinitve zagona ni podprto" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Pretvorba iz nabora znakov »%s« v »%s« ni podprta" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Ni mogoče odpreti pretvornika iz »%s« v »%s«" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s vrsta" @@ -362,41 +370,41 @@ msgstr "Neznana vrsta" msgid "%s filetype" msgstr "%s vrsta datoteke" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials vsebuje neveljavne podatke" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "Na tem OS predmet GCredentials ni podprt" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Okolje ne podpira možnosti GCredentials" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "Predmet GCredentials na tem sistemu ne vsebuje ustreznega ID opravila" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Na tem OS vohljanje po poverilih ni podprto" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Nepričakovan prezgodnji konec pretoka" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nepodprt ključ »%s« v vnosu naslova »%s«" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Nesmiselna kombinacija za par ključ/vrednost v vnosu naslova »%s«" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -404,35 +412,35 @@ msgid "" msgstr "" "Naslov »%s« ni večkavem (zahtevana je pot, začasna mapa ali abstraktni ključ)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Napaka v naslovu »%s« – atribut »%s« je nepravilno oblikovan" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Neznan ali nepodprt prenos »%s« za naslov »%s«" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Predmet naslova »%s« ne vsebuje dvopičja ( : )" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transportno ime v naslovu predmeta »%s« ne sme biti prazno polje" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" msgstr "Par ključ/vrednost %d, »%s« v predmetu naslova »%s« ne vsebuje enačaja" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -440,7 +448,7 @@ msgstr "" "Par ključ/vrednost %d, »%s« v predmetu naslova »%s« ne sme vsebovati " "praznega ključa" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -449,7 +457,7 @@ msgstr "" "Napaka neubežnega ključa ali vrednosti v paru ključ/vrednost %d, »%s«, v " "predmetu naslova »%s«" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -458,83 +466,83 @@ msgstr "" "Napaka v naslovu »%s« – prenos unix zahteva enega izmed ključev »path« ali " "»abstract«" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – atribut gostitelja manjka ali pa je nepravilno " "oblikovan" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – manjka atribut vrat ali pa ali je nepravilno " "oblikovan" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – atribut enkratne datoteke manjka ali pa je " "nepravilno oblikovan" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Napaka samodejnega zaganjanja: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Napaka med odpiranjem enkratne datoteke »%s«: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Napaka med branjem iz enkratne datoteke »%s«: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Napaka med branjem iz enkratne datoteke »%s«; pričakovanih 16 bajtov, " "pridobljenih pa %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Napaka med pisanjem vsebine enkratne datoteke »%s« v pretok:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Podan naslov je prazen." -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "" "Ni mogoče oživiti vodila sporočila, če je nastavljena možnost AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Ni mogoče oživiti vodila sporočila brez predmeta machine-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Ni mogoče samodejno zagnati vodila D-Bus brez nastavitve X11 $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Napaka med oživljanjem ukazne vrstice »%s«: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Ni mogoče določiti naslova vodila seje (ni podprto v tem OS)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -543,7 +551,7 @@ msgstr "" "Ni mogoče določiti naslova vodila iz okoljske spremenljivke " "DBUS_STARTER_BUS_TYPE – neznana vrednost »%s«" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -551,20 +559,20 @@ msgstr "" "Ni mogoče določiti naslova vodila, kajti okoljska spremenljivka " "DBUS_STARTER_BUS_TYPE ni nastavljena" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Neznana vrsta vodila %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Nepričakovano pomanjkanje vsebine med branjem vrstice" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Nepričakovano pomanjkanje vsebine med (varnem) branjem vrstice" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -572,15 +580,15 @@ msgstr "" "Izčrpani so vsi razpoložljivi overitveni mehanizmi (poskusi: %s) " "(razpoložljivih: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Nepričakovano pomanjkanje vsebine med branjem podatkov" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Uporabniški ID mora biti enak za odjemalca in strežnik" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Prekinjeno s strani GDBusAuthObserver::authorize-authenticated-peer" @@ -602,13 +610,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Napaka med ustvarjanjem mape »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Opravilo ni podprto" @@ -673,15 +681,15 @@ msgstr "Napaka med odpiranjem zbirke ključev »%s« za branje: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(V nadaljevanju je spodletelo tudi sproščanje zaklepa »%s«: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Povezava je zaprta" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Čas zakasnitve je potekel" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -773,54 +781,64 @@ msgstr "Podrejeno drevo je že izvoženo za %s" msgid "Object does not exist at path “%s”" msgstr "Predmeta na poti »%s« ni mogoče najti." -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"Sporočilo %s: polje glave %s ni veljavno; pričakovana je vrednost vrste »%s«" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "Sporočilo %s: manjka ali pa ni vpisane vrednosti polja glave %s" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "Sporočilo %s: podano je napačno polje glave INVALID" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"Sporočilo %s: polje glave PATH uporablja zadržano vrednost /org/freedesktop/" +"DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"Sporočilo %s: polje glave INTERFACE nima vpisanega veljavnega imena vmesnika" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Sporočilo %s: polje glave INTERFACE uporablja zadržano vrednost org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "Sporočilo %s: polje glave MEMBER nima vpisanega veljavnega imena" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"Sporočilo %s: polje glave ERROR_NAME nima vpisanega veljavnega naziva napake" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "vrsta je neveljavna" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Sporočilo METHOD_CALL: manjka ali pa ni vpisane vrednosti polja glave PATH " -"ali MEMBER" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Sporočilo METHOD_RETURN: manjka ali pa ni vpisane vrednosti polja glave " -"REPLY_SERIAL" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Sporočilo ERROR: manjka ali pa ni vpisane vrednosti polja glave REPLY_SERIAL " -"ali ERROR_NAME" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Sporočilo SIGNAL: manjka ali pa ni vpisane vrednosti polja glave PATH, " -"INTERFACE ali MEMBER" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Sporočilo SIGNAL: polje glave PATH uporablja rezervirano vrednost /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Sporočilo SIGNAL: polje glave INTERFACE uporablja rezervirano vrednost org." -"freedesktop.DBus.Local" - # Double multiple plural? -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -829,12 +847,12 @@ msgstr[1] "Med poskusom branja %lu bajtov je bil prejet le %lu" msgstr[2] "Med poskusom branja %lu bajtov sta bila prejeta le %lu" msgstr[3] "Med poskusom branja %lu bajtov so bili prejeti le %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Po nizu »%s« je pričakovan bajt NUL, vendar je bil zaznan %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -844,21 +862,21 @@ msgstr "" "bajtov na bajtnem odmiku %d (dolžina niza %d). Do takrat veljaven UTF-8 niz " "je »%s«" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Vrednost je gnezdene pregloboko" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Razčlenjena vrednost »%s« ni veljavna pot predmeta vodila D-Bus" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Razčlenjena vrednost »%s« ni veljaven podpis vodila D-Bus" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -877,7 +895,7 @@ msgstr[3] "" "Najdeno je polje dolžine %u bajtov, največja dovoljena pa je 2<<26 bajtov " "(64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -886,16 +904,16 @@ msgstr "" "Zaznano je polje vrste »'a%c«, pričakovana pa je vrednost večkratnika %u " "bajtov, zaznanih pa je %u bajtov dolžine" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "V vodilu D-Bus prazne vrednosti niso dovoljene" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Razčlenjena vrednost »%s« ni veljaven podpis vodila D-Bus" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -903,7 +921,7 @@ msgstr "" "Napaka med ločevanjem GVariant iz zaporedja z vrsto niza »%s« iz D-Bus žične " "oblike" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -912,29 +930,29 @@ msgstr "" "Neveljavna vrednost vrstnega reda zlogov. Pričakovana je ali vrednost 0x6c " "(» l «) ali 0x42 (» B «), najdena pa je vrednost 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" "Neveljavna večja različica protokola. Pričakovana je 1, najdenih pa jih je " "več (%d)" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Glava podpisa je najdena, vendar ni ustrezno oblikovana" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Glava podpisa s podpisom »%s« je najdena, vendar je telo sporočila prazno" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Razčlenjena vrednost »%s« ni veljaven podpis vodila D-Bus (za telo)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -947,11 +965,11 @@ msgstr[2] "" msgstr[3] "" "V sporočilu ni glave podpisa, vendar je telo sporočila dolgo %u bajte" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Sporočila ni mogoče ločiti iz zaporedja: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -959,22 +977,22 @@ msgstr "" "Napaka pri združevanju GVariant v zaporedje z vrsto niza »%s« v D-Bus žično " "obliko" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "Število opisnikov v sporočilu (%d) se razlikuje od polja glave (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Sporočila ni bilo mogoče združiti v zaporedje: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Telo sporočila ima podpis »%s«, vendar v glavi ni podpisa" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -982,17 +1000,17 @@ msgid "" msgstr "" "Telo sporočila ima podpis vrste »%s«, vendar je podpis v polju glave »%s«" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Telo sporočila je prazno, vendar je v polju glave podpis »(%s)«" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Napaka vrnjena s telesom vrste »%s«" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Napaka vrnjena s praznim telesom" @@ -1012,22 +1030,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Ni mogoče pridobiti strojnega profila: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Ni mogoče naložiti %s oziroma %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Napaka med klicanjem predmeta StartServiceByName za %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Nepričakovan odgovor %d iz načina StartServiceByName(»%s«)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1036,25 +1054,25 @@ msgstr "" "Ni mogoče sklicati načina; posredniški strežnik za znano ime %s brez " "lastnika je bil zgrajen z zastavico G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstraktni imenski prostor ni podprt" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Med ustvarjanjem strežnika ni mogoče določiti enkratne datoteke" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Napaka med zapisovanjem enkratne datoteke na »%s«: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Niz »%s« ni veljaven D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Na nepodprtem načinu prenosa »%s« ni mogoče poslušati" @@ -1117,6 +1135,10 @@ msgstr "Poveži z vodilom seje" msgid "Connect to given D-Bus address" msgstr "Poveži s podanim naslovom vodila D-Bus" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "NASLOV" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Možnosti končnih točk povezave:" @@ -1348,71 +1370,72 @@ msgid "Not authorized to change debug settings" msgstr "" "Za spreminjanje nastavitev razhroščevanja so zahtevana posebna dovoljenja" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Neimenovano" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Namizna datoteka ne vsebuje določenega polja Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Ni mogoče najti terminala, ki ga zahteva program" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programa »%s« na poti $PATH ni mogoče najti" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Ni mogoče ustvariti nastavitvene mape uporabnikovega programa %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Ni mogoče ustvariti uporabnikove nastavitvene mape MIME %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Podatki programa so brez določila" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Ni mogoče ustvariti uporabnikove datoteke namizja %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Določilo po meri za %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "pogona ni mogoče izvreči" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "pogon ne vključuje ukaza izvrzi ali izvrzi_z_dejanjem" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "pogon ne podpira preverjanja enote" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "pogon ne vključuje možnosti zagona" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "pogon ne vključuje možnosti zaustavitve" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "Ozadnji program TLS ne vključuje pridobivanje vezi TLS" @@ -1425,27 +1448,27 @@ msgstr "Podpora TLS ni na voljo" msgid "DTLS support is not available" msgstr "Podpora za DTLS ni na voljo" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Ni mogoče upravljati z različico %d kodiranja GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Ni mogoče upravljati z različico %d kodiranja GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Pričakovan GEmblem za GEmblemedIcon" @@ -1453,130 +1476,135 @@ msgstr "Pričakovan GEmblem za GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Obstoječa enota ne obstaja" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Ni mogoče kopirati prek mape" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Ni mogoče kopirati mape prek mape" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Ciljna datoteka obstaja" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Ni mogoče kopirati drevesne zgradbe map" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Kopiranje obsega datotek ni podprto" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Napaka med prepletanjem datoteke: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Splice ni podprt" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "Kopiranje (sklic povezave/kloniranje) med različnimi priklopi ni podprto" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto ali pa ni veljavno" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto, ali pa ni delovalo" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Ni mogoče pridobiti atributa %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Ni mogoče kopirati posebne datoteke" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Neveljavna vrednost simbolne povezave" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Simbolne povezave niso podprte" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Smeti niso podprte" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Ni mogoče uporabiti »%c« v imenu datoteke" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Ustvarjanje začasne mape za predlogo »%s« je spodletelo: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "enota ne podpira priklopa" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Na voljo ni programa z a upravljanje s to datoteko" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Številčnik je zaprt" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Številčnik izvaja izredno dejanje" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Številčnik datotek je že zaprt" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Ni mogoče upravljati z različico %d kodiranja GFileIcon" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Nepravilno oblikovani podatki za GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Pretok ne podpira query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Iskanje po pretoku ni podprto" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Razčlenitev ni dovoljena na dovodnem pretoku" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Razčlenitev ni podprta na pretoku" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Neveljavno ime gostitelja" @@ -1609,64 +1637,64 @@ msgstr "Odziv posredniškegam strežnika HTTP je preobsežen." msgid "HTTP proxy server closed connection unexpectedly." msgstr "Povezava s posredniškim strežnikom HTTP je nepričakovano končana." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Napačno število znakov (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Ni določenega imena razreda %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Vrsta %s ne vstavlja vmesnika GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Vrste %s ni uvrščena v razred" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Nepravilno oblikovana številka različice: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Vrsta %s ne vstavlja from_tokens() vmesnika GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Ni mogoče ravnati z navedeno različico kodiranja ikone" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Naslov ni naveden" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Dolžina %u je predolga za naslov" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Naslov ima določene bite prek dolžine predpone" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Ni mogoče razčleniti »%s« kot maske naslova IP" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Ni dovolj prostora za naslov vtiča" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Nepodprti naslov vtiča" @@ -1680,7 +1708,7 @@ msgstr "Vhodni pretok ne podpira branja" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Pretok izvaja izredno dejanje" @@ -1696,7 +1724,7 @@ msgstr "Ohrani z datoteko ob premikanju" msgid "“version” takes no arguments" msgstr "»različica« ne prevzema argumentov" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Uporaba:" @@ -1704,79 +1732,79 @@ msgstr "Uporaba:" msgid "Print version information and exit." msgstr "Izpiši podatke o različici in končaj." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Ukazi:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Spoji datoteke in jih izpiši na standardni izhod" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopiraj eno ali več datotek" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Pokaži podatke o mestih" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Zagon programa iz datoteke namizja" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Izpiši seznam vsebine mest" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Pridobi ali določi ročnik za vrsto MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Ustvarite mape" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Spremljaj spremembe datotek in map" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Priklop oziroma odklop mest" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Premakni eno ali več datotek" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Odpri datoteke s privzetim programom" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Preimenuj datoteko" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Izbriši eno ali več datotek" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Preberi prek standardnega vhoda in shrani" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Določi atribut datoteke" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Premakni datoteke in mape v smeti" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Izpiši vsebino v drevesni obliki" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Ukazi:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Z ukazom %s se izpiše podrobna pomoč.\n" @@ -1786,7 +1814,7 @@ msgid "Error writing to stdout" msgstr "Napaka med pisanjem v standardni odvod" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1809,60 +1837,64 @@ msgstr "" "oddaljen GIO namesto krajevnih poti do datotek. Primer: kot pot je\n" "mogoče uporabiti smb://strežnik/vir/datoteka.txt." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Ni podanih mest" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Ni ciljne mape" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Pokaži napredek" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Opozori pred prepisovanjem" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Ohrani vse atribute" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Varnostno kopiraj obstoječe ciljne datoteke" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Nikoli ne sledi simbolnim povezavam" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Uporabi privzeta dovoljenja za ciljno mesto" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Uporabi privzete časovne žige sprememb datoteke za ciljno mesto" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Preneseno %s od %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "VIR" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "CILJ" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopiraj eno ali več datotek iz VIRA na CILJ." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1872,12 +1904,12 @@ msgstr "" "oddaljen GIO namesto krajevnih poti do datotek. Primer: kot pot je\n" "mogoče uporabiti smb://strežnik/vir/datoteka.txt." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "CIljni predmet %s ni mapa" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: Ali želite prepisati »%s«? " @@ -1918,52 +1950,52 @@ msgstr "prikaži ime: %s\n" msgid "edit name: %s\n" msgstr "uredi ime: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "ime: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "vrsta: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "velikost: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "skrito\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "naslov URI: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "Krajevna pot: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "priklopna točka unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Nastavljivi atributi:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Imenski prostor zapisljivih atributov:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Pokaže podatke o mestih." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2518,7 +2550,8 @@ msgstr "" "Mape, iz katerih naj bodo prebrane datoteke (privzeto je to trenutna mapa)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "MAPA" @@ -2565,6 +2598,10 @@ msgstr "Ne vgrajuj podatkov vira v datoteko C; predvidi zunanjo povezavo" msgid "C identifier name used for the generated source code" msgstr "Določilo imena jezika C za ustvarjanje izvorne kode" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "DOLOČILO" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Ciljni prevajalnik C (privzeto: okoljska spremenljivka CC)" @@ -3072,126 +3109,126 @@ msgstr "Napaka med pridobivanjem podrobnosti datotečnega sistema za %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Priklopne točke datoteke %s ni mogoče najti" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Ni mogoče preimenovati korenske mape" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Napaka med preimenovanjem datoteke %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Ni mogoče preimenovati datoteke, izbrano ime že obstaja" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Neveljavno ime datoteke" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Napaka med odpiranjem datoteke %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Napaka med odstranjevanjem datoteke %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Napaka med premikanjem datoteke %s v smeti: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Ni mogoče ustvariti mape smeti %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Ni mogoče najti vrhnje ravni smeti %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "Kopiranje (sklic povezave/kloniranje) med različnimi priklopi ni podprto" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Ni mogoče najti oziroma ustvariti mape smeti %s za brisanje %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Ni mogoče ustvariti datoteke podrobnosti smeti za %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "Datoteke %s ni mogoče premakniti v smeti prek različnih datotečnih sistemov" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Datoteke %s ni mogoče premakniti v smeti: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Datoteke %s ni mogoče premakniti v smeti" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Napaka med ustvarjanjem mape %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Datotečni sistem ne podpira simbolnih povezav" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Napaka med ustvarjanjem simbolne povezave %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Napaka med premikanjem datoteke %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Ni mogoče premakniti mape čez mapo" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Ustvarjanje varnostne kopije je spodletelo." -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Napaka med odstranjevanjem ciljne datoteke: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Premikanje med priklopi ni podprto" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Ni mogoče določiti porabe diska %s: %s." @@ -3213,117 +3250,117 @@ msgstr "Neveljavno razširjeno ime atributa" msgid "Error setting extended attribute “%s”: %s" msgstr "Napaka med določanjem razširjenega atributa »%s«: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (neveljavni nabor znakov)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Napaka med pridobivanjem podatkov za datoteko »%s«: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Napaka med potrjevanjem opisovalnika datoteke: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Neveljavna vrsta atributa (pričakovan uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Neveljavna vrsta atributa (pričakovan uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Neveljavna vrsta atributa (pričakovan bitni niz)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Ni mogoče določiti dovoljenj simbolnih povezav" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Napaka med določanjem dovoljenj: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Napaka med določanjem lastnika: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "Simbolna povezava ne sme biti določena kot NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Napaka med določanjem simbolne povezave: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "Napaka med določevanjem simbolne povezave; datoteka ni simbolna povezava" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Dodatne nanosekunde %d za časovni žig UNIX %lld so negativne" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Dodatne nanosekunde %d za časovni žig UNIX %lld so dosegle 1 sekundo" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "Časovni žig UNIX %lld je prevelik za 64-bitni zapis" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "Časovni žig UNIX %lld je izven obsega, ki je podprt na sistemih MS Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Imena datoteke »%s« ni mogoče pretvoriti v zapis UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Datoteke »%s« ni mogoče odpreti: napaka Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Napaka med določanjem sprememb ali časa dostopa za datoteko »%s«: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Napaka med določanjem sprememb ali časa dostopa: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "Atributa SELinux ni mogoče določiti kot NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "Na tem sistemu SELinux ni omogočen" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Napaka nastavitve vsebine SELinux: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Določanje atributa %s ni podprto" @@ -3376,7 +3413,7 @@ msgid "Error truncating file: %s" msgstr "Napaka med obrezovanjem datoteke: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Napaka med odpiranjem datoteke »%s«: %s" @@ -3398,27 +3435,27 @@ msgstr "Datoteka je bila zunanje spremenjena" msgid "Error removing old file: %s" msgstr "Napaka med odstranjevanjem datoteke: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Privzet neveljaven GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Neveljavna zahteva iskanja" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Ni mogoče razčleniti GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Odvoda pretoka pomnilnika ni mogoče razširiti" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Razširjanje pretoka odvoda pomnilnika je spodletelo." -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3426,73 +3463,73 @@ msgstr "" "Količina pomnilnika zahtevana za pisanje je večja kot je razpoložljivi " "prostor naslova" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Zahtevano iskanje pred začetkom pretoka" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Zahtevano iskanje za koncem pretoka" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "enota ne podpira možnosti »odklopi«" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "enota ne podpira možnosti »izvrzi«" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "enota ne podpira možnosti »odklopi« ali »odklopi z dejanjem«" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "enota ne podpira možnosti »izvrzi« ali »izvrzi z dejanjem«" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "enota ne podpira možnosti »ponovnega priklopa«" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "priklop ne podpira ugibanja vsebine vrste" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "priklop ne podpira usklajevanja ugibanja vsebine vrste" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Ime gostitelja »%s« vsebuje » [ «, ne pa tudi » ] «" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Omrežje ni dosegljivo" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Gostitelj ni dosegljiv" @@ -3520,7 +3557,7 @@ msgstr "Program NetworkManager ni zagnan" msgid "NetworkManager version too old" msgstr "Različica programa NetworkManager je prestara" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Odvodni pretok ne podpira pisanja" @@ -3533,38 +3570,38 @@ msgstr "Vsota vektorjev, poslanih na %s, je prevelika." msgid "Source stream is already closed" msgstr "Izvorni pretok je že zaprt" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Prišlo je do nedoločene napake poizvedbe posredniškega strežnika" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Napaka med razreševanjem »%s«: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "Za funkcijo %s ni zagotovljene podpore." -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Neveljavna domena" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Vir »%s« ne obstaja." -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Vira »%s« ni mogoče razširiti" @@ -3582,11 +3619,11 @@ msgstr "Vir »%s« ni mapa." msgid "Input stream doesn’t implement seek" msgstr "Vhodni pretok ne podpira iskanja" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Izpiši seznam odsekov, ki vsebujejo vire v DATOTEKI elf" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3596,15 +3633,15 @@ msgstr "" "Če je ODSEK podan, izpiši le vire iz tega odseka\n" "Če je podana POT, izpiši le skladne vire" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "DATOTEKA [POT]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "ODSEK" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3616,15 +3653,15 @@ msgstr "" "Če je podana POT, izpiši le ujemajoče vire\n" "Podrobnosti vsebujejo odsek, velikost in stiskanje" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Razširi datoteko vira na standardni odvod" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "DATOTEKA POT" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3652,7 +3689,7 @@ msgstr "" "Z ukazom »gresource help UKAZ« pridobite podrobno pomoč.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3667,19 +3704,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " ODSEK Ime (izbirno) izbora elf\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " UKAZ Ukaz (izbirno) za razlago\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " DATOTEKA Datoteka elf (dvojiška ali skupna knjižnica)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3687,19 +3724,19 @@ msgstr "" " DATOTEKA Datoteka elf (dvojiška ali skupna knjižnica)\n" " ali prevedena datoteka vira\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[POT]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " POT Dodatna (neobvezna) pot vira (lahko je delna)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "POT" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " POT Pot vira\n" @@ -3930,215 +3967,215 @@ msgstr "Ni podanega imena sheme.\n" msgid "No such key “%s”\n" msgstr "Ključ »%s« ne obstaja.\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Neveljaven vtič, ni zagnano" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Neveljaven vtič, zaganjanje je spodletelo: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Vtič je že zaprt" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Vtič V/I naprave je časovno potekel" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "ustvarjanje GSocet preko fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Ni mogoče ustvariti vtiča: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Določena je neznana družina" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Določen je neznan protokol" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Ni mogoče uporabiti opravil datagrama na vtiču, ki jih ne podpira." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Ni mogoče uporabiti opravil datagrama na vtiču z nastavljenim časovnim " "pretekom" -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "ni mogoče pridobiti krajevnega naslova: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "ni mogoče pridobiti oddaljenega naslova: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "ni mogoče slediti: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Napaka vezave na naslov %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Napaka povezovanja v skupino za večsmerno oddajanje: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Napaka zapuščanja skupine za večsmerno oddajanje: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje lastno viru" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Nepodprta skupina vtiča" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "določeno po viru in ne po naslovu IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Ime vmesnika je predolgo" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Vmesnika ni mogoče najti: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje v protokolu IPv4" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje v protokolu IPv6" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Napaka med sprejemanjem povezave: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Povezava v teku" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Ni mogoče pridobiti uvrščene napake:" -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Napaka med prejemanjem podatkov: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Napaka med pošiljanjem podatkov: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Ni mogoče izklopiti vtiča: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Napaka med zapiranjem vtiča: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Čakanje na stanje vtiča: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Ni mogoče poslati sporočila: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Vektorji sporočila so preobsežni." -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Napaka med pošiljanjem sporočila: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "Predmet GSocketControlMessage na sistemih Windows ni podprt" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Napaka med prejemanjem sporočila: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Ni mogoče prebrati poveril vtiča: %s." -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "Operacijski sistem ne podpira možnosti g_socket_get_credentials" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Ni se mogoče povezati s posredniškim strežnikom %s:" -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Ni se mogoče povezati s strežnikom %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Ni se mogoče povezati: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Posredovanje preko ne-TCP povezave ni podprto." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Protokol posredniškega strežnika »%s« ni podprt." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Poslušalnik je že zaprt" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Dodan vtič je zaprt" @@ -4229,94 +4266,94 @@ msgstr "SOCKSv5 posredniški strežnik ne podpira ponujene vrste naslova" msgid "Unknown SOCKSv5 proxy error." msgstr "Neznana napaka posredniškega strežnika SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Ni mogoče ustvariti cevi za stik z opravilom podrejenega predmeta (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Uporaba cevljenja na tem sistemu ni podprta" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Ni mogoče upravljati z različico %d kodiranja GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Ni mogoče najti veljavnega naslova" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Napaka med obratnim razreševanjem »%s«: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Napaka razčlenjevanja zapisa DNS %s: nepravilno oblikovan paket DNS" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Ni zapisa DNS za zahtevano vrsto »%s«" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Trenutno ni mogoče razrešiti »%s«" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Napaka med razreševanjem »%s«" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Nepravilno oblikovan paket DNS" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Razčlenjevanje odziva DNS za »%s« je spodletelo: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Potrdila kodiranega s protokolom PEM ni mogoče najti." -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Ni mogoče odšifrirati s protokolom PEM šifriranega osebnega ključa" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Ni mogoče razčleniti s protokolom PEM kodiranega zasebnega ključa." -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Potrdila kodiranega s protokolom PEM ni mogoče najti." -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Ni mogoče razčleniti s protokolom PEM kodiranega potrdila." -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Ozadnji program TLS ne podpira potrdil PKCS #12." -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Ozadnji program GTlsBackend ne podpira ustvarjanja potrdil PKCS #11." -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4325,7 +4362,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4333,15 +4370,15 @@ msgstr "" "Neuspešnih je bilo več poskusov vnosa gesla, zato bo dostop ob naslednjem " "napačnem vnosu zaklenjen." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Vneseno geslo je nepravilno." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Pošiljanje FD ni podprto" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4350,11 +4387,11 @@ msgstr[1] "Pričakovano eno nadzorno sporočilo, prejeto pa je %d sporočilo" msgstr[2] "Pričakovano eno nadzorno sporočilo, prejeti pa sta %d sporočili" msgstr[3] "Pričakovano eno nadzorno sporočilo, prejeta pa so %d sporočila" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Nepričakovana vrsta dodatnih podatkov" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4363,111 +4400,123 @@ msgstr[1] "Pričakovan en fd, prejet pa je %d\n" msgstr[2] "Pričakovan en fd, prejeta pa sta %d\n" msgstr[3] "Pričakovan en fd, prejetih pa so %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Prejet neveljaven fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Prejemanje FD ni podprto" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Napaka med pošiljanjem poveril:" -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Napaka med preverjanjem ali je predmet O_PASSCRED omogočen za vtič: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Napaka omogočanja predmeta SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Pri prejemanju poveril je pričakovano branje enega bajta, vendar se je " "prebralo nič bajtov" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Nadzorno sporočilo ni pričakovano, vendar pa je prejeto %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Napaka med onemogočanjem SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Napaka med branjem iz opisovalnika datoteke: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Napaka med zapiranjem opisovalnika datoteke: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Koren datotečnega sistema" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Napaka med pisanjem v opisovalnik datoteke: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstraktni naslovi vtiča domene UNIX na tem sistemu niso podprti" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "nosilec ne podpira možnosti izmetavanja" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "nosilec ne prepozna ukaza izvrzi ali izvrzi_z_dejanjem" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "" +"Program »%s« v predmetu programa nima vpisanih vseh podatkov (no verbs)" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "Program »%s« in ročnik »%s« nimata vpisanih vseh podatkov (no verbs)" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Napaka branja iz ročnika: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Napaka med zapiranjem ročnika: %s." -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Napaka pisanja v ročnik: %s." -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Ni dovolj pomnilnika" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Notranja napaka: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Zahteva več vhoda" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Neveljavni stisnjeni podatki" @@ -4495,148 +4544,287 @@ msgstr "Zaženi storitev DBus" msgid "Wrong args\n" msgstr "Napačni argumenti\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Odpiranje »%s« je spodletelo: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Napaka: ni mogoče zapisati celotnega odvoda: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Napaka: ni mogoče preimenovati »%s« v »%s«: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Vključi mape v iskalno pot GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Odvodna datoteka" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Skupna knjižnica" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Pokaži sporočila razhroščevanja" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Pokaži podrobna sporočila" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Izpiši podrobnosti različice in končaj" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Napaka razčlenjevanja argumentov: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Določiti je treba le eno vhodno datoteko" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Napaka razčlenjevanja datoteke »%s«: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Izgradnja predmetov typelib za modul »%s« je spodletela." + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Neveljaven predmet typelib za modul »%s«: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Pokaži vse razpoložljive podrobnosti" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Razčlenitev je spodletela: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Ni vhodnih datotek" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Branje »%s« je spodletelo: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Ustvarjanje predmeta typelib »%s« je spodletelo: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Nalaganje predmetov typelib je spodletelo: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Opozorilo: izpuščenih je %u modulov" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Različica Typelib za pregled" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "RAZLIČICA" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Seznam knjižnic v souporabi, ki jih zahteva predmet typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Seznam drugih vrst typelib, ki jih pregledani prdmet typelib zahteva" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "Predmet typelib za pregled" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "IMENSKI PROSTOR" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Pregled vrste typelib GI" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Razčlenjevanje možnosti ukazne vrstice je spodletelo: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Navesti je treba natanko en imenski prostor." + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" +"Določiti je treba argument --print-shlibs, argument --print-typelibs ali oba" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Nepričakovan atribut »%s« za predmet »%s«" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atributa »%s« predmeta »%s« ni mogoče najti" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Nepričakovana oznaka »%s«, pričakovana je »%s«" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Nepričakovana oznaka »%s« znotraj »%s«" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Neveljaven zapis datuma/časa »%s« v datoteki zaznamka" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Ni veljavne datoteke zaznamkov v podatkovnih mapah" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Zaznamek za naslov URI »%s« že obstaja" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Ni veljavnega zaznamka za naslov URI »%s«" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni določene vrsta MIME" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni določene zasebne zastavice" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni nastavljenih skupin" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Program z imenom »%s« ni ustvaril zaznamka za »%s«" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Razširjanje ukazne vrstice »%s« z naslovom URI »%s« je spodletelo." -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Nepredstavljiv znak na dovodu pretvorbe" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Nedokončano zaporedje znakov na koncu vhoda" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Ni mogoče pretvoriti »%s« v nabor znakov »%s«" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Vstavljeno je prazno zaporedje bajtov na dovod pretvorbe" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Vstavljeno je prazno zaporedje bajtov na odvod pretvorbe" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "Naslov URI »%s« pri uporabi »datotečne« sheme ni absoluten" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "Naslov URI »%s« je neveljaven" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Ime gostitelja naslova URI »%s« ni veljavno" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "Naslov URI »%s« vsebuje neveljavne ubežne znake" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Pot »%s« ni absolutna pot" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a, %e. %b %Y %H:%M:%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4657,62 +4845,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "januar" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "februar" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "marec" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "april" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "maj" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "junij" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "julij" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "avgust" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "september" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "oktober" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "november" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "december" @@ -4734,132 +4922,132 @@ msgstr "december" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "apr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "maj" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "jun" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "jul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "avg" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "okt" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "ponedeljek" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "torek" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "sreda" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "četrtek" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "petek" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "sobota" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "nedeljo" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "pon" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "tor" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "sre" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "čet" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "pet" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "sob" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "ned" @@ -4881,62 +5069,62 @@ msgstr "ned" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "januar" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "februar" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "marec" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "april" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "maj" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "junij" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "julij" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "avgust" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "september" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "oktober" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "november" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "december" @@ -4958,198 +5146,202 @@ msgstr "december" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "jan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "apr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "maj" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "jun" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "jul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "avg" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "okt" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "dec" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "dop" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "pop" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Napaka med odpiranjem imenika »%s«: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Ni mogoče dodeliti %lu bajtov za branje datoteke »%s«" -msgstr[1] "Ni mogoče dodeliti %lu bajta za branje datoteke »%s«" -msgstr[2] "Ni mogoče dodeliti %lu bajtov za branje datoteke »%s«" -msgstr[3] "Ni mogoče dodeliti %lu bajtov za branje datoteke »%s«" +msgid "Could not allocate %s to read file “%s”" +msgstr "Ni mogoče dodeliti %s za branje datoteke »%s«" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Napaka med branjem datoteke »%s«: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Datoteka »%s« je prevelika." -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Branje datoteke »%s« je spodletelo: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Odpiranje datoteke »%s« je spodletelo: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" "Pridobivanje atributov datoteke »%s« je spodletelo: ukaz fstat() ni uspešno " "izveden: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Ni mogoče odpreti datoteke »%s«: ukaz fdopen() ni uspešno izveden: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "Ni mogoče preimenovati datoteke »%s« v »%s«: ukaz g_rename() ni uspešno " "izveden: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Ni mogoče zapisati datoteke »%s«: ukaz ftruncate() je spodletel: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Ni mogoče zapisati datoteke »%s«: ukaz write() je spodletel: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Ni mogoče zapisati datoteke »%s«: ukaz fsync() ni uspešno izveden: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Ni mogoče ustvariti datoteke »%s«: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" "Obstoječe datoteke »%s« ni mogoče odstraniti: ukaz g_unlink() ni uspešno " "izveden: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Predloga »%s« je neveljavna, saj ne sme vsebovati »%s«" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Predloga »%s« ne vsebuje XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Branje simbolne povezave »%s« je spodletelo: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Ni mogoče odpreti pretvornika iz »%s« v »%s«: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Ni mogoče prebrati g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Preostanek nepretvorjenih podatkov v bralnem medpomnilniku" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanal je prekinjen v delnem znaku" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Ni mogoče prebrati v g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Veljavnega ključa v iskanih mapah ni mogoče najti" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Ni običajna datoteka" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5157,52 +5349,52 @@ msgstr "" "Datoteka ključa vsebuje vrstico »%s«, ki ni par ključ-vrednost, skupina ali " "opomba" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Neveljavno ime skupine: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Datoteka s ključem se ne začne s skupino" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Neveljavno ime ključa: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Datoteka ključa vsebuje nepodprto kodiranje »%s«" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Datoteka s ključem ni del skupine »%s«" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Datoteka s ključem nima ključa »%s« v skupini »%s«" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "Datoteka ključa vsebuje ključ »%s« z vrednostjo »%s«, ki ni zapisan v naboru " "UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Datoteka ključa vsebuje ključ »%s« z vrednostjo, ki je ni mogoče tolmačiti." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5211,37 +5403,37 @@ msgstr "" "Datoteka ključa vsebuje ključ »%s« v skupini »%s« z vrednostjo, ki je ni " "mogoče tolmačiti." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "Ključ »%s« v skupini »%s« ima vrednost »%s«, pričakovana pa je vrednost %s." -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Datoteka s ključem vsebuje ubežni znak na koncu vrstice" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Datoteka ključa vsebuje neveljavno ubežno zaporedje »%s«" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Vrednosti »%s« ni mogoče obravnavati kot število." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Celoštevilska vrednost »%s« je izven obsega" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Vrednosti »%s« ni mogoče obravnavati kot število s plavajočo vejico." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Vrednosti »%s« ni mogoče obravnavati kot logično Boolovo vrednost." @@ -5264,32 +5456,32 @@ msgid "Failed to open file “%s”: open() failed: %s" msgstr "" "Odpiranje datoteke »%s« je spodletelo: ukaz open() ni uspešno izveden: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Napaka v vrstici %d, znak %d:" -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Neveljavno UTF-8 kodirano besedilo imena – neveljaven »%s«" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "»%s« ni veljavno ime" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "»%s« ni veljavno ime: »%c«" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Napaka v vrstici %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5298,7 +5490,7 @@ msgstr "" "Razčlenjevanje vrste »%-.*s«, ki bi morala določati številko znotraj sklica " "znaka (na primer ê) je spodletelo – morda je številka prevelika" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5307,24 +5499,24 @@ msgstr "" "Sklic znaka ni končan s podpičjem; najverjetneje je uporabljen znak » & « " "brez povezave s predmetom – znak » & « mora biti zapisan kot »&«." -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Sklic znaka »%-.*s« ne kodira dovoljenega znaka" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Zaznan je prazen predmet » &; «; veljavne možnosti so: & " < " "> '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Ime predmeta »%-.*s« ni prepoznano" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5332,11 +5524,11 @@ msgstr "" "Predmet ni zaključen s podpičjem; najverjetneje je uporabljen znak » & « " "brez povezave s predmetom – znak » & « mora biti zapisan kot »&«." -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokument se mora začeti z predmetom (na primer )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5345,7 +5537,7 @@ msgstr "" "»%s« ni veljaven znak, ki lahko sledi znaku » < «;. Morda se ne začne z " "imenom predmeta." -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5354,12 +5546,12 @@ msgstr "" "Nenavaden znak »%s«; pričakovan znak je » > «, da zaključi oznako predmeta " "»%s«" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Določenih je preveč atributov za predmet »%s«" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5367,7 +5559,7 @@ msgstr "" "Nenavaden znak »%s«; za imenom atributa »%s« (predmeta »%s«) je pričakovan " "znak » = «." -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5378,7 +5570,7 @@ msgstr "" "predmeta »%s« ali pogojno atribut. Morda je uporabljen neveljaven znak v " "imenu atributa." -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5387,7 +5579,7 @@ msgstr "" "Nenavaden znak »%s«; za enačajem je pričakovan narekovaj, znotraj katerega " "je podana vrednost atributa »%s« predmeta »%s«." -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “ «." -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Predmet »%s« je zaprt, trenutno ni odprtega drugega predmeta" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Predmet »%s« je zaprt, še vedno pa je odprt predmet »%s«" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokument je prazen ali pa vsebuje le presledne znake" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokument je nepričakovano zaključen takoj za odprtjem oznake z » < «" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5432,7 +5624,7 @@ msgstr "" "Dokument je nepričakovano zaključen s še odprtimi predmeti – »%s« je zadnji " "odprt predmet" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5441,19 +5633,19 @@ msgstr "" "Dokument nepričakovano zaključen, pričakovan je zaključni zaklepaj oznake " "<%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokument nepričakovano zaključen sredi imena predmeta" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokument nepričakovano zaključen sredi imena atributa" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokument nepričakovano zaključen sredi oznake za odprtje predmeta." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5461,259 +5653,259 @@ msgstr "" "Dokument nepričakovano zaključen za enačajem, ki sledil imenu atributa; ni " "določena vrednosti atributa" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokument nepričakovano zaključen sredi vrednosti atributa" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokument je nepričakovano zaključen sredi oznake zaprtja predmeta »%s«" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Dokument je nepričakovano zaključen sredi oznake zaprtja predmeta za neodprt " "predmet" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Dokument nepričakovano zaključen sredi opombe ali ukaza" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[MOŽNOST ...]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Možnosti pomoči:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Pokaži možnosti pomoči" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Pokaži vse možnosti pomoči" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Možnosti programa:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Možnosti:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Ni mogoče razčleniti celoštevilske vrednosti »%s« za %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Celoštevilska vrednost »%s« za %s je izven obsega" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Ni mogoče razčleniti dvojne vrednosti »%s« za %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Dvojna vrednost »%s« za %s je izven obsega" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Napaka med razčlenjevanjem %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Manjka argument za %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Neznana možnost %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "pokvarjen predmet" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "primanjkuje pomnilnika" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "notranja napaka" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "vzorec vsebuje predmete, ki niso podprti za delno iskanje zadetkov" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "predhodne povezave, kot pogoji, niso podprti za delno primerjavo" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "dosežena omejitev globine drevesne ravni" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "slab odmik" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekurzivna zanka" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "zahtevan je način skladnje, ki pa ni vključen v izgradnjo JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "neznana napaka" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ na koncu vzorca" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c na koncu vzorca" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "neprepoznan znak sledi \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "številke niso zapisane pravilno v {} količilniku" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "številke so prevelike v {} količilniku" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "manjkajoč zaključni znak ] za znakovni razred" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "neveljavno ubežno zaporedje v znakovnem razredu" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "nepravilen obseg v znakovnem razredu" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "ni mogoče ponoviti" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "neprepoznan znak za (? ali (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "Imenski razredi POSIX so podprti le znotraj razreda" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "Zbirni predmeti POSIX niso podprti" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "manjka zaključujoči )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "povezava na neobstoječ podrejen vzorec" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "manjka ) po opombi" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "logični izraz je preobsežen" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "nepravilno oblikovano ime ali številka za (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "povratna trditev ni določene dolžine" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "pogojna skupina vsebuje več kot dve veji" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "trditev pričakovana za (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "oštevilčen sklic ne sme biti ničeln" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "neznano ime razreda POSIX" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "znakovna vrednost v zaporedju \\x{...} je predolga" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C ni dovoljen v povratnih trditvah" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "manjkajoč zaključni znak v imenu podrejenega vzorca" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "dva imenovana podrejena vzorca imata enako ime" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "nepravilno oblikovano \\P ali \\p zaporedje" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "neznano ime lastnosti za \\P ali \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "ime podrejenega vzorca je predolgo (največ 32 znakov)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "preveč imenovanih podrejenih vzorcev (največ 10,000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "osmiška vrednost je večja kot \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE skupina vsebuje več kot eno vejo" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "nepopolna NEWLINE možnost" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5721,231 +5913,231 @@ msgstr "" "\\g ne sledi ime oziroma število v oklepajih, oglatih oklepajih ali " "narekovajih, niti navadno število" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "argument ni dovoljen za (*ACCEPT), (*FAIL) ali (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) ni prepoznan" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "številka je prevelika" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "manjkajoče ime podrejenega vzorca po (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "različna imena podrejenih vzorcev z isto številko niso dovoljena" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) mora obvezno imeti argument" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c mora slediti znak ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "\\k ne sledi ime v oklepajih, oglatih oklepajih ali narekovajih" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N ni podprto v razredu" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "ime je predolgo v (*MARK), (*PRUNE), (*SKIP) ali (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "prekoračitev kode" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "neprepoznan znak za (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "pretečena delovna površina prevajanja kode" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "predhodno preverjene povezave podrejenega vzorca ni mogoče najti" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Napaka med primerjanjem logičnega izraza %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "Knjižnica PCRE je pretvorjena brez UTF-8 podpore" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "Knjižnica PCRE je prevedena brez možnosti nezdružljivosti" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "" "Prišlo je do napake med rpevajanjem logičnega izraza »%s« pri znaku %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "šestnajstiško število ali pa manjka » } «" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "pričakovano šestnajstiško število" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "manjka znak » < « v simbolni povezavi" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "nedokončana simbolna povezava" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "simbolna povezava nične dolžine" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "pričakovano število" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "neveljavna simbolna povezava" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "obidi končna » \\ «" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "neznano ubežno zaporedje" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Napaka med razčlenjevanjem besedila zamenjave »%s« pri znaku %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Navedeno besedilo se ne začne z narekovajem" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "V ukazni vrstici ali v navedenem besedilu manjka končni narekovaj" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Besedilo je končano takoj za znakom » \\ « (besedilo je »%s«)." -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Besedilo je končano pred zaključnim narekovajem za %c (besedilo je »%s«)." -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Besedilo je bilo prazno (ali pa vsebuje le presledne znake)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Ni mogoče prebrati podatkov podrejenega procesa (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Nepričakovana napaka branja podatkov podrejenega opravila (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Nepričakovana napaka v waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Podrejeni proces se je zaključil s kodo %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Podrejeni proces je uničen s signalom %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Podrejeni proces se je ustavil s signalom %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Podrejeni proces se je zaključil nenaravno" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Ni mogoče prebrati iz cevi podrejenega procesa (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Ni mogoče ustvariti podrejenega opravila »%s« (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Ni mogoča razvejitev (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Ni mogoče spremeniti v mapo »%s« (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Ni mogoče izvesti podrejenega opravila »%s« (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Ni mogoče odpreti datoteke za preslikavo opisnika datoteke (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Ni mogoče podvojiti opisnika datoteke podrejenega procesa (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Ni mogoče razvejiti podrejenega procesa (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Ni mogoče zapreti opisnika datoteke podrejenega procesa (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Neznana napaka med izvajanjem podrejenega opravila »%s«" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Ni mogoče prebrati dovolj podatkov iz cevi podrejenega procesa (%s)" @@ -6002,78 +6194,78 @@ msgstr "" "Nepričakovana napaka v g_io_channel_win32_poll() med branjem podatkov " "procesa podrejenega predmeta" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Prazen niz ni številska vrednost" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "»%s« ni podpisano število" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Število »%s« je izven območja [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "»%s« ni nepodpisano število" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Neveljavni nabor znakov v naslovu URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Neveljaven naslov v naslovu URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Napačen ne-UTF-8 znak v naslovu URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Neveljaven naslov IPv6 »%.*s« v naslovu URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Neveljaven kodiran naslov IP »%.*s« v naslovu URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Neveljavno internacionalizirano ime gostitelja »%.*s« v naslovu URI." -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Ni mogoče razčleniti vrat »%.*s« v naslovu URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Vrednost vrat »%.*s« v naslovu URI je izven obsega" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "Naslov URI »%s« ni absolutna pot" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "Naslov URI »%s« je brez vpisa gostitelja" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "Naslov URI ni absoluten naslov in ni podanega osnovnega naslova URI" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Manjka znak »=« in vrednost parametra" @@ -6154,65 +6346,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6327,6 +6519,55 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "Ni mogoče dodeliti % " +#~ msgstr[1] "Ni mogoče dodeliti % " +#~ msgstr[2] "Ni mogoče dodeliti % " +#~ msgstr[3] "Ni mogoče dodeliti % " + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Sporočilo METHOD_RETURN: manjka ali pa ni vpisane vrednosti polja glave " +#~ "REPLY_SERIAL" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "backtracking limit reached" #~ msgstr "dosežena omejitev sledenja nazaj" @@ -6522,9 +6763,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[ARGUMENTI ...]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "Ustvarjanje začasne datoteke je spodletelo: %s" - #~ msgid "" #~ "Message has %d file descriptors but the header field indicates %d file " #~ "descriptors" diff --git a/po/sv.po b/po/sv.po index ba86177..be6e123 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1,17 +1,17 @@ # Swedish messages for glib. -# Copyright © 2001-2023 Free Software Foundation, Inc. +# Copyright © 2001-2024 Free Software Foundation, Inc. # Christian Rose , 2001-2005. # Daniel Nylander , 2006-2012. # Sebastian Rasmussen , 2014, 2015. -# Anders Jonsson , 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023. -# Luna Jernberg , 2021, 2022. +# Anders Jonsson , 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# Luna Jernberg , 2021, 2022, 2024. # msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-06 14:03+0000\n" -"PO-Revision-Date: 2023-09-07 01:08+0200\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-06 19:26+0100\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -39,36 +39,40 @@ msgstr "Misslyckades med att hitta standardprogram för innehållstypen ”%s” msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Misslyckades med att hitta standardprogram för URI-schemat ”%s”" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication-flaggor:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Visa GApplication-flaggor" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "Gå in i GApplication-serviceläge (användning från D-Bus-servicefil)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Åsidosätt programmets ID" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Skriv ut programmets version" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Ersätt den körande instansen" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Skriv ut hjälp" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMMANDO]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Skriv ut version" @@ -122,7 +126,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "KOMMANDO" @@ -134,9 +138,13 @@ msgstr "Kommandot att skriva ut detaljerad hjälp för" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Programidentifierare i D-Bus-format (t.ex: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "FIL" @@ -160,7 +168,7 @@ msgstr "PARAMETER" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Frivillig parameter till åtgärdsstarten, i GVariant-format" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -174,12 +182,12 @@ msgstr "" msgid "Usage:\n" msgstr "Användning:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argument:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGUMENT…]" @@ -272,78 +280,78 @@ msgstr "" "okänt kommando: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "För stort räknevärde skickat till %s" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Sökning stöds inte på basströmmen" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Kan inte kapa av GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Strömmen är redan stängd" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Kapning stöds inte på basströmmen" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Åtgärden avbröts" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Ogiltigt objekt, inte initierat" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Ofullständig flerbytesekvens i inmatning" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Inte tillräckligt med utrymme i målet" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Ogiltig bytesekvens i konverteringsindata" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Fel vid konvertering: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Avbrytningsbar initiering stöds inte" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Konvertering från teckentabellen ”%s” till ”%s” stöds inte" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Kunde inte öppna konverteraren från ”%s” till ”%s”" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s-typ" @@ -357,41 +365,41 @@ msgstr "Okänd typ" msgid "%s filetype" msgstr "%s-filtyp" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials innehåller ogiltiga data" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials är inte implementerat för detta operativsystem" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Det finns inget stöd för GCredentials för din plattform" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials innehåller inte ett process-ID för detta OS" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Inloggningsuppgiftsspoofning är inte möjligt i detta OS" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Oväntat tidig end-of-stream" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nyckeln ”%s” stöds inte i adressposten ”%s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Betydelselös kombination av nyckel/värde-par i adressposten ”%s”" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -400,28 +408,28 @@ msgstr "" "Adressen ”%s” är ogiltig (behöver exakt en av sökväg, katalog, " "temporärkatalog eller abstrakta nycklar)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Fel i adressen ”%s” — attributet ”%s” är felformulerat" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Transport ”%s” är okänd eller saknar stöd för adressen ”%s”" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Adresselementet ”%s” innehåller inte ett kolontecken (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Transportnamn i adresselementet ”%s” får inte vara tomt" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -430,14 +438,14 @@ msgstr "" "Nyckel/Värde-par %d, ”%s”, i adresselementet ”%s” innehåller inte ett " "likhetstecken" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" "Nyckel/Värde-par %d, ”%s”, i adresselementet ”%s” får inte ha en tom nyckel" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -446,7 +454,7 @@ msgstr "" "Fel vid borttagning av escape i nyckel eller värde i Nyckel/Värde-par %d, " "”%s”, i adresselementet ”%s”" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -455,77 +463,77 @@ msgstr "" "Fel i adressen ”%s” — unix-transporten kräver att exakt en av nycklarna " "”path” eller ”abstract” har ställts in" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "Fel i adressen ”%s” — värdattributet saknas eller är felformulerat" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "Fel i adressen ”%s” — portattributet saknas eller är felformulerat" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Fel i adressen ”%s” — attributet noncefile saknas eller är felformulerat" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Fel vid automatisk körning: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Fel vid öppning av nonce-filen ”%s”: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Fel vid läsning från nonce-filen ”%s”: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Fel vid läsning från nonce-filen ”%s”, förväntade 16 byte, fick %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Fel vid skrivning av innehåll i nonce-filen ”%s” till ström:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Angivna adressen är tom" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "Kan inte starta en meddelandebuss när AT_SECURE har ställts in" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Kan inte starta en meddelandebuss utan ett maskin-id: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Kan inte starta D-Bus automatiskt utan X11-miljövariabeln $DISPLAY" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Fel vid körning av kommandoraden ”%s”: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Kan inte fastställa adress för sessionsbuss (inte implementerat för detta " "operativsystem)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -534,7 +542,7 @@ msgstr "" "Kan inte fastställa bussadressen från miljövariabeln DBUS_STARTER_BUS_TYPE — " "okänt värde ”%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -542,20 +550,20 @@ msgstr "" "Kan inte fastställa bussadress därför att miljövariabeln " "DBUS_STARTER_BUS_TYPE inte är inställd" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Okänd busstyp %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Oväntad avsaknad av innehåll vid försök att läsa en rad" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Oväntad avsaknad av innehåll vid försök att (säkert) läsa en rad" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -563,15 +571,15 @@ msgstr "" "Alla tillgängliga autentiseringsmekanismer har testats (försök: %s) " "(tillgängliga: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Oväntad avsaknad av innehåll vid försök att läsa en byte" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Användar-ID:n måste vara samma för motpart och server" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Avbröts via GDBusAuthObserver::authorize-authenticated-peer" @@ -593,13 +601,13 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "Fel vid skapandet av katalogen ”%s”: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Åtgärden stöds inte" @@ -664,15 +672,15 @@ msgstr "Fel vid öppning av nyckelringen ”%s” för skrivning: " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(I tillägg misslyckades även upplåsningen för ”%s”: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Anslutningen är stängd" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Tidsgränsen uppnåddes" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -764,64 +772,78 @@ msgstr "Ett underträd har redan exporterats för %s" msgid "Object does not exist at path “%s”" msgstr "Objektet finns inte på sökvägen ”%s”" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s-meddelande: Rubrikfältet %s är ogiltigt; förväntade ett värde av typen " +"”%s”" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s-meddelande: Rubrikfältet %s saknas eller är ogiltigt" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s-meddelande: Rubrikfältet INVALID tillhandahölls" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s-meddelande: Rubrikfältet PATH använder det reserverade värdet /org/" +"freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"%s-meddelande: Rubrikfältet INTERFACE innehåller inget giltigt " +"gränssnittsnamn" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s-meddelande: Rubrikfältet INTERFACE använder det reserverade värdet org." +"freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"%s-meddelande: Rubrikfältet MEMBER innehåller inget giltigt medlemsnamn" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"%s-meddelande: Rubrikfältet ERROR_NAME innehåller inget giltigt felnamn" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "typ är OGILTIG" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"METHOD_CALL-meddelande: Rubrikfältet PATH eller MEMBER saknas eller är " -"ogiltigt" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"METHOD_RETURN-meddelande: Rubrikfältet REPLY_SERIAL saknas eller är ogiltigt" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"FEL-meddelande: Rubrikfältet REPLY_SERIAL eller ERROR_NAME saknas eller är " -"ogiltigt" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL-meddelande: Rubrikfältet PATH, INTERFACE eller MEMBER saknas eller är " -"ogiltigt" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL-meddelande: Rubrikfältet PATH använder det reserverade värdet /org/" -"freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL-meddelande: Rubrikfältet INTERFACE använder det reserverade värdet " -"org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "Ville läsa %lu byte men fick bara %lu" msgstr[1] "Ville läsa %lu byte men fick bara %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Förväntade NUL-byte efter strängen ”%s” men hittade byte %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -831,21 +853,21 @@ msgstr "" "(längd av strängen är %d). Den giltiga UTF-8-strängen fram till den punkten " "var ”%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Värde nästlat för djupt" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Tolkat värde ”%s” är inte en giltig D-Bus-objektsökväg" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Tolkat värde ”%s” är inte en giltig D-Bus-signatur" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -856,7 +878,7 @@ msgstr[0] "" msgstr[1] "" "Påträffade array med längden %u byte. Maximal längd är 2<<26 byte (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -865,16 +887,16 @@ msgstr "" "Påträffade array av typ ”a%c”, förväntad att ha en längd som är en multipel " "av %u byte, men visade sig vara %u byte lång" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Tomma strukturer (tupler) tillåts inte i D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Tolkat värde ”%s” för variant är inte en giltig D-Bus-signatur" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" @@ -882,7 +904,7 @@ msgstr "" "Fel vid deserialisering av GVariant med typsträngen ”%s” från D-Bus-" "transportformatet" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -891,38 +913,38 @@ msgstr "" "Ogiltigt värde för byteordning. Förväntade 0x6c (”l”) eller 0x42 (”B”) men " "hittade värdet 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Ogiltig större protokollversion. Förväntade 1 men hittade %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "Signaturrubrik hittades men är inte av typen signatur" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Signaturrubrik med signaturen ”%s” hittades men meddelandekroppen är tom" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Tolkat värde ”%s” är inte en giltig D-Bus-signatur (för kropp)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "Ingen signaturrubrik i meddelande men meddelandekroppen är %u byte" msgstr[1] "Ingen signaturrubrik i meddelande men meddelandekroppen är %u byte" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Kan inte deserialisera meddelande: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" @@ -930,23 +952,23 @@ msgstr "" "Fel vid serialisering av GVariant med typsträngen ”%s” till D-Bus-" "transportformatet" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "Antal filhandtag i meddelande (%d) skiljer sig från rubrikfältet (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Kan inte serialisera meddelandet: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" "Meddelandekroppen har signaturen ”%s” men det finns ingen signaturrubrik" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -955,17 +977,17 @@ msgstr "" "Meddelandekroppen har typsignaturen ”%s” men signaturen i rubrikfältet är " "”%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "Meddelandekroppen är tom men signaturen i rubrikfältet är ”(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Fel returnerades med kropp av typen ”%s”" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Fel returnerade med tom kropp" @@ -985,22 +1007,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Kunde inte hämta hårdvaruprofil: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Kunde inte läsa in %s eller %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Fel vid anrop av StartServiceByName för %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Oväntat svar %d från StartServiceByName(”%s”)-metod" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1009,25 +1031,25 @@ msgstr "" "Kan inte anropa metod; proxy är för det välkända namnet %s utan en ägare och " "proxy konstruerades med flaggan G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Abstrakt namnrymd stöds inte" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Kan inte ange nonce-filen när en server skapas" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Fel vid skrivning av nonce-fil i ”%s”: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Strängen ”%s” är inte ett giltigt D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Kan inte lyssna på transport ”%s” som inte stöds" @@ -1090,6 +1112,10 @@ msgstr "Anslut till sessionsbussen" msgid "Connect to given D-Bus address" msgstr "Anslut till angiven D-Bus-adress" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "ADRESS" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Flaggor för anslutningspunkt:" @@ -1318,71 +1344,72 @@ msgstr "Fel: %s är inte ett giltigt välkänt bussnamn.\n" msgid "Not authorized to change debug settings" msgstr "Inte behörig att ändra felsökningsinställningar" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Namnlös" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Desktop-filen angav inget Exec-fält" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Kunde inte hitta terminal som krävs för programmet" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Programmet ”%s” hittades inte i $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Kan inte skapa programkonfigurationsmapp för användare %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Kan inte skapa MIME-konfigurationsmapp för användare %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Programinformation saknar en identifierare" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Kan inte skapa desktop-fil %s för användare" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Anpassad definition för %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "enheten har inte implementerat eject" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "enheten har inte implementerat eject eller eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "enheten har inte implementerat pollning av media" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "enheten har inte implementerat start" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "enheten har inte implementerat stop" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS-bakänden implementerar inte hämtande av TLS-bindning" @@ -1395,27 +1422,27 @@ msgstr "TLS-stöd finns inte tillgängligt" msgid "DTLS support is not available" msgstr "DTLS-stöd finns inte tillgängligt" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Kan inte hantera version %d av GEmblem-kodning" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Felformaterat antal token (%d) i GEmblem-kodning" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Kan inte hantera version %d av GEmblemedIcon-kodning" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Felformaterat antal token (%d) i GEmblemedIcon-kodning" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Förväntade en GEmblem för GEmblemedIcon" @@ -1423,129 +1450,135 @@ msgstr "Förväntade en GEmblem för GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Innefattande montering finns inte" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Kan inte kopiera över katalog" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Kan inte kopiera katalog över katalog" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Målfilen finns" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Kan inte kopiera katalogen rekursivt" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Kopiera filintervall stöds inte" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Fel vid splice av fil: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Splice stöds inte" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Kopiering (reflänk/klon) mellan monteringar stöds inte" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopiering (reflänk/klon) stöds inte eller är ogiltigt" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopiering (reflänk/klon) stöds inte eller fungerade inte" -#: gio/gfile.c:3395 +# Flaggan -d, namn delete +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Kan inte hämta attributet %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Kan inte kopiera specialfil" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Ogiltigt värde för symbolisk länk angivet" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Symboliska länkar stöds inte" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Papperskorgen stöds inte" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Filnamn får inte innehålla ”%c”" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Misslyckades med att skapa en temporär katalog för mallen ”%s”: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "volymen har inte implementerat montering" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Inget program är registrerat för hantering av denna fil" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Numreraren är stängd" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Filnumreraren har kvarstående åtgärd" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Filnumreraren är redan stängd" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Kan inte hantera version %d av GFileIcon-kodning" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Felformaterade inmatningsdata för GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Strömmen saknar stöd för query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Sökning stöds inte på strömmen" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Kapning tillåts inte på inmatningsströmmen" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Kapning stöds inte på strömmen" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Ogiltigt värdnamn" @@ -1578,64 +1611,64 @@ msgstr "HTTP-proxysvar för stort" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP-proxyservern stängde oväntat anslutningen." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Fel antal token (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Ingen typ för klassnamnet %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Typen %s implementerar inte GIcon-gränssnittet" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Typen %s är inte klassad" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Felformaterat versionsnummer: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Typen %s implementerar inte from_tokens() på GIcon-gränssnittet" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Kan inte hantera angiven version av ikonkodningen" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Ingen adress angiven" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Längden %u är för lång för adressen" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adress har bitar inställda utanför prefixlängden" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Kunde inte tolka ”%s” som IP-adressmask" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Inte tillräckligt med utrymme för uttagsadress" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Uttagsadressen stöds inte" @@ -1649,7 +1682,7 @@ msgstr "Inmatningsströmmen har inte implementerat läsning" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Strömmen har kvarstående åtgärd" @@ -1665,7 +1698,7 @@ msgstr "Behåll med filen vid flyttning" msgid "“version” takes no arguments" msgstr "”version” tar inga argument" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Användning:" @@ -1673,79 +1706,79 @@ msgstr "Användning:" msgid "Print version information and exit." msgstr "Skriv ut versionsinformation och avsluta." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Kommandon:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Konkatenera filer till standard ut" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Kopiera en eller flera filer" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Visa information om platser" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Starta ett program från en desktop-fil" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Lista innehållet för platser" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Hämta eller sätt hanteraren för en mime-typ" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Skapa kataloger" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Övervaka filer och kataloger efter förändringar" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Montera eller avmontera platserna" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Flytta en eller flera filer" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Öppna filer med standardprogrammet" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Byt namn på en fil" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Ta bort en eller flera filer" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Läs från standard in och spara" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Sätt ett filattribut" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Flytta filer eller kataloger till papperskorgen" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Lista innehållet för platser i ett träd" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Kommandon:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Använd %s för att få detaljerad hjälp.\n" @@ -1755,7 +1788,7 @@ msgid "Error writing to stdout" msgstr "Fel vid skrivning till standard ut" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1778,60 +1811,64 @@ msgstr "" "använder GIO-platser i stället för lokala filer: exempelvis kan du använda\n" "något liknande smb://server/resurs/fil.txt som plats." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Inga platser angivna" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Ingen målkatalog" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Visa förlopp" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Fråga innan överskrivning" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Behåll alla attribut" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Säkerhetskopiera befintliga målfiler" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Följ aldrig symboliska länkar" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Använd standardrättigheter för målet" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Använd standardtidsstämplar för filändring för målet" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Överförde %s av %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "KÄLLA" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "MÅL" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopiera en eller fler filer från KÄLLA till MÅL." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1841,12 +1878,12 @@ msgstr "" "GIO-platser i stället för lokala filer: exempelvis kan du använda något\n" "liknande smb://server/resurs/fil.txt som plats." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Målet %s är inte en katalog" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: skriv över ”%s”? " @@ -1887,52 +1924,52 @@ msgstr "visningsnamn: %s\n" msgid "edit name: %s\n" msgstr "redigeringsnamn: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "namn: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "typ: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "storlek: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "dold\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "lokal sökväg: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix-montering: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Inställningsbara attribut:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Skrivbara namnrymder för attribut:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Visa information om platser." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2489,7 +2526,8 @@ msgstr "" "aktuell katalog)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "KATALOG" @@ -2537,6 +2575,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "C-identifierarnamn som används för den genererade källkoden" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "IDENTIFIERARE" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Mål-C-kompilatorn (standard: CC-miljövariabeln)" @@ -2925,8 +2967,8 @@ msgid "" "Cannot provide per-desktop overrides for localized key “%s” in schema " "“%s” (override file “%s”); ignoring override for this key." msgstr "" -"Det går inte att tillhandahålla åsidosättningar per skrivbord för den " -"lokaliserade nyckeln ”%s” i schemat ”%s” (åsidosättningsfil ”%s”); ignorerar " +"Kan inte tillhandahålla åsidosättningar per skrivbord för den lokaliserade " +"nyckeln ”%s” i schemat ”%s” (åsidosättningsfil ”%s”); ignorerar " "åsidosättning för denna nyckel." #: gio/glib-compile-schemas.c:2002 @@ -2935,9 +2977,9 @@ msgid "" "Cannot provide per-desktop overrides for localized key “%s” in schema " "“%s” (override file “%s”) and --strict was specified; exiting." msgstr "" -"Det går inte att tillhandahålla åsidosättningar per skrivbord för den " -"lokaliserade nyckeln ”%s” i schemat ”%s” (åsidosättningsfil ”%s”) och --" -"strict angavs; avslutar." +"Kan inte tillhandahålla åsidosättningar per skrivbord för den lokaliserade " +"nyckeln ”%s” i schemat ”%s” (åsidosättningsfil ”%s”) och --strict angavs; " +"avslutar." #: gio/glib-compile-schemas.c:2026 #, c-format @@ -3047,124 +3089,124 @@ msgstr "Fel vid hämtning av filsystemsinformation för %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Innefattande montering för filen %s hittades inte" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Kan inte byta namn på rotkatalog" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Fel vid namnbyte av filen %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Kan inte byta namn på filen, filnamnet finns redan" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Ogiltigt filnamn" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Fel vid öppning av filen %s: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Fel vid borttagning av filen %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Fel vid kastande av filen %s: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Kunde inte skapa papperskorgskatalogen %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Kunde inte hitta toppnivåkatalog för att kasta %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Att kasta i papperskorg på systeminterna monteringar stöds inte" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Kunde inte hitta eller skapa papperskorgskatalog %s att slänga %s i" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Kunde inte skapa fil med information om vad som kastats för %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Kunde inte kasta filen %s över filsystemsgränser" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Kunde inte kasta filen %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Kunde inte kasta filen %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Fel vid skapandet av katalogen %s: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Filsystemet saknar stöd för symboliska länkar" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Fel vid skapande av symboliska länken %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Fel vid flyttning av filen %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Kan inte flytta katalog över katalog" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Misslyckades med att skapa säkerhetskopiefil" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Fel vid borttagning av målfil: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Flyttning mellan monteringar stöds inte" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Kunde inte bestämma diskanvändningen för %s: %s" @@ -3186,115 +3228,115 @@ msgstr "Ogiltigt utökat attributnamn" msgid "Error setting extended attribute “%s”: %s" msgstr "Fel vid inställning av utökat attribut ”%s”: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (ogiltig kodning)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Fel vid hämtning av information om filen ”%s”: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Fel vid hämtning av information om filhandtag: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Ogiltig attributtyp (uint32 förväntades)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Ogiltig attributtyp (uint64 förväntades)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Ogiltig attributtyp (bytesträng förväntades)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Kan inte ställa in rättigheter på symboliska länkar" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Fel vid inställning av rättigheter: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Fel vid inställning av ägare: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "symbolisk länk måste vara icke-NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Fel vid inställning av symbolisk länk: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Fel vid inställning av symbolisk länk: filen är inte en symbolisk länk" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Extra nanosekunder %d för UNIX-tidsstämpeln %lld är negativa" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "Extra nanosekunder %d för UNIX-tidsstämpeln %lld överstiger 1 sekund" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX-tidstämpeln %lld ryms inte i 64 bitar" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX-tidstämpeln %lld är utanför intervallet som stöds av Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Filnamnet ”%s” kan inte konverteras till UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Filen ”%s” kan inte öppnas: Windows-fel %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Fel vid inställning av ändrings- eller åtkomsttid för filen ”%s”: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Fel vid inställning av ändrings- eller åtkomsttid: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux-kontext måste vara icke-NULL" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux är inte aktiverat på detta system" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Fel vid inställning av SELinux-kontext: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Inställning av attributet %s stöds inte" @@ -3347,7 +3389,7 @@ msgid "Error truncating file: %s" msgstr "Fel vid kapning av fil: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Fel vid öppning av filen ”%s”: %s" @@ -3369,27 +3411,27 @@ msgstr "Filen blev externt ändrad" msgid "Error removing old file: %s" msgstr "Fel vid borttagning av gammal fil: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Ogiltig GSeekType angavs" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Ogiltig sökbegäran" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Kan inte kapa av GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Storlek för minnesutmatningsström är inte ändringsbar" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Misslyckades med att ändra storlek på minnesutmatningsström" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3397,73 +3439,73 @@ msgstr "" "Den mängd minne som krävs för att behandla skrivningen är större än " "tillgänglig adressrymd" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Begärde sökning innan början av strömmen" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Begärde sökning bortom slutet av strömmen" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "mount har inte implementerat ”unmount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "mount har inte implementerat ”eject”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "mount har inte implementerat ”unmount” eller ”unmount_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "mount har inte implementerat ”eject” eller ”eject_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "mount har inte implementerat ”remount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "mount har inte implementerat estimering av innehållstyp" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "mount har inte implementerat synkron estimering av innehållstyp" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Värdnamnet ”%s” innehåller ”[” men inte ”]”" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Nätverket är inte nåbart" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Värddatorn är inte nåbar" @@ -3491,7 +3533,7 @@ msgstr "Nätverkshanteraren är inte igång" msgid "NetworkManager version too old" msgstr "Nätverkshanterare är för gammal" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Utmatningsström har inte implementerat skrivning" @@ -3504,38 +3546,38 @@ msgstr "Summan av vektorer skickade till %s är för stor" msgid "Source stream is already closed" msgstr "Källströmmen är redan stängd" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Ospecificerat proxyuppslagningsfel" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Fel vid uppslag av ”%s”: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s inte implementerad" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Ogiltig domän" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Resursen på ”%s” finns inte" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Resursen på ”%s” gick inte att dekomprimera" @@ -3553,11 +3595,11 @@ msgstr "Resursen på ”%s” är inte en katalog" msgid "Input stream doesn’t implement seek" msgstr "Inmatningsströmmen har inte implementerat spolning" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Lista sektioner som innehåller resurser i en elf-FIL" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3567,15 +3609,15 @@ msgstr "" "Om SEKTION anges, lista endast resurser i denna sektion\n" "Om SÖKVÄG anges, lista endast matchande resurser" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "FIL [SÖKVÄG]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "SEKTION" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3587,15 +3629,15 @@ msgstr "" "Om SÖKVÄG anges, lista endast matchande resurser\n" "Detaljer inkluderar sektionen, storlek och komprimering" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Extrahera en resursfil till standard ut" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "FIL SÖKVÄG" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3623,7 +3665,7 @@ msgstr "" "Använd ”gresource help KOMMANDO” för detaljerad hjälp.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3638,19 +3680,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " SEKTION Ett (eventuellt) elf-sektionsnamn\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMMANDO (Eventuellt) kommando att förklara\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " FIL En elf-fil (en binär eller ett delat bibliotek)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3658,19 +3700,19 @@ msgstr "" " FIL En elf-fil (en binär eller ett delat bibliotek)\n" " eller en kompilerad resursfil\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[SÖKVÄG]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " SÖKVÄG En (eventuell) resurssökväg (kan vara partiell)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "SÖKVÄG" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " SÖKVÄG En resurssökväg\n" @@ -3901,214 +3943,214 @@ msgstr "Tomt schemanamn angavs\n" msgid "No such key “%s”\n" msgstr "Ingen sådan nyckel ”%s”\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Ogiltigt uttag, inte initierat" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Ogiltigt uttag, initiering misslyckades på grund av: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Uttaget är redan stängt" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1438 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Tidsgräns för in/ut på uttaget överstegs" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "skapar GSocket från fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Kunde inte skapa uttag: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Okänd familj angavs" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Okänt protokoll angavs" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Kan inte använda datagramåtgärder på ett icke-datagram-uttag." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "Kan inte använda datagramåtgärder på ett uttag med en satt tidsgräns." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "kunde inte få lokal adress: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "kunde inte få fjärradress: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "kunde inte lyssna: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Fel vid bindning till adressen %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Fel vid medlemskap i multicast-grupp: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Fel vid lämnande av multicast-grupp: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Inget stöd för källspecifik multicast" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Uttagsfamiljen stöds inte" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "källspecifik är inte en IPv4-adress" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Gränssnittsnamnet är för långt" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Gränssnitt hittades inte: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "Inget stöd för IPv4-källspecifik multicast" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "Inget stöd för IPv6-källspecifik multicast" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Fel vid godkännande av anslutning: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Anslutningsförsök pågår" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Kunde inte få tag på väntande fel: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Fel vid mottagning av data: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Fel vid sändning av data: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Kunde inte stänga ner uttag: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Fel vid stängning av uttag: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Väntar på uttagstillstånd: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Kunde inte skicka meddelande: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Meddelandevektorerna är för stora" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Fel vid sändning av meddelande: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage stöds inte på Windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Fel vid mottagning av meddelande: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Kunde inte läsa uttagets inloggningsuppgifter: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "" "g_socket_get_credentials har inte implementerats för detta operativsystem" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Kunde inte ansluta till proxyservern %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Kunde inte ansluta till %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Kunde inte ansluta: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "Att skicka via proxy över en icke-TCP-anslutning stöds inte." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Proxyprotokollet ”%s” stöds inte." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Lyssnaren är redan stängd" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Tillagt uttag är stängt" @@ -4199,94 +4241,94 @@ msgstr "SOCKSv5-proxyservern saknar stöd för angiven adresstyp." msgid "Unknown SOCKSv5 proxy error." msgstr "Okänt fel i SOCKSv5-proxyserver." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Misslyckades med att skapa rör för kommunikation med barnprocess (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Rör stöds inte på denna plattform" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Kan inte hantera version %d av GThemedIcon-kodning" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Inga giltiga adresser hittades" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Fel vid omvänt uppslag av ”%s”: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "Fel vid tolkning av DNS %s-post: felformulerat DNS-paket" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Inga DNS-poster av den begärda typen för ”%s”" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Kan för tillfället inte slå upp ”%s”" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Fel vid uppslag av ”%s”" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Felformulerat DNS-paket" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Misslyckades med att tolka DNS-svar för ”%s”: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Ingen PEM-kodad privat nyckel hittades" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Kan inte dekryptera PEM-kodad privat nyckel" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Kunde inte tolka PEM-kodad privat nyckel" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Inget PEM-kodat certifikat hittades" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Kunde inte tolka PEM-kodat certifikat" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Den aktuella TLS-bakänden stöder inte PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "Denna GTlsBackend stöder inte skapande av PKCS #11-certifikat" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4296,7 +4338,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4304,137 +4346,148 @@ msgstr "" "Flera felaktiga lösenord har angivits och din åtkomst kommer att låsas efter " "ytterligare misslyckanden." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Det angivna lösenordet är felaktigt." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Sändning av FD stöds inte" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Förväntade 1 kontrollmeddelande, fick %d" msgstr[1] "Förväntade 1 kontrollmeddelande, fick %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Oväntad typ av underordnade data" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Förväntade en fd, men fick %d\n" msgstr[1] "Förväntade en fd, men fick %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Tog emot ogiltig fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Mottagning av FD stöds inte" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Fel vid sändning av inloggningsuppgifter: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Fel vid kontroll om SO_PASSCRED har aktiverats för uttaget: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Fel vid aktivering av SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Förväntade att läsa ett enda byte för mottagning av inloggningsuppgifter men " "läste noll byte" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Förväntade inte kontrollmeddelande, men fick %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Fel vid inaktivering av SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Fel vid läsning från filhandtag: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Fel vid stängning av filhandtag: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Filsystemsrot" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Fel vid skrivning till filhandtag: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Abstrakta UNIX-domänuttagsadresser stöds inte på detta system" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "volymen har inte implementerat eject" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "volymen har inte implementerat eject eller eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Programmet ”%s” i programobjektet har inga verb" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "Programmet ”%s” och hanteraren ”%s” i programobjektet har inga verb" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Fel vid läsning från handtag: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Fel vid stängning av handtag: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Fel vid skrivning till handtag: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Slut på minne" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Internt fel: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Behöver mer inmatning" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Ogiltiga komprimerade data" @@ -4462,149 +4515,287 @@ msgstr "Kör en dbustjänst" msgid "Wrong args\n" msgstr "Fel argument\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Misslyckades med att öppna ”%s”: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Fel: Kunde inte skriva hela utmatningen: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Fel: Misslyckades med att byta namn på ”%s” till ”%s”: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Inkludera kataloger i GIR-sökväg" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Utmatningsfil" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Delat bibliotek" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Visa felsökningsmeddelanden" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Visa utförliga meddelanden" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Visa programmets versionsnummer och avsluta" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Fel vid tolkning av argument: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Ange exakt en indatafil" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Fel vid tolkning av filen ”%s”: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Misslyckades med att bygga typelib för modulen ”%s”" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Ogiltig typelib för modulen ”%s”: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Visa all tillgänglig information" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Misslyckades med att tolka: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Inga indatafiler" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Misslyckades med att läsa ”%s”: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Misslyckades med att skapa typelib ”%s”: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Misslyckades med att läsa in typelib: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Varning: %u moduler har utelämnats" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Typelib-version att inspektera" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "VERSION" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Lista över delade bibliotek som typelib kräver" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Lista andra typelib-bibliotek som inspekterad typelib kräver" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "Typelib att inspektera" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "NAMNRYMD" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Inspektera GI-typelib" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Misslyckades med att tolka kommandoradsflaggor: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Ange exakt en namnrymd" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Ange --print-shlibs, --print-typelibs eller båda" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Oväntat attribut ”%s” för elementet ”%s”" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Attributet ”%s” för elementet ”%s” hittades inte" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Oväntad tagg ”%s”, taggen ”%s” förväntades" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Oväntad tagg ”%s” inom ”%s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Ogiltigt datum/tid ”%s” i bokmärkesfil" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Ingen giltig bokmärkesfil hittades i datakataloger" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Ett bokmärke för URI ”%s” finns redan" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Inget bokmärke hittades för URI ”%s”" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Ingen Mime-typ definierad i bokmärket för URI ”%s”" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Ingen privat flagga har definierats i bokmärket för URI ”%s”" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Inga grupper inställda i bokmärket för URI ”%s”" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Inget program med namnet ”%s” registrerade ett bokmärke för ”%s”" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Misslyckades med att expandera exec-raden ”%s” med URI ”%s”" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Tecken som ej går att uttrycka i konverteringsindata" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Ofullständig teckensekvens vid slutet av indata" # fallback syftar på en sträng -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Kan inte konvertera reservsträngen ”%s” till kodningen ”%s”" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Inbäddad NUL-byte i konverteringsindata" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Inbäddad NUL-byte i konverteringsutdata" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "URI:n ”%s” är ingen absolut URI som använder ”file”-schemat" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI:n ”%s” är ogiltig" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Värdnamnet i URI:n ”%s” är ogiltigt" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI:n ”%s” innehåller ogiltigt kodade tecken" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Sökvägen ”%s” är ingen absolut sökväg" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %e %b %Y %H:%M:%S" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%y-%m-%d" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4625,62 +4816,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Januari" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Februari" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Mars" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "April" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Maj" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Juni" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Juli" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Augusti" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "September" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Oktober" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "November" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "December" @@ -4702,132 +4893,132 @@ msgstr "December" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Jan" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Feb" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Apr" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "Maj" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Jun" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Jul" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Aug" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Sep" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Okt" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Nov" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Dec" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Måndag" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Tisdag" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Onsdag" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Torsdag" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Fredag" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Lördag" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Söndag" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Mån" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Tis" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Ons" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Tor" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Fre" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Lör" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Sön" @@ -4849,62 +5040,62 @@ msgstr "Sön" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "januari" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "februari" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "mars" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "april" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "maj" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "juni" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "juli" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "augusti" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "september" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "oktober" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "november" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "december" @@ -4926,62 +5117,62 @@ msgstr "december" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "jan" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "feb" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "apr" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "maj" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "jun" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "jul" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "aug" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "sep" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "okt" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "nov" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "dec" @@ -4989,7 +5180,7 @@ msgstr "dec" # Enligt ICU-locale: https://www.localeplanet.com/icu/sv/index.html # Glibc är i stället tom: https://lh.2xlibre.net/locale/sv_SE/ #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "fm" @@ -4997,127 +5188,133 @@ msgstr "fm" # Enligt ICU-locale: https://www.localeplanet.com/icu/sv/index.html # Glibc är i stället tom: https://lh.2xlibre.net/locale/sv_SE/ #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "em" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Fel vid öppning av katalogen ”%s”: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Kunde inte allokera %lu byte för att läsa filen ”%s”" -msgstr[1] "Kunde inte allokera %lu byte för att läsa filen ”%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "Kunde inte allokera %s för att läsa filen ”%s”" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Fel vid läsning av filen ”%s”: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Filen ”%s” är för stor" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Misslyckades med att läsa från filen ”%s”: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Misslyckades med att öppna filen ”%s”: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" "Misslyckades med att få tag på attributen på filen ”%s”: fstat() " "misslyckades: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Misslyckades med att öppna filen ”%s”: fdopen() misslyckades: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "Misslyckades med att byta namn på filen ”%s” till ”%s”: g_rename() " "misslyckades: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Misslyckades med att skriva filen ”%s”: ftruncate() misslyckades: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Misslyckades med att skriva filen ”%s”: write() misslyckades: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Misslyckades med att skriva filen ”%s”: fsync() misslyckades: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Misslyckades med att skapa filen ”%s”: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Befintliga filen ”%s” kunde inte tas bort: g_unlink() misslyckades: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Mallen ”%s” är ogiltig, den får inte innehålla ett ”%s”" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Mallen ”%s” innehåller inte XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Misslyckades med att läsa den symboliska länken ”%s”: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Kunde inte öppna konverteraren från ”%s” till ”%s”: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Kan inte göra en rå läsning i g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Överblivna okonverterade data i läsbufferten" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanalen slutar med ett ofullständigt tecken" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Kan inte göra en rå läsning i g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Giltig nyckelfil kunde inte hittas i sökkatalogerna" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Inte en vanlig fil" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5125,43 +5322,43 @@ msgstr "" "Nyckelfilen innehåller raden ”%s” som inte är ett nyckel-värde-par, grupp " "eller kommentar" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Ogiltigt gruppnamn: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Nyckelfilen börjar inte med en grupp" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Ogiltigt nyckelnamn: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Nyckelfilen innehåller kodningen ”%s” som inte stöds" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Nyckelfilen har inte gruppen ”%s”" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Nyckelfilen har inte nyckeln ”%s” i gruppen ”%s”" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Nyckelfilen innehåller nyckeln ”%s” med värdet ”%s” som inte är UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." @@ -5169,7 +5366,7 @@ msgstr "" "Nyckelfilen innehåller nyckeln ”%s” som innehåller ett värde som inte kan " "tolkas." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5178,36 +5375,36 @@ msgstr "" "Nyckelfilen innehåller nyckeln ”%s” i gruppen ”%s” vilken innehåller ett " "värde som inte kan tolkas." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Nyckeln ”%s” i gruppen ”%s” innehåller värdet ”%s” där %s förväntades" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Nyckelfilen innehåller kontrolltecken i slutet på en rad" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Nyckelfilen innehåller ogiltiga kontrollsekvensen ”%s”" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Värdet ”%s” kan inte tolkas som ett tal." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Heltalsvärdet ”%s” är utanför intervallet" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Värdet ”%s” kan inte tolkas som ett flyttal." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Värdet ”%s” kan inte tolkas som ett booleskt värde." @@ -5229,32 +5426,32 @@ msgstr "Misslyckades med att mappa %s%s%s%s: mmap() misslyckades: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Misslyckades med att öppna filen ”%s”: open() misslyckades: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Fel på rad %d tecken %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Ogiltig UTF-8-kodad text i namnet — inte giltig ”%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "”%s” är inte ett giltigt namn" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "”%s” är inte ett giltigt namn: ”%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Fel på rad %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5263,7 +5460,7 @@ msgstr "" "Misslyckades med att tolka ”%-.*s”, som skulle ha varit en siffra inuti en " "teckenreferens (ê till exempel) — siffran är kanske för stor" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5272,24 +5469,24 @@ msgstr "" "Teckenreferensen slutade inte med ett semikolon. Troligtvis använde du ett &-" "tecken utan att avse att starta en entitet. Skriv om &-tecknet som &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Teckenreferensen ”%-.*s” kodar inte ett tillåtet tecken" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Tom entitet ”&;” hittades, giltiga entiteter är: & " < > " "'" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Entitetsnamnet ”%-.*s” är okänt" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5297,11 +5494,11 @@ msgstr "" "Entiteten slutade inte med ett semikolon. Troligtvis använde du ett &-tecken " "utan att avse att starta en entitet. Skriv om &-tecknet som &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Dokumentet måste börja med ett element (exempelvis )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5310,7 +5507,7 @@ msgstr "" "”%s” är inte ett giltigt tecken efter ett ”<”-tecken. Det får inte inleda " "ett elementnamn" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5319,12 +5516,12 @@ msgstr "" "Konstigt tecken ”%s”, ett ”>”-tecken förväntades för att avsluta tomma " "elementtaggen ”%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "För många attribut i elementet ”%s”" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5332,7 +5529,7 @@ msgstr "" "Konstigt tecken ”%s”, ett ”=” förväntades efter attributnamnet ”%s” till " "elementet ”%s”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5343,7 +5540,7 @@ msgstr "" "starttaggen för elementet ”%s”, eller möjligtvis ett attribut. Du kanske " "använde ett ogiltigt tecken i ett attributnamn" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5352,7 +5549,7 @@ msgstr "" "Konstigt tecken ”%s”, ett startcitattecken förväntades efter likhetstecknet " "när värdet av attributet ”%s” till elementet ”%s” tilldelades" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Elementet ”%s” stängdes, inget element är öppet för tillfället" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" "Elementet ”%s” stängdes, men det element som är öppet för tillfället är ”%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Dokumentet var tomt eller innehöll endast tomrum" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokumentet tog oväntat slut efter ett öppningsklammer ”<”" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5398,7 +5595,7 @@ msgstr "" "Dokumentet tog oväntat slut då element fortfarande var öppna. ”%s” var det " "senast öppnade elementet" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5407,19 +5604,19 @@ msgstr "" "Dokumentet tog oväntat slut, en stängningsklammer förväntades för att " "avsluta taggen <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Dokumentet tog oväntat slut inuti ett elementnamn" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokumentet tog oväntat slut inuti ett attributnamn" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokumentet tog oväntat slut inuti en elementöppnande tagg." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5427,259 +5624,259 @@ msgstr "" "Dokumentet tog oväntat slut efter likhetstecknet som följde ett " "attributnamn. Inget attributvärde" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokumentet tog oväntat slut inuti ett attributvärde" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokumentet tog oväntat slut inuti stängningstaggen för elementet ”%s”" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Dokumentet tog oväntat slut inuti stängningstaggen för ett oöppnat element" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokumentet tog oväntat slut inuti en kommentar eller behandlingsinstruktion" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[FLAGGA…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Hjälpflaggor:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Visa hjälpflaggor" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Visa alla hjälpflaggor" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Programflaggor:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Flaggor:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Kan inte tolka heltalsvärdet ”%s” för %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Heltalsvärdet ”%s” för %s är utanför intervallet" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Kan inte tolka dubbelvärdet ”%s” för %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Dubbelvärdet ”%s” för %s är utanför intervallet" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Fel vid tolkning av flaggan %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Argument saknas för %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Okänd flagga %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "skadat objekt" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "slut på minne" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "internt fel" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "mönstret innehåller objekt som inte stöds för delvis matchning" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "bakreferenser som villkor stöds inte för delvis matchning" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "rekursionsgräns nådd" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "felaktig offset" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "rekursionsloop" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "matchningsläge som inte kompilerats för JIT efterfrågas" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "okänt fel" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ på slutet av mönster" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c på slutet av mönster" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "okänt tecken efter \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "tal är inte i ordning i {}-kvantifierare" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "tal för stort i {}-kvantifierare" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "saknar avslutande ] för teckenklass" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "ogiltig escape-sekvens i teckenklass" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "intervall är inte i ordning i teckenklass" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "ingenting att upprepa" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "okänt tecken efter (? eller (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX-namngivna klasser stöds endast inom en klass" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX-sorteringselement stöds inte" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "saknar avslutande )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "referens till icke-existerande undermönster" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "saknar ) efter kommentar" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "reguljärt uttryck är för stort" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "felformulerat tal eller namn efter (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind-assertion är inte av fast längd" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "villkorsgrupp innehåller fler än två grenar" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "assertion förväntades efter (?(" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "en numrerad referens får inte vara noll" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "okänt POSIX-klassnamn" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" -msgstr "teckenvärde i \\x{…}-sekvens är för stort" +msgstr "teckenvärde i \\x{...}-sekvens är för stort" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C tillåts inte i lookbehind-assertion" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "saknar avslutstecken i undermönstrets namn" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "två namngivna undermönster har samma namn" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "felformulerad \\P eller \\p-sekvens" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "okänt egenskapsnamn efter \\P eller \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "undermönstrets namn är för långt (maximalt 32 tecken)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "för många namngivna undermönster (maximalt 10 000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "oktalt värde är större än \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE-grupp innehåller fler än en gren" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "inkonsistenta NEWLINE-flaggor" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5687,232 +5884,232 @@ msgstr "" "\\g följs inte av ett namn inom klammerparentes, vinkelparentes eller " "citattecken eller siffra, eller en enkel siffra" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "ett argument tillåts inte för (*ACCEPT), (*FAIL) eller (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) kändes inte igen" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "tal är för stort" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "saknar undermönsternamn efter (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "olika namn för undermönster för samma siffra är inte tillåtet" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) måste ha ett argument" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c måste följas av ett ASCII-tecken" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k följs inte av ett namn inom klammerparentes, vinkelparentes eller " "citattecken" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N är saknar stöd i en klass" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "namn är alltför långt i (*MARK), (*PRUNE), (*SKIP) eller (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "överflöde i kod" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "okänt tecken efter (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "fyllde över kompileringsutrymme" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "tidigare kontrollerad refererande undermönster hittades inte" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Fel vid matchning av reguljära uttrycket %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE-biblioteket är byggt utan stöd för UTF8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE-biblioteket är byggt med inkompatibla alternativ" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Fel vid kompilering av reguljära uttrycket ”%s” vid tecknet %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "hexadecimal siffra eller ”}” förväntades" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "hexadecimal siffra förväntades" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "saknar ”<” i symbolisk referens" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "oavslutad symbolisk referens" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "symbolisk referens med noll-längd" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "siffra förväntades" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "otillåten symbolisk referens" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "felplacerad avslutande ”\\”" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "okänd escape-sekvens" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Fel vid tolkning av ersättningstexten ”%s” vid tecknet %lu: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Citerad text börjar inte med citattecken" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Ensamt citattecken på kommandoraden eller annan skalciterad text" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Texten slutade efter ett ”\\”-tecken (texten var ”%s”)." -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Texten slutade innan matchande citattecken hittades för %c (texten var ”%s”)." -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Texten var tom (eller innehöll bara tomrum)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Misslyckades med att läsa data från barnprocess (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Oväntat fel vid läsning av data från en barnprocess (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Oväntat fel i waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Barnprocess avslutades med kod %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Barnprocess dödat av signal %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Barnprocess stoppad av signal %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Barnprocess avslutades onormalt" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Misslyckades med att läsa från rör till barn (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Misslyckades med att starta barnprocessen ”%s” (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Misslyckades med att grena (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Misslyckades med att byta till katalogen ”%s” (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Misslyckades med att köra barnprocessen ”%s” (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Misslyckades med att öppna fil för att mappa om filhandtag (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Misslyckades med att duplicera filhandtag för barnprocess (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Misslyckades med att skapa barnprocess (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Misslyckades med att stänga filhandtag för barnprocess (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Okänt fel vid körning av barnprocessen ”%s”" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5971,78 +6168,78 @@ msgstr "" "Oväntat fel i g_io_channel_win32_poll() vid inläsning av data från en " "barnprocess" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Tom sträng är inte ett tal" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "”%s” är inte ett tal med tecken" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Talet ”%s” är utanför gränserna [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "”%s” är inte ett teckenlöst tal" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Ogiltig %-kodning i URI" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Otillåtet tecken i URI" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Tecken som inte är UTF-8 i URI" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Ogiltig IPv6-adress ”%.*s” i URI" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Otillåtet kodad IP-adress ”%.*s” i URI" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Otillåtet internationaliserat värdnamn ”%.*s” i URI" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Kunde inte tolka port ”%.*s” i URI" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Port ”%.*s” i URI är utanför intervallet" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI ”%s” är inte en absolut URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI ”%s” har ingen värdkomponent" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI är inte absolut, och ingen bas-URI angavs" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Saknar ”=” och parametervärde" @@ -6123,65 +6320,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6286,6 +6483,53 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "Kunde inte allokera %" +#~ msgstr[1] "Kunde inte allokera %" + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "METHOD_RETURN-meddelande: Rubrikfältet REPLY_SERIAL saknas eller är " +#~ "ogiltigt" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "GApplication options" #~ msgstr "GApplication-alternativ" @@ -6457,9 +6701,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[ARGUMENT…]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "Misslyckades med att skapa temporärfil: %s" - #~ msgid "" #~ "Message has %d file descriptors but the header field indicates %d file " #~ "descriptors" diff --git a/po/tr.po b/po/tr.po index ce8f351..fc886cc 100644 --- a/po/tr.po +++ b/po/tr.po @@ -1,6 +1,6 @@ # Turkish translation of Glib. # Copyright (C) 2001-2003, 2005, 2007, 2008 Free Software Foundation, Inc. -# Copyright (C) 2009-2023 glib's COPYRIGHT HOLDER +# Copyright (C) 2009-2024 glib's COPYRIGHT HOLDER # This file is distributed under the same license as the glib package. # # KEMAL YILMAZ , 2001. @@ -11,23 +11,23 @@ # Kaan Özdinçer , 2015. # Muhammet Kara , 2011, 2014, 2015, 2016. # Serdar Sağlam , 2019. -# Sabri Ünal , 2023. -# Emin Tufan Çetin , 2017-2023. +# Sabri Ünal , 2023, 2024. +# Emin Tufan Çetin , 2017-2024. # msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-18 01:28+0000\n" -"PO-Revision-Date: 2023-09-28 01:19+0300\n" -"Last-Translator: Sabri Ünal \n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-03 08:00+0300\n" +"Last-Translator: Emin Tufan Çetin \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.3.2\n" +"X-Generator: Poedit 3.4.2\n" "X-POOTLE-MTIME: 1433280446.000000\n" #: gio/gappinfo.c:339 @@ -49,36 +49,40 @@ msgstr "‘%s’ içerik türü için öntanımlı uygulama bulunamadı" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "‘%s’ URI Şeması için öntanımlı uygulama bulunamadı" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication Seçenekleri:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "GApplication seçeneklerini göster" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "GApplication hizmet kipi girin (D-Bus hizmet dosyalarından kullan)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Uygulama kimliğini çiğne" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Uygulama sürümünü yazdır" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Çalışan örneği değiştir" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Yardımı yazdır" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[KOMUT]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Sürüm yazdır" @@ -132,7 +136,7 @@ msgid "APPID" msgstr "APPID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "KOMUT" @@ -144,9 +148,13 @@ msgstr "Ayrıntılı yardım yazdırmak için komut" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "D-Bus biçiminde uygulama tanımlayıcı (örneğin: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "DOSYA" @@ -170,7 +178,7 @@ msgstr "PARAMETRE" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "GVariant biçiminde başlatma eylemi için isteğe bağlı parametre" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -184,12 +192,12 @@ msgstr "" msgid "Usage:\n" msgstr "Kullanım:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Argümanlar:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ARGÜMANLAR…]" @@ -282,78 +290,78 @@ msgstr "" "bilinmeyen komut: %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "%s için çok büyük sayaç değeri geçildi" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Taban akış üzerinde arama desteklenmez" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "GBufferedInputStreamsonu kesilemiyor" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Akış zaten kapalı" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Taban akış üzerinde sonunun kesilmesi desteklenmiyor" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "İşlem iptal edildi" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Geçersiz nesne, ilklendirilmemiş" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "Girdide tamamlanmamış çokbaytlı dizi" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Hedefte yeterli alan yok" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Dönüşüm girdisinde geçersiz bayt dizisi" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Dönüşüm sırasında hata oluştu: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "İptal edilebilir başlatma desteklenmiyor" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "“%s” karakter kümesinden “%s” karakter kümesine dönüşüm desteklenmiyor" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "“%s”den “%s”e dönüştürücü açılamıyor" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s türü" @@ -367,41 +375,41 @@ msgstr "Bilinmeyen tür" msgid "%s filetype" msgstr "%s dosya türü" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials geçersiz veri içeriyor" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "Bu işletim sisteminde GCredentials sağlanmamış" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Platformunuz için GCredentials desteği yok" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials bu işletim sisteminde süreç kimliği içermez" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Bu işletim sisteminde kimlik sızdırma olanaksızdır" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Beklenmeyen erken akış-sonu" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "“%2$s” adres girdisinde desteklenmeyen anahtar “%1$s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "“%s” adres girdisinde anlamsız anahtar/değer çifti birleşimi" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -409,28 +417,28 @@ msgid "" msgstr "" "“%s” adresi geçersiz (tam bir yol, dir, tmpdir veya soyut anahtarlar gerekir)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "“%s” adresinde hata — “%s” özniteliği hatalı oluşturulmuş" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "“%2$s” adresi için bilinmeyen ya da desteklenmeyen aktarım “%1$s”" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Adres ögesi “%s” iki nokta üst üste (:) içermez" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "“%s” adres ögesindeki aktarım adı boş olmamalı" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -439,7 +447,7 @@ msgstr "" "“%3$s” adres ögesi içindeki, Anahtar/Değer çifti %1$d, “%2$s” eşittir imi " "içermiyor" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -447,7 +455,7 @@ msgstr "" "“%3$s” adres ögesi içindeki, Anahtar/Değer çifti %1$d, “%2$s” boş anahtar " "olmamalıdır" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -456,7 +464,7 @@ msgstr "" "“%3$s” adres ögesindeki, Anahtar/Değer çifti %1$d, “%2$s” içinde ters kaçış " "tuşu veya değeri hatası" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -465,78 +473,78 @@ msgstr "" "“%s” adresinde hata — unix aktarımı, “path” veya “abstract” anahtarlarından " "bir tanesinin kesinlikle ayarlanmış olmasını gerektirir" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "“%s” adresinde hata — host özniteliği eksik ya da hatalı oluşturulmuş" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "“%s” adresinde hata — bağlantı noktası özniteliği eksik ya da hatalı " "oluşturulmuş" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "“%s” adresinde hata — noncefile özniteliği eksik ya da hatalı oluşturulmuş" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Kendiliğinden başlatmada hata: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Tek seferlik dosya “%s” açılırken hata: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Tek seferlik dosya “%s” okunurken hata: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "Tek seferlik dosya “%s” okunurken hata, beklenen 16 bayt, alınan %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "“%s” tek seferlik dosyasının akış için içeriklerini yazmada hata:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Verilen adres boş" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "AT_SECURE belirtildiğinde ileti veri yolu oluşturulamaz" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "machine-id olmadan ileti veri yolu oluşturulamıyor: " -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "X11 $DISPLAY olmadan D-BUS kendiliğinden başlatılamaz" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "“%s” komut satırı oluşturulurken hata: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Oturum veri yolu adresi saptanamıyor (bu işletim sistemi için uygulanmadı)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -545,7 +553,7 @@ msgstr "" "DBUS_STARTER_BUS_TYPE ortam değişkeninden veri yolu adresi saptanamıyor — " "bilinmeyen değer “%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -553,20 +561,20 @@ msgstr "" "DBUS_STARTER_BUS_TYPE ortam değişkenine değer atanmadığından dolayı veri " "yolu adresi belirlenemiyor" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" -msgstr "Bilinmeyen veriyolu türü %d" +msgstr "Bilinmeyen veri yolu türü %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Satır okunmaya çalışılırken beklenmeyen içerik eksikliği" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Satır okunmaya çalışılırken (güvenli) beklenmeyen içerik eksikliği" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -574,15 +582,15 @@ msgstr "" "Tüm olası kimlik doğrulama yöntemleri tükendi (denenen: %s) (kullanılabilir: " "%s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Bayt okunmaya çalışılırken beklenmeyen içerik eksikliği" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Kullanıcı kimlikleri eş ve sunucu için aynı olmalıdır" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "GDBusAuthObserver::authorize-authenticated-peer yolu ile iptal edildi" @@ -604,20 +612,20 @@ msgstr "" msgid "Error creating directory “%s”: %s" msgstr "“%s” dizini oluşturulurken hata: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "İşlem desteklenmiyor" #: gio/gdbusauthmechanismsha1.c:411 #, c-format msgid "Error opening keyring “%s” for reading: " -msgstr "Okumak için “%s” anahtarlığı açılırken hata: " +msgstr "“%s” anahtarlığı okumak için açılırken hata: " #: gio/gdbusauthmechanismsha1.c:434 gio/gdbusauthmechanismsha1.c:775 #, c-format @@ -668,22 +676,22 @@ msgstr "“%s” kilit dosyasının bağlantısı kaldırılırken hata: %s" #: gio/gdbusauthmechanismsha1.c:742 #, c-format msgid "Error opening keyring “%s” for writing: " -msgstr "“%s” anahtarlığını yazma için açarken hata: " +msgstr "“%s” anahtarlığı yazma için açılırken hata: " #: gio/gdbusauthmechanismsha1.c:936 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Ayrıca, “%s” için kilit açılamadı: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "Bağlantı kapalı" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Zaman aşımı gerçekleşti" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" @@ -772,59 +780,72 @@ msgstr "%s için bir alt ağaç zaten dışa aktarılmış" msgid "Object does not exist at path “%s”" msgstr "Nesne, “%s” yolunda yok" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"%s iletisi: %s başlık alanı geçersiz; ‘%s’ türünde bir değer bekleniyor" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s iletisi: %s başlık alanı eksik veya geçersiz" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s iletisi: INVALID başlık alanı sağlandı" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"%s iletisi: PATH başlık alanı, ayrılmış olan /org/freedesktop/DBus/Local " +"değerini kullanıyor" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "%s iletisi: INTERFACE başlık alanı geçerli bir arayüz içermiyor" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"%s iletisi: INTERFACE başlık alanı, ayrılmış olan org.freedesktop.DBus.Local " +"değerini kullanıyor" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s iletisi: MEMBER başlık alanı geçerli bir üye adı içermiyor" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "%s iletisi: ERROR_NAME başlık alanı geçerli bir hata adı içermiyor" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "tür GEÇERSİZ" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"METHOD_CALL iletisi: PATH ya da MEMBER başlık alanı eksik veya geçersiz" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "METHOD_RETURN iletisi: REPLY_SERIAL başlık alanı eksik veya geçersiz" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"ERROR iletisi: REPLY_SERIAL ya da ERROR_NAME başlık alanı eksik veya geçersiz" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"SIGNAL iletisi: PATH, INTERFACE ya da MEMBER başlık alanı eksik veya geçersiz" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"SIGNAL iletisi: PATH başlık alanı, ayrılmış olan /org/freedesktop/DBus/Local " -"değerini kullanıyor" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"SIGNAL iletisi: INTERFACE başlık alanı, ayrılmış olan org.freedesktop.DBus." -"Local değerini kullanıyor" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "%lu bayt okumak istendi ancak yalnızca %lu var" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "“%s” dizgesinden sonra NUL baytı beklendi, ama %d baytı bulundu" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -833,21 +854,21 @@ msgstr "" "Geçerli bir UTF-8 dizgesi beklendi ama %d bayt konumunda geçersiz baytlar " "bulundu (dizge uzunluğu %d). Bu noktaya kadar geçerli olan dizge şudur: “%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Değer çok derine yuvalanmış" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Ayrıştırılan değer “%s”, geçerli bir D-Bus nesne yolu değil" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Ayrıştırılan değer “%s”, geçerli bir D-Bus imzası değil" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -857,7 +878,7 @@ msgstr[0] "" "%u bayt uzunluğunda dizi ile karşılaşıldı. Olabilecek en çok uzunluk 2<<26 " "bayt (64 MiB)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -866,23 +887,23 @@ msgstr "" "“a%c” türünde dizi ile karşılaşıldı, birden çok %u bayt uzunluğu " "beklenmektedir ancak %u bayt uzunluk bulundu" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "D-Bus’ta boş yapılara (demetler) izin verilmez" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Varyant için ayrıştırılmış “%s” değeri geçeriz bir D-Bus imzasıdır" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "GVariant, D-Bus tel biçiminden “%s” dizge türüyle geri dönüştürülürken hata" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -891,57 +912,57 @@ msgstr "" "Geçersiz endian değeri. 0x6c (“l”) veya 0x42 (“B”) bekleniyordu ancak 0x%02x " "değeri bulundu" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "Geçersiz önemli iletişim kuralı sürümü. 1 beklendi, %d bulundu" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "İmza başlığı bulundu, ancak tür imzası değil" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "“%s” imzalı bir imza başlığı bulundu ama ileti gövdesi boş" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Ayrıştırılan değer “%s” geçerli bir D-Bus imzası değil (gövde için)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "İletide imza başlığı yok ancak ileti gövdesi %u bayt" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "İleti geri dönüştürülemiyor: " -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "GVariant, D-Bus tel biçimine “%s” dizge türüyle dönüştürülürken hata" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "İletideki dosya açıklayıcı sayısı (%d) başlık alanından (%d) farklı" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "İleti dönüştürülemiyor: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "İleti gövdesi “%s” imzasına sahip ancak imza başlığı yok" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -949,17 +970,17 @@ msgid "" msgstr "" "İleti gövdesi “%s” tür imzasına sahip ancak başlık alanındaki imza “%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "İleti gövdesi boş, ancak başlık alanındaki imza “(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "“%s” türünden bir gövdeyle dönüş hatası" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Boş gövdeyle dönüş hatası" @@ -979,22 +1000,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Donanım profili alınamıyor: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "%s ya da %s yüklenemedi: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "%s için StartServiceByName çağrısında hata: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "StartServiceByName %d yönteminden beklenmeyen yanıt (\"%s\")" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1003,25 +1024,25 @@ msgstr "" "Yöntem çağrılamıyor; vekil sunucu, sahibi olmayan bilindik %s adı için ve " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START bayrağı ile oluşturuldu" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Soyut ad alanı desteklenmiyor" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Bir sunucu oluşturulurken nonce dosyası belirtilemez" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "“%s” konumundaki tek seferlik dosyaya yazma hatası: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "“%s” dizgesi, geçerli bir D-Bus GUID değil" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "Desteklenmeyen aktarım “%s” üzerinde dinlenemiyor" @@ -1074,16 +1095,20 @@ msgstr "Hata: %s geçerli bir nesne yolu değil\n" #: gio/gdbus-tool.c:405 msgid "Connect to the system bus" -msgstr "Sistem veriyoluna bağlan" +msgstr "Sistem veri yoluna bağlan" #: gio/gdbus-tool.c:406 msgid "Connect to the session bus" -msgstr "Oturum veriyoluna bağlan" +msgstr "Oturum veri yoluna bağlan" #: gio/gdbus-tool.c:407 msgid "Connect to given D-Bus address" msgstr "Verilen D-Bus adresine bağlan" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "ADRES" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Bağlantı Uç Noktası Seçenekleri:" @@ -1140,7 +1165,7 @@ msgstr "Bağlanırken hata: %s\n" #: gio/gdbus-tool.c:705 #, c-format msgid "Error: %s is not a valid unique bus name.\n" -msgstr "Hata: %s geçerli bir özgün veriyolu adı değil\n" +msgstr "Hata: %s geçerli bir özgün veri yolu adı değil\n" #: gio/gdbus-tool.c:724 gio/gdbus-tool.c:1045 gio/gdbus-tool.c:1879 msgid "Error: Object path is not specified\n" @@ -1310,71 +1335,72 @@ msgstr "Hata: %s geçerli bilinen bir veri yolu adı değil.\n" msgid "Not authorized to change debug settings" msgstr "Hata ayıklama ayarlarını değiştirmeye yetkili değil" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Adlandırılmamış" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "Desktop dosyası Exec alanı belirtmemiş" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Uygulama için gerekli uçbirim bulunamadı" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "‘%s’ programı $PATH içinde bulunamadı" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Kullanıcı uygulaması yapılandırma klasörü %s oluşturulamıyor: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Kullanıcı MIME yapılandırma klasörü %s oluşturulamıyor: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "Uygulama bilgisinde tanımlayıcı eksik" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Kullanıcı masaüstü dosyası %s oluşturulamıyor" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "%s için özel tanım" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "sürücü çıkartmayı uygulamıyor" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "sürücü eject veya eject_with_operation uygulamıyor" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "sürücü ortam için yoklamayı uygulamıyor" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "sürücü start uygulamıyor" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "sürücü stop uygulamıyor" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS arka yüzü, TLS bağlanım geri alımı gerçeklemiyor" @@ -1387,27 +1413,27 @@ msgstr "TLS desteği kullanılabilir değil" msgid "DTLS support is not available" msgstr "DTLS desteği kullanılabilir değil" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "GEmblem kodlamasının %d sürümü işlenemiyor" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "GEmblem kodlaması içerisinde bozuk jeton sayısı (%d)" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "GEmblemedIcon kodlamasının %d sürümü işlenemiyor" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "GEmblemedIcon kodlaması içerisinde bozuk jeton sayısı (%d)" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "GEmblemedIcon için bir Gemblem beklendi" @@ -1415,131 +1441,136 @@ msgstr "GEmblemedIcon için bir Gemblem beklendi" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Bağlama yok" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Dizin üzerine kopyalanamıyor" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Dizin dizin üzerine kopyalanamıyor" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Hedef dosya var" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Dizin iç içe kopyalanamıyor" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Dosya kopyalama kapsamı desteklenmiyor" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Dosya uç uca eklenirken hata: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "Splice desteklenmiyor" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "Bağlı sistemler arasında kopyalama (referans bağlantı/çoğaltmak) " "desteklenmiyor" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopyalama desteklenmiyor ya da geçersiz" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopyalama (bağlama/klonlama) destenlenmiyor ya da çalışmadı" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "%s özniteliği alınamıyor" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Özel dosya kopyalanamıyor" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Geçersiz simgesel bağ değeri verildi" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "Simgesel bağlar desteklenmiyor" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Çöp desteklenmiyor" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Dosya adları “%c” içeremez" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "“%s” şablonu için geçici dizin oluşturulamadı: %s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "bölüm, bağlamayı yerine getirmiyor" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Bu dosyayı işleme amacıyla kayıtlı uygulama yok" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Enumerator kapalı" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Dosya numaralandırıcı sıra dışı işleme sahip" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Dosya numaralandırıcı zaten kapalı" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "GFileIcon kodlamasının %d sürümü işlenemiyor" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "GFileIcon için bozuk girdi verisi" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Akış query_info desteklemiyor" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Atlama akışta desteklenmiyor" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Sonunu kesmeye giriş akışında izin verilmiyor" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Akış üzerinde sonunun kesilmesi desteklenmiyor" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Geçersiz makine adı" @@ -1572,64 +1603,64 @@ msgstr "HTTP vekil sunucu yanıtı çok büyük" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP vekil sunucusu bağlantıyı beklenmedik biçimde kesti." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Yanlış jeton sayısı (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Sınıf adı %s için tür yok" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "%s türü GIcon arayüzü uygulamıyor" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "%s türü sınıflandırılmış değil" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Bozuk sürüm numarası: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "%s türü GIcon arayüzü üzerinde from_tokens() uygulamıyor" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Simge kodlamasının verilen sürümü işlenemiyor" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Belirtilen hiçbir adres yok" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Adres için %u uzunluğu çok uzun" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "Adres önek uzunluğundan daha çok bite sahiptir" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "“%s”, IP adresi maskesi olarak ayrıştırılamadı" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Yuva adresi için yeterli alan yok" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Desteklenmeyen yuva adresi" @@ -1643,7 +1674,7 @@ msgstr "Giriş akımı okumayı uygulamıyor" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Akışın sıra dışı işlemi var" @@ -1659,7 +1690,7 @@ msgstr "Taşındığında dosyayla tut" msgid "“version” takes no arguments" msgstr "“version” hiçbir argüman almaz" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Kullanım:" @@ -1667,79 +1698,79 @@ msgstr "Kullanım:" msgid "Print version information and exit." msgstr "Sürüm bilgisini yazdır ve çık." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Komutlar:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Dosyaları standart çıktıya bitiştir" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Bir veya daha çok dosya kopyala" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Konumlar hakkında bilgi göster" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Masaüstü dosyasından uygulama başlat" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Konumların içeriklerini listele" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "MIME türü için işleyici belirle veya al" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Dizinler oluştur" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Dosyaları ve dizinleri değişiklikler için gözlemle" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Konumları bağla veya ayır" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Bir veya daha çok dosya taşı" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Dosyaları öntanımlı uygulamayla aç" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Dosyayı yeniden adlandır" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Bir veya daha çok dosya sil" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Standart girdiden oku ve kaydet" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Dosya özniteliği belirle" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Dosyaları veya dizinleri çöpe taşı" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Konumların içeriklerini ağaçta listele" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Komutlar:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Ayrıntılı yardım almak için %s kullan.\n" @@ -1749,7 +1780,7 @@ msgid "Error writing to stdout" msgstr "stdout’a yazılırken hata" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1772,60 +1803,64 @@ msgstr "" "yerine GIO konumlarını kullanır: örneğin, smb://sunucu/kaynak/dosya.txt\n" "gibi bir şeyi konum olarak kullanabilirsiniz." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Konum verilmedi" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Hedef dizin yok" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "İlerlemeyi göster" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Üzerine yazmadan önce onay iste" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Tüm öznitelikleri koru" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Var olan hedef dosyaları yedekle" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Simgesel bağlantıları asla takip etme" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Hedef için öntanımlı izinleri kullan" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "Hedef için öntanımlı dosya değişiklik zaman damgalarını kullan" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "%s/%s aktarıldı (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "KAYNAK" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "HEDEF" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Bir veya daha çok dosyayı KAYNAK’tan HEDEF’e taşı." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1835,12 +1870,12 @@ msgstr "" "yerine GIO konumlarını kullanır: örneğin, smb://sunucu/kaynak/dosya.txt\n" "gibi bir şeyi konum olarak kullanabilirsiniz." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "%s konumu bir dizin değildir" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: “%s” üzerine yazılsın mı? " @@ -1881,52 +1916,52 @@ msgstr "gösterme adı: %s\n" msgid "edit name: %s\n" msgstr "adı düzenle: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "ad: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "tür: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "boyut: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "gizli\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "yerel yol: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "unix bağlaması: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Belirlenebilir öznitelikler:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Yazılabilir öznitelik ad boşlukları:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Konumlar hakkında bilgi göster." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2483,7 +2518,8 @@ msgstr "" "dizin)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "DİZİN" @@ -2534,6 +2570,10 @@ msgstr "" msgid "C identifier name used for the generated source code" msgstr "C oluşturulan kaynak kod için kullanılan tanımlayıcı ad" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "TANIMLAYICI" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "Hedef C derleyici (öntanımlı: CC ortam değişkeni)" @@ -3045,124 +3085,124 @@ msgstr "%s için dosya sistemi bilgisi alınırken hata: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "%s dosyası için bağlama bulunamadı" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Kök dizini yeniden adlandırılamaz" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "%s dosyası yeniden adlandırılırken hata: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Dosya yeniden adlandırılamıyor, dosya adı zaten var" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Geçersiz dosya adı" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "%s dosyası açılırken hata: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "%s dosyası silinirken hata: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "%s dosyası çöpe atılırken hata: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Çöp dizini %s oluşturulamadı: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "%s çöpe atmak için en üst seviye dizin bulunamıyor" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Sistem iç bağlarına çöpleme desteklenmiyor" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "%2$s çöpe atılırken %1$s çöp dizini bulunamıyor ya da oluşturulamıyor" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "%s için çöp bilgi dosyası oluşturulamıyor: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "%s dosyası, dosya sistemi sınırları dışına, çöpe atılamıyor" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "%s dosyası çöpe atılamıyor: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "%s dosyası çöpe atılamıyor" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "%s dizini oluşturulurken hata: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Dosya sistemi simgesel bağları desteklemiyor" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "%s simgesel bağlantısı yapılırken hata: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "%s dosyası taşınırken hata: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Dizin dizin üzerine taşınamıyor" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Yedek dosyası oluşturulamadı" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Hedef dosya silerken hata: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Bağlı sistemler arasında taşıma desteklenmiyor" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "%s’in disk kullanımı saptanamadı: %s" @@ -3184,116 +3224,116 @@ msgstr "Geçersiz genişletilmiş öznitelik adı" msgid "Error setting extended attribute “%s”: %s" msgstr "“%s” genişletilmiş özniteliği atanırken hata: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (geçersiz kodlama)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "“%s” dosyası için bilgi alınırken hata: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Dosya tanımlayıcı için bilgi alındığında hata: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Geçersiz öznitelik türü (uint32 beklendi)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Geçersiz öznitelik türü (uint64 beklendi)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Geçersiz öznitelik türü (byte dizisi beklendi)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Simgesel bağlar üzerindeki yetkiler ayarlanamıyor" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "İzinler atanırken hata: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Sahip atanırken hata: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "simgesel bağ NULL olmamalı" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Simgesel bağ atanırken hata: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "Simgesel bağ atanırken hata: dosya bir simgesel bağ değil" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "UNIX zaman damgası %2$lld için %1$d ek nanosaniye negatif" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "UNIX zaman damgası %2$lld için %1$d ek nano saniye 1 saniyeye ulaştı" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX zaman damgası %lld 64 bit’e sığmıyor" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "UNIX zaman damgası %lld Windows tarafından desteklenen aralığın dışında" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "“%s” dosya adı UTF-16’ya dönüştürülemedi" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "“%s” dosyası açılamadı: Windows Hatası %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "“%s” dosyasına değiştirme veya erişim süresi atanırken hata: %lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Değiştirme veya erişim süresi atanırken hata: %s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux bağlamı NULL olmamalı" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux bu sistede etkin değil" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "SELinux bağlamı atanırken hata: %s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Öznitelik %s ataması desteklenmiyor" @@ -3346,7 +3386,7 @@ msgid "Error truncating file: %s" msgstr "Dosyanın sonu kesilirken hata: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "“%s” dosyası açılırken hata: %s" @@ -3368,27 +3408,27 @@ msgstr "Dosya dışarıdan değiştirilmiş" msgid "Error removing old file: %s" msgstr "Eski dosya silinirken hata: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Geçersiz GSeekType sağlandı" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Geçersiz atlama isteği" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "GMemoryInputStream sonu silinemiyor" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Bellek çıktı akışı yeniden boyutlandırılamaz" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Bellek çıktı akışı yeniden boyutlandırılamadı" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3396,32 +3436,32 @@ msgstr "" "Yazma işlemi için gereken bellek miktarı, kullanılabilir adres uzayından " "daha büyük" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Akış başlamadan önce arama istendi" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Akışın sonu dışında arama istendi" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "bağlama, “ayır” işlemini yerine getirmiyor" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "bağlama, “çıkar” işlemini yerine getirmiyor" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "" "bağlama, “ayır” veya “unmount_with_operation” işlemini yerine getirmiyor" @@ -3429,7 +3469,7 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "bağlama, “çıkar” veya “eject_with_operation” işlemini yerine getirmiyor" @@ -3437,34 +3477,34 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "bağlama, “remount” işlemini yerine getirmiyor" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "bağlama, içerik türü tahminini yerine getirmiyor" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "bağlama, eş zamanlı içerik türü tahminini yerine getirmiyor" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "“%s” ana makine adı “[” içeriyor ama “]” içermiyor" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Ağa erişilemiyor" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Makineye erişilemiyor" @@ -3492,7 +3532,7 @@ msgstr "NetworkManager çalışmıyor" msgid "NetworkManager version too old" msgstr "NetworkManager sürümü çok eski" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "Çıktı akışı yazmayı yerine getirmiyor" @@ -3505,38 +3545,38 @@ msgstr "%s için geçilen vektörlerin toplamı çok büyük" msgid "Source stream is already closed" msgstr "Kaynak akışı zaten kapalı" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Belirtilmemiş vekil bakış başarısızlığı" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "“%s” çözülürken hata: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s uygulanmadı" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Geçersiz alan adı" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "“%s” konumundaki kaynak yok" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "“%s” konumundaki kaynak açılamadı" @@ -3554,11 +3594,11 @@ msgstr "“%s” konumundaki kaynak bir dizin değildir" msgid "Input stream doesn’t implement seek" msgstr "Girdi akışı aramayı yerine getirmiyor" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Kaynakları içeren bölümleri bir elf DOSYASINDA listele" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3568,15 +3608,15 @@ msgstr "" "Eğer BÖLÜM verilirse, yalnızca bu bölümün kaynaklarını listele\n" "Eğer YOL verilirse, yalnızca eşleşen kaynakları listele" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "DOSYA [YOL]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "[BÖLÜM]" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3588,15 +3628,15 @@ msgstr "" "Eğer YOL verilirse, yalnızca eşleşen kaynakları listele\n" "Ayrıntılar bölüm, boyut, sıkıştırma bilgilerini içerir" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Bir kaynak dosyasını stdout konumuna çıkar" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "DOSYA YOLU" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3624,7 +3664,7 @@ msgstr "" "Ayrıntılı yardım almak için “gresource help KOMUT” komutunu kullan.\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3639,19 +3679,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " BÖLÜM (İsteğe Bağlı) Bir elf bölüm adı\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " KOMUT (İsteğe Bağlı) Açıklanacak komut\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " DOSYA Bir elf dosyası (ikili ya da paylaşımlı bir kütüphane)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3659,19 +3699,19 @@ msgstr "" " DOSYA Bir elf dosyası (ikili ya da paylaşımlı bir kütüphane)\n" " ya da derlenmiş bir kaynak dosyası\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[YOL]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " YOL (isteğe bağlı) kaynak yolu (kısmi olabilir)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "YOL" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " YOL Kaynak yolu\n" @@ -3904,214 +3944,214 @@ msgstr "Boş şema adı verildi\n" msgid "No such key “%s”\n" msgstr "“%s” gibi bir anahtar yok\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Geçersiz yuva, başlatılmadı" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Geçersiz yuva, başlatılamadı: %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Yuva zaten kapalı" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1445 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Yuva G/Ç zaman aşımı" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "fd’den GSocket oluşturuluyor: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Yuva oluşturulamadı: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Bilinmeyen küme belirtildi" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Bilinmeyen iletişim kuralı belirtildi" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Datagram olmayan bir yuva üzerinde datagram işlemleri kullanılamaz." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Zamanaşımı ayarlanmış bir yuva üzerinde datagram işlemleri kullanılamaz." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "yerel adres alınamadı: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "uzaktaki adres alınamadı: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "dinlenemedi: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "%s adresine bağlanırken hata: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Çok yöne yayın kümesine katılırken hata: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Çok yöne yayın kümesinden ayrılırken hata: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Kaynağa-özgü çok yöne yayın desteklenmiyor" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Desteklenmeyen yuva ailesi" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "kaynağa-özgü bir IPv4 adresi değil" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Arayüz adı çok uzun" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Arayüz bulunamadı: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "IPv4 kaynağa-özgü çok yöne yayın desteklenmiyor" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "IPv6 kaynağa-özgü çok yöne yayın desteklenmiyor" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Bağlantı kabul edilirken hata: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "Bağlantı sürüyor" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Bekleyen hata alınamadı: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Veri alırken hata: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Veri gönderirken hata: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Yuva kapatılamadı: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Yuva kapatılırken hata: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Yuva durumu bekleniyor: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "İleti gönderilemedi: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "İleti vektörleri çok geniş" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "İleti gönderme hatası: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage Windows işletim sisteminde desteklenmiyor" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "İleti alma hatası: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Yuva kimliği okunamadı : %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "bu işletim sistemi için g_socket_get_credentials uygulanmadı" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "%s vekil sunucusuna bağlanılamadı: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "%s bağlantısı gerçekleştirilemedi: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Bağlanılamadı: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "TCP olmayan bağlantılar üzerinden vekil sunucusu desteklenmiyor." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "“%s” vekil iletişim kuralı desteklenmiyor." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Dinleyici zaten kapalı" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Eklenen yuva kapalı" @@ -4203,94 +4243,94 @@ msgstr "SOCKSv5 vekil sunucusu verilen adres türünü desteklemiyor." msgid "Unknown SOCKSv5 proxy error." msgstr "Bilinmeyen SOCKSv5 vekil hatası." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Alt süreçle haberleşme için boru oluşturulamadı (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "Borular bu platformda desteklenmiyor" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "GThemedIcon kodlaması %d sürümü işlenemiyor" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Geçersiz adresler bulundu" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "“%s” tersine çözülürken hata: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" -msgstr "DNS %s kaydı ayrıştırılamadı: kusurlu DNS paketi" +msgstr "DNS %s kaydı ayrıştırılırken hata: kusurlu DNS paketi" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "“%s” için istenen türün DNS kaydı yok" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Geçici olarak “%s” çözülemiyor" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "“%s” çözerken hata" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Kusurlu DNS paketi" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "“%s” için DNS yanıtı ayrıştırılamadı: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Hiçbir PEM-kodlamalı özel anahtar bulunamadı" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "PEM-kodlamalı özel anahtar şifresi çözülemiyor" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "PEM-kodlamalı özel anahtar ayrıştırılamadı" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "PEM-kodlamalı sertifika bulunamadı" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "PEM-kodlamalı sertifika ayrıştırılamadı" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "Var olan TLS arka ucu PKCS #12 desteklemiyor" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "GTlsBackend, PKCS #11 sertifikası oluşturmayı desteklemiyor" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4299,7 +4339,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4307,134 +4347,146 @@ msgstr "" "Girilen birkaç parola hatalı olmuştur ve daha çok hatalı girişten sonra " "erişiminiz kilitlenecektir." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Girilen parola hatalı." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "FD gönderimi desteklenmiyor" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "Beklenen 1 denetim iletisi, alınan %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Yardımcı verinin beklenmeyen türü" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "Beklenen bir fd, ancak alınan %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Geçersiz fd alındı" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "FD alımı desteklenmiyor" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Kimlik bilgileri gönderilirken hata oluştu: " -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Yuva için SO_PASSCRED’in etkin olup olmadığını denetleme hatası: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "SO_PASSCRED etkinleştirmede hata: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Kimlik bilgileri almak için bir bayt okunması bekleniyordu, sıfır bayt okundu" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Beklenen denetim iletisi yok ancak %d alındı" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "SO_PASSCRED devre dışı bırakılırken hata: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Dosya tanımlayıcıdan okuma hatası: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Dosya tanımlayıcı kapatılırken hata: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Dosya sistemi kök dizini" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Dosya tanımlayıcıya yazmada hata: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "Soyut UNIX alan yuvası adresleri bu sistemde desteklenmiyor" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "bölüm, çıkartmayı yerine getirmiyor" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "bölüm, çıkartmayı veya eject_with_operation’ı yerine getirmiyor" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "Uygulama nesnesindeki ‘%s’ uygulamasının eylemi yok" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "" +"Uygulama nesnesindeki ‘%s’ uygulamasının ve ‘%s’ işleyicisinin eylemi yok" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "İşleyiciden okumada hata: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "İşleyici kapatılırken hata: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "İşleyiciye yazmada hata: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Yeterli bellek yok" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "İç hata: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Daha çok girdi gerekli" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Geçersiz sıkıştırılmış veri" @@ -4462,149 +4514,287 @@ msgstr "Bir dbus hizmeti çalıştır" msgid "Wrong args\n" msgstr "Yanlış değişkenler\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "‘%s’ açılamadı: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Hata: Çıktının tümü yazılamadı: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Hata: ‘%s’, ‘%s’ olarak yeniden adlandırılamadı: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Dizinleri GIR arama yolunda içer" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Çıktı dosyası" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Paylaşılan kütüphane" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Hata ayıklama iletilerini göster" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Ayrıntılı iletileri göster" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Programın sürüm numarasını göster ve çık" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Argümanlar ayrıştırılırken hata: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Lütfen yalnızca bir girdi dosyası belirtin" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "‘%s’ dosyası ayrıştırılırken hata: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "‘%s’ modülü için typelib inşa edilemedi" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "‘%s‘ yüklenemedi: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Tüm bilgileri göster" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Ayrıştırılamadı: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Girdi dosyaları yok" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "‘%s’ okunamadı: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "‘%s’ typelib oluşturulamadı: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Typelib yüklenemedi: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Uyarı: %u modül dışlandı" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "İncelenecek typelib sürümü" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "SÜRÜM" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Typelib’in gereksindiği paylaşılan kütüphaneleri listele" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Denetlenen typelib’in gereksindiği diğer typelib’leri listele" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "İncelenecek typelib" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "AD ALANI" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- GI typelib’i incele" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Komut satırı seçenekleri ayrıştırılamadı: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Lütfen yalnızca bir ad alanı belirtin" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "Lütfen --print-shlibs, --print-typelibs ya da her ikisini belirtin" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "“%2$s” ögesi için beklenmeyen “%1$s” özniteliği" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "“%2$s” ögesinde “%1$s” özniteliği bulunamadı" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Beklenmeyen etiket “%s”, “%s” bekleniyordu" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "“%2$s” içinde beklenmeyen etiket “%1$s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Yer imi dosyasında geçersiz tarih/saat ‘%s’" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Veri dizinlerinde geçerli bir yer imi dosyası bulunamadı" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "“%s” URI’si için bir yer imi zaten var" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "“%s” URI’si için bir yer imi bulunamadı" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "“%s” URI’si için yer iminde hiçbir MIME türü belirtilmedi" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "“%s” URI’si için yer iminde özel bayrak tanımlanmadı" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "“%s” URI’si için yer iminde küme tanımlanmadı" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "“%s” adında hiçbir uygulama “%s” için yer imi kaydetmedi" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Exec satırı “%s”, “%s” URI’si ile genişletilemedi" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Dönüşüm girdisi içinde temsil edilemez karakter" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Girdinin sonunda parçalı karakter dizisi" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "" "Geridönüş karakter kümesi “%s”, “%s” karakter kümesine dönüştürülemiyor" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Dönüşüm girdisinde gömülü NUL baytı" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Dönüşüm çıktısında gömülü NUL baytı" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "“%s” URI’si, “file” şemasını kullanan kesin bir URI değil" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "“%s” URI’si geçersiz" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "“%s” URI’sinin ana makine adı geçersiz" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "“%s” URI’si geçersiz olarak çıkış yapılmış karakterler içeriyor" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Yol adı “%s”, kesin bir yol değil" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %d %b %Y %T %Z" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d/%m/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4625,62 +4815,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "Ocak" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "Şubat" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "Mart" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "Nisan" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "Mayıs" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "Haziran" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "Temmuz" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "Ağustos" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "Eylül" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "Ekim" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "Kasım" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "Aralık" @@ -4702,132 +4892,132 @@ msgstr "Aralık" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "Oca" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "Şub" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "Nis" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "May" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "Haz" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "Tem" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "Ağu" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "Eyl" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "Eki" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "Kas" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "Ara" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "Pazartesi" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "Salı" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "Çarşamba" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "Perşembe" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "Cuma" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "Cumartesi" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "Pazar" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Pzt" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Sal" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Çar" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Per" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Cum" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Cmt" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Paz" @@ -4849,62 +5039,62 @@ msgstr "Paz" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "Ocak" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "Şubat" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "Mart" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "Nisan" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "Mayıs" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "Haziran" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "Temmuz" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "Ağustos" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "Eylül" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "Ekim" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "Kasım" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "Aralık" @@ -4926,190 +5116,197 @@ msgstr "Aralık" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Oca" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Şub" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Mar" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Nis" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "May" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Haz" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Tem" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Ağu" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Eyl" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Eki" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Kas" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Ara" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "ÖÖ" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "ÖS" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "“%s” dizini açılamadı: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "%lu bayt “%s” dosyasını okumak için ayrılamadı" +msgid "Could not allocate %s to read file “%s”" +msgstr "“%2$s” dosyasını okumak için %1$s ayrılamadı" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "“%s” dosyası okuma hatası: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "“%s” dosyası çok büyük" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "“%s” dosyasından okunamadı: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "“%s” dosyası açılamadı: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "“%s” dosyasının öznitelikleri alınamadı: fstat() başarısız: %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "“%s” dosyası açılamadı: fdopen() başarısız: %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" "“%s” dosyasının adı “%s” olarak değiştirilemedi: g_rename() başarısız: %s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "“%s” dosyasına yazılamadı: ftruncate() başarısız: %s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "“%s” dosyasına yazılamadı: write() başarısız: %s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "“%s” dosyasına yazılamadı: fsync() başarısız: %s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "“%s” dosyası oluşturulamadı: %s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Var olan dosya “%s” kaldırılamadı: g_unlink() başarısızlığı: %s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "“%s” şablonu geçersiz, “%s” içermemeli" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "“%s” şablonu XXXXXX içermiyor" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "“%s” simgesel bağı okunamadı: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "“%s”-“%s” dönüştürücüsü açılamıyor: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "g_io_channel_read_line_string içinde ham okuma yapılamıyor" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "Okuma tampon belleğinde kalıntı çevrilmemiş veri" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Kanal kısmi bir karakterde sonlanıyor" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "g_io_channel_read_to_end içinde ham okuma başarısız" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Arama dizinlerinde geçerli anahtar dosyası bulunamadı" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Normal dosya değil" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5117,50 +5314,50 @@ msgstr "" "Anahtar dosyası; anahtar-değer çifti, küme veya yorum olmayan “%s” satırını " "içeriyor" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Geçersiz küme adı: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Anahtar dosyası kümeyle başlamıyor" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Geçersiz anahtar adı: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Anahtar dosya desteklenmeyen “%s” kodlamasını içeriyor" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Anahtar dosyasında “%s” kümesi yok" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Anahtar dosyası, “%2$s” kümesinde “%1$s” anahtarı içermiyor" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "Anahtar dosyası, UTF-8 olmayan “%s” anahtarını “%s” değeriyle içeriyor" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Anahtar dosyası yorumlanamayan bir değere sahip olan “%s” anahtarını içerir." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5169,38 +5366,38 @@ msgstr "" "“%2$s” kümesindeki anahtar dosyası, yorumlanamayan “%1$s” anahtarını " "içeriyor." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "“%2$s” kümesindeki “%1$s” anahtarı “%4$s” değerine sahip olması beklenirken " "“%3$s” değerine sahip" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Anahtar dosyası satır sonunda çıkış karakteri içeriyor" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "“%s” anahtar dosyası geçersiz çıkış dizisi içeriyor" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "“%s” değeri bir sayı olarak yorumlanamıyor." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "“%s”, tamsayı değeri aralık dışında" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "“%s” değeri bir gerçel sayı olarak yorumlanamıyor." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "“%s” değeri mantıksal değer olarak yorumlanamıyor." @@ -5221,32 +5418,32 @@ msgstr "%s%s%s%s için eşleme oluşturulamadı: mmap() başarısız: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "“%s” dosyası açılamadı: open() başarısız: %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Satır %d karakter %d hatalı: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Adda geçersiz UTF-8 kodlu metin — geçerli olmayan “%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s” geçerli bir ad değil" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s” geçerli bir ad değil: “%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Satır %d hata içeriyor: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5255,7 +5452,7 @@ msgstr "" "Karakter referansı içinde bir rakam olması gereken “%-.*s” ayrıştırılamadı, " "(örneğin; ê) — rakam çok büyük olabilir" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5265,23 +5462,23 @@ msgstr "" "özvarlık başlatmak istemeksizin “ve” imi kullandınız — “ve” imini & " "olarak kullanabilirsiniz" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Karakter referansı “%-.*s” izin verilen karakteri kodlamıyor" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Boş özvarlık “&;” görüldü; geçerli ögeler: & " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Varlık adı “%-.*s” bilinmiyor" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5290,11 +5487,11 @@ msgstr "" "başlatmak istemeksizin “ve” imi kullandınız — “ve” imini & olarak " "kullanabilirsiniz" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Belge bir öge ile başlamalıdır (örneğin )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5303,7 +5500,7 @@ msgstr "" "“<” karakterinden sonra gelen “%s” geçerli bir karakter değil; bir öge adı " "başlatmamalı" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5311,12 +5508,12 @@ msgid "" msgstr "" "Tuhaf karakter “%s”, “%s” boş öge etiketinin sonunda “>” karakteri bekledi" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "“%s” ögesinde çok fazla öznitelik var" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5324,7 +5521,7 @@ msgstr "" "Tuhaf karakter “%1$s”, “%3$s” ögesinin “%2$s” özniteliğinin sonunda “=” " "karakteri bekledi" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5335,7 +5532,7 @@ msgstr "" "“>”, “/” karakteri veya bir öznitelik bekledi; öznitelik adında geçersiz bir " "karakter kullanmış olabilirsiniz" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5344,7 +5541,7 @@ msgstr "" "Tuhaf karakter “%1$s”, “%3$s” ögesindeki “%2$s” özniteliği için değer " "verildiğinde eşittir iminden sonra tırnak imi beklendi" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "“%s” ögesi kapatılmış, hiçbir öge şu anda açık değil" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "“%s” ögesi kapatılmış, ancak “%s” şu an açık olan ögedir" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Belge boş veya yalnızca boşluk karakteri içeriyor" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" "Belge, açık açı parantezi “<” iminden hemen sonra beklenmedik biçimde " "sonlandı" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5391,7 +5588,7 @@ msgstr "" "Belge, ögeleri hala açıkken beklenmedik biçimde sonlandı - son açılan öge: " "“%s”" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5400,19 +5597,19 @@ msgstr "" "Belge beklenmedik biçimde sonlandı, etiketi bitiren kapalı açı parantezi ile " "biten <%s/> beklendi" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Belge bir öge adının içinde beklenmedik biçimde sonlandı" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Belge bir öznitelik adı içinde beklenmedik biçimde sonlandı" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Belge bir öge-açma etiketi içinde beklenmedik biçimde sonlandı." -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5420,261 +5617,261 @@ msgstr "" "Belge öznitelik adını takip eden eşittir iminden sonra beklenmedik biçimde " "sonlandı; öznitelik değeri yok" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Belge bir öznitelik değeri içinde iken beklenmedik biçimde sonlandı" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" "Belge, “%s” ögesinin kapatma etiketi içinde beklenmedik biçimde sonlandı" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Belge, açık olmayan bir öge için kapatma etiketi içinde beklenmedik biçimde " "sonlandı" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Belge bir yorum veya işlem talimatı içindeyken beklenmedik biçimde sonlandı" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[SEÇENEK…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Yardım Seçenekleri:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Yardım seçeneklerini göster" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Tüm yardım seçeneklerini göster" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Uygulama Seçenekleri:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Seçenekler:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "%2$s için tamsayı değeri “%1$s” ayrıştırılamıyor" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "%2$s için tamsayı değeri “%1$s” aralık dışında" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "%2$s için double değeri “%1$s” ayrıştırılamıyor" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "%2$s için double değeri “%1$s” aralık dışında" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" -msgstr "%s seçeneği işlenirken hata" +msgstr "%s seçeneği ayrıştırılırken hata" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "%s için argüman eksik" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Bilinmeyen seçenek %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "bozuk nesne" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "yetersiz bellek" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "iç hata" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "doku (pattern), kısmi eşleme için desteklenmeyen ögeler içeriyor" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "koşul olarak geri referanslar kısmi eşleme için desteklenmiyor" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "iç içe yineleme sınırına ulaşıldı" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "geçersiz ofset" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "yineleme döngüsü" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "JIT için derlenmemiş eşleşme kipi istendi" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "bilinmeyen hata" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ desenin sonunda" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c desenin sonunda" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "\\ imini takiben anlaşılamayan karakter" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "sayılar {} niceliği içerisinde sıra dışı" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "sayılar {} niceliği içerisinde çok büyük" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "karakter sınıfı için eksik sonlanan ]" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "karakter sınıfında geçersiz dizi" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "karakter sınıfında sıra dışı kapsam" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "yinelenecek bir şey yok" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "(? ya da (?- sonrası tanınmayan karakter" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "POSIX adlandırılmış sınıflar yalnızca bir sınıf içinde desteklenir" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "POSIX karşılaştırma ögeleri desteklenmiyor" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "eksik sonlandıran )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "var olmayan alt desene referans" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "açıklama sonrası eksik )" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "düzenli ifade çok uzun" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "(?( sonrası bozuk rakam ya da ad" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "geribakma iddiası sabit uzunlukta değil" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "koşul kümesi ikiden daha çok dal içeriyor" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "(?( sonrası ifade beklendi" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "numaralandırılmış kaynak sıfır olmamalıdır" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "bilinmeyen POSIX sınıf adı" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "\\x{...} dizisi içerisinde karakter değeri çok büyük" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C geriye bakma iddiası içerisinde izin verilmiyor" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "alt desen adı içerisinde eksik sonlandırıcı" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "iki adlı alt desenler aynı ada sahip" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "bozulmuş \\P ya da \\p dizisi" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "\\P ya da \\p sonrası bilinmeyen özellik adı" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "alt desen adı çok uzun (en çok 32 karakter)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "çok fazla adlandırılmış alt desen (en çok 10.000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "sekizlik değer \\377’den daha büyük" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "DEFINE kümesi birden çok dal içeriyor" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "kararsız NEWLINE seçenekleri" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5682,232 +5879,232 @@ msgstr "" "\\g bir parantezli ad ya da tercihten parentezli sıfır olmayan sayı " "tarafından takip edilmiyor" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "(*ACCEPT), (*FAIL) ya da (*COMMIT) için bir argümana izin verilmez" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "(*VERB) tanınamadı" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "sayı çok büyük" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "(?& den sonra eksik alt desen adı" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "aynı sayıya izin verilmeyen alt desenler için farklı adlar" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) bir argüman almalı" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c karakteri ASCII karakterleri tarafından takip edilmelidir" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "" "\\k bir parantezli ad ya da tercihten parentezli sıfır olmayan sayı " "tarafından takip edilmiyor" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N bir sınıfta desteklenmez" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "(*MARK), (*PRUNE), (*SKIP) ya da (*THEN) içinde ad çok uzun" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "kod akış taşması" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "(?P sonrası tanımlanmayan karakter" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "derleme çalışma alanı kaplandı" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "önceden denetlenmiş referanslı alt desen bulunamadı" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Düzenli ifade %s eşleşirken hata: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE kütüphanesi UTF8 desteği olmadan derlenmiş" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE kütüphanesi uyuşmayan seçenekler ile derlenmiş" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Düzenli ifade ‘%s’ derlenirken karakter %s hatalı: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "onaltılı rakam ya da “}” beklendi" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "onaltılı rakam beklendi" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "simgesel referansda eksik “<”" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "tamamlanmamış simgesel referans" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "sıfır-uzunlukta simgesel referans" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "rakam beklendi" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "geçersiz simgesel referans" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "son “\\” kayıp" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "geçersiz çıkış dizisi" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "Yerine koyma metni “%s” işlenirken karakter %lu hatalı: %s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Alıntılı metin tırnak imi ile başlamıyor" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" "Komut satırında veya diğer kabuk alıntısı metinde eşlenmemiş tırnak imi" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Metin “\\” karakterinden hemen sonra bitti. (Metin: “%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "%c için eşleşen alıntı bulunmadan metin bitti. (Metin: “%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Metin boştu (veya yalnızca boşluk içeriyordu)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Alt süreçten bilgi okunamadı (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Alt süreçten bilgi okurken beklenmeyen hata oluştu (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "waitpid() (%s) içinde beklenmeyen hata" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Alt işlem %ld kodu ile sonlandı" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Alt işlem, %ld sinyali ile sonlandı" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Alt işlem %ld sinyali ile durduruldu" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Alt işlem anormal bir biçimde sonlandı" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Alt süreç borusundan okunamadı (%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "“%s” alt süreci üretilemedi (%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Çatallamadı (%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "“%s” dizinine değiştirilemedi (%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "“%s” alt süreç çalıştırılamadı (%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Dosya tanımlayıcıyı yeniden eşlemek için dosya açılamadı (%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Alt süreç için dosya tanımlayıcı çoğaltılamadı (%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Alt süreç çatallanamadı (%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Alt süreç için dosya tanımlayıcı kapatılamadı (%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Alt süreç “%s” çalıştırılırken bilinmeyen hata oluştu" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Alt süreç borusundan yeterli bilgi okunamadı (%s)" @@ -5964,78 +6161,78 @@ msgstr "" "Alt süreçten bilgi okurken g_io_channel_win32_poll() işleminde beklenmeyen " "hata" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Boş dizge bir sayı değildir" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s” işaretli bir sayı değil" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "“%s” sayısı sınırların dışındadır [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s” işaretsiz bir sayı değil" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "URI’de geçersiz %-kodlama" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "URI’de kural dışı karakter" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "URI’de UTF-8 olmayan karakterler" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "URI’de geçersiz IPv6 adresi ‘%.*s’" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "URI’de kural dışı kodlanmış IP adresi ‘%.*s’" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "URI’de kural dışı uluslararasılaştırılmış ana makine adı ‘%.*s’" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "URI’deki ‘%.*s’ bağlantı noktası ayrıştırılamadı" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URI’deki ‘%.*s’ bağlantı noktası kapsam dışında" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "‘%s’ URI’si mutlak URI değil" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "‘%s’ URI’sinin ana makine bileşeni yok" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI mutlak değil ve temel URI sağlanmamış" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "‘=’ ve parametre değeri eksik" @@ -6116,65 +6313,65 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "kb" +msgid "kbit" +msgstr "kbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Mb" +msgid "Mbit" +msgstr "Mbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Gb" +msgid "Gbit" +msgstr "Gbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Tb" +msgid "Tbit" +msgstr "Tbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Pb" +msgid "Pbit" +msgstr "Pbit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Eb" +msgid "Ebit" +msgstr "Ebit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Kib" +msgid "Kibit" +msgstr "Kibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Mib" +msgid "Mibit" +msgstr "Mibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Gib" +msgid "Gibit" +msgstr "Gibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Tib" +msgid "Tibit" +msgstr "Tibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Pib" +msgid "Pibit" +msgstr "Pibit" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Eib" +msgid "Eibit" +msgstr "Eibit" #: glib/gutils.c:3056 msgid "byte" @@ -6274,12 +6471,6 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" -#, c-format -#~ msgid "The local file URI “%s” may not include a “#”" -#~ msgstr "Yerel dosya URI’si “%s”, “#” içeremez" - -#~ msgid "backtracking limit reached" -#~ msgstr "geri takip sınırına ulaşıldı" - -#~ msgid "GApplication options" -#~ msgstr "GApplication seçenekleri" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "% ayrılamadı" diff --git a/po/uk.po b/po/uk.po index 9397b2b..05fa29b 100644 --- a/po/uk.po +++ b/po/uk.po @@ -5,22 +5,22 @@ # Maxim Dziumanenko , 2004-2009. # wanderlust , 2009. # Mykola Tkach , 2014. -# Yuri Chornoivan , 2020, 2021, 2022, 2023. +# Yuri Chornoivan , 2020, 2021, 2022, 2023, 2024. msgid "" msgstr "" "Project-Id-Version: glib\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-10-22 23:29+0000\n" -"PO-Revision-Date: 2023-08-31 22:09+0300\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-02-29 10:40+0000\n" +"PO-Revision-Date: 2024-02-29 20:20+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Lokalize 20.12.0\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Generator: Lokalize 23.04.1\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -42,38 +42,42 @@ msgstr "Не вдалося знайти типову програму для т msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "Не вдалося знайти типову програму для схеми адреси «%s»" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "Параметри GApplication:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "Показати параметри GApplication" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" "Запустити GApplication у режимі сервісу (використовувати з сервісних файлів " "D-Bus)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "Перевизначити ідентифікатор програми" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "Вивести дані щодо версії програми" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "Замінити запущений екземпляр" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "Надрукувати довідку" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[КОМАНДА]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "Вивести номер версії" @@ -128,7 +132,7 @@ msgid "APPID" msgstr "ІД_ПРОГРАМИ" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "КОМАНДА" @@ -140,9 +144,13 @@ msgstr "Команда, за якою виводиться детальна до msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "Ідентифікатор програми у форматі D-Bus (напр.: org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "ФАЙЛ" @@ -168,7 +176,7 @@ msgstr "ПАРАМЕТР" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Необов'язковий параметр для виклику дії у форматі GVariant" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -182,12 +190,12 @@ msgstr "" msgid "Usage:\n" msgstr "Використання:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "Аргументи:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[ПАРАМЕТРИ…]" @@ -280,78 +288,79 @@ msgstr "" "нерозпізнана команда %s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "До %s передано надто велике значення лічильника" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "Перехід у базовому потоці не підтримується" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "Не вдалося урізати GMemoryInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "Потік вже закрито" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "Урізання не підтримується у базовому потоці" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "Операцію скасовано" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "Неправильний об'єкт, не ініціалізований" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" -msgstr "Неправильна багатобайтова послідовність у перетворюваних вхідних даних" +msgstr "" +"Неправильна багатобайтова послідовність у перетворюваних вхідних даних" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "Бракує простору для результату" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "Неправильна послідовність байтів у перетворюваних вхідних даних" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "Помилка під час перетворення: %s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "Ініціалізація з можливістю скасування не підтримується" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Підтримки перетворення з набору символів «%s» у «%s» не передбачено" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "Не вдалося відкрити модуль перетворення з «%s» у «%s»" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "тип %s" @@ -365,41 +374,41 @@ msgstr "Невідомий тип" msgid "%s filetype" msgstr "тип файлів %s" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "У GCredentials містяться некоректні дані" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "Тип GCredentials не реалізовано для цієї ОС" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "Підтримки GCredentials для вашої платформи не передбачено" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "Тип GCredentials не містить ідентифікатора процесу для цієї ОС" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "Спуфінг облікових даних неможливий у цій ОС" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "Неочікуваний передчасний кінець потоку" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Непідтримуваний ключ «%s» у елементі адреси «%s»" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Беззмістовна комбінація ключ/значення у елементі адреси «%s»" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " @@ -408,28 +417,28 @@ msgstr "" "Неправильна адреса «%s» (потрібен шлях, каталог, тимчасовий каталог або один " "з абстрактних ключів)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Помилка в адресі «%s» — неправильне форматування атрибута «%s»" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Невідомий або непідтримуваний канал передавання «%s» для адреси «%s»" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "У елементі адреси «%s» немає двокрапки (:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "Назва каналу передавання у елементі адреси «%s» має бути непорожньою" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -437,7 +446,7 @@ msgid "" msgstr "" "Пара ключ/значення %d, «%s», у елементі адреси «%s» не містить знака рівності" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -445,7 +454,7 @@ msgstr "" "Пара ключ/значення %d, «%s», у елементі адреси «%s» має містити непорожній " "ключ" -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -454,7 +463,7 @@ msgstr "" "Помилка зняття екранування ключа або значення у парі ключ/значення %d, «%s», " "у елементі адреси «%s»" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -463,83 +472,85 @@ msgstr "" "Помилка у адресі «%s» — для транспорту unix потрібен лише один встановлений " "ключ «path» або «abstract»" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Помилка у адресі «%s» — немає атрибута вузла або вказано значення у " "помилковому форматі" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Помилка в адресі «%s» — атрибут не вказано атрибут порту або помилкове " "форматування атрибута" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format -msgid "Error in address “%s” — the noncefile attribute is missing or malformed" +msgid "" +"Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Помилка в адресі «%s» — атрибут не вказано атрибут noncefile або помилкове " "форматування атрибута" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "Помилка автоматичного запуску: " -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Сталася помилка при відкриванні nonce-файла «%s»: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Сталася помилка при читанні nonce-файла «%s»: %s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Сталася помилка при читанні nonce-файла «%s», очікувалося 16 байтів, " "отримано %d" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Сталася помилка запису вмісту nonce-файла «%s» до потоку:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "Вказана адреса порожня" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" -msgstr "Неможливо породити процес шини повідомлень, якщо встановлено AT_SECURE" +msgstr "" +"Неможливо породити процес шини повідомлень, якщо встановлено AT_SECURE" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Неможливо породити процес шини повідомлень без ідентифікатора машини:" -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Неможливо автоматично запускати D-Bus без $DISPLAY у X11" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "Помилка запуску рядка команди «%s»: " -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Не вдалося визначити адресу сеансової шини (не реалізовано для цієї ОС)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -548,7 +559,7 @@ msgstr "" "Не вдалося визначити адресу шини зі значення змінної середовища " "DBUS_STARTER_BUS_TYPE — невідоме значення «%s»" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -556,20 +567,20 @@ msgstr "" "Не вдалося визначити адресу шини, оскільки значення змінної середовища " "DBUS_STARTER_BUS_TYPE не встановлено" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "Невідомий тип шини %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "Неочікувана відсутність вмісту при читанні рядка" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "Неочікувана відсутність вмісту при (надійному) читанні рядка" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" @@ -577,15 +588,15 @@ msgstr "" "Перепробувані усі доступні механізми автентифікації (проведено: %s) " "(доступно: %s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "Неочікувана відсутність вмісту при читанні байта" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "Ідентифікатори користувача для вузла і сервера мають бути однаковими" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Скасовано через GDBusAuthObserver::authorize-authenticated-peer" @@ -598,20 +609,21 @@ msgstr "Помилка при отриманні відомостей для к #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" -msgstr "Помилкові права на каталог «%s». Очікуваний режим — 0700, отримано 0%o" +msgstr "" +"Помилкові права на каталог «%s». Очікуваний режим — 0700, отримано 0%o" #: gio/gdbusauthmechanismsha1.c:355 gio/gdbusauthmechanismsha1.c:366 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Сталася помилка при створенні каталогу «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:8996 gio/gfile.c:9086 -#: gio/gfile.c:9170 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "Операція не підтримується" @@ -678,15 +690,15 @@ msgstr "Сталася помилка при відкриванні зв'язк msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Також, не вдалося вивільнити блокування «%s»: %s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "З'єднання закрито" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "Час очікування вичерпано" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "При створенні клієнтського з'єднання виявлено непідтримувані прапорці" @@ -776,53 +788,69 @@ msgstr "Піддерево вже експортовано для %s" msgid "Object does not exist at path “%s”" msgstr "Об'єкта зі шляхом «%s» не існує" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "" +"Повідомлення %s: поле заголовка %s є некоректним; мало бути вказано значення " +"типу «%s»" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "Повідомлення %s: некоректне або пропущене поле заголовка %s" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "Повідомлення %s: надано НЕКОРЕКТНЕ поле заголовка" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "" +"Повідомлення %sL: поле заголовка PATH використовує зарезервоване значення /" +"org/freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "" +"Повідомлення %s: у полі заголовка INTERFACE не міститься коректної назви " +"інтерфейсу" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "" +"Повідомлення %s: поле заголовка INTERFACE використовує зарезервоване " +"значення org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "" +"Повідомлення %s: у полі заголовка MEMBER не міститься коректної назви " +"учасника" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "" +"%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "" +"Повідомлення %s: у полі заголовка ERROR_NAME не міститься коректної назви " +"помилки" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "НЕПРАВИЛЬНИЙ тип" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "" -"Повідомлення METHOD_CALL: немає поля заголовка PATH або MEMBER або це поле є " -"некоректним" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "" -"Повідомлення METHOD_RETURN: немає поля заголовка REPLY_SERIAL або це поле є " -"некоректним" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "" -"Повідомлення ERROR: немає поля заголовка REPLY_SERIAL або ERROR_NAME або це " -"поле є некоректним" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "" -"Повідомлення SIGNAL: немає поля заголовка PATH, INTERFACE або MEMBER або це " -"поле є некоректним" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "" -"Повідомлення SIGNAL: поле заголовка PATH використовує зарезервоване " -"значення /org/freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "" -"Повідомлення SIGNAL: поле заголовка INTERFACE використовує зарезервоване " -"значення org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" @@ -830,12 +858,12 @@ msgstr[0] "Потрібно було прочитати %lu байт, але п msgstr[1] "Потрібно було прочитати %lu байти, але прочитано лише %lu" msgstr[2] "Потрібно було прочитати %lu байтів, але прочитано лише %lu" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Мало бути використано байт NUL після рядка «%s», але знайдено байт %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -845,21 +873,21 @@ msgstr "" "(зміщення %d, довжина рядка %d). Коректний рядок UTF-8 аж до цієї миті був " "таким: «%s»" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "Рівень вкладеності значення є надто високим" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Оброблене значення «%s» не є припустимим шляхом до об'єкта D-Bus" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Оброблене значення «%s» не є припустимим підписом D-Bus" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -875,7 +903,7 @@ msgstr[2] "" "Виявлено масив довжиною %u байтів. Максимальна довжина дорівнює 2<<26 байт " "(64 МіБ)." -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -884,23 +912,23 @@ msgstr "" "Виявлено масив типу «a%c». Очікувалося, що довжина буде кратною до %u " "байтів, втім, виявлено довжину %u байтів" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "Не можна використовувати порожні структури (кортежі) у D-Bus" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Оброблене значення «%s» для варіанта не є припустимим підписом D-Bus" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" "Помилка десеріалізації GVariant з типом рядка «%s» з формату D-Bus wire" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " @@ -909,29 +937,29 @@ msgstr "" "Неправильний порядок байтів у значенні. Мало бути 0x6c («l») або 0x42 («B»), " "але знайдено значення 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" "Неправильний старший номер версії протоколу. Очікувався 1, але знайдено %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "" "Виявлено заголовок підпису, але цей заголовок не належить до типу підписів" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Знайдено заголовок підпису з підписом «%s», але вміст повідомлення є порожнім" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Оброблене значення «%s» не є припустимим підписом D-Bus (для вмісту)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" @@ -945,17 +973,17 @@ msgstr[2] "" "Відсутній заголовок підпису у повідомленні, але тіло повідомлення займає %u " "байтів" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "Не вдалося виконати десеріалізацію повідомлення:" -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "Помилка серіалізації GVariant з типом рядка «%s» у формат D-Bus wire" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" @@ -963,16 +991,16 @@ msgstr "" "Кількість дескрипторів файлів у повідомленні (%d) відрізняється від значення " "у полі заголовка (%d)" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "Не вдалося серіалізувати повідомлення: " -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "Вміст повідомлення має підпис «%s», але немає заголовка підпису" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " @@ -981,19 +1009,19 @@ msgstr "" "Вміст повідомлення має тип підпису «%s», але значення підпису у полі " "заголовка дорівнює «%s»" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" "Вміст повідомлення порожній, але значення підпису у полі заголовка дорівнює " "«(%s)»" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "Повернуто помилку для вмісту типу «%s»" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "Повернена помилка з порожнім тілом" @@ -1013,22 +1041,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "Не вдалося отримати профіль апаратури: %s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "Не вдалося завантажити %s або %s: " -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Помилка виклику StartServiceByName для %s: " -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Неочікувана відповідь %d з методу StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1038,28 +1066,29 @@ msgstr "" "власника і проксі було побудовано із прапорцем " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "Підтримки абстрактних просторів назв не передбачено" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "Не вдалося вказати nonce-файл при створенні сервера" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "Сталася помилка при запису до nonce-файла у «%s»: %s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Рядок «%s» не є припустимим GUID D-Bus" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" -msgstr "Неможливо очікувати на дані на каналі передавання «%s», якого не існує" +msgstr "" +"Неможливо очікувати на дані на каналі передавання «%s», якого не існує" #: gio/gdbus-tool.c:113 #, c-format @@ -1119,6 +1148,10 @@ msgstr "Під'єднатися до користувацької шини" msgid "Connect to given D-Bus address" msgstr "Під'єднатися до вказаної адреси D-Bus" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "АДРЕСА" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "Параметри кінцевої точки з'єднання:" @@ -1141,7 +1174,8 @@ msgstr "Вказано декілька кінцевих точок з'єдна #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" -msgstr "Попередження: згідно з даними інтроспекції, інтерфейсу «%s» не існує\n" +msgstr "" +"Попередження: згідно з даними інтроспекції, інтерфейсу «%s» не існує\n" #: gio/gdbus-tool.c:533 #, c-format @@ -1350,71 +1384,72 @@ msgstr "Помилка: %s не є припустимим добре відом msgid "Not authorized to change debug settings" msgstr "Не уповноважено змінювати параметри діагностики" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "Без назви" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "У desktop-файлі не визначено поля Exec" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "Неможливо знайти термінал, що потрібен програмі" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "Програми «%s» не знайдено у каталогах $PATH" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Не вдалося створити теку параметрів програми %s: %s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Не вдалося створити теку параметрів MIME %s: %s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "У інформації про програму не вказано ідентифікатор" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "Не вдалося створити для користувача desktop-файл %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "Власне визначення %s" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "для диска не реалізовано функцію виштовхування носія" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "для диска не реалізовано операцію «eject» або «eject_with_operation»" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "для диска не реалізовано опитування носія даних" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "для диска не реалізовано функцію запуску" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "для диска не реалізовано функції зупинки" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "У модулі TLS не реалізовано отримання прив'язки TLS" @@ -1427,27 +1462,27 @@ msgstr "Підтримка TLS недоступна" msgid "DTLS support is not available" msgstr "Підтримка DTLS є недоступною" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "Не вдалося опрацювати версію %d кодування GEmblem" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblem" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Не вдалося обробити версію %d кодування GEmblemedIcon" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "Неправильна кількість лексем (%d) у кодуванні GEmblemedIcon" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Очікується GEmblem для GEmblemedIcon" @@ -1455,130 +1490,135 @@ msgstr "Очікується GEmblem для GEmblemedIcon" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "Вкладена точка монтування не існує" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "Не можна копіювати із заміною каталогу" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "Не можна копіювати каталог поверх іншого каталогу" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "Цільовий файл існує" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "Не вдалося скопіювати каталог рекурсивно" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "Підтримки копіювання діапазону файлів не передбачено" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "Помилка при розрізанні файла: %s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "З'єднання не підтримується" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "Копіювання (reflink/clone) між точками монтування не підтримується" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Копіювання (reflink/clone) не підтримується або некоректне" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" "Підтримки копіювання (reflink/clone) не передбачено або копіювання не працює" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "Не вдалося отримати атрибут %s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "Не вдалося скопіювати спеціальний файл" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "Неправильне значення символьного посилання" -#: gio/gfile.c:4324 glib/gfileutils.c:2424 +#: gio/gfile.c:4342 glib/gfileutils.c:2404 msgid "Symbolic links not supported" msgstr "Символічні посилання не підтримуються" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "Смітник не підтримується" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "Назви файлів не можуть містити символу «%c»" -#: gio/gfile.c:7151 gio/gfile.c:7277 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "Не вдалося створити тимчасовий каталог для шаблону «%s»: %s" -#: gio/gfile.c:7595 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "для тому не реалізовано операцію монтування" -#: gio/gfile.c:7709 gio/gfile.c:7786 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "Програм для обробки таких файлів не зареєстровано" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "Лічильник закрито" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "Лічильник файлів має невиконані операції" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "Лічильник файлів вже закритий" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Підтримки версії %d кодування GFileIcon не передбачено" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "Неправильні вхідні дані GFileIcon" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "Для потоку не передбачено підтримки query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "Операція встановлення позиції не підтримується для потоків" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "Операція урізання не підтримується для вхідного потоку" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "Операція урізання не підтримується для потоку" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "Неправильна назва вузла" @@ -1611,64 +1651,64 @@ msgstr "Відповідь HTTP-проксі є надто великою" msgid "HTTP proxy server closed connection unexpectedly." msgstr "Проксі-сервер HTTP несподівано розірвав з'єднання." -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "Неправильна кількість лексем (%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "Відсутній тип назви класу %s" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "Для типу %s не реалізовано інтерфейс GIcon" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "Тип %s не класифікований" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "Неправильний номер версії: %s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Для типу %s не реалізовано from_tokens() у інтерфейсі GIcon" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "Не вдалося обробити вказану версію кодування піктограми" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "Адреса не вказана" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "Значення довжини %u завелике для адреси" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "У адресі встановлені біти поза межами довжини префіксу" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "Не вдалося обробити «%s» як маску IP-адрес" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "Бракує простору для адреси сокету" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "Непідтримувана адреса сокету" @@ -1682,7 +1722,7 @@ msgstr "Для потоку вхідних даних не реалізован #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "Для потоку є незавершена операція" @@ -1698,7 +1738,7 @@ msgstr "Пересунути з файлом" msgid "“version” takes no arguments" msgstr "«version» не потребує параметрів" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "Використання:" @@ -1706,79 +1746,79 @@ msgstr "Використання:" msgid "Print version information and exit." msgstr "Вивести версію та вийти." -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "Команди:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "Об'єднати файли до стандартного виведення" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "Копіювати один або декілька файлів" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "Показати відомості щодо місць" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "Запустити програму з файла desktop" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "Вивести список вмісту місць" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "Отримати або встановити обробник для типу MIME" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "Створити каталоги" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "Стежити за змінами у файлах і каталогах" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "Змонтувати або демонтувати місця" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "Пересунути один або декілька файлів" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "Відкрити файли за допомогою типової програми" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "Перейменувати файл" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "Вилучити один або декілька файлів" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "Прочитати дані зі стандартного джерела даних і зберегти їх" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "Встановити атрибут файла" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "Пересунути файли або каталоги до смітника" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "Вивести список вмісту усіх місць у ієрархії" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "Команди:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "Скористайтеся %s, щоб дізнатися більше.\n" @@ -1788,7 +1828,7 @@ msgid "Error writing to stdout" msgstr "Помилка при записі до стандартного виведення (stdout)" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1811,60 +1851,65 @@ msgstr "" "GIO замість локальних файлів. Наприклад, ви можете вказати як місце\n" "щось таке: smb://сервер/ресурс/файл.txt." -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "Не вказано місць" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "Немає каталогу призначення" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "Показувати поступ" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "Запитувати перед перезаписом" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "Зберегти усі атрибути" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "Створити резервні копії наявних файлів призначення" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "Ніколи не переходити за символічними посиланнями" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "Використовувати типові права доступу для призначення" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "" +"Використовувати типові часові позначки внесення змін до файла для призначення" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Перенесено %s з %s (%s/с)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "ДЖЕРЕЛО" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "ПРИЗНАЧЕННЯ" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Копіювати один або декілька файлів з ДЖЕРЕЛО до ПРИЗНАЧЕННЯ." -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1874,12 +1919,12 @@ msgstr "" "GIO замість локальних файлів. Наприклад, ви можете вказати як місце\n" "щось таке: smb://сервер/ресурс/файл.txt." -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "Призначення %s не є каталогом" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: переписати «%s»? " @@ -1920,52 +1965,52 @@ msgstr "показана назва: %s\n" msgid "edit name: %s\n" msgstr "редагована назва: %s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "назва: %s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "тип: %s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "розмір: " -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "прихований\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "адреса: %s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "локальний шлях: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "точка монтування unix: %s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "Придатні до встановлення атрибути:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "Придатні до запису простори назв атрибутів:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "Показати відомості щодо місць." -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2531,7 +2576,8 @@ msgstr "" "каталог)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "КАТАЛОГ" @@ -2586,6 +2632,10 @@ msgstr "" "Назва C-ідентифікатора, який використовуватиметься для породження " "початкового коду" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "ІДЕНТИФІКАТОР" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "" @@ -2745,7 +2795,8 @@ msgstr " вже вказано" #: gio/glib-compile-schemas.c:607 #, c-format msgid "alias target “%s” is not in enumerated type" -msgstr "призначення альтернативної назви «%s» не належить до нумерованого типу" +msgstr "" +"призначення альтернативної назви «%s» не належить до нумерованого типу" #: gio/glib-compile-schemas.c:608 #, c-format @@ -2778,7 +2829,8 @@ msgstr "" #: gio/glib-compile-schemas.c:828 #, c-format msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" -msgstr "Некоректна назва «%s»: не можна вказувати два дефіси одночасно («--»)." +msgstr "" +"Некоректна назва «%s»: не можна вказувати два дефіси одночасно («--»)." #: gio/glib-compile-schemas.c:837 #, c-format @@ -3092,127 +3144,127 @@ msgstr "Помилка при отриманні відомостей щодо #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "Вкладена точка монтування для файла %s не існує" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "Не можна перейменовувати кореневий каталог" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "Помилка при перейменуванні файла %s: %s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "Не вдалося перейменувати файл, файл із також назвою вже існує" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "Некоректна назва файла" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "Помилка при відкритті файла «%s»: %s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "Помилка під час спроби вилучити файл %s: %s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "Помилка під час спроби надіслати файл %s до смітника: %s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "Помилка при створенні каталогу смітника %s: %s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Не вдалося знайти каталог верхнього рівня для смітника %s" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "Підтримки надсилання до смітника на внутрішніх точках монтування системи не " "передбачено" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "Не вдалося знайти або створити каталог смітника %s для викидання %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "" "Не вдалося створити файл відомостей щодо надсилання до смітника для %s: %s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Не вдалося надіслати файл %s до смітника за межами файлової системи" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "Не вдалося перемістити файл до смітника %s: %s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "Не вдалося перемістити файл до смітника %s" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "Сталася помилка при створенні каталогу «%s»: %s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Файлова система не підтримує символічні посилання" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Помилка при створенні символічного посилання %s: %s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "Помилка при переміщенні файла %s: %s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "Не вдалося перемістити каталог поверх каталогу" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "Помилка при створенні файла резервної копії" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "Помилка при зчитуванні файла призначення: %s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "Переміщення між різними точками монтування не підтримується" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Не вдалося визначити використання диска %s: %s" @@ -3234,121 +3286,121 @@ msgstr "Неправильна назва розширеного атрибут msgid "Error setting extended attribute “%s”: %s" msgstr "Помилка при встановленні розширеного атрибута «%s»: %s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (неправильне кодування)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Помилка при отриманні інформації про файл «%s»: %s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Помилка при отриманні інформації про файловий дескриптор: %s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "Неправильний тип атрибута (очікувався uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "Неправильний тип атрибута (очікувався uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "Неправильний тип атрибута (очікувався рядок байтів)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "Помилка при встановленні прав доступу на символічне посилання" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "Помилка встановлення прав доступу: %s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "Помилка встановлення власник: %s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "символьне посилання не може мати значення NULL" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "Помилка при встановленні символічного посилання: %s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "" "помилка при встановленні символічного посилання: файл не є символічним " "посиланням" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "Зайві наносекунди %d у часовій позначці UNIX %lld є від'ємними" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" "Зайві наносекунди %d у часовій позначці UNIX %lld досягли значення у одну " "секунду" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "Часова позначка UNIX %lld не вкладається у 64 біти" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" "Часова позначка UNIX %lld лежить поза діапазоном, підтримку якого " "передбачено у Windows" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "Назву файла «%s» неможливо перетворити на назву у кодуванні UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "Не вдалося відкрити файл «%s»: помилка Windows %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Помилка при встановленні часу зміни або доступу для файла «%s»: %lu" -#: gio/glocalfileinfo.c:2970 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "Помилка при встановленні часу зміни або доступу: %s" -#: gio/glocalfileinfo.c:2993 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "Контекст SELinux не може значення NULL" -#: gio/glocalfileinfo.c:3000 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "SELinux не увімкнено у цій системі" -#: gio/glocalfileinfo.c:3010 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "Помилка при встановленні контексту SELinux: %s" -#: gio/glocalfileinfo.c:3107 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "Підтримки встановлення атрибута %s не передбачено" @@ -3401,7 +3453,7 @@ msgid "Error truncating file: %s" msgstr "Помилка при обрізанні файла: %s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "Помилка при відкритті файла «%s»: %s" @@ -3423,27 +3475,27 @@ msgstr "Файл був змінений іншою програмою" msgid "Error removing old file: %s" msgstr "Помилка при видаленні старого файла: %s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "Вказано неправильний GSeekType" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "Неправильний тип операції зміни позиції у файлі" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "Не можна усікати GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "Не можна змінювати розмір потоку виводу у пам'ять" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "Помилка при зміні розміру потоку виводу у пам'ять" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" @@ -3451,39 +3503,39 @@ msgstr "" "Кількість пам'яті, потрібна для процесу запису, більша ніж доступний " "адресний простір" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "Виконувати переміщення на початок потоку" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "Виконувати переміщення на кінець потоку" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "для точки монтування не реалізовано операцію «unmount»" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "для точки монтування не реалізовано операцію виштовхування носія" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "У mount не реалізовано функцію «unmount» або «unmount_with_operation»" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "для точки монтування не реалізовано операцію «eject» або " @@ -3492,14 +3544,14 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "для точки монтування не реалізовано «remount»" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "" "для точки монтування не реалізовано автоматичне визначення типу контексту" @@ -3507,22 +3559,22 @@ msgstr "" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "" "для точки монтування не реалізовано автоматичне визначення типу синхронного " "змісту" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "Назва вузла «%s» містить «[», але не містить «]»" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "Мережа недоступна" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "Вузол є недоступним" @@ -3550,7 +3602,7 @@ msgstr "NetworkManager не запущено" msgid "NetworkManager version too old" msgstr "Версія NetworkManager є надто старою" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "У потоці виводу не реалізовано операції запису" @@ -3563,38 +3615,38 @@ msgstr "Сума векторів, яку передано до %s, є надт msgid "Source stream is already closed" msgstr "Вхідний потік вже закритий" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "Невказана помилка при пошуку проксі" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "Помилка перетворення назви на адресу «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s не реалізовано" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "Некоректний домен" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "Ресурсу у «%s» не існує" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "Не вдалося розпакувати ресурс з «%s»" @@ -3612,11 +3664,11 @@ msgstr "Ресурс у «%s» не є каталогом" msgid "Input stream doesn’t implement seek" msgstr "У потоці вхідних даних не передбачено позиціювання" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "Вивести розділи, що містять ресурси у elf-ФАЙЛІ" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3626,15 +3678,15 @@ msgstr "" "Якщо вказано РОЗДІЛ, то виводиться перелік ресурсів лише з цього розділу\n" "Якщо вказано ШЛЯХ, то виводиться перелік ресурсів, що збігаються" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "ФАЙЛ [ШЛЯХ]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "РОЗДІЛ" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3646,15 +3698,15 @@ msgstr "" "Якщо вказано ШЛЯХ, буде виведено список відповідних ресурсів\n" "Додатково буде виведено розділ, розмір і стиснення" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "Витягнути файл ресурсу у stdout" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "ФАЙЛ ШЛЯХ" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3682,7 +3734,7 @@ msgstr "" "Для отримання довідки скористайтеся «gresource help КОМАНДА».\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3697,19 +3749,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " РОЗДІЛ Назва розділу elf (необов'язкова)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " КОМАНДА Команда для пояснення (необов'язковий)\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " ФАЙЛ Файл elf (виконуваний або спільна бібліотека)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3717,20 +3769,20 @@ msgstr "" " ФАЙЛ Файл elf (виконуваний або спільна бібліотека)\n" " або скомпільований файл ресурсів\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[ШЛЯХ]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr "" " ШЛЯХ Шлях ресурсу (необов'язковий, можна вказати лише частину)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "ШЛЯХ" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " ШЛЯХ Шлях ресурсу\n" @@ -3962,222 +4014,222 @@ msgstr "Вказано порожню назву схеми\n" msgid "No such key “%s”\n" msgstr "Немає ключа «%s»\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "Неправильний сокет, не ініціалізований" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Неправильний сокет, помилка ініціалізації через : %s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "Сокет вже закритий" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1445 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "Перевищено час очікування вводу-виводу сокета" -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "створення GSocket з fd: %s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "Не вдалося створити сокет: %s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "Вказано невідому родину" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "Вказано невідомий протокол" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" "Неможливо скористатися операціями із датаграмами на сокеті без датаграм." -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Неможливо скористатися операціями із датаграмами на сокеті із встановленим " "часом очікування." -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "не вдається отримати локальну адресу: %s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "не вдається отримати віддалену адресу: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "не вдається прослухати: %s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "Помилка прив'язування до адреси %s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "Помилка при вступі до мультикастової групи: %s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "Помилка при виході з мультикастової групи: %s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "Відсутня підтримка мультикаста по джерелу" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "Непідтримуване сімейство сокетів" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "source-specific не є адресою IPv4" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "Назва інтерфейсу є надто довгою" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "Не знайдено інтерфейсу: %s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "" "Підтримки специфічної для джерела неспрямованої трансляції для IPv4 не " "передбачено" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "" "Підтримки специфічної для джерела неспрямованої трансляції для IPv6 не " "передбачено" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "Помилка при прийнятті з'єднання: %s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "З'єднання триває" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "Не вдалося отримати помилку очікування: " -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "Помилка при отриманні даних: %s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "Помилка при надсиланні даних: %s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Не вдалося вимкнути сокет: %s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "Помилка при закриванні сокету: %s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "Очікується умова сокету: %s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "Не вдалося надіслати повідомлення: %s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "Вектори повідомлення є надто великими" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "Помилка при надсиланні повідомлення: %s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage не підтримується у windows" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "Помилка при отриманні повідомлення: %s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Не вдалося прочитати повноваження сокета: %s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "Функція g_socket_get_credentials не реалізована у цій ОС" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "Не вдалося під'єднатися до проксі-сервера %s: " -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "Не вдалося під'єднатися до %s: " -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "Не вдалося під'єднатися до: " -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "Підтримки передавання даних за допомогою проксі-сервера через не-TCP " "з'єднання не передбачено." -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "Підтримки протоколу проксі «%s» не передбачено." -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "Прослуховувач з'єднання вже завершився" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "Доданий сокет закритий" @@ -4270,97 +4322,97 @@ msgstr "Проксі SOCKSv5 не підтримує пропонований т msgid "Unknown SOCKSv5 proxy error." msgstr "Невідома помилка проксі SOCKSv5." -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "Помилка створення каналу для обміну з дочірнім процесом (%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "На цій платформі підтримки конвеєрів не передбачено" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Не вдалося обробити версію %d кодування GThemedIcon" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "Не знайдено коректних адрес" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Помилка зворотного визначення назви за адресою «%s»: %s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "" "Помилка під час спроби обробити запис DNS %s: помилкове форматування пакета " "DNS" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Немає запису DNS з запитуваним типом «%s»" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Тимчасово неможливо розв'язати «%s»" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "Помилка при розв'язанні імені «%s»" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "Помилкове форматування пакета DNS" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "Не вдалося обробити відповідь DNS для «%s»: " -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "Не знайдено секретний ключ у форматі PEM" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "Не вдалося розшифрувати секретний ключ у форматі PEM" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "Не вдалося розібрати секретний ключ у форматі PEM" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "Не знайдено сертифікат у форматі PEM" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "Не вдалося розібрати сертифікат у форматі PEM" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "У поточному модулі обробки TLS не передбачено підтримки PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "" "У цьому GTlsBackend не передбачено підтримки створення сертифікатів PKCS #11" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4370,7 +4422,7 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4378,16 +4430,16 @@ msgstr "" "Пароль було декілька разів введено неправильно, після наступних відмов ваш " "доступ буде заблоковано." -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "Уведено неправильний пароль." -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "Підтримки надсилання дескриптора файла не передбачено" # c-format -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" @@ -4395,11 +4447,11 @@ msgstr[0] "Очікується 1 контрольне повідомлення, msgstr[1] "Очікується 1 контрольне повідомлення, отримано %d" msgstr[2] "Очікується 1 контрольне повідомлення, отримано %d" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "Неочікуваний тип допоміжних даних" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" @@ -4407,114 +4459,125 @@ msgstr[0] "Очікується один файловий дескриптор msgstr[1] "Очікується один файловий дескриптор але отримано %d\n" msgstr[2] "Очікується один файловий дескриптор але отримано %d\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "Отримано неправильний fd" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "Підтримки отримання дескриптора файла не передбачено" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "Сталася помилка при відправленні мандату:" -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "Сталася помилка при перевірці вмикання SO_PASSCRED для сокета: %s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "Сталася помилка при вмиканні SO_PASSCRED: %s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" "Очікувалося прочитати один байт ідентифікаційної інформації (credentials), " "але не прочитано жодного байту" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "Контрольне повідомлення не очікувалося, але отримано %d" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "Сталася помилка при вимкненні SO_PASSCRED: %s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Помилка при читанні з файлового дескриптора: %s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "Помилка при закритті файлового дескриптора: %s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "Корінь файлової системи" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Помилка при запису у файловий дескриптор: %s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "" "Абстрактні адреси доменних сокетів UNIX не підтримуються на цій системі" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "для тому не реалізовано операції виштовхування носія" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "" "для тому не реалізовано підтримку виштовхування носія або ж виштовхування з " "операцією" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "В об'єкті програми «%s» немає verbs" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "В об'єкті програми «%s» і обробника «%s» немає verbs" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "Сталася помилка при читанні з дескриптора: %s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "Сталася помилка при закритті дескриптора: %s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "Сталася помилка при запису у дескриптор: %s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "Бракує пам'яті" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "Внутрішня помилка: %s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "Потрібно більше вхідних даних" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "Неправильно стиснені дані" @@ -4542,148 +4605,287 @@ msgstr "Запуск служби dbus" msgid "Wrong args\n" msgstr "Неправильні параметри\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "Не вдалося відкрити «%s»: %s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "Помилка: не вдалося записати усі вихідні дані: %s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "Помилка: не вдалося перейменувати «%s» на «%s»: %s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "Включити каталоги до шляху пошуку GIR" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "Вихідний файл" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "Спільна бібліотека" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "Показувати діагностичні повідомлення" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "Показувати докладні повідомлення" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "Показати дані щодо версії програми і завершити роботу" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "Помилка під час обробки аргументів: %s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "Будь ласка, вкажіть точно один вхідний файл" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "Помилка під час обробки файла «%s»: %s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "Не вдалося побудувати typelib для модуля «%s»" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "Некоректна typelib для модуля «%s»: %s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "Показати усі доступні відомості" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "Не вдалося обробити: %s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "Немає вхідних файлів" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "Не вдалося прочитати «%s»: %s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "Не вдалося створити typelib «%s»: %s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "Не вдалося завантажити typelib: %s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "Попередження: пропущено %u модулів" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "Версія Typelib для вивчення" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "ВЕРСІЯ" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "Список бібліотек спільного користування, яких потребує typelib" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "Список інших typelib, який потребує typelib, що вивчається" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "typelib для вивчення" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "ПРОСТІР_НАЗВ" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- Вивчити typelib GI" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "Не вдалося обробити параметри командного рядка: %s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "Будь ласка, вкажіть точно один простір назв" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "" +"Будь ласка, вкажіть --print-shlibs, --print-typelibs або обидва параметри" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Неочікуваний атрибут «%s» для елемента «%s»" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Атрибута «%s» для елемента «%s» не існує" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Неочікуваний теґ «%s», мало бути використано теґ «%s»" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Неочікуваний теґ «%s» у «%s»" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Некоректний запис дати і часу «%s» у файлі закладок" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "Не вдалося знайти правильний файл закладок у каталогах даних" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Файл закладок для адреси «%s» вже існує" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Не знайдено закладки для адреси «%s»" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Не визначено тип MIME у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Не вказано приватну ознаку у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Не встановлено групи у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Не зареєстровано програму з назвою «%s» для закладки «%s»" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Помилка розгортання рядка виконуваного файла «%s» для адреси «%s»" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "Невідтворюваний символ у вхідних даних перетворення" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "Незавершена символьна послідовність на кінці вводу" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Неможливо коректно перетворити символ «%s» у символ з набору «%s»" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "Вбудований нульовий байт у вхідних даних перетворення" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "Вбудований нульовий байт у результатах перетворення" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "Адреса «%s» не є абсолютною адресою із використанням схеми «file»" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "Некоректна адреса «%s»" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "Неправильна назва вузла в URI «%s»" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "Ідентифікатор URI «%s» містить неправильно екранований символ" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "Шлях «%s» не є абсолютним" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %b %e %H:%M:%S %Y" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%m/%d/%y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4704,62 +4906,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "січень" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "лютий" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "березень" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "квітень" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "травень" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "червень" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "липень" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "серпень" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "вересень" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "жовтень" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "листопад" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "грудень" @@ -4781,132 +4983,132 @@ msgstr "грудень" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "січ" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "лют" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "бер" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "кві" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "тра" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "чер" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "лип" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "серп" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "вер" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "жовт" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "лист" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "груд" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "понеділок" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "вівторок" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "середа" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "четвер" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "п'ятниця" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "субота" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "неділя" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "пн" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "вт" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "ср" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "чт" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "пт" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "сб" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "нд" @@ -4928,62 +5130,62 @@ msgstr "нд" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "січня" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "лютого" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "березня" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "квітня" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "травня" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "червня" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "липня" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "серпня" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "вересня" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "жовтня" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "листопада" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "грудня" @@ -5005,195 +5207,207 @@ msgstr "грудня" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "січ" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "лют" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "бер" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "квіт" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "трав" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "черв" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "лип" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "серп" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "вер" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "жовт" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "лист" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "груд" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "PM" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "Помилка відкривання каталогу «%s»: %s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "Не вдалося виділити %lu байт для зчитування файла «%s»" -msgstr[1] "Не вдалося виділити %lu байтів для зчитування файла «%s»" -msgstr[2] "Не вдалося виділити %lu байтів для зчитування файла «%s»" +msgid "Could not allocate %s to read file “%s”" +msgstr "Не вдалося розмістити у пам'яті %s для читання файла «%s»" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "Помилка при читанні файла «%s»: %s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "Файл «%s» занадто великий" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:825 +msgid "Could not allocate %" +msgid_plural "Could not allocate %" +msgstr[0] "Не вдалося розмістити %" +msgstr[1] "Не вдалося розмістити %" +msgstr[2] "Не вдалося розмістити %" + +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "Помилка зчитування з файла «%s»: %s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1502 +#: glib/gfileutils.c:900 glib/gfileutils.c:975 glib/gfileutils.c:1482 #, c-format msgid "Failed to open file “%s”: %s" msgstr "Не вдалося відкрити файл «%s»: %s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:913 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Помилка отримання атрибутів файла «%s»: помилка fstat(): %s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:944 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Помилка відкривання файла «%s»: помилка fdopen(): %s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1045 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Помилка перейменування файла «%s» на «%s»: помилка g_rename(): %s" -#: glib/gfileutils.c:1209 +#: glib/gfileutils.c:1144 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "Не вдалося записати файл «%s»: збій у функції ftruncate(): %s" + +#: glib/gfileutils.c:1189 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "Не вдалося записати файл «%s»: збій у функції write(): %s" -#: glib/gfileutils.c:1230 +#: glib/gfileutils.c:1210 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Помилка запису у файл «%s»: помилка fsync(): %s" -#: glib/gfileutils.c:1391 glib/gfileutils.c:1808 +#: glib/gfileutils.c:1371 glib/gfileutils.c:1788 #, c-format msgid "Failed to create file “%s”: %s" msgstr "Помилка створення файла «%s»: %s" -#: glib/gfileutils.c:1436 +#: glib/gfileutils.c:1416 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Не вдалося вилучити наявний файл «%s»: помилка g_unlink(): %s" -#: glib/gfileutils.c:1773 +#: glib/gfileutils.c:1753 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Шаблон «%s» неправильний, бо не може містити «%s»" -#: glib/gfileutils.c:1786 +#: glib/gfileutils.c:1766 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Шаблон «%s» не містить XXXXXX" -#: glib/gfileutils.c:2380 glib/gfileutils.c:2409 +#: glib/gfileutils.c:2360 glib/gfileutils.c:2389 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "Помилка читання символічного посилання «%s»: %s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Не вдалося відкрити модуль перетворення з «%s» у «%s»: %s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Не вдалося виконати безпосереднє зчитування у функції " "g_io_channel_read_line_string" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "В буфері зчитування лишились не перетворені дані" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "Канал завершується на неповному символі" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" "Не можна виконувати безпосереднє зчитування у функції " "g_io_channel_read_to_end" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "Не вдалося знайти правильний ключовий файл у каталогах ключів" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "Не є звичайним файлом" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" @@ -5201,52 +5415,52 @@ msgstr "" "Файл ключа містить рядок «%s», який не є парою ключ-значення, групою або " "коментарем" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "Неправильна назва групи: %s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "Ключовий файл не починається з групи" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "Неправильна назва ключа: %.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "Файл ключа містить кодування, підтримки якого не передбачено — «%s»" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "Файл ключа не містить групи «%s»" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "Файл ключа не містить ключ «%s» у групі «%s»" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" "Файл ключа містить ключ «%s» зі значенням «%s», кодування якого не є " "кодуванням UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" "Ключ «%s» з файла ключів містить значення, яке не вдається проаналізувати." -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " @@ -5255,36 +5469,36 @@ msgstr "" "Файл ключів містить ключ «%s» у групі «%s», значення якого не вдалося " "розпізнати." -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Значення ключа «%s» у групі «%s» дорівнює «%s», але очікувалося «%s»" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "Ключовий файл містить escape-символ наприкінці рядка" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Файл ключа містить неправильну послідовність екранування «%s»" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Не вдалося розібрати значення «%s» як число." -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "Числове ціле значення «%s» поза межами діапазону" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Значення «%s» не вдалося перетворити на число з рухомою комою." -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Не вдалося обробити значення «%s» як логічне значення." @@ -5305,32 +5519,32 @@ msgstr "Не вдалося показати файл «%s%s%s%s»: збій у msgid "Failed to open file “%s”: open() failed: %s" msgstr "Помилка відкривання файла «%s»: помилка open(): %s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "Помилка в рядку %d на символі %d: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Некоректний текст у кодуванні UTF-8 у назві — не є коректним «%s»" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "«%s» не є коректною назвою" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "«%s» не є коректною назвою: «%c»" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "Помилка в рядку %d: %s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5339,7 +5553,7 @@ msgstr "" "Помилка аналізу виразу «%-.*s», де має бути число у символічному посиланні " "(наприклад, ê). Можливо, число є надто великим." -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5348,24 +5562,24 @@ msgstr "" "Посилання на символ не закінчується крапкою з комою, схоже символ \"&\" було " "використано не для позначення початку предиката – екрануйте його як &." -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Посилання на символ «%-.*s» не визначає жоден дозволений символ" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" "Виявлено порожній предикат «&;»; допустимими предикатами є: & " " "< > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "Назва предиката «%-.*s» є невідомою програмі" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5373,11 +5587,11 @@ msgstr "" "Предикат не закінчується крапкою з комою; очевидно, що символ & було " "використано не для позначення початку предиката – екрануйте його як &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "Документ має починатися з елемента (наприклад, )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5386,7 +5600,7 @@ msgstr "" "Символ «%s» не можна вживати після символу «<», він не може починати назву " "елемента" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5395,12 +5609,12 @@ msgstr "" "Зайвий символ «%s», очікувався символ «>» для закриття теґу порожнього " "елементу «%s»" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "Забагато атрибутів у елементі «%s»" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5408,7 +5622,7 @@ msgstr "" "Зайвий символ «%s», очікувався символ «=» після назви ознаки «%s» елемента " "«%s»" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5419,7 +5633,7 @@ msgstr "" "теґу елемента «%s», чи додаткова ознака; можливо, було використано " "неприпустимий символ в назві ознаки" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5428,7 +5642,7 @@ msgstr "" "Зайвий символ «%s», мало бути вказано початкові лапки після знаку рівності " "на присвоєнні значення ознаці «%s» елемента «%s»" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “»" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Було закрито не відкритий елемент «%s»" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Було закрито елемент «%s», але зараз відрито елемент «%s»" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "Документ порожній чи містить лише пропуски" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" -msgstr "Документ раптово закінчився відразу після початкової кутової дужки «<»" +msgstr "" +"Документ раптово закінчився відразу після початкової кутової дужки «<»" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5473,7 +5688,7 @@ msgstr "" "Документ раптово закінчився, коли деякі елементи ще були відкритими – «%s» " "був останнім відкритим елементом" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5482,19 +5697,19 @@ msgstr "" "Документ раптово закінчився, очікувалась кінцева кутова дужка для закриття " "теґу <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "Документ раптово закінчився посеред назви елемента" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "Документ раптово закінчився посеред назви ознаки" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Документ раптово закінчився у середині теґу, що відкривав елемент" -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5502,261 +5717,263 @@ msgstr "" "Документ раптово закінчився після знака рівності, що йшов за назвою ознаки; " "значення ознаки не вказано" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Документ раптово закінчився посеред значення ознаки" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Документ раптово закінчився у середині теґу, що закривав елемент «%s»" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Документ раптово закінчився у середині теґу для невідкритого елемента" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" -msgstr "Документ раптово закінчився у середині коментарю чи інструкції обробки" +msgstr "" +"Документ раптово закінчився у середині коментарю чи інструкції обробки" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[ПАРАМЕТР…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "Параметри довідки:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "Показати параметри довідки" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "Показати усі параметри довідки" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "Параметри програми:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "Параметри:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Не вдалося розібрати числове ціле значення «%s» для %s" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Числове ціле значення «%s» для %s поза межами діапазону" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Не вдалося розібрати числове значення подвійної точності «%s» для %s" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Числове значення подвійної точності «%s» для %s поза межами діапазону" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "Помилка розбору параметра %s" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "Відсутній аргумент %s" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "Невідомий параметр %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "пошкоджений об'єкт" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "недостатньо пам'яті" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "внутрішня помилка" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "" "шаблон містить елементи, які не підтримуються при пошуку часткової " "відповідності" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "" "умови у вигляді зворотних посилань при пошуку часткової відповідності не " "підтримуються" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "досягнуто межу рекурсії" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "неправильне зміщення" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "зациклювання рекурсії" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" -msgstr "надійшов запит щодо режиму відповідності, який не було зібрано для JIT" +msgstr "" +"надійшов запит щодо режиму відповідності, який не було зібрано для JIT" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "невідома помилка" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ наприкінці шаблону" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "\\c наприкінці шаблону" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "нерозпізнаний символ слідує за \\" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "неправильний порядок чисел у специфікаторі {}" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "надто велике число у специфікаторі {}" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "відсутній завершальний символ ] для класу символів" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "Неправильна escape-послідовність у класі символів" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "неправильний порядок у діапазоні у класі символів" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "немає що повторювати" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "нерозпізнаний символ після (? або (?-" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "назви класів у стилі POSIX підтримуються лише у межах класі" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "елементи порівняння у стилі POSIX не підтримуються" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "відсутній завершальний символ )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "посилання на вкладений шаблон, якого не існує" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "відсутня дужка ) після коментаря" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "задовгий регулярний вираз" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "неправильне число або назва після (?(" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "твердження lookbehind має не фіксовану довжину" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "група умови містить більше ніж дві гілки" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "після (?( очікується твердження" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "номерне посилання не може бути нулем" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "невідома POSIX-назва класу" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "значення символу у послідовності \\x{...} надто велике" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "\\C неприпустимий у твердженні lookbehind" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "відсутній завершальний символ у назві вкладеного шаблону" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "два іменовані вкладені шаблони мають однакову назву" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "неправильна послідовність \\P чи \\p" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "невідома назва властивості після \\P чи \\p" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "вкладена назва шаблону надто довга (максимум 32 символів)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "надто багато іменованих вкладених шаблонів (максимум 10,000)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "вісімкове значення більше ніж \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "група DEFINE містить більш ніж одну гілку" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "неузгоджені параметри NEWLINE" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" @@ -5764,235 +5981,235 @@ msgstr "" "\\g не супроводжується назвою або числом у дужках, кутових дужках або " "лапках, або просто числом" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "не можна вказувати параметр для (*ACCEPT), (*FAIL) або (*COMMIT)" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "значення (*VERB) не розпізнано" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "завелике число" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "немає назви підшаблону після (?&" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "" "не припускається використовувати різні імена для підшаблонів з однаковим " "номером" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "для (*MARK) потрібен параметр" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "за \\з повинен бути символ ASCII" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "за \\k не слідує назва у дужках, кутових дужках або лапках" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "\\N у класі не підтримується" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "задовга назва у (*MARK), (*PRUNE), (*SKIP) або (*THEN)" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "переповнення коду" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "нерозпізнаний символ після (?P" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "переповнення при компіляції робочого простору" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "" "раніше перевірений вкладений шаблон, на який йде посилання не знайдений" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "Помилка під час пошуку відповідності регулярному виразу %s: %s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "Бібліотека PCRE не підтримує UTF8" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "Бібліотека PCRE зібрана з несумісними параметрами" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "Помилка при компіляції регулярного виразу «%s» на символі %s: %s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "мало бути використано шістнадцяткову цифру або символ «}»" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "очікується шістнадцяткова цифра" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "у символічному посиланні пропущено «<»" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "незакінчене символьне посилання" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "символьне посилання нульової довжини" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "очікується цифра" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "некоректне символьне посилання" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "відкидати кінцеві «\\»" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "невідома escape-послідовність" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" "Під час розбору тексту заміни «%s» сталася помилка у символі з номером %lu: " "%s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Текст в лапках не починається з лапок" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "Невідповідні лапки у командному рядку чи іншому тексті оболонки" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Текст закінчився перед символом «\\». (Текст був таким: «%s»)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Текст закінчився перед відповідними лапками для %c. (Текст був таким: «%s»)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "Текст порожній (чи містить лише пропуски)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Помилка зчитування даних з дочірнього процесу (%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Неочікувана помилка під час читання даних з дочірнього процесу (%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Неочікувана помилка у waitpid() (%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "Дочірній процес закінчився з кодом %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "Дочірній процес вбитий за сигналом %ld" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "Дочірній процес зупинений за сигналом %ld" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "Дочірній процес аварійно закінчив роботу" -#: glib/gspawn.c:2039 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Помилка зчитування з дочірнього каналу (%s)" -#: glib/gspawn.c:2411 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Не вдалося запустити дочірній процес «%s» (%s)" -#: glib/gspawn.c:2537 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "Помилка створення процесу (%s)" -#: glib/gspawn.c:2697 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Не вдалося змінити каталог на «%s» (%s)" -#: glib/gspawn.c:2707 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Не вдалося виконати дочірній процес «%s» (%s)" -#: glib/gspawn.c:2717 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "Не вдалося відкрити файл для зміни прив'язки дескриптора файла (%s)" -#: glib/gspawn.c:2725 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "Не вдалося здублювати дескриптор файла для дочірнього процесу (%s)" -#: glib/gspawn.c:2734 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "Помилка запуску дочірнього процесу (%s)" -#: glib/gspawn.c:2742 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "Не вдалося закрити дескриптор файла для дочірнього процесу (%s)" -#: glib/gspawn.c:2750 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Невідома помилка виконання дочірнього процесу «%s»" -#: glib/gspawn.c:2774 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Не вдалося зчитати достатню кількість даних з дочірнього каналу (%s)" @@ -6049,78 +6266,78 @@ msgstr "" "Неочікувана помилка в зчитуванні даних з дочірнього процесу через " "g_io_channel_win32_poll() " -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "Порожній рядок не є числом" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» не є числом зі знаком" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Число «%s» не належить до діапазону [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» не є числом без знаку" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "Некоректне %-eкодування в адресі" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "Некоректний символ в адресі" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "Символи поза UTF-8 в адресі" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "Некоректна IPv6-адреса «%.*s» в адресі" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "Помилкове кодування IP-адреси «%.*s» в адресі" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "Назва вузла із некоректними символами «%.*s» у адресі" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "Не вдалося обробити запис порту «%.*s» в адресі" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "Порт «%.*s» в адресі не належить до припустимого діапазону" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "Адреса «%s» не є абсолютною адресою" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "В адресі «%s» немає компонента вузла" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "Адреса не є абсолютною, і не вказано базової адреси" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "Пропущено «=» і значення параметра" @@ -6201,65 +6418,65 @@ msgstr "ПіБ" msgid "EiB" msgstr "ЕіБ" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" -msgstr "кб" +msgid "kbit" +msgstr "кбіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" -msgstr "Мб" +msgid "Mbit" +msgstr "Мбіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" -msgstr "Гб" +msgid "Gbit" +msgstr "Гбіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" -msgstr "Тб" +msgid "Tbit" +msgstr "Тбіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" -msgstr "Пб" +msgid "Pbit" +msgstr "Пбіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" -msgstr "Еб" +msgid "Ebit" +msgstr "Ебіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" -msgstr "Кіб" +msgid "Kibit" +msgstr "Кібіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" -msgstr "Міб" +msgid "Mibit" +msgstr "Мібіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" -msgstr "Гіб" +msgid "Gibit" +msgstr "Гібіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" -msgstr "Тіб" +msgid "Tibit" +msgstr "Тібіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" -msgstr "Піб" +msgid "Pibit" +msgstr "Пібіт" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" -msgstr "Еіб" +msgid "Eibit" +msgstr "Еібіт" #: glib/gutils.c:3056 msgid "byte" @@ -6369,6 +6586,48 @@ msgstr "%.1f ПБ" msgid "%.1f EB" msgstr "%.1f ЕБ" +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "" +#~ "Повідомлення METHOD_RETURN: немає поля заголовка REPLY_SERIAL або це поле " +#~ "є некоректним" + +#~ msgid "kb" +#~ msgstr "кб" + +#~ msgid "Mb" +#~ msgstr "Мб" + +#~ msgid "Gb" +#~ msgstr "Гб" + +#~ msgid "Tb" +#~ msgstr "Тб" + +#~ msgid "Pb" +#~ msgstr "Пб" + +#~ msgid "Eb" +#~ msgstr "Еб" + +#~ msgid "Kib" +#~ msgstr "Кіб" + +#~ msgid "Mib" +#~ msgstr "Міб" + +#~ msgid "Gib" +#~ msgstr "Гіб" + +#~ msgid "Tib" +#~ msgstr "Тіб" + +#~ msgid "Pib" +#~ msgstr "Піб" + +#~ msgid "Eib" +#~ msgstr "Еіб" + #~ msgid "backtracking limit reached" #~ msgstr "закінчилося обмеження зворотного ходу" diff --git a/po/zh_CN.po b/po/zh_CN.po index 87123aa..049a922 100644 --- a/po/zh_CN.po +++ b/po/zh_CN.po @@ -18,22 +18,22 @@ # Mingcong Bai , 2015, 2016, 2018. # Dingzhong Chen , 2018-2021. # Nanling , 2023. -# lumingzh , 2022-2023. +# lumingzh , 2022-2024. # msgid "" msgstr "" "Project-Id-Version: glib master\n" -"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2023-09-12 10:26+0000\n" -"PO-Revision-Date: 2023-09-15 10:36+0800\n" +"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n" +"POT-Creation-Date: 2024-03-01 12:22+0000\n" +"PO-Revision-Date: 2024-03-03 17:56+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese - China \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.3.2\n" +"Plural-Forms: nplurals=1; plural=0\n" +"X-Generator: Gtranslator 45.3\n" #: gio/gappinfo.c:339 msgid "Setting default applications not supported yet" @@ -53,36 +53,40 @@ msgstr "无法找到处理内容类型“%s”的默认应用程序" msgid "Failed to find default application for URI Scheme ‘%s’" msgstr "无法找到处理 URI Scheme“%s”的默认应用程序" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "GApplication Options:" msgstr "GApplication 选项:" -#: gio/gapplication.c:506 +#: gio/gapplication.c:507 msgid "Show GApplication options" msgstr "显示 GApplication 选项" -#: gio/gapplication.c:551 +#: gio/gapplication.c:552 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "进入 GApplication 服务模式(从 D-Bus 服务文件中调用)" -#: gio/gapplication.c:563 +#: gio/gapplication.c:564 msgid "Override the application’s ID" msgstr "覆盖应用程序 ID" #: gio/gapplication.c:575 +msgid "Print the application version" +msgstr "打印应用程序版本" + +#: gio/gapplication.c:587 msgid "Replace the running instance" msgstr "替代运行中的实例" -#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:229 -#: gio/gresource-tool.c:496 gio/gsettings-tool.c:586 +#: gio/gapplication-tool.c:47 gio/gapplication-tool.c:48 gio/gio-tool.c:230 +#: gio/gresource-tool.c:497 gio/gsettings-tool.c:586 msgid "Print help" msgstr "打印帮助" -#: gio/gapplication-tool.c:49 gio/gresource-tool.c:497 gio/gresource-tool.c:565 +#: gio/gapplication-tool.c:49 gio/gresource-tool.c:498 gio/gresource-tool.c:566 msgid "[COMMAND]" msgstr "[命令]" -#: gio/gapplication-tool.c:51 gio/gio-tool.c:230 +#: gio/gapplication-tool.c:51 gio/gio-tool.c:231 msgid "Print version" msgstr "打印版本" @@ -135,7 +139,7 @@ msgid "APPID" msgstr "应用ID" #: gio/gapplication-tool.c:74 gio/gapplication-tool.c:137 gio/gdbus-tool.c:108 -#: gio/gio-tool.c:226 +#: gio/gio-tool.c:259 gio/glib-compile-resources.c:834 msgid "COMMAND" msgstr "命令" @@ -147,9 +151,13 @@ msgstr "要打印其详细帮助的命令" msgid "Application identifier in D-Bus format (eg: org.example.viewer)" msgstr "D-Bus 格式的应用程序标识符(比如:org.example.viewer)" +#. Translators: commandline placeholder #: gio/gapplication-tool.c:76 gio/glib-compile-resources.c:822 #: gio/glib-compile-resources.c:828 gio/glib-compile-resources.c:858 -#: gio/gresource-tool.c:503 gio/gresource-tool.c:569 +#: gio/gresource-tool.c:504 gio/gresource-tool.c:570 +#: girepository/compiler/compiler.c:148 girepository/compiler/compiler.c:149 +#: girepository/compiler/compiler.c:168 girepository/decompiler/decompiler.c:52 +#: girepository/decompiler/decompiler.c:65 msgid "FILE" msgstr "文件" @@ -173,7 +181,7 @@ msgstr "参数" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "可选的操作调用参数,GVariant 格式" -#: gio/gapplication-tool.c:100 gio/gresource-tool.c:534 +#: gio/gapplication-tool.c:100 gio/gresource-tool.c:535 #: gio/gsettings-tool.c:678 #, c-format msgid "" @@ -187,12 +195,12 @@ msgstr "" msgid "Usage:\n" msgstr "用法:\n" -#: gio/gapplication-tool.c:118 gio/gresource-tool.c:559 +#: gio/gapplication-tool.c:118 gio/gresource-tool.c:560 #: gio/gsettings-tool.c:713 msgid "Arguments:\n" msgstr "参数:\n" -#: gio/gapplication-tool.c:137 gio/gio-tool.c:226 +#: gio/gapplication-tool.c:137 gio/gio-tool.c:259 msgid "[ARGS…]" msgstr "[参数…]" @@ -285,78 +293,78 @@ msgstr "" "未识别的命令:%s\n" "\n" -#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500 +#: gio/gbufferedinputstream.c:421 gio/gbufferedinputstream.c:499 #: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651 -#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052 -#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293 +#: gio/ginputstream.c:1056 gio/goutputstream.c:227 gio/goutputstream.c:1052 +#: gio/gpollableinputstream.c:217 gio/gpollableoutputstream.c:289 #, c-format msgid "Too large count value passed to %s" msgstr "传递给 %s 的计数值太大" -#: gio/gbufferedinputstream.c:893 gio/gbufferedoutputstream.c:577 -#: gio/gdataoutputstream.c:564 +#: gio/gbufferedinputstream.c:892 gio/gbufferedoutputstream.c:579 +#: gio/gdataoutputstream.c:557 msgid "Seek not supported on base stream" msgstr "基流不支持定位" -#: gio/gbufferedinputstream.c:940 +#: gio/gbufferedinputstream.c:939 msgid "Cannot truncate GBufferedInputStream" msgstr "无法截断 GBufferedInputStream" -#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302 +#: gio/gbufferedinputstream.c:984 gio/ginputstream.c:1246 gio/giostream.c:317 #: gio/goutputstream.c:2208 msgid "Stream is already closed" msgstr "流已经关闭" -#: gio/gbufferedoutputstream.c:614 gio/gdataoutputstream.c:594 +#: gio/gbufferedoutputstream.c:616 gio/gdataoutputstream.c:587 msgid "Truncate not supported on base stream" msgstr "基流不支持截断" -#: gio/gcancellable.c:326 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1434 -#: gio/gsimpleasyncresult.c:873 gio/gsimpleasyncresult.c:899 +#: gio/gcancellable.c:326 gio/gdbusconnection.c:1844 gio/gdbusprivate.c:1434 +#: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" msgstr "操作被取消" -#: gio/gcharsetconverter.c:262 +#: gio/gcharsetconverter.c:272 msgid "Invalid object, not initialized" msgstr "无效的对象,未初始化" -#: gio/gcharsetconverter.c:283 gio/gcharsetconverter.c:311 +#: gio/gcharsetconverter.c:293 gio/gcharsetconverter.c:321 msgid "Incomplete multibyte sequence in input" msgstr "输入中有不完整的多字节序列" -#: gio/gcharsetconverter.c:317 gio/gcharsetconverter.c:326 +#: gio/gcharsetconverter.c:327 gio/gcharsetconverter.c:336 msgid "Not enough space in destination" msgstr "目标位置没有足够的空间" -#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850 -#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882 -#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478 +#: gio/gcharsetconverter.c:354 gio/gdatainputstream.c:842 +#: gio/gdatainputstream.c:1260 glib/gconvert.c:360 glib/gconvert.c:792 +#: glib/giochannel.c:1565 glib/giochannel.c:1607 glib/giochannel.c:2467 #: glib/gutf8.c:958 glib/gutf8.c:1412 msgid "Invalid byte sequence in conversion input" msgstr "转换输入中有无效的字符序列" -#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796 -#: glib/giochannel.c:1583 glib/giochannel.c:2493 +#: gio/gcharsetconverter.c:359 glib/gconvert.c:368 glib/gconvert.c:706 +#: glib/giochannel.c:1572 glib/giochannel.c:2482 #, c-format msgid "Error during conversion: %s" msgstr "转换过程中出错:%s" -#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164 +#: gio/gcharsetconverter.c:457 gio/gsocket.c:1217 msgid "Cancellable initialization not supported" msgstr "不支持可撤销的初始化" -#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404 +#: gio/gcharsetconverter.c:468 glib/gconvert.c:233 glib/giochannel.c:1393 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "不支持从字符集“%s”到“%s”的转换" -#: gio/gcharsetconverter.c:462 glib/gconvert.c:327 +#: gio/gcharsetconverter.c:472 glib/gconvert.c:237 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "无法打开从“%s”到“%s”的转换器" -#: gio/gcontenttype.c:472 +#: gio/gcontenttype.c:470 #, c-format msgid "%s type" msgstr "%s 类型" @@ -370,204 +378,204 @@ msgstr "未知类型" msgid "%s filetype" msgstr "%s 文件类型" -#: gio/gcredentials.c:337 +#: gio/gcredentials.c:327 msgid "GCredentials contains invalid data" msgstr "GCredentials 包含无效数据" -#: gio/gcredentials.c:397 gio/gcredentials.c:688 +#: gio/gcredentials.c:387 gio/gcredentials.c:678 msgid "GCredentials is not implemented on this OS" msgstr "此操作系统上没有实现 GCredentials" -#: gio/gcredentials.c:552 gio/gcredentials.c:570 +#: gio/gcredentials.c:542 gio/gcredentials.c:560 msgid "There is no GCredentials support for your platform" msgstr "您的平台尚不支持 GCredentials" -#: gio/gcredentials.c:628 +#: gio/gcredentials.c:618 msgid "GCredentials does not contain a process ID on this OS" msgstr "此操作系统上的 GCredentials 未包含一个进程 ID" -#: gio/gcredentials.c:682 +#: gio/gcredentials.c:672 msgid "Credentials spoofing is not possible on this OS" msgstr "此操作系统上无法进行证书欺骗" -#: gio/gdatainputstream.c:306 +#: gio/gdatainputstream.c:298 msgid "Unexpected early end-of-stream" msgstr "非预期的过早的流结束符" -#: gio/gdbusaddress.c:168 gio/gdbusaddress.c:240 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:165 gio/gdbusaddress.c:237 gio/gdbusaddress.c:324 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "地址条目“%2$s”中有未支持的键“%1$s”" -#: gio/gdbusaddress.c:181 +#: gio/gdbusaddress.c:178 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "地址条目“%s”中有无意义的键/值对组合" -#: gio/gdbusaddress.c:190 +#: gio/gdbusaddress.c:187 #, c-format msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" msgstr "地址“%s”无效(需要指定一个且仅一个的路径、目录、临时目录或抽象键)" -#: gio/gdbusaddress.c:255 gio/gdbusaddress.c:266 gio/gdbusaddress.c:281 -#: gio/gdbusaddress.c:342 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:252 gio/gdbusaddress.c:263 gio/gdbusaddress.c:278 +#: gio/gdbusaddress.c:339 gio/gdbusaddress.c:350 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "地址“%s”中有错误——\"%s\"属性格式错误" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:682 +#: gio/gdbusaddress.c:420 gio/gdbusaddress.c:679 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "传输“%s”对于地址“%s”未知或不支持" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:464 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "地址元素“%s”未包含冒号(:)" -#: gio/gdbusaddress.c:476 +#: gio/gdbusaddress.c:473 #, c-format msgid "Transport name in address element “%s” must not be empty" msgstr "地址元素“%s”中的传输名称不能为空" -#: gio/gdbusaddress.c:497 +#: gio/gdbusaddress.c:494 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" msgstr "地址元素“%3$s”中的第 %1$d 个键/值对 “%2$s”未包含等号" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:505 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "地址元素“%3$s”中的第 %1$d 个键/值对 “%2$s”不能有空的键" # 改掉顿号,因其不是并列关系 -#: gio/gdbusaddress.c:522 +#: gio/gdbusaddress.c:519 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" msgstr "在地址元素“%3$s”中,对键/值对 %1$d,“%2$s”取消转义键或值时出错" -#: gio/gdbusaddress.c:590 +#: gio/gdbusaddress.c:587 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" msgstr "地址“%s”中有错误——UNIX 传输需要“path”或“abstract”之一的键被设置" -#: gio/gdbusaddress.c:625 +#: gio/gdbusaddress.c:622 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "地址“%s”中有错误——主机属性丢失或格式错误" -#: gio/gdbusaddress.c:639 +#: gio/gdbusaddress.c:636 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "地址“%s”中有错误——端口属性丢失或格式错误" -#: gio/gdbusaddress.c:653 +#: gio/gdbusaddress.c:650 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "地址“%s”中有错误——临时文件属性丢失或格式错误" -#: gio/gdbusaddress.c:674 +#: gio/gdbusaddress.c:671 msgid "Error auto-launching: " msgstr "自动启动出错:" -#: gio/gdbusaddress.c:727 +#: gio/gdbusaddress.c:724 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "打开临时文件“%s”时出错:%s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:743 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "读取临时文件“%s”时出错:%s" -#: gio/gdbusaddress.c:755 +#: gio/gdbusaddress.c:752 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "读取临时文件“%s”时出错,预计 16 个字节,得到 %d 个" -#: gio/gdbusaddress.c:773 +#: gio/gdbusaddress.c:770 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "写入临时文件“%s”的内容到流时出错:" -#: gio/gdbusaddress.c:988 +#: gio/gdbusaddress.c:985 msgid "The given address is empty" msgstr "给定的地址为空" -#: gio/gdbusaddress.c:1101 +#: gio/gdbusaddress.c:1098 #, c-format msgid "Cannot spawn a message bus when AT_SECURE is set" msgstr "无法在已设置 AT_SECURE 时启动一条消息总线" -#: gio/gdbusaddress.c:1108 +#: gio/gdbusaddress.c:1105 msgid "Cannot spawn a message bus without a machine-id: " msgstr "无法在无机器 ID 时生成一条消息总线:" -#: gio/gdbusaddress.c:1115 +#: gio/gdbusaddress.c:1112 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "无法在没有 X11 $DISPLAY 的情况下自动启动 D-Bus" -#: gio/gdbusaddress.c:1157 +#: gio/gdbusaddress.c:1154 #, c-format msgid "Error spawning command line “%s”: " msgstr "生成并运行命令行“%s”时出错:" -#: gio/gdbusaddress.c:1226 +#: gio/gdbusaddress.c:1223 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "无法确定会话总线地址(尚未在此操作系统上实现)" -#: gio/gdbusaddress.c:1380 gio/gdbusconnection.c:7339 +#: gio/gdbusaddress.c:1377 gio/gdbusconnection.c:7339 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" msgstr "无法从 DBUS_STARTER_BUS_TYPE 环境变量确定总线地址——未知的值“%s”" -#: gio/gdbusaddress.c:1389 gio/gdbusconnection.c:7348 +#: gio/gdbusaddress.c:1386 gio/gdbusconnection.c:7348 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" msgstr "无法确定总线地址,因为环境变量 DBUS_STARTER_BUS_TYPE 未设置" -#: gio/gdbusaddress.c:1399 +#: gio/gdbusaddress.c:1396 #, c-format msgid "Unknown bus type %d" msgstr "未知的总线类型 %d" -#: gio/gdbusauth.c:294 +#: gio/gdbusauth.c:292 msgid "Unexpected lack of content trying to read a line" msgstr "试图读取一行时,异常地缺失内容" -#: gio/gdbusauth.c:338 +#: gio/gdbusauth.c:336 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "试图(安全地)读取一行时,异常地缺失内容" -#: gio/gdbusauth.c:482 +#: gio/gdbusauth.c:480 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "用尽了所有可用的认证机制(已尝试:%s)(可用的:%s)" -#: gio/gdbusauth.c:1045 +#: gio/gdbusauth.c:1043 msgid "Unexpected lack of content trying to read a byte" msgstr "试图读取一个字节时异常地缺少内容" -#: gio/gdbusauth.c:1195 +#: gio/gdbusauth.c:1193 msgid "User IDs must be the same for peer and server" msgstr "对等端和服务器端的用户 ID 必须相同" -#: gio/gdbusauth.c:1207 +#: gio/gdbusauth.c:1205 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "通过 GDBusAuthObserver::authorize-authenticated-peer 取消" @@ -587,13 +595,13 @@ msgstr "目录“%s”权限错误。期望 0700,得到 0%o" msgid "Error creating directory “%s”: %s" msgstr "创建目录“%s”时出错:%s" -#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340 -#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829 -#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089 -#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970 -#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654 -#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090 -#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453 +#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1105 gio/gfile.c:1343 +#: gio/gfile.c:1481 gio/gfile.c:1718 gio/gfile.c:1773 gio/gfile.c:1831 +#: gio/gfile.c:1915 gio/gfile.c:1972 gio/gfile.c:2036 gio/gfile.c:2091 +#: gio/gfile.c:3969 gio/gfile.c:4108 gio/gfile.c:4515 gio/gfile.c:4980 +#: gio/gfile.c:5392 gio/gfile.c:5477 gio/gfile.c:5567 gio/gfile.c:5664 +#: gio/gfile.c:5751 gio/gfile.c:5850 gio/gfile.c:9004 gio/gfile.c:9094 +#: gio/gfile.c:9178 gio/win32/gwinhttpfile.c:453 msgid "Operation not supported" msgstr "不支持该操作" @@ -654,15 +662,15 @@ msgstr "打开钥匙环“%s”以写入时出错:" msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(此外,解除“%s”的锁定也失败了:%s) " -#: gio/gdbusconnection.c:590 gio/gdbusconnection.c:2415 +#: gio/gdbusconnection.c:585 gio/gdbusconnection.c:2392 msgid "The connection is closed" msgstr "连接已关闭" -#: gio/gdbusconnection.c:1899 +#: gio/gdbusconnection.c:1876 msgid "Timeout was reached" msgstr "已到超时限制" -#: gio/gdbusconnection.c:2538 +#: gio/gdbusconnection.c:2515 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "构建客户端连接时遇到不支持的标志" @@ -749,52 +757,67 @@ msgstr "已经为 %s 导出一个子树" msgid "Object does not exist at path “%s”" msgstr "对象在路径“%s”处不存在" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1351 +#, c-format +msgid "%s message: %s header field is invalid; expected a value of type ‘%s’" +msgstr "%s消息:%s首部字段无效;预期值为“%s”" + +#: gio/gdbusmessage.c:1374 +#, c-format +msgid "%s message: %s header field is missing or invalid" +msgstr "%s消息:%s首部字段缺失或无效" + +#: gio/gdbusmessage.c:1413 +#, c-format +msgid "%s message: INVALID header field supplied" +msgstr "%s消息:提供了无效的首部字段" + +#: gio/gdbusmessage.c:1424 +#, c-format +msgid "" +"%s message: PATH header field is using the reserved value /org/freedesktop/" +"DBus/Local" +msgstr "%s消息:PATH 首部字段正在使用保留值 /org/freedesktop/DBus/Local" + +#: gio/gdbusmessage.c:1437 +#, c-format +msgid "" +"%s message: INTERFACE header field does not contain a valid interface name" +msgstr "%s消息:INTERFACE 首部字段不包含有效的接口名称" + +#: gio/gdbusmessage.c:1446 +#, c-format +msgid "" +"%s message: INTERFACE header field is using the reserved value org." +"freedesktop.DBus.Local" +msgstr "%s消息:INTERFACE 首部字段正在使用保留值 org.freedesktop.DBus.Local" + +#: gio/gdbusmessage.c:1459 +#, c-format +msgid "%s message: MEMBER header field does not contain a valid member name" +msgstr "%s消息:MEMBER 首部字段不包含有效的成员名称" + +#: gio/gdbusmessage.c:1472 +#, c-format +msgid "%s message: ERROR_NAME header field does not contain a valid error name" +msgstr "%s消息:ERROR_NAME 首部字段不包含有效的错误名称" + +#: gio/gdbusmessage.c:1511 msgid "type is INVALID" msgstr "类型无效" -#: gio/gdbusmessage.c:1324 -msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid" -msgstr "METHOD_CALL 消息:PATH 或 MEMBER 首部字段缺失或无效" - -#: gio/gdbusmessage.c:1340 -msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" -msgstr "METHOD_RETURN 消息:REPLY_SERIAL 首部字段缺失或无效" - -#: gio/gdbusmessage.c:1360 -msgid "" -"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid" -msgstr "错误消息:REPLY_SERIAL 或 ERROR_NAME 首部字段缺失或无效" - -#: gio/gdbusmessage.c:1384 -msgid "" -"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid" -msgstr "信号消息:PATH、INTERFACE 或 MEMBER METHOD_RETURN缺失或无效" - -#: gio/gdbusmessage.c:1392 -msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" -msgstr "信号消息:PATH 首部字段正在使用保留值 /org/freedesktop/DBus/Local" - -#: gio/gdbusmessage.c:1400 -msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" -msgstr "信号消息:INTERFACE 首部字段正在使用保留值 org.freedesktop.DBus.Local" - -#: gio/gdbusmessage.c:1449 gio/gdbusmessage.c:1509 +#: gio/gdbusmessage.c:1581 gio/gdbusmessage.c:1641 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "期望读取 %lu 个字节但只得到 %lu 个" -#: gio/gdbusmessage.c:1463 +#: gio/gdbusmessage.c:1595 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "期望“%s”后为 NUL 字节但找到了字节 %d" -#: gio/gdbusmessage.c:1482 +#: gio/gdbusmessage.c:1614 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " @@ -803,21 +826,21 @@ msgstr "" "期望得到有效的 UTF-8 字符串,但在字节偏移 %d 处(字符串长度为 %d)找到了无效" "的字节。该点的有效 UTF-8 字符串曾是“%s”" -#: gio/gdbusmessage.c:1546 gio/gdbusmessage.c:1822 gio/gdbusmessage.c:2033 +#: gio/gdbusmessage.c:1678 gio/gdbusmessage.c:1954 gio/gdbusmessage.c:2165 msgid "Value nested too deeply" msgstr "值嵌套过深" -#: gio/gdbusmessage.c:1714 +#: gio/gdbusmessage.c:1846 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "已解析的值“%s”不是有效的 D-Bus 对象路径" -#: gio/gdbusmessage.c:1738 +#: gio/gdbusmessage.c:1870 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "已解析的值“%s”不是有效的 D-Bus 签名" -#: gio/gdbusmessage.c:1789 +#: gio/gdbusmessage.c:1921 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -825,7 +848,7 @@ msgid_plural "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." msgstr[0] "遇到长度为 %u 字节的数组。最大长度应为 2<<26 字节(64 MiB)。" -#: gio/gdbusmessage.c:1809 +#: gio/gdbusmessage.c:1941 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " @@ -833,96 +856,96 @@ msgid "" msgstr "" "遇到类型为“a%c”的数组,需要长度为 %u 字节的倍数,但是找到的长度为 %u 字节" -#: gio/gdbusmessage.c:1963 gio/gdbusmessage.c:2682 +#: gio/gdbusmessage.c:2095 gio/gdbusmessage.c:2822 msgid "Empty structures (tuples) are not allowed in D-Bus" msgstr "D-Bus 中不允许空结构(tuples)" -#: gio/gdbusmessage.c:2017 +#: gio/gdbusmessage.c:2149 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "变量的已解析值“%s”不是有效的 D-Bus 签名" -#: gio/gdbusmessage.c:2058 +#: gio/gdbusmessage.c:2190 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "从 D-Bus 线格式以类型字符串“%s”反序列化 GVariant 时发生错误" -#: gio/gdbusmessage.c:2243 +#: gio/gdbusmessage.c:2375 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "无效的字节序值。期望为 0x6c(“l”)或 0x42(“B”)但找到值 0x%02x" -#: gio/gdbusmessage.c:2262 +#: gio/gdbusmessage.c:2394 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "无效的主协议版本。期望 1,但是找到了 %d" -#: gio/gdbusmessage.c:2320 gio/gdbusmessage.c:2918 +#: gio/gdbusmessage.c:2452 gio/gdbusmessage.c:3058 msgid "Signature header found but is not of type signature" msgstr "找到了签名首部但不属于类型签名" -#: gio/gdbusmessage.c:2332 +#: gio/gdbusmessage.c:2464 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "发现签名“%s”的签名首部,但消息主体为空" -#: gio/gdbusmessage.c:2347 +#: gio/gdbusmessage.c:2479 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "已解析的值“%s”不是有效的 D-Bus 签名(针对消息主体)" -#: gio/gdbusmessage.c:2379 +#: gio/gdbusmessage.c:2519 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "消息中没有签名首部,但消息主体为 %u 字节" -#: gio/gdbusmessage.c:2389 +#: gio/gdbusmessage.c:2529 msgid "Cannot deserialize message: " msgstr "无法反序列化消息:" -#: gio/gdbusmessage.c:2735 +#: gio/gdbusmessage.c:2875 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "以类型字符串“%s”序列化 GVariant 到 D-Bus 线格式时发生错误" -#: gio/gdbusmessage.c:2872 +#: gio/gdbusmessage.c:3012 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "消息中的文件描述符数量(%d)与首部字段中的(%d)不同" -#: gio/gdbusmessage.c:2880 +#: gio/gdbusmessage.c:3020 msgid "Cannot serialize message: " msgstr "无法序列化消息:" -#: gio/gdbusmessage.c:2933 +#: gio/gdbusmessage.c:3073 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "消息主体有签名“%s”但是没有签名首部" -#: gio/gdbusmessage.c:2943 +#: gio/gdbusmessage.c:3083 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" msgstr "消息主体有类型签名“%s”但首部字段的签名为“%s”" -#: gio/gdbusmessage.c:2959 +#: gio/gdbusmessage.c:3099 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "消息主体为空,但首部字段的签名为“(%s)”" -#: gio/gdbusmessage.c:3514 +#: gio/gdbusmessage.c:3673 #, c-format msgid "Error return with body of type “%s”" msgstr "出错,返回了“%s”类型的主体" -#: gio/gdbusmessage.c:3522 +#: gio/gdbusmessage.c:3681 msgid "Error return with empty body" msgstr "出错,返回了空的主体" @@ -942,22 +965,22 @@ msgid "Unable to get Hardware profile: %s" msgstr "无法获取硬件配置文件:%s" #. Translators: Both placeholders are file paths -#: gio/gdbusprivate.c:2461 +#: gio/gdbusprivate.c:2466 #, c-format msgid "Unable to load %s or %s: " msgstr "无法载入 %s 或 %s:" -#: gio/gdbusproxy.c:1568 +#: gio/gdbusproxy.c:1552 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "为 %s 调用 StartServiceByName 时出错:" -#: gio/gdbusproxy.c:1591 +#: gio/gdbusproxy.c:1575 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "从 StartServiceByName(\"%2$s\") 方法获得意外回复 %1$d" -#: gio/gdbusproxy.c:2702 gio/gdbusproxy.c:2837 +#: gio/gdbusproxy.c:2686 gio/gdbusproxy.c:2821 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -966,25 +989,25 @@ msgstr "" "无法调用方法;代理名称为常见的无所有者的名称 %s,且代理使用 " "G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START 标记构建" -#: gio/gdbusserver.c:758 +#: gio/gdbusserver.c:739 msgid "Abstract namespace not supported" msgstr "不支持抽象命名空间" -#: gio/gdbusserver.c:850 +#: gio/gdbusserver.c:831 msgid "Cannot specify nonce file when creating a server" msgstr "创建服务器时无法指定临时文件" -#: gio/gdbusserver.c:932 +#: gio/gdbusserver.c:913 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "写入“%s”处的临时文件时出错:%s" -#: gio/gdbusserver.c:1107 +#: gio/gdbusserver.c:1088 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "字符串“%s”不是有效 D-Bus GUID" -#: gio/gdbusserver.c:1145 +#: gio/gdbusserver.c:1126 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "无法监听不支持的传输“%s”" @@ -1048,6 +1071,10 @@ msgstr "连接到会话总线" msgid "Connect to given D-Bus address" msgstr "连接到给定的 D-Bus 地址" +#: gio/gdbus-tool.c:407 +msgid "ADDRESS" +msgstr "地址" + #: gio/gdbus-tool.c:417 msgid "Connection Endpoint Options:" msgstr "连接端点选项:" @@ -1274,71 +1301,72 @@ msgstr "错误:%s 不是有效的总线名称。\n" msgid "Not authorized to change debug settings" msgstr "未获认证以更改调试设置" -#: gio/gdesktopappinfo.c:2242 gio/gdesktopappinfo.c:5226 +#: gio/gdesktopappinfo.c:2235 gio/gdesktopappinfo.c:5219 +#: gio/gwin32appinfo.c:4256 msgid "Unnamed" msgstr "未命名" -#: gio/gdesktopappinfo.c:2652 +#: gio/gdesktopappinfo.c:2645 msgid "Desktop file didn’t specify Exec field" msgstr "桌面文件未指定 Exec 字段" -#: gio/gdesktopappinfo.c:2942 +#: gio/gdesktopappinfo.c:2935 msgid "Unable to find terminal required for application" msgstr "无法找到应用程序需要的终端" -#: gio/gdesktopappinfo.c:3002 +#: gio/gdesktopappinfo.c:2995 #, c-format msgid "Program ‘%s’ not found in $PATH" msgstr "程序 ‘%s’ 未在 $PATH 路径中找到" -#: gio/gdesktopappinfo.c:3738 +#: gio/gdesktopappinfo.c:3731 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "无法创建用户应用程序配置文件夹 %s:%s" -#: gio/gdesktopappinfo.c:3742 +#: gio/gdesktopappinfo.c:3735 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "无法创建用户 MIME 配置文件夹 %s:%s" -#: gio/gdesktopappinfo.c:3984 gio/gdesktopappinfo.c:4008 +#: gio/gdesktopappinfo.c:3977 gio/gdesktopappinfo.c:4001 msgid "Application information lacks an identifier" msgstr "应用程序信息缺少标志符" -#: gio/gdesktopappinfo.c:4244 +#: gio/gdesktopappinfo.c:4237 #, c-format msgid "Can’t create user desktop file %s" msgstr "无法创建用户桌面文件 %s" -#: gio/gdesktopappinfo.c:4380 +#: gio/gdesktopappinfo.c:4373 #, c-format msgid "Custom definition for %s" msgstr "%s 的自定义" -#: gio/gdrive.c:419 +#: gio/gdrive.c:417 msgid "drive doesn’t implement eject" msgstr "驱动器未实现弹出" #. Translators: This is an error #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gdrive.c:497 +#: gio/gdrive.c:495 msgid "drive doesn’t implement eject or eject_with_operation" msgstr "驱动器未实现弹出或 eject_with_operation" -#: gio/gdrive.c:573 +#: gio/gdrive.c:571 msgid "drive doesn’t implement polling for media" msgstr "驱动器未实现介质的轮询" -#: gio/gdrive.c:780 +#: gio/gdrive.c:778 msgid "drive doesn’t implement start" msgstr "驱动器未实现启动" -#: gio/gdrive.c:882 +#: gio/gdrive.c:880 msgid "drive doesn’t implement stop" msgstr "驱动器未实现停止" -#: gio/gdtlsconnection.c:1188 gio/gtlsconnection.c:957 +#: gio/gdtlsconnection.c:1154 gio/gtlsconnection.c:921 msgid "TLS backend does not implement TLS binding retrieval" msgstr "TLS 后端没有实现 TLS 绑定获取" @@ -1351,27 +1379,27 @@ msgstr "TLS 支持不可用" msgid "DTLS support is not available" msgstr "DTLS 支持不可用" -#: gio/gemblem.c:325 +#: gio/gemblem.c:332 #, c-format msgid "Can’t handle version %d of GEmblem encoding" msgstr "无法处理版本为 %d 的 GEmblem 编码" -#: gio/gemblem.c:335 +#: gio/gemblem.c:342 #, c-format msgid "Malformed number of tokens (%d) in GEmblem encoding" msgstr "GEmblem 编码中有不正确的符号数量(%d)" -#: gio/gemblemedicon.c:364 +#: gio/gemblemedicon.c:366 #, c-format msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "无法处理版本为 %d 的 GEmblemedIcon 编码" -#: gio/gemblemedicon.c:374 +#: gio/gemblemedicon.c:376 #, c-format msgid "Malformed number of tokens (%d) in GEmblemedIcon encoding" msgstr "GEmblemedIcon 编码中有不正确的符号数量(%d)" -#: gio/gemblemedicon.c:397 +#: gio/gemblemedicon.c:399 msgid "Expected a GEmblem for GEmblemedIcon" msgstr "GEmblemedIcon 中应为 GEmblem" @@ -1379,129 +1407,134 @@ msgstr "GEmblemedIcon 中应为 GEmblem" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1601 +#: gio/gfile.c:1604 msgid "Containing mount does not exist" msgstr "包含的挂载不存在" -#: gio/gfile.c:2648 gio/glocalfile.c:2518 +#: gio/gfile.c:2650 gio/glocalfile.c:2520 msgid "Can’t copy over directory" msgstr "无法跨目录复制" -#: gio/gfile.c:2708 +#: gio/gfile.c:2710 msgid "Can’t copy directory over directory" msgstr "无法跨目录复制到目录" -#: gio/gfile.c:2716 +#: gio/gfile.c:2718 msgid "Target file exists" msgstr "目标文件已存在" -#: gio/gfile.c:2735 +#: gio/gfile.c:2737 msgid "Can’t recursively copy directory" msgstr "无法递归复制目录" -#: gio/gfile.c:3044 gio/gfile.c:3092 +#: gio/gfile.c:3050 gio/gfile.c:3098 #, c-format msgid "Copy file range not supported" msgstr "不支持复制文件范围" -#: gio/gfile.c:3050 gio/gfile.c:3161 +#: gio/gfile.c:3056 gio/gfile.c:3167 #, c-format msgid "Error splicing file: %s" msgstr "拼接文件时出错:%s" -#: gio/gfile.c:3157 +#: gio/gfile.c:3163 msgid "Splice not supported" msgstr "不支持拼接" -#: gio/gfile.c:3321 +#: gio/gfile.c:3327 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "不支持在挂载之间复制(reflink/clone)" -#: gio/gfile.c:3325 +#: gio/gfile.c:3331 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "复制(reflink/clone)操作不支持或无效" -#: gio/gfile.c:3330 +#: gio/gfile.c:3336 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "复制(reflink/clone)操作不支持或者失败" -#: gio/gfile.c:3395 +#: gio/gfile.c:3384 gio/gfile.c:3395 +#, c-format +msgid "Cannot retrieve attribute %s" +msgstr "无法检索属性%s" + +#: gio/gfile.c:3415 msgid "Can’t copy special file" msgstr "无法复制特殊文件" -#: gio/gfile.c:4314 +#: gio/gfile.c:4332 msgid "Invalid symlink value given" msgstr "给定的符号链接值无效" -#: gio/gfile.c:4324 glib/gfileutils.c:2392 +#: gio/gfile.c:4342 glib/gfileutils.c:2409 msgid "Symbolic links not supported" msgstr "不支持符号链接" -#: gio/gfile.c:4611 +#: gio/gfile.c:4623 msgid "Trash not supported" msgstr "不支持回收站" -#: gio/gfile.c:4723 +#: gio/gfile.c:4733 #, c-format msgid "File names cannot contain “%c”" msgstr "文件名不能包含“%c”" -#: gio/gfile.c:7155 gio/gfile.c:7281 +#: gio/gfile.c:7159 gio/gfile.c:7285 #, c-format msgid "Failed to create a temporary directory for template “%s”: %s" msgstr "为模板“%s”创建临时目录失败:%s" -#: gio/gfile.c:7599 gio/gvolume.c:366 +#: gio/gfile.c:7603 gio/gvolume.c:362 msgid "volume doesn’t implement mount" msgstr "卷未实现挂载" -#: gio/gfile.c:7713 gio/gfile.c:7790 +#: gio/gfile.c:7717 gio/gfile.c:7794 msgid "No application is registered as handling this file" msgstr "没有应用程序注册为处理此文件的" -#: gio/gfileenumerator.c:214 +#: gio/gfileenumerator.c:216 msgid "Enumerator is closed" msgstr "枚举器已关闭" -#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280 -#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525 +#: gio/gfileenumerator.c:223 gio/gfileenumerator.c:282 +#: gio/gfileenumerator.c:427 gio/gfileenumerator.c:527 msgid "File enumerator has outstanding operation" msgstr "文件枚举器有异常操作" -#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516 +#: gio/gfileenumerator.c:418 gio/gfileenumerator.c:518 msgid "File enumerator is already closed" msgstr "文件枚举器已关闭" -#: gio/gfileicon.c:252 +#: gio/gfileicon.c:248 #, c-format msgid "Can’t handle version %d of GFileIcon encoding" msgstr "无法处理版本为 %d 的 GFileIcon 编码" -#: gio/gfileicon.c:262 +#: gio/gfileicon.c:258 msgid "Malformed input data for GFileIcon" msgstr "GFileIcon 有不正确的输入数据" -#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397 -#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166 -#: gio/gfileoutputstream.c:499 +#: gio/gfileinputstream.c:148 gio/gfileinputstream.c:394 +#: gio/gfileiostream.c:166 gio/gfileoutputstream.c:163 +#: gio/gfileoutputstream.c:497 msgid "Stream doesn’t support query_info" msgstr "流不支持 query_info" -#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382 -#: gio/gfileoutputstream.c:373 +#: gio/gfileinputstream.c:325 gio/gfileiostream.c:380 +#: gio/gfileoutputstream.c:371 msgid "Seek not supported on stream" msgstr "流不支持定位" -#: gio/gfileinputstream.c:372 +#: gio/gfileinputstream.c:369 msgid "Truncate not allowed on input stream" msgstr "输入流不允许截断" -#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449 +#: gio/gfileiostream.c:456 gio/gfileoutputstream.c:447 msgid "Truncate not supported on stream" msgstr "流不支持截断" -#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688 -#: glib/gconvert.c:1842 +#: gio/ghttpproxy.c:93 gio/gresolver.c:529 gio/gresolver.c:682 +#: glib/gconvert.c:1752 msgid "Invalid hostname" msgstr "无效的主机名" @@ -1534,64 +1567,64 @@ msgstr "HTTP 代理响应过大" msgid "HTTP proxy server closed connection unexpectedly." msgstr "HTTP 代理服务器意外关闭连接。" -#: gio/gicon.c:299 +#: gio/gicon.c:298 #, c-format msgid "Wrong number of tokens (%d)" msgstr "错误的符号数量(%d)" -#: gio/gicon.c:319 +#: gio/gicon.c:318 #, c-format msgid "No type for class name %s" msgstr "类名 %s 没有类型" -#: gio/gicon.c:329 +#: gio/gicon.c:328 #, c-format msgid "Type %s does not implement the GIcon interface" msgstr "类型 %s 没有实现 GIcon 接口" -#: gio/gicon.c:340 +#: gio/gicon.c:339 #, c-format msgid "Type %s is not classed" msgstr "类型 %s 不是类" -#: gio/gicon.c:354 +#: gio/gicon.c:353 #, c-format msgid "Malformed version number: %s" msgstr "不正确的版本号:%s" -#: gio/gicon.c:368 +#: gio/gicon.c:367 #, c-format msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "类型 %s 没有实现 GIcon 接口的 from_tokens() 方法" -#: gio/gicon.c:470 +#: gio/gicon.c:469 msgid "Can’t handle the supplied version of the icon encoding" msgstr "无法处理提供版本的图标编码" -#: gio/ginetaddressmask.c:184 +#: gio/ginetaddressmask.c:192 msgid "No address specified" msgstr "没有指定地址" -#: gio/ginetaddressmask.c:192 +#: gio/ginetaddressmask.c:200 #, c-format msgid "Length %u is too long for address" msgstr "对地址来说长度 %u 太长了" -#: gio/ginetaddressmask.c:225 +#: gio/ginetaddressmask.c:233 msgid "Address has bits set beyond prefix length" msgstr "地址有些位设置得超出了前缀长度" -#: gio/ginetaddressmask.c:302 +#: gio/ginetaddressmask.c:310 #, c-format msgid "Could not parse “%s” as IP address mask" msgstr "不能将“%s”解析为 IP 地址掩码" -#: gio/ginetsocketaddress.c:205 gio/ginetsocketaddress.c:222 -#: gio/gnativesocketaddress.c:111 gio/gunixsocketaddress.c:230 +#: gio/ginetsocketaddress.c:199 gio/ginetsocketaddress.c:216 +#: gio/gnativesocketaddress.c:107 gio/gunixsocketaddress.c:222 msgid "Not enough space for socket address" msgstr "没有足够的空间用于套接字地址" -#: gio/ginetsocketaddress.c:237 +#: gio/ginetsocketaddress.c:231 msgid "Unsupported socket address" msgstr "不支持的套接字地址" @@ -1605,7 +1638,7 @@ msgstr "输入流未实现读取" #. Translators: This is an error you get if there is #. * already an operation running against this stream when #. * you try to start one -#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218 +#: gio/ginputstream.c:1256 gio/giostream.c:327 gio/goutputstream.c:2218 msgid "Stream has outstanding operation" msgstr "流有异常操作" @@ -1621,7 +1654,7 @@ msgstr "移动时与文件一起" msgid "“version” takes no arguments" msgstr "“version”不接受参数" -#: gio/gio-tool.c:209 gio/gio-tool.c:225 glib/goption.c:871 +#: gio/gio-tool.c:209 gio/gio-tool.c:258 glib/goption.c:712 msgid "Usage:" msgstr "用法:" @@ -1629,79 +1662,79 @@ msgstr "用法:" msgid "Print version information and exit." msgstr "打印版本信息并退出。" -#: gio/gio-tool.c:228 -msgid "Commands:" -msgstr "命令:" - -#: gio/gio-tool.c:231 +#: gio/gio-tool.c:232 msgid "Concatenate files to standard output" msgstr "串接文件,写到标准输出" -#: gio/gio-tool.c:232 +#: gio/gio-tool.c:233 msgid "Copy one or more files" msgstr "复制文件" -#: gio/gio-tool.c:233 +#: gio/gio-tool.c:234 msgid "Show information about locations" msgstr "显示关于位置的信息" -#: gio/gio-tool.c:234 +#: gio/gio-tool.c:235 msgid "Launch an application from a desktop file" msgstr "从桌面文件启动应用程序" -#: gio/gio-tool.c:235 +#: gio/gio-tool.c:236 msgid "List the contents of locations" msgstr "列出某位置的内容" -#: gio/gio-tool.c:236 +#: gio/gio-tool.c:237 msgid "Get or set the handler for a mimetype" msgstr "获取或设置某种 MIME 类型的处理程序" -#: gio/gio-tool.c:237 +#: gio/gio-tool.c:238 msgid "Create directories" msgstr "创建目录" -#: gio/gio-tool.c:238 +#: gio/gio-tool.c:239 msgid "Monitor files and directories for changes" msgstr "监视文件和目录的更改" -#: gio/gio-tool.c:239 +#: gio/gio-tool.c:240 msgid "Mount or unmount the locations" msgstr "挂载或卸载位置" -#: gio/gio-tool.c:240 +#: gio/gio-tool.c:241 msgid "Move one or more files" msgstr "移动文件" -#: gio/gio-tool.c:241 +#: gio/gio-tool.c:242 msgid "Open files with the default application" msgstr "用默认应用打开文件" -#: gio/gio-tool.c:242 +#: gio/gio-tool.c:243 msgid "Rename a file" msgstr "重命名文件" -#: gio/gio-tool.c:243 +#: gio/gio-tool.c:244 msgid "Delete one or more files" msgstr "删除文件" -#: gio/gio-tool.c:244 +#: gio/gio-tool.c:245 msgid "Read from standard input and save" msgstr "从标准输入读取并保存" -#: gio/gio-tool.c:245 +#: gio/gio-tool.c:246 msgid "Set a file attribute" msgstr "设置文件属性" -#: gio/gio-tool.c:246 +#: gio/gio-tool.c:247 msgid "Move files or directories to the trash" msgstr "移动文件或目录到回收站" -#: gio/gio-tool.c:247 +#: gio/gio-tool.c:248 msgid "Lists the contents of locations in a tree" msgstr "在树中列出某位置的内容" -#: gio/gio-tool.c:249 +#: gio/gio-tool.c:261 +msgid "Commands:" +msgstr "命令:" + +#: gio/gio-tool.c:275 #, c-format msgid "Use %s to get detailed help.\n" msgstr "使用 %s 以获取详细帮助。\n" @@ -1711,7 +1744,7 @@ msgid "Error writing to stdout" msgstr "写入到标准输出时出错" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176 +#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:383 gio/gio-tool-list.c:176 #: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41 #: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45 #: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72 @@ -1733,60 +1766,64 @@ msgstr "" "gio cat 如传统 cat 程序那样工作,但使用 GIO 位置而非本地文件:\n" "例如,你可以指定 smb://server/resource/file.txt 之类的位置。" -#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78 +#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:414 gio/gio-tool-mkdir.c:78 #: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98 #: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303 msgid "No locations given" msgstr "未给定位置" -#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:40 msgid "No target directory" msgstr "无目标目录" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 msgid "Show progress" msgstr "显示进度" -#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:42 +#: gio/gio-tool-copy.c:48 gio/gio-tool-move.c:42 msgid "Prompt before overwrite" msgstr "覆盖前提示" -#: gio/gio-tool-copy.c:48 +#: gio/gio-tool-copy.c:49 msgid "Preserve all attributes" msgstr "保留所有属性" -#: gio/gio-tool-copy.c:49 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 +#: gio/gio-tool-copy.c:50 gio/gio-tool-move.c:43 gio/gio-tool-save.c:51 msgid "Backup existing destination files" msgstr "备份现有的目标文件" -#: gio/gio-tool-copy.c:50 +#: gio/gio-tool-copy.c:51 msgid "Never follow symbolic links" msgstr "从不跟随符号链接" -#: gio/gio-tool-copy.c:51 +#: gio/gio-tool-copy.c:52 msgid "Use default permissions for the destination" msgstr "对目标使用默认权限" -#: gio/gio-tool-copy.c:76 gio/gio-tool-move.c:69 +#: gio/gio-tool-copy.c:53 +msgid "Use default file modification timestamps for the destination" +msgstr "对目标使用默认文件修改时间戳" + +#: gio/gio-tool-copy.c:78 gio/gio-tool-move.c:69 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "已复制 %2$s 中的 %1$s(%3$s/秒)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 msgid "SOURCE" msgstr "来源" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:102 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 +#: gio/gio-tool-copy.c:104 gio/gio-tool-move.c:96 gio/gio-tool-save.c:162 msgid "DESTINATION" msgstr "目标" -#: gio/gio-tool-copy.c:107 +#: gio/gio-tool-copy.c:109 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "将一个或多个文件从源头复制到目标。" -#: gio/gio-tool-copy.c:109 +#: gio/gio-tool-copy.c:111 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1795,12 +1832,12 @@ msgstr "" "gio copy 如传统 cp 程序那样工作,但使用 GIO 位置而非本地文件:\n" "例如,你可以指定 smb://server/resource/file.txt 之类的位置。" -#: gio/gio-tool-copy.c:151 +#: gio/gio-tool-copy.c:153 #, c-format msgid "Destination %s is not a directory" msgstr "目标“%s”不是目录" -#: gio/gio-tool-copy.c:198 gio/gio-tool-move.c:188 +#: gio/gio-tool-copy.c:202 gio/gio-tool-move.c:188 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s:要覆盖“%s”吗?" @@ -1841,52 +1878,52 @@ msgstr "显示名称:%s\n" msgid "edit name: %s\n" msgstr "编辑名称:%s\n" -#: gio/gio-tool-info.c:184 +#: gio/gio-tool-info.c:185 #, c-format msgid "name: %s\n" msgstr "名称:%s\n" -#: gio/gio-tool-info.c:191 +#: gio/gio-tool-info.c:192 #, c-format msgid "type: %s\n" msgstr "类型:%s\n" -#: gio/gio-tool-info.c:197 +#: gio/gio-tool-info.c:198 msgid "size: " msgstr "大小:" -#: gio/gio-tool-info.c:203 +#: gio/gio-tool-info.c:204 msgid "hidden\n" msgstr "隐藏\n" -#: gio/gio-tool-info.c:206 +#: gio/gio-tool-info.c:207 #, c-format msgid "uri: %s\n" msgstr "uri:%s\n" -#: gio/gio-tool-info.c:213 +#: gio/gio-tool-info.c:214 #, c-format msgid "local path: %s\n" msgstr "本地路径: %s\n" -#: gio/gio-tool-info.c:247 +#: gio/gio-tool-info.c:248 #, c-format msgid "unix mount: %s%s %s %s %s\n" msgstr "UNIX 挂载:%s%s %s %s %s\n" -#: gio/gio-tool-info.c:328 +#: gio/gio-tool-info.c:329 msgid "Settable attributes:\n" msgstr "可设置的属性:\n" -#: gio/gio-tool-info.c:352 +#: gio/gio-tool-info.c:353 msgid "Writable attribute namespaces:\n" msgstr "可写的属性命名空间:\n" -#: gio/gio-tool-info.c:387 +#: gio/gio-tool-info.c:388 msgid "Show information about locations." msgstr "显示位置信息。" -#: gio/gio-tool-info.c:389 +#: gio/gio-tool-info.c:390 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2428,7 +2465,8 @@ msgid "" msgstr "FILE 中引用的要从其中载入文件的目录(默认为当前目录)" #: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173 -#: gio/glib-compile-schemas.c:2203 +#: gio/glib-compile-schemas.c:2203 girepository/compiler/compiler.c:147 +#: girepository/decompiler/decompiler.c:53 msgid "DIRECTORY" msgstr "目录" @@ -2475,6 +2513,10 @@ msgstr "不要在 C 文件里嵌入资源数据;而假定它是以外部连接 msgid "C identifier name used for the generated source code" msgstr "用于生成的源代码的 C 标识符名称" +#: gio/glib-compile-resources.c:833 +msgid "IDENTIFIER" +msgstr "标识符" + #: gio/glib-compile-resources.c:834 msgid "The target C compiler (default: the CC environment variable)" msgstr "目标 C 编译器(默认:CC 环境变量)" @@ -2966,124 +3008,124 @@ msgstr "读取 %s 文件系统信息时出错:%s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1148 +#: gio/glocalfile.c:1150 #, c-format msgid "Containing mount for file %s not found" msgstr "找不到文件 %s 包含的挂载" -#: gio/glocalfile.c:1171 +#: gio/glocalfile.c:1173 msgid "Can’t rename root directory" msgstr "无法重命名根目录" -#: gio/glocalfile.c:1189 gio/glocalfile.c:1212 +#: gio/glocalfile.c:1191 gio/glocalfile.c:1214 #, c-format msgid "Error renaming file %s: %s" msgstr "重命名文件 %s 时出错:%s" -#: gio/glocalfile.c:1196 +#: gio/glocalfile.c:1198 msgid "Can’t rename file, filename already exists" msgstr "无法重命名文件,该文件名已存在" -#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440 -#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658 +#: gio/glocalfile.c:1211 gio/glocalfile.c:2414 gio/glocalfile.c:2442 +#: gio/glocalfile.c:2581 gio/glocalfileoutputstream.c:658 msgid "Invalid filename" msgstr "无效的文件名" -#: gio/glocalfile.c:1377 gio/glocalfile.c:1388 +#: gio/glocalfile.c:1379 gio/glocalfile.c:1390 #, c-format msgid "Error opening file %s: %s" msgstr "打开文件 %s 时出错:%s" -#: gio/glocalfile.c:1513 +#: gio/glocalfile.c:1515 #, c-format msgid "Error removing file %s: %s" msgstr "删除文件 %s 时出错:%s" -#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045 +#: gio/glocalfile.c:2009 gio/glocalfile.c:2020 gio/glocalfile.c:2047 #, c-format msgid "Error trashing file %s: %s" msgstr "将文件 %s 丢到回收站时出错:%s" -#: gio/glocalfile.c:2065 +#: gio/glocalfile.c:2067 #, c-format msgid "Unable to create trash directory %s: %s" msgstr "无法创建回收站目录 %s:%s" -#: gio/glocalfile.c:2086 +#: gio/glocalfile.c:2088 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "找不到回收站 %s 的顶级目录" -#: gio/glocalfile.c:2094 +#: gio/glocalfile.c:2096 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "不支持在系统内部挂载上的丢弃到回收站操作" -#: gio/glocalfile.c:2180 gio/glocalfile.c:2208 +#: gio/glocalfile.c:2182 gio/glocalfile.c:2210 #, c-format msgid "Unable to find or create trash directory %s to trash %s" msgstr "无法找到或创建回收站目录 %s 来丢弃 %s" -#: gio/glocalfile.c:2252 +#: gio/glocalfile.c:2254 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "为 %s 创建回收站信息文件失败:%s" -#: gio/glocalfile.c:2323 +#: gio/glocalfile.c:2325 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "无法跨越文件系统边界将文件 %s 丢到回收站" -#: gio/glocalfile.c:2327 gio/glocalfile.c:2383 +#: gio/glocalfile.c:2329 gio/glocalfile.c:2385 #, c-format msgid "Unable to trash file %s: %s" msgstr "无法将文件 %s 丢到回收站:%s" -#: gio/glocalfile.c:2389 +#: gio/glocalfile.c:2391 #, c-format msgid "Unable to trash file %s" msgstr "无法将文件 %s 丢到回收站" -#: gio/glocalfile.c:2415 +#: gio/glocalfile.c:2417 #, c-format msgid "Error creating directory %s: %s" msgstr "创建目录 %s 时出错:%s" -#: gio/glocalfile.c:2444 +#: gio/glocalfile.c:2446 #, c-format msgid "Filesystem does not support symbolic links" msgstr "文件系统不支持符号链接" -#: gio/glocalfile.c:2447 +#: gio/glocalfile.c:2449 #, c-format msgid "Error making symbolic link %s: %s" msgstr "创建符号链接 %s 时出错:%s" -#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582 +#: gio/glocalfile.c:2492 gio/glocalfile.c:2527 gio/glocalfile.c:2584 #, c-format msgid "Error moving file %s: %s" msgstr "移动文件 %s 时出错:%s" -#: gio/glocalfile.c:2513 +#: gio/glocalfile.c:2515 msgid "Can’t move directory over directory" msgstr "无法将目录移动到目录" -#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110 +#: gio/glocalfile.c:2541 gio/glocalfileoutputstream.c:1110 #: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139 #: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170 msgid "Backup file creation failed" msgstr "备份文件创建失败" -#: gio/glocalfile.c:2558 +#: gio/glocalfile.c:2560 #, c-format msgid "Error removing target file: %s" msgstr "移除目标文件出错:%s" -#: gio/glocalfile.c:2572 +#: gio/glocalfile.c:2574 msgid "Move between mounts not supported" msgstr "不支持在挂载之间移动" -#: gio/glocalfile.c:2748 +#: gio/glocalfile.c:2750 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "无法确定 %s 的磁盘使用情况:%s" @@ -3105,115 +3147,115 @@ msgstr "无效的扩展属性名" msgid "Error setting extended attribute “%s”: %s" msgstr "设置扩展属性“%s”时出错:%s" -#: gio/glocalfileinfo.c:1785 gio/win32/gwinhttpfile.c:191 +#: gio/glocalfileinfo.c:1789 gio/win32/gwinhttpfile.c:191 msgid " (invalid encoding)" msgstr " (无效的编码)" -#: gio/glocalfileinfo.c:1944 gio/glocalfileoutputstream.c:945 +#: gio/glocalfileinfo.c:1948 gio/glocalfileoutputstream.c:945 #: gio/glocalfileoutputstream.c:997 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "获取文件“%s”的信息时出错:%s" -#: gio/glocalfileinfo.c:2250 +#: gio/glocalfileinfo.c:2254 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "获取文件描述符的信息时出错:%s" -#: gio/glocalfileinfo.c:2295 +#: gio/glocalfileinfo.c:2299 msgid "Invalid attribute type (uint32 expected)" msgstr "无效的属性类型(应为 uint32)" -#: gio/glocalfileinfo.c:2313 +#: gio/glocalfileinfo.c:2317 msgid "Invalid attribute type (uint64 expected)" msgstr "无效的属性类型(应为 uint64)" -#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2336 gio/glocalfileinfo.c:2355 msgid "Invalid attribute type (byte string expected)" msgstr "无效的属性类型(应为字节字符串)" -#: gio/glocalfileinfo.c:2398 +#: gio/glocalfileinfo.c:2402 msgid "Cannot set permissions on symlinks" msgstr "无法为符号链接设置权限" -#: gio/glocalfileinfo.c:2414 +#: gio/glocalfileinfo.c:2418 #, c-format msgid "Error setting permissions: %s" msgstr "设置访问权限出错:%s" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2469 #, c-format msgid "Error setting owner: %s" msgstr "设置所有者出错:%s" -#: gio/glocalfileinfo.c:2488 +#: gio/glocalfileinfo.c:2492 msgid "symlink must be non-NULL" msgstr "符号链接必须是非空" -#: gio/glocalfileinfo.c:2498 gio/glocalfileinfo.c:2517 -#: gio/glocalfileinfo.c:2528 +#: gio/glocalfileinfo.c:2502 gio/glocalfileinfo.c:2521 +#: gio/glocalfileinfo.c:2532 #, c-format msgid "Error setting symlink: %s" msgstr "设置符号链接出错:%s" -#: gio/glocalfileinfo.c:2507 +#: gio/glocalfileinfo.c:2511 msgid "Error setting symlink: file is not a symlink" msgstr "设定符号链接出错:文件不是符号链接" -#: gio/glocalfileinfo.c:2599 +#: gio/glocalfileinfo.c:2603 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" msgstr "额外的纳秒数字 %d 在 UNIX 时间戳 %lld 中是负值" -#: gio/glocalfileinfo.c:2608 +#: gio/glocalfileinfo.c:2612 #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "额外的纳秒数字 %d 在 UNIX 时间戳 %lld 中长度已达到一秒钟" -#: gio/glocalfileinfo.c:2618 +#: gio/glocalfileinfo.c:2622 #, c-format msgid "UNIX timestamp %lld does not fit into 64 bits" msgstr "UNIX 时间戳 %lld 无法作为 64 比特数据存储" -#: gio/glocalfileinfo.c:2629 +#: gio/glocalfileinfo.c:2633 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "UNIX 时间戳 %lld 位于 Windows 所支持的范围之外" -#: gio/glocalfileinfo.c:2761 +#: gio/glocalfileinfo.c:2765 #, c-format msgid "File name “%s” cannot be converted to UTF-16" msgstr "文件名“%s”不能转换为 UTF-16" -#: gio/glocalfileinfo.c:2780 +#: gio/glocalfileinfo.c:2784 #, c-format msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "无法打开文件“%s”:Windows 错误 %lu" -#: gio/glocalfileinfo.c:2793 +#: gio/glocalfileinfo.c:2797 #, c-format msgid "Error setting modification or access time for file “%s”: %lu" msgstr "设置文件“%s”的修改或访问时间时出错:%lu" -#: gio/glocalfileinfo.c:2950 +#: gio/glocalfileinfo.c:2974 #, c-format msgid "Error setting modification or access time: %s" msgstr "设置修改或访问时间时出错:%s" -#: gio/glocalfileinfo.c:2973 +#: gio/glocalfileinfo.c:2997 msgid "SELinux context must be non-NULL" msgstr "SELinux 上下文必须是非空" -#: gio/glocalfileinfo.c:2980 +#: gio/glocalfileinfo.c:3004 msgid "SELinux is not enabled on this system" msgstr "此系统尚未启用 SELinux" -#: gio/glocalfileinfo.c:2990 +#: gio/glocalfileinfo.c:3014 #, c-format msgid "Error setting SELinux context: %s" msgstr "设置 SELinux 上下文出错:%s" -#: gio/glocalfileinfo.c:3087 +#: gio/glocalfileinfo.c:3111 #, c-format msgid "Setting attribute %s not supported" msgstr "不支持设置属性 %s" @@ -3266,7 +3308,7 @@ msgid "Error truncating file: %s" msgstr "截断文件出错:%s" #: gio/glocalfileoutputstream.c:664 gio/glocalfileoutputstream.c:909 -#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:231 +#: gio/glocalfileoutputstream.c:1223 gio/gsubprocess.c:227 #, c-format msgid "Error opening file “%s”: %s" msgstr "打开文件“%s”出错:%s" @@ -3288,99 +3330,99 @@ msgstr "文件已经被其他程序修改" msgid "Error removing old file: %s" msgstr "移除旧文件出错:%s" -#: gio/gmemoryinputstream.c:476 gio/gmemoryoutputstream.c:764 +#: gio/gmemoryinputstream.c:473 gio/gmemoryoutputstream.c:751 msgid "Invalid GSeekType supplied" msgstr "提供的 GSeekType 无效" -#: gio/gmemoryinputstream.c:486 +#: gio/gmemoryinputstream.c:483 msgid "Invalid seek request" msgstr "无效的搜寻请求" -#: gio/gmemoryinputstream.c:510 +#: gio/gmemoryinputstream.c:507 msgid "Cannot truncate GMemoryInputStream" msgstr "无法截断 GMemoryInputStream" -#: gio/gmemoryoutputstream.c:570 +#: gio/gmemoryoutputstream.c:557 msgid "Memory output stream not resizable" msgstr "内存输出流无法改变大小" -#: gio/gmemoryoutputstream.c:586 +#: gio/gmemoryoutputstream.c:573 msgid "Failed to resize memory output stream" msgstr "改变内存输出流大小失败" -#: gio/gmemoryoutputstream.c:665 +#: gio/gmemoryoutputstream.c:652 msgid "" "Amount of memory required to process the write is larger than available " "address space" msgstr "处理写入所需要的内存超过了可用的空间" -#: gio/gmemoryoutputstream.c:774 +#: gio/gmemoryoutputstream.c:761 msgid "Requested seek before the beginning of the stream" msgstr "请求的定位值在流的开始之前" -#: gio/gmemoryoutputstream.c:789 +#: gio/gmemoryoutputstream.c:776 msgid "Requested seek beyond the end of the stream" msgstr "请求的定位值在流的结束之后" #. Translators: This is an error #. * message for mount objects that #. * don't implement unmount. -#: gio/gmount.c:401 +#: gio/gmount.c:400 msgid "mount doesn’t implement “unmount”" msgstr "挂载未实现“unmount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement eject. -#: gio/gmount.c:477 +#: gio/gmount.c:476 msgid "mount doesn’t implement “eject”" msgstr "挂载未实现“eject”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. -#: gio/gmount.c:555 +#: gio/gmount.c:554 msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "挂载未实现“unmount”或“unmount_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gmount.c:640 +#: gio/gmount.c:639 msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "挂载未实现“eject”或“eject_with_operation”" #. Translators: This is an error #. * message for mount objects that #. * don't implement remount. -#: gio/gmount.c:728 +#: gio/gmount.c:727 msgid "mount doesn’t implement “remount”" msgstr "挂载未实现“remount”" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:810 +#: gio/gmount.c:809 msgid "mount doesn’t implement content type guessing" msgstr "挂载未实现内容类型猜测" #. Translators: This is an error #. * message for mount objects that #. * don't implement content type guessing. -#: gio/gmount.c:897 +#: gio/gmount.c:896 msgid "mount doesn’t implement synchronous content type guessing" msgstr "挂载未实现同步内容类型猜测" -#: gio/gnetworkaddress.c:417 +#: gio/gnetworkaddress.c:424 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "主机名“%s”包含“[”但是缺少“]”" -#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:325 +#: gio/gnetworkmonitorbase.c:221 gio/gnetworkmonitorbase.c:326 msgid "Network unreachable" msgstr "网络不可达" -#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:289 +#: gio/gnetworkmonitorbase.c:259 gio/gnetworkmonitorbase.c:290 msgid "Host unreachable" msgstr "主机不可达" @@ -3408,7 +3450,7 @@ msgstr "NetworkManager 未在运行" msgid "NetworkManager version too old" msgstr "NetworkManager 版本太老" -#: gio/goutputstream.c:234 gio/goutputstream.c:777 +#: gio/goutputstream.c:236 gio/goutputstream.c:777 msgid "Output stream doesn’t implement write" msgstr "输出流未实现写入" @@ -3421,38 +3463,38 @@ msgstr "传递给 %s 的向量和太大" msgid "Source stream is already closed" msgstr "源流已经关闭" -#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347 +#: gio/gproxyaddressenumerator.c:328 gio/gproxyaddressenumerator.c:348 msgid "Unspecified proxy lookup failure" msgstr "未指定的代理查询失败" #. Translators: the first placeholder is a domain name, the #. * second is an error message -#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338 -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gresolver.c:472 gio/gthreadedresolver.c:318 gio/gthreadedresolver.c:339 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 #, c-format msgid "Error resolving “%s”: %s" msgstr "解析“%s”时出错:%s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:547 gio/gresolver.c:707 +#: gio/gresolver.c:541 gio/gresolver.c:701 #, c-format msgid "%s not implemented" msgstr "%s 尚未实现" -#: gio/gresolver.c:1076 gio/gresolver.c:1128 +#: gio/gresolver.c:1070 gio/gresolver.c:1122 msgid "Invalid domain" msgstr "无效的域" -#: gio/gresource.c:683 gio/gresource.c:945 gio/gresource.c:985 -#: gio/gresource.c:1109 gio/gresource.c:1181 gio/gresource.c:1255 -#: gio/gresource.c:1336 gio/gresourcefile.c:482 gio/gresourcefile.c:606 +#: gio/gresource.c:706 gio/gresource.c:968 gio/gresource.c:1008 +#: gio/gresource.c:1132 gio/gresource.c:1204 gio/gresource.c:1278 +#: gio/gresource.c:1359 gio/gresourcefile.c:482 gio/gresourcefile.c:606 #: gio/gresourcefile.c:757 #, c-format msgid "The resource at “%s” does not exist" msgstr "位于“%s”的资源不存在" -#: gio/gresource.c:850 +#: gio/gresource.c:873 #, c-format msgid "The resource at “%s” failed to decompress" msgstr "解压位于“%s”的资源失败" @@ -3470,11 +3512,11 @@ msgstr "“%s”处的资源不是一个目录" msgid "Input stream doesn’t implement seek" msgstr "输入流未实现定位" -#: gio/gresource-tool.c:502 +#: gio/gresource-tool.c:503 msgid "List sections containing resources in an elf FILE" msgstr "列出 elf 文件中包含资源的段" -#: gio/gresource-tool.c:508 +#: gio/gresource-tool.c:509 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" @@ -3484,15 +3526,15 @@ msgstr "" "如果指定了段,则仅在此段中列出资源\n" "如果指定了路径,则仅列出匹配的资源" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 +#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 msgid "FILE [PATH]" msgstr "文件 [路径]" -#: gio/gresource-tool.c:512 gio/gresource-tool.c:522 gio/gresource-tool.c:529 +#: gio/gresource-tool.c:513 gio/gresource-tool.c:523 gio/gresource-tool.c:530 msgid "SECTION" msgstr "段" -#: gio/gresource-tool.c:517 +#: gio/gresource-tool.c:518 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3504,15 +3546,15 @@ msgstr "" "如果指定了文件,则仅列出匹配的资源\n" "详细信息包括段、大小和压缩情况" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:528 msgid "Extract a resource file to stdout" msgstr "提取一个资源文件到标准输出" -#: gio/gresource-tool.c:528 +#: gio/gresource-tool.c:529 msgid "FILE PATH" msgstr "文件 路径" -#: gio/gresource-tool.c:542 +#: gio/gresource-tool.c:543 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3540,7 +3582,7 @@ msgstr "" "使用“gresoure help 命令”获取详细帮助。\n" "\n" -#: gio/gresource-tool.c:556 +#: gio/gresource-tool.c:557 #, c-format msgid "" "Usage:\n" @@ -3555,19 +3597,19 @@ msgstr "" "%s\n" "\n" -#: gio/gresource-tool.c:563 +#: gio/gresource-tool.c:564 msgid " SECTION An (optional) elf section name\n" msgstr " 段 一个 elf 段名(可选)\n" -#: gio/gresource-tool.c:567 gio/gsettings-tool.c:720 +#: gio/gresource-tool.c:568 gio/gsettings-tool.c:720 msgid " COMMAND The (optional) command to explain\n" msgstr " 命令 要解释的命令(可选)\n" -#: gio/gresource-tool.c:573 +#: gio/gresource-tool.c:574 msgid " FILE An elf file (a binary or a shared library)\n" msgstr " 文件 一个 elf 文件(可执行文件或共享库)\n" -#: gio/gresource-tool.c:576 +#: gio/gresource-tool.c:577 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" @@ -3575,19 +3617,19 @@ msgstr "" " 文件 一个 elf 文件(可执行文件或共享库)\n" " 或已编译的资源文件\n" -#: gio/gresource-tool.c:580 +#: gio/gresource-tool.c:581 msgid "[PATH]" msgstr "[路径]" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:583 msgid " PATH An (optional) resource path (may be partial)\n" msgstr " 路径 (部分)资源路径(可选)\n" -#: gio/gresource-tool.c:583 +#: gio/gresource-tool.c:584 msgid "PATH" msgstr "路径" -#: gio/gresource-tool.c:585 +#: gio/gresource-tool.c:586 msgid " PATH A resource path\n" msgstr " 路径 一个资源路径\n" @@ -3818,214 +3860,214 @@ msgstr "给定了空的架构名称\n" msgid "No such key “%s”\n" msgstr "没有“%s”这个键\n" -#: gio/gsocket.c:419 +#: gio/gsocket.c:435 msgid "Invalid socket, not initialized" msgstr "无效的套接字,尚未初始化" -#: gio/gsocket.c:426 +#: gio/gsocket.c:442 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "无效的套接字,初始化失败的原因是:%s" -#: gio/gsocket.c:434 +#: gio/gsocket.c:450 msgid "Socket is already closed" msgstr "套接字已经关闭" -#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527 -#: gio/gthreadedresolver.c:1445 +#: gio/gsocket.c:465 gio/gsocket.c:3291 gio/gsocket.c:4664 gio/gsocket.c:4722 +#: gio/gthreadedresolver.c:1454 msgid "Socket I/O timed out" msgstr "套接字 I/O 超时" # "fd" is abbr. of "File Descriptor", 文件描述符 -#: gio/gsocket.c:586 +#: gio/gsocket.c:602 #, c-format msgid "creating GSocket from fd: %s" msgstr "正在从文件描述符创建 GSocket:%s" -#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721 +#: gio/gsocket.c:662 gio/gsocket.c:730 gio/gsocket.c:737 #, c-format msgid "Unable to create socket: %s" msgstr "无法创建套接字:%s" -#: gio/gsocket.c:714 +#: gio/gsocket.c:730 msgid "Unknown family was specified" msgstr "指定了未知协议族" -#: gio/gsocket.c:721 +#: gio/gsocket.c:737 msgid "Unknown protocol was specified" msgstr "指定了未知协议" -#: gio/gsocket.c:1190 +#: gio/gsocket.c:1243 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "无法在非数据报套接字上使用数据报操作。" -#: gio/gsocket.c:1207 +#: gio/gsocket.c:1260 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "无法在已设置超时的套接字上使用数据报操作。" -#: gio/gsocket.c:2014 +#: gio/gsocket.c:2067 #, c-format msgid "could not get local address: %s" msgstr "无法获取本地地址:%s" -#: gio/gsocket.c:2060 +#: gio/gsocket.c:2113 #, c-format msgid "could not get remote address: %s" msgstr "无法获取远程地址: %s" -#: gio/gsocket.c:2126 +#: gio/gsocket.c:2179 #, c-format msgid "could not listen: %s" msgstr "无法监听:%s" -#: gio/gsocket.c:2230 +#: gio/gsocket.c:2283 #, c-format msgid "Error binding to address %s: %s" msgstr "绑定地址时出错:%s: %s" -#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577 -#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720 +#: gio/gsocket.c:2458 gio/gsocket.c:2495 gio/gsocket.c:2605 gio/gsocket.c:2630 +#: gio/gsocket.c:2697 gio/gsocket.c:2755 gio/gsocket.c:2773 #, c-format msgid "Error joining multicast group: %s" msgstr "加入多播组时出错:%s" -#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578 -#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721 +#: gio/gsocket.c:2459 gio/gsocket.c:2496 gio/gsocket.c:2606 gio/gsocket.c:2631 +#: gio/gsocket.c:2698 gio/gsocket.c:2756 gio/gsocket.c:2774 #, c-format msgid "Error leaving multicast group: %s" msgstr "退出多播组时出错:%s" -#: gio/gsocket.c:2407 +#: gio/gsocket.c:2460 msgid "No support for source-specific multicast" msgstr "不支持指定源的多播" -#: gio/gsocket.c:2554 +#: gio/gsocket.c:2607 msgid "Unsupported socket family" msgstr "不支持的套接字家族" -#: gio/gsocket.c:2579 +#: gio/gsocket.c:2632 msgid "source-specific not an IPv4 address" msgstr "指定源不是 IPv4 地址" -#: gio/gsocket.c:2603 +#: gio/gsocket.c:2656 #, c-format msgid "Interface name too long" msgstr "接口名太长" -#: gio/gsocket.c:2616 gio/gsocket.c:2670 +#: gio/gsocket.c:2669 gio/gsocket.c:2723 #, c-format msgid "Interface not found: %s" msgstr "未找到接口:%s" -#: gio/gsocket.c:2646 +#: gio/gsocket.c:2699 msgid "No support for IPv4 source-specific multicast" msgstr "不支持 IPv4 指定源的多播" -#: gio/gsocket.c:2704 +#: gio/gsocket.c:2757 msgid "No support for IPv6 source-specific multicast" msgstr "不支持 IPv6 指定源的多播" -#: gio/gsocket.c:2937 +#: gio/gsocket.c:2990 #, c-format msgid "Error accepting connection: %s" msgstr "接受连接时出错:%s" -#: gio/gsocket.c:3063 +#: gio/gsocket.c:3116 msgid "Connection in progress" msgstr "连接进行中" -#: gio/gsocket.c:3114 +#: gio/gsocket.c:3167 msgid "Unable to get pending error: " msgstr "无法获取未决的错误:" -#: gio/gsocket.c:3303 +#: gio/gsocket.c:3356 #, c-format msgid "Error receiving data: %s" msgstr "接收数据时出错:%s" -#: gio/gsocket.c:3500 +#: gio/gsocket.c:3695 #, c-format msgid "Error sending data: %s" msgstr "发送数据时出错:%s" -#: gio/gsocket.c:3687 +#: gio/gsocket.c:3882 #, c-format msgid "Unable to shutdown socket: %s" msgstr "无法关闭套接字:%s" -#: gio/gsocket.c:3768 +#: gio/gsocket.c:3963 #, c-format msgid "Error closing socket: %s" msgstr "关闭套接字时出错:%s" -#: gio/gsocket.c:4462 +#: gio/gsocket.c:4657 #, c-format msgid "Waiting for socket condition: %s" msgstr "等待套接字状态:%s" -#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881 +#: gio/gsocket.c:5047 gio/gsocket.c:5063 gio/gsocket.c:5076 #, c-format msgid "Unable to send message: %s" msgstr "无法发送信息:%s" -#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882 +#: gio/gsocket.c:5048 gio/gsocket.c:5064 gio/gsocket.c:5077 msgid "Message vectors too large" msgstr "信息向量过大" -#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132 -#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352 +#: gio/gsocket.c:5093 gio/gsocket.c:5095 gio/gsocket.c:5242 gio/gsocket.c:5327 +#: gio/gsocket.c:5505 gio/gsocket.c:5545 gio/gsocket.c:5547 #, c-format msgid "Error sending message: %s" msgstr "发送信息时出错:%s" -#: gio/gsocket.c:5074 +#: gio/gsocket.c:5269 msgid "GSocketControlMessage not supported on Windows" msgstr "Windows 不支持 GSocketControlMessage" -#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849 +#: gio/gsocket.c:5742 gio/gsocket.c:5818 gio/gsocket.c:6044 #, c-format msgid "Error receiving message: %s" msgstr "接受信息时出错:%s" -#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208 +#: gio/gsocket.c:6329 gio/gsocket.c:6340 gio/gsocket.c:6403 #, c-format msgid "Unable to read socket credentials: %s" msgstr "无法读取套接字认证信息:%s" -#: gio/gsocket.c:6217 +#: gio/gsocket.c:6412 msgid "g_socket_get_credentials not implemented for this OS" msgstr "此操作系统上没有实现 g_socket_get_credentials" -#: gio/gsocketclient.c:193 +#: gio/gsocketclient.c:192 #, c-format msgid "Could not connect to proxy server %s: " msgstr "无法连接到代理服务器 %s:" -#: gio/gsocketclient.c:207 +#: gio/gsocketclient.c:206 #, c-format msgid "Could not connect to %s: " msgstr "无法连接到 %s:" -#: gio/gsocketclient.c:209 +#: gio/gsocketclient.c:208 msgid "Could not connect: " msgstr "无法连接:" -#: gio/gsocketclient.c:1204 gio/gsocketclient.c:1807 +#: gio/gsocketclient.c:1234 gio/gsocketclient.c:1851 msgid "Proxying over a non-TCP connection is not supported." msgstr "不支持通过非 TCP 连接的代理。" -#: gio/gsocketclient.c:1236 gio/gsocketclient.c:1836 +#: gio/gsocketclient.c:1266 gio/gsocketclient.c:1886 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "不支持代理协议“%s”。" -#: gio/gsocketlistener.c:232 +#: gio/gsocketlistener.c:235 msgid "Listener is already closed" msgstr "监听器已关闭" -#: gio/gsocketlistener.c:278 +#: gio/gsocketlistener.c:281 msgid "Added socket is closed" msgstr "添加的套接字已关闭" @@ -4114,94 +4156,94 @@ msgstr "SOCKSv5 代理不支持提供的地址类型。" msgid "Unknown SOCKSv5 proxy error." msgstr "未知 SOCKSv5 代理错误。" -#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433 +#: gio/gtestdbus.c:608 glib/gspawn-win32.c:433 #, c-format msgid "Failed to create pipe for communicating with child process (%s)" msgstr "创建与子进程通讯的管道失败(%s)" -#: gio/gtestdbus.c:621 +#: gio/gtestdbus.c:615 #, c-format msgid "Pipes are not supported in this platform" msgstr "此平台不支持管道(pipe)" -#: gio/gthemedicon.c:597 +#: gio/gthemedicon.c:590 #, c-format msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "无法处理版本为 %d 的 GThemedIcon 编码" -#: gio/gthreadedresolver.c:319 +#: gio/gthreadedresolver.c:320 msgid "No valid addresses were found" msgstr "找不到合法的地址" -#: gio/gthreadedresolver.c:514 +#: gio/gthreadedresolver.c:515 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "反向解析“%s”时出错:%s" #. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’ -#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759 -#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860 -#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901 +#: gio/gthreadedresolver.c:738 gio/gthreadedresolver.c:760 +#: gio/gthreadedresolver.c:814 gio/gthreadedresolver.c:861 +#: gio/gthreadedresolver.c:890 gio/gthreadedresolver.c:902 #, c-format msgid "Error parsing DNS %s record: malformed DNS packet" msgstr "解析 DNS %s 记录时出错:畸形的 DNS 数据包" -#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096 -#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244 +#: gio/gthreadedresolver.c:960 gio/gthreadedresolver.c:1097 +#: gio/gthreadedresolver.c:1195 gio/gthreadedresolver.c:1245 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "没有“%s”所请求类型的 DNS 记录" -#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199 +#: gio/gthreadedresolver.c:965 gio/gthreadedresolver.c:1200 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "暂时无法解析“%s”" -#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204 -#: gio/gthreadedresolver.c:1300 +#: gio/gthreadedresolver.c:970 gio/gthreadedresolver.c:1205 +#: gio/gthreadedresolver.c:1301 #, c-format msgid "Error resolving “%s”" msgstr "解析“%s”时出错" -#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007 -#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047 +#: gio/gthreadedresolver.c:984 gio/gthreadedresolver.c:1008 +#: gio/gthreadedresolver.c:1033 gio/gthreadedresolver.c:1048 msgid "Malformed DNS packet" msgstr "畸形的 DNS 数据包" -#: gio/gthreadedresolver.c:1089 +#: gio/gthreadedresolver.c:1090 #, c-format msgid "Failed to parse DNS response for “%s”: " msgstr "解析响应“%s”的 DNS 失败:" -#: gio/gtlscertificate.c:480 +#: gio/gtlscertificate.c:438 msgid "No PEM-encoded private key found" msgstr "未找到 PEM 加密的私钥" -#: gio/gtlscertificate.c:490 +#: gio/gtlscertificate.c:448 msgid "Cannot decrypt PEM-encoded private key" msgstr "无法解密 PEM 加密的私钥" -#: gio/gtlscertificate.c:501 +#: gio/gtlscertificate.c:459 msgid "Could not parse PEM-encoded private key" msgstr "无法解析 PEM 加密的私钥" -#: gio/gtlscertificate.c:528 +#: gio/gtlscertificate.c:486 msgid "No PEM-encoded certificate found" msgstr "未找到 PEM 加密的证书" -#: gio/gtlscertificate.c:537 +#: gio/gtlscertificate.c:495 msgid "Could not parse PEM-encoded certificate" msgstr "无法解析 PEM 加密的证书" -#: gio/gtlscertificate.c:800 +#: gio/gtlscertificate.c:758 msgid "The current TLS backend does not support PKCS #12" msgstr "当前的 TLS 后端不支持 PKCS #12" -#: gio/gtlscertificate.c:1017 +#: gio/gtlscertificate.c:975 msgid "This GTlsBackend does not support creating PKCS #11 certificates" msgstr "本 GTlsBackend 不支持创建 PKCS #11 证书" -#: gio/gtlspassword.c:113 +#: gio/gtlspassword.c:104 msgid "" "This is the last chance to enter the password correctly before your access " "is locked out." @@ -4209,139 +4251,150 @@ msgstr "这是您的访问被锁定前最后一次机会输入正确的密码。 #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. -#: gio/gtlspassword.c:117 +#: gio/gtlspassword.c:108 msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." msgstr "密码多次输入错误,您的访问将在数次错误输入后锁定。" -#: gio/gtlspassword.c:119 +#: gio/gtlspassword.c:110 msgid "The password entered is incorrect." msgstr "输入的密码不正确。" -#: gio/gunixconnection.c:127 +#: gio/gunixconnection.c:116 msgid "Sending FD is not supported" msgstr "不支持发送 FD" -#: gio/gunixconnection.c:181 gio/gunixconnection.c:602 +#: gio/gunixconnection.c:170 gio/gunixconnection.c:591 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "应为 1 个控件消息,却得到 %d 个" -#: gio/gunixconnection.c:197 gio/gunixconnection.c:614 +#: gio/gunixconnection.c:186 gio/gunixconnection.c:603 msgid "Unexpected type of ancillary data" msgstr "非预期的辅助数据类型" -#: gio/gunixconnection.c:216 +#: gio/gunixconnection.c:205 #, c-format msgid "Expecting one fd, but got %d\n" msgid_plural "Expecting one fd, but got %d\n" msgstr[0] "应为 1 个文件描述符,却得到 %d 个\n" -#: gio/gunixconnection.c:235 +#: gio/gunixconnection.c:224 msgid "Received invalid fd" msgstr "收到无效文件描述符" -#: gio/gunixconnection.c:242 +#: gio/gunixconnection.c:231 msgid "Receiving FD is not supported" msgstr "不支持接收 FD" -#: gio/gunixconnection.c:384 +#: gio/gunixconnection.c:373 msgid "Error sending credentials: " msgstr "发送凭据时出错:" -#: gio/gunixconnection.c:542 +#: gio/gunixconnection.c:531 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "检查套接字是否启用 SO_PASSCRED 时出错:%s" -#: gio/gunixconnection.c:558 +#: gio/gunixconnection.c:547 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "启用 SO_PASSCRED 时出错:%s" -#: gio/gunixconnection.c:587 +#: gio/gunixconnection.c:576 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "期望为接收证书读到单个字节但是只读到了 0 字节" -#: gio/gunixconnection.c:628 +#: gio/gunixconnection.c:617 #, c-format msgid "Not expecting control message, but got %d" msgstr "未期望控制信息,却得到 %d 个" -#: gio/gunixconnection.c:653 +#: gio/gunixconnection.c:642 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "禁用 SO_PASSCRED 时出错:%s" -#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380 +#: gio/gunixinputstream.c:352 gio/gunixinputstream.c:373 #, c-format msgid "Error reading from file descriptor: %s" msgstr "从文件描述符读取时出错:%s" -#: gio/gunixinputstream.c:413 gio/gunixoutputstream.c:522 -#: gio/gwin32inputstream.c:219 gio/gwin32outputstream.c:206 +#: gio/gunixinputstream.c:406 gio/gunixoutputstream.c:515 +#: gio/gwin32inputstream.c:216 gio/gwin32outputstream.c:203 #, c-format msgid "Error closing file descriptor: %s" msgstr "关闭文件描述符时出错:%s" -#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879 +#: gio/gunixmounts.c:2890 gio/gunixmounts.c:2943 msgid "Filesystem root" msgstr "文件系统根目录" -#: gio/gunixoutputstream.c:359 gio/gunixoutputstream.c:379 -#: gio/gunixoutputstream.c:466 gio/gunixoutputstream.c:486 -#: gio/gunixoutputstream.c:632 +#: gio/gunixoutputstream.c:352 gio/gunixoutputstream.c:372 +#: gio/gunixoutputstream.c:459 gio/gunixoutputstream.c:479 +#: gio/gunixoutputstream.c:625 #, c-format msgid "Error writing to file descriptor: %s" msgstr "写入文件描述符时出错:%s" -#: gio/gunixsocketaddress.c:253 +#: gio/gunixsocketaddress.c:245 msgid "Abstract UNIX domain socket addresses not supported on this system" msgstr "本系统不支持抽象 Unix 域套接字地址" -#: gio/gvolume.c:440 +#: gio/gvolume.c:436 msgid "volume doesn’t implement eject" msgstr "卷未实现弹出" #. Translators: This is an error #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. -#: gio/gvolume.c:517 +#: gio/gvolume.c:513 msgid "volume doesn’t implement eject or eject_with_operation" msgstr "卷未实现弹出或 eject_with_operation" -#: gio/gwin32inputstream.c:187 +#: gio/gwin32appinfo.c:5216 +#, c-format +msgid "The app ‘%s’ in the application object has no verbs" +msgstr "应用程序对象中的应用“%s”没有动词" + +#: gio/gwin32appinfo.c:5220 +#, c-format +msgid "" +"The app ‘%s’ and the handler ‘%s’ in the application object have no verbs" +msgstr "应用程序对象中的应用“%s”和处理程序“%s”没有动词" + +#: gio/gwin32inputstream.c:184 #, c-format msgid "Error reading from handle: %s" msgstr "读取句柄时出错:%s" -#: gio/gwin32inputstream.c:234 gio/gwin32outputstream.c:221 +#: gio/gwin32inputstream.c:231 gio/gwin32outputstream.c:218 #, c-format msgid "Error closing handle: %s" msgstr "关闭句柄时出错:%s" -#: gio/gwin32outputstream.c:174 +#: gio/gwin32outputstream.c:171 #, c-format msgid "Error writing to handle: %s" msgstr "写入句柄时出错:%s" -#: gio/gzlibcompressor.c:396 gio/gzlibdecompressor.c:349 +#: gio/gzlibcompressor.c:399 gio/gzlibdecompressor.c:345 msgid "Not enough memory" msgstr "内存不足" -#: gio/gzlibcompressor.c:403 gio/gzlibdecompressor.c:356 +#: gio/gzlibcompressor.c:406 gio/gzlibdecompressor.c:352 #, c-format msgid "Internal error: %s" msgstr "内部错误:%s" -#: gio/gzlibcompressor.c:416 gio/gzlibdecompressor.c:370 +#: gio/gzlibcompressor.c:419 gio/gzlibdecompressor.c:366 msgid "Need more input" msgstr "需要更多输入" -#: gio/gzlibdecompressor.c:342 +#: gio/gzlibdecompressor.c:338 msgid "Invalid compressed data" msgstr "无效的压缩数据" @@ -4369,152 +4422,290 @@ msgstr "运行一个 dbus 服务" msgid "Wrong args\n" msgstr "参数错误\n" -#: glib/gbookmarkfile.c:861 +#: girepository/compiler/compiler.c:93 +#, c-format +msgid "Failed to open ‘%s’: %s" +msgstr "打开“%s”失败:%s" + +#: girepository/compiler/compiler.c:103 +#, c-format +msgid "Error: Could not write the whole output: %s" +msgstr "错误:无法写入完整输出:%s" + +#: girepository/compiler/compiler.c:115 +#, c-format +msgid "Error: Failed to rename ‘%s’ to ‘%s’: %s" +msgstr "错误:将“%s”重命名为“%s”失败:%s" + +#: girepository/compiler/compiler.c:147 girepository/decompiler/decompiler.c:53 +msgid "Include directories in GIR search path" +msgstr "包括 GIR 搜索路径中的目录" + +#: girepository/compiler/compiler.c:148 girepository/decompiler/decompiler.c:52 +msgid "Output file" +msgstr "输出文件" + +#: girepository/compiler/compiler.c:149 +msgid "Shared library" +msgstr "共享库" + +#: girepository/compiler/compiler.c:150 +msgid "Show debug messages" +msgstr "显示调试消息" + +#: girepository/compiler/compiler.c:151 +msgid "Show verbose messages" +msgstr "显示详尽消息" + +#: girepository/compiler/compiler.c:152 girepository/decompiler/decompiler.c:55 +msgid "Show program’s version number and exit" +msgstr "显示程序版本并退出" + +#: girepository/compiler/compiler.c:175 +#, c-format +msgid "Error parsing arguments: %s" +msgstr "解析参数时出错:%s" + +#: girepository/compiler/compiler.c:202 +msgid "Please specify exactly one input file" +msgstr "请明确指定一个输入文件" + +#: girepository/compiler/compiler.c:218 +#, c-format +msgid "Error parsing file ‘%s’: %s" +msgstr "解析文件“%s”时出错:%s" + +#: girepository/compiler/compiler.c:243 +#, c-format +msgid "Failed to build typelib for module ‘%s’" +msgstr "为模块“%s”构建类型库失败" + +#: girepository/compiler/compiler.c:245 +#, c-format +msgid "Invalid typelib for module ‘%s’: %s" +msgstr "用于模块“%s”的无效类型库:%s" + +#: girepository/decompiler/decompiler.c:54 +msgid "Show all available information" +msgstr "显示所有可用信息" + +#: girepository/decompiler/decompiler.c:71 +#, c-format +msgid "Failed to parse: %s" +msgstr "解析失败:%s" + +#: girepository/decompiler/decompiler.c:87 +msgid "No input files" +msgstr "无输入文件" + +#: girepository/decompiler/decompiler.c:113 +#, c-format +msgid "Failed to read ‘%s’: %s" +msgstr "读取“%s”失败:%s" + +#: girepository/decompiler/decompiler.c:125 +#, c-format +msgid "Failed to create typelib ‘%s’: %s" +msgstr "创建类型库“%s”失败:%s" + +#: girepository/decompiler/decompiler.c:129 +#: girepository/inspector/inspector.c:113 +#, c-format +msgid "Failed to load typelib: %s" +msgstr "加载类型库失败:%s" + +#: girepository/decompiler/decompiler.c:136 +#, c-format +msgid "Warning: %u modules omitted" +msgstr "警告:%u 模块已忽略" + +#: girepository/inspector/inspector.c:72 +msgid "Typelib version to inspect" +msgstr "要检查的类型库版本" + +#: girepository/inspector/inspector.c:72 +msgid "VERSION" +msgstr "版本" + +#: girepository/inspector/inspector.c:73 +msgid "List the shared libraries the typelib requires" +msgstr "列出类型库需要的共享库" + +#: girepository/inspector/inspector.c:74 +msgid "List other typelibs the inspected typelib requires" +msgstr "列出检查的类型库需要的其它类型库" + +#: girepository/inspector/inspector.c:75 +msgid "The typelib to inspect" +msgstr "要检查的类型库" + +#: girepository/inspector/inspector.c:75 +msgid "NAMESPACE" +msgstr "命名空间" + +#: girepository/inspector/inspector.c:82 +msgid "- Inspect GI typelib" +msgstr "- 检查 GI 类型库" + +#: girepository/inspector/inspector.c:86 +#, c-format +msgid "Failed to parse command line options: %s" +msgstr "解析命令行选项失败:%s" + +#: girepository/inspector/inspector.c:96 +msgid "Please specify exactly one namespace" +msgstr "请明确指定一个命名空间" + +#: girepository/inspector/inspector.c:105 +msgid "Please specify --print-shlibs, --print-typelibs or both" +msgstr "请指定 --print-shlibs、--print-typelibs 或全部" + +#: glib/gbookmarkfile.c:816 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "元素“%2$s”的意外属性“%1$s”" -#: glib/gbookmarkfile.c:872 glib/gbookmarkfile.c:952 glib/gbookmarkfile.c:962 -#: glib/gbookmarkfile.c:1075 +#: glib/gbookmarkfile.c:827 glib/gbookmarkfile.c:907 glib/gbookmarkfile.c:917 +#: glib/gbookmarkfile.c:1030 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "元素“%2$s”的属性“%1$s”未找到" -#: glib/gbookmarkfile.c:1284 glib/gbookmarkfile.c:1349 -#: glib/gbookmarkfile.c:1413 glib/gbookmarkfile.c:1423 +#: glib/gbookmarkfile.c:1239 glib/gbookmarkfile.c:1304 +#: glib/gbookmarkfile.c:1368 glib/gbookmarkfile.c:1378 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "意外标签“%s”,需要标签“%s”" -#: glib/gbookmarkfile.c:1309 glib/gbookmarkfile.c:1323 -#: glib/gbookmarkfile.c:1391 glib/gbookmarkfile.c:1437 +#: glib/gbookmarkfile.c:1264 glib/gbookmarkfile.c:1278 +#: glib/gbookmarkfile.c:1346 glib/gbookmarkfile.c:1392 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "“%2$s”中有意外标签“%1$s”" -#: glib/gbookmarkfile.c:1717 +#: glib/gbookmarkfile.c:1672 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "书签文件中有无效的日期/时间“%s”" -#: glib/gbookmarkfile.c:1956 +#: glib/gbookmarkfile.c:1911 msgid "No valid bookmark file found in data dirs" msgstr "数据目录中没有找到有效的书签文件" -#: glib/gbookmarkfile.c:2157 +#: glib/gbookmarkfile.c:2112 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "URI“%s”的书签已经存在" -#: glib/gbookmarkfile.c:2206 glib/gbookmarkfile.c:2364 -#: glib/gbookmarkfile.c:2449 glib/gbookmarkfile.c:2529 -#: glib/gbookmarkfile.c:2614 glib/gbookmarkfile.c:2748 -#: glib/gbookmarkfile.c:2881 glib/gbookmarkfile.c:3016 -#: glib/gbookmarkfile.c:3058 glib/gbookmarkfile.c:3155 -#: glib/gbookmarkfile.c:3276 glib/gbookmarkfile.c:3470 -#: glib/gbookmarkfile.c:3611 glib/gbookmarkfile.c:3830 -#: glib/gbookmarkfile.c:3919 glib/gbookmarkfile.c:4008 -#: glib/gbookmarkfile.c:4127 +#: glib/gbookmarkfile.c:2161 glib/gbookmarkfile.c:2319 +#: glib/gbookmarkfile.c:2404 glib/gbookmarkfile.c:2484 +#: glib/gbookmarkfile.c:2569 glib/gbookmarkfile.c:2703 +#: glib/gbookmarkfile.c:2836 glib/gbookmarkfile.c:2971 +#: glib/gbookmarkfile.c:3013 glib/gbookmarkfile.c:3110 +#: glib/gbookmarkfile.c:3231 glib/gbookmarkfile.c:3425 +#: glib/gbookmarkfile.c:3566 glib/gbookmarkfile.c:3785 +#: glib/gbookmarkfile.c:3874 glib/gbookmarkfile.c:3963 +#: glib/gbookmarkfile.c:4082 #, c-format msgid "No bookmark found for URI “%s”" msgstr "未找到 URI“%s”的书签" -#: glib/gbookmarkfile.c:2538 +#: glib/gbookmarkfile.c:2493 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "URI“%s”的书签未定义 MIME 类型" -#: glib/gbookmarkfile.c:2623 +#: glib/gbookmarkfile.c:2578 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "URI“%s”的书签未定义私有标志" -#: glib/gbookmarkfile.c:3164 +#: glib/gbookmarkfile.c:3119 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "URI“%s”的书签未设定组" -#: glib/gbookmarkfile.c:3632 glib/gbookmarkfile.c:3840 +#: glib/gbookmarkfile.c:3587 glib/gbookmarkfile.c:3795 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "没有名为“%s”的应用程序为“%s”注册了书签" -#: glib/gbookmarkfile.c:3863 +#: glib/gbookmarkfile.c:3818 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "用 URI“%2$s”展开 exec 行“%1$s”失败" -#: glib/gconvert.c:469 +#: glib/gconvert.c:379 msgid "Unrepresentable character in conversion input" msgstr "转换输入中出现无法表达的字符" -#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 +#: glib/gconvert.c:406 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304 #: glib/gutf8.c:1408 msgid "Partial character sequence at end of input" msgstr "输入末尾出现未尽字符序列" -#: glib/gconvert.c:767 +#: glib/gconvert.c:677 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "无法转换后备字符集“%s”到字符集“%s”" -#: glib/gconvert.c:939 +#: glib/gconvert.c:849 msgid "Embedded NUL byte in conversion input" msgstr "转换输入中出现嵌入的 NUL 字节" -#: glib/gconvert.c:960 +#: glib/gconvert.c:870 msgid "Embedded NUL byte in conversion output" msgstr "转换输出中出现嵌入的 NUL 字节" -#: glib/gconvert.c:1698 +#: glib/gconvert.c:1608 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "URI“%s”不是使用“file”方案的绝对 URI" -#: glib/gconvert.c:1728 +#: glib/gconvert.c:1638 #, c-format msgid "The URI “%s” is invalid" msgstr "URI“%s”无效" -#: glib/gconvert.c:1741 +#: glib/gconvert.c:1651 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "URI“%s”中的主机名无效" -#: glib/gconvert.c:1758 +#: glib/gconvert.c:1668 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "URI“%s”中包含无效的转义字符" -#: glib/gconvert.c:1832 +#: glib/gconvert.c:1742 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "路径名“%s”不是绝对路径" # 参考 coreutils 里 date 的翻译,时间格式应该保持“%H:%M:%S”,如果要使用单位,那么“%H时%M分%S秒”应该去掉占位的 0,不然就会出现“08时01分01秒”这种表达。因此我认为应该直接使用“%H:%M:%S”格式。 #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:228 +#: glib/gdatetime.c:199 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%Y年%-m月%-d日 %A %H:%M:%S" # 原来的格式是“%y/%m/%d”,但“/”这个符号会有误解。所以换成分隔符。 #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:231 +#: glib/gdatetime.c:202 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%Y-%m-%d" # 跟其他时间格式不统一 #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:234 +#: glib/gdatetime.c:205 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%H:%M:%S" # 同上面,去掉了时分秒单位。 #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:237 +#: glib/gdatetime.c:208 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%p %I:%M:%S" @@ -4535,62 +4726,62 @@ msgstr "%p %I:%M:%S" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:247 msgctxt "full month name" msgid "January" msgstr "一月" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:249 msgctxt "full month name" msgid "February" msgstr "二月" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:251 msgctxt "full month name" msgid "March" msgstr "三月" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:253 msgctxt "full month name" msgid "April" msgstr "四月" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:255 msgctxt "full month name" msgid "May" msgstr "五月" -#: glib/gdatetime.c:286 +#: glib/gdatetime.c:257 msgctxt "full month name" msgid "June" msgstr "六月" -#: glib/gdatetime.c:288 +#: glib/gdatetime.c:259 msgctxt "full month name" msgid "July" msgstr "七月" -#: glib/gdatetime.c:290 +#: glib/gdatetime.c:261 msgctxt "full month name" msgid "August" msgstr "八月" -#: glib/gdatetime.c:292 +#: glib/gdatetime.c:263 msgctxt "full month name" msgid "September" msgstr "九月" -#: glib/gdatetime.c:294 +#: glib/gdatetime.c:265 msgctxt "full month name" msgid "October" msgstr "十月" -#: glib/gdatetime.c:296 +#: glib/gdatetime.c:267 msgctxt "full month name" msgid "November" msgstr "十一月" -#: glib/gdatetime.c:298 +#: glib/gdatetime.c:269 msgctxt "full month name" msgid "December" msgstr "十二月" @@ -4612,132 +4803,132 @@ msgstr "十二月" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:301 msgctxt "abbreviated month name" msgid "Jan" msgstr "一月" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:303 msgctxt "abbreviated month name" msgid "Feb" msgstr "二月" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:305 msgctxt "abbreviated month name" msgid "Mar" msgstr "三月" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:307 msgctxt "abbreviated month name" msgid "Apr" msgstr "四月" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:309 msgctxt "abbreviated month name" msgid "May" msgstr "五月" -#: glib/gdatetime.c:340 +#: glib/gdatetime.c:311 msgctxt "abbreviated month name" msgid "Jun" msgstr "六月" -#: glib/gdatetime.c:342 +#: glib/gdatetime.c:313 msgctxt "abbreviated month name" msgid "Jul" msgstr "七月" -#: glib/gdatetime.c:344 +#: glib/gdatetime.c:315 msgctxt "abbreviated month name" msgid "Aug" msgstr "八月" -#: glib/gdatetime.c:346 +#: glib/gdatetime.c:317 msgctxt "abbreviated month name" msgid "Sep" msgstr "九月" -#: glib/gdatetime.c:348 +#: glib/gdatetime.c:319 msgctxt "abbreviated month name" msgid "Oct" msgstr "十月" -#: glib/gdatetime.c:350 +#: glib/gdatetime.c:321 msgctxt "abbreviated month name" msgid "Nov" msgstr "十一月" -#: glib/gdatetime.c:352 +#: glib/gdatetime.c:323 msgctxt "abbreviated month name" msgid "Dec" msgstr "十二月" -#: glib/gdatetime.c:367 +#: glib/gdatetime.c:338 msgctxt "full weekday name" msgid "Monday" msgstr "星期一" -#: glib/gdatetime.c:369 +#: glib/gdatetime.c:340 msgctxt "full weekday name" msgid "Tuesday" msgstr "星期二" -#: glib/gdatetime.c:371 +#: glib/gdatetime.c:342 msgctxt "full weekday name" msgid "Wednesday" msgstr "星期三" -#: glib/gdatetime.c:373 +#: glib/gdatetime.c:344 msgctxt "full weekday name" msgid "Thursday" msgstr "星期四" -#: glib/gdatetime.c:375 +#: glib/gdatetime.c:346 msgctxt "full weekday name" msgid "Friday" msgstr "星期五" -#: glib/gdatetime.c:377 +#: glib/gdatetime.c:348 msgctxt "full weekday name" msgid "Saturday" msgstr "星期六" -#: glib/gdatetime.c:379 +#: glib/gdatetime.c:350 msgctxt "full weekday name" msgid "Sunday" msgstr "星期日" -#: glib/gdatetime.c:394 +#: glib/gdatetime.c:365 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "周一" -#: glib/gdatetime.c:396 +#: glib/gdatetime.c:367 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "周二" -#: glib/gdatetime.c:398 +#: glib/gdatetime.c:369 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "周三" -#: glib/gdatetime.c:400 +#: glib/gdatetime.c:371 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "周四" -#: glib/gdatetime.c:402 +#: glib/gdatetime.c:373 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "周五" -#: glib/gdatetime.c:404 +#: glib/gdatetime.c:375 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "周六" -#: glib/gdatetime.c:406 +#: glib/gdatetime.c:377 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "周日" @@ -4759,62 +4950,62 @@ msgstr "周日" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:441 msgctxt "full month name with day" msgid "January" msgstr "一月" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:443 msgctxt "full month name with day" msgid "February" msgstr "二月" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:445 msgctxt "full month name with day" msgid "March" msgstr "三月" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:447 msgctxt "full month name with day" msgid "April" msgstr "四月" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:449 msgctxt "full month name with day" msgid "May" msgstr "五月" -#: glib/gdatetime.c:480 +#: glib/gdatetime.c:451 msgctxt "full month name with day" msgid "June" msgstr "六月" -#: glib/gdatetime.c:482 +#: glib/gdatetime.c:453 msgctxt "full month name with day" msgid "July" msgstr "七月" -#: glib/gdatetime.c:484 +#: glib/gdatetime.c:455 msgctxt "full month name with day" msgid "August" msgstr "八月" -#: glib/gdatetime.c:486 +#: glib/gdatetime.c:457 msgctxt "full month name with day" msgid "September" msgstr "九月" -#: glib/gdatetime.c:488 +#: glib/gdatetime.c:459 msgctxt "full month name with day" msgid "October" msgstr "十月" -#: glib/gdatetime.c:490 +#: glib/gdatetime.c:461 msgctxt "full month name with day" msgid "November" msgstr "十一月" -#: glib/gdatetime.c:492 +#: glib/gdatetime.c:463 msgctxt "full month name with day" msgid "December" msgstr "十二月" @@ -4836,273 +5027,280 @@ msgstr "十二月" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:528 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "一月" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:530 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "二月" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:532 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "三月" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:534 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "四月" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:536 msgctxt "abbreviated month name with day" msgid "May" msgstr "五月" -#: glib/gdatetime.c:567 +#: glib/gdatetime.c:538 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "六月" -#: glib/gdatetime.c:569 +#: glib/gdatetime.c:540 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "七月" -#: glib/gdatetime.c:571 +#: glib/gdatetime.c:542 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "八月" -#: glib/gdatetime.c:573 +#: glib/gdatetime.c:544 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "九月" -#: glib/gdatetime.c:575 +#: glib/gdatetime.c:546 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "十月" -#: glib/gdatetime.c:577 +#: glib/gdatetime.c:548 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "十一月" -#: glib/gdatetime.c:579 +#: glib/gdatetime.c:550 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "十二月" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:596 +#: glib/gdatetime.c:592 msgctxt "GDateTime" msgid "AM" msgstr "上午" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:599 +#: glib/gdatetime.c:595 msgctxt "GDateTime" msgid "PM" msgstr "下午" -#: glib/gdir.c:158 +#: glib/gdir.c:168 #, c-format msgid "Error opening directory “%s”: %s" msgstr "打开目录“%s”时出错:%s" -#: glib/gfileutils.c:753 glib/gfileutils.c:845 +#. Translators: the first %s contains the file size +#. * (already formatted with units), and the second %s +#. * contains the file name +#: glib/gfileutils.c:720 glib/gfileutils.c:829 #, c-format -msgid "Could not allocate %lu byte to read file “%s”" -msgid_plural "Could not allocate %lu bytes to read file “%s”" -msgstr[0] "无法分配 %lu 字节以读取文件“%s”" +msgid "Could not allocate %s to read file “%s”" +msgstr "无法分配 %s 空间来读取文件“%s”" -#: glib/gfileutils.c:770 +#: glib/gfileutils.c:738 #, c-format msgid "Error reading file “%s”: %s" msgstr "读取文件“%s”时出错:%s" -#: glib/gfileutils.c:806 +#: glib/gfileutils.c:774 glib/gfileutils.c:808 #, c-format msgid "File “%s” is too large" msgstr "文件“%s”过大" -#: glib/gfileutils.c:870 +#: glib/gfileutils.c:855 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "读取文件“%s”失败:%s" -#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472 +#: glib/gfileutils.c:905 glib/gfileutils.c:980 glib/gfileutils.c:1487 #, c-format msgid "Failed to open file “%s”: %s" msgstr "打开文件“%s”失败:%s" -#: glib/gfileutils.c:933 +#: glib/gfileutils.c:918 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "获得文件“%s”的属性失败:fstat() 失败:%s" -#: glib/gfileutils.c:964 +#: glib/gfileutils.c:949 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "打开文件“%s”失败:fdopen() 失败:%s" -#: glib/gfileutils.c:1065 +#: glib/gfileutils.c:1050 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "将文件“%s”重命名为“%s”失败:g_rename() 失败:%s" -#: glib/gfileutils.c:1179 +#: glib/gfileutils.c:1149 +#, c-format +msgid "Failed to write file “%s”: ftruncate() failed: %s" +msgstr "写入文件“%s”失败:ftruncate() 失败:%s" + +#: glib/gfileutils.c:1194 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "写入文件“%s”失败:write() 失败:%s" -#: glib/gfileutils.c:1200 +#: glib/gfileutils.c:1215 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "写入文件“%s”失败:fsync() 失败:%s" -#: glib/gfileutils.c:1361 glib/gfileutils.c:1776 +#: glib/gfileutils.c:1376 glib/gfileutils.c:1793 #, c-format msgid "Failed to create file “%s”: %s" msgstr "创建文件“%s”失败:%s" -#: glib/gfileutils.c:1406 +#: glib/gfileutils.c:1421 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "无法删除已有文件“%s”:g_unlink() 失败:%s" -#: glib/gfileutils.c:1741 +#: glib/gfileutils.c:1758 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "模板“%s”无效,不应该包含“%s”" -#: glib/gfileutils.c:1754 +#: glib/gfileutils.c:1771 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "模板“%s”不包含 XXXXXX" -#: glib/gfileutils.c:2348 glib/gfileutils.c:2377 +#: glib/gfileutils.c:2365 glib/gfileutils.c:2394 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "读取符号链接“%s”失败:%s" -#: glib/giochannel.c:1408 +#: glib/giochannel.c:1397 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "无法打开从“%s”到“%s”的转换器:%s" -#: glib/giochannel.c:1761 +#: glib/giochannel.c:1750 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "g_io_channel_read_line_string 函数无法进行原始读取" -#: glib/giochannel.c:1808 glib/giochannel.c:2066 glib/giochannel.c:2153 +#: glib/giochannel.c:1797 glib/giochannel.c:2055 glib/giochannel.c:2142 msgid "Leftover unconverted data in read buffer" msgstr "在读缓冲里留有未转换数据" -#: glib/giochannel.c:1889 glib/giochannel.c:1966 +#: glib/giochannel.c:1878 glib/giochannel.c:1955 msgid "Channel terminates in a partial character" msgstr "通道终止于未尽字符" -#: glib/giochannel.c:1952 +#: glib/giochannel.c:1941 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "g_io_channel_read_to_end 函数无法进行原始读取" -#: glib/gkeyfile.c:802 +#: glib/gkeyfile.c:791 msgid "Valid key file could not be found in search dirs" msgstr "在搜索目录中无法找到有效的键文件" -#: glib/gkeyfile.c:839 +#: glib/gkeyfile.c:828 msgid "Not a regular file" msgstr "不是普通文件" -#: glib/gkeyfile.c:1297 +#: glib/gkeyfile.c:1286 #, c-format msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "键文件包含不是键-值对、组或注释的行“%s”" -#: glib/gkeyfile.c:1354 +#: glib/gkeyfile.c:1343 #, c-format msgid "Invalid group name: %s" msgstr "无效的组名:%s" -#: glib/gkeyfile.c:1378 +#: glib/gkeyfile.c:1367 msgid "Key file does not start with a group" msgstr "键文件不以组开始" -#: glib/gkeyfile.c:1402 +#: glib/gkeyfile.c:1391 #, c-format msgid "Invalid key name: %.*s" msgstr "无效的键名:%.*s" -#: glib/gkeyfile.c:1430 +#: glib/gkeyfile.c:1419 #, c-format msgid "Key file contains unsupported encoding “%s”" msgstr "键文件包含不支持的编码“%s”" -#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298 -#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634 -#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100 +#: glib/gkeyfile.c:1667 glib/gkeyfile.c:1840 glib/gkeyfile.c:3287 +#: glib/gkeyfile.c:3389 glib/gkeyfile.c:3494 glib/gkeyfile.c:3623 +#: glib/gkeyfile.c:3766 glib/gkeyfile.c:4015 glib/gkeyfile.c:4089 #, c-format msgid "Key file does not have group “%s”" msgstr "键文件没有组“%s”" -#: glib/gkeyfile.c:1806 +#: glib/gkeyfile.c:1795 #, c-format msgid "Key file does not have key “%s” in group “%s”" msgstr "键文件在组“%2$s”中没有键“%1$s”" -#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084 +#: glib/gkeyfile.c:1957 glib/gkeyfile.c:2073 #, c-format msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "键文件包含键“%s”,其值“%s”不是 UTF-8" -#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543 +#: glib/gkeyfile.c:1977 glib/gkeyfile.c:2093 glib/gkeyfile.c:2532 #, c-format msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "键文件包含键“%s”,其值无法解析。" -#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127 +#: glib/gkeyfile.c:2747 glib/gkeyfile.c:3116 #, c-format msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." msgstr "键文件包含组“%2$s”中的键“%1$s”,其值无法解释。" -#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913 +#: glib/gkeyfile.c:2825 glib/gkeyfile.c:2902 #, c-format msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "组“%2$s”中的键“%1$s”的值为“%3$s”,应为 %4$s" -#: glib/gkeyfile.c:4357 +#: glib/gkeyfile.c:4345 msgid "Key file contains escape character at end of line" msgstr "键文件在行尾含有转义字符" -#: glib/gkeyfile.c:4394 +#: glib/gkeyfile.c:4367 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "键文件中包含无效的转义序列“%s”" -#: glib/gkeyfile.c:4545 +#: glib/gkeyfile.c:4519 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "无法将值“%s”解释为数值。" -#: glib/gkeyfile.c:4559 +#: glib/gkeyfile.c:4533 #, c-format msgid "Integer value “%s” out of range" msgstr "整数值“%s”超出范围" -#: glib/gkeyfile.c:4592 +#: glib/gkeyfile.c:4566 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "无法将值“%s”解释为浮点数。" -#: glib/gkeyfile.c:4631 +#: glib/gkeyfile.c:4605 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "无法将值“%s”解释为布尔值。" @@ -5122,32 +5320,32 @@ msgstr "映射 %s%s%s%s 失败:mmap() 失败:%s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "打开文件“%s”失败:open() 失败:%s" -#: glib/gmarkup.c:398 glib/gmarkup.c:440 +#: glib/gmarkup.c:344 glib/gmarkup.c:386 #, c-format msgid "Error on line %d char %d: " msgstr "第 %d 行第 %d 个字符出错: " -#: glib/gmarkup.c:462 glib/gmarkup.c:545 +#: glib/gmarkup.c:408 glib/gmarkup.c:491 #, c-format msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "名称包含无效的 UTF-8 编码文本——无效的“%s”" -#: glib/gmarkup.c:473 +#: glib/gmarkup.c:419 #, c-format msgid "“%s” is not a valid name" msgstr "“%s”不是有效的名称" -#: glib/gmarkup.c:489 +#: glib/gmarkup.c:435 #, c-format msgid "“%s” is not a valid name: “%c”" msgstr "“%s”不是有效的名称:“%c”" -#: glib/gmarkup.c:613 +#: glib/gmarkup.c:559 #, c-format msgid "Error on line %d: %s" msgstr "第 %d 行出错:%s" -#: glib/gmarkup.c:690 +#: glib/gmarkup.c:636 #, c-format msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " @@ -5155,7 +5353,7 @@ msgid "" msgstr "" "解析“%-.*s”失败。它应该是字符引用中的数字(如 ê)——可能该数字太大了" -#: glib/gmarkup.c:702 +#: glib/gmarkup.c:648 msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5164,22 +5362,22 @@ msgstr "" "字符引用没有以分号结束。很可能您使用了与号(&)字符而又不是一个实体——将这个与" "号变为 &" -#: glib/gmarkup.c:728 +#: glib/gmarkup.c:674 #, c-format msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "字符引用“%-.*s”没有编码一个允许的字符" -#: glib/gmarkup.c:766 +#: glib/gmarkup.c:712 msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "发现空的实体“&;”。有效的实体为:& " < > '" -#: glib/gmarkup.c:774 +#: glib/gmarkup.c:720 #, c-format msgid "Entity name “%-.*s” is not known" msgstr "未知的实体名“%-.*s”" -#: glib/gmarkup.c:779 +#: glib/gmarkup.c:725 msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5187,36 +5385,36 @@ msgstr "" "实体没有以分号结束。很可能您使用了与号(&)字符而又不是一个实体——将这个与号变" "为 &" -#: glib/gmarkup.c:1193 +#: glib/gmarkup.c:1139 msgid "Document must begin with an element (e.g. )" msgstr "文档必须以一个元素开始(例如 )" -#: glib/gmarkup.c:1233 +#: glib/gmarkup.c:1179 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "“%s”出现在字符“<”后是无效字符;它不能作为元素名的开头" -#: glib/gmarkup.c:1276 +#: glib/gmarkup.c:1222 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" msgstr "字符“%s”无效,应该以字符“>”来结束空元素标记“%s”" -#: glib/gmarkup.c:1346 +#: glib/gmarkup.c:1292 #, c-format msgid "Too many attributes in element “%s”" msgstr "元素“%s”中有过多参数" -#: glib/gmarkup.c:1366 +#: glib/gmarkup.c:1312 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "字符“%s”无效,在属性名“%s”(元素“%s”)的后应该是字符“=”" -#: glib/gmarkup.c:1408 +#: glib/gmarkup.c:1354 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5226,556 +5424,556 @@ msgstr "" "字符“%s”无效,应该以“>”或“/”结束元素“%s”的起始标记,或紧跟该元素的属性;可能" "您在属性名中使用了无效字符" -#: glib/gmarkup.c:1453 +#: glib/gmarkup.c:1399 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" msgstr "字符“%1$s”无效,在给元素“%3$s”的属性“%2$s”赋值时,等号后应该是前引号" -#: glib/gmarkup.c:1587 +#: glib/gmarkup.c:1533 #, c-format msgid "" "“%s” is not a valid character following the characters “”" msgstr "“%s”字符出现在闭合元素名“%s”后无效;允许的字符是“>”" -#: glib/gmarkup.c:1637 +#: glib/gmarkup.c:1583 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "元素“%s”已经闭合,当前没有开放的元素" -#: glib/gmarkup.c:1646 +#: glib/gmarkup.c:1592 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "元素“%s”已经闭合,当前仍开放的元素是“%s”" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1745 msgid "Document was empty or contained only whitespace" msgstr "文档为空或仅含空白字符" -#: glib/gmarkup.c:1813 +#: glib/gmarkup.c:1759 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "文档在一个左尖括号“<”后意外结束" -#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 +#: glib/gmarkup.c:1767 glib/gmarkup.c:1812 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" msgstr "文档在元素仍开放处意外结束——最后未结束的元素是“%s”" -#: glib/gmarkup.c:1829 +#: glib/gmarkup.c:1775 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " "the tag <%s/>" msgstr "文档意外结束,应该以右尖括号“>”来结束标记 <%s/>" -#: glib/gmarkup.c:1835 +#: glib/gmarkup.c:1781 msgid "Document ended unexpectedly inside an element name" msgstr "文档在元素名中意外结束" -#: glib/gmarkup.c:1841 +#: glib/gmarkup.c:1787 msgid "Document ended unexpectedly inside an attribute name" msgstr "文档在属性名中意外结束" -#: glib/gmarkup.c:1846 +#: glib/gmarkup.c:1792 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "文档在元素仍开放的标记中意外结束。" -#: glib/gmarkup.c:1852 +#: glib/gmarkup.c:1798 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" msgstr "文档在跟在属性名后的等号后意外结束;没有属性值" -#: glib/gmarkup.c:1859 +#: glib/gmarkup.c:1805 msgid "Document ended unexpectedly while inside an attribute value" msgstr "文档在属性值中意外结束" -#: glib/gmarkup.c:1876 +#: glib/gmarkup.c:1822 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "文档在元素“%s”的闭合标记中意外结束" -#: glib/gmarkup.c:1880 +#: glib/gmarkup.c:1826 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "文档在无起始元素的闭合标记中意外结束" -#: glib/gmarkup.c:1886 +#: glib/gmarkup.c:1832 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "文档在注释或处理指令中意外结束" -#: glib/goption.c:875 +#: glib/goption.c:716 msgid "[OPTION…]" msgstr "[选项…]" -#: glib/goption.c:991 +#: glib/goption.c:832 msgid "Help Options:" msgstr "帮助选项:" -#: glib/goption.c:992 +#: glib/goption.c:833 msgid "Show help options" msgstr "显示帮助选项" -#: glib/goption.c:998 +#: glib/goption.c:839 msgid "Show all help options" msgstr "显示全部帮助选项" -#: glib/goption.c:1061 +#: glib/goption.c:902 msgid "Application Options:" msgstr "应用程序选项:" -#: glib/goption.c:1063 +#: glib/goption.c:904 msgid "Options:" msgstr "选项:" -#: glib/goption.c:1127 glib/goption.c:1197 +#: glib/goption.c:968 glib/goption.c:1038 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "无法解析 %2$s 的整数值“%1$s”" -#: glib/goption.c:1137 glib/goption.c:1205 +#: glib/goption.c:978 glib/goption.c:1046 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "%2$s 所用的整数值“%1$s”超出范围" -#: glib/goption.c:1162 +#: glib/goption.c:1003 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "无法解析 %2$s 的双精度值“%1$s”" -#: glib/goption.c:1170 +#: glib/goption.c:1011 #, c-format msgid "Double value “%s” for %s out of range" msgstr "%2$s 所用的双精度值“%1$s”超出范围" -#: glib/goption.c:1462 glib/goption.c:1541 +#: glib/goption.c:1303 glib/goption.c:1382 #, c-format msgid "Error parsing option %s" msgstr "解析选项 %s 时出错" -#: glib/goption.c:1563 glib/goption.c:1676 +#: glib/goption.c:1404 glib/goption.c:1517 #, c-format msgid "Missing argument for %s" msgstr "缺少 %s 的参数" -#: glib/goption.c:2186 +#: glib/goption.c:2024 #, c-format msgid "Unknown option %s" msgstr "未知选项 %s" -#: glib/gregex.c:480 +#: glib/gregex.c:486 msgid "corrupted object" msgstr "无效对象" -#: glib/gregex.c:482 +#: glib/gregex.c:488 msgid "out of memory" msgstr "内存不足" -#: glib/gregex.c:497 +#: glib/gregex.c:503 msgid "internal error" msgstr "内部错误" -#: glib/gregex.c:499 +#: glib/gregex.c:505 msgid "the pattern contains items not supported for partial matching" msgstr "表达式包含不被部分匹配支持的项" -#: glib/gregex.c:501 +#: glib/gregex.c:507 msgid "back references as conditions are not supported for partial matching" msgstr "不完全匹配时作为条件的后向引用不被支持" -#: glib/gregex.c:507 +#: glib/gregex.c:513 msgid "recursion limit reached" msgstr "达到递归上限" -#: glib/gregex.c:509 +#: glib/gregex.c:515 msgid "bad offset" msgstr "错误的偏移值" -#: glib/gregex.c:511 +#: glib/gregex.c:517 msgid "recursion loop" msgstr "递归循环" #. should not happen in GRegex since we check modes before each match -#: glib/gregex.c:514 +#: glib/gregex.c:520 msgid "matching mode is requested that was not compiled for JIT" msgstr "请求了匹配模式,但它未为 JIT 编译" -#: glib/gregex.c:535 glib/gregex.c:1851 +#: glib/gregex.c:541 glib/gregex.c:1869 msgid "unknown error" msgstr "未知错误" -#: glib/gregex.c:556 +#: glib/gregex.c:562 msgid "\\ at end of pattern" msgstr "\\ 在表达式末尾" -#: glib/gregex.c:560 +#: glib/gregex.c:566 msgid "\\c at end of pattern" msgstr "表达式末尾的 \\c" -#: glib/gregex.c:565 +#: glib/gregex.c:571 msgid "unrecognized character following \\" msgstr "\\ 后有无法识别的字符" -#: glib/gregex.c:569 +#: glib/gregex.c:575 msgid "numbers out of order in {} quantifier" msgstr "{} 量词里的数字次序颠倒了" -#: glib/gregex.c:573 +#: glib/gregex.c:579 msgid "number too big in {} quantifier" msgstr "{} 量词里的数字太大了" -#: glib/gregex.c:577 +#: glib/gregex.c:583 msgid "missing terminating ] for character class" msgstr "字符类缺少终结的 ]" -#: glib/gregex.c:581 +#: glib/gregex.c:587 msgid "invalid escape sequence in character class" msgstr "字符类包含无效的转义序列" -#: glib/gregex.c:585 +#: glib/gregex.c:591 msgid "range out of order in character class" msgstr "字符类的范围次序颠倒" -#: glib/gregex.c:590 +#: glib/gregex.c:596 msgid "nothing to repeat" msgstr "没有可以重复的内容" -#: glib/gregex.c:594 +#: glib/gregex.c:600 msgid "unrecognized character after (? or (?-" msgstr "(? 或 (?- 后有无法识别的字符" -#: glib/gregex.c:598 +#: glib/gregex.c:604 msgid "POSIX named classes are supported only within a class" msgstr "只有类里支持 POSIX 命名的类" -#: glib/gregex.c:602 +#: glib/gregex.c:608 msgid "POSIX collating elements are not supported" msgstr "不支持 POSIX 整理元素" -#: glib/gregex.c:608 +#: glib/gregex.c:614 msgid "missing terminating )" msgstr "缺少结束的 )" -#: glib/gregex.c:612 +#: glib/gregex.c:618 msgid "reference to non-existent subpattern" msgstr "引用了不存在的子表达式" -#: glib/gregex.c:616 +#: glib/gregex.c:622 msgid "missing ) after comment" msgstr "注释后缺少 )" -#: glib/gregex.c:620 +#: glib/gregex.c:626 msgid "regular expression is too large" msgstr "正则表达式过长" -#: glib/gregex.c:624 +#: glib/gregex.c:630 msgid "malformed number or name after (?(" msgstr "(?( 后有形式不正确的数字或名称" -#: glib/gregex.c:628 +#: glib/gregex.c:634 msgid "lookbehind assertion is not fixed length" msgstr "lookbehind 断言不是定长的" -#: glib/gregex.c:632 +#: glib/gregex.c:638 msgid "conditional group contains more than two branches" msgstr "条件组包含了超过两个分支" -#: glib/gregex.c:636 +#: glib/gregex.c:642 msgid "assertion expected after (?(" msgstr "(?( 后应该有断言" -#: glib/gregex.c:640 +#: glib/gregex.c:646 msgid "a numbered reference must not be zero" msgstr "编号引用不能为 0" -#: glib/gregex.c:644 +#: glib/gregex.c:650 msgid "unknown POSIX class name" msgstr "未知的 POSIX 类名" -#: glib/gregex.c:649 +#: glib/gregex.c:655 msgid "character value in \\x{...} sequence is too large" msgstr "\\x{...} 序列里的字符值太大了" -#: glib/gregex.c:653 +#: glib/gregex.c:659 msgid "\\C not allowed in lookbehind assertion" msgstr "lookbehind 断言里不允许使用 \\C" -#: glib/gregex.c:657 +#: glib/gregex.c:663 msgid "missing terminator in subpattern name" msgstr "子表达式名里缺少终结符" -#: glib/gregex.c:661 +#: glib/gregex.c:667 msgid "two named subpatterns have the same name" msgstr "两个有名子表达式有相同的名称" -#: glib/gregex.c:665 +#: glib/gregex.c:671 msgid "malformed \\P or \\p sequence" msgstr "形式不正确的 \\P 或 \\p 序列" -#: glib/gregex.c:669 +#: glib/gregex.c:675 msgid "unknown property name after \\P or \\p" msgstr "\\P 或 \\p 后有未知的属性名" -#: glib/gregex.c:673 +#: glib/gregex.c:679 msgid "subpattern name is too long (maximum 32 characters)" msgstr "子表达式名太长了(最多 32 个字符)" -#: glib/gregex.c:677 +#: glib/gregex.c:683 msgid "too many named subpatterns (maximum 10,000)" msgstr "有名子表达式太多了(最多 10,000 个)" -#: glib/gregex.c:681 +#: glib/gregex.c:687 msgid "octal value is greater than \\377" msgstr "八进制值大于 \\377" -#: glib/gregex.c:685 +#: glib/gregex.c:691 msgid "DEFINE group contains more than one branch" msgstr "定义组包含多于一个的分支" -#: glib/gregex.c:689 +#: glib/gregex.c:695 msgid "inconsistent NEWLINE options" msgstr "不一致的换行选项" -#: glib/gregex.c:693 +#: glib/gregex.c:699 msgid "" "\\g is not followed by a braced, angle-bracketed, or quoted name or number, " "or by a plain number" msgstr "\\g 后没有花括号、尖括号或引号括起来的名称或数字,或纯数字" -#: glib/gregex.c:698 +#: glib/gregex.c:704 msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)" msgstr "(*ACCEPT)、(*FAIL) 和 (*COMMIT) 不允许带参数" -#: glib/gregex.c:702 +#: glib/gregex.c:708 msgid "(*VERB) not recognized" msgstr "无法识别 (*VERB)" -#: glib/gregex.c:706 +#: glib/gregex.c:712 msgid "number is too big" msgstr "数字太大" -#: glib/gregex.c:710 +#: glib/gregex.c:716 msgid "missing subpattern name after (?&" msgstr "(?& 后缺少子表达式名" -#: glib/gregex.c:714 +#: glib/gregex.c:720 msgid "different names for subpatterns of the same number are not allowed" msgstr "不允许两个号码相同的子表达式有不同的名称" -#: glib/gregex.c:718 +#: glib/gregex.c:724 msgid "(*MARK) must have an argument" msgstr "(*MARK) 必须有一个参数" -#: glib/gregex.c:722 +#: glib/gregex.c:728 msgid "\\c must be followed by an ASCII character" msgstr "\\c 后面必须跟一个 ASCII 字符" -#: glib/gregex.c:726 +#: glib/gregex.c:732 msgid "\\k is not followed by a braced, angle-bracketed, or quoted name" msgstr "\\k 后没有用花括号、尖括号或引号括起来的名称" -#: glib/gregex.c:730 +#: glib/gregex.c:736 msgid "\\N is not supported in a class" msgstr "类中不支持 \\N" -#: glib/gregex.c:734 +#: glib/gregex.c:740 msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)" msgstr "在 (*MARK)、(*PRUNE)、(*SKIP) 或者 (*THEN) 中的名称太长" -#: glib/gregex.c:738 glib/gregex.c:874 +#: glib/gregex.c:744 glib/gregex.c:880 msgid "code overflow" msgstr "代码溢出" -#: glib/gregex.c:742 +#: glib/gregex.c:748 msgid "unrecognized character after (?P" msgstr "(?P 有无法识别的字符" -#: glib/gregex.c:746 +#: glib/gregex.c:752 msgid "overran compiling workspace" msgstr "编译工作区超出正常范围" -#: glib/gregex.c:750 +#: glib/gregex.c:756 msgid "previously-checked referenced subpattern not found" msgstr "未找到之前检查过的引用过的子表达式" -#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457 +#: glib/gregex.c:879 glib/gregex.c:1153 glib/gregex.c:2475 #, c-format msgid "Error while matching regular expression %s: %s" msgstr "匹配正则表达式 %s 时出错:%s" -#: glib/gregex.c:1735 +#: glib/gregex.c:1753 msgid "PCRE library is compiled without UTF8 support" msgstr "PCRE 库编译时未包含 UTF8 支持" -#: glib/gregex.c:1743 +#: glib/gregex.c:1761 msgid "PCRE library is compiled with incompatible options" msgstr "PCRE 库编译时使用了不兼容的选项" -#: glib/gregex.c:1860 +#: glib/gregex.c:1878 #, c-format msgid "Error while compiling regular expression ‘%s’ at char %s: %s" msgstr "编译正则表达式“%s”到字符 %s 处时出错:%s" -#: glib/gregex.c:2900 +#: glib/gregex.c:2918 msgid "hexadecimal digit or “}” expected" msgstr "期望十六进制数或“}”" -#: glib/gregex.c:2916 +#: glib/gregex.c:2934 msgid "hexadecimal digit expected" msgstr "期望十六进制数" -#: glib/gregex.c:2956 +#: glib/gregex.c:2974 msgid "missing “<” in symbolic reference" msgstr "在符号引用中缺少“<”" -#: glib/gregex.c:2965 +#: glib/gregex.c:2983 msgid "unfinished symbolic reference" msgstr "未完成的符号引用" -#: glib/gregex.c:2972 +#: glib/gregex.c:2990 msgid "zero-length symbolic reference" msgstr "零长符号引用" -#: glib/gregex.c:2983 +#: glib/gregex.c:3001 msgid "digit expected" msgstr "期望数字" -#: glib/gregex.c:3001 +#: glib/gregex.c:3019 msgid "illegal symbolic reference" msgstr "非法的符号引用" -#: glib/gregex.c:3064 +#: glib/gregex.c:3082 msgid "stray final “\\”" msgstr "丢失了最后的“\\”" -#: glib/gregex.c:3068 +#: glib/gregex.c:3086 msgid "unknown escape sequence" msgstr "未知的转义序列" -#: glib/gregex.c:3078 +#: glib/gregex.c:3096 #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "解析替换文本“%s”到字符 %lu 处时出错:%s" -#: glib/gshell.c:98 +#: glib/gshell.c:84 msgid "Quoted text doesn’t begin with a quotation mark" msgstr "引用的文本不以引号开头" -#: glib/gshell.c:188 +#: glib/gshell.c:174 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "命令行或其他 shell 引用文本中出现不匹配的引号" -#: glib/gshell.c:594 +#: glib/gshell.c:580 #, c-format msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "文本在一个“\\”字符后结束。(文本为“%s”)" -#: glib/gshell.c:601 +#: glib/gshell.c:587 #, c-format msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "在找到为 %c 匹配的引用之前,文本已结束。(文本为“%s”)" -#: glib/gshell.c:613 +#: glib/gshell.c:599 msgid "Text was empty (or contained only whitespace)" msgstr "文本为空(或仅含空白字符)" -#: glib/gspawn.c:320 +#: glib/gspawn.c:242 #, c-format msgid "Failed to read data from child process (%s)" msgstr "从子进程中读取数据失败(%s)" -#: glib/gspawn.c:473 +#: glib/gspawn.c:395 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "在从子进程中读取数据时出现异常错误(%s)" -#: glib/gspawn.c:558 +#: glib/gspawn.c:475 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "waitpid() 出现异常错误(%s)" -#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575 +#: glib/gspawn.c:1097 glib/gspawn-win32.c:1575 #, c-format msgid "Child process exited with code %ld" msgstr "子进程已退出,代码 %ld" -#: glib/gspawn.c:1188 +#: glib/gspawn.c:1105 #, c-format msgid "Child process killed by signal %ld" msgstr "子进程已由信号 %ld 杀死" -#: glib/gspawn.c:1195 +#: glib/gspawn.c:1112 #, c-format msgid "Child process stopped by signal %ld" msgstr "子进程已由信号 %ld 停止" -#: glib/gspawn.c:1202 +#: glib/gspawn.c:1119 #, c-format msgid "Child process exited abnormally" msgstr "子进程异常中止" -#: glib/gspawn.c:2032 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 +#: glib/gspawn.c:1622 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "从子管道中读取失败(%s)" -#: glib/gspawn.c:2404 +#: glib/gspawn.c:2001 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "生成子进程“%s”失败(%s)" -#: glib/gspawn.c:2530 +#: glib/gspawn.c:2125 #, c-format msgid "Failed to fork (%s)" msgstr "fork 失败(%s)" -#: glib/gspawn.c:2690 glib/gspawn-win32.c:503 +#: glib/gspawn.c:2286 glib/gspawn-win32.c:503 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "切换到目录“%s”失败(%s)" -#: glib/gspawn.c:2700 +#: glib/gspawn.c:2296 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "执行子进程“%s”失败(%s)" -#: glib/gspawn.c:2710 +#: glib/gspawn.c:2306 #, c-format msgid "Failed to open file to remap file descriptor (%s)" msgstr "打开文件以重新映射文件描述符失败(%s)" -#: glib/gspawn.c:2718 +#: glib/gspawn.c:2314 #, c-format msgid "Failed to duplicate file descriptor for child process (%s)" msgstr "为子进程复制文件描述符失败(%s)" -#: glib/gspawn.c:2727 +#: glib/gspawn.c:2323 #, c-format msgid "Failed to fork child process (%s)" msgstr "fork 子进程失败(%s)" -#: glib/gspawn.c:2735 +#: glib/gspawn.c:2331 #, c-format msgid "Failed to close file descriptor for child process (%s)" msgstr "为子进程关闭文件描述符失败(%s)" -#: glib/gspawn.c:2743 +#: glib/gspawn.c:2339 #, c-format msgid "Unknown error executing child process “%s”" msgstr "执行子进程“%s”时出现未知错误" -#: glib/gspawn.c:2767 +#: glib/gspawn.c:2363 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "从子进程管道中读取足够的数据失败(%s)" @@ -5830,78 +6028,78 @@ msgid "" "process" msgstr "g_io_channel_win32_poll() 从子进程中读取数据时出现异常错误" -#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3475 +#: glib/gstrfuncs.c:3339 glib/gstrfuncs.c:3441 msgid "Empty string is not a number" msgstr "空字符串不是数字" -#: glib/gstrfuncs.c:3397 +#: glib/gstrfuncs.c:3363 #, c-format msgid "“%s” is not a signed number" msgstr "“%s”不是有效的有符号数值" -#: glib/gstrfuncs.c:3407 glib/gstrfuncs.c:3511 +#: glib/gstrfuncs.c:3373 glib/gstrfuncs.c:3477 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "数字“%s”越界 [%s, %s]" -#: glib/gstrfuncs.c:3501 +#: glib/gstrfuncs.c:3467 #, c-format msgid "“%s” is not an unsigned number" msgstr "“%s”不是有效的无符号数值" -#: glib/guri.c:318 +#: glib/guri.c:309 #, no-c-format msgid "Invalid %-encoding in URI" msgstr "URI 中无效的 %-编码" -#: glib/guri.c:335 +#: glib/guri.c:326 msgid "Illegal character in URI" msgstr "URI 中有非法字符" -#: glib/guri.c:369 +#: glib/guri.c:360 msgid "Non-UTF-8 characters in URI" msgstr "URI 中存在非 UTF-8 字符" -#: glib/guri.c:549 +#: glib/guri.c:540 #, c-format msgid "Invalid IPv6 address ‘%.*s’ in URI" msgstr "URI 中无效的 IPv6 地址“%.*s”" -#: glib/guri.c:604 +#: glib/guri.c:595 #, c-format msgid "Illegal encoded IP address ‘%.*s’ in URI" msgstr "URI 中有编码方式非法的 IP 地址“%.*s”" -#: glib/guri.c:616 +#: glib/guri.c:607 #, c-format msgid "Illegal internationalized hostname ‘%.*s’ in URI" msgstr "URI 中有非法的国际化主机名“%.*s”" -#: glib/guri.c:648 glib/guri.c:660 +#: glib/guri.c:639 glib/guri.c:651 #, c-format msgid "Could not parse port ‘%.*s’ in URI" msgstr "无法解析 URI 中的端口“%.*s”" -#: glib/guri.c:667 +#: glib/guri.c:658 #, c-format msgid "Port ‘%.*s’ in URI is out of range" msgstr "URI 中的端口“%.*s”超出范围" -#: glib/guri.c:1230 glib/guri.c:1294 +#: glib/guri.c:1221 glib/guri.c:1285 #, c-format msgid "URI ‘%s’ is not an absolute URI" msgstr "URI“%s”不是绝对 URI" -#: glib/guri.c:1236 +#: glib/guri.c:1227 #, c-format msgid "URI ‘%s’ has no host component" msgstr "URI“%s”没有主机部分" -#: glib/guri.c:1466 +#: glib/guri.c:1457 msgid "URI is not absolute, and no base URI was provided" msgstr "URI 不是绝对的,且未提供 base URI" -#: glib/guri.c:2252 +#: glib/guri.c:2243 msgid "Missing ‘=’ and parameter value" msgstr "缺少“=”和参数值" @@ -5982,64 +6180,64 @@ msgstr "PiB" msgid "EiB" msgstr "EiB" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 kb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 kbit" #: glib/gutils.c:2994 -msgid "kb" +msgid "kbit" msgstr "kb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mbit" #: glib/gutils.c:2996 -msgid "Mb" +msgid "Mbit" msgstr "Mb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gbit" #: glib/gutils.c:2998 -msgid "Gb" +msgid "Gbit" msgstr "Gb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tbit" #: glib/gutils.c:3000 -msgid "Tb" +msgid "Tbit" msgstr "Tb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pbit" #: glib/gutils.c:3002 -msgid "Pb" +msgid "Pbit" msgstr "Pb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eb" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Ebit" #: glib/gutils.c:3004 -msgid "Eb" +msgid "Ebit" msgstr "Eb" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Kibit" #: glib/gutils.c:3008 -msgid "Kib" +msgid "Kibit" msgstr "Kib" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Mibit" #: glib/gutils.c:3010 -msgid "Mib" +msgid "Mibit" msgstr "Mib" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Gibit" #: glib/gutils.c:3012 -msgid "Gib" +msgid "Gibit" msgstr "Gib" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Tibit" #: glib/gutils.c:3014 -msgid "Tib" +msgid "Tibit" msgstr "Tib" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Pibit" #: glib/gutils.c:3016 -msgid "Pib" +msgid "Pibit" msgstr "Pib" -#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eib" +#. Translators: A unit symbol for size formatting, showing for example: "13.0 Eibit" #: glib/gutils.c:3018 -msgid "Eib" +msgid "Eibit" msgstr "Eib" #: glib/gutils.c:3056 @@ -6050,7 +6248,7 @@ msgstr[0] "字节" #: glib/gutils.c:3060 msgid "bit" msgid_plural "bits" -msgstr[0] "位" +msgstr[0] "比特" #. Translators: The "%u" is replaced with the size value, like "13"; it could #. * be part of "13 bytes", but only the number is requested this time. @@ -6097,7 +6295,7 @@ msgstr[0] "%s 字节" #, c-format msgid "%s bit" msgid_plural "%s bits" -msgstr[0] "%s 位" +msgstr[0] "%s 比特" #: glib/gutils.c:3201 #, c-format @@ -6140,6 +6338,50 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Could not allocate %" +#~ msgid_plural "Could not allocate %" +#~ msgstr[0] "无法分配 %" + +#~ msgid "" +#~ "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid" +#~ msgstr "METHOD_RETURN 消息:REPLY_SERIAL 首部字段缺失或无效" + +#~ msgid "kb" +#~ msgstr "kb" + +#~ msgid "Mb" +#~ msgstr "Mb" + +#~ msgid "Gb" +#~ msgstr "Gb" + +#~ msgid "Tb" +#~ msgstr "Tb" + +#~ msgid "Pb" +#~ msgstr "Pb" + +#~ msgid "Eb" +#~ msgstr "Eb" + +#~ msgid "Kib" +#~ msgstr "Kib" + +#~ msgid "Mib" +#~ msgstr "Mib" + +#~ msgid "Gib" +#~ msgstr "Gib" + +#~ msgid "Tib" +#~ msgstr "Tib" + +#~ msgid "Pib" +#~ msgstr "Pib" + +#~ msgid "Eib" +#~ msgstr "Eib" + #~ msgid "backtracking limit reached" #~ msgstr "达到回溯上限" @@ -6329,9 +6571,6 @@ msgstr "%.1f EB" #~ msgid "[ARGS...]" #~ msgstr "[参数...]" -#~ msgid "Failed to create temp file: %s" -#~ msgstr "创建临时文件失败:%s" - #~ msgid "" #~ "Message has %d file descriptors but the header field indicates %d file " #~ "descriptors" diff --git a/subprojects/gi-docgen.wrap b/subprojects/gi-docgen.wrap new file mode 100644 index 0000000..022c7ac --- /dev/null +++ b/subprojects/gi-docgen.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=gi-docgen +url=https://gitlab.gnome.org/GNOME/gi-docgen.git +revision=2023.1 +depth=1 diff --git a/tests/black.sh b/tests/black.sh new file mode 100755 index 0000000..37473be --- /dev/null +++ b/tests/black.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Copyright 2020 Frederic Martinsons +# Copyright 2020 Endless OS Foundation, LLC +# Copyright 2024 Collabora Ltd. +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +if [ -z "${G_TEST_SRCDIR-}" ]; then + me="$(readlink -f "$0")" + G_TEST_SRCDIR="${me%/*}" +fi + +export TEST_NAME=black +export TEST_REQUIRES_TOOLS="black git" + +run_lint () { + # shellcheck disable=SC2046 + black --diff --check $(git ls-files '*.py') +} + +# shellcheck source=tests/lint-common.sh +. "$G_TEST_SRCDIR/lint-common.sh" diff --git a/tests/check-missing-install-tag.py b/tests/check-missing-install-tag.py new file mode 100755 index 0000000..71e96eb --- /dev/null +++ b/tests/check-missing-install-tag.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +# +# Copyright © 2022-2024 Collabora, Ltd. +# +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# Original author: Xavier Claessens + +""" +This script checks Meson configuration logs to verify no installed file is +missing installation tag. +""" + +import argparse +import json +from pathlib import Path + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("builddir", type=Path, nargs="?", default=".") + args = parser.parse_args() + + print("# TAP version 13") + + count = 0 + bad = 0 + path = args.builddir / "meson-info" / "intro-install_plan.json" + with path.open(encoding="utf-8") as f: + install_plan = json.load(f) + for target in install_plan.values(): + for info in target.values(): + count += 1 + + if not info["tag"]: + bad += 1 + dest = info["destination"] + print(f"not ok {bad} - Missing install_tag for {dest}") + + if bad == 0: + print(f"ok 1 - All {count} installed files have install_tag") + print("1..1") + return 0 + else: + print(f"# {bad}/{count} installed files do not have install_tag") + print(f"1..{bad}") + return 1 + + +if __name__ == "__main__": + exit(main()) diff --git a/tests/flake8.sh b/tests/flake8.sh new file mode 100755 index 0000000..10a0a6f --- /dev/null +++ b/tests/flake8.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Copyright 2020 Frederic Martinsons +# Copyright 2020 Endless OS Foundation, LLC +# Copyright 2024 Collabora Ltd. +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +if [ -z "${G_TEST_SRCDIR-}" ]; then + me="$(readlink -f "$0")" + G_TEST_SRCDIR="${me%/*}" +fi + +export TEST_NAME=flake8 +export TEST_REQUIRES_TOOLS="flake8 git" + +run_lint () { + # Disable formatting warnings in flake8, as we use `black` to handle that. + local formatting_warnings=E101,E111,E114,E115,E116,E117,E12,E13,E2,E3,E401,E5,E70,W1,W2,W3,W5 + + # shellcheck disable=SC2046 + flake8 \ + --max-line-length=88 --ignore="$formatting_warnings" \ + $(git ls-files '*.py') +} + +# shellcheck source=tests/lint-common.sh +. "$G_TEST_SRCDIR/lint-common.sh" diff --git a/tests/lint-common.sh b/tests/lint-common.sh new file mode 100644 index 0000000..1d1c3d4 --- /dev/null +++ b/tests/lint-common.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash +# Copyright 2016-2018 Simon McVittie +# Copyright 2018-2024 Collabora Ltd. +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +skip_all () { + echo "1..0 # SKIP $*" + exit 0 +} + +main () { + local need_git= + local tool + + cd "$G_TEST_SRCDIR/.." + echo "TAP version 13" + + # shellcheck disable=SC2046 + for tool in ${TEST_REQUIRES_TOOLS-}; do + command -v "$tool" >/dev/null || skip_all "$tool not found" + if [ "$tool" = git ]; then + need_git=1 + fi + done + + if [ -n "${need_git-}" ] && ! test -e .git; then + skip_all "not a git checkout" + fi + + echo "1..1" + + if run_lint >&2; then + echo "ok 1" + exit 0 + elif [ -n "${LINT_WARNINGS_ARE_ERRORS-}" ]; then + echo "not ok 1 - warnings from ${TEST_NAME-"lint tool"}" + exit 1 + else + echo "not ok 1 # TO""DO warnings from ${TEST_NAME-"lint tool"}" + exit 0 + fi +} + +main diff --git a/tests/meson.build b/tests/meson.build new file mode 100644 index 0000000..12c5b9f --- /dev/null +++ b/tests/meson.build @@ -0,0 +1,29 @@ +# Copyright 2024 Collabora Ltd. +# SPDX-License-Identifier: LGPL-2.1-or-later + +lint_scripts = [ + 'black.sh', + 'flake8.sh', + 'reuse.sh', + 'shellcheck.sh', +] + +if have_bash + foreach test_name : lint_scripts + test( + test_name, files(test_name), + env : common_test_env, + suite : ['lint', 'no-valgrind'], + protocol : 'tap', + ) + endforeach +endif + +test( + 'check-missing-install-tag.py', + python, + args : ['-B', files('check-missing-install-tag.py')], + env : common_test_env, + suite : ['lint', 'no-valgrind'], + protocol : 'tap', +) \ No newline at end of file diff --git a/.gitlab-ci/run-reuse.sh b/tests/reuse.sh similarity index 62% rename from .gitlab-ci/run-reuse.sh rename to tests/reuse.sh index 6d0a44c..e9d9e06 100755 --- a/.gitlab-ci/run-reuse.sh +++ b/tests/reuse.sh @@ -1,23 +1,43 @@ -#!/bin/bash +#!/usr/bin/env bash # # Copyright 2022 Endless OS Foundation, LLC +# Copyright 2024 Collabora Ltd. # # SPDX-License-Identifier: LGPL-2.1-or-later # # Original author: Philip Withnall -set -e +set -eu + +if [ -z "${G_TEST_SRCDIR-}" ]; then + me="$(readlink -f "$0")" + G_TEST_SRCDIR="${me%/*}" +fi + +skip_all () { + echo "1..0 # SKIP $*" + exit 0 +} + +cd "$G_TEST_SRCDIR/.." +echo "TAP version 13" + +command -v git >/dev/null || skip_all "git not found" +command -v reuse >/dev/null || skip_all "reuse not found" +test -e .git || skip_all "not a git checkout" + +echo "1..1" # We need to make sure the submodules are up to date, or `reuse lint` will fail # when it tries to run `git status` internally -git submodule update --init +git submodule update --init >&2 # Run `reuse lint` on the code base and see if the number of files without # suitable copyright/licensing information has increased from a baseline # FIXME: Eventually this script can check whether *any* files are missing # information. But for now, let’s slowly improve the baseline. -files_without_copyright_information_max=407 -files_without_license_information_max=559 +files_without_copyright_information_max=343 +files_without_license_information_max=414 # The || true is because `reuse lint` will exit with status 1 if the project is not compliant # FIXME: Once https://github.com/fsfe/reuse-tool/issues/512 or @@ -26,9 +46,9 @@ files_without_license_information_max=559 # output rather than the current human-readable output. lint_output="$(reuse lint || true)" -files_with_copyright_information="$(echo "${lint_output}" | awk '/^\* Files with copyright information: / { print $6 }')" -files_with_license_information="$(echo "${lint_output}" | awk '/^\* Files with license information: / { print $6 }')" -total_files="$(echo "${lint_output}" | awk '/^\* Files with copyright information: / { print $8 }')" +files_with_copyright_information="$(echo "${lint_output}" | awk '/^\* [fF]iles with copyright information: / { print $6 }')" +files_with_license_information="$(echo "${lint_output}" | awk '/^\* [fF]iles with license information: / { print $6 }')" +total_files="$(echo "${lint_output}" | awk '/^\* [fF]iles with copyright information: / { print $8 }')" error=0 files_without_copyright_information="$(( total_files - files_with_copyright_information ))" @@ -36,27 +56,36 @@ files_without_license_information="$(( total_files - files_with_license_informat if [ "${files_without_copyright_information}" -gt "${files_without_copyright_information_max}" ] || \ [ "${files_without_license_information}" -gt "${files_without_license_information_max}" ]; then - echo "${lint_output}" + echo "${lint_output}" >&2 fi if [ "${files_without_copyright_information}" -gt "${files_without_copyright_information_max}" ]; then - echo "" - echo "Error: New files added without REUSE-compliant copyright information" - echo "Please make sure that all files added in this branch/merge request have correct copyright information" + echo "" >&2 + echo "Error: New files added without REUSE-compliant copyright information" >&2 + echo "Please make sure that all files added in this branch/merge request have correct copyright information" >&2 error=1 fi if [ "${files_without_license_information}" -gt "${files_without_license_information_max}" ]; then - echo "" - echo "Error: New files added without REUSE-compliant licensing information" - echo "Please make sure that all files added in this branch/merge request have correct license information" + echo "" >&2 + echo "Error: New files added without REUSE-compliant licensing information" >&2 + echo "Please make sure that all files added in this branch/merge request have correct license information" >&2 error=1 fi if [ "${error}" -eq "1" ]; then - echo "" - echo "See https://reuse.software/tutorial/#step-2 for information on how to add REUSE information" - echo "Also see https://gitlab.gnome.org/GNOME/glib/-/issues/1415" + echo "" >&2 + echo "See https://reuse.software/tutorial/#step-2 for information on how to add REUSE information" >&2 + echo "Also see https://gitlab.gnome.org/GNOME/glib/-/issues/1415" >&2 fi -exit "${error}" \ No newline at end of file +if [ "${error}" -eq 0 ]; then + echo "ok 1" + exit 0 +elif [ -n "${LINT_WARNINGS_ARE_ERRORS-}" ]; then + echo "not ok 1 - warnings from reuse" + exit "${error}" +else + echo "not ok 1 # TO""DO warnings from reuse" + exit 0 +fi diff --git a/tests/shellcheck.sh b/tests/shellcheck.sh new file mode 100755 index 0000000..4f5ce62 --- /dev/null +++ b/tests/shellcheck.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +# Copyright 2020 Frederic Martinsons +# Copyright 2024 Collabora Ltd. +# SPDX-License-Identifier: LGPL-2.1-or-later + +set -eu + +if [ -z "${G_TEST_SRCDIR-}" ]; then + me="$(readlink -f "$0")" + G_TEST_SRCDIR="${me%/*}" +fi + +export TEST_NAME=shellcheck +export TEST_REQUIRES_TOOLS="git shellcheck" + +run_lint () { + # Ignoring third-party directories that we don't want to parse + # shellcheck disable=SC2046 + shellcheck $(git ls-files '*.sh' | grep -Ev "glib/libcharset|glib/dirent") +} + +# shellcheck source=tests/lint-common.sh +. "$G_TEST_SRCDIR/lint-common.sh" diff --git a/tools/gen-visibility-macros.py b/tools/gen-visibility-macros.py index a7a7248..ad37baf 100755 --- a/tools/gen-visibility-macros.py +++ b/tools/gen-visibility-macros.py @@ -81,7 +81,7 @@ def gen_visibility_macros(args, current_minor_version): - GLIB_UNAVAILABLE(maj,min) - GLIB_UNAVAILABLE_STATIC_INLINE(maj,min) - The GLIB namespace can be replaced with one of GOBJECT, GIO, GMODULE. + The GLIB namespace can be replaced with one of GOBJECT, GIO, GMODULE, GI. """ ns = args.namespace diff --git a/tools/glib.supp b/tools/glib.supp index 9ff78cc..bddfe60 100644 --- a/tools/glib.supp +++ b/tools/glib.supp @@ -867,7 +867,7 @@ { g_get_system_data_dirs Memcheck:Leak - match-leak-kinds:reachable + match-leak-kinds:definite,reachable fun:malloc ... fun:g_build_system_data_dirs @@ -878,7 +878,7 @@ { g_get_user_data_dir Memcheck:Leak - match-leak-kinds:reachable + match-leak-kinds:definite,reachable fun:realloc ... fun:g_build_user_data_dir @@ -889,13 +889,23 @@ { g_get_home_dir Memcheck:Leak - match-leak-kinds:reachable + match-leak-kinds:definite,reachable fun:malloc ... fun:g_build_home_dir fun:g_get_home_dir } +# gcontenttype.c caches a one-time allocation global array of @global_mime_dirs. +{ + content_type_mime_dirs_realloc + Memcheck:Leak + match-leak-kinds:reachable + fun:realloc + ... + fun:_g_content_type_set_mime_dirs_locked +} + # gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs. { desktop_file_dirs_malloc @@ -1268,3 +1278,47 @@ ... fun:xdg_mime_init } + +# One-time allocations for default log writer lock and domains +{ + should_drop_message_rw_lock + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:g_rw_lock_impl_new + fun:g_rw_lock_get_impl + fun:g_rw_lock_reader_lock + fun:should_drop_message +} + +{ + should_drop_message_strdup + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:g_malloc + fun:g_strdup + fun:g_strdup_inline + fun:should_drop_message +} + +{ + g_log_writer_default_set_debug_strdup + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:g_malloc + fun:g_strdup_inline + fun:g_log_writer_default_set_debug_domains +} + +{ + g_log_writer_default_set_debug_rw_lock + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + fun:g_rw_lock_impl_new + fun:g_rw_lock_get_impl + fun:g_rw_lock_writer_lock + fun:g_log_writer_default_set_debug_domains +} diff --git a/unicode-data/CaseFolding.txt b/unicode-data/CaseFolding.txt new file mode 100644 index 0000000..69c5c64 --- /dev/null +++ b/unicode-data/CaseFolding.txt @@ -0,0 +1,1627 @@ +# CaseFolding-15.1.0.txt +# Date: 2023-05-12, 21:53:10 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Case Folding Properties +# +# This file is a supplement to the UnicodeData file. +# It provides a case folding mapping generated from the Unicode Character Database. +# If all characters are mapped according to the full mapping below, then +# case differences (according to UnicodeData.txt and SpecialCasing.txt) +# are eliminated. +# +# The data supports both implementations that require simple case foldings +# (where string lengths don't change), and implementations that allow full case folding +# (where string lengths may grow). Note that where they can be supported, the +# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +# +# All code points not listed in this file map to themselves. +# +# NOTE: case folding does not preserve normalization formats! +# +# For information on case folding, including how to have case folding +# preserve normalization formats, see Section 3.13 Default Case Algorithms in +# The Unicode Standard. +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; # +# +# The status field is: +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +# See the discussions of case mapping in the Unicode Standard for more information. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) +# +# ================================================================= + +# Property: Case_Folding + +# All code points not explicitly listed for Case_Folding +# have the value C for the status field, and the code point itself for the mapping field. + +# ================================================================= +0041; C; 0061; # LATIN CAPITAL LETTER A +0042; C; 0062; # LATIN CAPITAL LETTER B +0043; C; 0063; # LATIN CAPITAL LETTER C +0044; C; 0064; # LATIN CAPITAL LETTER D +0045; C; 0065; # LATIN CAPITAL LETTER E +0046; C; 0066; # LATIN CAPITAL LETTER F +0047; C; 0067; # LATIN CAPITAL LETTER G +0048; C; 0068; # LATIN CAPITAL LETTER H +0049; C; 0069; # LATIN CAPITAL LETTER I +0049; T; 0131; # LATIN CAPITAL LETTER I +004A; C; 006A; # LATIN CAPITAL LETTER J +004B; C; 006B; # LATIN CAPITAL LETTER K +004C; C; 006C; # LATIN CAPITAL LETTER L +004D; C; 006D; # LATIN CAPITAL LETTER M +004E; C; 006E; # LATIN CAPITAL LETTER N +004F; C; 006F; # LATIN CAPITAL LETTER O +0050; C; 0070; # LATIN CAPITAL LETTER P +0051; C; 0071; # LATIN CAPITAL LETTER Q +0052; C; 0072; # LATIN CAPITAL LETTER R +0053; C; 0073; # LATIN CAPITAL LETTER S +0054; C; 0074; # LATIN CAPITAL LETTER T +0055; C; 0075; # LATIN CAPITAL LETTER U +0056; C; 0076; # LATIN CAPITAL LETTER V +0057; C; 0077; # LATIN CAPITAL LETTER W +0058; C; 0078; # LATIN CAPITAL LETTER X +0059; C; 0079; # LATIN CAPITAL LETTER Y +005A; C; 007A; # LATIN CAPITAL LETTER Z +00B5; C; 03BC; # MICRO SIGN +00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6; C; 00E6; # LATIN CAPITAL LETTER AE +00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A; C; 014B; # LATIN CAPITAL LETTER ENG +014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152; C; 0153; # LATIN CAPITAL LIGATURE OE +0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +017F; C; 0073; # LATIN SMALL LETTER LONG S +0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +0196; C; 0269; # LATIN CAPITAL LETTER IOTA +0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +01A2; C; 01A3; # LATIN CAPITAL LETTER OI +01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +01A6; C; 0280; # LATIN LETTER YR +01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +01A9; C; 0283; # LATIN CAPITAL LETTER ESH +01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +01B7; C; 0292; # LATIN CAPITAL LETTER EZH +01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +021C; C; 021D; # LATIN CAPITAL LETTER YOGH +021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222; C; 0223; # LATIN CAPITAL LETTER OU +0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE +023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP +0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE +0244; C; 0289; # LATIN CAPITAL LETTER U BAR +0245; C; 028C; # LATIN CAPITAL LETTER TURNED V +0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE +0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE +024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE +024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE +0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +0370; C; 0371; # GREEK CAPITAL LETTER HETA +0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI +0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +037F; C; 03F3; # GREEK CAPITAL LETTER YOT +0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +0392; C; 03B2; # GREEK CAPITAL LETTER BETA +0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +0397; C; 03B7; # GREEK CAPITAL LETTER ETA +0398; C; 03B8; # GREEK CAPITAL LETTER THETA +0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +039C; C; 03BC; # GREEK CAPITAL LETTER MU +039D; C; 03BD; # GREEK CAPITAL LETTER NU +039E; C; 03BE; # GREEK CAPITAL LETTER XI +039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +03A0; C; 03C0; # GREEK CAPITAL LETTER PI +03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL +03D0; C; 03B2; # GREEK BETA SYMBOL +03D1; C; 03B8; # GREEK THETA SYMBOL +03D5; C; 03C6; # GREEK PHI SYMBOL +03D6; C; 03C0; # GREEK PI SYMBOL +03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +03DA; C; 03DB; # GREEK LETTER STIGMA +03DC; C; 03DD; # GREEK LETTER DIGAMMA +03DE; C; 03DF; # GREEK LETTER KOPPA +03E0; C; 03E1; # GREEK LETTER SAMPI +03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +03F0; C; 03BA; # GREEK KAPPA SYMBOL +03F1; C; 03C1; # GREEK RHO SYMBOL +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +0410; C; 0430; # CYRILLIC CAPITAL LETTER A +0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +0418; C; 0438; # CYRILLIC CAPITAL LETTER I +0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +041E; C; 043E; # CYRILLIC CAPITAL LETTER O +041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +0423; C; 0443; # CYRILLIC CAPITAL LETTER U +0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +042D; C; 044D; # CYRILLIC CAPITAL LETTER E +042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA +04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE +0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE +0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK +0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA +0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA +0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE +051A; C; 051B; # CYRILLIC CAPITAL LETTER QA +051C; C; 051D; # CYRILLIC CAPITAL LETTER WE +051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA +0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0526; C; 0527; # CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER +0528; C; 0529; # CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK +052A; C; 052B; # CYRILLIC CAPITAL LETTER DZZHE +052C; C; 052D; # CYRILLIC CAPITAL LETTER DCHE +052E; C; 052F; # CYRILLIC CAPITAL LETTER EL WITH DESCENDER +0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +10C7; C; 2D27; # GEORGIAN CAPITAL LETTER YN +10CD; C; 2D2D; # GEORGIAN CAPITAL LETTER AEN +13F8; C; 13F0; # CHEROKEE SMALL LETTER YE +13F9; C; 13F1; # CHEROKEE SMALL LETTER YI +13FA; C; 13F2; # CHEROKEE SMALL LETTER YO +13FB; C; 13F3; # CHEROKEE SMALL LETTER YU +13FC; C; 13F4; # CHEROKEE SMALL LETTER YV +13FD; C; 13F5; # CHEROKEE SMALL LETTER MV +1C80; C; 0432; # CYRILLIC SMALL LETTER ROUNDED VE +1C81; C; 0434; # CYRILLIC SMALL LETTER LONG-LEGGED DE +1C82; C; 043E; # CYRILLIC SMALL LETTER NARROW O +1C83; C; 0441; # CYRILLIC SMALL LETTER WIDE ES +1C84; C; 0442; # CYRILLIC SMALL LETTER TALL TE +1C85; C; 0442; # CYRILLIC SMALL LETTER THREE-LEGGED TE +1C86; C; 044A; # CYRILLIC SMALL LETTER TALL HARD SIGN +1C87; C; 0463; # CYRILLIC SMALL LETTER TALL YAT +1C88; C; A64B; # CYRILLIC SMALL LETTER UNBLENDED UK +1C90; C; 10D0; # GEORGIAN MTAVRULI CAPITAL LETTER AN +1C91; C; 10D1; # GEORGIAN MTAVRULI CAPITAL LETTER BAN +1C92; C; 10D2; # GEORGIAN MTAVRULI CAPITAL LETTER GAN +1C93; C; 10D3; # GEORGIAN MTAVRULI CAPITAL LETTER DON +1C94; C; 10D4; # GEORGIAN MTAVRULI CAPITAL LETTER EN +1C95; C; 10D5; # GEORGIAN MTAVRULI CAPITAL LETTER VIN +1C96; C; 10D6; # GEORGIAN MTAVRULI CAPITAL LETTER ZEN +1C97; C; 10D7; # GEORGIAN MTAVRULI CAPITAL LETTER TAN +1C98; C; 10D8; # GEORGIAN MTAVRULI CAPITAL LETTER IN +1C99; C; 10D9; # GEORGIAN MTAVRULI CAPITAL LETTER KAN +1C9A; C; 10DA; # GEORGIAN MTAVRULI CAPITAL LETTER LAS +1C9B; C; 10DB; # GEORGIAN MTAVRULI CAPITAL LETTER MAN +1C9C; C; 10DC; # GEORGIAN MTAVRULI CAPITAL LETTER NAR +1C9D; C; 10DD; # GEORGIAN MTAVRULI CAPITAL LETTER ON +1C9E; C; 10DE; # GEORGIAN MTAVRULI CAPITAL LETTER PAR +1C9F; C; 10DF; # GEORGIAN MTAVRULI CAPITAL LETTER ZHAR +1CA0; C; 10E0; # GEORGIAN MTAVRULI CAPITAL LETTER RAE +1CA1; C; 10E1; # GEORGIAN MTAVRULI CAPITAL LETTER SAN +1CA2; C; 10E2; # GEORGIAN MTAVRULI CAPITAL LETTER TAR +1CA3; C; 10E3; # GEORGIAN MTAVRULI CAPITAL LETTER UN +1CA4; C; 10E4; # GEORGIAN MTAVRULI CAPITAL LETTER PHAR +1CA5; C; 10E5; # GEORGIAN MTAVRULI CAPITAL LETTER KHAR +1CA6; C; 10E6; # GEORGIAN MTAVRULI CAPITAL LETTER GHAN +1CA7; C; 10E7; # GEORGIAN MTAVRULI CAPITAL LETTER QAR +1CA8; C; 10E8; # GEORGIAN MTAVRULI CAPITAL LETTER SHIN +1CA9; C; 10E9; # GEORGIAN MTAVRULI CAPITAL LETTER CHIN +1CAA; C; 10EA; # GEORGIAN MTAVRULI CAPITAL LETTER CAN +1CAB; C; 10EB; # GEORGIAN MTAVRULI CAPITAL LETTER JIL +1CAC; C; 10EC; # GEORGIAN MTAVRULI CAPITAL LETTER CIL +1CAD; C; 10ED; # GEORGIAN MTAVRULI CAPITAL LETTER CHAR +1CAE; C; 10EE; # GEORGIAN MTAVRULI CAPITAL LETTER XAN +1CAF; C; 10EF; # GEORGIAN MTAVRULI CAPITAL LETTER JHAN +1CB0; C; 10F0; # GEORGIAN MTAVRULI CAPITAL LETTER HAE +1CB1; C; 10F1; # GEORGIAN MTAVRULI CAPITAL LETTER HE +1CB2; C; 10F2; # GEORGIAN MTAVRULI CAPITAL LETTER HIE +1CB3; C; 10F3; # GEORGIAN MTAVRULI CAPITAL LETTER WE +1CB4; C; 10F4; # GEORGIAN MTAVRULI CAPITAL LETTER HAR +1CB5; C; 10F5; # GEORGIAN MTAVRULI CAPITAL LETTER HOE +1CB6; C; 10F6; # GEORGIAN MTAVRULI CAPITAL LETTER FI +1CB7; C; 10F7; # GEORGIAN MTAVRULI CAPITAL LETTER YN +1CB8; C; 10F8; # GEORGIAN MTAVRULI CAPITAL LETTER ELIFI +1CB9; C; 10F9; # GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN +1CBA; C; 10FA; # GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD; C; 10FD; # GEORGIAN MTAVRULI CAPITAL LETTER AEN +1CBE; C; 10FE; # GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN +1CBF; C; 10FF; # GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW +1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW +1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S +1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S +1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP +1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD3; S; 0390; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE3; S; 03B0; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126; C; 03C9; # OHM SIGN +212A; C; 006B; # KELVIN SIGN +212B; C; 00E5; # ANGSTROM SIGN +2132; C; 214E; # TURNED CAPITAL F +2160; C; 2170; # ROMAN NUMERAL ONE +2161; C; 2171; # ROMAN NUMERAL TWO +2162; C; 2172; # ROMAN NUMERAL THREE +2163; C; 2173; # ROMAN NUMERAL FOUR +2164; C; 2174; # ROMAN NUMERAL FIVE +2165; C; 2175; # ROMAN NUMERAL SIX +2166; C; 2176; # ROMAN NUMERAL SEVEN +2167; C; 2177; # ROMAN NUMERAL EIGHT +2168; C; 2178; # ROMAN NUMERAL NINE +2169; C; 2179; # ROMAN NUMERAL TEN +216A; C; 217A; # ROMAN NUMERAL ELEVEN +216B; C; 217B; # ROMAN NUMERAL TWELVE +216C; C; 217C; # ROMAN NUMERAL FIFTY +216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED +24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C2F; C; 2C5F; # GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI +2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE +2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL +2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER +2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER +2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA +2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK +2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A +2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA +2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK +2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H +2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL +2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +2CF2; C; 2CF3; # COPTIC CAPITAL LETTER BOHAIRIC KHEI +A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA +A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO +A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE +A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA +A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV +A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER +A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU +A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A +A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS +A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN +A660; C; A661; # CYRILLIC CAPITAL LETTER REVERSED TSE +A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE +A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL +A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM +A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680; C; A681; # CYRILLIC CAPITAL LETTER DWE +A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE +A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE +A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE +A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE +A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE +A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE +A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE +A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE +A694; C; A695; # CYRILLIC CAPITAL LETTER HWE +A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE +A698; C; A699; # CYRILLIC CAPITAL LETTER DOUBLE O +A69A; C; A69B; # CYRILLIC CAPITAL LETTER CROSSED O +A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726; C; A727; # LATIN CAPITAL LETTER HENG +A728; C; A729; # LATIN CAPITAL LETTER TZ +A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO +A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO +A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732; C; A733; # LATIN CAPITAL LETTER AA +A734; C; A735; # LATIN CAPITAL LETTER AO +A736; C; A737; # LATIN CAPITAL LETTER AU +A738; C; A739; # LATIN CAPITAL LETTER AV +A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C; C; A73D; # LATIN CAPITAL LETTER AY +A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT +A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE +A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746; C; A747; # LATIN CAPITAL LETTER BROKEN L +A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP +A74E; C; A74F; # LATIN CAPITAL LETTER OO +A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH +A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA +A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA +A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760; C; A761; # LATIN CAPITAL LETTER VY +A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z +A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE +A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768; C; A769; # LATIN CAPITAL LETTER VEND +A76A; C; A76B; # LATIN CAPITAL LETTER ET +A76C; C; A76D; # LATIN CAPITAL LETTER IS +A76E; C; A76F; # LATIN CAPITAL LETTER CON +A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D +A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F +A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G +A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G +A780; C; A781; # LATIN CAPITAL LETTER TURNED L +A782; C; A783; # LATIN CAPITAL LETTER INSULAR R +A784; C; A785; # LATIN CAPITAL LETTER INSULAR S +A786; C; A787; # LATIN CAPITAL LETTER INSULAR T +A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO +A78D; C; 0265; # LATIN CAPITAL LETTER TURNED H +A790; C; A791; # LATIN CAPITAL LETTER N WITH DESCENDER +A792; C; A793; # LATIN CAPITAL LETTER C WITH BAR +A796; C; A797; # LATIN CAPITAL LETTER B WITH FLOURISH +A798; C; A799; # LATIN CAPITAL LETTER F WITH STROKE +A79A; C; A79B; # LATIN CAPITAL LETTER VOLAPUK AE +A79C; C; A79D; # LATIN CAPITAL LETTER VOLAPUK OE +A79E; C; A79F; # LATIN CAPITAL LETTER VOLAPUK UE +A7A0; C; A7A1; # LATIN CAPITAL LETTER G WITH OBLIQUE STROKE +A7A2; C; A7A3; # LATIN CAPITAL LETTER K WITH OBLIQUE STROKE +A7A4; C; A7A5; # LATIN CAPITAL LETTER N WITH OBLIQUE STROKE +A7A6; C; A7A7; # LATIN CAPITAL LETTER R WITH OBLIQUE STROKE +A7A8; C; A7A9; # LATIN CAPITAL LETTER S WITH OBLIQUE STROKE +A7AA; C; 0266; # LATIN CAPITAL LETTER H WITH HOOK +A7AB; C; 025C; # LATIN CAPITAL LETTER REVERSED OPEN E +A7AC; C; 0261; # LATIN CAPITAL LETTER SCRIPT G +A7AD; C; 026C; # LATIN CAPITAL LETTER L WITH BELT +A7AE; C; 026A; # LATIN CAPITAL LETTER SMALL CAPITAL I +A7B0; C; 029E; # LATIN CAPITAL LETTER TURNED K +A7B1; C; 0287; # LATIN CAPITAL LETTER TURNED T +A7B2; C; 029D; # LATIN CAPITAL LETTER J WITH CROSSED-TAIL +A7B3; C; AB53; # LATIN CAPITAL LETTER CHI +A7B4; C; A7B5; # LATIN CAPITAL LETTER BETA +A7B6; C; A7B7; # LATIN CAPITAL LETTER OMEGA +A7B8; C; A7B9; # LATIN CAPITAL LETTER U WITH STROKE +A7BA; C; A7BB; # LATIN CAPITAL LETTER GLOTTAL A +A7BC; C; A7BD; # LATIN CAPITAL LETTER GLOTTAL I +A7BE; C; A7BF; # LATIN CAPITAL LETTER GLOTTAL U +A7C0; C; A7C1; # LATIN CAPITAL LETTER OLD POLISH O +A7C2; C; A7C3; # LATIN CAPITAL LETTER ANGLICANA W +A7C4; C; A794; # LATIN CAPITAL LETTER C WITH PALATAL HOOK +A7C5; C; 0282; # LATIN CAPITAL LETTER S WITH HOOK +A7C6; C; 1D8E; # LATIN CAPITAL LETTER Z WITH PALATAL HOOK +A7C7; C; A7C8; # LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY +A7C9; C; A7CA; # LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY +A7D0; C; A7D1; # LATIN CAPITAL LETTER CLOSED INSULAR G +A7D6; C; A7D7; # LATIN CAPITAL LETTER MIDDLE SCOTS S +A7D8; C; A7D9; # LATIN CAPITAL LETTER SIGMOID S +A7F5; C; A7F6; # LATIN CAPITAL LETTER REVERSED HALF H +AB70; C; 13A0; # CHEROKEE SMALL LETTER A +AB71; C; 13A1; # CHEROKEE SMALL LETTER E +AB72; C; 13A2; # CHEROKEE SMALL LETTER I +AB73; C; 13A3; # CHEROKEE SMALL LETTER O +AB74; C; 13A4; # CHEROKEE SMALL LETTER U +AB75; C; 13A5; # CHEROKEE SMALL LETTER V +AB76; C; 13A6; # CHEROKEE SMALL LETTER GA +AB77; C; 13A7; # CHEROKEE SMALL LETTER KA +AB78; C; 13A8; # CHEROKEE SMALL LETTER GE +AB79; C; 13A9; # CHEROKEE SMALL LETTER GI +AB7A; C; 13AA; # CHEROKEE SMALL LETTER GO +AB7B; C; 13AB; # CHEROKEE SMALL LETTER GU +AB7C; C; 13AC; # CHEROKEE SMALL LETTER GV +AB7D; C; 13AD; # CHEROKEE SMALL LETTER HA +AB7E; C; 13AE; # CHEROKEE SMALL LETTER HE +AB7F; C; 13AF; # CHEROKEE SMALL LETTER HI +AB80; C; 13B0; # CHEROKEE SMALL LETTER HO +AB81; C; 13B1; # CHEROKEE SMALL LETTER HU +AB82; C; 13B2; # CHEROKEE SMALL LETTER HV +AB83; C; 13B3; # CHEROKEE SMALL LETTER LA +AB84; C; 13B4; # CHEROKEE SMALL LETTER LE +AB85; C; 13B5; # CHEROKEE SMALL LETTER LI +AB86; C; 13B6; # CHEROKEE SMALL LETTER LO +AB87; C; 13B7; # CHEROKEE SMALL LETTER LU +AB88; C; 13B8; # CHEROKEE SMALL LETTER LV +AB89; C; 13B9; # CHEROKEE SMALL LETTER MA +AB8A; C; 13BA; # CHEROKEE SMALL LETTER ME +AB8B; C; 13BB; # CHEROKEE SMALL LETTER MI +AB8C; C; 13BC; # CHEROKEE SMALL LETTER MO +AB8D; C; 13BD; # CHEROKEE SMALL LETTER MU +AB8E; C; 13BE; # CHEROKEE SMALL LETTER NA +AB8F; C; 13BF; # CHEROKEE SMALL LETTER HNA +AB90; C; 13C0; # CHEROKEE SMALL LETTER NAH +AB91; C; 13C1; # CHEROKEE SMALL LETTER NE +AB92; C; 13C2; # CHEROKEE SMALL LETTER NI +AB93; C; 13C3; # CHEROKEE SMALL LETTER NO +AB94; C; 13C4; # CHEROKEE SMALL LETTER NU +AB95; C; 13C5; # CHEROKEE SMALL LETTER NV +AB96; C; 13C6; # CHEROKEE SMALL LETTER QUA +AB97; C; 13C7; # CHEROKEE SMALL LETTER QUE +AB98; C; 13C8; # CHEROKEE SMALL LETTER QUI +AB99; C; 13C9; # CHEROKEE SMALL LETTER QUO +AB9A; C; 13CA; # CHEROKEE SMALL LETTER QUU +AB9B; C; 13CB; # CHEROKEE SMALL LETTER QUV +AB9C; C; 13CC; # CHEROKEE SMALL LETTER SA +AB9D; C; 13CD; # CHEROKEE SMALL LETTER S +AB9E; C; 13CE; # CHEROKEE SMALL LETTER SE +AB9F; C; 13CF; # CHEROKEE SMALL LETTER SI +ABA0; C; 13D0; # CHEROKEE SMALL LETTER SO +ABA1; C; 13D1; # CHEROKEE SMALL LETTER SU +ABA2; C; 13D2; # CHEROKEE SMALL LETTER SV +ABA3; C; 13D3; # CHEROKEE SMALL LETTER DA +ABA4; C; 13D4; # CHEROKEE SMALL LETTER TA +ABA5; C; 13D5; # CHEROKEE SMALL LETTER DE +ABA6; C; 13D6; # CHEROKEE SMALL LETTER TE +ABA7; C; 13D7; # CHEROKEE SMALL LETTER DI +ABA8; C; 13D8; # CHEROKEE SMALL LETTER TI +ABA9; C; 13D9; # CHEROKEE SMALL LETTER DO +ABAA; C; 13DA; # CHEROKEE SMALL LETTER DU +ABAB; C; 13DB; # CHEROKEE SMALL LETTER DV +ABAC; C; 13DC; # CHEROKEE SMALL LETTER DLA +ABAD; C; 13DD; # CHEROKEE SMALL LETTER TLA +ABAE; C; 13DE; # CHEROKEE SMALL LETTER TLE +ABAF; C; 13DF; # CHEROKEE SMALL LETTER TLI +ABB0; C; 13E0; # CHEROKEE SMALL LETTER TLO +ABB1; C; 13E1; # CHEROKEE SMALL LETTER TLU +ABB2; C; 13E2; # CHEROKEE SMALL LETTER TLV +ABB3; C; 13E3; # CHEROKEE SMALL LETTER TSA +ABB4; C; 13E4; # CHEROKEE SMALL LETTER TSE +ABB5; C; 13E5; # CHEROKEE SMALL LETTER TSI +ABB6; C; 13E6; # CHEROKEE SMALL LETTER TSO +ABB7; C; 13E7; # CHEROKEE SMALL LETTER TSU +ABB8; C; 13E8; # CHEROKEE SMALL LETTER TSV +ABB9; C; 13E9; # CHEROKEE SMALL LETTER WA +ABBA; C; 13EA; # CHEROKEE SMALL LETTER WE +ABBB; C; 13EB; # CHEROKEE SMALL LETTER WI +ABBC; C; 13EC; # CHEROKEE SMALL LETTER WO +ABBD; C; 13ED; # CHEROKEE SMALL LETTER WU +ABBE; C; 13EE; # CHEROKEE SMALL LETTER WV +ABBF; C; 13EF; # CHEROKEE SMALL LETTER YA +FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +FB05; S; FB06; # LATIN SMALL LIGATURE LONG S T +FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +10400; C; 10428; # DESERET CAPITAL LETTER LONG I +10401; C; 10429; # DESERET CAPITAL LETTER LONG E +10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +1040C; C; 10434; # DESERET CAPITAL LETTER AY +1040D; C; 10435; # DESERET CAPITAL LETTER OW +1040E; C; 10436; # DESERET CAPITAL LETTER WU +1040F; C; 10437; # DESERET CAPITAL LETTER YEE +10410; C; 10438; # DESERET CAPITAL LETTER H +10411; C; 10439; # DESERET CAPITAL LETTER PEE +10412; C; 1043A; # DESERET CAPITAL LETTER BEE +10413; C; 1043B; # DESERET CAPITAL LETTER TEE +10414; C; 1043C; # DESERET CAPITAL LETTER DEE +10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +10416; C; 1043E; # DESERET CAPITAL LETTER JEE +10417; C; 1043F; # DESERET CAPITAL LETTER KAY +10418; C; 10440; # DESERET CAPITAL LETTER GAY +10419; C; 10441; # DESERET CAPITAL LETTER EF +1041A; C; 10442; # DESERET CAPITAL LETTER VEE +1041B; C; 10443; # DESERET CAPITAL LETTER ETH +1041C; C; 10444; # DESERET CAPITAL LETTER THEE +1041D; C; 10445; # DESERET CAPITAL LETTER ES +1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +1041F; C; 10447; # DESERET CAPITAL LETTER ESH +10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +10421; C; 10449; # DESERET CAPITAL LETTER ER +10422; C; 1044A; # DESERET CAPITAL LETTER EL +10423; C; 1044B; # DESERET CAPITAL LETTER EM +10424; C; 1044C; # DESERET CAPITAL LETTER EN +10425; C; 1044D; # DESERET CAPITAL LETTER ENG +10426; C; 1044E; # DESERET CAPITAL LETTER OI +10427; C; 1044F; # DESERET CAPITAL LETTER EW +104B0; C; 104D8; # OSAGE CAPITAL LETTER A +104B1; C; 104D9; # OSAGE CAPITAL LETTER AI +104B2; C; 104DA; # OSAGE CAPITAL LETTER AIN +104B3; C; 104DB; # OSAGE CAPITAL LETTER AH +104B4; C; 104DC; # OSAGE CAPITAL LETTER BRA +104B5; C; 104DD; # OSAGE CAPITAL LETTER CHA +104B6; C; 104DE; # OSAGE CAPITAL LETTER EHCHA +104B7; C; 104DF; # OSAGE CAPITAL LETTER E +104B8; C; 104E0; # OSAGE CAPITAL LETTER EIN +104B9; C; 104E1; # OSAGE CAPITAL LETTER HA +104BA; C; 104E2; # OSAGE CAPITAL LETTER HYA +104BB; C; 104E3; # OSAGE CAPITAL LETTER I +104BC; C; 104E4; # OSAGE CAPITAL LETTER KA +104BD; C; 104E5; # OSAGE CAPITAL LETTER EHKA +104BE; C; 104E6; # OSAGE CAPITAL LETTER KYA +104BF; C; 104E7; # OSAGE CAPITAL LETTER LA +104C0; C; 104E8; # OSAGE CAPITAL LETTER MA +104C1; C; 104E9; # OSAGE CAPITAL LETTER NA +104C2; C; 104EA; # OSAGE CAPITAL LETTER O +104C3; C; 104EB; # OSAGE CAPITAL LETTER OIN +104C4; C; 104EC; # OSAGE CAPITAL LETTER PA +104C5; C; 104ED; # OSAGE CAPITAL LETTER EHPA +104C6; C; 104EE; # OSAGE CAPITAL LETTER SA +104C7; C; 104EF; # OSAGE CAPITAL LETTER SHA +104C8; C; 104F0; # OSAGE CAPITAL LETTER TA +104C9; C; 104F1; # OSAGE CAPITAL LETTER EHTA +104CA; C; 104F2; # OSAGE CAPITAL LETTER TSA +104CB; C; 104F3; # OSAGE CAPITAL LETTER EHTSA +104CC; C; 104F4; # OSAGE CAPITAL LETTER TSHA +104CD; C; 104F5; # OSAGE CAPITAL LETTER DHA +104CE; C; 104F6; # OSAGE CAPITAL LETTER U +104CF; C; 104F7; # OSAGE CAPITAL LETTER WA +104D0; C; 104F8; # OSAGE CAPITAL LETTER KHA +104D1; C; 104F9; # OSAGE CAPITAL LETTER GHA +104D2; C; 104FA; # OSAGE CAPITAL LETTER ZA +104D3; C; 104FB; # OSAGE CAPITAL LETTER ZHA +10570; C; 10597; # VITHKUQI CAPITAL LETTER A +10571; C; 10598; # VITHKUQI CAPITAL LETTER BBE +10572; C; 10599; # VITHKUQI CAPITAL LETTER BE +10573; C; 1059A; # VITHKUQI CAPITAL LETTER CE +10574; C; 1059B; # VITHKUQI CAPITAL LETTER CHE +10575; C; 1059C; # VITHKUQI CAPITAL LETTER DE +10576; C; 1059D; # VITHKUQI CAPITAL LETTER DHE +10577; C; 1059E; # VITHKUQI CAPITAL LETTER EI +10578; C; 1059F; # VITHKUQI CAPITAL LETTER E +10579; C; 105A0; # VITHKUQI CAPITAL LETTER FE +1057A; C; 105A1; # VITHKUQI CAPITAL LETTER GA +1057C; C; 105A3; # VITHKUQI CAPITAL LETTER HA +1057D; C; 105A4; # VITHKUQI CAPITAL LETTER HHA +1057E; C; 105A5; # VITHKUQI CAPITAL LETTER I +1057F; C; 105A6; # VITHKUQI CAPITAL LETTER IJE +10580; C; 105A7; # VITHKUQI CAPITAL LETTER JE +10581; C; 105A8; # VITHKUQI CAPITAL LETTER KA +10582; C; 105A9; # VITHKUQI CAPITAL LETTER LA +10583; C; 105AA; # VITHKUQI CAPITAL LETTER LLA +10584; C; 105AB; # VITHKUQI CAPITAL LETTER ME +10585; C; 105AC; # VITHKUQI CAPITAL LETTER NE +10586; C; 105AD; # VITHKUQI CAPITAL LETTER NJE +10587; C; 105AE; # VITHKUQI CAPITAL LETTER O +10588; C; 105AF; # VITHKUQI CAPITAL LETTER PE +10589; C; 105B0; # VITHKUQI CAPITAL LETTER QA +1058A; C; 105B1; # VITHKUQI CAPITAL LETTER RE +1058C; C; 105B3; # VITHKUQI CAPITAL LETTER SE +1058D; C; 105B4; # VITHKUQI CAPITAL LETTER SHE +1058E; C; 105B5; # VITHKUQI CAPITAL LETTER TE +1058F; C; 105B6; # VITHKUQI CAPITAL LETTER THE +10590; C; 105B7; # VITHKUQI CAPITAL LETTER U +10591; C; 105B8; # VITHKUQI CAPITAL LETTER VE +10592; C; 105B9; # VITHKUQI CAPITAL LETTER XE +10594; C; 105BB; # VITHKUQI CAPITAL LETTER Y +10595; C; 105BC; # VITHKUQI CAPITAL LETTER ZE +10C80; C; 10CC0; # OLD HUNGARIAN CAPITAL LETTER A +10C81; C; 10CC1; # OLD HUNGARIAN CAPITAL LETTER AA +10C82; C; 10CC2; # OLD HUNGARIAN CAPITAL LETTER EB +10C83; C; 10CC3; # OLD HUNGARIAN CAPITAL LETTER AMB +10C84; C; 10CC4; # OLD HUNGARIAN CAPITAL LETTER EC +10C85; C; 10CC5; # OLD HUNGARIAN CAPITAL LETTER ENC +10C86; C; 10CC6; # OLD HUNGARIAN CAPITAL LETTER ECS +10C87; C; 10CC7; # OLD HUNGARIAN CAPITAL LETTER ED +10C88; C; 10CC8; # OLD HUNGARIAN CAPITAL LETTER AND +10C89; C; 10CC9; # OLD HUNGARIAN CAPITAL LETTER E +10C8A; C; 10CCA; # OLD HUNGARIAN CAPITAL LETTER CLOSE E +10C8B; C; 10CCB; # OLD HUNGARIAN CAPITAL LETTER EE +10C8C; C; 10CCC; # OLD HUNGARIAN CAPITAL LETTER EF +10C8D; C; 10CCD; # OLD HUNGARIAN CAPITAL LETTER EG +10C8E; C; 10CCE; # OLD HUNGARIAN CAPITAL LETTER EGY +10C8F; C; 10CCF; # OLD HUNGARIAN CAPITAL LETTER EH +10C90; C; 10CD0; # OLD HUNGARIAN CAPITAL LETTER I +10C91; C; 10CD1; # OLD HUNGARIAN CAPITAL LETTER II +10C92; C; 10CD2; # OLD HUNGARIAN CAPITAL LETTER EJ +10C93; C; 10CD3; # OLD HUNGARIAN CAPITAL LETTER EK +10C94; C; 10CD4; # OLD HUNGARIAN CAPITAL LETTER AK +10C95; C; 10CD5; # OLD HUNGARIAN CAPITAL LETTER UNK +10C96; C; 10CD6; # OLD HUNGARIAN CAPITAL LETTER EL +10C97; C; 10CD7; # OLD HUNGARIAN CAPITAL LETTER ELY +10C98; C; 10CD8; # OLD HUNGARIAN CAPITAL LETTER EM +10C99; C; 10CD9; # OLD HUNGARIAN CAPITAL LETTER EN +10C9A; C; 10CDA; # OLD HUNGARIAN CAPITAL LETTER ENY +10C9B; C; 10CDB; # OLD HUNGARIAN CAPITAL LETTER O +10C9C; C; 10CDC; # OLD HUNGARIAN CAPITAL LETTER OO +10C9D; C; 10CDD; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE +10C9E; C; 10CDE; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE +10C9F; C; 10CDF; # OLD HUNGARIAN CAPITAL LETTER OEE +10CA0; C; 10CE0; # OLD HUNGARIAN CAPITAL LETTER EP +10CA1; C; 10CE1; # OLD HUNGARIAN CAPITAL LETTER EMP +10CA2; C; 10CE2; # OLD HUNGARIAN CAPITAL LETTER ER +10CA3; C; 10CE3; # OLD HUNGARIAN CAPITAL LETTER SHORT ER +10CA4; C; 10CE4; # OLD HUNGARIAN CAPITAL LETTER ES +10CA5; C; 10CE5; # OLD HUNGARIAN CAPITAL LETTER ESZ +10CA6; C; 10CE6; # OLD HUNGARIAN CAPITAL LETTER ET +10CA7; C; 10CE7; # OLD HUNGARIAN CAPITAL LETTER ENT +10CA8; C; 10CE8; # OLD HUNGARIAN CAPITAL LETTER ETY +10CA9; C; 10CE9; # OLD HUNGARIAN CAPITAL LETTER ECH +10CAA; C; 10CEA; # OLD HUNGARIAN CAPITAL LETTER U +10CAB; C; 10CEB; # OLD HUNGARIAN CAPITAL LETTER UU +10CAC; C; 10CEC; # OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE +10CAD; C; 10CED; # OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE +10CAE; C; 10CEE; # OLD HUNGARIAN CAPITAL LETTER EV +10CAF; C; 10CEF; # OLD HUNGARIAN CAPITAL LETTER EZ +10CB0; C; 10CF0; # OLD HUNGARIAN CAPITAL LETTER EZS +10CB1; C; 10CF1; # OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN +10CB2; C; 10CF2; # OLD HUNGARIAN CAPITAL LETTER US +118A0; C; 118C0; # WARANG CITI CAPITAL LETTER NGAA +118A1; C; 118C1; # WARANG CITI CAPITAL LETTER A +118A2; C; 118C2; # WARANG CITI CAPITAL LETTER WI +118A3; C; 118C3; # WARANG CITI CAPITAL LETTER YU +118A4; C; 118C4; # WARANG CITI CAPITAL LETTER YA +118A5; C; 118C5; # WARANG CITI CAPITAL LETTER YO +118A6; C; 118C6; # WARANG CITI CAPITAL LETTER II +118A7; C; 118C7; # WARANG CITI CAPITAL LETTER UU +118A8; C; 118C8; # WARANG CITI CAPITAL LETTER E +118A9; C; 118C9; # WARANG CITI CAPITAL LETTER O +118AA; C; 118CA; # WARANG CITI CAPITAL LETTER ANG +118AB; C; 118CB; # WARANG CITI CAPITAL LETTER GA +118AC; C; 118CC; # WARANG CITI CAPITAL LETTER KO +118AD; C; 118CD; # WARANG CITI CAPITAL LETTER ENY +118AE; C; 118CE; # WARANG CITI CAPITAL LETTER YUJ +118AF; C; 118CF; # WARANG CITI CAPITAL LETTER UC +118B0; C; 118D0; # WARANG CITI CAPITAL LETTER ENN +118B1; C; 118D1; # WARANG CITI CAPITAL LETTER ODD +118B2; C; 118D2; # WARANG CITI CAPITAL LETTER TTE +118B3; C; 118D3; # WARANG CITI CAPITAL LETTER NUNG +118B4; C; 118D4; # WARANG CITI CAPITAL LETTER DA +118B5; C; 118D5; # WARANG CITI CAPITAL LETTER AT +118B6; C; 118D6; # WARANG CITI CAPITAL LETTER AM +118B7; C; 118D7; # WARANG CITI CAPITAL LETTER BU +118B8; C; 118D8; # WARANG CITI CAPITAL LETTER PU +118B9; C; 118D9; # WARANG CITI CAPITAL LETTER HIYO +118BA; C; 118DA; # WARANG CITI CAPITAL LETTER HOLO +118BB; C; 118DB; # WARANG CITI CAPITAL LETTER HORR +118BC; C; 118DC; # WARANG CITI CAPITAL LETTER HAR +118BD; C; 118DD; # WARANG CITI CAPITAL LETTER SSUU +118BE; C; 118DE; # WARANG CITI CAPITAL LETTER SII +118BF; C; 118DF; # WARANG CITI CAPITAL LETTER VIYO +16E40; C; 16E60; # MEDEFAIDRIN CAPITAL LETTER M +16E41; C; 16E61; # MEDEFAIDRIN CAPITAL LETTER S +16E42; C; 16E62; # MEDEFAIDRIN CAPITAL LETTER V +16E43; C; 16E63; # MEDEFAIDRIN CAPITAL LETTER W +16E44; C; 16E64; # MEDEFAIDRIN CAPITAL LETTER ATIU +16E45; C; 16E65; # MEDEFAIDRIN CAPITAL LETTER Z +16E46; C; 16E66; # MEDEFAIDRIN CAPITAL LETTER KP +16E47; C; 16E67; # MEDEFAIDRIN CAPITAL LETTER P +16E48; C; 16E68; # MEDEFAIDRIN CAPITAL LETTER T +16E49; C; 16E69; # MEDEFAIDRIN CAPITAL LETTER G +16E4A; C; 16E6A; # MEDEFAIDRIN CAPITAL LETTER F +16E4B; C; 16E6B; # MEDEFAIDRIN CAPITAL LETTER I +16E4C; C; 16E6C; # MEDEFAIDRIN CAPITAL LETTER K +16E4D; C; 16E6D; # MEDEFAIDRIN CAPITAL LETTER A +16E4E; C; 16E6E; # MEDEFAIDRIN CAPITAL LETTER J +16E4F; C; 16E6F; # MEDEFAIDRIN CAPITAL LETTER E +16E50; C; 16E70; # MEDEFAIDRIN CAPITAL LETTER B +16E51; C; 16E71; # MEDEFAIDRIN CAPITAL LETTER C +16E52; C; 16E72; # MEDEFAIDRIN CAPITAL LETTER U +16E53; C; 16E73; # MEDEFAIDRIN CAPITAL LETTER YU +16E54; C; 16E74; # MEDEFAIDRIN CAPITAL LETTER L +16E55; C; 16E75; # MEDEFAIDRIN CAPITAL LETTER Q +16E56; C; 16E76; # MEDEFAIDRIN CAPITAL LETTER HP +16E57; C; 16E77; # MEDEFAIDRIN CAPITAL LETTER NY +16E58; C; 16E78; # MEDEFAIDRIN CAPITAL LETTER X +16E59; C; 16E79; # MEDEFAIDRIN CAPITAL LETTER D +16E5A; C; 16E7A; # MEDEFAIDRIN CAPITAL LETTER OE +16E5B; C; 16E7B; # MEDEFAIDRIN CAPITAL LETTER N +16E5C; C; 16E7C; # MEDEFAIDRIN CAPITAL LETTER R +16E5D; C; 16E7D; # MEDEFAIDRIN CAPITAL LETTER O +16E5E; C; 16E7E; # MEDEFAIDRIN CAPITAL LETTER AI +16E5F; C; 16E7F; # MEDEFAIDRIN CAPITAL LETTER Y +1E900; C; 1E922; # ADLAM CAPITAL LETTER ALIF +1E901; C; 1E923; # ADLAM CAPITAL LETTER DAALI +1E902; C; 1E924; # ADLAM CAPITAL LETTER LAAM +1E903; C; 1E925; # ADLAM CAPITAL LETTER MIIM +1E904; C; 1E926; # ADLAM CAPITAL LETTER BA +1E905; C; 1E927; # ADLAM CAPITAL LETTER SINNYIIYHE +1E906; C; 1E928; # ADLAM CAPITAL LETTER PE +1E907; C; 1E929; # ADLAM CAPITAL LETTER BHE +1E908; C; 1E92A; # ADLAM CAPITAL LETTER RA +1E909; C; 1E92B; # ADLAM CAPITAL LETTER E +1E90A; C; 1E92C; # ADLAM CAPITAL LETTER FA +1E90B; C; 1E92D; # ADLAM CAPITAL LETTER I +1E90C; C; 1E92E; # ADLAM CAPITAL LETTER O +1E90D; C; 1E92F; # ADLAM CAPITAL LETTER DHA +1E90E; C; 1E930; # ADLAM CAPITAL LETTER YHE +1E90F; C; 1E931; # ADLAM CAPITAL LETTER WAW +1E910; C; 1E932; # ADLAM CAPITAL LETTER NUN +1E911; C; 1E933; # ADLAM CAPITAL LETTER KAF +1E912; C; 1E934; # ADLAM CAPITAL LETTER YA +1E913; C; 1E935; # ADLAM CAPITAL LETTER U +1E914; C; 1E936; # ADLAM CAPITAL LETTER JIIM +1E915; C; 1E937; # ADLAM CAPITAL LETTER CHI +1E916; C; 1E938; # ADLAM CAPITAL LETTER HA +1E917; C; 1E939; # ADLAM CAPITAL LETTER QAAF +1E918; C; 1E93A; # ADLAM CAPITAL LETTER GA +1E919; C; 1E93B; # ADLAM CAPITAL LETTER NYA +1E91A; C; 1E93C; # ADLAM CAPITAL LETTER TU +1E91B; C; 1E93D; # ADLAM CAPITAL LETTER NHA +1E91C; C; 1E93E; # ADLAM CAPITAL LETTER VA +1E91D; C; 1E93F; # ADLAM CAPITAL LETTER KHA +1E91E; C; 1E940; # ADLAM CAPITAL LETTER GBE +1E91F; C; 1E941; # ADLAM CAPITAL LETTER ZAL +1E920; C; 1E942; # ADLAM CAPITAL LETTER KPO +1E921; C; 1E943; # ADLAM CAPITAL LETTER SHA +# +# EOF diff --git a/unicode-data/CompositionExclusions.txt b/unicode-data/CompositionExclusions.txt new file mode 100644 index 0000000..db708a7 --- /dev/null +++ b/unicode-data/CompositionExclusions.txt @@ -0,0 +1,221 @@ +# CompositionExclusions-15.1.0.txt +# Date: 2023-01-05 +# © 2023 Unicode®, Inc. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# This file lists the characters for the Composition Exclusion Table +# defined in UAX #15, Unicode Normalization Forms. +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# For more information, see +# https://www.unicode.org/reports/tr15/#Primary_Exclusion_List_Table +# +# For a full derivation of composition exclusions, see the derived property +# Full_Composition_Exclusion in DerivedNormalizationProps.txt +# + +# ================================================ +# (1) Script Specifics +# +# This list of characters cannot be derived from the UnicodeData.txt file. +# +# Included are the following subcategories: +# +# - Many precomposed characters using a nukta diacritic in the Devanagari, +# Bangla/Bengali, Gurmukhi, or Odia/Oriya scripts. +# - Tibetan letters and subjoined letters with decompositions including +# U+0FB7 TIBETAN SUBJOINED LETTER HA or U+0FB5 TIBETAN SUBJOINED LETTER SSA. +# - Two two-part Tibetan vowel signs involving top and bottom pieces. +# - A large collection of compatibility precomposed characters for Hebrew +# involving dagesh and/or other combining marks. +# +# This list is unlikely to grow. +# +# ================================================ + +0958 # DEVANAGARI LETTER QA +0959 # DEVANAGARI LETTER KHHA +095A # DEVANAGARI LETTER GHHA +095B # DEVANAGARI LETTER ZA +095C # DEVANAGARI LETTER DDDHA +095D # DEVANAGARI LETTER RHA +095E # DEVANAGARI LETTER FA +095F # DEVANAGARI LETTER YYA +09DC # BENGALI LETTER RRA +09DD # BENGALI LETTER RHA +09DF # BENGALI LETTER YYA +0A33 # GURMUKHI LETTER LLA +0A36 # GURMUKHI LETTER SHA +0A59 # GURMUKHI LETTER KHHA +0A5A # GURMUKHI LETTER GHHA +0A5B # GURMUKHI LETTER ZA +0A5E # GURMUKHI LETTER FA +0B5C # ORIYA LETTER RRA +0B5D # ORIYA LETTER RHA +0F43 # TIBETAN LETTER GHA +0F4D # TIBETAN LETTER DDHA +0F52 # TIBETAN LETTER DHA +0F57 # TIBETAN LETTER BHA +0F5C # TIBETAN LETTER DZHA +0F69 # TIBETAN LETTER KSSA +0F76 # TIBETAN VOWEL SIGN VOCALIC R +0F78 # TIBETAN VOWEL SIGN VOCALIC L +0F93 # TIBETAN SUBJOINED LETTER GHA +0F9D # TIBETAN SUBJOINED LETTER DDHA +0FA2 # TIBETAN SUBJOINED LETTER DHA +0FA7 # TIBETAN SUBJOINED LETTER BHA +0FAC # TIBETAN SUBJOINED LETTER DZHA +0FB9 # TIBETAN SUBJOINED LETTER KSSA +FB1D # HEBREW LETTER YOD WITH HIRIQ +FB1F # HEBREW LIGATURE YIDDISH YOD YOD PATAH +FB2A # HEBREW LETTER SHIN WITH SHIN DOT +FB2B # HEBREW LETTER SHIN WITH SIN DOT +FB2C # HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT +FB2D # HEBREW LETTER SHIN WITH DAGESH AND SIN DOT +FB2E # HEBREW LETTER ALEF WITH PATAH +FB2F # HEBREW LETTER ALEF WITH QAMATS +FB30 # HEBREW LETTER ALEF WITH MAPIQ +FB31 # HEBREW LETTER BET WITH DAGESH +FB32 # HEBREW LETTER GIMEL WITH DAGESH +FB33 # HEBREW LETTER DALET WITH DAGESH +FB34 # HEBREW LETTER HE WITH MAPIQ +FB35 # HEBREW LETTER VAV WITH DAGESH +FB36 # HEBREW LETTER ZAYIN WITH DAGESH +FB38 # HEBREW LETTER TET WITH DAGESH +FB39 # HEBREW LETTER YOD WITH DAGESH +FB3A # HEBREW LETTER FINAL KAF WITH DAGESH +FB3B # HEBREW LETTER KAF WITH DAGESH +FB3C # HEBREW LETTER LAMED WITH DAGESH +FB3E # HEBREW LETTER MEM WITH DAGESH +FB40 # HEBREW LETTER NUN WITH DAGESH +FB41 # HEBREW LETTER SAMEKH WITH DAGESH +FB43 # HEBREW LETTER FINAL PE WITH DAGESH +FB44 # HEBREW LETTER PE WITH DAGESH +FB46 # HEBREW LETTER TSADI WITH DAGESH +FB47 # HEBREW LETTER QOF WITH DAGESH +FB48 # HEBREW LETTER RESH WITH DAGESH +FB49 # HEBREW LETTER SHIN WITH DAGESH +FB4A # HEBREW LETTER TAV WITH DAGESH +FB4B # HEBREW LETTER VAV WITH HOLAM +FB4C # HEBREW LETTER BET WITH RAFE +FB4D # HEBREW LETTER KAF WITH RAFE +FB4E # HEBREW LETTER PE WITH RAFE + +# Total code points: 67 + +# ================================================ +# (2) Post Composition Version precomposed characters +# +# These characters cannot be derived solely from the UnicodeData.txt file +# in this version of Unicode. +# +# Note that characters added to the standard after the +# Composition Version and which have canonical decomposition mappings +# are not automatically added to this list of Post Composition +# Version precomposed characters. +# ================================================ + +2ADC # FORKING +1D15E # MUSICAL SYMBOL HALF NOTE +1D15F # MUSICAL SYMBOL QUARTER NOTE +1D160 # MUSICAL SYMBOL EIGHTH NOTE +1D161 # MUSICAL SYMBOL SIXTEENTH NOTE +1D162 # MUSICAL SYMBOL THIRTY-SECOND NOTE +1D163 # MUSICAL SYMBOL SIXTY-FOURTH NOTE +1D164 # MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D1BB # MUSICAL SYMBOL MINIMA +1D1BC # MUSICAL SYMBOL MINIMA BLACK +1D1BD # MUSICAL SYMBOL SEMIMINIMA WHITE +1D1BE # MUSICAL SYMBOL SEMIMINIMA BLACK +1D1BF # MUSICAL SYMBOL FUSA WHITE +1D1C0 # MUSICAL SYMBOL FUSA BLACK + +# Total code points: 14 + +# ================================================ +# (3) Singleton Decompositions +# +# These characters can be derived from the UnicodeData.txt file +# by including all canonically decomposable characters whose +# canonical decomposition consists of a single character. +# +# These characters are simply quoted here for reference. +# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt +# ================================================ + +# 0340..0341 [2] COMBINING GRAVE TONE MARK..COMBINING ACUTE TONE MARK +# 0343 COMBINING GREEK KORONIS +# 0374 GREEK NUMERAL SIGN +# 037E GREEK QUESTION MARK +# 0387 GREEK ANO TELEIA +# 1F71 GREEK SMALL LETTER ALPHA WITH OXIA +# 1F73 GREEK SMALL LETTER EPSILON WITH OXIA +# 1F75 GREEK SMALL LETTER ETA WITH OXIA +# 1F77 GREEK SMALL LETTER IOTA WITH OXIA +# 1F79 GREEK SMALL LETTER OMICRON WITH OXIA +# 1F7B GREEK SMALL LETTER UPSILON WITH OXIA +# 1F7D GREEK SMALL LETTER OMEGA WITH OXIA +# 1FBB GREEK CAPITAL LETTER ALPHA WITH OXIA +# 1FBE GREEK PROSGEGRAMMENI +# 1FC9 GREEK CAPITAL LETTER EPSILON WITH OXIA +# 1FCB GREEK CAPITAL LETTER ETA WITH OXIA +# 1FD3 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +# 1FDB GREEK CAPITAL LETTER IOTA WITH OXIA +# 1FE3 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +# 1FEB GREEK CAPITAL LETTER UPSILON WITH OXIA +# 1FEE..1FEF [2] GREEK DIALYTIKA AND OXIA..GREEK VARIA +# 1FF9 GREEK CAPITAL LETTER OMICRON WITH OXIA +# 1FFB GREEK CAPITAL LETTER OMEGA WITH OXIA +# 1FFD GREEK OXIA +# 2000..2001 [2] EN QUAD..EM QUAD +# 2126 OHM SIGN +# 212A..212B [2] KELVIN SIGN..ANGSTROM SIGN +# 2329 LEFT-POINTING ANGLE BRACKET +# 232A RIGHT-POINTING ANGLE BRACKET +# F900..FA0D [270] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA0D +# FA10 CJK COMPATIBILITY IDEOGRAPH-FA10 +# FA12 CJK COMPATIBILITY IDEOGRAPH-FA12 +# FA15..FA1E [10] CJK COMPATIBILITY IDEOGRAPH-FA15..CJK COMPATIBILITY IDEOGRAPH-FA1E +# FA20 CJK COMPATIBILITY IDEOGRAPH-FA20 +# FA22 CJK COMPATIBILITY IDEOGRAPH-FA22 +# FA25..FA26 [2] CJK COMPATIBILITY IDEOGRAPH-FA25..CJK COMPATIBILITY IDEOGRAPH-FA26 +# FA2A..FA6D [68] CJK COMPATIBILITY IDEOGRAPH-FA2A..CJK COMPATIBILITY IDEOGRAPH-FA6D +# FA70..FAD9 [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +# 2F800..2FA1D [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D + +# Total code points: 1035 + +# ================================================ +# (4) Non-Starter Decompositions +# +# These characters can be derived from the UnicodeData.txt file +# by including each expanding canonical decomposition +# (i.e., those which canonically decompose to a sequence +# of characters instead of a single character), such that: +# +# A. The character is not a Starter. +# +# OR (inclusive) +# +# B. The character's canonical decomposition begins +# with a character that is not a Starter. +# +# Note that a "Starter" is any character with a zero combining class. +# +# These characters are simply quoted here for reference. +# See also Full_Composition_Exclusion in DerivedNormalizationProps.txt +# ================================================ + +# 0344 COMBINING GREEK DIALYTIKA TONOS +# 0F73 TIBETAN VOWEL SIGN II +# 0F75 TIBETAN VOWEL SIGN UU +# 0F81 TIBETAN VOWEL SIGN REVERSED II + +# Total code points: 4 + +# EOF diff --git a/unicode-data/EastAsianWidth.txt b/unicode-data/EastAsianWidth.txt new file mode 100644 index 0000000..02df4df --- /dev/null +++ b/unicode-data/EastAsianWidth.txt @@ -0,0 +1,2621 @@ +# EastAsianWidth-15.1.0.txt +# Date: 2023-07-28, 23:34:08 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# East_Asian_Width Property +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# The format is two fields separated by a semicolon. +# Field 0: Unicode code point value or range of code point values +# Field 1: East_Asian_Width property, consisting of one of the following values: +# "A", "F", "H", "N", "Na", "W" +# - All code points, assigned or unassigned, that are not listed +# explicitly are given the value "N". +# - The unassigned code points in the following blocks default to "W": +# CJK Unified Ideographs Extension A: U+3400..U+4DBF +# CJK Unified Ideographs: U+4E00..U+9FFF +# CJK Compatibility Ideographs: U+F900..U+FAFF +# - All undesignated code points in Planes 2 and 3, whether inside or +# outside of allocated blocks, default to "W": +# Plane 2: U+20000..U+2FFFD +# Plane 3: U+30000..U+3FFFD +# +# Character ranges are specified as for other property files in the +# Unicode Character Database. +# +# The comments following the number sign "#" list the General_Category +# property value or the L& alias of the derived value LC, the Unicode +# character name or names, and, in lines with ranges of code points, +# the code point count in square brackets. +# +# For more information, see UAX #11: East Asian Width, +# at https://www.unicode.org/reports/tr11/ +# +# @missing: 0000..10FFFF; N +0000..001F ; N # Cc [32] .. +0020 ; Na # Zs SPACE +0021..0023 ; Na # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Na # Sc DOLLAR SIGN +0025..0027 ; Na # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Na # Ps LEFT PARENTHESIS +0029 ; Na # Pe RIGHT PARENTHESIS +002A ; Na # Po ASTERISK +002B ; Na # Sm PLUS SIGN +002C ; Na # Po COMMA +002D ; Na # Pd HYPHEN-MINUS +002E..002F ; Na # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Na # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Na # Po [2] COLON..SEMICOLON +003C..003E ; Na # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Na # Po [2] QUESTION MARK..COMMERCIAL AT +0041..005A ; Na # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B ; Na # Ps LEFT SQUARE BRACKET +005C ; Na # Po REVERSE SOLIDUS +005D ; Na # Pe RIGHT SQUARE BRACKET +005E ; Na # Sk CIRCUMFLEX ACCENT +005F ; Na # Pc LOW LINE +0060 ; Na # Sk GRAVE ACCENT +0061..007A ; Na # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B ; Na # Ps LEFT CURLY BRACKET +007C ; Na # Sm VERTICAL LINE +007D ; Na # Pe RIGHT CURLY BRACKET +007E ; Na # Sm TILDE +007F ; N # Cc +0080..009F ; N # Cc [32] .. +00A0 ; N # Zs NO-BREAK SPACE +00A1 ; A # Po INVERTED EXCLAMATION MARK +00A2..00A3 ; Na # Sc [2] CENT SIGN..POUND SIGN +00A4 ; A # Sc CURRENCY SIGN +00A5 ; Na # Sc YEN SIGN +00A6 ; Na # So BROKEN BAR +00A7 ; A # Po SECTION SIGN +00A8 ; A # Sk DIAERESIS +00A9 ; N # So COPYRIGHT SIGN +00AA ; A # Lo FEMININE ORDINAL INDICATOR +00AB ; N # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Na # Sm NOT SIGN +00AD ; A # Cf SOFT HYPHEN +00AE ; A # So REGISTERED SIGN +00AF ; Na # Sk MACRON +00B0 ; A # So DEGREE SIGN +00B1 ; A # Sm PLUS-MINUS SIGN +00B2..00B3 ; A # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; A # Sk ACUTE ACCENT +00B5 ; N # Ll MICRO SIGN +00B6..00B7 ; A # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; A # Sk CEDILLA +00B9 ; A # No SUPERSCRIPT ONE +00BA ; A # Lo MASCULINE ORDINAL INDICATOR +00BB ; N # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; A # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; A # Po INVERTED QUESTION MARK +00C0..00C5 ; N # Lu [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE +00C6 ; A # Lu LATIN CAPITAL LETTER AE +00C7..00CF ; N # Lu [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS +00D0 ; A # Lu LATIN CAPITAL LETTER ETH +00D1..00D6 ; N # Lu [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 ; A # Sm MULTIPLICATION SIGN +00D8 ; A # Lu LATIN CAPITAL LETTER O WITH STROKE +00D9..00DD ; N # Lu [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE +00DE..00E1 ; A # L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE +00E2..00E5 ; N # Ll [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE +00E6 ; A # Ll LATIN SMALL LETTER AE +00E7 ; N # Ll LATIN SMALL LETTER C WITH CEDILLA +00E8..00EA ; A # Ll [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX +00EB ; N # Ll LATIN SMALL LETTER E WITH DIAERESIS +00EC..00ED ; A # Ll [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE +00EE..00EF ; N # Ll [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS +00F0 ; A # Ll LATIN SMALL LETTER ETH +00F1 ; N # Ll LATIN SMALL LETTER N WITH TILDE +00F2..00F3 ; A # Ll [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE +00F4..00F6 ; N # Ll [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS +00F7 ; A # Sm DIVISION SIGN +00F8..00FA ; A # Ll [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE +00FB ; N # Ll LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS +00FD ; N # Ll LATIN SMALL LETTER Y WITH ACUTE +00FE ; A # Ll LATIN SMALL LETTER THORN +00FF ; N # Ll LATIN SMALL LETTER Y WITH DIAERESIS +0100 ; N # Lu LATIN CAPITAL LETTER A WITH MACRON +0101 ; A # Ll LATIN SMALL LETTER A WITH MACRON +0102..0110 ; N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE +0111 ; A # Ll LATIN SMALL LETTER D WITH STROKE +0112 ; N # Lu LATIN CAPITAL LETTER E WITH MACRON +0113 ; A # Ll LATIN SMALL LETTER E WITH MACRON +0114..011A ; N # L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON +011B ; A # Ll LATIN SMALL LETTER E WITH CARON +011C..0125 ; N # L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX +0126..0127 ; A # L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE +0128..012A ; N # L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON +012B ; A # Ll LATIN SMALL LETTER I WITH MACRON +012C..0130 ; N # L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE +0131..0133 ; A # L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ +0134..0137 ; N # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA +0138 ; A # Ll LATIN SMALL LETTER KRA +0139..013E ; N # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON +013F..0142 ; A # L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE +0143 ; N # Lu LATIN CAPITAL LETTER N WITH ACUTE +0144 ; A # Ll LATIN SMALL LETTER N WITH ACUTE +0145..0147 ; N # L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON +0148..014B ; A # L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG +014C ; N # Lu LATIN CAPITAL LETTER O WITH MACRON +014D ; A # Ll LATIN SMALL LETTER O WITH MACRON +014E..0151 ; N # L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE +0152..0153 ; A # L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE +0154..0165 ; N # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON +0166..0167 ; A # L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE +0168..016A ; N # L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON +016B ; A # Ll LATIN SMALL LETTER U WITH MACRON +016C..017F ; N # L& [20] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER LONG S +0180..01BA ; N # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; N # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; N # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; N # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..01CD ; N # L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON +01CE ; A # Ll LATIN SMALL LETTER A WITH CARON +01CF ; N # Lu LATIN CAPITAL LETTER I WITH CARON +01D0 ; A # Ll LATIN SMALL LETTER I WITH CARON +01D1 ; N # Lu LATIN CAPITAL LETTER O WITH CARON +01D2 ; A # Ll LATIN SMALL LETTER O WITH CARON +01D3 ; N # Lu LATIN CAPITAL LETTER U WITH CARON +01D4 ; A # Ll LATIN SMALL LETTER U WITH CARON +01D5 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D6 ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D7 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D8 ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DA ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DB ; N # Lu LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DC ; A # Ll LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +01DD..024F ; N # L& [115] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER Y WITH STROKE +0250 ; N # Ll LATIN SMALL LETTER TURNED A +0251 ; A # Ll LATIN SMALL LETTER ALPHA +0252..0260 ; N # Ll [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK +0261 ; A # Ll LATIN SMALL LETTER SCRIPT G +0262..0293 ; N # Ll [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL +0294 ; N # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; N # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; N # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C3 ; N # Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD +02C4 ; A # Sk MODIFIER LETTER UP ARROWHEAD +02C5 ; N # Sk MODIFIER LETTER DOWN ARROWHEAD +02C6 ; N # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; A # Lm CARON +02C8 ; N # Lm MODIFIER LETTER VERTICAL LINE +02C9..02CB ; A # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CC ; N # Lm MODIFIER LETTER LOW VERTICAL LINE +02CD ; A # Lm MODIFIER LETTER LOW MACRON +02CE..02CF ; N # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D0 ; A # Lm MODIFIER LETTER TRIANGULAR COLON +02D1 ; N # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; N # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8..02DB ; A # Sk [4] BREVE..OGONEK +02DC ; N # Sk SMALL TILDE +02DD ; A # Sk DOUBLE ACUTE ACCENT +02DE ; N # Sk MODIFIER LETTER RHOTIC HOOK +02DF ; A # Sk MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; N # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; N # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; N # Lm MODIFIER LETTER VOICING +02ED ; N # Sk MODIFIER LETTER UNASPIRATED +02EE ; N # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; N # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..036F ; A # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0370..0373 ; N # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; N # Lm GREEK NUMERAL SIGN +0375 ; N # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; N # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; N # Lm GREEK YPOGEGRAMMENI +037B..037D ; N # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; N # Po GREEK QUESTION MARK +037F ; N # Lu GREEK CAPITAL LETTER YOT +0384..0385 ; N # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; N # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; N # Po GREEK ANO TELEIA +0388..038A ; N # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; N # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..0390 ; N # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391..03A1 ; A # Lu [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03A9 ; A # Lu [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA +03AA..03B0 ; N # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03B1..03C1 ; A # Ll [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO +03C2 ; N # Ll GREEK SMALL LETTER FINAL SIGMA +03C3..03C9 ; A # Ll [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA +03CA..03F5 ; N # L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL +03F6 ; N # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; N # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400 ; N # Lu CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401 ; A # Lu CYRILLIC CAPITAL LETTER IO +0402..040F ; N # Lu [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE +0410..044F ; A # L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA +0450 ; N # Ll CYRILLIC SMALL LETTER IE WITH GRAVE +0451 ; A # Ll CYRILLIC SMALL LETTER IO +0452..0481 ; N # L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA +0482 ; N # So CYRILLIC THOUSANDS SIGN +0483..0487 ; N # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; N # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04FF ; N # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE +0500..052F ; N # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; N # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; N # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; N # Po ARMENIAN FULL STOP +058A ; N # Pd ARMENIAN HYPHEN +058D..058E ; N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; N # Sc ARMENIAN DRAM SIGN +0591..05BD ; N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; N # Pd HEBREW PUNCTUATION MAQAF +05BF ; N # Mn HEBREW POINT RAFE +05C0 ; N # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; N # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; N # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; N # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; N # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605 ; N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608 ; N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; N # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; N # Sc AFGHANI SIGN +060C..060D ; N # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F ; N # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B ; N # Po ARABIC SEMICOLON +061C ; N # Cf ARABIC LETTER MARK +061D..061F ; N # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +0620..063F ; N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; N # Lm ARABIC TATWEEL +0641..064A ; N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; N # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; N # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; N # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; N # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; N # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; N # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; N # Po ARABIC FULL STOP +06D5 ; N # Lo ARABIC LETTER AE +06D6..06DC ; N # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD ; N # Cf ARABIC END OF AYAH +06DE ; N # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; N # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; N # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; N # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; N # So ARABIC PLACE OF SAJDAH +06EA..06ED ; N # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; N # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; N # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; N # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; N # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; N # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; N # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; N # Cf SYRIAC ABBREVIATION MARK +0710 ; N # Lo SYRIAC LETTER ALAPH +0711 ; N # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; N # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; N # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; N # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F ; N # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07A5 ; N # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; N # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; N # Lo THAANA LETTER NAA +07C0..07C9 ; N # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; N # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; N # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; N # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; N # So NKO SYMBOL OO DENNEN +07F7..07F9 ; N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; N # Lm NKO LAJANYALAN +07FD ; N # Mn NKO DANTAYALAN +07FE..07FF ; N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815 ; N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; N # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; N # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; N # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; N # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; N # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; N # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +0840..0858 ; N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; N # Po MANDAIC PUNCTUATION +0860..086A ; N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +0870..0887 ; N # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; N # Sk ARABIC RAISED ROUND DOT +0889..088E ; N # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; N # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; N # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; N # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; N # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; N # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; N # Cf ARABIC DISPUTED END OF AYAH +08E3..08FF ; N # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +0900..0902 ; N # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; N # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; N # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; N # Mn DEVANAGARI VOWEL SIGN OE +093B ; N # Mc DEVANAGARI VOWEL SIGN OOE +093C ; N # Mn DEVANAGARI SIGN NUKTA +093D ; N # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; N # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; N # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; N # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; N # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; N # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; N # Lo DEVANAGARI OM +0951..0957 ; N # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; N # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; N # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965 ; N # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; N # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; N # Po DEVANAGARI ABBREVIATION SIGN +0971 ; N # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F ; N # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +0980 ; N # Lo BENGALI ANJI +0981 ; N # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; N # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; N # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; N # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; N # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; N # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; N # Lo BENGALI LETTER LA +09B6..09B9 ; N # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; N # Mn BENGALI SIGN NUKTA +09BD ; N # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; N # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; N # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; N # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; N # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; N # Mn BENGALI SIGN VIRAMA +09CE ; N # Lo BENGALI LETTER KHANDA TA +09D7 ; N # Mc BENGALI AU LENGTH MARK +09DC..09DD ; N # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; N # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; N # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; N # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; N # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; N # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; N # So BENGALI ISSHAR +09FB ; N # Sc BENGALI GANDA MARK +09FC ; N # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; N # Po BENGALI ABBREVIATION SIGN +09FE ; N # Mn BENGALI SANDHI MARK +0A01..0A02 ; N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; N # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; N # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; N # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; N # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; N # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; N # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; N # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; N # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; N # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; N # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; N # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; N # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; N # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; N # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; N # Lo GURMUKHI LETTER FA +0A66..0A6F ; N # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; N # Mn GURMUKHI SIGN YAKASH +0A76 ; N # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82 ; N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; N # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; N # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; N # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; N # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; N # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; N # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; N # Mn GUJARATI SIGN NUKTA +0ABD ; N # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; N # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; N # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; N # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; N # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; N # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; N # Mn GUJARATI SIGN VIRAMA +0AD0 ; N # Lo GUJARATI OM +0AE0..0AE1 ; N # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; N # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; N # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; N # Po GUJARATI ABBREVIATION SIGN +0AF1 ; N # Sc GUJARATI RUPEE SIGN +0AF9 ; N # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; N # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; N # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; N # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; N # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; N # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; N # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; N # Mn ORIYA SIGN NUKTA +0B3D ; N # Lo ORIYA SIGN AVAGRAHA +0B3E ; N # Mc ORIYA VOWEL SIGN AA +0B3F ; N # Mn ORIYA VOWEL SIGN I +0B40 ; N # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; N # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; N # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; N # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; N # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; N # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; N # So ORIYA ISSHAR +0B71 ; N # Lo ORIYA LETTER WA +0B72..0B77 ; N # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82 ; N # Mn TAMIL SIGN ANUSVARA +0B83 ; N # Lo TAMIL SIGN VISARGA +0B85..0B8A ; N # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; N # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; N # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; N # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; N # Lo TAMIL LETTER JA +0B9E..0B9F ; N # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; N # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; N # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; N # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; N # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; N # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; N # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; N # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; N # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; N # Mn TAMIL SIGN VIRAMA +0BD0 ; N # Lo TAMIL OM +0BD7 ; N # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; N # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; N # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; N # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; N # Sc TAMIL RUPEE SIGN +0BFA ; N # So TAMIL NUMBER SIGN +0C00 ; N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; N # Mn TELUGU SIGN NUKTA +0C3D ; N # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; N # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; N # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; N # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; N # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; N # So TELUGU SIGN TUUMU +0C80 ; N # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; N # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; N # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; N # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; N # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; N # Mn KANNADA SIGN NUKTA +0CBD ; N # Lo KANNADA SIGN AVAGRAHA +0CBE ; N # Mc KANNADA VOWEL SIGN AA +0CBF ; N # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; N # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; N # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; N # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; N # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; N # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; N # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; N # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; N # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; N # Mn MALAYALAM SIGN VIRAMA +0D4E ; N # Lo MALAYALAM LETTER DOT REPH +0D4F ; N # So MALAYALAM SIGN PARA +0D54..0D56 ; N # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; N # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; N # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; N # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; N # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; N # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; N # So MALAYALAM DATE MARK +0D7A..0D7F ; N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D81 ; N # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; N # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; N # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; N # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; N # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; N # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; N # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; N # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; N # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; N # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; N # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; N # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; N # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; N # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; N # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; N # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F ; N # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45 ; N # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; N # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; N # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; N # Po THAI CHARACTER FONGMAN +0E50..0E59 ; N # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; N # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; N # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; N # Lo LAO LETTER KHO TAM +0E86..0E8A ; N # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; N # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; N # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; N # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; N # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; N # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; N # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; N # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; N # Lm LAO KO LA +0EC8..0ECE ; N # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; N # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; N # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; N # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; N # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; N # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; N # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; N # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; N # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; N # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; N # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; N # So TIBETAN MARK BSDUS RTAGS +0F35 ; N # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; N # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; N # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; N # So TIBETAN MARK CHE MGO +0F39 ; N # Mn TIBETAN MARK TSA -PHRU +0F3A ; N # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; N # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; N # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; N # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; N # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; N # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; N # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; N # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; N # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; N # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; N # Po TIBETAN MARK PALUTA +0F86..0F87 ; N # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; N # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; N # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; N # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; N # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; N # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; N # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; N # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; N # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; N # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; N # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A ; N # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; N # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; N # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; N # Mc MYANMAR VOWEL SIGN E +1032..1037 ; N # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; N # Mc MYANMAR SIGN VISARGA +1039..103A ; N # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; N # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; N # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; N # Lo MYANMAR LETTER GREAT SA +1040..1049 ; N # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; N # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; N # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; N # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; N # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; N # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; N # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; N # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; N # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; N # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; N # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; N # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; N # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; N # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; N # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; N # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; N # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; N # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; N # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; N # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; N # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; N # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; N # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; N # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; N # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; N # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; N # Lu GEORGIAN CAPITAL LETTER YN +10CD ; N # Lu GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; N # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB ; N # Po GEORGIAN PARAGRAPH SEPARATOR +10FC ; N # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; N # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..115F ; W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +1160..11FF ; N # Lo [160] HANGUL JUNGSEONG FILLER..HANGUL JONGSEONG SSANGNIEUN +1200..1248 ; N # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; N # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; N # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; N # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; N # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; N # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; N # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; N # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; N # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; N # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; N # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; N # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; N # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; N # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; N # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; N # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; N # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368 ; N # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; N # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; N # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; N # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5 ; N # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; N # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400 ; N # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; N # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; N # So CANADIAN SYLLABICS CHI SIGN +166E ; N # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; N # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680 ; N # Zs OGHAM SPACE MARK +1681..169A ; N # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; N # Ps OGHAM FEATHER MARK +169C ; N # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA ; N # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..1711 ; N # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; N # Mc TAGALOG SIGN PAMUDPOD +171F ; N # Lo TAGALOG LETTER ARCHAIC RA +1720..1731 ; N # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; N # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; N # Mc HANUNOO SIGN PAMUDPOD +1735..1736 ; N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; N # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; N # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; N # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; N # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; N # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; N # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; N # Mc KHMER VOWEL SIGN AA +17B7..17BD ; N # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; N # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; N # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; N # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; N # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; N # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; N # Lm KHMER SIGN LEK TOO +17D8..17DA ; N # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; N # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; N # Lo KHMER SIGN AVAKRAHASANYA +17DD ; N # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; N # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; N # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805 ; N # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; N # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; N # Cf MONGOLIAN VOWEL SEPARATOR +180F ; N # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; N # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; N # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; N # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; N # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; N # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; N # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; N # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; N # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; N # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; N # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; N # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; N # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; N # So LIMBU SIGN LOO +1944..1945 ; N # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; N # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; N # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; N # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; N # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; N # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; N # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; N # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF ; N # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF ; N # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16 ; N # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; N # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; N # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; N # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; N # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54 ; N # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; N # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; N # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; N # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; N # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; N # Mn TAI THAM SIGN SAKOT +1A61 ; N # Mc TAI THAM VOWEL SIGN A +1A62 ; N # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; N # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; N # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; N # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; N # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; N # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; N # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; N # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; N # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; N # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD ; N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; N # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; N # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; N # Mc BALINESE SIGN BISAH +1B05..1B33 ; N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; N # Mn BALINESE SIGN REREKAN +1B35 ; N # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; N # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; N # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; N # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; N # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4C ; N # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; N # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; N # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG +1B80..1B81 ; N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; N # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; N # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; N # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; N # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; N # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; N # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; N # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; N # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; N # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF ; N # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BE5 ; N # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6 ; N # Mn BATAK SIGN TOMPI +1BE7 ; N # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; N # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; N # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; N # Mn BATAK VOWEL SIGN KARO O +1BEE ; N # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; N # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; N # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; N # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23 ; N # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; N # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; N # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; N # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; N # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; N # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; N # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; N # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; N # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; N # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; N # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; N # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; N # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CC0..1CC7 ; N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD0..1CD2 ; N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; N # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; N # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; N # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; N # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; N # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; N # Mn VEDIC SIGN TIRYAK +1CEE..1CF3 ; N # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; N # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; N # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1CFA ; N # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +1D00..1D2B ; N # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; N # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; N # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D7F ; N # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE +1D80..1D9A ; N # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DFF ; N # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1EFF ; N # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP +1F00..1F15 ; N # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; N # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; N # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; N # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; N # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; N # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; N # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; N # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; N # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; N # Sk GREEK KORONIS +1FBE ; N # Ll GREEK PROSGEGRAMMENI +1FBF..1FC1 ; N # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; N # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; N # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; N # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; N # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; N # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; N # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; N # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; N # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; N # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; N # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; N # Sk [2] GREEK OXIA..GREEK DASIA +2000..200A ; N # Zs [11] EN QUAD..HAIR SPACE +200B..200F ; N # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2010 ; A # Pd HYPHEN +2011..2012 ; N # Pd [2] NON-BREAKING HYPHEN..FIGURE DASH +2013..2015 ; A # Pd [3] EN DASH..HORIZONTAL BAR +2016 ; A # Po DOUBLE VERTICAL LINE +2017 ; N # Po DOUBLE LOW LINE +2018 ; A # Pi LEFT SINGLE QUOTATION MARK +2019 ; A # Pf RIGHT SINGLE QUOTATION MARK +201A ; N # Ps SINGLE LOW-9 QUOTATION MARK +201B ; N # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK +201C ; A # Pi LEFT DOUBLE QUOTATION MARK +201D ; A # Pf RIGHT DOUBLE QUOTATION MARK +201E ; N # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; N # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2022 ; A # Po [3] DAGGER..BULLET +2023 ; N # Po TRIANGULAR BULLET +2024..2027 ; A # Po [4] ONE DOT LEADER..HYPHENATION POINT +2028 ; N # Zl LINE SEPARATOR +2029 ; N # Zp PARAGRAPH SEPARATOR +202A..202E ; N # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; N # Zs NARROW NO-BREAK SPACE +2030 ; A # Po PER MILLE SIGN +2031 ; N # Po PER TEN THOUSAND SIGN +2032..2033 ; A # Po [2] PRIME..DOUBLE PRIME +2034 ; N # Po TRIPLE PRIME +2035 ; A # Po REVERSED PRIME +2036..2038 ; N # Po [3] REVERSED DOUBLE PRIME..CARET +2039 ; N # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; N # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; A # Po REFERENCE MARK +203C..203D ; N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203E ; A # Po OVERLINE +203F..2040 ; N # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; N # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; N # Sm FRACTION SLASH +2045 ; N # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; N # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; N # Sm COMMERCIAL MINUS SIGN +2053 ; N # Po SWUNG DASH +2054 ; N # Pc INVERTED UNDERTIE +2055..205E ; N # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; N # Zs MEDIUM MATHEMATICAL SPACE +2060..2064 ; N # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; N # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; N # No SUPERSCRIPT ZERO +2071 ; N # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074 ; A # No SUPERSCRIPT FOUR +2075..2079 ; N # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C ; N # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; N # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; N # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F ; A # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080 ; N # No SUBSCRIPT ZERO +2081..2084 ; A # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +2085..2089 ; N # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C ; N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; N # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; N # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C ; N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A8 ; N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN +20A9 ; H # Sc WON SIGN +20AA..20AB ; N # Sc [2] NEW SHEQEL SIGN..DONG SIGN +20AC ; A # Sc EURO SIGN +20AD..20C0 ; N # Sc [20] KIP SIGN..SOM SIGN +20D0..20DC ; N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; N # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; N # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; N # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101 ; N # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; N # Lu DOUBLE-STRUCK CAPITAL C +2103 ; A # So DEGREE CELSIUS +2104 ; N # So CENTRE LINE SYMBOL +2105 ; A # So CARE OF +2106 ; N # So CADA UNA +2107 ; N # Lu EULER CONSTANT +2108 ; N # So SCRUPLE +2109 ; A # So DEGREE FAHRENHEIT +210A..2112 ; N # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2113 ; A # Ll SCRIPT SMALL L +2114 ; N # So L B BAR SYMBOL +2115 ; N # Lu DOUBLE-STRUCK CAPITAL N +2116 ; A # So NUMERO SIGN +2117 ; N # So SOUND RECORDING COPYRIGHT +2118 ; N # Sm SCRIPT CAPITAL P +2119..211D ; N # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120 ; N # So [3] PRESCRIPTION TAKE..SERVICE MARK +2121..2122 ; A # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2123 ; N # So VERSICLE +2124 ; N # Lu DOUBLE-STRUCK CAPITAL Z +2125 ; N # So OUNCE SIGN +2126 ; A # Lu OHM SIGN +2127 ; N # So INVERTED OHM SIGN +2128 ; N # Lu BLACK-LETTER CAPITAL Z +2129 ; N # So TURNED GREEK SMALL LETTER IOTA +212A ; N # Lu KELVIN SIGN +212B ; A # Lu ANGSTROM SIGN +212C..212D ; N # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; N # So ESTIMATED SYMBOL +212F..2134 ; N # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; N # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; N # Ll INFORMATION SOURCE +213A..213B ; N # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; N # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; N # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; N # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; N # So PROPERTY LINE +214B ; N # Sm TURNED AMPERSAND +214C..214D ; N # So [2] PER SIGN..AKTIESELSKAB +214E ; N # Ll TURNED SMALL F +214F ; N # So SYMBOL FOR SAMARITAN SOURCE +2150..2152 ; N # No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH +2153..2154 ; A # No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS +2155..215A ; N # No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS +215B..215E ; A # No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS +215F ; N # No FRACTION NUMERATOR ONE +2160..216B ; A # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +216C..216F ; N # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +2170..2179 ; A # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +217A..2182 ; N # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; N # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; N # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189 ; A # No VULGAR FRACTION ZERO THIRDS +218A..218B ; N # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; A # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; A # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; N # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; N # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; N # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; N # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; N # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; N # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; N # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; N # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; N # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21B7 ; N # So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21B8..21B9 ; A # So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21BA..21CD ; N # So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; N # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; N # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; A # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; N # So DOWNWARDS DOUBLE ARROW +21D4 ; A # Sm LEFT RIGHT DOUBLE ARROW +21D5..21E6 ; N # So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW +21E7 ; A # So UPWARDS WHITE ARROW +21E8..21F3 ; N # So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW +21F4..21FF ; N # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200 ; A # Sm FOR ALL +2201 ; N # Sm COMPLEMENT +2202..2203 ; A # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2204..2206 ; N # Sm [3] THERE DOES NOT EXIST..INCREMENT +2207..2208 ; A # Sm [2] NABLA..ELEMENT OF +2209..220A ; N # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220B ; A # Sm CONTAINS AS MEMBER +220C..220E ; N # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +220F ; A # Sm N-ARY PRODUCT +2210 ; N # Sm N-ARY COPRODUCT +2211 ; A # Sm N-ARY SUMMATION +2212..2214 ; N # Sm [3] MINUS SIGN..DOT PLUS +2215 ; A # Sm DIVISION SLASH +2216..2219 ; N # Sm [4] SET MINUS..BULLET OPERATOR +221A ; A # Sm SQUARE ROOT +221B..221C ; N # Sm [2] CUBE ROOT..FOURTH ROOT +221D..2220 ; A # Sm [4] PROPORTIONAL TO..ANGLE +2221..2222 ; N # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2223 ; A # Sm DIVIDES +2224 ; N # Sm DOES NOT DIVIDE +2225 ; A # Sm PARALLEL TO +2226 ; N # Sm NOT PARALLEL TO +2227..222C ; A # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222D ; N # Sm TRIPLE INTEGRAL +222E ; A # Sm CONTOUR INTEGRAL +222F..2233 ; N # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2234..2237 ; A # Sm [4] THEREFORE..PROPORTION +2238..223B ; N # Sm [4] DOT MINUS..HOMOTHETIC +223C..223D ; A # Sm [2] TILDE OPERATOR..REVERSED TILDE +223E..2247 ; N # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; A # Sm ALMOST EQUAL TO +2249..224B ; N # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224C ; A # Sm ALL EQUAL TO +224D..2251 ; N # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2252 ; A # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253..225F ; N # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2260..2261 ; A # Sm [2] NOT EQUAL TO..IDENTICAL TO +2262..2263 ; N # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2264..2267 ; A # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +2268..2269 ; N # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226A..226B ; A # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226C..226D ; N # Sm [2] BETWEEN..NOT EQUIVALENT TO +226E..226F ; A # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2270..2281 ; N # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2282..2283 ; A # Sm [2] SUBSET OF..SUPERSET OF +2284..2285 ; N # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2286..2287 ; A # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2288..2294 ; N # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2295 ; A # Sm CIRCLED PLUS +2296..2298 ; N # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +2299 ; A # Sm CIRCLED DOT OPERATOR +229A..22A4 ; N # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A5 ; A # Sm UP TACK +22A6..22BE ; N # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22BF ; A # Sm RIGHT TRIANGLE +22C0..22FF ; N # Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP +2300..2307 ; N # So [8] DIAMETER SIGN..WAVY LINE +2308 ; N # Ps LEFT CEILING +2309 ; N # Pe RIGHT CEILING +230A ; N # Ps LEFT FLOOR +230B ; N # Pe RIGHT FLOOR +230C..2311 ; N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2312 ; A # So ARC +2313..2319 ; N # So [7] SEGMENT..TURNED NOT SIGN +231A..231B ; W # So [2] WATCH..HOURGLASS +231C..231F ; N # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER +2320..2321 ; N # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; N # So [7] FROWN..KEYBOARD +2329 ; W # Ps LEFT-POINTING ANGLE BRACKET +232A ; W # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; N # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; N # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; N # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; N # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; N # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; N # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..23E8 ; N # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL +23E9..23EC ; W # So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE +23ED..23EF ; N # So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0 ; W # So ALARM CLOCK +23F1..23F2 ; N # So [2] STOPWATCH..TIMER CLOCK +23F3 ; W # So HOURGLASS WITH FLOWING SAND +23F4..23FF ; N # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL +2400..2426 ; N # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; A # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA ; N # No CIRCLED DIGIT ZERO +24EB..24FF ; A # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO +2500..254B ; A # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C..254F ; N # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550..2573 ; A # So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS +2574..257F ; N # So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580..258F ; A # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2590..2591 ; N # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2592..2595 ; A # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +2596..259F ; N # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25A1 ; A # So [2] BLACK SQUARE..WHITE SQUARE +25A2 ; N # So WHITE SQUARE WITH ROUNDED CORNERS +25A3..25A9 ; A # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA..25B1 ; N # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B2..25B3 ; A # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B4..25B5 ; N # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B6 ; A # So BLACK RIGHT-POINTING TRIANGLE +25B7 ; A # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25BB ; N # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BC..25BD ; A # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25BE..25BF ; N # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; A # So BLACK LEFT-POINTING TRIANGLE +25C1 ; A # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25C5 ; N # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C6..25C8 ; A # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9..25CA ; N # So [2] FISHEYE..LOZENGE +25CB ; A # So WHITE CIRCLE +25CC..25CD ; N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25CE..25D1 ; A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25D2..25E1 ; N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E2..25E5 ; A # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +25E6..25EE ; N # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; A # So LARGE CIRCLE +25F0..25F7 ; N # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FC ; N # Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE +25FD..25FE ; W # Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE +25FF ; N # Sm LOWER RIGHT TRIANGLE +2600..2604 ; N # So [5] BLACK SUN WITH RAYS..COMET +2605..2606 ; A # So [2] BLACK STAR..WHITE STAR +2607..2608 ; N # So [2] LIGHTNING..THUNDERSTORM +2609 ; A # So SUN +260A..260D ; N # So [4] ASCENDING NODE..OPPOSITION +260E..260F ; A # So [2] BLACK TELEPHONE..WHITE TELEPHONE +2610..2613 ; N # So [4] BALLOT BOX..SALTIRE +2614..2615 ; W # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2616..261B ; N # So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX +261C ; A # So WHITE LEFT POINTING INDEX +261D ; N # So WHITE UP POINTING INDEX +261E ; A # So WHITE RIGHT POINTING INDEX +261F..263F ; N # So [33] WHITE DOWN POINTING INDEX..MERCURY +2640 ; A # So FEMALE SIGN +2641 ; N # So EARTH +2642 ; A # So MALE SIGN +2643..2647 ; N # So [5] JUPITER..PLUTO +2648..2653 ; W # So [12] ARIES..PISCES +2654..265F ; N # So [12] WHITE CHESS KING..BLACK CHESS PAWN +2660..2661 ; A # So [2] BLACK SPADE SUIT..WHITE HEART SUIT +2662 ; N # So WHITE DIAMOND SUIT +2663..2665 ; A # So [3] BLACK CLUB SUIT..BLACK HEART SUIT +2666 ; N # So BLACK DIAMOND SUIT +2667..266A ; A # So [4] WHITE CLUB SUIT..EIGHTH NOTE +266B ; N # So BEAMED EIGHTH NOTES +266C..266D ; A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266E ; N # So MUSIC NATURAL SIGN +266F ; A # Sm MUSIC SHARP SIGN +2670..267E ; N # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +267F ; W # So WHEELCHAIR SYMBOL +2680..2692 ; N # So [19] DIE FACE-1..HAMMER AND PICK +2693 ; W # So ANCHOR +2694..269D ; N # So [10] CROSSED SWORDS..OUTLINED WHITE STAR +269E..269F ; A # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26A0 ; N # So WARNING SIGN +26A1 ; W # So HIGH VOLTAGE SIGN +26A2..26A9 ; N # So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AA..26AB ; W # So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE +26AC..26BC ; N # So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE +26BD..26BE ; W # So [2] SOCCER BALL..BASEBALL +26BF ; A # So SQUARED KEY +26C0..26C3 ; N # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING +26C4..26C5 ; W # So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD +26C6..26CD ; A # So [8] RAIN..DISABLED CAR +26CE ; W # So OPHIUCHUS +26CF..26D3 ; A # So [5] PICK..CHAINS +26D4 ; W # So NO ENTRY +26D5..26E1 ; A # So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 +26E2 ; N # So ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; A # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4..26E7 ; N # So [4] PENTAGRAM..INVERTED PENTAGRAM +26E8..26E9 ; A # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EA ; W # So CHURCH +26EB..26F1 ; A # So [7] CASTLE..UMBRELLA ON GROUND +26F2..26F3 ; W # So [2] FOUNTAIN..FLAG IN HOLE +26F4 ; A # So FERRY +26F5 ; W # So SAILBOAT +26F6..26F9 ; A # So [4] SQUARE FOUR CORNERS..PERSON WITH BALL +26FA ; W # So TENT +26FB..26FC ; A # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD ; W # So FUEL PUMP +26FE..26FF ; A # So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700..2704 ; N # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS +2705 ; W # So WHITE HEAVY CHECK MARK +2706..2709 ; N # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270A..270B ; W # So [2] RAISED FIST..RAISED HAND +270C..2727 ; N # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2728 ; W # So SPARKLES +2729..273C ; N # So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK +273D ; A # So HEAVY TEARDROP-SPOKED ASTERISK +273E..274B ; N # So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274C ; W # So CROSS MARK +274D ; N # So SHADOWED WHITE CIRCLE +274E ; W # So NEGATIVE SQUARED CROSS MARK +274F..2752 ; N # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2753..2755 ; W # So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT +2756 ; N # So BLACK DIAMOND MINUS WHITE X +2757 ; W # So HEAVY EXCLAMATION MARK SYMBOL +2758..2767 ; N # So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET +2768 ; N # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; N # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; N # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; N # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; N # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; N # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; N # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; N # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; N # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; N # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; N # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; N # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; N # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; N # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..277F ; A # No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN +2780..2793 ; N # No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; N # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2795..2797 ; W # So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN +2798..27AF ; N # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B0 ; W # So CURLY LOOP +27B1..27BE ; N # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27BF ; W # So DOUBLE CURLY LOOP +27C0..27C4 ; N # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; N # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; N # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; N # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Na # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Na # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Na # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Na # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Na # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Na # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Na # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Na # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; N # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; N # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; N # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; N # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..297F ; N # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL +2980..2982 ; N # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON +2983 ; N # Ps LEFT WHITE CURLY BRACKET +2984 ; N # Pe RIGHT WHITE CURLY BRACKET +2985 ; Na # Ps LEFT WHITE PARENTHESIS +2986 ; Na # Pe RIGHT WHITE PARENTHESIS +2987 ; N # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; N # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; N # Ps Z NOTATION LEFT BINDING BRACKET +298A ; N # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; N # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; N # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; N # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; N # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; N # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; N # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; N # Ps LEFT ARC LESS-THAN BRACKET +2994 ; N # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; N # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; N # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; N # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; N # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; N # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; N # Ps LEFT WIGGLY FENCE +29D9 ; N # Pe RIGHT WIGGLY FENCE +29DA ; N # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; N # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; N # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; N # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; N # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..29FF ; N # Sm [2] TINY..MINY +2A00..2AFF ; N # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR +2B00..2B1A ; N # So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE +2B1B..2B1C ; W # So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE +2B1D..2B2F ; N # So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE +2B30..2B44 ; N # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; N # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; N # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B4F ; N # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW +2B50 ; W # So WHITE MEDIUM STAR +2B51..2B54 ; N # So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON +2B55 ; W # So HEAVY LARGE CIRCLE +2B56..2B59 ; A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE +2B5A..2B73 ; N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2C00..2C5F ; N # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +2C60..2C7B ; N # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F ; N # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80..2CE4 ; N # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; N # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; N # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; N # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; N # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; N # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; N # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; N # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; N # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; N # Ll GEORGIAN SMALL LETTER YN +2D2D ; N # Ll GEORGIAN SMALL LETTER AEN +2D30..2D67 ; N # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; N # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; N # Po TIFINAGH SEPARATOR MARK +2D7F ; N # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; N # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; N # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; N # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; N # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; N # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; N # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; N # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; N # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; N # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; N # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01 ; N # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; N # Pi LEFT SUBSTITUTION BRACKET +2E03 ; N # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; N # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; N # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; N # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; N # Pi LEFT TRANSPOSITION BRACKET +2E0A ; N # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; N # Po RAISED SQUARE +2E0C ; N # Pi LEFT RAISED OMISSION BRACKET +2E0D ; N # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; N # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; N # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; N # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; N # Pd HYPHEN WITH DIAERESIS +2E1B ; N # Po TILDE WITH RING ABOVE +2E1C ; N # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; N # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; N # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; N # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; N # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; N # Ps TOP LEFT HALF BRACKET +2E23 ; N # Pe TOP RIGHT HALF BRACKET +2E24 ; N # Ps BOTTOM LEFT HALF BRACKET +2E25 ; N # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; N # Ps LEFT SIDEWAYS U BRACKET +2E27 ; N # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; N # Ps LEFT DOUBLE PARENTHESIS +2E29 ; N # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; N # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; N # Lm VERTICAL TILDE +2E30..2E39 ; N # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; N # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; N # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; N # Pd DOUBLE HYPHEN +2E41 ; N # Po REVERSED COMMA +2E42 ; N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; N # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; N # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; N # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; N # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; N # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; N # Ps TOP HALF LEFT PARENTHESIS +2E5A ; N # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; N # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; N # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; N # Pd OBLIQUE HYPHEN +2E80..2E99 ; W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFF ; W # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3000 ; F # Zs IDEOGRAPHIC SPACE +3001..3003 ; W # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; W # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 ; W # Lm IDEOGRAPHIC ITERATION MARK +3006 ; W # Lo IDEOGRAPHIC CLOSING MARK +3007 ; W # Nl IDEOGRAPHIC NUMBER ZERO +3008 ; W # Ps LEFT ANGLE BRACKET +3009 ; W # Pe RIGHT ANGLE BRACKET +300A ; W # Ps LEFT DOUBLE ANGLE BRACKET +300B ; W # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; W # Ps LEFT CORNER BRACKET +300D ; W # Pe RIGHT CORNER BRACKET +300E ; W # Ps LEFT WHITE CORNER BRACKET +300F ; W # Pe RIGHT WHITE CORNER BRACKET +3010 ; W # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; W # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; W # So [2] POSTAL MARK..GETA MARK +3014 ; W # Ps LEFT TORTOISE SHELL BRACKET +3015 ; W # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; W # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; W # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; W # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; W # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; W # Ps LEFT WHITE SQUARE BRACKET +301B ; W # Pe RIGHT WHITE SQUARE BRACKET +301C ; W # Pd WAVE DASH +301D ; W # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; W # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; W # So POSTAL MARK FACE +3021..3029 ; W # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; W # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; W # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030 ; W # Pd WAVY DASH +3031..3035 ; W # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; W # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A ; W # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; W # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; W # Lo MASU MARK +303D ; W # Po PART ALTERNATION MARK +303E ; W # So IDEOGRAPHIC VARIATION INDICATOR +303F ; N # So IDEOGRAPHIC HALF FILL SPACE +3041..3096 ; W # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A ; W # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; W # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; W # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; W # Lo HIRAGANA DIGRAPH YORI +30A0 ; W # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FA ; W # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; W # Po KATAKANA MIDDLE DOT +30FC..30FE ; W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; W # Lo KATAKANA DIGRAPH KOTO +3105..312F ; W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BF ; W # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH +31C0..31E3 ; W # So [36] CJK STROKE T..CJK STROKE Q +31EF ; W # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +31F0..31FF ; W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E ; W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; W # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; W # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; A # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; W # So PARTNERSHIP SIGN +3251..325F ; W # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F ; W # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289 ; W # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; W # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FF ; W # So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA +3300..33FF ; W # So [256] SQUARE APAATO..SQUARE GAL +3400..4DBF ; W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4DC0..4DFF ; N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FFF ; W # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +A000..A014 ; W # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; W # Lm YI SYLLABLE WU +A016..A48C ; W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; W # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7 ; N # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; N # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; N # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B ; N # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; N # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; N # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; N # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; N # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; N # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; N # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; N # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; N # Mn COMBINING CYRILLIC VZMET +A670..A672 ; N # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; N # Po SLAVONIC ASTERISK +A674..A67D ; N # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; N # Po CYRILLIC KAVYKA +A67F ; N # Lm CYRILLIC PAYEROK +A680..A69B ; N # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; N # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; N # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; N # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; N # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; N # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; N # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +A700..A716 ; N # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; N # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; N # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F ; N # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; N # Lm MODIFIER LETTER US +A771..A787 ; N # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B..A78E ; N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; N # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; N # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; N # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; N # Ll LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; N # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; N # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; N # Ll LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; N # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A801 ; N # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; N # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; N # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; N # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; N # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; N # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; N # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; N # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; N # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A830..A835 ; N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; N # Sc NORTH INDIC RUPEE MARK +A839 ; N # So NORTH INDIC QUANTITY MARK +A840..A873 ; N # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +A880..A881 ; N # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; N # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; N # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; N # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; N # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; N # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; N # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; N # Lo DEVANAGARI HEADSTROKE +A8FC ; N # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; N # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F ; N # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946 ; N # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; N # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; N # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; N # Po REJANG SECTION MARK +A960..A97C ; W # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; N # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; N # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; N # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; N # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; N # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; N # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; N # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; N # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9C0 ; N # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +A9C1..A9CD ; N # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CF ; N # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; N # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; N # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4 ; N # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; N # Mn MYANMAR SIGN SHAN SAW +A9E6 ; N # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; N # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; N # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; N # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; N # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; N # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; N # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; N # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; N # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; N # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; N # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; N # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; N # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; N # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; N # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; N # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; N # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F ; N # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; N # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; N # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; N # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; N # Lo MYANMAR LETTER AITON RA +AA7B ; N # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; N # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; N # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F ; N # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAAF ; N # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0 ; N # Mn TAI VIET MAI KANG +AAB1 ; N # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; N # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; N # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; N # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; N # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; N # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; N # Lo TAI VIET TONE MAI NUENG +AAC1 ; N # Mn TAI VIET TONE MAI THO +AAC2 ; N # Lo TAI VIET TONE MAI SONG +AADB..AADC ; N # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; N # Lm TAI VIET SYMBOL SAM +AADE..AADF ; N # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA ; N # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; N # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; N # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; N # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; N # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; N # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; N # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; N # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; N # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; N # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; N # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; N # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; N # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; N # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; N # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB68 ; N # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; N # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB70..ABBF ; N # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; N # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; N # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; N # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; N # Po MEETEI MAYEK CHEIKHEI +ABEC ; N # Mc MEETEI MAYEK LUM IYEK +ABED ; N # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; N # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00..D7A3 ; W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; N # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; N # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D800..DB7F ; N # Cs [896] .. +DB80..DBFF ; N # Cs [128] .. +DC00..DFFF ; N # Cs [1024] .. +E000..F8FF ; A # Co [6400] .. +F900..FA6D ; W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F ; W # Cn [2] .. +FA70..FAD9 ; W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF ; W # Cn [38] .. +FB00..FB06 ; N # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; N # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; N # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; N # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; N # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; N # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; N # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; N # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; N # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; N # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +FB50..FBB1 ; N # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; N # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ; N # Pe ORNATE LEFT PARENTHESIS +FD3F ; N # Ps ORNATE RIGHT PARENTHESIS +FD40..FD4F ; N # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; N # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; N # Sc RIAL SIGN +FDFD..FDFF ; N # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE00..FE0F ; A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10..FE16 ; W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; W # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20..FE2F ; N # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30 ; W # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; W # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; W # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; W # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; W # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; W # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; W # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; W # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; W # Pd SMALL EM DASH +FE59 ; W # Ps SMALL LEFT PARENTHESIS +FE5A ; W # Pe SMALL RIGHT PARENTHESIS +FE5B ; W # Ps SMALL LEFT CURLY BRACKET +FE5C ; W # Pe SMALL RIGHT CURLY BRACKET +FE5D ; W # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; W # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; W # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; W # Sm SMALL PLUS SIGN +FE63 ; W # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; W # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; W # Po SMALL REVERSE SOLIDUS +FE69 ; W # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; W # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FE70..FE74 ; N # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; N # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF ; N # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; F # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; F # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; F # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; F # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; F # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; F # Po FULLWIDTH ASTERISK +FF0B ; F # Sm FULLWIDTH PLUS SIGN +FF0C ; F # Po FULLWIDTH COMMA +FF0D ; F # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; F # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; F # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; F # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; F # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; F # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A ; F # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; F # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; F # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; F # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; F # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; F # Pc FULLWIDTH LOW LINE +FF40 ; F # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; F # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; F # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; F # Sm FULLWIDTH VERTICAL LINE +FF5D ; F # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; F # Sm FULLWIDTH TILDE +FF5F ; F # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; F # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; H # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; H # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; H # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; H # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F ; H # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; H # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; H # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; H # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; H # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; H # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; H # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; H # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; H # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE0..FFE1 ; F # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; F # Sm FULLWIDTH NOT SIGN +FFE3 ; F # Sk FULLWIDTH MACRON +FFE4 ; F # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; F # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; H # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; H # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; H # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; N # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC ; N # So OBJECT REPLACEMENT CHARACTER +FFFD ; A # So REPLACEMENT CHARACTER +10000..1000B ; N # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; N # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; N # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; N # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; N # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; N # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; N # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102 ; N # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; N # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; N # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174 ; N # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; N # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +10190..1019C ; N # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101A0 ; N # So GREEK SYMBOL TAU RHO +101D0..101FC ; N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +101FD ; N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; N # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; N # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; N # Mn COPTIC EPACT THOUSANDS MARK +102E1..102FB ; N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +10300..1031F ; N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; N # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE +10330..10340 ; N # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; N # Nl GOTHIC LETTER NINETY +10342..10349 ; N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; N # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; N # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; N # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; N # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; N # Po UGARITIC WORD DIVIDER +103A0..103C3 ; N # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; N # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; N # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; N # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; N # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1047F ; N # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW +10480..1049D ; N # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; N # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; N # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; N # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; N # Po CAUCASIAN ALBANIAN CITATION MARK +10570..1057A ; N # Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; N # Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; N # Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; N # Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; N # Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; N # Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; N # Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; N # Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE +10600..10736 ; N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10780..10785 ; N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10800..10805 ; N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; N # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; N # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; N # Lo CYPRIOT SYLLABLE ZA +1083F ; N # Lo CYPRIOT SYLLABLE ZO +10840..10855 ; N # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857 ; N # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; N # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; N # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; N # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; N # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E ; N # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; N # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2 ; N # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; N # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; N # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; N # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; N # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; N # Po PHOENICIAN WORD SEPARATOR +10920..10939 ; N # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; N # Po LYDIAN TRIANGULAR MARK +10980..1099F ; N # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0..109B7 ; N # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; N # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; N # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; N # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; N # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 ; N # Lo KHAROSHTHI LETTER A +10A01..10A03 ; N # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; N # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; N # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A60..10A7C ; N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; N # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; N # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; N # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7 ; N # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; N # So MANICHAEAN SIGN UD +10AC9..10AE4 ; N # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; N # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; N # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; N # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35 ; N # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; N # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; N # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; N # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; N # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; N # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; N # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; N # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; N # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48 ; N # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; N # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; N # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23 ; N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E ; N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E80..10EA9 ; N # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; N # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; N # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F00..10F1C ; N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F70..10F81 ; N # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; N # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; N # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +10FB0..10FC4 ; N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +10FE0..10FF6 ; N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +11000 ; N # Mc BRAHMI SIGN CANDRABINDU +11001 ; N # Mn BRAHMI SIGN ANUSVARA +11002 ; N # Mc BRAHMI SIGN VISARGA +11003..11037 ; N # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; N # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D ; N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; N # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; N # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; N # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; N # Lo BRAHMI LETTER OLD TAMIL LLA +1107F ; N # Mn BRAHMI NUMBER JOINER +11080..11081 ; N # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; N # Mc KAITHI SIGN VISARGA +11083..110AF ; N # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; N # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; N # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; N # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; N # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; N # Cf KAITHI NUMBER SIGN +110BE..110C1 ; N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; N # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; N # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8 ; N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; N # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; N # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; N # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; N # Lo CHAKMA LETTER LHAA +11145..11146 ; N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; N # Lo CHAKMA LETTER VAA +11150..11172 ; N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; N # Mn MAHAJANI SIGN NUKTA +11174..11175 ; N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; N # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; N # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; N # Mc SHARADA SIGN VISARGA +11183..111B2 ; N # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; N # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; N # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC ; N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; N # Po SHARADA SUTRA MARK +111CE ; N # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; N # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; N # Lo SHARADA EKAM +111DB ; N # Po SHARADA SIGN SIDDHAM +111DC ; N # Lo SHARADA HEADSTROKE +111DD..111DF ; N # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4 ; N # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211 ; N # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; N # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; N # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; N # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; N # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; N # Mn KHOJKI SIGN ANUSVARA +11235 ; N # Mc KHOJKI SIGN VIRAMA +11236..11237 ; N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..1123D ; N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; N # Mn KHOJKI SIGN SUKUN +1123F..11240 ; N # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; N # Mn KHOJKI VOWEL SIGN VOCALIC R +11280..11286 ; N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; N # Lo MULTANI LETTER GHA +1128A..1128D ; N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; N # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; N # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; N # Po MULTANI SECTION MARK +112B0..112DE ; N # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; N # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; N # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; N # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; N # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; N # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; N # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; N # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; N # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; N # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; N # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; N # Mn GRANTHA VOWEL SIGN II +11341..11344 ; N # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; N # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; N # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; N # Lo GRANTHA OM +11357 ; N # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; N # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; N # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; N # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; N # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; N # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; N # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; N # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; N # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; N # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; N # Mc NEWA SIGN VISARGA +11446 ; N # Mn NEWA SIGN NUKTA +11447..1144A ; N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; N # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; N # Po NEWA INSERTION SIGN +1145E ; N # Mn NEWA SANDHI MARK +1145F..11461 ; N # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA +11480..114AF ; N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; N # Mc TIRHUTA VOWEL SIGN E +114BA ; N # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; N # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; N # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; N # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; N # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; N # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; N # Po TIRHUTA ABBREVIATION SIGN +114C7 ; N # Lo TIRHUTA OM +114D0..114D9 ; N # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; N # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; N # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; N # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; N # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; N # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; N # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; N # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7 ; N # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; N # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; N # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; N # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; N # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; N # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; N # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; N # Mn MODI SIGN ANUSVARA +1163E ; N # Mc MODI SIGN VISARGA +1163F..11640 ; N # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11643 ; N # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; N # Lo MODI SIGN HUVA +11650..11659 ; N # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C ; N # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680..116AA ; N # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; N # Mn TAKRI SIGN ANUSVARA +116AC ; N # Mc TAKRI SIGN VISARGA +116AD ; N # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; N # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; N # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; N # Mc TAKRI SIGN VIRAMA +116B7 ; N # Mn TAKRI SIGN NUKTA +116B8 ; N # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; N # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; N # Mc AHOM VOWEL SIGN E +11727..1172B ; N # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; N # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; N # So AHOM SYMBOL VI +11740..11746 ; N # Lo [7] AHOM LETTER CA..AHOM LETTER LLA +11800..1182B ; N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; N # Mc DOGRA SIGN VISARGA +11839..1183A ; N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; N # Po DOGRA ABBREVIATION SIGN +118A0..118DF ; N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; N # Lo WARANG CITI OM +11900..11906 ; N # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E +11909 ; N # Lo DIVES AKURU LETTER O +1190C..11913 ; N # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; N # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; N # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; N # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; N # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; N # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; N # Mc DIVES AKURU SIGN HALANTA +1193E ; N # Mn DIVES AKURU VIRAMA +1193F ; N # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; N # Mc DIVES AKURU MEDIAL YA +11941 ; N # Lo DIVES AKURU INITIAL RA +11942 ; N # Mc DIVES AKURU MEDIAL RA +11943 ; N # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; N # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; N # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +119A0..119A7 ; N # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; N # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; N # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; N # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; N # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; N # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; N # Mn NANDINAGARI SIGN VIRAMA +119E1 ; N # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; N # Po NANDINAGARI SIGN SIDDHAM +119E3 ; N # Lo NANDINAGARI HEADSTROKE +119E4 ; N # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A00 ; N # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; N # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; N # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; N # Lo SOYOMBO LETTER A +11A51..11A56 ; N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; N # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; N # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; N # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AB0..11ABF ; N # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA +11AC0..11AF8 ; N # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09 ; N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11C00..11C08 ; N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; N # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; N # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; N # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; N # Mc BHAIKSUKI SIGN VISARGA +11C3F ; N # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; N # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; N # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; N # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; N # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71 ; N # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; N # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; N # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; N # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; N # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; N # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; N # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; N # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; N # Lo MASARAM GONDI REPHA +11D47 ; N # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; N # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; N # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; N # Mn GUNJALA GONDI VIRAMA +11D98 ; N # Lo GUNJALA GONDI OM +11DA0..11DA9 ; N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01 ; N # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; N # Lo KAWI SIGN REPHA +11F03 ; N # Mc KAWI SIGN VISARGA +11F04..11F10 ; N # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; N # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; N # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; N # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; N # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; N # Mn KAWI VOWEL SIGN EU +11F41 ; N # Mc KAWI SIGN KILLER +11F42 ; N # Mn KAWI CONJOINER +11F43..11F4F ; N # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; N # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE +11FB0 ; N # Lo LISU LETTER YHA +11FC0..11FD4 ; N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; N # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; N # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; N # Po TAMIL PUNCTUATION END OF TEXT +12000..12399 ; N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12F90..12FF0 ; N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 +13000..1342F ; N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F ; N # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; N # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; N # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; N # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +14400..14646 ; N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; N # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; N # Po [2] MRO DANDA..MRO DOUBLE DANDA +16A70..16ABE ; N # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; N # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE +16AD0..16AED ; N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; N # Po BASSA VAH FULL STOP +16B00..16B2F ; N # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; N # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B ; N # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; N # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; N # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; N # Po PAHAWH HMONG SIGN XAUS +16B45 ; N # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; N # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F4A ; N # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; N # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; N # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; N # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE2 ; W # Po OLD CHINESE HOOK MARK +16FE3 ; W # Lm OLD CHINESE ITERATION MARK +16FE4 ; W # Mn KHITAN SMALL SCRIPT FILLER +16FF0..16FF1 ; W # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +17000..187F7 ; W # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18AFF ; W # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 +18B00..18CD5 ; W # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18D00..18D08 ; W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +1AFF0..1AFF3 ; W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000..1B0FF ; W # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 +1B100..1B122 ; W # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B132 ; W # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; W # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B170..1B2FB ; W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; N # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; N # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3 ; N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF00..1CF2D ; N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1CF50..1CFC3 ; N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C ; N # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; N # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; N # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; N # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184 ; N # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B ; N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9 ; N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD ; N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1EA ; N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D200..1D241 ; N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; N # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3 ; N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; N # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; N # Lu MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; N # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; N # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; N # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; N # Ll MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; N # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; N # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; N # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; N # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; N # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; N # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; N # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; N # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; N # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; N # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; N # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; N # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; N # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; N # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; N # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; N # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; N # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; N # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; N # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; N # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; N # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; N # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; N # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; N # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; N # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; N # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; N # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; N # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; N # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; N # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; N # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; N # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; N # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; N # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; N # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; N # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; N # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DF00..1DF09 ; N # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; N # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; N # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E000..1E006 ; N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; N # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E100..1E12C ; N # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; N # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; N # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; N # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; N # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; N # So NYIAKENG PUACHUE HMONG CIRCLED CA +1E290..1E2AD ; N # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; N # Mn TOTO SIGN RISING TONE +1E2C0..1E2EB ; N # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; N # Sc WANCHO NGUN SIGN +1E4D0..1E4EA ; N # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; N # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; N # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; N # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE +1E7E0..1E7E6 ; N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; N # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE +1E800..1E8C4 ; N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; N # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; N # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1EC71..1ECAB ; N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; N # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; N # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; N # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; N # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; N # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1EE00..1EE03 ; N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; N # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; N # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; N # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; N # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; N # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; N # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; N # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; N # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; N # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; N # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; N # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; N # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; N # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; N # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; N # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; N # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; N # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; N # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; N # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; N # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; N # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; N # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; N # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; N # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; N # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; N # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000..1F003 ; N # So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F004 ; W # So MAHJONG TILE RED DRAGON +1F005..1F02B ; N # So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK +1F030..1F093 ; N # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; N # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; N # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CE ; N # So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS +1F0CF ; W # So PLAYING CARD BLACK JOKER +1F0D1..1F0F5 ; N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F100..1F10A ; A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA +1F10B..1F10C ; N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F ; N # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F110..1F12D ; A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F12E..1F12F ; N # So [2] CIRCLED WZ..COPYLEFT SYMBOL +1F130..1F169 ; A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F16A..1F16F ; N # So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE +1F170..1F18D ; A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA +1F18E ; W # So NEGATIVE SQUARED AB +1F18F..1F190 ; A # So [2] NEGATIVE SQUARED WC..SQUARE DJ +1F191..1F19A ; W # So [10] SQUARED CL..SQUARED VS +1F19B..1F1AC ; A # So [18] SQUARED THREE D..SQUARED VOD +1F1AD ; N # So MASK WORK SYMBOL +1F1E6..1F1FF ; N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F200..1F202 ; W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA +1F210..1F23B ; W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F320 ; W # So [33] CYCLONE..SHOOTING STAR +1F321..1F32C ; N # So [12] THERMOMETER..WIND BLOWING FACE +1F32D..1F335 ; W # So [9] HOT DOG..CACTUS +1F336 ; N # So HOT PEPPER +1F337..1F37C ; W # So [70] TULIP..BABY BOTTLE +1F37D ; N # So FORK AND KNIFE WITH PLATE +1F37E..1F393 ; W # So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP +1F394..1F39F ; N # So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS +1F3A0..1F3CA ; W # So [43] CAROUSEL HORSE..SWIMMER +1F3CB..1F3CE ; N # So [4] WEIGHT LIFTER..RACING CAR +1F3CF..1F3D3 ; W # So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL +1F3D4..1F3DF ; N # So [12] SNOW CAPPED MOUNTAIN..STADIUM +1F3E0..1F3F0 ; W # So [17] HOUSE BUILDING..EUROPEAN CASTLE +1F3F1..1F3F3 ; N # So [3] WHITE PENNANT..WAVING WHITE FLAG +1F3F4 ; W # So WAVING BLACK FLAG +1F3F5..1F3F7 ; N # So [3] ROSETTE..LABEL +1F3F8..1F3FA ; W # So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA +1F3FB..1F3FF ; W # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F43E ; W # So [63] RAT..PAW PRINTS +1F43F ; N # So CHIPMUNK +1F440 ; W # So EYES +1F441 ; N # So EYE +1F442..1F4FC ; W # So [187] EAR..VIDEOCASSETTE +1F4FD..1F4FE ; N # So [2] FILM PROJECTOR..PORTABLE STEREO +1F4FF..1F53D ; W # So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE +1F53E..1F54A ; N # So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE +1F54B..1F54E ; W # So [4] KAABA..MENORAH WITH NINE BRANCHES +1F54F ; N # So BOWL OF HYGIEIA +1F550..1F567 ; W # So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY +1F568..1F579 ; N # So [18] RIGHT SPEAKER..JOYSTICK +1F57A ; W # So MAN DANCING +1F57B..1F594 ; N # So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND +1F595..1F596 ; W # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597..1F5A3 ; N # So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A4 ; W # So BLACK HEART +1F5A5..1F5FA ; N # So [86] DESKTOP COMPUTER..WORLD MAP +1F5FB..1F5FF ; W # So [5] MOUNT FUJI..MOYAI +1F600..1F64F ; W # So [80] GRINNING FACE..PERSON WITH FOLDED HANDS +1F650..1F67F ; N # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD +1F680..1F6C5 ; W # So [70] ROCKET..LEFT LUGGAGE +1F6C6..1F6CB ; N # So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP +1F6CC ; W # So SLEEPING ACCOMMODATION +1F6CD..1F6CF ; N # So [3] SHOPPING BAGS..BED +1F6D0..1F6D2 ; W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY +1F6D3..1F6D4 ; N # So [2] STUPA..PAGODA +1F6D5..1F6D7 ; W # So [3] HINDU TEMPLE..ELEVATOR +1F6DC..1F6DF ; W # So [4] WIRELESS..RING BUOY +1F6E0..1F6EA ; N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE +1F6EB..1F6EC ; W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING +1F6F0..1F6F3 ; N # So [4] SATELLITE..PASSENGER SHIP +1F6F4..1F6FC ; W # So [9] SCOOTER..ROLLER SKATE +1F700..1F776 ; N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F77F ; N # So [5] HAUMEA..ORCUS +1F780..1F7D9 ; N # So [90] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..NINE POINTED WHITE STAR +1F7E0..1F7EB ; W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0 ; W # So HEAVY EQUALS SIGN +1F800..1F80B ; N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8B0..1F8B1 ; N # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F900..1F90B ; N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C..1F93A ; W # So [47] PINCHED FINGERS..FENCER +1F93B ; N # So MODERN PENTATHLON +1F93C..1F945 ; W # So [10] WRESTLERS..GOAL NET +1F946 ; N # So RIFLE +1F947..1F9FF ; W # So [185] FIRST PLACE MEDAL..NAZAR AMULET +1FA00..1FA53 ; N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP +1FA60..1FA6D ; N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA70..1FA7C ; W # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; W # So [9] YO-YO..FLUTE +1FA90..1FABD ; W # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; W # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; W # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; W # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; W # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FB00..1FB92 ; N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +20000..2A6DF ; W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A6E0..2A6FF ; W # Cn [32] .. +2A700..2B739 ; W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B73A..2B73F ; W # Cn [6] .. +2B740..2B81D ; W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F ; W # Cn [2] .. +2B820..2CEA1 ; W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2CEAF ; W # Cn [14] .. +2CEB0..2EBE0 ; W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2EBEF ; W # Cn [15] .. +2EBF0..2EE5D ; W # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2EE5E..2F7FF ; W # Cn [2466] .. +2F800..2FA1D ; W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FA1F ; W # Cn [2] .. +2FA20..2FFFD ; W # Cn [1502] .. +30000..3134A ; W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +3134B..3134F ; W # Cn [5] .. +31350..323AF ; W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF +323B0..3FFFD ; W # Cn [56398] .. +E0001 ; N # Cf LANGUAGE TAG +E0020..E007F ; N # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD ; A # Co [65534] .. +100000..10FFFD ; A # Co [65534] .. + +# EOF diff --git a/unicode-data/LineBreak.txt b/unicode-data/LineBreak.txt new file mode 100644 index 0000000..b6bc679 --- /dev/null +++ b/unicode-data/LineBreak.txt @@ -0,0 +1,3608 @@ +# LineBreak-15.1.0.txt +# Date: 2023-07-28, 13:19:22 GMT [KW] +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Line_Break Property +# +# This file is a normative contributory data file in the +# Unicode Character Database. +# +# The format is two fields separated by a semicolon. +# Field 0: Unicode code point value or range of code point values +# Field 1: Line_Break property, consisting of one of the following values: +# Non-tailorable: +# "BK", "CM", "CR", "GL", "LF", "NL", "SP", "WJ", "ZW", "ZWJ" +# Tailorable: +# "AI", "AK", "AL", "AP", "AS", "B2", "BA", "BB", "CB", "CJ", +# "CL", "CP", "EB", "EM", "EX", "H2", "H3", "HL", "HY", "ID", +# "IN", "IS", "JL", "JT", "JV", "NS", "NU", "OP", "PO", "PR", +# "QU", "RI", "SA", "SG", "SY", "VF", "VI", "XX" +# - All code points, assigned and unassigned, that are not listed +# explicitly are given the value "XX". +# - The unassigned code points in the following blocks default to "ID": +# CJK Unified Ideographs Extension A: U+3400..U+4DBF +# CJK Unified Ideographs: U+4E00..U+9FFF +# CJK Compatibility Ideographs: U+F900..U+FAFF +# - All undesignated code points in Planes 2 and 3, whether inside or +# outside of allocated blocks, default to "ID": +# Plane 2: U+20000..U+2FFFD +# Plane 3: U+30000..U+3FFFD +# - All unassigned code points in the following Plane 1 ranges, whether +# inside or outside of allocated blocks, also default to "ID": +# Plane 1 range: U+1F000..U+1FAFF +# Plane 1 range: U+1FC00..U+1FFFD +# - The unassigned code points in the following block default to "PR": +# Currency Symbols: U+20A0..U+20CF +# +# Character ranges are specified as for other property files in the +# Unicode Character Database. +# +# The comments following the number sign "#" list the General_Category +# property value or the L& alias of the derived value LC, the Unicode +# character name or names, and, in lines with ranges of code points, +# the code point count in square brackets. +# +# For more information, see UAX #14: Unicode Line Breaking Algorithm, +# at https://www.unicode.org/reports/tr14/ +# +# @missing: 0000..10FFFF; XX +0000..0008 ; CM # Cc [9] .. +0009 ; BA # Cc +000A ; LF # Cc +000B..000C ; BK # Cc [2] .. +000D ; CR # Cc +000E..001F ; CM # Cc [18] .. +0020 ; SP # Zs SPACE +0021 ; EX # Po EXCLAMATION MARK +0022 ; QU # Po QUOTATION MARK +0023 ; AL # Po NUMBER SIGN +0024 ; PR # Sc DOLLAR SIGN +0025 ; PO # Po PERCENT SIGN +0026 ; AL # Po AMPERSAND +0027 ; QU # Po APOSTROPHE +0028 ; OP # Ps LEFT PARENTHESIS +0029 ; CP # Pe RIGHT PARENTHESIS +002A ; AL # Po ASTERISK +002B ; PR # Sm PLUS SIGN +002C ; IS # Po COMMA +002D ; HY # Pd HYPHEN-MINUS +002E ; IS # Po FULL STOP +002F ; SY # Po SOLIDUS +0030..0039 ; NU # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; IS # Po [2] COLON..SEMICOLON +003C..003E ; AL # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F ; EX # Po QUESTION MARK +0040 ; AL # Po COMMERCIAL AT +0041..005A ; AL # Lu [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B ; OP # Ps LEFT SQUARE BRACKET +005C ; PR # Po REVERSE SOLIDUS +005D ; CP # Pe RIGHT SQUARE BRACKET +005E ; AL # Sk CIRCUMFLEX ACCENT +005F ; AL # Pc LOW LINE +0060 ; AL # Sk GRAVE ACCENT +0061..007A ; AL # Ll [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B ; OP # Ps LEFT CURLY BRACKET +007C ; BA # Sm VERTICAL LINE +007D ; CL # Pe RIGHT CURLY BRACKET +007E ; AL # Sm TILDE +007F ; CM # Cc +0080..0084 ; CM # Cc [5] .. +0085 ; NL # Cc +0086..009F ; CM # Cc [26] .. +00A0 ; GL # Zs NO-BREAK SPACE +00A1 ; OP # Po INVERTED EXCLAMATION MARK +00A2 ; PO # Sc CENT SIGN +00A3..00A5 ; PR # Sc [3] POUND SIGN..YEN SIGN +00A6 ; AL # So BROKEN BAR +00A7 ; AI # Po SECTION SIGN +00A8 ; AI # Sk DIAERESIS +00A9 ; AL # So COPYRIGHT SIGN +00AA ; AI # Lo FEMININE ORDINAL INDICATOR +00AB ; QU # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; AL # Sm NOT SIGN +00AD ; BA # Cf SOFT HYPHEN +00AE ; AL # So REGISTERED SIGN +00AF ; AL # Sk MACRON +00B0 ; PO # So DEGREE SIGN +00B1 ; PR # Sm PLUS-MINUS SIGN +00B2..00B3 ; AI # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; BB # Sk ACUTE ACCENT +00B5 ; AL # Ll MICRO SIGN +00B6..00B7 ; AI # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; AI # Sk CEDILLA +00B9 ; AI # No SUPERSCRIPT ONE +00BA ; AI # Lo MASCULINE ORDINAL INDICATOR +00BB ; QU # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; AI # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; OP # Po INVERTED QUESTION MARK +00C0..00D6 ; AL # Lu [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D7 ; AI # Sm MULTIPLICATION SIGN +00D8..00F6 ; AL # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F7 ; AI # Sm DIVISION SIGN +00F8..00FF ; AL # Ll [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS +0100..017F ; AL # L& [128] LATIN CAPITAL LETTER A WITH MACRON..LATIN SMALL LETTER LONG S +0180..01BA ; AL # L& [59] LATIN SMALL LETTER B WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; AL # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; AL # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; AL # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..024F ; AL # L& [140] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER Y WITH STROKE +0250..0293 ; AL # Ll [68] LATIN SMALL LETTER TURNED A..LATIN SMALL LETTER EZH WITH CURL +0294 ; AL # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; AL # Ll [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; AL # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; AL # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6 ; AL # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C7 ; AI # Lm CARON +02C8 ; BB # Lm MODIFIER LETTER VERTICAL LINE +02C9..02CB ; AI # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CC ; BB # Lm MODIFIER LETTER LOW VERTICAL LINE +02CD ; AI # Lm MODIFIER LETTER LOW MACRON +02CE..02CF ; AL # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D0 ; AI # Lm MODIFIER LETTER TRIANGULAR COLON +02D1 ; AL # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; AL # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02D8..02DB ; AI # Sk [4] BREVE..OGONEK +02DC ; AL # Sk SMALL TILDE +02DD ; AI # Sk DOUBLE ACUTE ACCENT +02DE ; AL # Sk MODIFIER LETTER RHOTIC HOOK +02DF ; BB # Sk MODIFIER LETTER CROSS ACCENT +02E0..02E4 ; AL # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; AL # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; AL # Lm MODIFIER LETTER VOICING +02ED ; AL # Sk MODIFIER LETTER UNASPIRATED +02EE ; AL # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; AL # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0300..034E ; CM # Mn [79] COMBINING GRAVE ACCENT..COMBINING UPWARDS ARROW BELOW +034F ; GL # Mn COMBINING GRAPHEME JOINER +0350..035B ; CM # Mn [12] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING ZIGZAG ABOVE +035C..0362 ; GL # Mn [7] COMBINING DOUBLE BREVE BELOW..COMBINING DOUBLE RIGHTWARDS ARROW BELOW +0363..036F ; CM # Mn [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X +0370..0373 ; AL # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; AL # Lm GREEK NUMERAL SIGN +0375 ; AL # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; AL # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; AL # Lm GREEK YPOGEGRAMMENI +037B..037D ; AL # Ll [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; IS # Po GREEK QUESTION MARK +037F ; AL # Lu GREEK CAPITAL LETTER YOT +0384..0385 ; AL # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; AL # Lu GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; AL # Po GREEK ANO TELEIA +0388..038A ; AL # Lu [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; AL # Lu GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; AL # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03F5 ; AL # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL +03F6 ; AL # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; AL # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400..0481 ; AL # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; AL # So CYRILLIC THOUSANDS SIGN +0483..0487 ; CM # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; CM # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..04FF ; AL # L& [118] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER HA WITH STROKE +0500..052F ; AL # L& [48] CYRILLIC CAPITAL LETTER KOMI DE..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; AL # Lu [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; AL # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; AL # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; AL # Ll [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; IS # Po ARMENIAN FULL STOP +058A ; BA # Pd ARMENIAN HYPHEN +058D..058E ; AL # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; PR # Sc ARMENIAN DRAM SIGN +0591..05BD ; CM # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; BA # Pd HEBREW PUNCTUATION MAQAF +05BF ; CM # Mn HEBREW POINT RAFE +05C0 ; AL # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; CM # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; AL # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; CM # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; EX # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; CM # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; HL # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; HL # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; AL # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605 ; NU # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608 ; AL # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; PO # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; PO # Sc AFGHANI SIGN +060C..060D ; IS # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F ; AL # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; CM # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B ; EX # Po ARABIC SEMICOLON +061C ; CM # Cf ARABIC LETTER MARK +061D..061F ; EX # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +0620..063F ; AL # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; AL # Lm ARABIC TATWEEL +0641..064A ; AL # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; CM # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; NU # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A ; PO # Po ARABIC PERCENT SIGN +066B..066C ; NU # Po [2] ARABIC DECIMAL SEPARATOR..ARABIC THOUSANDS SEPARATOR +066D ; AL # Po ARABIC FIVE POINTED STAR +066E..066F ; AL # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; CM # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; AL # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; EX # Po ARABIC FULL STOP +06D5 ; AL # Lo ARABIC LETTER AE +06D6..06DC ; CM # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD ; NU # Cf ARABIC END OF AYAH +06DE ; AL # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; CM # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; AL # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; CM # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; AL # So ARABIC PLACE OF SAJDAH +06EA..06ED ; CM # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; AL # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; NU # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; AL # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; AL # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; AL # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; AL # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; AL # Cf SYRIAC ABBREVIATION MARK +0710 ; AL # Lo SYRIAC LETTER ALAPH +0711 ; CM # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; AL # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; CM # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; AL # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0750..077F ; AL # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0780..07A5 ; AL # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; CM # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; AL # Lo THAANA LETTER NAA +07C0..07C9 ; NU # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; AL # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; CM # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; AL # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; AL # So NKO SYMBOL OO DENNEN +07F7 ; AL # Po NKO SYMBOL GBAKURUNEN +07F8 ; IS # Po NKO COMMA +07F9 ; EX # Po NKO EXCLAMATION MARK +07FA ; AL # Lm NKO LAJANYALAN +07FD ; CM # Mn NKO DANTAYALAN +07FE..07FF ; PR # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815 ; AL # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; CM # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; AL # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; CM # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; AL # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; CM # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; AL # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; CM # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; AL # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +0840..0858 ; AL # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; CM # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; AL # Po MANDAIC PUNCTUATION +0860..086A ; AL # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +0870..0887 ; AL # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; AL # Sk ARABIC RAISED ROUND DOT +0889..088E ; AL # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; NU # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; CM # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; AL # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; AL # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; CM # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; NU # Cf ARABIC DISPUTED END OF AYAH +08E3..08FF ; CM # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +0900..0902 ; CM # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; CM # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; AL # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; CM # Mn DEVANAGARI VOWEL SIGN OE +093B ; CM # Mc DEVANAGARI VOWEL SIGN OOE +093C ; CM # Mn DEVANAGARI SIGN NUKTA +093D ; AL # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; CM # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; CM # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; CM # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; CM # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; CM # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; AL # Lo DEVANAGARI OM +0951..0957 ; CM # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; AL # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; CM # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965 ; BA # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; NU # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; AL # Po DEVANAGARI ABBREVIATION SIGN +0971 ; AL # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F ; AL # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +0980 ; AL # Lo BENGALI ANJI +0981 ; CM # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; CM # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; AL # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; AL # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; AL # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; AL # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; AL # Lo BENGALI LETTER LA +09B6..09B9 ; AL # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; CM # Mn BENGALI SIGN NUKTA +09BD ; AL # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; CM # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; CM # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; CM # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; CM # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; CM # Mn BENGALI SIGN VIRAMA +09CE ; AL # Lo BENGALI LETTER KHANDA TA +09D7 ; CM # Mc BENGALI AU LENGTH MARK +09DC..09DD ; AL # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; AL # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; CM # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; NU # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; AL # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; PO # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F8 ; AL # No [5] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR +09F9 ; PO # No BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; AL # So BENGALI ISSHAR +09FB ; PR # Sc BENGALI GANDA MARK +09FC ; AL # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; AL # Po BENGALI ABBREVIATION SIGN +09FE ; CM # Mn BENGALI SANDHI MARK +0A01..0A02 ; CM # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; CM # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; AL # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; AL # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; AL # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; AL # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; AL # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; AL # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; AL # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; CM # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; CM # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; CM # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; CM # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; CM # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; CM # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; AL # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; AL # Lo GURMUKHI LETTER FA +0A66..0A6F ; NU # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; CM # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; AL # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; CM # Mn GURMUKHI SIGN YAKASH +0A76 ; AL # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82 ; CM # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; CM # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; AL # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; AL # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; AL # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; AL # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; AL # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; AL # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; CM # Mn GUJARATI SIGN NUKTA +0ABD ; AL # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; CM # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; CM # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; CM # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; CM # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; CM # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; CM # Mn GUJARATI SIGN VIRAMA +0AD0 ; AL # Lo GUJARATI OM +0AE0..0AE1 ; AL # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; CM # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; NU # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; AL # Po GUJARATI ABBREVIATION SIGN +0AF1 ; PR # Sc GUJARATI RUPEE SIGN +0AF9 ; AL # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; CM # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; CM # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; CM # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; AL # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; AL # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; AL # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; AL # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; AL # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; AL # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; CM # Mn ORIYA SIGN NUKTA +0B3D ; AL # Lo ORIYA SIGN AVAGRAHA +0B3E ; CM # Mc ORIYA VOWEL SIGN AA +0B3F ; CM # Mn ORIYA VOWEL SIGN I +0B40 ; CM # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; CM # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; CM # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; CM # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; CM # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; CM # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; CM # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; AL # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; AL # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; CM # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; NU # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; AL # So ORIYA ISSHAR +0B71 ; AL # Lo ORIYA LETTER WA +0B72..0B77 ; AL # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82 ; CM # Mn TAMIL SIGN ANUSVARA +0B83 ; AL # Lo TAMIL SIGN VISARGA +0B85..0B8A ; AL # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; AL # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; AL # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; AL # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; AL # Lo TAMIL LETTER JA +0B9E..0B9F ; AL # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; AL # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; AL # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; AL # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; CM # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; CM # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; CM # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; CM # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; CM # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; CM # Mn TAMIL SIGN VIRAMA +0BD0 ; AL # Lo TAMIL OM +0BD7 ; CM # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; NU # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; AL # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; AL # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; PR # Sc TAMIL RUPEE SIGN +0BFA ; AL # So TAMIL NUMBER SIGN +0C00 ; CM # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; CM # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; CM # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; AL # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; AL # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; AL # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; AL # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; CM # Mn TELUGU SIGN NUKTA +0C3D ; AL # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; CM # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; CM # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; CM # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; CM # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; CM # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; AL # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; AL # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; AL # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; CM # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; NU # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; BB # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; AL # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; AL # So TELUGU SIGN TUUMU +0C80 ; AL # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; CM # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; CM # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; BB # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; AL # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; AL # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; AL # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; AL # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; AL # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; CM # Mn KANNADA SIGN NUKTA +0CBD ; AL # Lo KANNADA SIGN AVAGRAHA +0CBE ; CM # Mc KANNADA VOWEL SIGN AA +0CBF ; CM # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; CM # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; CM # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; CM # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; CM # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; CM # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; CM # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; AL # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; AL # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; CM # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; NU # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; AL # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; CM # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; CM # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; CM # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; AL # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; AL # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; AL # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; CM # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; AL # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; CM # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; CM # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; CM # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; CM # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; CM # Mn MALAYALAM SIGN VIRAMA +0D4E ; AL # Lo MALAYALAM LETTER DOT REPH +0D4F ; AL # So MALAYALAM SIGN PARA +0D54..0D56 ; AL # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; CM # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; AL # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; AL # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; CM # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; NU # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; AL # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; PO # So MALAYALAM DATE MARK +0D7A..0D7F ; AL # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D81 ; CM # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; CM # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; AL # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; AL # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; AL # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; AL # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; AL # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; CM # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; CM # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; CM # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; CM # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; CM # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; NU # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; CM # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; AL # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; SA # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; SA # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; SA # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; SA # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F ; PR # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45 ; SA # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; SA # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; SA # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; AL # Po THAI CHARACTER FONGMAN +0E50..0E59 ; NU # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; BA # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; SA # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; SA # Lo LAO LETTER KHO TAM +0E86..0E8A ; SA # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; SA # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; SA # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; SA # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; SA # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; SA # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; SA # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; SA # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; SA # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; SA # Lm LAO KO LA +0EC8..0ECE ; SA # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; NU # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; SA # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; AL # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; BB # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04 ; BB # Po TIBETAN MARK INITIAL YIG MGO MDUN MA +0F05 ; AL # Po TIBETAN MARK CLOSING YIG MGO SGAB MA +0F06..0F07 ; BB # Po [2] TIBETAN MARK CARET YIG MGO PHUR SHAD MA..TIBETAN MARK YIG MGO TSHEG SHAD MA +0F08 ; GL # Po TIBETAN MARK SBRUL SHAD +0F09..0F0A ; BB # Po [2] TIBETAN MARK BSKUR YIG MGO..TIBETAN MARK BKA- SHOG YIG MGO +0F0B ; BA # Po TIBETAN MARK INTERSYLLABIC TSHEG +0F0C ; GL # Po TIBETAN MARK DELIMITER TSHEG BSTAR +0F0D..0F11 ; EX # Po [5] TIBETAN MARK SHAD..TIBETAN MARK RIN CHEN SPUNGS SHAD +0F12 ; GL # Po TIBETAN MARK RGYA GRAM SHAD +0F13 ; AL # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; EX # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; AL # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; CM # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; AL # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; NU # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; AL # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; BA # So TIBETAN MARK BSDUS RTAGS +0F35 ; CM # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; AL # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; CM # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; AL # So TIBETAN MARK CHE MGO +0F39 ; CM # Mn TIBETAN MARK TSA -PHRU +0F3A ; OP # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; CL # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; OP # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; CL # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; CM # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; AL # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; AL # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; CM # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; BA # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; CM # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; BA # Po TIBETAN MARK PALUTA +0F86..0F87 ; CM # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; AL # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; CM # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; CM # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FBF ; BA # So [2] TIBETAN KU RU KHA..TIBETAN KU RU KHA BZHI MIG CAN +0FC0..0FC5 ; AL # So [6] TIBETAN CANTILLATION SIGN HEAVY BEAT..TIBETAN SYMBOL RDO RJE +0FC6 ; CM # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; AL # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; AL # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD1 ; BB # Po [2] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK MNYAM YIG GI MGO RGYAN +0FD2 ; BA # Po TIBETAN MARK NYIS TSHEG +0FD3 ; BB # Po TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA +0FD4 ; AL # Po TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; AL # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; GL # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A ; SA # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; SA # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; SA # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; SA # Mc MYANMAR VOWEL SIGN E +1032..1037 ; SA # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; SA # Mc MYANMAR SIGN VISARGA +1039..103A ; SA # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; SA # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; SA # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; SA # Lo MYANMAR LETTER GREAT SA +1040..1049 ; NU # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104B ; BA # Po [2] MYANMAR SIGN LITTLE SECTION..MYANMAR SIGN SECTION +104C..104F ; AL # Po [4] MYANMAR SYMBOL LOCATIVE..MYANMAR SYMBOL GENITIVE +1050..1055 ; SA # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; SA # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; SA # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; SA # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; SA # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; SA # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; SA # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; SA # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; SA # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; SA # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; SA # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; SA # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; SA # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; SA # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; SA # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; SA # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; SA # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; SA # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; SA # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; NU # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; SA # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; SA # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; SA # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; AL # Lu [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; AL # Lu GEORGIAN CAPITAL LETTER YN +10CD ; AL # Lu GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; AL # Ll [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB ; AL # Po GEORGIAN PARAGRAPH SEPARATOR +10FC ; AL # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; AL # Ll [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1100..115F ; JL # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +1160..11A7 ; JV # Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE +11A8..11FF ; JT # Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN +1200..1248 ; AL # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; AL # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; AL # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; AL # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; AL # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; AL # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; AL # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; AL # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; AL # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; AL # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; AL # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; AL # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; AL # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; AL # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; AL # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; AL # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; CM # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360 ; AL # Po ETHIOPIC SECTION MARK +1361 ; BA # Po ETHIOPIC WORDSPACE +1362..1368 ; AL # Po [7] ETHIOPIC FULL STOP..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; AL # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; AL # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; AL # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5 ; AL # Lu [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; AL # Ll [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400 ; BA # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; AL # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; AL # So CANADIAN SYLLABICS CHI SIGN +166E ; AL # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; AL # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680 ; BA # Zs OGHAM SPACE MARK +1681..169A ; AL # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; OP # Ps OGHAM FEATHER MARK +169C ; CL # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA ; AL # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; BA # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; AL # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; AL # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..1711 ; AL # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; CM # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; CM # Mc TAGALOG SIGN PAMUDPOD +171F ; AL # Lo TAGALOG LETTER ARCHAIC RA +1720..1731 ; AL # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; CM # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; CM # Mc HANUNOO SIGN PAMUDPOD +1735..1736 ; BA # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; AL # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; CM # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; AL # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; AL # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; CM # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; SA # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; SA # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; SA # Mc KHMER VOWEL SIGN AA +17B7..17BD ; SA # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; SA # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; SA # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; SA # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; SA # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D5 ; BA # Po [2] KHMER SIGN KHAN..KHMER SIGN BARIYOOSAN +17D6 ; NS # Po KHMER SIGN CAMNUC PII KUUH +17D7 ; SA # Lm KHMER SIGN LEK TOO +17D8 ; BA # Po KHMER SIGN BEYYAL +17D9 ; AL # Po KHMER SIGN PHNAEK MUAN +17DA ; BA # Po KHMER SIGN KOOMUUT +17DB ; PR # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; SA # Lo KHMER SIGN AVAKRAHASANYA +17DD ; SA # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; NU # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; AL # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1801 ; AL # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS +1802..1803 ; EX # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP +1804..1805 ; BA # Po [2] MONGOLIAN COLON..MONGOLIAN FOUR DOTS +1806 ; BB # Pd MONGOLIAN TODO SOFT HYPHEN +1807 ; AL # Po MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER +1808..1809 ; EX # Po [2] MONGOLIAN MANCHU COMMA..MONGOLIAN MANCHU FULL STOP +180A ; AL # Po MONGOLIAN NIRUGU +180B..180D ; CM # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; GL # Cf MONGOLIAN VOWEL SEPARATOR +180F ; CM # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; NU # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; AL # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; AL # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; AL # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; AL # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; CM # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; AL # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; CM # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; AL # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; AL # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; AL # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; CM # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; CM # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; CM # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; CM # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; CM # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; CM # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; CM # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; CM # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; AL # So LIMBU SIGN LOO +1944..1945 ; EX # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; NU # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; SA # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; SA # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; SA # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; SA # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; NU # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; SA # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF ; SA # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV +19E0..19FF ; AL # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16 ; AL # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; CM # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; CM # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; CM # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; AL # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54 ; SA # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; SA # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; SA # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; SA # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; SA # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; SA # Mn TAI THAM SIGN SAKOT +1A61 ; SA # Mc TAI THAM VOWEL SIGN A +1A62 ; SA # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; SA # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; SA # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; SA # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; SA # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; CM # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; NU # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; NU # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; SA # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; SA # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; SA # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD ; CM # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; CM # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; CM # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; CM # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; CM # Mc BALINESE SIGN BISAH +1B05..1B33 ; AK # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; CM # Mn BALINESE SIGN REREKAN +1B35 ; CM # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; CM # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; CM # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; CM # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; CM # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; CM # Mn BALINESE VOWEL SIGN PEPET +1B43 ; CM # Mc BALINESE VOWEL SIGN PEPET TEDUNG +1B44 ; VI # Mc BALINESE ADEG ADEG +1B45..1B4C ; AK # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; ID # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B5B ; BA # Po [2] BALINESE PANTI..BALINESE PAMADA +1B5C ; ID # Po BALINESE WINDU +1B5D..1B60 ; BA # Po [4] BALINESE CARIK PAMUNGKAH..BALINESE PAMENENG +1B61..1B6A ; ID # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; CM # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; ID # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; BA # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG +1B80..1B81 ; CM # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; CM # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; AL # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; CM # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; CM # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; CM # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; CM # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; CM # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; CM # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; AL # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; NU # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF ; AL # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1BC0..1BE5 ; AS # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6 ; CM # Mn BATAK SIGN TOMPI +1BE7 ; CM # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; CM # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; CM # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; CM # Mn BATAK VOWEL SIGN KARO O +1BEE ; CM # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; CM # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; VF # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; AL # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23 ; AL # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; CM # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; CM # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; CM # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; CM # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; BA # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; NU # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; AL # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; NU # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; AL # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; AL # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; BA # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; AL # Ll [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; AL # Lu [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; AL # Lu [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CC0..1CC7 ; AL # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD0..1CD2 ; CM # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; AL # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; CM # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; CM # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; CM # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; AL # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; CM # Mn VEDIC SIGN TIRYAK +1CEE..1CF3 ; AL # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; CM # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; AL # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; CM # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; CM # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1CFA ; AL # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +1D00..1D2B ; AL # Ll [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; AL # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; AL # Ll [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; AL # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D7F ; AL # Ll [7] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER UPSILON WITH STROKE +1D80..1D9A ; AL # Ll [27] LATIN SMALL LETTER B WITH PALATAL HOOK..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; AL # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DCC ; CM # Mn [13] COMBINING DOTTED GRAVE ACCENT..COMBINING MACRON-BREVE +1DCD ; GL # Mn COMBINING DOUBLE CIRCUMFLEX ABOVE +1DCE..1DFB ; CM # Mn [46] COMBINING OGONEK ABOVE..COMBINING DELETION MARK +1DFC ; GL # Mn COMBINING DOUBLE INVERTED BREVE BELOW +1DFD..1DFF ; CM # Mn [3] COMBINING ALMOST EQUAL TO BELOW..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1EFF ; AL # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP +1F00..1F15 ; AL # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; AL # Lu [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; AL # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; AL # Lu [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; AL # Ll [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; AL # Lu GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; AL # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; AL # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; AL # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; AL # Sk GREEK KORONIS +1FBE ; AL # Ll GREEK PROSGEGRAMMENI +1FBF..1FC1 ; AL # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; AL # Ll [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; AL # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; AL # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; AL # Ll [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; AL # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; AL # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; AL # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; AL # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; AL # Ll [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; AL # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD ; BB # Sk GREEK OXIA +1FFE ; AL # Sk GREEK DASIA +2000..2006 ; BA # Zs [7] EN QUAD..SIX-PER-EM SPACE +2007 ; GL # Zs FIGURE SPACE +2008..200A ; BA # Zs [3] PUNCTUATION SPACE..HAIR SPACE +200B ; ZW # Cf ZERO WIDTH SPACE +200C ; CM # Cf ZERO WIDTH NON-JOINER +200D ; ZWJ# Cf ZERO WIDTH JOINER +200E..200F ; CM # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010 ; BA # Pd HYPHEN +2011 ; GL # Pd NON-BREAKING HYPHEN +2012..2013 ; BA # Pd [2] FIGURE DASH..EN DASH +2014 ; B2 # Pd EM DASH +2015 ; AI # Pd HORIZONTAL BAR +2016 ; AI # Po DOUBLE VERTICAL LINE +2017 ; AL # Po DOUBLE LOW LINE +2018 ; QU # Pi LEFT SINGLE QUOTATION MARK +2019 ; QU # Pf RIGHT SINGLE QUOTATION MARK +201A ; OP # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; QU # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; QU # Pf RIGHT DOUBLE QUOTATION MARK +201E ; OP # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; QU # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2021 ; AI # Po [2] DAGGER..DOUBLE DAGGER +2022..2023 ; AL # Po [2] BULLET..TRIANGULAR BULLET +2024..2026 ; IN # Po [3] ONE DOT LEADER..HORIZONTAL ELLIPSIS +2027 ; BA # Po HYPHENATION POINT +2028 ; BK # Zl LINE SEPARATOR +2029 ; BK # Zp PARAGRAPH SEPARATOR +202A..202E ; CM # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; GL # Zs NARROW NO-BREAK SPACE +2030..2037 ; PO # Po [8] PER MILLE SIGN..REVERSED TRIPLE PRIME +2038 ; AL # Po CARET +2039 ; QU # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; QU # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B ; AI # Po REFERENCE MARK +203C..203D ; NS # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203E ; AL # Po OVERLINE +203F..2040 ; AL # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; AL # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; IS # Sm FRACTION SLASH +2045 ; OP # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; CL # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2049 ; NS # Po [3] DOUBLE QUESTION MARK..EXCLAMATION QUESTION MARK +204A..2051 ; AL # Po [8] TIRONIAN SIGN ET..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; AL # Sm COMMERCIAL MINUS SIGN +2053 ; AL # Po SWUNG DASH +2054 ; AL # Pc INVERTED UNDERTIE +2055 ; AL # Po FLOWER PUNCTUATION MARK +2056 ; BA # Po THREE DOT PUNCTUATION +2057 ; PO # Po QUADRUPLE PRIME +2058..205B ; BA # Po [4] FOUR DOT PUNCTUATION..FOUR DOT MARK +205C ; AL # Po DOTTED CROSS +205D..205E ; BA # Po [2] TRICOLON..VERTICAL FOUR DOTS +205F ; BA # Zs MEDIUM MATHEMATICAL SPACE +2060 ; WJ # Cf WORD JOINER +2061..2064 ; AL # Cf [4] FUNCTION APPLICATION..INVISIBLE PLUS +2066..206F ; CM # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; AL # No SUPERSCRIPT ZERO +2071 ; AL # Lm SUPERSCRIPT LATIN SMALL LETTER I +2074 ; AI # No SUPERSCRIPT FOUR +2075..2079 ; AL # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C ; AL # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; OP # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; CL # Pe SUPERSCRIPT RIGHT PARENTHESIS +207F ; AI # Lm SUPERSCRIPT LATIN SMALL LETTER N +2080 ; AL # No SUBSCRIPT ZERO +2081..2084 ; AI # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +2085..2089 ; AL # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C ; AL # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; OP # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; CL # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C ; AL # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A6 ; PR # Sc [7] EURO-CURRENCY SIGN..NAIRA SIGN +20A7 ; PO # Sc PESETA SIGN +20A8..20B5 ; PR # Sc [14] RUPEE SIGN..CEDI SIGN +20B6 ; PO # Sc LIVRE TOURNOIS SIGN +20B7..20BA ; PR # Sc [4] SPESMILO SIGN..TURKISH LIRA SIGN +20BB ; PO # Sc NORDIC MARK SIGN +20BC..20BD ; PR # Sc [2] MANAT SIGN..RUBLE SIGN +20BE ; PO # Sc LARI SIGN +20BF ; PR # Sc BITCOIN SIGN +20C0 ; PO # Sc SOM SIGN +20C1..20CF ; PR # Cn [15] .. +20D0..20DC ; CM # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; CM # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; CM # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; CM # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; CM # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101 ; AL # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; AL # Lu DOUBLE-STRUCK CAPITAL C +2103 ; PO # So DEGREE CELSIUS +2104 ; AL # So CENTRE LINE SYMBOL +2105 ; AI # So CARE OF +2106 ; AL # So CADA UNA +2107 ; AL # Lu EULER CONSTANT +2108 ; AL # So SCRUPLE +2109 ; PO # So DEGREE FAHRENHEIT +210A..2112 ; AL # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2113 ; AI # Ll SCRIPT SMALL L +2114 ; AL # So L B BAR SYMBOL +2115 ; AL # Lu DOUBLE-STRUCK CAPITAL N +2116 ; PR # So NUMERO SIGN +2117 ; AL # So SOUND RECORDING COPYRIGHT +2118 ; AL # Sm SCRIPT CAPITAL P +2119..211D ; AL # Lu [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120 ; AL # So [3] PRESCRIPTION TAKE..SERVICE MARK +2121..2122 ; AI # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2123 ; AL # So VERSICLE +2124 ; AL # Lu DOUBLE-STRUCK CAPITAL Z +2125 ; AL # So OUNCE SIGN +2126 ; AL # Lu OHM SIGN +2127 ; AL # So INVERTED OHM SIGN +2128 ; AL # Lu BLACK-LETTER CAPITAL Z +2129 ; AL # So TURNED GREEK SMALL LETTER IOTA +212A ; AL # Lu KELVIN SIGN +212B ; AI # Lu ANGSTROM SIGN +212C..212D ; AL # Lu [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; AL # So ESTIMATED SYMBOL +212F..2134 ; AL # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; AL # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; AL # Ll INFORMATION SOURCE +213A..213B ; AL # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; AL # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; AL # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; AL # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; AL # So PROPERTY LINE +214B ; AL # Sm TURNED AMPERSAND +214C..214D ; AL # So [2] PER SIGN..AKTIESELSKAB +214E ; AL # Ll TURNED SMALL F +214F ; AL # So SYMBOL FOR SAMARITAN SOURCE +2150..2153 ; AL # No [4] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE THIRD +2154..2155 ; AI # No [2] VULGAR FRACTION TWO THIRDS..VULGAR FRACTION ONE FIFTH +2156..215A ; AL # No [5] VULGAR FRACTION TWO FIFTHS..VULGAR FRACTION FIVE SIXTHS +215B ; AI # No VULGAR FRACTION ONE EIGHTH +215C..215D ; AL # No [2] VULGAR FRACTION THREE EIGHTHS..VULGAR FRACTION FIVE EIGHTHS +215E ; AI # No VULGAR FRACTION SEVEN EIGHTHS +215F ; AL # No FRACTION NUMERATOR ONE +2160..216B ; AI # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +216C..216F ; AL # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +2170..2179 ; AI # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +217A..2182 ; AL # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; AL # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; AL # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2189 ; AI # No VULGAR FRACTION ZERO THIRDS +218A..218B ; AL # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; AI # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; AI # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; AL # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; AL # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; AL # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; AL # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; AL # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; AL # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; AL # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; AL # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; AL # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; AL # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; AL # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; AL # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; AI # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; AL # So DOWNWARDS DOUBLE ARROW +21D4 ; AI # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; AL # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..21FF ; AL # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2200 ; AI # Sm FOR ALL +2201 ; AL # Sm COMPLEMENT +2202..2203 ; AI # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2204..2206 ; AL # Sm [3] THERE DOES NOT EXIST..INCREMENT +2207..2208 ; AI # Sm [2] NABLA..ELEMENT OF +2209..220A ; AL # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220B ; AI # Sm CONTAINS AS MEMBER +220C..220E ; AL # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +220F ; AI # Sm N-ARY PRODUCT +2210 ; AL # Sm N-ARY COPRODUCT +2211 ; AI # Sm N-ARY SUMMATION +2212..2213 ; PR # Sm [2] MINUS SIGN..MINUS-OR-PLUS SIGN +2214 ; AL # Sm DOT PLUS +2215 ; AI # Sm DIVISION SLASH +2216..2219 ; AL # Sm [4] SET MINUS..BULLET OPERATOR +221A ; AI # Sm SQUARE ROOT +221B..221C ; AL # Sm [2] CUBE ROOT..FOURTH ROOT +221D..2220 ; AI # Sm [4] PROPORTIONAL TO..ANGLE +2221..2222 ; AL # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2223 ; AI # Sm DIVIDES +2224 ; AL # Sm DOES NOT DIVIDE +2225 ; AI # Sm PARALLEL TO +2226 ; AL # Sm NOT PARALLEL TO +2227..222C ; AI # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222D ; AL # Sm TRIPLE INTEGRAL +222E ; AI # Sm CONTOUR INTEGRAL +222F..2233 ; AL # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2234..2237 ; AI # Sm [4] THEREFORE..PROPORTION +2238..223B ; AL # Sm [4] DOT MINUS..HOMOTHETIC +223C..223D ; AI # Sm [2] TILDE OPERATOR..REVERSED TILDE +223E..2247 ; AL # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2248 ; AI # Sm ALMOST EQUAL TO +2249..224B ; AL # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224C ; AI # Sm ALL EQUAL TO +224D..2251 ; AL # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2252 ; AI # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2253..225F ; AL # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2260..2261 ; AI # Sm [2] NOT EQUAL TO..IDENTICAL TO +2262..2263 ; AL # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2264..2267 ; AI # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +2268..2269 ; AL # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226A..226B ; AI # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226C..226D ; AL # Sm [2] BETWEEN..NOT EQUIVALENT TO +226E..226F ; AI # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2270..2281 ; AL # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2282..2283 ; AI # Sm [2] SUBSET OF..SUPERSET OF +2284..2285 ; AL # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2286..2287 ; AI # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2288..2294 ; AL # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2295 ; AI # Sm CIRCLED PLUS +2296..2298 ; AL # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +2299 ; AI # Sm CIRCLED DOT OPERATOR +229A..22A4 ; AL # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A5 ; AI # Sm UP TACK +22A6..22BE ; AL # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22BF ; AI # Sm RIGHT TRIANGLE +22C0..22EE ; AL # Sm [47] N-ARY LOGICAL AND..VERTICAL ELLIPSIS +22EF ; IN # Sm MIDLINE HORIZONTAL ELLIPSIS +22F0..22FF ; AL # Sm [16] UP RIGHT DIAGONAL ELLIPSIS..Z NOTATION BAG MEMBERSHIP +2300..2307 ; AL # So [8] DIAMETER SIGN..WAVY LINE +2308 ; OP # Ps LEFT CEILING +2309 ; CL # Pe RIGHT CEILING +230A ; OP # Ps LEFT FLOOR +230B ; CL # Pe RIGHT FLOOR +230C..2311 ; AL # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2312 ; AI # So ARC +2313..2319 ; AL # So [7] SEGMENT..TURNED NOT SIGN +231A..231B ; ID # So [2] WATCH..HOURGLASS +231C..231F ; AL # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER +2320..2321 ; AL # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; AL # So [7] FROWN..KEYBOARD +2329 ; OP # Ps LEFT-POINTING ANGLE BRACKET +232A ; CL # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; AL # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; AL # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; AL # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; AL # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; AL # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; AL # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..23EF ; AL # So [14] WHITE TRAPEZIUM..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F0..23F3 ; ID # So [4] ALARM CLOCK..HOURGLASS WITH FLOWING SAND +23F4..23FF ; AL # So [12] BLACK MEDIUM LEFT-POINTING TRIANGLE..OBSERVER EYE SYMBOL +2400..2426 ; AL # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; AL # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; AI # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; AI # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FE ; AI # No [21] CIRCLED DIGIT ZERO..DOUBLE CIRCLED NUMBER TEN +24FF ; AL # No NEGATIVE CIRCLED DIGIT ZERO +2500..254B ; AI # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +254C..254F ; AL # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2550..2574 ; AI # So [37] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT LEFT +2575..257F ; AL # So [11] BOX DRAWINGS LIGHT UP..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2580..258F ; AI # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2590..2591 ; AL # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2592..2595 ; AI # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +2596..259F ; AL # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A0..25A1 ; AI # So [2] BLACK SQUARE..WHITE SQUARE +25A2 ; AL # So WHITE SQUARE WITH ROUNDED CORNERS +25A3..25A9 ; AI # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25AA..25B1 ; AL # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B2..25B3 ; AI # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B4..25B5 ; AL # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B6 ; AI # So BLACK RIGHT-POINTING TRIANGLE +25B7 ; AI # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25BB ; AL # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BC..25BD ; AI # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25BE..25BF ; AL # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C0 ; AI # So BLACK LEFT-POINTING TRIANGLE +25C1 ; AI # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25C5 ; AL # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C6..25C8 ; AI # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25C9..25CA ; AL # So [2] FISHEYE..LOZENGE +25CB ; AI # So WHITE CIRCLE +25CC..25CD ; AL # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25CE..25D1 ; AI # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25D2..25E1 ; AL # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E2..25E5 ; AI # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +25E6..25EE ; AL # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25EF ; AI # So LARGE CIRCLE +25F0..25F7 ; AL # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; AL # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..2603 ; ID # So [4] BLACK SUN WITH RAYS..SNOWMAN +2604 ; AL # So COMET +2605..2606 ; AI # So [2] BLACK STAR..WHITE STAR +2607..2608 ; AL # So [2] LIGHTNING..THUNDERSTORM +2609 ; AI # So SUN +260A..260D ; AL # So [4] ASCENDING NODE..OPPOSITION +260E..260F ; AI # So [2] BLACK TELEPHONE..WHITE TELEPHONE +2610..2613 ; AL # So [4] BALLOT BOX..SALTIRE +2614..2615 ; ID # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2616..2617 ; AI # So [2] WHITE SHOGI PIECE..BLACK SHOGI PIECE +2618 ; ID # So SHAMROCK +2619 ; AL # So REVERSED ROTATED FLORAL HEART BULLET +261A..261C ; ID # So [3] BLACK LEFT POINTING INDEX..WHITE LEFT POINTING INDEX +261D ; EB # So WHITE UP POINTING INDEX +261E..261F ; ID # So [2] WHITE RIGHT POINTING INDEX..WHITE DOWN POINTING INDEX +2620..2638 ; AL # So [25] SKULL AND CROSSBONES..WHEEL OF DHARMA +2639..263B ; ID # So [3] WHITE FROWNING FACE..BLACK SMILING FACE +263C..263F ; AL # So [4] WHITE SUN WITH RAYS..MERCURY +2640 ; AI # So FEMALE SIGN +2641 ; AL # So EARTH +2642 ; AI # So MALE SIGN +2643..265F ; AL # So [29] JUPITER..BLACK CHESS PAWN +2660..2661 ; AI # So [2] BLACK SPADE SUIT..WHITE HEART SUIT +2662 ; AL # So WHITE DIAMOND SUIT +2663..2665 ; AI # So [3] BLACK CLUB SUIT..BLACK HEART SUIT +2666 ; AL # So BLACK DIAMOND SUIT +2667 ; AI # So WHITE CLUB SUIT +2668 ; ID # So HOT SPRINGS +2669..266A ; AI # So [2] QUARTER NOTE..EIGHTH NOTE +266B ; AL # So BEAMED EIGHTH NOTES +266C..266D ; AI # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266E ; AL # So MUSIC NATURAL SIGN +266F ; AI # Sm MUSIC SHARP SIGN +2670..267E ; AL # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +267F ; ID # So WHEELCHAIR SYMBOL +2680..269D ; AL # So [30] DIE FACE-1..OUTLINED WHITE STAR +269E..269F ; AI # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26A0..26BC ; AL # So [29] WARNING SIGN..SESQUIQUADRATE +26BD..26C8 ; ID # So [12] SOCCER BALL..THUNDER CLOUD AND RAIN +26C9..26CC ; AI # So [4] TURNED WHITE SHOGI PIECE..CROSSING LANES +26CD ; ID # So DISABLED CAR +26CE ; AL # So OPHIUCHUS +26CF..26D1 ; ID # So [3] PICK..HELMET WITH WHITE CROSS +26D2 ; AI # So CIRCLED CROSSING LANES +26D3..26D4 ; ID # So [2] CHAINS..NO ENTRY +26D5..26D7 ; AI # So [3] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..WHITE TWO-WAY LEFT WAY TRAFFIC +26D8..26D9 ; ID # So [2] BLACK LEFT LANE MERGE..WHITE LEFT LANE MERGE +26DA..26DB ; AI # So [2] DRIVE SLOW SIGN..HEAVY WHITE DOWN-POINTING TRIANGLE +26DC ; ID # So LEFT CLOSED ENTRY +26DD..26DE ; AI # So [2] SQUARED SALTIRE..FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE +26DF..26E1 ; ID # So [3] BLACK TRUCK..RESTRICTED LEFT ENTRY-2 +26E2 ; AL # So ASTRONOMICAL SYMBOL FOR URANUS +26E3 ; AI # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E4..26E7 ; AL # So [4] PENTAGRAM..INVERTED PENTAGRAM +26E8..26E9 ; AI # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EA ; ID # So CHURCH +26EB..26F0 ; AI # So [6] CASTLE..MOUNTAIN +26F1..26F5 ; ID # So [5] UMBRELLA ON GROUND..SAILBOAT +26F6 ; AI # So SQUARE FOUR CORNERS +26F7..26F8 ; ID # So [2] SKIER..ICE SKATE +26F9 ; EB # So PERSON WITH BALL +26FA ; ID # So TENT +26FB..26FC ; AI # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FD..26FF ; ID # So [3] FUEL PUMP..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +2700..2704 ; ID # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS +2705..2707 ; AL # So [3] WHITE HEAVY CHECK MARK..TAPE DRIVE +2708..2709 ; ID # So [2] AIRPLANE..ENVELOPE +270A..270D ; EB # So [4] RAISED FIST..WRITING HAND +270E..2756 ; AL # So [73] LOWER RIGHT PENCIL..BLACK DIAMOND MINUS WHITE X +2757 ; AI # So HEAVY EXCLAMATION MARK SYMBOL +2758..275A ; AL # So [3] LIGHT VERTICAL BAR..HEAVY VERTICAL BAR +275B..2760 ; QU # So [6] HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT..HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +2761 ; AL # So CURVED STEM PARAGRAPH SIGN ORNAMENT +2762..2763 ; EX # So [2] HEAVY EXCLAMATION MARK ORNAMENT..HEAVY HEART EXCLAMATION MARK ORNAMENT +2764 ; ID # So HEAVY BLACK HEART +2765..2767 ; AL # So [3] ROTATED HEAVY BLACK HEART BULLET..ROTATED FLORAL HEART BULLET +2768 ; OP # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; CL # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; OP # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; CL # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; OP # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; CL # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; OP # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; CL # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; OP # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; CL # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; OP # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; CL # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; OP # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; CL # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; AI # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794..27BF ; AL # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; AL # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; OP # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; CL # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; AL # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; OP # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; CL # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; OP # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; CL # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; OP # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; CL # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; OP # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; CL # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; OP # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; CL # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; AL # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; AL # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..297F ; AL # Sm [128] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..DOWN FISH TAIL +2980..2982 ; AL # Sm [3] TRIPLE VERTICAL BAR DELIMITER..Z NOTATION TYPE COLON +2983 ; OP # Ps LEFT WHITE CURLY BRACKET +2984 ; CL # Pe RIGHT WHITE CURLY BRACKET +2985 ; OP # Ps LEFT WHITE PARENTHESIS +2986 ; CL # Pe RIGHT WHITE PARENTHESIS +2987 ; OP # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; CL # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; OP # Ps Z NOTATION LEFT BINDING BRACKET +298A ; CL # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; OP # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; CL # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; OP # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; CL # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; OP # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; CL # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; OP # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; CL # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; OP # Ps LEFT ARC LESS-THAN BRACKET +2994 ; CL # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; OP # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; CL # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; OP # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; CL # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; AL # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; OP # Ps LEFT WIGGLY FENCE +29D9 ; CL # Pe RIGHT WIGGLY FENCE +29DA ; OP # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; CL # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; AL # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; OP # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; CL # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..29FF ; AL # Sm [2] TINY..MINY +2A00..2AFF ; AL # Sm [256] N-ARY CIRCLED DOT OPERATOR..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; AL # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; AL # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; AL # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; AL # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B54 ; AL # So [8] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..WHITE RIGHT-POINTING PENTAGON +2B55..2B59 ; AI # So [5] HEAVY LARGE CIRCLE..HEAVY CIRCLED SALTIRE +2B5A..2B73 ; AL # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; AL # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; AL # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2C00..2C5F ; AL # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +2C60..2C7B ; AL # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; AL # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F ; AL # Lu [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80..2CE4 ; AL # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; AL # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; AL # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; CM # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; AL # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9 ; EX # Po COPTIC OLD NUBIAN FULL STOP +2CFA..2CFC ; BA # Po [3] COPTIC OLD NUBIAN DIRECT QUESTION MARK..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; AL # No COPTIC FRACTION ONE HALF +2CFE ; EX # Po COPTIC FULL STOP +2CFF ; BA # Po COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; AL # Ll [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; AL # Ll GEORGIAN SMALL LETTER YN +2D2D ; AL # Ll GEORGIAN SMALL LETTER AEN +2D30..2D67 ; AL # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; AL # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; BA # Po TIFINAGH SEPARATOR MARK +2D7F ; CM # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; AL # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; AL # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; AL # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; AL # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; AL # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; AL # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; AL # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; AL # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; AL # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; CM # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01 ; QU # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; QU # Pi LEFT SUBSTITUTION BRACKET +2E03 ; QU # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; QU # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; QU # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; QU # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; QU # Pi LEFT TRANSPOSITION BRACKET +2E0A ; QU # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; QU # Po RAISED SQUARE +2E0C ; QU # Pi LEFT RAISED OMISSION BRACKET +2E0D ; QU # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E15 ; BA # Po [8] EDITORIAL CORONIS..UPWARDS ANCORA +2E16 ; AL # Po DOTTED RIGHT-POINTING ANGLE +2E17 ; BA # Pd DOUBLE OBLIQUE HYPHEN +2E18 ; OP # Po INVERTED INTERROBANG +2E19 ; BA # Po PALM BRANCH +2E1A ; AL # Pd HYPHEN WITH DIAERESIS +2E1B ; AL # Po TILDE WITH RING ABOVE +2E1C ; QU # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; QU # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; AL # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; QU # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; QU # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; OP # Ps TOP LEFT HALF BRACKET +2E23 ; CL # Pe TOP RIGHT HALF BRACKET +2E24 ; OP # Ps BOTTOM LEFT HALF BRACKET +2E25 ; CL # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; OP # Ps LEFT SIDEWAYS U BRACKET +2E27 ; CL # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; OP # Ps LEFT DOUBLE PARENTHESIS +2E29 ; CL # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2D ; BA # Po [4] TWO DOTS OVER ONE DOT PUNCTUATION..FIVE DOT MARK +2E2E ; EX # Po REVERSED QUESTION MARK +2E2F ; AL # Lm VERTICAL TILDE +2E30..2E31 ; BA # Po [2] RING POINT..WORD SEPARATOR MIDDLE DOT +2E32 ; AL # Po TURNED COMMA +2E33..2E34 ; BA # Po [2] RAISED DOT..RAISED COMMA +2E35..2E39 ; AL # Po [5] TURNED SEMICOLON..TOP HALF SECTION SIGN +2E3A..2E3B ; B2 # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3E ; BA # Po [3] STENOGRAPHIC FULL STOP..WIGGLY VERTICAL LINE +2E3F ; AL # Po CAPITULUM +2E40 ; BA # Pd DOUBLE HYPHEN +2E41 ; BA # Po REVERSED COMMA +2E42 ; OP # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4A ; BA # Po [8] DASH WITH LEFT UPTURN..DOTTED SOLIDUS +2E4B ; AL # Po TRIPLE DAGGER +2E4C ; BA # Po MEDIEVAL COMMA +2E4D ; AL # Po PARAGRAPHUS MARK +2E4E..2E4F ; BA # Po [2] PUNCTUS ELEVATUS MARK..CORNISH VERSE DIVIDER +2E50..2E51 ; AL # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52 ; AL # Po TIRONIAN SIGN CAPITAL ET +2E53..2E54 ; EX # Po [2] MEDIEVAL EXCLAMATION MARK..MEDIEVAL QUESTION MARK +2E55 ; OP # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; CL # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; OP # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; CL # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; OP # Ps TOP HALF LEFT PARENTHESIS +2E5A ; CL # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; OP # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; CL # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; BA # Pd OBLIQUE HYPHEN +2E80..2E99 ; ID # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; ID # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; ID # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFF ; ID # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3000 ; BA # Zs IDEOGRAPHIC SPACE +3001..3002 ; CL # Po [2] IDEOGRAPHIC COMMA..IDEOGRAPHIC FULL STOP +3003 ; ID # Po DITTO MARK +3004 ; ID # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 ; NS # Lm IDEOGRAPHIC ITERATION MARK +3006 ; ID # Lo IDEOGRAPHIC CLOSING MARK +3007 ; ID # Nl IDEOGRAPHIC NUMBER ZERO +3008 ; OP # Ps LEFT ANGLE BRACKET +3009 ; CL # Pe RIGHT ANGLE BRACKET +300A ; OP # Ps LEFT DOUBLE ANGLE BRACKET +300B ; CL # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; OP # Ps LEFT CORNER BRACKET +300D ; CL # Pe RIGHT CORNER BRACKET +300E ; OP # Ps LEFT WHITE CORNER BRACKET +300F ; CL # Pe RIGHT WHITE CORNER BRACKET +3010 ; OP # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; CL # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; ID # So [2] POSTAL MARK..GETA MARK +3014 ; OP # Ps LEFT TORTOISE SHELL BRACKET +3015 ; CL # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; OP # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; CL # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; OP # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; CL # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; OP # Ps LEFT WHITE SQUARE BRACKET +301B ; CL # Pe RIGHT WHITE SQUARE BRACKET +301C ; NS # Pd WAVE DASH +301D ; OP # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; CL # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; ID # So POSTAL MARK FACE +3021..3029 ; ID # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; CM # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; CM # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030 ; ID # Pd WAVY DASH +3031..3034 ; ID # Lm [4] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF +3035 ; CM # Lm VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; ID # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A ; ID # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; NS # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; NS # Lo MASU MARK +303D ; ID # Po PART ALTERNATION MARK +303E..303F ; ID # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +3041 ; CJ # Lo HIRAGANA LETTER SMALL A +3042 ; ID # Lo HIRAGANA LETTER A +3043 ; CJ # Lo HIRAGANA LETTER SMALL I +3044 ; ID # Lo HIRAGANA LETTER I +3045 ; CJ # Lo HIRAGANA LETTER SMALL U +3046 ; ID # Lo HIRAGANA LETTER U +3047 ; CJ # Lo HIRAGANA LETTER SMALL E +3048 ; ID # Lo HIRAGANA LETTER E +3049 ; CJ # Lo HIRAGANA LETTER SMALL O +304A..3062 ; ID # Lo [25] HIRAGANA LETTER O..HIRAGANA LETTER DI +3063 ; CJ # Lo HIRAGANA LETTER SMALL TU +3064..3082 ; ID # Lo [31] HIRAGANA LETTER TU..HIRAGANA LETTER MO +3083 ; CJ # Lo HIRAGANA LETTER SMALL YA +3084 ; ID # Lo HIRAGANA LETTER YA +3085 ; CJ # Lo HIRAGANA LETTER SMALL YU +3086 ; ID # Lo HIRAGANA LETTER YU +3087 ; CJ # Lo HIRAGANA LETTER SMALL YO +3088..308D ; ID # Lo [6] HIRAGANA LETTER YO..HIRAGANA LETTER RO +308E ; CJ # Lo HIRAGANA LETTER SMALL WA +308F..3094 ; ID # Lo [6] HIRAGANA LETTER WA..HIRAGANA LETTER VU +3095..3096 ; CJ # Lo [2] HIRAGANA LETTER SMALL KA..HIRAGANA LETTER SMALL KE +3099..309A ; CM # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; NS # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; NS # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; ID # Lo HIRAGANA DIGRAPH YORI +30A0 ; NS # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1 ; CJ # Lo KATAKANA LETTER SMALL A +30A2 ; ID # Lo KATAKANA LETTER A +30A3 ; CJ # Lo KATAKANA LETTER SMALL I +30A4 ; ID # Lo KATAKANA LETTER I +30A5 ; CJ # Lo KATAKANA LETTER SMALL U +30A6 ; ID # Lo KATAKANA LETTER U +30A7 ; CJ # Lo KATAKANA LETTER SMALL E +30A8 ; ID # Lo KATAKANA LETTER E +30A9 ; CJ # Lo KATAKANA LETTER SMALL O +30AA..30C2 ; ID # Lo [25] KATAKANA LETTER O..KATAKANA LETTER DI +30C3 ; CJ # Lo KATAKANA LETTER SMALL TU +30C4..30E2 ; ID # Lo [31] KATAKANA LETTER TU..KATAKANA LETTER MO +30E3 ; CJ # Lo KATAKANA LETTER SMALL YA +30E4 ; ID # Lo KATAKANA LETTER YA +30E5 ; CJ # Lo KATAKANA LETTER SMALL YU +30E6 ; ID # Lo KATAKANA LETTER YU +30E7 ; CJ # Lo KATAKANA LETTER SMALL YO +30E8..30ED ; ID # Lo [6] KATAKANA LETTER YO..KATAKANA LETTER RO +30EE ; CJ # Lo KATAKANA LETTER SMALL WA +30EF..30F4 ; ID # Lo [6] KATAKANA LETTER WA..KATAKANA LETTER VU +30F5..30F6 ; CJ # Lo [2] KATAKANA LETTER SMALL KA..KATAKANA LETTER SMALL KE +30F7..30FA ; ID # Lo [4] KATAKANA LETTER VA..KATAKANA LETTER VO +30FB ; NS # Po KATAKANA MIDDLE DOT +30FC ; CJ # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +30FD..30FE ; NS # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK +30FF ; ID # Lo KATAKANA DIGRAPH KOTO +3105..312F ; ID # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; ID # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; ID # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; ID # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; ID # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BF ; ID # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH +31C0..31E3 ; ID # So [36] CJK STROKE T..CJK STROKE Q +31EF ; ID # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +31F0..31FF ; CJ # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E ; ID # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; ID # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; ID # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; AI # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; ID # So PARTNERSHIP SIGN +3251..325F ; ID # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F ; ID # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289 ; ID # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; ID # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; ID # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32FF ; ID # So [64] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE ERA NAME REIWA +3300..33FF ; ID # So [256] SQUARE APAATO..SQUARE GAL +3400..4DBF ; ID # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4DC0..4DFF ; AL # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +4E00..9FFF ; ID # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +A000..A014 ; ID # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; NS # Lm YI SYLLABLE WU +A016..A48C ; ID # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; ID # So [55] YI RADICAL QOT..YI RADICAL KE +A4D0..A4F7 ; AL # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; AL # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; BA # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B ; AL # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; AL # Lm VAI SYLLABLE LENGTHENER +A60D ; BA # Po VAI COMMA +A60E ; EX # Po VAI FULL STOP +A60F ; BA # Po VAI QUESTION MARK +A610..A61F ; AL # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; NU # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; AL # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; AL # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; AL # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; CM # Mn COMBINING CYRILLIC VZMET +A670..A672 ; CM # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; AL # Po SLAVONIC ASTERISK +A674..A67D ; CM # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; AL # Po CYRILLIC KAVYKA +A67F ; AL # Lm CYRILLIC PAYEROK +A680..A69B ; AL # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; AL # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; CM # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; AL # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; AL # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; CM # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2 ; AL # Po BAMUM NJAEMLI +A6F3..A6F7 ; BA # Po [5] BAMUM FULL STOP..BAMUM QUESTION MARK +A700..A716 ; AL # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; AL # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; AL # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F ; AL # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; AL # Lm MODIFIER LETTER US +A771..A787 ; AL # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; AL # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; AL # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B..A78E ; AL # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; AL # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; AL # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; AL # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; AL # Ll LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; AL # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; AL # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; AL # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; AL # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; AL # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; AL # Ll LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; AL # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +A800..A801 ; AL # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; CM # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; AL # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; CM # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; AL # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; CM # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; AL # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; CM # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; CM # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; CM # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; AL # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; CM # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A830..A835 ; AL # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; AL # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; PO # Sc NORTH INDIC RUPEE MARK +A839 ; AL # So NORTH INDIC QUANTITY MARK +A840..A873 ; AL # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A875 ; BB # Po [2] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA DOUBLE HEAD MARK +A876..A877 ; EX # Po [2] PHAGS-PA MARK SHAD..PHAGS-PA MARK DOUBLE SHAD +A880..A881 ; CM # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; AL # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; CM # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; CM # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; BA # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; NU # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; CM # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; AL # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; AL # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; AL # Lo DEVANAGARI HEADSTROKE +A8FC ; BB # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; AL # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; CM # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; NU # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; AL # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; CM # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F ; BA # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946 ; AL # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; CM # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; CM # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; AL # Po REJANG SECTION MARK +A960..A97C ; JL # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +A980..A982 ; CM # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; CM # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; AK # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; CM # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; CM # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; CM # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; CM # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; CM # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9BF ; CM # Mc [2] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE CONSONANT SIGN CAKRA +A9C0 ; VI # Mc JAVANESE PANGKON +A9C1..A9C6 ; ID # Po [6] JAVANESE LEFT RERENGGAN..JAVANESE PADA WINDU +A9C7..A9C9 ; BA # Po [3] JAVANESE PADA PANGKAT..JAVANESE PADA LUNGSI +A9CA..A9CD ; ID # Po [4] JAVANESE PADA ADEG..JAVANESE TURNED PADA PISELEH +A9CF ; BA # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; ID # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; ID # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4 ; SA # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; SA # Mn MYANMAR SIGN SHAN SAW +A9E6 ; SA # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; SA # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; NU # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; SA # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; AS # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; CM # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; CM # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; CM # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; CM # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; CM # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; BA # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; CM # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; BA # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; CM # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; CM # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; ID # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C ; ID # Po CHAM PUNCTUATION SPIRAL +AA5D..AA5F ; BA # Po [3] CHAM PUNCTUATION DANDA..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F ; SA # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; SA # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; SA # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; SA # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; SA # Lo MYANMAR LETTER AITON RA +AA7B ; SA # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; SA # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; SA # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F ; SA # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA +AA80..AAAF ; SA # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0 ; SA # Mn TAI VIET MAI KANG +AAB1 ; SA # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; SA # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; SA # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; SA # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; SA # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; SA # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; SA # Lo TAI VIET TONE MAI NUENG +AAC1 ; SA # Mn TAI VIET TONE MAI THO +AAC2 ; SA # Lo TAI VIET TONE MAI SONG +AADB..AADC ; SA # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; SA # Lm TAI VIET SYMBOL SAM +AADE..AADF ; SA # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA ; AL # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; CM # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; CM # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; CM # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; BA # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; AL # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; AL # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; CM # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; CM # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; AL # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; AL # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; AL # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; AL # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; AL # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; AL # Ll [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; AL # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; AL # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB68 ; AL # Ll [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; AL # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; AL # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB70..ABBF ; AL # Ll [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; AL # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; CM # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; CM # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; CM # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; CM # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; CM # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; BA # Po MEETEI MAYEK CHEIKHEI +ABEC ; CM # Mc MEETEI MAYEK LUM IYEK +ABED ; CM # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; NU # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +AC00 ; H2 # Lo HANGUL SYLLABLE GA +AC01..AC1B ; H3 # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH +AC1C ; H2 # Lo HANGUL SYLLABLE GAE +AC1D..AC37 ; H3 # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH +AC38 ; H2 # Lo HANGUL SYLLABLE GYA +AC39..AC53 ; H3 # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH +AC54 ; H2 # Lo HANGUL SYLLABLE GYAE +AC55..AC6F ; H3 # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH +AC70 ; H2 # Lo HANGUL SYLLABLE GEO +AC71..AC8B ; H3 # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH +AC8C ; H2 # Lo HANGUL SYLLABLE GE +AC8D..ACA7 ; H3 # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH +ACA8 ; H2 # Lo HANGUL SYLLABLE GYEO +ACA9..ACC3 ; H3 # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH +ACC4 ; H2 # Lo HANGUL SYLLABLE GYE +ACC5..ACDF ; H3 # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH +ACE0 ; H2 # Lo HANGUL SYLLABLE GO +ACE1..ACFB ; H3 # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH +ACFC ; H2 # Lo HANGUL SYLLABLE GWA +ACFD..AD17 ; H3 # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH +AD18 ; H2 # Lo HANGUL SYLLABLE GWAE +AD19..AD33 ; H3 # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH +AD34 ; H2 # Lo HANGUL SYLLABLE GOE +AD35..AD4F ; H3 # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH +AD50 ; H2 # Lo HANGUL SYLLABLE GYO +AD51..AD6B ; H3 # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH +AD6C ; H2 # Lo HANGUL SYLLABLE GU +AD6D..AD87 ; H3 # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH +AD88 ; H2 # Lo HANGUL SYLLABLE GWEO +AD89..ADA3 ; H3 # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH +ADA4 ; H2 # Lo HANGUL SYLLABLE GWE +ADA5..ADBF ; H3 # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH +ADC0 ; H2 # Lo HANGUL SYLLABLE GWI +ADC1..ADDB ; H3 # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH +ADDC ; H2 # Lo HANGUL SYLLABLE GYU +ADDD..ADF7 ; H3 # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH +ADF8 ; H2 # Lo HANGUL SYLLABLE GEU +ADF9..AE13 ; H3 # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH +AE14 ; H2 # Lo HANGUL SYLLABLE GYI +AE15..AE2F ; H3 # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH +AE30 ; H2 # Lo HANGUL SYLLABLE GI +AE31..AE4B ; H3 # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH +AE4C ; H2 # Lo HANGUL SYLLABLE GGA +AE4D..AE67 ; H3 # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH +AE68 ; H2 # Lo HANGUL SYLLABLE GGAE +AE69..AE83 ; H3 # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH +AE84 ; H2 # Lo HANGUL SYLLABLE GGYA +AE85..AE9F ; H3 # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH +AEA0 ; H2 # Lo HANGUL SYLLABLE GGYAE +AEA1..AEBB ; H3 # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH +AEBC ; H2 # Lo HANGUL SYLLABLE GGEO +AEBD..AED7 ; H3 # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH +AED8 ; H2 # Lo HANGUL SYLLABLE GGE +AED9..AEF3 ; H3 # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH +AEF4 ; H2 # Lo HANGUL SYLLABLE GGYEO +AEF5..AF0F ; H3 # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH +AF10 ; H2 # Lo HANGUL SYLLABLE GGYE +AF11..AF2B ; H3 # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH +AF2C ; H2 # Lo HANGUL SYLLABLE GGO +AF2D..AF47 ; H3 # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH +AF48 ; H2 # Lo HANGUL SYLLABLE GGWA +AF49..AF63 ; H3 # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH +AF64 ; H2 # Lo HANGUL SYLLABLE GGWAE +AF65..AF7F ; H3 # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH +AF80 ; H2 # Lo HANGUL SYLLABLE GGOE +AF81..AF9B ; H3 # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH +AF9C ; H2 # Lo HANGUL SYLLABLE GGYO +AF9D..AFB7 ; H3 # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH +AFB8 ; H2 # Lo HANGUL SYLLABLE GGU +AFB9..AFD3 ; H3 # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH +AFD4 ; H2 # Lo HANGUL SYLLABLE GGWEO +AFD5..AFEF ; H3 # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH +AFF0 ; H2 # Lo HANGUL SYLLABLE GGWE +AFF1..B00B ; H3 # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH +B00C ; H2 # Lo HANGUL SYLLABLE GGWI +B00D..B027 ; H3 # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH +B028 ; H2 # Lo HANGUL SYLLABLE GGYU +B029..B043 ; H3 # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH +B044 ; H2 # Lo HANGUL SYLLABLE GGEU +B045..B05F ; H3 # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH +B060 ; H2 # Lo HANGUL SYLLABLE GGYI +B061..B07B ; H3 # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH +B07C ; H2 # Lo HANGUL SYLLABLE GGI +B07D..B097 ; H3 # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH +B098 ; H2 # Lo HANGUL SYLLABLE NA +B099..B0B3 ; H3 # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH +B0B4 ; H2 # Lo HANGUL SYLLABLE NAE +B0B5..B0CF ; H3 # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH +B0D0 ; H2 # Lo HANGUL SYLLABLE NYA +B0D1..B0EB ; H3 # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH +B0EC ; H2 # Lo HANGUL SYLLABLE NYAE +B0ED..B107 ; H3 # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH +B108 ; H2 # Lo HANGUL SYLLABLE NEO +B109..B123 ; H3 # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH +B124 ; H2 # Lo HANGUL SYLLABLE NE +B125..B13F ; H3 # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH +B140 ; H2 # Lo HANGUL SYLLABLE NYEO +B141..B15B ; H3 # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH +B15C ; H2 # Lo HANGUL SYLLABLE NYE +B15D..B177 ; H3 # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH +B178 ; H2 # Lo HANGUL SYLLABLE NO +B179..B193 ; H3 # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH +B194 ; H2 # Lo HANGUL SYLLABLE NWA +B195..B1AF ; H3 # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH +B1B0 ; H2 # Lo HANGUL SYLLABLE NWAE +B1B1..B1CB ; H3 # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH +B1CC ; H2 # Lo HANGUL SYLLABLE NOE +B1CD..B1E7 ; H3 # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH +B1E8 ; H2 # Lo HANGUL SYLLABLE NYO +B1E9..B203 ; H3 # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH +B204 ; H2 # Lo HANGUL SYLLABLE NU +B205..B21F ; H3 # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH +B220 ; H2 # Lo HANGUL SYLLABLE NWEO +B221..B23B ; H3 # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH +B23C ; H2 # Lo HANGUL SYLLABLE NWE +B23D..B257 ; H3 # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH +B258 ; H2 # Lo HANGUL SYLLABLE NWI +B259..B273 ; H3 # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH +B274 ; H2 # Lo HANGUL SYLLABLE NYU +B275..B28F ; H3 # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH +B290 ; H2 # Lo HANGUL SYLLABLE NEU +B291..B2AB ; H3 # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH +B2AC ; H2 # Lo HANGUL SYLLABLE NYI +B2AD..B2C7 ; H3 # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH +B2C8 ; H2 # Lo HANGUL SYLLABLE NI +B2C9..B2E3 ; H3 # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH +B2E4 ; H2 # Lo HANGUL SYLLABLE DA +B2E5..B2FF ; H3 # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH +B300 ; H2 # Lo HANGUL SYLLABLE DAE +B301..B31B ; H3 # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH +B31C ; H2 # Lo HANGUL SYLLABLE DYA +B31D..B337 ; H3 # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH +B338 ; H2 # Lo HANGUL SYLLABLE DYAE +B339..B353 ; H3 # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH +B354 ; H2 # Lo HANGUL SYLLABLE DEO +B355..B36F ; H3 # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH +B370 ; H2 # Lo HANGUL SYLLABLE DE +B371..B38B ; H3 # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH +B38C ; H2 # Lo HANGUL SYLLABLE DYEO +B38D..B3A7 ; H3 # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH +B3A8 ; H2 # Lo HANGUL SYLLABLE DYE +B3A9..B3C3 ; H3 # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH +B3C4 ; H2 # Lo HANGUL SYLLABLE DO +B3C5..B3DF ; H3 # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH +B3E0 ; H2 # Lo HANGUL SYLLABLE DWA +B3E1..B3FB ; H3 # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH +B3FC ; H2 # Lo HANGUL SYLLABLE DWAE +B3FD..B417 ; H3 # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH +B418 ; H2 # Lo HANGUL SYLLABLE DOE +B419..B433 ; H3 # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH +B434 ; H2 # Lo HANGUL SYLLABLE DYO +B435..B44F ; H3 # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH +B450 ; H2 # Lo HANGUL SYLLABLE DU +B451..B46B ; H3 # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH +B46C ; H2 # Lo HANGUL SYLLABLE DWEO +B46D..B487 ; H3 # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH +B488 ; H2 # Lo HANGUL SYLLABLE DWE +B489..B4A3 ; H3 # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH +B4A4 ; H2 # Lo HANGUL SYLLABLE DWI +B4A5..B4BF ; H3 # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH +B4C0 ; H2 # Lo HANGUL SYLLABLE DYU +B4C1..B4DB ; H3 # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH +B4DC ; H2 # Lo HANGUL SYLLABLE DEU +B4DD..B4F7 ; H3 # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH +B4F8 ; H2 # Lo HANGUL SYLLABLE DYI +B4F9..B513 ; H3 # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH +B514 ; H2 # Lo HANGUL SYLLABLE DI +B515..B52F ; H3 # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH +B530 ; H2 # Lo HANGUL SYLLABLE DDA +B531..B54B ; H3 # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH +B54C ; H2 # Lo HANGUL SYLLABLE DDAE +B54D..B567 ; H3 # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH +B568 ; H2 # Lo HANGUL SYLLABLE DDYA +B569..B583 ; H3 # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH +B584 ; H2 # Lo HANGUL SYLLABLE DDYAE +B585..B59F ; H3 # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH +B5A0 ; H2 # Lo HANGUL SYLLABLE DDEO +B5A1..B5BB ; H3 # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH +B5BC ; H2 # Lo HANGUL SYLLABLE DDE +B5BD..B5D7 ; H3 # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH +B5D8 ; H2 # Lo HANGUL SYLLABLE DDYEO +B5D9..B5F3 ; H3 # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH +B5F4 ; H2 # Lo HANGUL SYLLABLE DDYE +B5F5..B60F ; H3 # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH +B610 ; H2 # Lo HANGUL SYLLABLE DDO +B611..B62B ; H3 # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH +B62C ; H2 # Lo HANGUL SYLLABLE DDWA +B62D..B647 ; H3 # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH +B648 ; H2 # Lo HANGUL SYLLABLE DDWAE +B649..B663 ; H3 # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH +B664 ; H2 # Lo HANGUL SYLLABLE DDOE +B665..B67F ; H3 # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH +B680 ; H2 # Lo HANGUL SYLLABLE DDYO +B681..B69B ; H3 # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH +B69C ; H2 # Lo HANGUL SYLLABLE DDU +B69D..B6B7 ; H3 # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH +B6B8 ; H2 # Lo HANGUL SYLLABLE DDWEO +B6B9..B6D3 ; H3 # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH +B6D4 ; H2 # Lo HANGUL SYLLABLE DDWE +B6D5..B6EF ; H3 # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH +B6F0 ; H2 # Lo HANGUL SYLLABLE DDWI +B6F1..B70B ; H3 # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH +B70C ; H2 # Lo HANGUL SYLLABLE DDYU +B70D..B727 ; H3 # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH +B728 ; H2 # Lo HANGUL SYLLABLE DDEU +B729..B743 ; H3 # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH +B744 ; H2 # Lo HANGUL SYLLABLE DDYI +B745..B75F ; H3 # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH +B760 ; H2 # Lo HANGUL SYLLABLE DDI +B761..B77B ; H3 # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH +B77C ; H2 # Lo HANGUL SYLLABLE RA +B77D..B797 ; H3 # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH +B798 ; H2 # Lo HANGUL SYLLABLE RAE +B799..B7B3 ; H3 # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH +B7B4 ; H2 # Lo HANGUL SYLLABLE RYA +B7B5..B7CF ; H3 # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH +B7D0 ; H2 # Lo HANGUL SYLLABLE RYAE +B7D1..B7EB ; H3 # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH +B7EC ; H2 # Lo HANGUL SYLLABLE REO +B7ED..B807 ; H3 # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH +B808 ; H2 # Lo HANGUL SYLLABLE RE +B809..B823 ; H3 # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH +B824 ; H2 # Lo HANGUL SYLLABLE RYEO +B825..B83F ; H3 # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH +B840 ; H2 # Lo HANGUL SYLLABLE RYE +B841..B85B ; H3 # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH +B85C ; H2 # Lo HANGUL SYLLABLE RO +B85D..B877 ; H3 # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH +B878 ; H2 # Lo HANGUL SYLLABLE RWA +B879..B893 ; H3 # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH +B894 ; H2 # Lo HANGUL SYLLABLE RWAE +B895..B8AF ; H3 # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH +B8B0 ; H2 # Lo HANGUL SYLLABLE ROE +B8B1..B8CB ; H3 # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH +B8CC ; H2 # Lo HANGUL SYLLABLE RYO +B8CD..B8E7 ; H3 # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH +B8E8 ; H2 # Lo HANGUL SYLLABLE RU +B8E9..B903 ; H3 # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH +B904 ; H2 # Lo HANGUL SYLLABLE RWEO +B905..B91F ; H3 # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH +B920 ; H2 # Lo HANGUL SYLLABLE RWE +B921..B93B ; H3 # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH +B93C ; H2 # Lo HANGUL SYLLABLE RWI +B93D..B957 ; H3 # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH +B958 ; H2 # Lo HANGUL SYLLABLE RYU +B959..B973 ; H3 # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH +B974 ; H2 # Lo HANGUL SYLLABLE REU +B975..B98F ; H3 # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH +B990 ; H2 # Lo HANGUL SYLLABLE RYI +B991..B9AB ; H3 # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH +B9AC ; H2 # Lo HANGUL SYLLABLE RI +B9AD..B9C7 ; H3 # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH +B9C8 ; H2 # Lo HANGUL SYLLABLE MA +B9C9..B9E3 ; H3 # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH +B9E4 ; H2 # Lo HANGUL SYLLABLE MAE +B9E5..B9FF ; H3 # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH +BA00 ; H2 # Lo HANGUL SYLLABLE MYA +BA01..BA1B ; H3 # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH +BA1C ; H2 # Lo HANGUL SYLLABLE MYAE +BA1D..BA37 ; H3 # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH +BA38 ; H2 # Lo HANGUL SYLLABLE MEO +BA39..BA53 ; H3 # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH +BA54 ; H2 # Lo HANGUL SYLLABLE ME +BA55..BA6F ; H3 # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH +BA70 ; H2 # Lo HANGUL SYLLABLE MYEO +BA71..BA8B ; H3 # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH +BA8C ; H2 # Lo HANGUL SYLLABLE MYE +BA8D..BAA7 ; H3 # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH +BAA8 ; H2 # Lo HANGUL SYLLABLE MO +BAA9..BAC3 ; H3 # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH +BAC4 ; H2 # Lo HANGUL SYLLABLE MWA +BAC5..BADF ; H3 # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH +BAE0 ; H2 # Lo HANGUL SYLLABLE MWAE +BAE1..BAFB ; H3 # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH +BAFC ; H2 # Lo HANGUL SYLLABLE MOE +BAFD..BB17 ; H3 # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH +BB18 ; H2 # Lo HANGUL SYLLABLE MYO +BB19..BB33 ; H3 # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH +BB34 ; H2 # Lo HANGUL SYLLABLE MU +BB35..BB4F ; H3 # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH +BB50 ; H2 # Lo HANGUL SYLLABLE MWEO +BB51..BB6B ; H3 # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH +BB6C ; H2 # Lo HANGUL SYLLABLE MWE +BB6D..BB87 ; H3 # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH +BB88 ; H2 # Lo HANGUL SYLLABLE MWI +BB89..BBA3 ; H3 # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH +BBA4 ; H2 # Lo HANGUL SYLLABLE MYU +BBA5..BBBF ; H3 # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH +BBC0 ; H2 # Lo HANGUL SYLLABLE MEU +BBC1..BBDB ; H3 # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH +BBDC ; H2 # Lo HANGUL SYLLABLE MYI +BBDD..BBF7 ; H3 # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH +BBF8 ; H2 # Lo HANGUL SYLLABLE MI +BBF9..BC13 ; H3 # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH +BC14 ; H2 # Lo HANGUL SYLLABLE BA +BC15..BC2F ; H3 # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH +BC30 ; H2 # Lo HANGUL SYLLABLE BAE +BC31..BC4B ; H3 # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH +BC4C ; H2 # Lo HANGUL SYLLABLE BYA +BC4D..BC67 ; H3 # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH +BC68 ; H2 # Lo HANGUL SYLLABLE BYAE +BC69..BC83 ; H3 # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH +BC84 ; H2 # Lo HANGUL SYLLABLE BEO +BC85..BC9F ; H3 # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH +BCA0 ; H2 # Lo HANGUL SYLLABLE BE +BCA1..BCBB ; H3 # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH +BCBC ; H2 # Lo HANGUL SYLLABLE BYEO +BCBD..BCD7 ; H3 # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH +BCD8 ; H2 # Lo HANGUL SYLLABLE BYE +BCD9..BCF3 ; H3 # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH +BCF4 ; H2 # Lo HANGUL SYLLABLE BO +BCF5..BD0F ; H3 # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH +BD10 ; H2 # Lo HANGUL SYLLABLE BWA +BD11..BD2B ; H3 # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH +BD2C ; H2 # Lo HANGUL SYLLABLE BWAE +BD2D..BD47 ; H3 # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH +BD48 ; H2 # Lo HANGUL SYLLABLE BOE +BD49..BD63 ; H3 # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH +BD64 ; H2 # Lo HANGUL SYLLABLE BYO +BD65..BD7F ; H3 # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH +BD80 ; H2 # Lo HANGUL SYLLABLE BU +BD81..BD9B ; H3 # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH +BD9C ; H2 # Lo HANGUL SYLLABLE BWEO +BD9D..BDB7 ; H3 # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH +BDB8 ; H2 # Lo HANGUL SYLLABLE BWE +BDB9..BDD3 ; H3 # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH +BDD4 ; H2 # Lo HANGUL SYLLABLE BWI +BDD5..BDEF ; H3 # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH +BDF0 ; H2 # Lo HANGUL SYLLABLE BYU +BDF1..BE0B ; H3 # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH +BE0C ; H2 # Lo HANGUL SYLLABLE BEU +BE0D..BE27 ; H3 # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH +BE28 ; H2 # Lo HANGUL SYLLABLE BYI +BE29..BE43 ; H3 # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH +BE44 ; H2 # Lo HANGUL SYLLABLE BI +BE45..BE5F ; H3 # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH +BE60 ; H2 # Lo HANGUL SYLLABLE BBA +BE61..BE7B ; H3 # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH +BE7C ; H2 # Lo HANGUL SYLLABLE BBAE +BE7D..BE97 ; H3 # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH +BE98 ; H2 # Lo HANGUL SYLLABLE BBYA +BE99..BEB3 ; H3 # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH +BEB4 ; H2 # Lo HANGUL SYLLABLE BBYAE +BEB5..BECF ; H3 # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH +BED0 ; H2 # Lo HANGUL SYLLABLE BBEO +BED1..BEEB ; H3 # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH +BEEC ; H2 # Lo HANGUL SYLLABLE BBE +BEED..BF07 ; H3 # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH +BF08 ; H2 # Lo HANGUL SYLLABLE BBYEO +BF09..BF23 ; H3 # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH +BF24 ; H2 # Lo HANGUL SYLLABLE BBYE +BF25..BF3F ; H3 # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH +BF40 ; H2 # Lo HANGUL SYLLABLE BBO +BF41..BF5B ; H3 # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH +BF5C ; H2 # Lo HANGUL SYLLABLE BBWA +BF5D..BF77 ; H3 # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH +BF78 ; H2 # Lo HANGUL SYLLABLE BBWAE +BF79..BF93 ; H3 # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH +BF94 ; H2 # Lo HANGUL SYLLABLE BBOE +BF95..BFAF ; H3 # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH +BFB0 ; H2 # Lo HANGUL SYLLABLE BBYO +BFB1..BFCB ; H3 # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH +BFCC ; H2 # Lo HANGUL SYLLABLE BBU +BFCD..BFE7 ; H3 # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH +BFE8 ; H2 # Lo HANGUL SYLLABLE BBWEO +BFE9..C003 ; H3 # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH +C004 ; H2 # Lo HANGUL SYLLABLE BBWE +C005..C01F ; H3 # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH +C020 ; H2 # Lo HANGUL SYLLABLE BBWI +C021..C03B ; H3 # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH +C03C ; H2 # Lo HANGUL SYLLABLE BBYU +C03D..C057 ; H3 # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH +C058 ; H2 # Lo HANGUL SYLLABLE BBEU +C059..C073 ; H3 # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH +C074 ; H2 # Lo HANGUL SYLLABLE BBYI +C075..C08F ; H3 # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH +C090 ; H2 # Lo HANGUL SYLLABLE BBI +C091..C0AB ; H3 # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH +C0AC ; H2 # Lo HANGUL SYLLABLE SA +C0AD..C0C7 ; H3 # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH +C0C8 ; H2 # Lo HANGUL SYLLABLE SAE +C0C9..C0E3 ; H3 # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH +C0E4 ; H2 # Lo HANGUL SYLLABLE SYA +C0E5..C0FF ; H3 # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH +C100 ; H2 # Lo HANGUL SYLLABLE SYAE +C101..C11B ; H3 # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH +C11C ; H2 # Lo HANGUL SYLLABLE SEO +C11D..C137 ; H3 # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH +C138 ; H2 # Lo HANGUL SYLLABLE SE +C139..C153 ; H3 # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH +C154 ; H2 # Lo HANGUL SYLLABLE SYEO +C155..C16F ; H3 # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH +C170 ; H2 # Lo HANGUL SYLLABLE SYE +C171..C18B ; H3 # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH +C18C ; H2 # Lo HANGUL SYLLABLE SO +C18D..C1A7 ; H3 # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH +C1A8 ; H2 # Lo HANGUL SYLLABLE SWA +C1A9..C1C3 ; H3 # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH +C1C4 ; H2 # Lo HANGUL SYLLABLE SWAE +C1C5..C1DF ; H3 # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH +C1E0 ; H2 # Lo HANGUL SYLLABLE SOE +C1E1..C1FB ; H3 # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH +C1FC ; H2 # Lo HANGUL SYLLABLE SYO +C1FD..C217 ; H3 # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH +C218 ; H2 # Lo HANGUL SYLLABLE SU +C219..C233 ; H3 # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH +C234 ; H2 # Lo HANGUL SYLLABLE SWEO +C235..C24F ; H3 # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH +C250 ; H2 # Lo HANGUL SYLLABLE SWE +C251..C26B ; H3 # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH +C26C ; H2 # Lo HANGUL SYLLABLE SWI +C26D..C287 ; H3 # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH +C288 ; H2 # Lo HANGUL SYLLABLE SYU +C289..C2A3 ; H3 # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH +C2A4 ; H2 # Lo HANGUL SYLLABLE SEU +C2A5..C2BF ; H3 # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH +C2C0 ; H2 # Lo HANGUL SYLLABLE SYI +C2C1..C2DB ; H3 # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH +C2DC ; H2 # Lo HANGUL SYLLABLE SI +C2DD..C2F7 ; H3 # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH +C2F8 ; H2 # Lo HANGUL SYLLABLE SSA +C2F9..C313 ; H3 # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH +C314 ; H2 # Lo HANGUL SYLLABLE SSAE +C315..C32F ; H3 # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH +C330 ; H2 # Lo HANGUL SYLLABLE SSYA +C331..C34B ; H3 # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH +C34C ; H2 # Lo HANGUL SYLLABLE SSYAE +C34D..C367 ; H3 # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH +C368 ; H2 # Lo HANGUL SYLLABLE SSEO +C369..C383 ; H3 # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH +C384 ; H2 # Lo HANGUL SYLLABLE SSE +C385..C39F ; H3 # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH +C3A0 ; H2 # Lo HANGUL SYLLABLE SSYEO +C3A1..C3BB ; H3 # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH +C3BC ; H2 # Lo HANGUL SYLLABLE SSYE +C3BD..C3D7 ; H3 # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH +C3D8 ; H2 # Lo HANGUL SYLLABLE SSO +C3D9..C3F3 ; H3 # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH +C3F4 ; H2 # Lo HANGUL SYLLABLE SSWA +C3F5..C40F ; H3 # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH +C410 ; H2 # Lo HANGUL SYLLABLE SSWAE +C411..C42B ; H3 # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH +C42C ; H2 # Lo HANGUL SYLLABLE SSOE +C42D..C447 ; H3 # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH +C448 ; H2 # Lo HANGUL SYLLABLE SSYO +C449..C463 ; H3 # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH +C464 ; H2 # Lo HANGUL SYLLABLE SSU +C465..C47F ; H3 # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH +C480 ; H2 # Lo HANGUL SYLLABLE SSWEO +C481..C49B ; H3 # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH +C49C ; H2 # Lo HANGUL SYLLABLE SSWE +C49D..C4B7 ; H3 # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH +C4B8 ; H2 # Lo HANGUL SYLLABLE SSWI +C4B9..C4D3 ; H3 # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH +C4D4 ; H2 # Lo HANGUL SYLLABLE SSYU +C4D5..C4EF ; H3 # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH +C4F0 ; H2 # Lo HANGUL SYLLABLE SSEU +C4F1..C50B ; H3 # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH +C50C ; H2 # Lo HANGUL SYLLABLE SSYI +C50D..C527 ; H3 # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH +C528 ; H2 # Lo HANGUL SYLLABLE SSI +C529..C543 ; H3 # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH +C544 ; H2 # Lo HANGUL SYLLABLE A +C545..C55F ; H3 # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH +C560 ; H2 # Lo HANGUL SYLLABLE AE +C561..C57B ; H3 # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH +C57C ; H2 # Lo HANGUL SYLLABLE YA +C57D..C597 ; H3 # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH +C598 ; H2 # Lo HANGUL SYLLABLE YAE +C599..C5B3 ; H3 # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH +C5B4 ; H2 # Lo HANGUL SYLLABLE EO +C5B5..C5CF ; H3 # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH +C5D0 ; H2 # Lo HANGUL SYLLABLE E +C5D1..C5EB ; H3 # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH +C5EC ; H2 # Lo HANGUL SYLLABLE YEO +C5ED..C607 ; H3 # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH +C608 ; H2 # Lo HANGUL SYLLABLE YE +C609..C623 ; H3 # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH +C624 ; H2 # Lo HANGUL SYLLABLE O +C625..C63F ; H3 # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH +C640 ; H2 # Lo HANGUL SYLLABLE WA +C641..C65B ; H3 # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH +C65C ; H2 # Lo HANGUL SYLLABLE WAE +C65D..C677 ; H3 # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH +C678 ; H2 # Lo HANGUL SYLLABLE OE +C679..C693 ; H3 # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH +C694 ; H2 # Lo HANGUL SYLLABLE YO +C695..C6AF ; H3 # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH +C6B0 ; H2 # Lo HANGUL SYLLABLE U +C6B1..C6CB ; H3 # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH +C6CC ; H2 # Lo HANGUL SYLLABLE WEO +C6CD..C6E7 ; H3 # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH +C6E8 ; H2 # Lo HANGUL SYLLABLE WE +C6E9..C703 ; H3 # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH +C704 ; H2 # Lo HANGUL SYLLABLE WI +C705..C71F ; H3 # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH +C720 ; H2 # Lo HANGUL SYLLABLE YU +C721..C73B ; H3 # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH +C73C ; H2 # Lo HANGUL SYLLABLE EU +C73D..C757 ; H3 # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH +C758 ; H2 # Lo HANGUL SYLLABLE YI +C759..C773 ; H3 # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH +C774 ; H2 # Lo HANGUL SYLLABLE I +C775..C78F ; H3 # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH +C790 ; H2 # Lo HANGUL SYLLABLE JA +C791..C7AB ; H3 # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH +C7AC ; H2 # Lo HANGUL SYLLABLE JAE +C7AD..C7C7 ; H3 # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH +C7C8 ; H2 # Lo HANGUL SYLLABLE JYA +C7C9..C7E3 ; H3 # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH +C7E4 ; H2 # Lo HANGUL SYLLABLE JYAE +C7E5..C7FF ; H3 # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH +C800 ; H2 # Lo HANGUL SYLLABLE JEO +C801..C81B ; H3 # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH +C81C ; H2 # Lo HANGUL SYLLABLE JE +C81D..C837 ; H3 # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH +C838 ; H2 # Lo HANGUL SYLLABLE JYEO +C839..C853 ; H3 # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH +C854 ; H2 # Lo HANGUL SYLLABLE JYE +C855..C86F ; H3 # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH +C870 ; H2 # Lo HANGUL SYLLABLE JO +C871..C88B ; H3 # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH +C88C ; H2 # Lo HANGUL SYLLABLE JWA +C88D..C8A7 ; H3 # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH +C8A8 ; H2 # Lo HANGUL SYLLABLE JWAE +C8A9..C8C3 ; H3 # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH +C8C4 ; H2 # Lo HANGUL SYLLABLE JOE +C8C5..C8DF ; H3 # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH +C8E0 ; H2 # Lo HANGUL SYLLABLE JYO +C8E1..C8FB ; H3 # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH +C8FC ; H2 # Lo HANGUL SYLLABLE JU +C8FD..C917 ; H3 # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH +C918 ; H2 # Lo HANGUL SYLLABLE JWEO +C919..C933 ; H3 # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH +C934 ; H2 # Lo HANGUL SYLLABLE JWE +C935..C94F ; H3 # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH +C950 ; H2 # Lo HANGUL SYLLABLE JWI +C951..C96B ; H3 # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH +C96C ; H2 # Lo HANGUL SYLLABLE JYU +C96D..C987 ; H3 # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH +C988 ; H2 # Lo HANGUL SYLLABLE JEU +C989..C9A3 ; H3 # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH +C9A4 ; H2 # Lo HANGUL SYLLABLE JYI +C9A5..C9BF ; H3 # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH +C9C0 ; H2 # Lo HANGUL SYLLABLE JI +C9C1..C9DB ; H3 # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH +C9DC ; H2 # Lo HANGUL SYLLABLE JJA +C9DD..C9F7 ; H3 # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH +C9F8 ; H2 # Lo HANGUL SYLLABLE JJAE +C9F9..CA13 ; H3 # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH +CA14 ; H2 # Lo HANGUL SYLLABLE JJYA +CA15..CA2F ; H3 # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH +CA30 ; H2 # Lo HANGUL SYLLABLE JJYAE +CA31..CA4B ; H3 # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH +CA4C ; H2 # Lo HANGUL SYLLABLE JJEO +CA4D..CA67 ; H3 # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH +CA68 ; H2 # Lo HANGUL SYLLABLE JJE +CA69..CA83 ; H3 # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH +CA84 ; H2 # Lo HANGUL SYLLABLE JJYEO +CA85..CA9F ; H3 # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH +CAA0 ; H2 # Lo HANGUL SYLLABLE JJYE +CAA1..CABB ; H3 # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH +CABC ; H2 # Lo HANGUL SYLLABLE JJO +CABD..CAD7 ; H3 # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH +CAD8 ; H2 # Lo HANGUL SYLLABLE JJWA +CAD9..CAF3 ; H3 # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH +CAF4 ; H2 # Lo HANGUL SYLLABLE JJWAE +CAF5..CB0F ; H3 # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH +CB10 ; H2 # Lo HANGUL SYLLABLE JJOE +CB11..CB2B ; H3 # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH +CB2C ; H2 # Lo HANGUL SYLLABLE JJYO +CB2D..CB47 ; H3 # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH +CB48 ; H2 # Lo HANGUL SYLLABLE JJU +CB49..CB63 ; H3 # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH +CB64 ; H2 # Lo HANGUL SYLLABLE JJWEO +CB65..CB7F ; H3 # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH +CB80 ; H2 # Lo HANGUL SYLLABLE JJWE +CB81..CB9B ; H3 # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH +CB9C ; H2 # Lo HANGUL SYLLABLE JJWI +CB9D..CBB7 ; H3 # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH +CBB8 ; H2 # Lo HANGUL SYLLABLE JJYU +CBB9..CBD3 ; H3 # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH +CBD4 ; H2 # Lo HANGUL SYLLABLE JJEU +CBD5..CBEF ; H3 # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH +CBF0 ; H2 # Lo HANGUL SYLLABLE JJYI +CBF1..CC0B ; H3 # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH +CC0C ; H2 # Lo HANGUL SYLLABLE JJI +CC0D..CC27 ; H3 # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH +CC28 ; H2 # Lo HANGUL SYLLABLE CA +CC29..CC43 ; H3 # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH +CC44 ; H2 # Lo HANGUL SYLLABLE CAE +CC45..CC5F ; H3 # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH +CC60 ; H2 # Lo HANGUL SYLLABLE CYA +CC61..CC7B ; H3 # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH +CC7C ; H2 # Lo HANGUL SYLLABLE CYAE +CC7D..CC97 ; H3 # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH +CC98 ; H2 # Lo HANGUL SYLLABLE CEO +CC99..CCB3 ; H3 # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH +CCB4 ; H2 # Lo HANGUL SYLLABLE CE +CCB5..CCCF ; H3 # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH +CCD0 ; H2 # Lo HANGUL SYLLABLE CYEO +CCD1..CCEB ; H3 # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH +CCEC ; H2 # Lo HANGUL SYLLABLE CYE +CCED..CD07 ; H3 # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH +CD08 ; H2 # Lo HANGUL SYLLABLE CO +CD09..CD23 ; H3 # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH +CD24 ; H2 # Lo HANGUL SYLLABLE CWA +CD25..CD3F ; H3 # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH +CD40 ; H2 # Lo HANGUL SYLLABLE CWAE +CD41..CD5B ; H3 # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH +CD5C ; H2 # Lo HANGUL SYLLABLE COE +CD5D..CD77 ; H3 # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH +CD78 ; H2 # Lo HANGUL SYLLABLE CYO +CD79..CD93 ; H3 # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH +CD94 ; H2 # Lo HANGUL SYLLABLE CU +CD95..CDAF ; H3 # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH +CDB0 ; H2 # Lo HANGUL SYLLABLE CWEO +CDB1..CDCB ; H3 # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH +CDCC ; H2 # Lo HANGUL SYLLABLE CWE +CDCD..CDE7 ; H3 # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH +CDE8 ; H2 # Lo HANGUL SYLLABLE CWI +CDE9..CE03 ; H3 # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH +CE04 ; H2 # Lo HANGUL SYLLABLE CYU +CE05..CE1F ; H3 # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH +CE20 ; H2 # Lo HANGUL SYLLABLE CEU +CE21..CE3B ; H3 # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH +CE3C ; H2 # Lo HANGUL SYLLABLE CYI +CE3D..CE57 ; H3 # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH +CE58 ; H2 # Lo HANGUL SYLLABLE CI +CE59..CE73 ; H3 # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH +CE74 ; H2 # Lo HANGUL SYLLABLE KA +CE75..CE8F ; H3 # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH +CE90 ; H2 # Lo HANGUL SYLLABLE KAE +CE91..CEAB ; H3 # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH +CEAC ; H2 # Lo HANGUL SYLLABLE KYA +CEAD..CEC7 ; H3 # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH +CEC8 ; H2 # Lo HANGUL SYLLABLE KYAE +CEC9..CEE3 ; H3 # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH +CEE4 ; H2 # Lo HANGUL SYLLABLE KEO +CEE5..CEFF ; H3 # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH +CF00 ; H2 # Lo HANGUL SYLLABLE KE +CF01..CF1B ; H3 # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH +CF1C ; H2 # Lo HANGUL SYLLABLE KYEO +CF1D..CF37 ; H3 # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH +CF38 ; H2 # Lo HANGUL SYLLABLE KYE +CF39..CF53 ; H3 # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH +CF54 ; H2 # Lo HANGUL SYLLABLE KO +CF55..CF6F ; H3 # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH +CF70 ; H2 # Lo HANGUL SYLLABLE KWA +CF71..CF8B ; H3 # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH +CF8C ; H2 # Lo HANGUL SYLLABLE KWAE +CF8D..CFA7 ; H3 # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH +CFA8 ; H2 # Lo HANGUL SYLLABLE KOE +CFA9..CFC3 ; H3 # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH +CFC4 ; H2 # Lo HANGUL SYLLABLE KYO +CFC5..CFDF ; H3 # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH +CFE0 ; H2 # Lo HANGUL SYLLABLE KU +CFE1..CFFB ; H3 # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH +CFFC ; H2 # Lo HANGUL SYLLABLE KWEO +CFFD..D017 ; H3 # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH +D018 ; H2 # Lo HANGUL SYLLABLE KWE +D019..D033 ; H3 # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH +D034 ; H2 # Lo HANGUL SYLLABLE KWI +D035..D04F ; H3 # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH +D050 ; H2 # Lo HANGUL SYLLABLE KYU +D051..D06B ; H3 # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH +D06C ; H2 # Lo HANGUL SYLLABLE KEU +D06D..D087 ; H3 # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH +D088 ; H2 # Lo HANGUL SYLLABLE KYI +D089..D0A3 ; H3 # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH +D0A4 ; H2 # Lo HANGUL SYLLABLE KI +D0A5..D0BF ; H3 # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH +D0C0 ; H2 # Lo HANGUL SYLLABLE TA +D0C1..D0DB ; H3 # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH +D0DC ; H2 # Lo HANGUL SYLLABLE TAE +D0DD..D0F7 ; H3 # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH +D0F8 ; H2 # Lo HANGUL SYLLABLE TYA +D0F9..D113 ; H3 # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH +D114 ; H2 # Lo HANGUL SYLLABLE TYAE +D115..D12F ; H3 # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH +D130 ; H2 # Lo HANGUL SYLLABLE TEO +D131..D14B ; H3 # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH +D14C ; H2 # Lo HANGUL SYLLABLE TE +D14D..D167 ; H3 # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH +D168 ; H2 # Lo HANGUL SYLLABLE TYEO +D169..D183 ; H3 # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH +D184 ; H2 # Lo HANGUL SYLLABLE TYE +D185..D19F ; H3 # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH +D1A0 ; H2 # Lo HANGUL SYLLABLE TO +D1A1..D1BB ; H3 # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH +D1BC ; H2 # Lo HANGUL SYLLABLE TWA +D1BD..D1D7 ; H3 # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH +D1D8 ; H2 # Lo HANGUL SYLLABLE TWAE +D1D9..D1F3 ; H3 # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH +D1F4 ; H2 # Lo HANGUL SYLLABLE TOE +D1F5..D20F ; H3 # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH +D210 ; H2 # Lo HANGUL SYLLABLE TYO +D211..D22B ; H3 # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH +D22C ; H2 # Lo HANGUL SYLLABLE TU +D22D..D247 ; H3 # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH +D248 ; H2 # Lo HANGUL SYLLABLE TWEO +D249..D263 ; H3 # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH +D264 ; H2 # Lo HANGUL SYLLABLE TWE +D265..D27F ; H3 # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH +D280 ; H2 # Lo HANGUL SYLLABLE TWI +D281..D29B ; H3 # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH +D29C ; H2 # Lo HANGUL SYLLABLE TYU +D29D..D2B7 ; H3 # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH +D2B8 ; H2 # Lo HANGUL SYLLABLE TEU +D2B9..D2D3 ; H3 # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH +D2D4 ; H2 # Lo HANGUL SYLLABLE TYI +D2D5..D2EF ; H3 # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH +D2F0 ; H2 # Lo HANGUL SYLLABLE TI +D2F1..D30B ; H3 # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH +D30C ; H2 # Lo HANGUL SYLLABLE PA +D30D..D327 ; H3 # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH +D328 ; H2 # Lo HANGUL SYLLABLE PAE +D329..D343 ; H3 # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH +D344 ; H2 # Lo HANGUL SYLLABLE PYA +D345..D35F ; H3 # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH +D360 ; H2 # Lo HANGUL SYLLABLE PYAE +D361..D37B ; H3 # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH +D37C ; H2 # Lo HANGUL SYLLABLE PEO +D37D..D397 ; H3 # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH +D398 ; H2 # Lo HANGUL SYLLABLE PE +D399..D3B3 ; H3 # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH +D3B4 ; H2 # Lo HANGUL SYLLABLE PYEO +D3B5..D3CF ; H3 # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH +D3D0 ; H2 # Lo HANGUL SYLLABLE PYE +D3D1..D3EB ; H3 # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH +D3EC ; H2 # Lo HANGUL SYLLABLE PO +D3ED..D407 ; H3 # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH +D408 ; H2 # Lo HANGUL SYLLABLE PWA +D409..D423 ; H3 # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH +D424 ; H2 # Lo HANGUL SYLLABLE PWAE +D425..D43F ; H3 # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH +D440 ; H2 # Lo HANGUL SYLLABLE POE +D441..D45B ; H3 # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH +D45C ; H2 # Lo HANGUL SYLLABLE PYO +D45D..D477 ; H3 # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH +D478 ; H2 # Lo HANGUL SYLLABLE PU +D479..D493 ; H3 # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH +D494 ; H2 # Lo HANGUL SYLLABLE PWEO +D495..D4AF ; H3 # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH +D4B0 ; H2 # Lo HANGUL SYLLABLE PWE +D4B1..D4CB ; H3 # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH +D4CC ; H2 # Lo HANGUL SYLLABLE PWI +D4CD..D4E7 ; H3 # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH +D4E8 ; H2 # Lo HANGUL SYLLABLE PYU +D4E9..D503 ; H3 # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH +D504 ; H2 # Lo HANGUL SYLLABLE PEU +D505..D51F ; H3 # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH +D520 ; H2 # Lo HANGUL SYLLABLE PYI +D521..D53B ; H3 # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH +D53C ; H2 # Lo HANGUL SYLLABLE PI +D53D..D557 ; H3 # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH +D558 ; H2 # Lo HANGUL SYLLABLE HA +D559..D573 ; H3 # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH +D574 ; H2 # Lo HANGUL SYLLABLE HAE +D575..D58F ; H3 # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH +D590 ; H2 # Lo HANGUL SYLLABLE HYA +D591..D5AB ; H3 # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH +D5AC ; H2 # Lo HANGUL SYLLABLE HYAE +D5AD..D5C7 ; H3 # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH +D5C8 ; H2 # Lo HANGUL SYLLABLE HEO +D5C9..D5E3 ; H3 # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH +D5E4 ; H2 # Lo HANGUL SYLLABLE HE +D5E5..D5FF ; H3 # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH +D600 ; H2 # Lo HANGUL SYLLABLE HYEO +D601..D61B ; H3 # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH +D61C ; H2 # Lo HANGUL SYLLABLE HYE +D61D..D637 ; H3 # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH +D638 ; H2 # Lo HANGUL SYLLABLE HO +D639..D653 ; H3 # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH +D654 ; H2 # Lo HANGUL SYLLABLE HWA +D655..D66F ; H3 # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH +D670 ; H2 # Lo HANGUL SYLLABLE HWAE +D671..D68B ; H3 # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH +D68C ; H2 # Lo HANGUL SYLLABLE HOE +D68D..D6A7 ; H3 # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH +D6A8 ; H2 # Lo HANGUL SYLLABLE HYO +D6A9..D6C3 ; H3 # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH +D6C4 ; H2 # Lo HANGUL SYLLABLE HU +D6C5..D6DF ; H3 # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH +D6E0 ; H2 # Lo HANGUL SYLLABLE HWEO +D6E1..D6FB ; H3 # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH +D6FC ; H2 # Lo HANGUL SYLLABLE HWE +D6FD..D717 ; H3 # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH +D718 ; H2 # Lo HANGUL SYLLABLE HWI +D719..D733 ; H3 # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH +D734 ; H2 # Lo HANGUL SYLLABLE HYU +D735..D74F ; H3 # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH +D750 ; H2 # Lo HANGUL SYLLABLE HEU +D751..D76B ; H3 # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH +D76C ; H2 # Lo HANGUL SYLLABLE HYI +D76D..D787 ; H3 # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH +D788 ; H2 # Lo HANGUL SYLLABLE HI +D789..D7A3 ; H3 # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH +D7B0..D7C6 ; JV # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; JT # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +D800..DB7F ; SG # Cs [896] .. +DB80..DBFF ; SG # Cs [128] .. +DC00..DFFF ; SG # Cs [1024] .. +E000..F8FF ; XX # Co [6400] .. +F900..FA6D ; ID # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA6E..FA6F ; ID # Cn [2] .. +FA70..FAD9 ; ID # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FADA..FAFF ; ID # Cn [38] .. +FB00..FB06 ; AL # Ll [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; AL # Ll [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; HL # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; CM # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; HL # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; AL # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; HL # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; HL # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; HL # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; HL # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; HL # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; HL # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED +FB50..FBB1 ; AL # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; AL # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; AL # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ; CL # Pe ORNATE LEFT PARENTHESIS +FD3F ; OP # Ps ORNATE RIGHT PARENTHESIS +FD40..FD4F ; AL # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; AL # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; AL # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; AL # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; AL # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; PO # Sc RIAL SIGN +FDFD..FDFF ; AL # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE00..FE0F ; CM # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE10 ; IS # Po PRESENTATION FORM FOR VERTICAL COMMA +FE11..FE12 ; CL # Po [2] PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA..PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP +FE13..FE14 ; IS # Po [2] PRESENTATION FORM FOR VERTICAL COLON..PRESENTATION FORM FOR VERTICAL SEMICOLON +FE15..FE16 ; EX # Po [2] PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; IN # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE20..FE2F ; CM # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE30 ; ID # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; ID # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; ID # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; ID # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; OP # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; CL # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; ID # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; ID # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50 ; CL # Po SMALL COMMA +FE51 ; ID # Po SMALL IDEOGRAPHIC COMMA +FE52 ; CL # Po SMALL FULL STOP +FE54..FE55 ; NS # Po [2] SMALL SEMICOLON..SMALL COLON +FE56..FE57 ; EX # Po [2] SMALL QUESTION MARK..SMALL EXCLAMATION MARK +FE58 ; ID # Pd SMALL EM DASH +FE59 ; OP # Ps SMALL LEFT PARENTHESIS +FE5A ; CL # Pe SMALL RIGHT PARENTHESIS +FE5B ; OP # Ps SMALL LEFT CURLY BRACKET +FE5C ; CL # Pe SMALL RIGHT CURLY BRACKET +FE5D ; OP # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; CL # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; ID # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; ID # Sm SMALL PLUS SIGN +FE63 ; ID # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; ID # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; ID # Po SMALL REVERSE SOLIDUS +FE69 ; PR # Sc SMALL DOLLAR SIGN +FE6A ; PO # Po SMALL PERCENT SIGN +FE6B ; ID # Po SMALL COMMERCIAL AT +FE70..FE74 ; AL # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; AL # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF ; WJ # Cf ZERO WIDTH NO-BREAK SPACE +FF01 ; EX # Po FULLWIDTH EXCLAMATION MARK +FF02..FF03 ; ID # Po [2] FULLWIDTH QUOTATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; PR # Sc FULLWIDTH DOLLAR SIGN +FF05 ; PO # Po FULLWIDTH PERCENT SIGN +FF06..FF07 ; ID # Po [2] FULLWIDTH AMPERSAND..FULLWIDTH APOSTROPHE +FF08 ; OP # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; CL # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; ID # Po FULLWIDTH ASTERISK +FF0B ; ID # Sm FULLWIDTH PLUS SIGN +FF0C ; CL # Po FULLWIDTH COMMA +FF0D ; ID # Pd FULLWIDTH HYPHEN-MINUS +FF0E ; CL # Po FULLWIDTH FULL STOP +FF0F ; ID # Po FULLWIDTH SOLIDUS +FF10..FF19 ; ID # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; NS # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; ID # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F ; EX # Po FULLWIDTH QUESTION MARK +FF20 ; ID # Po FULLWIDTH COMMERCIAL AT +FF21..FF3A ; ID # Lu [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; OP # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; ID # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; CL # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; ID # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; ID # Pc FULLWIDTH LOW LINE +FF40 ; ID # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; ID # Ll [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; OP # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; ID # Sm FULLWIDTH VERTICAL LINE +FF5D ; CL # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; ID # Sm FULLWIDTH TILDE +FF5F ; OP # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; CL # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; CL # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; OP # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; CL # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64 ; CL # Po HALFWIDTH IDEOGRAPHIC COMMA +FF65 ; NS # Po HALFWIDTH KATAKANA MIDDLE DOT +FF66 ; ID # Lo HALFWIDTH KATAKANA LETTER WO +FF67..FF6F ; CJ # Lo [9] HALFWIDTH KATAKANA LETTER SMALL A..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; CJ # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; ID # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; NS # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; ID # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; ID # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; ID # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; ID # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; ID # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE0 ; PO # Sc FULLWIDTH CENT SIGN +FFE1 ; PR # Sc FULLWIDTH POUND SIGN +FFE2 ; ID # Sm FULLWIDTH NOT SIGN +FFE3 ; ID # Sk FULLWIDTH MACRON +FFE4 ; ID # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; PR # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; AL # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; AL # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; AL # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; CM # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC ; CB # So OBJECT REPLACEMENT CHARACTER +FFFD ; AI # So REPLACEMENT CHARACTER +10000..1000B ; AL # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; AL # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; AL # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; AL # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; AL # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; AL # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; AL # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102 ; BA # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; AL # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; AL # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174 ; AL # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; AL # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; AL # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; AL # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; AL # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +10190..1019C ; AL # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101A0 ; AL # So GREEK SYMBOL TAU RHO +101D0..101FC ; AL # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +101FD ; CM # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; AL # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; AL # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; CM # Mn COPTIC EPACT THOUSANDS MARK +102E1..102FB ; AL # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +10300..1031F ; AL # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; AL # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; AL # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE +10330..10340 ; AL # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; AL # Nl GOTHIC LETTER NINETY +10342..10349 ; AL # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; AL # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; AL # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; CM # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; AL # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; BA # Po UGARITIC WORD DIVIDER +103A0..103C3 ; AL # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; AL # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; BA # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; AL # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; AL # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1047F ; AL # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW +10480..1049D ; AL # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; NU # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; AL # Lu [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; AL # Ll [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; AL # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; AL # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; AL # Po CAUCASIAN ALBANIAN CITATION MARK +10570..1057A ; AL # Lu [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; AL # Lu [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; AL # Lu [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; AL # Lu [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; AL # Ll [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; AL # Ll [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; AL # Ll [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; AL # Ll [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE +10600..10736 ; AL # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; AL # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; AL # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10780..10785 ; AL # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; AL # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; AL # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10800..10805 ; AL # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; AL # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; AL # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; AL # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; AL # Lo CYPRIOT SYLLABLE ZA +1083F ; AL # Lo CYPRIOT SYLLABLE ZO +10840..10855 ; AL # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857 ; BA # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; AL # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; AL # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; AL # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; AL # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E ; AL # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; AL # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2 ; AL # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; AL # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; AL # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; AL # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; AL # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; BA # Po PHOENICIAN WORD SEPARATOR +10920..10939 ; AL # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; AL # Po LYDIAN TRIANGULAR MARK +10980..1099F ; AL # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 +109A0..109B7 ; AL # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; AL # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; AL # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; AL # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; AL # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 ; AL # Lo KHAROSHTHI LETTER A +10A01..10A03 ; CM # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; CM # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; CM # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; AL # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; AL # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; AL # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; CM # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; CM # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; AL # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A57 ; BA # Po [8] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION DOUBLE DANDA +10A58 ; AL # Po KHAROSHTHI PUNCTUATION LINES +10A60..10A7C ; AL # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; AL # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; AL # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; AL # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; AL # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7 ; AL # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; AL # So MANICHAEAN SIGN UD +10AC9..10AE4 ; AL # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; CM # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; AL # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF5 ; BA # Po [6] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION TWO DOTS +10AF6 ; IN # Po MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35 ; AL # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; BA # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; AL # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; AL # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; AL # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; AL # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; AL # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; AL # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; AL # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48 ; AL # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; AL # Lu [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; AL # Ll [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; AL # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23 ; AL # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; CM # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; NU # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E ; AL # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E80..10EA9 ; AL # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; CM # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; BA # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; AL # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; CM # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F00..10F1C ; AL # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; AL # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; AL # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; AL # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; CM # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; AL # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; AL # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F70..10F81 ; AL # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; CM # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; AL # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +10FB0..10FC4 ; AL # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; AL # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +10FE0..10FF6 ; AL # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +11000 ; CM # Mc BRAHMI SIGN CANDRABINDU +11001 ; CM # Mn BRAHMI SIGN ANUSVARA +11002 ; CM # Mc BRAHMI SIGN VISARGA +11003..11004 ; AP # Lo [2] BRAHMI SIGN JIHVAMULIYA..BRAHMI SIGN UPADHMANIYA +11005..11037 ; AK # Lo [51] BRAHMI LETTER A..BRAHMI LETTER OLD TAMIL NNNA +11038..11045 ; CM # Mn [14] BRAHMI VOWEL SIGN AA..BRAHMI VOWEL SIGN AU +11046 ; VI # Mn BRAHMI VIRAMA +11047..11048 ; BA # Po [2] BRAHMI DANDA..BRAHMI DOUBLE DANDA +11049..1104D ; ID # Po [5] BRAHMI PUNCTUATION DOT..BRAHMI PUNCTUATION LOTUS +11052..11065 ; ID # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; AS # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; CM # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; AK # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; CM # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; AK # Lo BRAHMI LETTER OLD TAMIL LLA +1107F ; GL # Mn BRAHMI NUMBER JOINER +11080..11081 ; CM # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; CM # Mc KAITHI SIGN VISARGA +11083..110AF ; AL # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; CM # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; CM # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; CM # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; CM # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; AL # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; NU # Cf KAITHI NUMBER SIGN +110BE..110C1 ; BA # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; CM # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; NU # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8 ; AL # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; NU # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; CM # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; AL # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; CM # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; CM # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; CM # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; NU # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; BA # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; AL # Lo CHAKMA LETTER LHAA +11145..11146 ; CM # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; AL # Lo CHAKMA LETTER VAA +11150..11172 ; AL # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; CM # Mn MAHAJANI SIGN NUKTA +11174 ; AL # Po MAHAJANI ABBREVIATION SIGN +11175 ; BB # Po MAHAJANI SECTION MARK +11176 ; AL # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; CM # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; CM # Mc SHARADA SIGN VISARGA +11183..111B2 ; AL # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; CM # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; CM # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; CM # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; AL # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C6 ; BA # Po [2] SHARADA DANDA..SHARADA DOUBLE DANDA +111C7 ; AL # Po SHARADA ABBREVIATION SIGN +111C8 ; BA # Po SHARADA SEPARATOR +111C9..111CC ; CM # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; AL # Po SHARADA SUTRA MARK +111CE ; CM # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; CM # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; NU # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; AL # Lo SHARADA EKAM +111DB ; BB # Po SHARADA SIGN SIDDHAM +111DC ; AL # Lo SHARADA HEADSTROKE +111DD..111DF ; BA # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4 ; AL # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211 ; AL # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; AL # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; CM # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; CM # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; CM # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; CM # Mn KHOJKI SIGN ANUSVARA +11235 ; CM # Mc KHOJKI SIGN VIRAMA +11236..11237 ; CM # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..11239 ; BA # Po [2] KHOJKI DANDA..KHOJKI DOUBLE DANDA +1123A ; AL # Po KHOJKI WORD SEPARATOR +1123B..1123C ; BA # Po [2] KHOJKI SECTION MARK..KHOJKI DOUBLE SECTION MARK +1123D ; AL # Po KHOJKI ABBREVIATION SIGN +1123E ; CM # Mn KHOJKI SIGN SUKUN +1123F..11240 ; AL # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; CM # Mn KHOJKI VOWEL SIGN VOCALIC R +11280..11286 ; AL # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; AL # Lo MULTANI LETTER GHA +1128A..1128D ; AL # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; AL # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; AL # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; BA # Po MULTANI SECTION MARK +112B0..112DE ; AL # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; CM # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; CM # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; CM # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; NU # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; CM # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; CM # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; AK # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; AK # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; AK # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; AK # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; AK # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; AK # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; CM # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; BA # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; CM # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; CM # Mn GRANTHA VOWEL SIGN II +11341..11344 ; CM # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; CM # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134C ; CM # Mc [2] GRANTHA VOWEL SIGN OO..GRANTHA VOWEL SIGN AU +1134D ; VI # Mc GRANTHA SIGN VIRAMA +11350 ; AS # Lo GRANTHA OM +11357 ; CM # Mc GRANTHA AU LENGTH MARK +1135D ; BA # Lo GRANTHA SIGN PLUTA +1135E..1135F ; AS # Lo [2] GRANTHA LETTER VEDIC ANUSVARA..GRANTHA LETTER VEDIC DOUBLE ANUSVARA +11360..11361 ; AK # Lo [2] GRANTHA LETTER VOCALIC RR..GRANTHA LETTER VOCALIC LL +11362..11363 ; CM # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; CM # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; CM # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; AL # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; CM # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; CM # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; CM # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; CM # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; CM # Mc NEWA SIGN VISARGA +11446 ; CM # Mn NEWA SIGN NUKTA +11447..1144A ; AL # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144E ; BA # Po [4] NEWA DANDA..NEWA GAP FILLER +1144F ; AL # Po NEWA ABBREVIATION SIGN +11450..11459 ; NU # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; BA # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; AL # Po NEWA INSERTION SIGN +1145E ; CM # Mn NEWA SANDHI MARK +1145F..11461 ; AL # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA +11480..114AF ; AL # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; CM # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; CM # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; CM # Mc TIRHUTA VOWEL SIGN E +114BA ; CM # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; CM # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; CM # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; CM # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; CM # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; AL # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; AL # Po TIRHUTA ABBREVIATION SIGN +114C7 ; AL # Lo TIRHUTA OM +114D0..114D9 ; NU # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; AL # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; CM # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; CM # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; CM # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; CM # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; CM # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; CM # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1 ; BB # Po SIDDHAM SIGN SIDDHAM +115C2..115C3 ; BA # Po [2] SIDDHAM DANDA..SIDDHAM DOUBLE DANDA +115C4..115C5 ; EX # Po [2] SIDDHAM SEPARATOR DOT..SIDDHAM SEPARATOR BAR +115C6..115C8 ; AL # Po [3] SIDDHAM REPETITION MARK-1..SIDDHAM REPETITION MARK-3 +115C9..115D7 ; BA # Po [15] SIDDHAM END OF TEXT MARK..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; AL # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; CM # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; AL # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; CM # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; CM # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; CM # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; CM # Mn MODI SIGN ANUSVARA +1163E ; CM # Mc MODI SIGN VISARGA +1163F..11640 ; CM # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11642 ; BA # Po [2] MODI DANDA..MODI DOUBLE DANDA +11643 ; AL # Po MODI ABBREVIATION SIGN +11644 ; AL # Lo MODI SIGN HUVA +11650..11659 ; NU # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C ; BB # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680..116AA ; AL # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; CM # Mn TAKRI SIGN ANUSVARA +116AC ; CM # Mc TAKRI SIGN VISARGA +116AD ; CM # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; CM # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; CM # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; CM # Mc TAKRI SIGN VIRAMA +116B7 ; CM # Mn TAKRI SIGN NUKTA +116B8 ; AL # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; AL # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; NU # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; SA # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; SA # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; SA # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; SA # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; SA # Mc AHOM VOWEL SIGN E +11727..1172B ; SA # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; NU # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; SA # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; BA # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; SA # So AHOM SYMBOL VI +11740..11746 ; SA # Lo [7] AHOM LETTER CA..AHOM LETTER LLA +11800..1182B ; AL # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; CM # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; CM # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; CM # Mc DOGRA SIGN VISARGA +11839..1183A ; CM # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; AL # Po DOGRA ABBREVIATION SIGN +118A0..118DF ; AL # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; NU # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; AL # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; AL # Lo WARANG CITI OM +11900..11906 ; AK # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E +11909 ; AK # Lo DIVES AKURU LETTER O +1190C..11913 ; AK # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; AK # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; AK # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; CM # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; CM # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; CM # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; CM # Mc DIVES AKURU SIGN HALANTA +1193E ; VI # Mn DIVES AKURU VIRAMA +1193F ; AP # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; CM # Mc DIVES AKURU MEDIAL YA +11941 ; AP # Lo DIVES AKURU INITIAL RA +11942 ; CM # Mc DIVES AKURU MEDIAL RA +11943 ; CM # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; BA # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; ID # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +119A0..119A7 ; AL # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; AL # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; CM # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; CM # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; CM # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; CM # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; CM # Mn NANDINAGARI SIGN VIRAMA +119E1 ; AL # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; BB # Po NANDINAGARI SIGN SIDDHAM +119E3 ; AL # Lo NANDINAGARI HEADSTROKE +119E4 ; CM # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A00 ; AL # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; CM # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; AL # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; CM # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; CM # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; AL # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; CM # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F ; BB # Po ZANABAZAR SQUARE INITIAL HEAD MARK +11A40 ; AL # Po ZANABAZAR SQUARE CLOSING HEAD MARK +11A41..11A44 ; BA # Po [4] ZANABAZAR SQUARE MARK TSHEG..ZANABAZAR SQUARE MARK LONG TSHEG +11A45 ; BB # Po ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK +11A46 ; AL # Po ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; CM # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; AL # Lo SOYOMBO LETTER A +11A51..11A56 ; CM # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; CM # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; CM # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; AL # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; CM # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; CM # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; CM # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; BA # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; AL # Lo SOYOMBO MARK PLUTA +11A9E..11AA0 ; BB # Po [3] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO HEAD MARK WITH MOON AND SUN +11AA1..11AA2 ; BA # Po [2] SOYOMBO TERMINAL MARK-1..SOYOMBO TERMINAL MARK-2 +11AB0..11ABF ; AL # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA +11AC0..11AF8 ; AL # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09 ; BB # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11C00..11C08 ; AL # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; AL # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; CM # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; CM # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; CM # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; CM # Mc BHAIKSUKI SIGN VISARGA +11C3F ; CM # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; AL # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; BA # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; NU # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; AL # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70 ; BB # Po MARCHEN HEAD MARK +11C71 ; EX # Po MARCHEN MARK SHAD +11C72..11C8F ; AL # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; CM # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; CM # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; CM # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; CM # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; CM # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; CM # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; CM # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; AL # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; AL # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; AL # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; CM # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; CM # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; CM # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; CM # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; AL # Lo MASARAM GONDI REPHA +11D47 ; CM # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; NU # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; AL # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; AL # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; AL # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; CM # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; CM # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; CM # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; CM # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; CM # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; CM # Mn GUNJALA GONDI VIRAMA +11D98 ; AL # Lo GUNJALA GONDI OM +11DA0..11DA9 ; NU # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF1 ; AS # Lo [18] MAKASAR LETTER KA..MAKASAR LETTER A +11EF2 ; BA # Lo MAKASAR ANGKA +11EF3..11EF4 ; CM # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; CM # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; BA # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01 ; CM # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; AP # Lo KAWI SIGN REPHA +11F03 ; CM # Mc KAWI SIGN VISARGA +11F04..11F10 ; AK # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; AK # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; CM # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; CM # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; CM # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; CM # Mn KAWI VOWEL SIGN EU +11F41 ; CM # Mc KAWI SIGN KILLER +11F42 ; VI # Mn KAWI CONJOINER +11F43..11F44 ; BA # Po [2] KAWI DANDA..KAWI DOUBLE DANDA +11F45..11F4F ; ID # Po [11] KAWI PUNCTUATION SECTION MARKER..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; AS # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE +11FB0 ; AL # Lo LISU LETTER YHA +11FC0..11FD4 ; AL # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; AL # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; PO # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; AL # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; BA # Po TAMIL PUNCTUATION END OF TEXT +12000..12399 ; AL # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; AL # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; BA # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; AL # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12F90..12FF0 ; AL # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; AL # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 +13000..13257 ; AL # Lo [600] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH O006 +13258..1325A ; OP # Lo [3] EGYPTIAN HIEROGLYPH O006A..EGYPTIAN HIEROGLYPH O006C +1325B..1325D ; CL # Lo [3] EGYPTIAN HIEROGLYPH O006D..EGYPTIAN HIEROGLYPH O006F +1325E..13281 ; AL # Lo [36] EGYPTIAN HIEROGLYPH O007..EGYPTIAN HIEROGLYPH O033 +13282 ; CL # Lo EGYPTIAN HIEROGLYPH O033A +13283..13285 ; AL # Lo [3] EGYPTIAN HIEROGLYPH O034..EGYPTIAN HIEROGLYPH O036 +13286 ; OP # Lo EGYPTIAN HIEROGLYPH O036A +13287 ; CL # Lo EGYPTIAN HIEROGLYPH O036B +13288 ; OP # Lo EGYPTIAN HIEROGLYPH O036C +13289 ; CL # Lo EGYPTIAN HIEROGLYPH O036D +1328A..13378 ; AL # Lo [239] EGYPTIAN HIEROGLYPH O037..EGYPTIAN HIEROGLYPH V011 +13379 ; OP # Lo EGYPTIAN HIEROGLYPH V011A +1337A..1337B ; CL # Lo [2] EGYPTIAN HIEROGLYPH V011B..EGYPTIAN HIEROGLYPH V011C +1337C..1342E ; AL # Lo [179] EGYPTIAN HIEROGLYPH V012..EGYPTIAN HIEROGLYPH AA032 +1342F ; OP # Lo EGYPTIAN HIEROGLYPH V011D +13430..13436 ; GL # Cf [7] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH OVERLAY MIDDLE +13437 ; OP # Cf EGYPTIAN HIEROGLYPH BEGIN SEGMENT +13438 ; CL # Cf EGYPTIAN HIEROGLYPH END SEGMENT +13439..1343B ; GL # Cf [3] EGYPTIAN HIEROGLYPH INSERT AT MIDDLE..EGYPTIAN HIEROGLYPH INSERT AT BOTTOM +1343C ; OP # Cf EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE +1343D ; CL # Cf EGYPTIAN HIEROGLYPH END ENCLOSURE +1343E ; OP # Cf EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE +1343F ; CL # Cf EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; CM # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; AL # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; CM # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +14400..145CD ; AL # Lo [462] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A409 +145CE ; OP # Lo ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK +145CF ; CL # Lo ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK +145D0..14646 ; AL # Lo [119] ANATOLIAN HIEROGLYPH A411..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; AL # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; AL # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; NU # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; BA # Po [2] MRO DANDA..MRO DOUBLE DANDA +16A70..16ABE ; AL # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; NU # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE +16AD0..16AED ; AL # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; CM # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; BA # Po BASSA VAH FULL STOP +16B00..16B2F ; AL # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; CM # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B39 ; BA # Po [3] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN CIM CHEEM +16B3A..16B3B ; AL # Po [2] PAHAWH HMONG SIGN VOS THIAB..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; AL # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; AL # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; BA # Po PAHAWH HMONG SIGN XAUS +16B45 ; AL # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; NU # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; AL # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; AL # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; AL # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; AL # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; AL # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E98 ; BA # Po [2] MEDEFAIDRIN COMMA..MEDEFAIDRIN FULL STOP +16E99..16E9A ; AL # Po [2] MEDEFAIDRIN SYMBOL AIVA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F4A ; AL # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; CM # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; AL # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; CM # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; CM # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; AL # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +16FE0..16FE1 ; NS # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE2 ; NS # Po OLD CHINESE HOOK MARK +16FE3 ; NS # Lm OLD CHINESE ITERATION MARK +16FE4 ; GL # Mn KHITAN SMALL SCRIPT FILLER +16FF0..16FF1 ; CM # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +17000..187F7 ; ID # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18AFF ; ID # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 +18B00..18CD5 ; AL # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18D00..18D08 ; ID # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +1AFF0..1AFF3 ; AL # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; AL # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; AL # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000..1B0FF ; ID # Lo [256] KATAKANA LETTER ARCHAIC E..HENTAIGANA LETTER RE-2 +1B100..1B122 ; ID # Lo [35] HENTAIGANA LETTER RE-3..KATAKANA LETTER ARCHAIC WU +1B132 ; CJ # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; CJ # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; CJ # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; CJ # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B170..1B2FB ; ID # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1BC00..1BC6A ; AL # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; AL # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; AL # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; AL # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; AL # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; CM # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; BA # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3 ; CM # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF00..1CF2D ; CM # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; CM # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1CF50..1CFC3 ; AL # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; AL # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; AL # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; AL # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; CM # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; CM # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C ; AL # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; CM # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; CM # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; CM # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184 ; AL # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B ; CM # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9 ; AL # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD ; CM # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1EA ; AL # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D200..1D241 ; AL # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; CM # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; AL # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3 ; AL # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; AL # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; AL # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; AL # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; AL # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; AL # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; AL # Lu [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; AL # Lu MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; AL # Lu [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; AL # Lu [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; AL # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; AL # Ll MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; AL # Ll [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; AL # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; AL # Lu [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; AL # Lu [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; AL # Lu [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; AL # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; AL # Lu [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; AL # Lu [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; AL # Lu MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; AL # Lu [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; AL # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; AL # Lu [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; AL # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; AL # Ll [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; AL # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; AL # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; AL # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; AL # Ll [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; AL # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; AL # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; AL # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; AL # Ll [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; AL # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; AL # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; AL # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; AL # Ll [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; AL # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; AL # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; AL # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; AL # Ll [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; AL # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; AL # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; NU # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; AL # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; CM # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; AL # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; CM # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; AL # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; CM # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; AL # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; CM # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; AL # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8A ; BA # Po [4] SIGNWRITING COMMA..SIGNWRITING COLON +1DA8B ; AL # Po SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; CM # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; CM # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DF00..1DF09 ; AL # Ll [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; AL # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; AL # Ll [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; AL # Ll [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E000..1E006 ; CM # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; CM # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; CM # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; CM # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; CM # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; AL # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; CM # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E100..1E12C ; AL # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; CM # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; AL # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; NU # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; AL # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; AL # So NYIAKENG PUACHUE HMONG CIRCLED CA +1E290..1E2AD ; AL # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; CM # Mn TOTO SIGN RISING TONE +1E2C0..1E2EB ; AL # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; CM # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; NU # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; PR # Sc WANCHO NGUN SIGN +1E4D0..1E4EA ; AL # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; AL # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; CM # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; NU # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE +1E7E0..1E7E6 ; AL # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; AL # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; AL # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; AL # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE +1E800..1E8C4 ; AL # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; AL # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; CM # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; AL # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; CM # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; AL # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; NU # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; OP # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1EC71..1ECAB ; AL # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; PO # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; AL # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; PO # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; AL # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; AL # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; AL # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; AL # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1EE00..1EE03 ; AL # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; AL # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; AL # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; AL # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; AL # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; AL # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; AL # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; AL # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; AL # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; AL # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; AL # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; AL # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; AL # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; AL # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; AL # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; AL # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; AL # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; AL # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; AL # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; AL # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; AL # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; AL # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; AL # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; AL # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; AL # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; AL # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; AL # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; AL # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; AL # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; AL # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; AL # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; AL # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; AL # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; AL # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000..1F02B ; ID # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F02C..1F02F ; ID # Cn [4] .. +1F030..1F093 ; ID # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F094..1F09F ; ID # Cn [12] .. +1F0A0..1F0AE ; ID # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0AF..1F0B0 ; ID # Cn [2] .. +1F0B1..1F0BF ; ID # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C0 ; ID # Cn +1F0C1..1F0CF ; ID # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D0 ; ID # Cn +1F0D1..1F0F5 ; ID # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F0F6..1F0FF ; ID # Cn [10] .. +1F100..1F10C ; AI # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F ; ID # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F110..1F12D ; AI # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F12E..1F12F ; AL # So [2] CIRCLED WZ..COPYLEFT SYMBOL +1F130..1F169 ; AI # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F16A..1F16C ; AL # So [3] RAISED MC SIGN..RAISED MR SIGN +1F16D..1F16F ; ID # So [3] CIRCLED CC..CIRCLED HUMAN FIGURE +1F170..1F1AC ; AI # So [61] NEGATIVE SQUARED LATIN CAPITAL LETTER A..SQUARED VOD +1F1AD ; ID # So MASK WORK SYMBOL +1F1AE..1F1E5 ; ID # Cn [56] .. +1F1E6..1F1FF ; RI # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F200..1F202 ; ID # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA +1F203..1F20F ; ID # Cn [13] .. +1F210..1F23B ; ID # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F23C..1F23F ; ID # Cn [4] .. +1F240..1F248 ; ID # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F249..1F24F ; ID # Cn [7] .. +1F250..1F251 ; ID # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F252..1F25F ; ID # Cn [14] .. +1F260..1F265 ; ID # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F266..1F2FF ; ID # Cn [154] .. +1F300..1F384 ; ID # So [133] CYCLONE..CHRISTMAS TREE +1F385 ; EB # So FATHER CHRISTMAS +1F386..1F39B ; ID # So [22] FIREWORKS..CONTROL KNOBS +1F39C..1F39D ; AL # So [2] BEAMED ASCENDING MUSICAL NOTES..BEAMED DESCENDING MUSICAL NOTES +1F39E..1F3B4 ; ID # So [23] FILM FRAMES..FLOWER PLAYING CARDS +1F3B5..1F3B6 ; AL # So [2] MUSICAL NOTE..MULTIPLE MUSICAL NOTES +1F3B7..1F3BB ; ID # So [5] SAXOPHONE..VIOLIN +1F3BC ; AL # So MUSICAL SCORE +1F3BD..1F3C1 ; ID # So [5] RUNNING SHIRT WITH SASH..CHEQUERED FLAG +1F3C2..1F3C4 ; EB # So [3] SNOWBOARDER..SURFER +1F3C5..1F3C6 ; ID # So [2] SPORTS MEDAL..TROPHY +1F3C7 ; EB # So HORSE RACING +1F3C8..1F3C9 ; ID # So [2] AMERICAN FOOTBALL..RUGBY FOOTBALL +1F3CA..1F3CC ; EB # So [3] SWIMMER..GOLFER +1F3CD..1F3FA ; ID # So [46] RACING MOTORCYCLE..AMPHORA +1F3FB..1F3FF ; EM # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F441 ; ID # So [66] RAT..EYE +1F442..1F443 ; EB # So [2] EAR..NOSE +1F444..1F445 ; ID # So [2] MOUTH..TONGUE +1F446..1F450 ; EB # So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN +1F451..1F465 ; ID # So [21] CROWN..BUSTS IN SILHOUETTE +1F466..1F478 ; EB # So [19] BOY..PRINCESS +1F479..1F47B ; ID # So [3] JAPANESE OGRE..GHOST +1F47C ; EB # So BABY ANGEL +1F47D..1F480 ; ID # So [4] EXTRATERRESTRIAL ALIEN..SKULL +1F481..1F483 ; EB # So [3] INFORMATION DESK PERSON..DANCER +1F484 ; ID # So LIPSTICK +1F485..1F487 ; EB # So [3] NAIL POLISH..HAIRCUT +1F488..1F48E ; ID # So [7] BARBER POLE..GEM STONE +1F48F ; EB # So KISS +1F490 ; ID # So BOUQUET +1F491 ; EB # So COUPLE WITH HEART +1F492..1F49F ; ID # So [14] WEDDING..HEART DECORATION +1F4A0 ; AL # So DIAMOND SHAPE WITH A DOT INSIDE +1F4A1 ; ID # So ELECTRIC LIGHT BULB +1F4A2 ; AL # So ANGER SYMBOL +1F4A3 ; ID # So BOMB +1F4A4 ; AL # So SLEEPING SYMBOL +1F4A5..1F4A9 ; ID # So [5] COLLISION SYMBOL..PILE OF POO +1F4AA ; EB # So FLEXED BICEPS +1F4AB..1F4AE ; ID # So [4] DIZZY SYMBOL..WHITE FLOWER +1F4AF ; AL # So HUNDRED POINTS SYMBOL +1F4B0 ; ID # So MONEY BAG +1F4B1..1F4B2 ; AL # So [2] CURRENCY EXCHANGE..HEAVY DOLLAR SIGN +1F4B3..1F4FF ; ID # So [77] CREDIT CARD..PRAYER BEADS +1F500..1F506 ; AL # So [7] TWISTED RIGHTWARDS ARROWS..HIGH BRIGHTNESS SYMBOL +1F507..1F516 ; ID # So [16] SPEAKER WITH CANCELLATION STROKE..BOOKMARK +1F517..1F524 ; AL # So [14] LINK SYMBOL..INPUT SYMBOL FOR LATIN LETTERS +1F525..1F531 ; ID # So [13] FIRE..TRIDENT EMBLEM +1F532..1F549 ; AL # So [24] BLACK SQUARE BUTTON..OM SYMBOL +1F54A..1F573 ; ID # So [42] DOVE OF PEACE..HOLE +1F574..1F575 ; EB # So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY +1F576..1F579 ; ID # So [4] DARK SUNGLASSES..JOYSTICK +1F57A ; EB # So MAN DANCING +1F57B..1F58F ; ID # So [21] LEFT HAND TELEPHONE RECEIVER..TURNED OK HAND SIGN +1F590 ; EB # So RAISED HAND WITH FINGERS SPLAYED +1F591..1F594 ; ID # So [4] REVERSED RAISED HAND WITH FINGERS SPLAYED..REVERSED VICTORY HAND +1F595..1F596 ; EB # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F597..1F5D3 ; ID # So [61] WHITE DOWN POINTING LEFT HAND INDEX..SPIRAL CALENDAR PAD +1F5D4..1F5DB ; AL # So [8] DESKTOP WINDOW..DECREASE FONT SIZE SYMBOL +1F5DC..1F5F3 ; ID # So [24] COMPRESSION..BALLOT BOX WITH BALLOT +1F5F4..1F5F9 ; AL # So [6] BALLOT SCRIPT X..BALLOT BOX WITH BOLD CHECK +1F5FA..1F5FF ; ID # So [6] WORLD MAP..MOYAI +1F600..1F644 ; ID # So [69] GRINNING FACE..FACE WITH ROLLING EYES +1F645..1F647 ; EB # So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY +1F648..1F64A ; ID # So [3] SEE-NO-EVIL MONKEY..SPEAK-NO-EVIL MONKEY +1F64B..1F64F ; EB # So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS +1F650..1F675 ; AL # So [38] NORTH WEST POINTING LEAF..SWASH AMPERSAND ORNAMENT +1F676..1F678 ; QU # So [3] SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT..SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT +1F679..1F67B ; NS # So [3] HEAVY INTERROBANG ORNAMENT..HEAVY SANS-SERIF INTERROBANG ORNAMENT +1F67C..1F67F ; AL # So [4] VERY HEAVY SOLIDUS..REVERSE CHECKER BOARD +1F680..1F6A2 ; ID # So [35] ROCKET..SHIP +1F6A3 ; EB # So ROWBOAT +1F6A4..1F6B3 ; ID # So [16] SPEEDBOAT..NO BICYCLES +1F6B4..1F6B6 ; EB # So [3] BICYCLIST..PEDESTRIAN +1F6B7..1F6BF ; ID # So [9] NO PEDESTRIANS..SHOWER +1F6C0 ; EB # So BATH +1F6C1..1F6CB ; ID # So [11] BATHTUB..COUCH AND LAMP +1F6CC ; EB # So SLEEPING ACCOMMODATION +1F6CD..1F6D7 ; ID # So [11] SHOPPING BAGS..ELEVATOR +1F6D8..1F6DB ; ID # Cn [4] .. +1F6DC..1F6EC ; ID # So [17] WIRELESS..AIRPLANE ARRIVING +1F6ED..1F6EF ; ID # Cn [3] .. +1F6F0..1F6FC ; ID # So [13] SATELLITE..ROLLER SKATE +1F6FD..1F6FF ; ID # Cn [3] .. +1F700..1F773 ; AL # So [116] ALCHEMICAL SYMBOL FOR QUINTESSENCE..ALCHEMICAL SYMBOL FOR HALF OUNCE +1F774..1F776 ; ID # So [3] LOT OF FORTUNE..LUNAR ECLIPSE +1F777..1F77A ; ID # Cn [4] .. +1F77B..1F77F ; ID # So [5] HAUMEA..ORCUS +1F780..1F7D4 ; AL # So [85] BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE..HEAVY TWELVE POINTED PINWHEEL STAR +1F7D5..1F7D9 ; ID # So [5] CIRCLED TRIANGLE..NINE POINTED WHITE STAR +1F7DA..1F7DF ; ID # Cn [6] .. +1F7E0..1F7EB ; ID # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7EC..1F7EF ; ID # Cn [4] .. +1F7F0 ; ID # So HEAVY EQUALS SIGN +1F7F1..1F7FF ; ID # Cn [15] .. +1F800..1F80B ; AL # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F80C..1F80F ; ID # Cn [4] .. +1F810..1F847 ; AL # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F848..1F84F ; ID # Cn [8] .. +1F850..1F859 ; AL # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F85A..1F85F ; ID # Cn [6] .. +1F860..1F887 ; AL # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F888..1F88F ; ID # Cn [8] .. +1F890..1F8AD ; AL # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8AE..1F8AF ; ID # Cn [2] .. +1F8B0..1F8B1 ; ID # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F8B2..1F8FF ; ID # Cn [78] .. +1F900..1F90B ; AL # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C ; EB # So PINCHED FINGERS +1F90D..1F90E ; ID # So [2] WHITE HEART..BROWN HEART +1F90F ; EB # So PINCHING HAND +1F910..1F917 ; ID # So [8] ZIPPER-MOUTH FACE..HUGGING FACE +1F918..1F91F ; EB # So [8] SIGN OF THE HORNS..I LOVE YOU HAND SIGN +1F920..1F925 ; ID # So [6] FACE WITH COWBOY HAT..LYING FACE +1F926 ; EB # So FACE PALM +1F927..1F92F ; ID # So [9] SNEEZING FACE..SHOCKED FACE WITH EXPLODING HEAD +1F930..1F939 ; EB # So [10] PREGNANT WOMAN..JUGGLING +1F93A..1F93B ; ID # So [2] FENCER..MODERN PENTATHLON +1F93C..1F93E ; EB # So [3] WRESTLERS..HANDBALL +1F93F..1F976 ; ID # So [56] DIVING MASK..FREEZING FACE +1F977 ; EB # So NINJA +1F978..1F9B4 ; ID # So [61] DISGUISED FACE..BONE +1F9B5..1F9B6 ; EB # So [2] LEG..FOOT +1F9B7 ; ID # So TOOTH +1F9B8..1F9B9 ; EB # So [2] SUPERHERO..SUPERVILLAIN +1F9BA ; ID # So SAFETY VEST +1F9BB ; EB # So EAR WITH HEARING AID +1F9BC..1F9CC ; ID # So [17] MOTORIZED WHEELCHAIR..TROLL +1F9CD..1F9CF ; EB # So [3] STANDING PERSON..DEAF PERSON +1F9D0 ; ID # So FACE WITH MONOCLE +1F9D1..1F9DD ; EB # So [13] ADULT..ELF +1F9DE..1F9FF ; ID # So [34] GENIE..NAZAR AMULET +1FA00..1FA53 ; AL # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP +1FA54..1FA5F ; ID # Cn [12] .. +1FA60..1FA6D ; ID # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA6E..1FA6F ; ID # Cn [2] .. +1FA70..1FA7C ; ID # So [13] BALLET SHOES..CRUTCH +1FA7D..1FA7F ; ID # Cn [3] .. +1FA80..1FA88 ; ID # So [9] YO-YO..FLUTE +1FA89..1FA8F ; ID # Cn [7] .. +1FA90..1FABD ; ID # So [46] RINGED PLANET..WING +1FABE ; ID # Cn +1FABF..1FAC2 ; ID # So [4] GOOSE..PEOPLE HUGGING +1FAC3..1FAC5 ; EB # So [3] PREGNANT MAN..PERSON WITH CROWN +1FAC6..1FACD ; ID # Cn [8] .. +1FACE..1FADB ; ID # So [14] MOOSE..PEA POD +1FADC..1FADF ; ID # Cn [4] .. +1FAE0..1FAE8 ; ID # So [9] MELTING FACE..SHAKING FACE +1FAE9..1FAEF ; ID # Cn [7] .. +1FAF0..1FAF8 ; EB # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FAF9..1FAFF ; ID # Cn [7] .. +1FB00..1FB92 ; AL # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; AL # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; NU # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +1FC00..1FFFD ; ID # Cn [1022] .. +20000..2A6DF ; ID # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A6E0..2A6FF ; ID # Cn [32] .. +2A700..2B739 ; ID # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B73A..2B73F ; ID # Cn [6] .. +2B740..2B81D ; ID # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B81E..2B81F ; ID # Cn [2] .. +2B820..2CEA1 ; ID # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEA2..2CEAF ; ID # Cn [14] .. +2CEB0..2EBE0 ; ID # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBE1..2EBEF ; ID # Cn [15] .. +2EBF0..2EE5D ; ID # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2EE5E..2F7FF ; ID # Cn [2466] .. +2F800..2FA1D ; ID # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +2FA1E..2FA1F ; ID # Cn [2] .. +2FA20..2FFFD ; ID # Cn [1502] .. +30000..3134A ; ID # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +3134B..3134F ; ID # Cn [5] .. +31350..323AF ; ID # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF +323B0..3FFFD ; ID # Cn [56398] .. +E0001 ; CM # Cf LANGUAGE TAG +E0020..E007F ; CM # Cf [96] TAG SPACE..CANCEL TAG +E0100..E01EF ; CM # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD ; XX # Co [65534] .. +100000..10FFFD ; XX # Co [65534] .. + +# EOF diff --git a/unicode-data/ReadMe.txt b/unicode-data/ReadMe.txt new file mode 100644 index 0000000..a277a88 --- /dev/null +++ b/unicode-data/ReadMe.txt @@ -0,0 +1,16 @@ +# Unicode Character Database +# Date: 2023-08-28 +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# For documentation, see the following: +# NamesList.html +# UAX #38, "Unicode Han Database (Unihan)" +# UAX #44, "Unicode Character Database" +# UTS #51, "Unicode Emoji" +# +# The UAXes and UTS #51 can be accessed at https://www.unicode.org/versions/Unicode15.1.0/ + +This directory contains final data files +for the Unicode Character Database, for Version 15.1.0 of the Unicode Standard. diff --git a/unicode-data/Scripts.txt b/unicode-data/Scripts.txt new file mode 100644 index 0000000..0b3f717 --- /dev/null +++ b/unicode-data/Scripts.txt @@ -0,0 +1,3033 @@ +# Scripts-15.1.0.txt +# Date: 2023-07-28, 16:01:07 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# For more information, see: +# UAX #24, Unicode Script Property: https://www.unicode.org/reports/tr24/ +# Especially the sections: +# https://www.unicode.org/reports/tr24/#Assignment_Script_Values +# https://www.unicode.org/reports/tr24/#Assignment_ScriptX_Values +# + +# ================================================ + +# Property: Script + +# All code points not explicitly listed for Script +# have the value Unknown (Zzzz). + +# @missing: 0000..10FFFF; Unknown + +# ================================================ + +0000..001F ; Common # Cc [32] .. +0020 ; Common # Zs SPACE +0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Common # Sc DOLLAR SIGN +0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Common # Ps LEFT PARENTHESIS +0029 ; Common # Pe RIGHT PARENTHESIS +002A ; Common # Po ASTERISK +002B ; Common # Sm PLUS SIGN +002C ; Common # Po COMMA +002D ; Common # Pd HYPHEN-MINUS +002E..002F ; Common # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Common # Po [2] COLON..SEMICOLON +003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT +005B ; Common # Ps LEFT SQUARE BRACKET +005C ; Common # Po REVERSE SOLIDUS +005D ; Common # Pe RIGHT SQUARE BRACKET +005E ; Common # Sk CIRCUMFLEX ACCENT +005F ; Common # Pc LOW LINE +0060 ; Common # Sk GRAVE ACCENT +007B ; Common # Ps LEFT CURLY BRACKET +007C ; Common # Sm VERTICAL LINE +007D ; Common # Pe RIGHT CURLY BRACKET +007E ; Common # Sm TILDE +007F..009F ; Common # Cc [33] .. +00A0 ; Common # Zs NO-BREAK SPACE +00A1 ; Common # Po INVERTED EXCLAMATION MARK +00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN +00A6 ; Common # So BROKEN BAR +00A7 ; Common # Po SECTION SIGN +00A8 ; Common # Sk DIAERESIS +00A9 ; Common # So COPYRIGHT SIGN +00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00AC ; Common # Sm NOT SIGN +00AD ; Common # Cf SOFT HYPHEN +00AE ; Common # So REGISTERED SIGN +00AF ; Common # Sk MACRON +00B0 ; Common # So DEGREE SIGN +00B1 ; Common # Sm PLUS-MINUS SIGN +00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; Common # Sk ACUTE ACCENT +00B5 ; Common # L& MICRO SIGN +00B6..00B7 ; Common # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; Common # Sk CEDILLA +00B9 ; Common # No SUPERSCRIPT ONE +00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; Common # Po INVERTED QUESTION MARK +00D7 ; Common # Sm MULTIPLICATION SIGN +00F7 ; Common # Sm DIVISION SIGN +02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD +02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT +02E5..02E9 ; Common # Sk [5] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER EXTRA-LOW TONE BAR +02EC ; Common # Lm MODIFIER LETTER VOICING +02ED ; Common # Sk MODIFIER LETTER UNASPIRATED +02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0374 ; Common # Lm GREEK NUMERAL SIGN +037E ; Common # Po GREEK QUESTION MARK +0385 ; Common # Sk GREEK DIALYTIKA TONOS +0387 ; Common # Po GREEK ANO TELEIA +0605 ; Common # Cf ARABIC NUMBER MARK ABOVE +060C ; Common # Po ARABIC COMMA +061B ; Common # Po ARABIC SEMICOLON +061F ; Common # Po ARABIC QUESTION MARK +0640 ; Common # Lm ARABIC TATWEEL +06DD ; Common # Cf ARABIC END OF AYAH +08E2 ; Common # Cf ARABIC DISPUTED END OF AYAH +0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT +0FD5..0FD8 ; Common # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR +16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP +1805 ; Common # Po MONGOLIAN FOUR DOTS +1CD3 ; Common # Po VEDIC SIGN NIHSHVASA +1CE1 ; Common # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE9..1CEC ; Common # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CEE..1CF3 ; Common # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF5..1CF6 ; Common # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; Common # Mc VEDIC SIGN ATIKRAMA +1CFA ; Common # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE +200B ; Common # Cf ZERO WIDTH SPACE +200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK +2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR +2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE +2018 ; Common # Pi LEFT SINGLE QUOTATION MARK +2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK +201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK +201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK +201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK +201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT +2028 ; Common # Zl LINE SEPARATOR +2029 ; Common # Zp PARAGRAPH SEPARATOR +202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; Common # Zs NARROW NO-BREAK SPACE +2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET +2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE +203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; Common # Sm FRACTION SLASH +2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; Common # Sm COMMERCIAL MINUS SIGN +2053 ; Common # Po SWUNG DASH +2054 ; Common # Pc INVERTED UNDERTIE +2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; Common # Zs MEDIUM MATHEMATICAL SPACE +2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; Common # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; Common # No SUPERSCRIPT ZERO +2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE +207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE +208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS +20A0..20C0 ; Common # Sc [33] EURO-CURRENCY SIGN..SOM SIGN +2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; Common # L& DOUBLE-STRUCK CAPITAL C +2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA +2107 ; Common # L& EULER CONSTANT +2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT +210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L +2114 ; Common # So L B BAR SYMBOL +2115 ; Common # L& DOUBLE-STRUCK CAPITAL N +2116..2117 ; Common # So [2] NUMERO SIGN..SOUND RECORDING COPYRIGHT +2118 ; Common # Sm SCRIPT CAPITAL P +2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE +2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z +2125 ; Common # So OUNCE SIGN +2127 ; Common # So INVERTED OHM SIGN +2128 ; Common # L& BLACK-LETTER CAPITAL Z +2129 ; Common # So TURNED GREEK SMALL LETTER IOTA +212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; Common # So ESTIMATED SYMBOL +212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F +2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O +2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; Common # L& INFORMATION SOURCE +213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; Common # So PROPERTY LINE +214B ; Common # Sm TURNED AMPERSAND +214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB +214F ; Common # So SYMBOL FOR SAMARITAN SOURCE +2150..215F ; Common # No [16] VULGAR FRACTION ONE SEVENTH..FRACTION NUMERATOR ONE +2189 ; Common # No VULGAR FRACTION ZERO THIRDS +218A..218B ; Common # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW +219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW +21D3 ; Common # So DOWNWARDS DOUBLE ARROW +21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW +21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW +21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP +2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE +2308 ; Common # Ps LEFT CEILING +2309 ; Common # Pe RIGHT CEILING +230A ; Common # Ps LEFT FLOOR +230B ; Common # Pe RIGHT FLOOR +230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER +2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; Common # So [7] FROWN..KEYBOARD +2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET +232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET +232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..2426 ; Common # So [69] WHITE TRAPEZIUM..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO +2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE +25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE +25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE +25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE +25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE +2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN +266F ; Common # Sm MUSIC SHARP SIGN +2670..2767 ; Common # So [248] WEST SYRIAC CROSS..ROTATED FLORAL HEART BULLET +2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794..27BF ; Common # So [44] HEAVY WIDE-HEADED RIGHTWARDS ARROW..DOUBLE CURLY LOOP +27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; Common # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; Common # Ps LEFT WHITE CURLY BRACKET +2984 ; Common # Pe RIGHT WHITE CURLY BRACKET +2985 ; Common # Ps LEFT WHITE PARENTHESIS +2986 ; Common # Pe RIGHT WHITE PARENTHESIS +2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET +298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET +2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; Common # Ps LEFT WIGGLY FENCE +29D9 ; Common # Pe RIGHT WIGGLY FENCE +29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE +2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B73 ; Common # So [39] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; Common # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; Common # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET +2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET +2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; Common # Po RAISED SQUARE +2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET +2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; Common # Pd HYPHEN WITH DIAERESIS +2E1B ; Common # Po TILDE WITH RING ABOVE +2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; Common # Ps TOP LEFT HALF BRACKET +2E23 ; Common # Pe TOP RIGHT HALF BRACKET +2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET +2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET +2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS +2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; Common # Lm VERTICAL TILDE +2E30..2E39 ; Common # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; Common # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; Common # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; Common # Pd DOUBLE HYPHEN +2E41 ; Common # Po REVERSED COMMA +2E42 ; Common # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; Common # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; Common # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; Common # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; Common # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; Common # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; Common # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; Common # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; Common # Ps TOP HALF LEFT PARENTHESIS +2E5A ; Common # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; Common # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; Common # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; Common # Pd OBLIQUE HYPHEN +2FF0..2FFF ; Common # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3000 ; Common # Zs IDEOGRAPHIC SPACE +3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK +3008 ; Common # Ps LEFT ANGLE BRACKET +3009 ; Common # Pe RIGHT ANGLE BRACKET +300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET +300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; Common # Ps LEFT CORNER BRACKET +300D ; Common # Pe RIGHT CORNER BRACKET +300E ; Common # Ps LEFT WHITE CORNER BRACKET +300F ; Common # Pe RIGHT WHITE CORNER BRACKET +3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK +3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET +3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; Common # Ps LEFT WHITE SQUARE BRACKET +301B ; Common # Pe RIGHT WHITE SQUARE BRACKET +301C ; Common # Pd WAVE DASH +301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; Common # So POSTAL MARK FACE +3030 ; Common # Pd WAVY DASH +3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +303C ; Common # Lo MASU MARK +303D ; Common # Po PART ALTERNATION MARK +303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE +309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30FB ; Common # Po KATAKANA MIDDLE DOT +30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK +3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q +31EF ; Common # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; Common # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3248..324F ; Common # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +3250 ; Common # So PARTNERSHIP SIGN +3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +327F ; Common # So KOREAN STANDARD SYMBOL +3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN +32FF ; Common # So SQUARE ERA NAME REIWA +3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL +4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A830..A835 ; Common # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; Common # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; Common # Sc NORTH INDIC RUPEE MARK +A839 ; Common # So NORTH INDIC QUANTITY MARK +A92E ; Common # Po KAYAH LI SIGN CWI +A9CF ; Common # Lm JAVANESE PANGRANGKEP +AB5B ; Common # Sk MODIFIER BREVE WITH INVERTED BREVE +AB6A..AB6B ; Common # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +FD3E ; Common # Pe ORNATE LEFT PARENTHESIS +FD3F ; Common # Ps ORNATE RIGHT PARENTHESIS +FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; Common # Pd SMALL EM DASH +FE59 ; Common # Ps SMALL LEFT PARENTHESIS +FE5A ; Common # Pe SMALL RIGHT PARENTHESIS +FE5B ; Common # Ps SMALL LEFT CURLY BRACKET +FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET +FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; Common # Sm SMALL PLUS SIGN +FE63 ; Common # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; Common # Po SMALL REVERSE SOLIDUS +FE69 ; Common # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE +FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; Common # Po FULLWIDTH ASTERISK +FF0B ; Common # Sm FULLWIDTH PLUS SIGN +FF0C ; Common # Po FULLWIDTH COMMA +FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; Common # Pc FULLWIDTH LOW LINE +FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT +FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; Common # Sm FULLWIDTH VERTICAL LINE +FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; Common # Sm FULLWIDTH TILDE +FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; Common # Sm FULLWIDTH NOT SIGN +FFE3 ; Common # Sk FULLWIDTH MACRON +FFE4 ; Common # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN +FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE +FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER +10100..10102 ; Common # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10190..1019C ; Common # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +102E1..102FB ; Common # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +1BCA0..1BCA3 ; Common # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF50..1CFC3 ; Common # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AE..1D1EA ; Common # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D2C0..1D2D3 ; Common # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; Common # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; Common # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1EC71..1ECAB ; Common # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; Common # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; Common # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; Common # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; Common # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; Common # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; Common # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; Common # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK +1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; Common # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; Common # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CF ; Common # So [15] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD BLACK JOKER +1F0D1..1F0F5 ; Common # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F100..1F10C ; Common # No [13] DIGIT ZERO FULL STOP..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F1AD ; Common # So [161] CIRCLED ZERO WITH SLASH..MASK WORK SYMBOL +1F1E6..1F1FF ; Common # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F201..1F202 ; Common # So [2] SQUARED KATAKANA KOKO..SQUARED KATAKANA SA +1F210..1F23B ; Common # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; Common # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; Common # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; Common # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F3FA ; Common # So [251] CYCLONE..AMPHORA +1F3FB..1F3FF ; Common # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F6D7 ; Common # So [728] RAT..ELEVATOR +1F6DC..1F6EC ; Common # So [17] WIRELESS..AIRPLANE ARRIVING +1F6F0..1F6FC ; Common # So [13] SATELLITE..ROLLER SKATE +1F700..1F776 ; Common # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F7D9 ; Common # So [95] HAUMEA..NINE POINTED WHITE STAR +1F7E0..1F7EB ; Common # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0 ; Common # So HEAVY EQUALS SIGN +1F800..1F80B ; Common # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; Common # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; Common # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; Common # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; Common # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8B0..1F8B1 ; Common # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F900..1FA53 ; Common # So [340] CIRCLED CROSS FORMEE WITH FOUR DOTS..BLACK CHESS KNIGHT-BISHOP +1FA60..1FA6D ; Common # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA70..1FA7C ; Common # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; Common # So [9] YO-YO..FLUTE +1FA90..1FABD ; Common # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; Common # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; Common # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; Common # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; Common # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +1FB00..1FB92 ; Common # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; Common # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; Common # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +E0001 ; Common # Cf LANGUAGE TAG +E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG + +# Total code points: 8306 + +# ================================================ + +0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +00AA ; Latin # Lo FEMININE ORDINAL INDICATOR +00BA ; Latin # Lo MASCULINE ORDINAL INDICATOR +00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS +00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL +0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y +02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN +1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN +1D62..1D65 ; Latin # Lm [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V +1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH +1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP +2071 ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER I +207F ; Latin # Lm SUPERSCRIPT LATIN SMALL LETTER N +2090..209C ; Latin # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN +2132 ; Latin # L& TURNED CAPITAL F +214E ; Latin # L& TURNED SMALL F +2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +2C60..2C7B ; Latin # L& [28] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; Latin # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2C7F ; Latin # L& [2] LATIN CAPITAL LETTER S WITH SWASH TAIL..LATIN CAPITAL LETTER Z WITH SWASH TAIL +A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; Latin # Lm MODIFIER LETTER US +A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A78B..A78E ; Latin # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; Latin # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; Latin # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; Latin # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; Latin # L& LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; Latin # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; Latin # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; Latin # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; Latin # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; Latin # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; Latin # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M +AB30..AB5A ; Latin # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5C..AB5F ; Latin # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB64 ; Latin # L& [5] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER INVERTED ALPHA +AB66..AB68 ; Latin # L& [3] LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; Latin # Lm MODIFIER LETTER SMALL TURNED W +FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +10780..10785 ; Latin # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; Latin # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; Latin # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +1DF00..1DF09 ; Latin # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; Latin # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; Latin # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; Latin # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK + +# Total code points: 1481 + +# ================================================ + +0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; Greek # Lm GREEK YPOGEGRAMMENI +037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037F ; Greek # L& GREEK CAPITAL LETTER YOT +0384 ; Greek # Sk GREEK TONOS +0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO +03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI +03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL +03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI +1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI +1D66..1D6A ; Greek # Lm [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI +1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA +1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; Greek # Sk GREEK KORONIS +1FBE ; Greek # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA +2126 ; Greek # L& OHM SIGN +AB65 ; Greek # L& GREEK LETTER SMALL CAPITAL OMEGA +10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; Greek # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; Greek # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +101A0 ; Greek # So GREEK SYMBOL TAU RHO +1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; Greek # So GREEK MUSICAL LEIMMA + +# Total code points: 518 + +# ================================================ + +0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA +0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN +0483..0484 ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC PALATALIZATION +0487 ; Cyrillic # Mn COMBINING CYRILLIC POKRYTIE +0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..052F ; Cyrillic # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +1C80..1C88 ; Cyrillic # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL +1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN +2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +A640..A66D ; Cyrillic # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET +A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; Cyrillic # Po SLAVONIC ASTERISK +A674..A67D ; Cyrillic # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; Cyrillic # Po CYRILLIC KAVYKA +A67F ; Cyrillic # Lm CYRILLIC PAYEROK +A680..A69B ; Cyrillic # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; Cyrillic # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; Cyrillic # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +FE2E..FE2F ; Cyrillic # Mn [2] COMBINING CYRILLIC TITLO LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +1E030..1E06D ; Cyrillic # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; Cyrillic # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I + +# Total code points: 506 + +# ================================================ + +0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; Armenian # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; Armenian # Po ARMENIAN FULL STOP +058A ; Armenian # Pd ARMENIAN HYPHEN +058D..058E ; Armenian # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; Armenian # Sc ARMENIAN DRAM SIGN +FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH + +# Total code points: 96 + +# ================================================ + +0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF +05BF ; Hebrew # Mn HEBREW POINT RAFE +05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; Hebrew # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED + +# Total code points: 134 + +# ================================================ + +0600..0604 ; Arabic # Cf [5] ARABIC NUMBER SIGN..ARABIC SIGN SAMVAT +0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; Arabic # Sc AFGHANI SIGN +060D ; Arabic # Po ARABIC DATE SEPARATOR +060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061C ; Arabic # Cf ARABIC LETTER MARK +061D..061E ; Arabic # Po [2] ARABIC END OF TEXT MARK..ARABIC TRIPLE DOT PUNCTUATION MARK +0620..063F ; Arabic # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +0656..065F ; Arabic # Mn [10] ARABIC SUBSCRIPT ALEF..ARABIC WAVY HAMZA BELOW +0660..0669 ; Arabic # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; Arabic # Po ARABIC FULL STOP +06D5 ; Arabic # Lo ARABIC LETTER AE +06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DE ; Arabic # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; Arabic # So ARABIC PLACE OF SAJDAH +06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V +0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE +0870..0887 ; Arabic # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; Arabic # Sk ARABIC RAISED ROUND DOT +0889..088E ; Arabic # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; Arabic # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; Arabic # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; Arabic # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; Arabic # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; Arabic # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E3..08FF ; Arabic # Mn [29] ARABIC TURNED DAMMA BELOW..ARABIC MARK SIDEWAYS NOON GHUNNA +FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; Arabic # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD40..FD4F ; Arabic # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; Arabic # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; Arabic # Sc RIAL SIGN +FDFD..FDFF ; Arabic # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +10E60..10E7E ; Arabic # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10EFD..10EFF ; Arabic # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +1EE00..1EE03 ; Arabic # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; Arabic # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; Arabic # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; Arabic # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; Arabic # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; Arabic # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; Arabic # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; Arabic # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; Arabic # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; Arabic # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; Arabic # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; Arabic # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; Arabic # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; Arabic # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; Arabic # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; Arabic # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; Arabic # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; Arabic # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; Arabic # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; Arabic # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; Arabic # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; Arabic # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; Arabic # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; Arabic # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; Arabic # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; Arabic # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; Arabic # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; Arabic # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL + +# Total code points: 1368 + +# ================================================ + +0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; Syriac # Cf SYRIAC ABBREVIATION MARK +0710 ; Syriac # Lo SYRIAC LETTER ALAPH +0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE +0860..086A ; Syriac # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA + +# Total code points: 88 + +# ================================================ + +0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU +07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; Thaana # Lo THAANA LETTER NAA + +# Total code points: 50 + +# ================================================ + +0900..0902 ; Devanagari # Mn [3] DEVANAGARI SIGN INVERTED CANDRABINDU..DEVANAGARI SIGN ANUSVARA +0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; Devanagari # Mn DEVANAGARI VOWEL SIGN OE +093B ; Devanagari # Mc DEVANAGARI VOWEL SIGN OOE +093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA +093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; Devanagari # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; Devanagari # Lo DEVANAGARI OM +0955..0957 ; Devanagari # Mn [3] DEVANAGARI VOWEL SIGN CANDRA LONG E..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; Devanagari # Po DEVANAGARI ABBREVIATION SIGN +0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..097F ; Devanagari # Lo [14] DEVANAGARI LETTER CANDRA A..DEVANAGARI LETTER BBA +A8E0..A8F1 ; Devanagari # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; Devanagari # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; Devanagari # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; Devanagari # Lo DEVANAGARI HEADSTROKE +A8FC ; Devanagari # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; Devanagari # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; Devanagari # Mn DEVANAGARI VOWEL SIGN AY +11B00..11B09 ; Devanagari # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU + +# Total code points: 164 + +# ================================================ + +0980 ; Bengali # Lo BENGALI ANJI +0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; Bengali # Lo BENGALI LETTER LA +09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; Bengali # Mn BENGALI SIGN NUKTA +09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; Bengali # Mn BENGALI SIGN VIRAMA +09CE ; Bengali # Lo BENGALI LETTER KHANDA TA +09D7 ; Bengali # Mc BENGALI AU LENGTH MARK +09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; Bengali # So BENGALI ISSHAR +09FB ; Bengali # Sc BENGALI GANDA MARK +09FC ; Bengali # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; Bengali # Po BENGALI ABBREVIATION SIGN +09FE ; Bengali # Mn BENGALI SANDHI MARK + +# Total code points: 96 + +# ================================================ + +0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA +0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH +0A76 ; Gurmukhi # Po GURMUKHI ABBREVIATION SIGN + +# Total code points: 80 + +# ================================================ + +0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA +0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA +0AD0 ; Gujarati # Lo GUJARATI OM +0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; Gujarati # Po GUJARATI ABBREVIATION SIGN +0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN +0AF9 ; Gujarati # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; Gujarati # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE + +# Total code points: 91 + +# ================================================ + +0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; Oriya # Mn ORIYA SIGN NUKTA +0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA +0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA +0B3F ; Oriya # Mn ORIYA VOWEL SIGN I +0B40 ; Oriya # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; Oriya # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; Oriya # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; Oriya # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; Oriya # So ORIYA ISSHAR +0B71 ; Oriya # Lo ORIYA LETTER WA +0B72..0B77 ; Oriya # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS + +# Total code points: 91 + +# ================================================ + +0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA +0B83 ; Tamil # Lo TAMIL SIGN VISARGA +0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; Tamil # Lo TAMIL LETTER JA +0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; Tamil # Mn TAMIL SIGN VIRAMA +0BD0 ; Tamil # Lo TAMIL OM +0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; Tamil # Sc TAMIL RUPEE SIGN +0BFA ; Tamil # So TAMIL NUMBER SIGN +11FC0..11FD4 ; Tamil # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; Tamil # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; Tamil # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; Tamil # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; Tamil # Po TAMIL PUNCTUATION END OF TEXT + +# Total code points: 123 + +# ================================================ + +0C00 ; Telugu # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; Telugu # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; Telugu # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; Telugu # Mn TELUGU SIGN NUKTA +0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; Telugu # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; Telugu # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; Telugu # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; Telugu # So TELUGU SIGN TUUMU + +# Total code points: 100 + +# ================================================ + +0C80 ; Kannada # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; Kannada # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; Kannada # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; Kannada # Mn KANNADA SIGN NUKTA +0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA +0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA +0CBF ; Kannada # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; Kannada # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; Kannada # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; Kannada # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT + +# Total code points: 91 + +# ================================================ + +0D00..0D01 ; Malayalam # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; Malayalam # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; Malayalam # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; Malayalam # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA +0D4E ; Malayalam # Lo MALAYALAM LETTER DOT REPH +0D4F ; Malayalam # So MALAYALAM SIGN PARA +0D54..0D56 ; Malayalam # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; Malayalam # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; Malayalam # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; Malayalam # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; Malayalam # So MALAYALAM DATE MARK +0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K + +# Total code points: 118 + +# ================================================ + +0D81 ; Sinhala # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; Sinhala # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA +111E1..111F4 ; Sinhala # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND + +# Total code points: 111 + +# ================================================ + +0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; Thai # Po THAI CHARACTER FONGMAN +0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT + +# Total code points: 86 + +# ================================================ + +0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; Lao # Lo LAO LETTER KHO TAM +0E86..0E8A ; Lao # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; Lao # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; Lao # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; Lao # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; Lao # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; Lao # Lm LAO KO LA +0EC8..0ECE ; Lao # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; Lao # Lo [4] LAO HO NO..LAO LETTER KHMU NYO + +# Total code points: 83 + +# ================================================ + +0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; Tibetan # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; Tibetan # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS +0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; Tibetan # So TIBETAN MARK CHE MGO +0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU +0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; Tibetan # Po TIBETAN MARK PALUTA +0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; Tibetan # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; Tibetan # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD9..0FDA ; Tibetan # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS + +# Total code points: 207 + +# ================================================ + +1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E +1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; Myanmar # Mc MYANMAR SIGN VISARGA +1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; Myanmar # Lo MYANMAR LETTER GREAT SA +1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; Myanmar # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; Myanmar # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +A9E0..A9E4 ; Myanmar # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; Myanmar # Mn MYANMAR SIGN SHAN SAW +A9E6 ; Myanmar # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; Myanmar # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; Myanmar # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; Myanmar # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA60..AA6F ; Myanmar # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; Myanmar # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; Myanmar # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; Myanmar # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; Myanmar # Lo MYANMAR LETTER AITON RA +AA7B ; Myanmar # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; Myanmar # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; Myanmar # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AA7F ; Myanmar # Lo [2] MYANMAR LETTER SHWE PALAUNG CHA..MYANMAR LETTER SHWE PALAUNG SHA + +# Total code points: 223 + +# ================================================ + +10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; Georgian # L& GEORGIAN CAPITAL LETTER YN +10CD ; Georgian # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; Georgian # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; Georgian # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1C90..1CBA ; Georgian # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; Georgian # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; Georgian # L& GEORGIAN SMALL LETTER YN +2D2D ; Georgian # L& GEORGIAN SMALL LETTER AEN + +# Total code points: 173 + +# ================================================ + +1100..11FF ; Hangul # Lo [256] HANGUL CHOSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN +302E..302F ; Hangul # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U +A960..A97C ; Hangul # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +D7B0..D7C6 ; Hangul # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; Hangul # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I + +# Total code points: 11739 + +# ================================================ + +1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA +124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; Ethiopic # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368 ; Ethiopic # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +AB01..AB06 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; Ethiopic # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +1E7E0..1E7E6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; Ethiopic # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE + +# Total code points: 523 + +# ================================================ + +13A0..13F5 ; Cherokee # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; Cherokee # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +AB70..ABBF ; Cherokee # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA + +# Total code points: 172 + +# ================================================ + +1400 ; Canadian_Aboriginal # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; Canadian_Aboriginal # So CANADIAN SYLLABICS CHI SIGN +166E ; Canadian_Aboriginal # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; Canadian_Aboriginal # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +18B0..18F5 ; Canadian_Aboriginal # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +11AB0..11ABF ; Canadian_Aboriginal # Lo [16] CANADIAN SYLLABICS NATTILIK HI..CANADIAN SYLLABICS SPA + +# Total code points: 726 + +# ================================================ + +1680 ; Ogham # Zs OGHAM SPACE MARK +1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; Ogham # Ps OGHAM FEATHER MARK +169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK + +# Total code points: 29 + +# ================================================ + +16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; Runic # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC + +# Total code points: 86 + +# ================================================ + +1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; Khmer # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; Khmer # Mc KHMER VOWEL SIGN AA +17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; Khmer # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; Khmer # Lm KHMER SIGN LEK TOO +17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA +17DD ; Khmer # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC + +# Total code points: 146 + +# ================================================ + +1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS +1804 ; Mongolian # Po MONGOLIAN COLON +1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; Mongolian # Cf MONGOLIAN VOWEL SEPARATOR +180F ; Mongolian # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; Mongolian # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; Mongolian # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; Mongolian # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; Mongolian # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +11660..1166C ; Mongolian # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT + +# Total code points: 168 + +# ================================================ + +3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI +1B001..1B11F ; Hiragana # Lo [287] HIRAGANA LETTER ARCHAIC YE..HIRAGANA LETTER ARCHAIC WU +1B132 ; Hiragana # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; Hiragana # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1F200 ; Hiragana # So SQUARE HIRAGANA HOKA + +# Total code points: 381 + +# ================================================ + +30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK +30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO +31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO +3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO +FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +1AFF0..1AFF3 ; Katakana # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; Katakana # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; Katakana # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000 ; Katakana # Lo KATAKANA LETTER ARCHAIC E +1B120..1B122 ; Katakana # Lo [3] KATAKANA LETTER ARCHAIC YI..KATAKANA LETTER ARCHAIC WU +1B155 ; Katakana # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; Katakana # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N + +# Total code points: 321 + +# ================================================ + +02EA..02EB ; Bopomofo # Sk [2] MODIFIER LETTER YIN DEPARTING TONE MARK..MODIFIER LETTER YANG DEPARTING TONE MARK +3105..312F ; Bopomofo # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +31A0..31BF ; Bopomofo # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH + +# Total code points: 77 + +# ================================================ + +2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK +3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO +3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +3400..4DBF ; Han # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..9FFF ; Han # Lo [20992] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FFF +F900..FA6D ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +16FE2 ; Han # Po OLD CHINESE HOOK MARK +16FE3 ; Han # Lm OLD CHINESE ITERATION MARK +16FF0..16FF1 ; Han # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +20000..2A6DF ; Han # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B739 ; Han # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B740..2B81D ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; Han # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; Han # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; Han # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +30000..3134A ; Han # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; Han # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF + +# Total code points: 99030 + +# ================================================ + +A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E +A015 ; Yi # Lm YI SYLLABLE WU +A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE + +# Total code points: 1220 + +# ================================================ + +10300..1031F ; Old_Italic # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..1032F ; Old_Italic # Lo [3] OLD ITALIC LETTER YE..OLD ITALIC LETTER SOUTHERN TSE + +# Total code points: 39 + +# ================================================ + +10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA +10341 ; Gothic # Nl GOTHIC LETTER NINETY +10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED + +# Total code points: 27 + +# ================================================ + +10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW + +# Total code points: 80 + +# ================================================ + +0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0485..0486 ; Inherited # Mn [2] COMBINING CYRILLIC DASIA PNEUMATA..COMBINING CYRILLIC PSILI PNEUMATA +064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW +0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF +0951..0954 ; Inherited # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT +1AB0..1ABD ; Inherited # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; Inherited # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; Inherited # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1CD0..1CD2 ; Inherited # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD4..1CE0 ; Inherited # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE2..1CE8 ; Inherited # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CED ; Inherited # Mn VEDIC SIGN TIRYAK +1CF4 ; Inherited # Mn VEDIC TONE CANDRA ABOVE +1CF8..1CF9 ; Inherited # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1DC0..1DFF ; Inherited # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER +20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +302A..302D ; Inherited # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FE20..FE2D ; Inherited # Mn [14] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON BELOW +101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +102E0 ; Inherited # Mn COPTIC EPACT THOUSANDS MARK +1133B ; Inherited # Mn COMBINING BINDU BELOW +1CF00..1CF2D ; Inherited # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; Inherited # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 + +# Total code points: 657 + +# ================================================ + +1700..1711 ; Tagalog # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; Tagalog # Mc TAGALOG SIGN PAMUDPOD +171F ; Tagalog # Lo TAGALOG LETTER ARCHAIC RA + +# Total code points: 23 + +# ================================================ + +1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA +1732..1733 ; Hanunoo # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; Hanunoo # Mc HANUNOO SIGN PAMUDPOD + +# Total code points: 21 + +# ================================================ + +1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U + +# Total code points: 20 + +# ================================================ + +1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U + +# Total code points: 18 + +# ================================================ + +1900..191E ; Limbu # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; Limbu # So LIMBU SIGN LOO +1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE + +# Total code points: 68 + +# ================================================ + +1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 + +# Total code points: 35 + +# ================================================ + +10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 + +# Total code points: 211 + +# ================================================ + +10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; Ugaritic # Po UGARITIC WORD DIVIDER + +# Total code points: 31 + +# ================================================ + +10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW + +# Total code points: 48 + +# ================================================ + +10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO +104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE + +# Total code points: 40 + +# ================================================ + +10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA +1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO + +# Total code points: 55 + +# ================================================ + +2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 + +# Total code points: 256 + +# ================================================ + +1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; Buginese # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; Buginese # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION + +# Total code points: 30 + +# ================================================ + +03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI +2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI +2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; Coptic # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; Coptic # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; Coptic # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; Coptic # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER + +# Total code points: 137 + +# ================================================ + +1980..19AB ; New_Tai_Lue # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; New_Tai_Lue # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; New_Tai_Lue # No NEW TAI LUE THAM DIGIT ONE +19DE..19DF ; New_Tai_Lue # So [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV + +# Total code points: 83 + +# ================================================ + +2C00..2C5F ; Glagolitic # L& [96] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC SMALL LETTER CAUDATE CHRIVI +1E000..1E006 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; Glagolitic # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; Glagolitic # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; Glagolitic # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; Glagolitic # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA + +# Total code points: 134 + +# ================================================ + +2D30..2D67 ; Tifinagh # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; Tifinagh # Po TIFINAGH SEPARATOR MARK +2D7F ; Tifinagh # Mn TIFINAGH CONSONANT JOINER + +# Total code points: 59 + +# ================================================ + +A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I +A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA + +# Total code points: 45 + +# ================================================ + +103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED + +# Total code points: 50 + +# ================================================ + +10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A +10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; Kharoshthi # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; Kharoshthi # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES + +# Total code points: 68 + +# ================================================ + +1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; Balinese # Mc BALINESE SIGN BISAH +1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; Balinese # Mn BALINESE SIGN REREKAN +1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4C ; Balinese # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; Balinese # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG + +# Total code points: 124 + +# ================================================ + +12000..12399 ; Cuneiform # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; Cuneiform # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; Cuneiform # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; Cuneiform # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU + +# Total code points: 1234 + +# ================================================ + +10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; Phoenician # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR + +# Total code points: 29 + +# ================================================ + +A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD + +# Total code points: 56 + +# ================================================ + +07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; Nko # So NKO SYMBOL OO DENNEN +07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; Nko # Lm NKO LAJANYALAN +07FD ; Nko # Mn NKO DANTAYALAN +07FE..07FF ; Nko # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN + +# Total code points: 62 + +# ================================================ + +1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; Sundanese # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BBF ; Sundanese # Lo [6] SUNDANESE AVAGRAHA..SUNDANESE LETTER FINAL M +1CC0..1CC7 ; Sundanese # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA + +# Total code points: 72 + +# ================================================ + +1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA + +# Total code points: 74 + +# ================================================ + +1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD + +# Total code points: 48 + +# ================================================ + +A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; Vai # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO + +# Total code points: 300 + +# ================================================ + +A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; Saurashtra # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE + +# Total code points: 82 + +# ================================================ + +A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92F ; Kayah_Li # Po KAYAH LI SIGN SHYA + +# Total code points: 47 + +# ================================================ + +A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; Rejang # Po REJANG SECTION MARK + +# Total code points: 37 + +# ================================================ + +10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X + +# Total code points: 29 + +# ================================================ + +102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 + +# Total code points: 49 + +# ================================================ + +10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; Lydian # Po LYDIAN TRIANGULAR MARK + +# Total code points: 27 + +# ================================================ + +AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA + +# Total code points: 83 + +# ================================================ + +1A20..1A54 ; Tai_Tham # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; Tai_Tham # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; Tai_Tham # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; Tai_Tham # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; Tai_Tham # Mn TAI THAM SIGN SAKOT +1A61 ; Tai_Tham # Mc TAI THAM VOWEL SIGN A +1A62 ; Tai_Tham # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; Tai_Tham # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; Tai_Tham # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; Tai_Tham # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; Tai_Tham # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; Tai_Tham # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; Tai_Tham # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; Tai_Tham # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; Tai_Tham # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; Tai_Tham # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; Tai_Tham # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG + +# Total code points: 127 + +# ================================================ + +AA80..AAAF ; Tai_Viet # Lo [48] TAI VIET LETTER LOW KO..TAI VIET LETTER HIGH O +AAB0 ; Tai_Viet # Mn TAI VIET MAI KANG +AAB1 ; Tai_Viet # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; Tai_Viet # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; Tai_Viet # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; Tai_Viet # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; Tai_Viet # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; Tai_Viet # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; Tai_Viet # Lo TAI VIET TONE MAI NUENG +AAC1 ; Tai_Viet # Mn TAI VIET TONE MAI THO +AAC2 ; Tai_Viet # Lo TAI VIET TONE MAI SONG +AADB..AADC ; Tai_Viet # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; Tai_Viet # Lm TAI VIET SYMBOL SAM +AADE..AADF ; Tai_Viet # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI + +# Total code points: 72 + +# ================================================ + +10B00..10B35 ; Avestan # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; Avestan # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION + +# Total code points: 61 + +# ================================================ + +13000..1342F ; Egyptian_Hieroglyphs # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F ; Egyptian_Hieroglyphs # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; Egyptian_Hieroglyphs # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; Egyptian_Hieroglyphs # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; Egyptian_Hieroglyphs # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED + +# Total code points: 1110 + +# ================================================ + +0800..0815 ; Samaritan # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; Samaritan # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; Samaritan # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; Samaritan # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; Samaritan # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; Samaritan # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; Samaritan # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; Samaritan # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; Samaritan # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU + +# Total code points: 61 + +# ================================================ + +A4D0..A4F7 ; Lisu # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; Lisu # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; Lisu # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +11FB0 ; Lisu # Lo LISU LETTER YHA + +# Total code points: 49 + +# ================================================ + +A6A0..A6E5 ; Bamum # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; Bamum # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; Bamum # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; Bamum # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +16800..16A38 ; Bamum # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ + +# Total code points: 657 + +# ================================================ + +A980..A982 ; Javanese # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; Javanese # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; Javanese # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; Javanese # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; Javanese # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; Javanese # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; Javanese # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; Javanese # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9C0 ; Javanese # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +A9C1..A9CD ; Javanese # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9D0..A9D9 ; Javanese # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; Javanese # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN + +# Total code points: 90 + +# ================================================ + +AAE0..AAEA ; Meetei_Mayek # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; Meetei_Mayek # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; Meetei_Mayek # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; Meetei_Mayek # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; Meetei_Mayek # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; Meetei_Mayek # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; Meetei_Mayek # Mn MEETEI MAYEK VIRAMA +ABC0..ABE2 ; Meetei_Mayek # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; Meetei_Mayek # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; Meetei_Mayek # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; Meetei_Mayek # Po MEETEI MAYEK CHEIKHEI +ABEC ; Meetei_Mayek # Mc MEETEI MAYEK LUM IYEK +ABED ; Meetei_Mayek # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; Meetei_Mayek # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE + +# Total code points: 79 + +# ================================================ + +10840..10855 ; Imperial_Aramaic # Lo [22] IMPERIAL ARAMAIC LETTER ALEPH..IMPERIAL ARAMAIC LETTER TAW +10857 ; Imperial_Aramaic # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; Imperial_Aramaic # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND + +# Total code points: 31 + +# ================================================ + +10A60..10A7C ; Old_South_Arabian # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; Old_South_Arabian # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; Old_South_Arabian # Po OLD SOUTH ARABIAN NUMERIC INDICATOR + +# Total code points: 32 + +# ================================================ + +10B40..10B55 ; Inscriptional_Parthian # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; Inscriptional_Parthian # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND + +# Total code points: 30 + +# ================================================ + +10B60..10B72 ; Inscriptional_Pahlavi # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; Inscriptional_Pahlavi # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND + +# Total code points: 27 + +# ================================================ + +10C00..10C48 ; Old_Turkic # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH + +# Total code points: 73 + +# ================================================ + +11080..11081 ; Kaithi # Mn [2] KAITHI SIGN CANDRABINDU..KAITHI SIGN ANUSVARA +11082 ; Kaithi # Mc KAITHI SIGN VISARGA +11083..110AF ; Kaithi # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; Kaithi # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; Kaithi # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; Kaithi # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; Kaithi # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; Kaithi # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; Kaithi # Cf KAITHI NUMBER SIGN +110BE..110C1 ; Kaithi # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; Kaithi # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; Kaithi # Cf KAITHI NUMBER SIGN ABOVE + +# Total code points: 68 + +# ================================================ + +1BC0..1BE5 ; Batak # Lo [38] BATAK LETTER A..BATAK LETTER U +1BE6 ; Batak # Mn BATAK SIGN TOMPI +1BE7 ; Batak # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; Batak # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; Batak # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; Batak # Mn BATAK VOWEL SIGN KARO O +1BEE ; Batak # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; Batak # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; Batak # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; Batak # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT + +# Total code points: 56 + +# ================================================ + +11000 ; Brahmi # Mc BRAHMI SIGN CANDRABINDU +11001 ; Brahmi # Mn BRAHMI SIGN ANUSVARA +11002 ; Brahmi # Mc BRAHMI SIGN VISARGA +11003..11037 ; Brahmi # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; Brahmi # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D ; Brahmi # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; Brahmi # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; Brahmi # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; Brahmi # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; Brahmi # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; Brahmi # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; Brahmi # Lo BRAHMI LETTER OLD TAMIL LLA +1107F ; Brahmi # Mn BRAHMI NUMBER JOINER + +# Total code points: 115 + +# ================================================ + +0840..0858 ; Mandaic # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; Mandaic # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; Mandaic # Po MANDAIC PUNCTUATION + +# Total code points: 29 + +# ================================================ + +11100..11102 ; Chakma # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; Chakma # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; Chakma # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; Chakma # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; Chakma # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; Chakma # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; Chakma # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; Chakma # Lo CHAKMA LETTER LHAA +11145..11146 ; Chakma # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; Chakma # Lo CHAKMA LETTER VAA + +# Total code points: 71 + +# ================================================ + +109A0..109B7 ; Meroitic_Cursive # Lo [24] MEROITIC CURSIVE LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; Meroitic_Cursive # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; Meroitic_Cursive # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; Meroitic_Cursive # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; Meroitic_Cursive # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS + +# Total code points: 90 + +# ================================================ + +10980..1099F ; Meroitic_Hieroglyphs # Lo [32] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2 + +# Total code points: 32 + +# ================================================ + +16F00..16F4A ; Miao # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; Miao # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; Miao # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; Miao # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; Miao # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; Miao # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 + +# Total code points: 149 + +# ================================================ + +11180..11181 ; Sharada # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; Sharada # Mc SHARADA SIGN VISARGA +11183..111B2 ; Sharada # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; Sharada # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; Sharada # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; Sharada # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; Sharada # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; Sharada # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC ; Sharada # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; Sharada # Po SHARADA SUTRA MARK +111CE ; Sharada # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; Sharada # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; Sharada # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; Sharada # Lo SHARADA EKAM +111DB ; Sharada # Po SHARADA SIGN SIDDHAM +111DC ; Sharada # Lo SHARADA HEADSTROKE +111DD..111DF ; Sharada # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 + +# Total code points: 96 + +# ================================================ + +110D0..110E8 ; Sora_Sompeng # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; Sora_Sompeng # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE + +# Total code points: 35 + +# ================================================ + +11680..116AA ; Takri # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; Takri # Mn TAKRI SIGN ANUSVARA +116AC ; Takri # Mc TAKRI SIGN VISARGA +116AD ; Takri # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; Takri # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; Takri # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; Takri # Mc TAKRI SIGN VIRAMA +116B7 ; Takri # Mn TAKRI SIGN NUKTA +116B8 ; Takri # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; Takri # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; Takri # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE + +# Total code points: 68 + +# ================================================ + +10530..10563 ; Caucasian_Albanian # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; Caucasian_Albanian # Po CAUCASIAN ALBANIAN CITATION MARK + +# Total code points: 53 + +# ================================================ + +16AD0..16AED ; Bassa_Vah # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; Bassa_Vah # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; Bassa_Vah # Po BASSA VAH FULL STOP + +# Total code points: 36 + +# ================================================ + +1BC00..1BC6A ; Duployan # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; Duployan # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; Duployan # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; Duployan # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; Duployan # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; Duployan # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; Duployan # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP + +# Total code points: 143 + +# ================================================ + +10500..10527 ; Elbasan # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE + +# Total code points: 40 + +# ================================================ + +11300..11301 ; Grantha # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; Grantha # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; Grantha # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; Grantha # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; Grantha # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; Grantha # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; Grantha # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; Grantha # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133C ; Grantha # Mn GRANTHA SIGN NUKTA +1133D ; Grantha # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; Grantha # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; Grantha # Mn GRANTHA VOWEL SIGN II +11341..11344 ; Grantha # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; Grantha # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; Grantha # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; Grantha # Lo GRANTHA OM +11357 ; Grantha # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; Grantha # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; Grantha # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; Grantha # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; Grantha # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA + +# Total code points: 85 + +# ================================================ + +16B00..16B2F ; Pahawh_Hmong # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; Pahawh_Hmong # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B ; Pahawh_Hmong # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; Pahawh_Hmong # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; Pahawh_Hmong # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; Pahawh_Hmong # Po PAHAWH HMONG SIGN XAUS +16B45 ; Pahawh_Hmong # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; Pahawh_Hmong # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; Pahawh_Hmong # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; Pahawh_Hmong # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; Pahawh_Hmong # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ + +# Total code points: 127 + +# ================================================ + +11200..11211 ; Khojki # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; Khojki # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; Khojki # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; Khojki # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; Khojki # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; Khojki # Mn KHOJKI SIGN ANUSVARA +11235 ; Khojki # Mc KHOJKI SIGN VIRAMA +11236..11237 ; Khojki # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..1123D ; Khojki # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; Khojki # Mn KHOJKI SIGN SUKUN +1123F..11240 ; Khojki # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; Khojki # Mn KHOJKI VOWEL SIGN VOCALIC R + +# Total code points: 65 + +# ================================================ + +10600..10736 ; Linear_A # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; Linear_A # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; Linear_A # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 + +# Total code points: 341 + +# ================================================ + +11150..11172 ; Mahajani # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; Mahajani # Mn MAHAJANI SIGN NUKTA +11174..11175 ; Mahajani # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; Mahajani # Lo MAHAJANI LIGATURE SHRI + +# Total code points: 39 + +# ================================================ + +10AC0..10AC7 ; Manichaean # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; Manichaean # So MANICHAEAN SIGN UD +10AC9..10AE4 ; Manichaean # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; Manichaean # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; Manichaean # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; Manichaean # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER + +# Total code points: 51 + +# ================================================ + +1E800..1E8C4 ; Mende_Kikakui # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; Mende_Kikakui # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; Mende_Kikakui # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS + +# Total code points: 213 + +# ================================================ + +11600..1162F ; Modi # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; Modi # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; Modi # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; Modi # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; Modi # Mn MODI SIGN ANUSVARA +1163E ; Modi # Mc MODI SIGN VISARGA +1163F..11640 ; Modi # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11643 ; Modi # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; Modi # Lo MODI SIGN HUVA +11650..11659 ; Modi # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE + +# Total code points: 79 + +# ================================================ + +16A40..16A5E ; Mro # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; Mro # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; Mro # Po [2] MRO DANDA..MRO DOUBLE DANDA + +# Total code points: 43 + +# ================================================ + +10A80..10A9C ; Old_North_Arabian # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; Old_North_Arabian # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY + +# Total code points: 32 + +# ================================================ + +10880..1089E ; Nabataean # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; Nabataean # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED + +# Total code points: 40 + +# ================================================ + +10860..10876 ; Palmyrene # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; Palmyrene # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; Palmyrene # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY + +# Total code points: 32 + +# ================================================ + +11AC0..11AF8 ; Pau_Cin_Hau # Lo [57] PAU CIN HAU LETTER PA..PAU CIN HAU GLOTTAL STOP FINAL + +# Total code points: 57 + +# ================================================ + +10350..10375 ; Old_Permic # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; Old_Permic # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII + +# Total code points: 43 + +# ================================================ + +10B80..10B91 ; Psalter_Pahlavi # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; Psalter_Pahlavi # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; Psalter_Pahlavi # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED + +# Total code points: 29 + +# ================================================ + +11580..115AE ; Siddham # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; Siddham # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; Siddham # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; Siddham # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; Siddham # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; Siddham # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; Siddham # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7 ; Siddham # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; Siddham # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; Siddham # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU + +# Total code points: 92 + +# ================================================ + +112B0..112DE ; Khudawadi # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; Khudawadi # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; Khudawadi # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; Khudawadi # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; Khudawadi # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE + +# Total code points: 69 + +# ================================================ + +11480..114AF ; Tirhuta # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; Tirhuta # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; Tirhuta # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; Tirhuta # Mc TIRHUTA VOWEL SIGN E +114BA ; Tirhuta # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; Tirhuta # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; Tirhuta # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; Tirhuta # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; Tirhuta # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; Tirhuta # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; Tirhuta # Po TIRHUTA ABBREVIATION SIGN +114C7 ; Tirhuta # Lo TIRHUTA OM +114D0..114D9 ; Tirhuta # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE + +# Total code points: 82 + +# ================================================ + +118A0..118DF ; Warang_Citi # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; Warang_Citi # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; Warang_Citi # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF ; Warang_Citi # Lo WARANG CITI OM + +# Total code points: 84 + +# ================================================ + +11700..1171A ; Ahom # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; Ahom # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; Ahom # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; Ahom # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; Ahom # Mc AHOM VOWEL SIGN E +11727..1172B ; Ahom # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; Ahom # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; Ahom # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; Ahom # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; Ahom # So AHOM SYMBOL VI +11740..11746 ; Ahom # Lo [7] AHOM LETTER CA..AHOM LETTER LLA + +# Total code points: 65 + +# ================================================ + +14400..14646 ; Anatolian_Hieroglyphs # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 + +# Total code points: 583 + +# ================================================ + +108E0..108F2 ; Hatran # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; Hatran # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; Hatran # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED + +# Total code points: 26 + +# ================================================ + +11280..11286 ; Multani # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; Multani # Lo MULTANI LETTER GHA +1128A..1128D ; Multani # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; Multani # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; Multani # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; Multani # Po MULTANI SECTION MARK + +# Total code points: 38 + +# ================================================ + +10C80..10CB2 ; Old_Hungarian # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; Old_Hungarian # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; Old_Hungarian # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND + +# Total code points: 108 + +# ================================================ + +1D800..1D9FF ; SignWriting # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; SignWriting # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; SignWriting # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; SignWriting # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; SignWriting # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; SignWriting # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; SignWriting # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; SignWriting # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; SignWriting # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; SignWriting # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; SignWriting # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; SignWriting # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 + +# Total code points: 672 + +# ================================================ + +1E900..1E943 ; Adlam # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; Adlam # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; Adlam # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; Adlam # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; Adlam # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK + +# Total code points: 88 + +# ================================================ + +11C00..11C08 ; Bhaiksuki # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; Bhaiksuki # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; Bhaiksuki # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; Bhaiksuki # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; Bhaiksuki # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; Bhaiksuki # Mc BHAIKSUKI SIGN VISARGA +11C3F ; Bhaiksuki # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; Bhaiksuki # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; Bhaiksuki # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; Bhaiksuki # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; Bhaiksuki # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK + +# Total code points: 97 + +# ================================================ + +11C70..11C71 ; Marchen # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; Marchen # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; Marchen # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; Marchen # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; Marchen # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; Marchen # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; Marchen # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; Marchen # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; Marchen # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU + +# Total code points: 68 + +# ================================================ + +11400..11434 ; Newa # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; Newa # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; Newa # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; Newa # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; Newa # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; Newa # Mc NEWA SIGN VISARGA +11446 ; Newa # Mn NEWA SIGN NUKTA +11447..1144A ; Newa # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; Newa # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; Newa # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; Newa # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; Newa # Po NEWA INSERTION SIGN +1145E ; Newa # Mn NEWA SANDHI MARK +1145F..11461 ; Newa # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA + +# Total code points: 97 + +# ================================================ + +104B0..104D3 ; Osage # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; Osage # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA + +# Total code points: 72 + +# ================================================ + +16FE0 ; Tangut # Lm TANGUT ITERATION MARK +17000..187F7 ; Tangut # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18AFF ; Tangut # Lo [768] TANGUT COMPONENT-001..TANGUT COMPONENT-768 +18D00..18D08 ; Tangut # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 + +# Total code points: 6914 + +# ================================================ + +11D00..11D06 ; Masaram_Gondi # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; Masaram_Gondi # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; Masaram_Gondi # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; Masaram_Gondi # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; Masaram_Gondi # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; Masaram_Gondi # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; Masaram_Gondi # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; Masaram_Gondi # Lo MASARAM GONDI REPHA +11D47 ; Masaram_Gondi # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; Masaram_Gondi # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE + +# Total code points: 75 + +# ================================================ + +16FE1 ; Nushu # Lm NUSHU ITERATION MARK +1B170..1B2FB ; Nushu # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB + +# Total code points: 397 + +# ================================================ + +11A50 ; Soyombo # Lo SOYOMBO LETTER A +11A51..11A56 ; Soyombo # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; Soyombo # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; Soyombo # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; Soyombo # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; Soyombo # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; Soyombo # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; Soyombo # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; Soyombo # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; Soyombo # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; Soyombo # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 + +# Total code points: 83 + +# ================================================ + +11A00 ; Zanabazar_Square # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; Zanabazar_Square # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; Zanabazar_Square # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; Zanabazar_Square # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; Zanabazar_Square # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; Zanabazar_Square # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; Zanabazar_Square # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; Zanabazar_Square # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; Zanabazar_Square # Mn ZANABAZAR SQUARE SUBJOINER + +# Total code points: 72 + +# ================================================ + +11800..1182B ; Dogra # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; Dogra # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; Dogra # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; Dogra # Mc DOGRA SIGN VISARGA +11839..1183A ; Dogra # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; Dogra # Po DOGRA ABBREVIATION SIGN + +# Total code points: 60 + +# ================================================ + +11D60..11D65 ; Gunjala_Gondi # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; Gunjala_Gondi # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; Gunjala_Gondi # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; Gunjala_Gondi # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; Gunjala_Gondi # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; Gunjala_Gondi # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; Gunjala_Gondi # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; Gunjala_Gondi # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; Gunjala_Gondi # Mn GUNJALA GONDI VIRAMA +11D98 ; Gunjala_Gondi # Lo GUNJALA GONDI OM +11DA0..11DA9 ; Gunjala_Gondi # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE + +# Total code points: 63 + +# ================================================ + +11EE0..11EF2 ; Makasar # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; Makasar # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; Makasar # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; Makasar # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION + +# Total code points: 25 + +# ================================================ + +16E40..16E7F ; Medefaidrin # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; Medefaidrin # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; Medefaidrin # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH + +# Total code points: 91 + +# ================================================ + +10D00..10D23 ; Hanifi_Rohingya # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; Hanifi_Rohingya # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; Hanifi_Rohingya # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE + +# Total code points: 50 + +# ================================================ + +10F30..10F45 ; Sogdian # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; Sogdian # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; Sogdian # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; Sogdian # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT + +# Total code points: 42 + +# ================================================ + +10F00..10F1C ; Old_Sogdian # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; Old_Sogdian # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; Old_Sogdian # Lo OLD SOGDIAN LIGATURE AYIN-DALETH + +# Total code points: 40 + +# ================================================ + +10FE0..10FF6 ; Elymaic # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH + +# Total code points: 23 + +# ================================================ + +119A0..119A7 ; Nandinagari # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; Nandinagari # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; Nandinagari # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; Nandinagari # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; Nandinagari # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; Nandinagari # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; Nandinagari # Mn NANDINAGARI SIGN VIRAMA +119E1 ; Nandinagari # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; Nandinagari # Po NANDINAGARI SIGN SIDDHAM +119E3 ; Nandinagari # Lo NANDINAGARI HEADSTROKE +119E4 ; Nandinagari # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E + +# Total code points: 65 + +# ================================================ + +1E100..1E12C ; Nyiakeng_Puachue_Hmong # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; Nyiakeng_Puachue_Hmong # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; Nyiakeng_Puachue_Hmong # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; Nyiakeng_Puachue_Hmong # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; Nyiakeng_Puachue_Hmong # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; Nyiakeng_Puachue_Hmong # So NYIAKENG PUACHUE HMONG CIRCLED CA + +# Total code points: 71 + +# ================================================ + +1E2C0..1E2EB ; Wancho # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; Wancho # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; Wancho # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; Wancho # Sc WANCHO NGUN SIGN + +# Total code points: 59 + +# ================================================ + +10FB0..10FC4 ; Chorasmian # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; Chorasmian # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED + +# Total code points: 28 + +# ================================================ + +11900..11906 ; Dives_Akuru # Lo [7] DIVES AKURU LETTER A..DIVES AKURU LETTER E +11909 ; Dives_Akuru # Lo DIVES AKURU LETTER O +1190C..11913 ; Dives_Akuru # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; Dives_Akuru # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; Dives_Akuru # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; Dives_Akuru # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; Dives_Akuru # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; Dives_Akuru # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; Dives_Akuru # Mc DIVES AKURU SIGN HALANTA +1193E ; Dives_Akuru # Mn DIVES AKURU VIRAMA +1193F ; Dives_Akuru # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; Dives_Akuru # Mc DIVES AKURU MEDIAL YA +11941 ; Dives_Akuru # Lo DIVES AKURU INITIAL RA +11942 ; Dives_Akuru # Mc DIVES AKURU MEDIAL RA +11943 ; Dives_Akuru # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; Dives_Akuru # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; Dives_Akuru # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE + +# Total code points: 72 + +# ================================================ + +16FE4 ; Khitan_Small_Script # Mn KHITAN SMALL SCRIPT FILLER +18B00..18CD5 ; Khitan_Small_Script # Lo [470] KHITAN SMALL SCRIPT CHARACTER-18B00..KHITAN SMALL SCRIPT CHARACTER-18CD5 + +# Total code points: 471 + +# ================================================ + +10E80..10EA9 ; Yezidi # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; Yezidi # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; Yezidi # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; Yezidi # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE + +# Total code points: 47 + +# ================================================ + +12F90..12FF0 ; Cypro_Minoan # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; Cypro_Minoan # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 + +# Total code points: 99 + +# ================================================ + +10F70..10F81 ; Old_Uyghur # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; Old_Uyghur # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; Old_Uyghur # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS + +# Total code points: 26 + +# ================================================ + +16A70..16ABE ; Tangsa # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; Tangsa # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE + +# Total code points: 89 + +# ================================================ + +1E290..1E2AD ; Toto # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; Toto # Mn TOTO SIGN RISING TONE + +# Total code points: 31 + +# ================================================ + +10570..1057A ; Vithkuqi # L& [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; Vithkuqi # L& [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; Vithkuqi # L& [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; Vithkuqi # L& [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; Vithkuqi # L& [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; Vithkuqi # L& [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; Vithkuqi # L& [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; Vithkuqi # L& [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE + +# Total code points: 70 + +# ================================================ + +11F00..11F01 ; Kawi # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; Kawi # Lo KAWI SIGN REPHA +11F03 ; Kawi # Mc KAWI SIGN VISARGA +11F04..11F10 ; Kawi # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; Kawi # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; Kawi # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; Kawi # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; Kawi # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; Kawi # Mn KAWI VOWEL SIGN EU +11F41 ; Kawi # Mc KAWI SIGN KILLER +11F42 ; Kawi # Mn KAWI CONJOINER +11F43..11F4F ; Kawi # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; Kawi # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE + +# Total code points: 86 + +# ================================================ + +1E4D0..1E4EA ; Nag_Mundari # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; Nag_Mundari # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; Nag_Mundari # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; Nag_Mundari # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE + +# Total code points: 42 + +# EOF diff --git a/unicode-data/SpecialCasing.txt b/unicode-data/SpecialCasing.txt new file mode 100644 index 0000000..de08450 --- /dev/null +++ b/unicode-data/SpecialCasing.txt @@ -0,0 +1,281 @@ +# SpecialCasing-15.1.0.txt +# Date: 2023-01-05, 20:35:03 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ +# +# Special Casing +# +# This file is a supplement to the UnicodeData.txt file. It does not define any +# properties, but rather provides additional information about the casing of +# Unicode characters, for situations when casing incurs a change in string length +# or is dependent on context or locale. For compatibility, the UnicodeData.txt +# file only contains simple case mappings for characters where they are one-to-one +# and independent of context and language. The data in this file, combined with +# the simple case mappings in UnicodeData.txt, defines the full case mappings +# Lowercase_Mapping (lc), Titlecase_Mapping (tc), and Uppercase_Mapping (uc). +# +# Note that the preferred mechanism for defining tailored casing operations is +# the Unicode Common Locale Data Repository (CLDR). For more information, see the +# discussion of case mappings and case algorithms in the Unicode Standard. +# +# All code points not listed in this file that do not have a simple case mappings +# in UnicodeData.txt map to themselves. +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# ; ; ; <upper>; (<condition_list>;)? # <comment> +# +# <code>, <lower>, <title>, and <upper> provide the respective full case mappings +# of <code>, expressed as character values in hex. If there is more than one character, +# they are separated by spaces. Other than as used to separate elements, spaces are +# to be ignored. +# +# The <condition_list> is optional. Where present, it consists of one or more language IDs +# or casing contexts, separated by spaces. In these conditions: +# - A condition list overrides the normal behavior if all of the listed conditions are true. +# - The casing context is always the context of the characters in the original string, +# NOT in the resulting string. +# - Case distinctions in the condition list are not significant. +# - Conditions preceded by "Not_" represent the negation of the condition. +# The condition list is not represented in the UCD as a formal property. +# +# A language ID is defined by BCP 47, with '-' and '_' treated equivalently. +# +# A casing context for a character is defined by Section 3.13 Default Case Algorithms +# of The Unicode Standard. +# +# Parsers of this file must be prepared to deal with future additions to this format: +# * Additional contexts +# * Additional fields +# ================================================================================ + +# ================================================================================ +# Unconditional mappings +# ================================================================================ + +# The German es-zed is special--the normal mapping is to SS. +# Note: the titlecase should never occur in practice. It is equal to titlecase(uppercase(<es-zed>)) + +00DF; 00DF; 0053 0073; 0053 0053; # LATIN SMALL LETTER SHARP S + +# Preserve canonical equivalence for I with dot. Turkic is handled below. + +0130; 0069 0307; 0130; 0130; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# Ligatures + +FB00; FB00; 0046 0066; 0046 0046; # LATIN SMALL LIGATURE FF +FB01; FB01; 0046 0069; 0046 0049; # LATIN SMALL LIGATURE FI +FB02; FB02; 0046 006C; 0046 004C; # LATIN SMALL LIGATURE FL +FB03; FB03; 0046 0066 0069; 0046 0046 0049; # LATIN SMALL LIGATURE FFI +FB04; FB04; 0046 0066 006C; 0046 0046 004C; # LATIN SMALL LIGATURE FFL +FB05; FB05; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE LONG S T +FB06; FB06; 0053 0074; 0053 0054; # LATIN SMALL LIGATURE ST + +0587; 0587; 0535 0582; 0535 0552; # ARMENIAN SMALL LIGATURE ECH YIWN +FB13; FB13; 0544 0576; 0544 0546; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; FB14; 0544 0565; 0544 0535; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; FB15; 0544 056B; 0544 053B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; FB16; 054E 0576; 054E 0546; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; FB17; 0544 056D; 0544 053D; # ARMENIAN SMALL LIGATURE MEN XEH + +# No corresponding uppercase precomposed character + +0149; 0149; 02BC 004E; 02BC 004E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +0390; 0390; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03B0; 03B0; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +01F0; 01F0; 004A 030C; 004A 030C; # LATIN SMALL LETTER J WITH CARON +1E96; 1E96; 0048 0331; 0048 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; 1E97; 0054 0308; 0054 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; 1E98; 0057 030A; 0057 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; 1E99; 0059 030A; 0059 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; 1E9A; 0041 02BE; 0041 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1F50; 1F50; 03A5 0313; 03A5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; 1F52; 03A5 0313 0300; 03A5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; 1F54; 03A5 0313 0301; 03A5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; 1F56; 03A5 0313 0342; 03A5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1FB6; 1FB6; 0391 0342; 0391 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FC6; 1FC6; 0397 0342; 0397 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FD2; 1FD2; 0399 0308 0300; 0399 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; 1FD3; 0399 0308 0301; 0399 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; 1FD6; 0399 0342; 0399 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; 1FD7; 0399 0308 0342; 0399 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FE2; 1FE2; 03A5 0308 0300; 03A5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; 1FE3; 03A5 0308 0301; 03A5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; 1FE4; 03A1 0313; 03A1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; 1FE6; 03A5 0342; 03A5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; 1FE7; 03A5 0308 0342; 03A5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FF6; 1FF6; 03A9 0342; 03A9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI + +# IMPORTANT-when iota-subscript (0345) is uppercased or titlecased, +# the result will be incorrect unless the iota-subscript is moved to the end +# of any sequence of combining marks. Otherwise, the accents will go on the capital iota. +# This process can be achieved by first transforming the text to NFC before casing. +# E.g. <alpha><iota_subscript><acute> is uppercased to <ALPHA><acute><IOTA> + +# The following cases are already in the UnicodeData.txt file, so are only commented here. + +# 0345; 0345; 0399; 0399; # COMBINING GREEK YPOGEGRAMMENI + +# All letters with YPOGEGRAMMENI (iota-subscript) or PROSGEGRAMMENI (iota adscript) +# have special uppercases. +# Note: characters with PROSGEGRAMMENI are actually titlecase, not uppercase! + +1F80; 1F80; 1F88; 1F08 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; 1F81; 1F89; 1F09 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; 1F82; 1F8A; 1F0A 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; 1F83; 1F8B; 1F0B 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; 1F84; 1F8C; 1F0C 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; 1F85; 1F8D; 1F0D 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; 1F86; 1F8E; 1F0E 0399; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; 1F87; 1F8F; 1F0F 0399; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; 1F80; 1F88; 1F08 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; 1F81; 1F89; 1F09 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; 1F82; 1F8A; 1F0A 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; 1F83; 1F8B; 1F0B 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; 1F84; 1F8C; 1F0C 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; 1F85; 1F8D; 1F0D 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; 1F86; 1F8E; 1F0E 0399; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; 1F87; 1F8F; 1F0F 0399; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; 1F90; 1F98; 1F28 0399; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; 1F91; 1F99; 1F29 0399; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; 1F92; 1F9A; 1F2A 0399; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; 1F93; 1F9B; 1F2B 0399; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; 1F94; 1F9C; 1F2C 0399; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; 1F95; 1F9D; 1F2D 0399; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; 1F96; 1F9E; 1F2E 0399; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; 1F97; 1F9F; 1F2F 0399; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; 1F90; 1F98; 1F28 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; 1F91; 1F99; 1F29 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; 1F92; 1F9A; 1F2A 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; 1F93; 1F9B; 1F2B 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; 1F94; 1F9C; 1F2C 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; 1F95; 1F9D; 1F2D 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; 1F96; 1F9E; 1F2E 0399; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; 1F97; 1F9F; 1F2F 0399; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; 1FA0; 1FA8; 1F68 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; 1FA1; 1FA9; 1F69 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; 1FA2; 1FAA; 1F6A 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; 1FA3; 1FAB; 1F6B 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; 1FA4; 1FAC; 1F6C 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; 1FA5; 1FAD; 1F6D 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; 1FA6; 1FAE; 1F6E 0399; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; 1FA7; 1FAF; 1F6F 0399; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; 1FA0; 1FA8; 1F68 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; 1FA1; 1FA9; 1F69 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; 1FA2; 1FAA; 1F6A 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; 1FA3; 1FAB; 1F6B 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; 1FA4; 1FAC; 1F6C 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; 1FA5; 1FAD; 1F6D 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; 1FA6; 1FAE; 1F6E 0399; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; 1FA7; 1FAF; 1F6F 0399; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB3; 1FB3; 1FBC; 0391 0399; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FBC; 1FB3; 1FBC; 0391 0399; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FC3; 1FC3; 1FCC; 0397 0399; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FCC; 1FC3; 1FCC; 0397 0399; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FF3; 1FF3; 1FFC; 03A9 0399; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FFC; 1FF3; 1FFC; 03A9 0399; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI + +# Some characters with YPOGEGRAMMENI also have no corresponding titlecases + +1FB2; 1FB2; 1FBA 0345; 1FBA 0399; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB4; 1FB4; 0386 0345; 0386 0399; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FC2; 1FC2; 1FCA 0345; 1FCA 0399; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC4; 1FC4; 0389 0345; 0389 0399; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FF2; 1FF2; 1FFA 0345; 1FFA 0399; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF4; 1FF4; 038F 0345; 038F 0399; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI + +1FB7; 1FB7; 0391 0342 0345; 0391 0342 0399; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC7; 1FC7; 0397 0342 0345; 0397 0342 0399; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF7; 1FF7; 03A9 0342 0345; 03A9 0342 0399; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI + +# ================================================================================ +# Conditional Mappings +# The remainder of this file provides conditional casing data used to produce +# full case mappings. +# ================================================================================ +# Language-Insensitive Mappings +# These are characters whose full case mappings do not depend on language, but do +# depend on context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Special case for final form of sigma + +03A3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK CAPITAL LETTER SIGMA + +# Note: the following cases for non-final are already in the UnicodeData.txt file. + +# 03A3; 03C3; 03A3; 03A3; # GREEK CAPITAL LETTER SIGMA +# 03C3; 03C3; 03A3; 03A3; # GREEK SMALL LETTER SIGMA +# 03C2; 03C2; 03A3; 03A3; # GREEK SMALL LETTER FINAL SIGMA + +# Note: the following cases are not included, since they would case-fold in lowercasing + +# 03C3; 03C2; 03A3; 03A3; Final_Sigma; # GREEK SMALL LETTER SIGMA +# 03C2; 03C3; 03A3; 03A3; Not_Final_Sigma; # GREEK SMALL LETTER FINAL SIGMA + +# ================================================================================ +# Language-Sensitive Mappings +# These are characters whose full case mappings depend on language and perhaps also +# context (which characters come before or after). For more information +# see the header of this file and the Unicode Standard. +# ================================================================================ + +# Lithuanian + +# Lithuanian retains the dot in a lowercase i when followed by accents. + +# Remove DOT ABOVE after "i" with upper or titlecase + +0307; 0307; ; ; lt After_Soft_Dotted; # COMBINING DOT ABOVE + +# Introduce an explicit dot above when lowercasing capital I's and J's +# whenever there are more accents above. +# (of the accents used in Lithuanian: grave, acute, tilde above, and ogonek) + +0049; 0069 0307; 0049; 0049; lt More_Above; # LATIN CAPITAL LETTER I +004A; 006A 0307; 004A; 004A; lt More_Above; # LATIN CAPITAL LETTER J +012E; 012F 0307; 012E; 012E; lt More_Above; # LATIN CAPITAL LETTER I WITH OGONEK +00CC; 0069 0307 0300; 00CC; 00CC; lt; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; 0069 0307 0301; 00CD; 00CD; lt; # LATIN CAPITAL LETTER I WITH ACUTE +0128; 0069 0307 0303; 0128; 0128; lt; # LATIN CAPITAL LETTER I WITH TILDE + +# ================================================================================ + +# Turkish and Azeri + +# I and i-dotless; I-dot and i are case pairs in Turkish and Azeri +# The following rules handle those cases. + +0130; 0069; 0130; 0130; tr; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; 0069; 0130; 0130; az; # LATIN CAPITAL LETTER I WITH DOT ABOVE + +# When lowercasing, remove dot_above in the sequence I + dot_above, which will turn into i. +# This matches the behavior of the canonically equivalent I-dot_above + +0307; ; 0307; 0307; tr After_I; # COMBINING DOT ABOVE +0307; ; 0307; 0307; az After_I; # COMBINING DOT ABOVE + +# When lowercasing, unless an I is before a dot_above, it turns into a dotless i. + +0049; 0131; 0049; 0049; tr Not_Before_Dot; # LATIN CAPITAL LETTER I +0049; 0131; 0049; 0049; az Not_Before_Dot; # LATIN CAPITAL LETTER I + +# When uppercasing, i turns into a dotted capital I + +0069; 0069; 0130; 0130; tr; # LATIN SMALL LETTER I +0069; 0069; 0130; 0130; az; # LATIN SMALL LETTER I + +# Note: the following case is already in the UnicodeData.txt file. + +# 0131; 0131; 0049; 0049; tr; # LATIN SMALL LETTER DOTLESS I + +# EOF + diff --git a/unicode-data/UnicodeData.txt b/unicode-data/UnicodeData.txt new file mode 100644 index 0000000..bdcc418 --- /dev/null +++ b/unicode-data/UnicodeData.txt @@ -0,0 +1,34931 @@ +0000;<control>;Cc;0;BN;;;;;N;NULL;;;; +0001;<control>;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;<control>;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;<control>;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;<control>;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;<control>;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;<control>;Cc;0;BN;;;;;N;BELL;;;; +0008;<control>;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;<control>;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;<control>;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;<control>;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;<control>;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;<control>;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;<control>;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;<control>;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;<control>;Cc;0;BN;;;;;N;CANCEL;;;; +0019;<control>;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;<control>;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;<control>;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;<control>;Cc;0;BN;;;;;N;DELETE;;;; +0080;<control>;Cc;0;BN;;;;;N;;;;; +0081;<control>;Cc;0;BN;;;;;N;;;;; +0082;<control>;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;<control>;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;<control>;Cc;0;BN;;;;;N;;;;; +0085;<control>;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;<control>;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;<control>;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;<control>;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;<control>;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;<control>;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;<control>;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;<control>;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;<control>;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;<control>;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;<control>;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;<control>;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;<control>;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;<control>;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;<control>;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;<control>;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;<control>;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;<control>;Cc;0;BN;;;;;N;;;;; +009A;<control>;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;<control>;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;<control>;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;<control>;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;<control>;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;<control>;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON;<compat> 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L;<super> 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON;<compat> 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON;<compat> 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L;<compat> 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON;<compat> 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L;<super> 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON;<fraction> 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON;<fraction> 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON;<fraction> 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L;<compat> 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L;<compat> 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L;<compat> 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L;<compat> 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L;<compat> 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L;<compat> 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L;<compat> 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L;<compat> 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L;<compat> 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L;<compat> 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L;<compat> 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L;<compat> 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L;<compat> 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;A7AE;;A7AE +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;A7C5;;A7C5 +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L;<super> 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L;<super> 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L;<super> 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L;<super> 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L;<super> 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L;<super> 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L;<super> 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L;<super> 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L;<super> 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON;<compat> 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON;<compat> 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON;<compat> 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON;<compat> 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON;<compat> 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON;<compat> 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L;<super> 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L;<super> 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L;<super> 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L;<super> 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L;<super> 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L;<compat> 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON;<compat> 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L;<compat> 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L;<compat> 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L;<compat> 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L;<compat> 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L;<compat> 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L;<compat> 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0560;ARMENIAN SMALL LETTER TURNED AYB;Ll;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L;<compat> 0565 0582;;;;N;;;;; +0588;ARMENIAN SMALL LETTER YI WITH STROKE;Ll;0;L;;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05EF;HEBREW YOD TRIANGLE;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061D;ARABIC END OF TEXT MARK;Po;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL;<compat> 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL;<compat> 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL;<compat> 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL;<compat> 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +07FD;NKO DANTAYALAN;Mn;220;NSM;;;;;N;;;;; +07FE;NKO DOROME SIGN;Sc;0;R;;;;;N;;;;; +07FF;NKO TAMAN SIGN;Sc;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; +085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +0860;SYRIAC LETTER MALAYALAM NGA;Lo;0;AL;;;;;N;;;;; +0861;SYRIAC LETTER MALAYALAM JA;Lo;0;AL;;;;;N;;;;; +0862;SYRIAC LETTER MALAYALAM NYA;Lo;0;AL;;;;;N;;;;; +0863;SYRIAC LETTER MALAYALAM TTA;Lo;0;AL;;;;;N;;;;; +0864;SYRIAC LETTER MALAYALAM NNA;Lo;0;AL;;;;;N;;;;; +0865;SYRIAC LETTER MALAYALAM NNNA;Lo;0;AL;;;;;N;;;;; +0866;SYRIAC LETTER MALAYALAM BHA;Lo;0;AL;;;;;N;;;;; +0867;SYRIAC LETTER MALAYALAM RA;Lo;0;AL;;;;;N;;;;; +0868;SYRIAC LETTER MALAYALAM LLA;Lo;0;AL;;;;;N;;;;; +0869;SYRIAC LETTER MALAYALAM LLLA;Lo;0;AL;;;;;N;;;;; +086A;SYRIAC LETTER MALAYALAM SSA;Lo;0;AL;;;;;N;;;;; +0870;ARABIC LETTER ALEF WITH ATTACHED FATHA;Lo;0;AL;;;;;N;;;;; +0871;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA;Lo;0;AL;;;;;N;;;;; +0872;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0873;ARABIC LETTER ALEF WITH LEFT MIDDLE STROKE;Lo;0;AL;;;;;N;;;;; +0874;ARABIC LETTER ALEF WITH ATTACHED KASRA;Lo;0;AL;;;;;N;;;;; +0875;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA;Lo;0;AL;;;;;N;;;;; +0876;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0877;ARABIC LETTER ALEF WITH ATTACHED RIGHT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0878;ARABIC LETTER ALEF WITH ATTACHED LEFT ROUND DOT;Lo;0;AL;;;;;N;;;;; +0879;ARABIC LETTER ALEF WITH ATTACHED ROUND DOT BELOW;Lo;0;AL;;;;;N;;;;; +087A;ARABIC LETTER ALEF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087B;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087C;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087D;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +087E;ARABIC LETTER ALEF WITH ATTACHED TOP RIGHT FATHA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +087F;ARABIC LETTER ALEF WITH RIGHT MIDDLE STROKE AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0880;ARABIC LETTER ALEF WITH ATTACHED BOTTOM RIGHT KASRA AND LEFT RING;Lo;0;AL;;;;;N;;;;; +0881;ARABIC LETTER ALEF WITH ATTACHED RIGHT HAMZA;Lo;0;AL;;;;;N;;;;; +0882;ARABIC LETTER ALEF WITH ATTACHED LEFT HAMZA;Lo;0;AL;;;;;N;;;;; +0883;ARABIC TATWEEL WITH OVERSTRUCK HAMZA;Lo;0;AL;;;;;N;;;;; +0884;ARABIC TATWEEL WITH OVERSTRUCK WAW;Lo;0;AL;;;;;N;;;;; +0885;ARABIC TATWEEL WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0886;ARABIC LETTER THIN YEH;Lo;0;AL;;;;;N;;;;; +0887;ARABIC BASELINE ROUND DOT;Lo;0;AL;;;;;N;;;;; +0888;ARABIC RAISED ROUND DOT;Sk;0;AL;;;;;N;;;;; +0889;ARABIC LETTER NOON WITH INVERTED SMALL V;Lo;0;AL;;;;;N;;;;; +088A;ARABIC LETTER HAH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +088B;ARABIC LETTER TAH WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +088C;ARABIC LETTER TAH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +088D;ARABIC LETTER KEHEH WITH TWO DOTS VERTICALLY BELOW;Lo;0;AL;;;;;N;;;;; +088E;ARABIC VERTICAL TAIL;Lo;0;AL;;;;;N;;;;; +0890;ARABIC POUND MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0891;ARABIC PIASTRE MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0898;ARABIC SMALL HIGH WORD AL-JUZ;Mn;230;NSM;;;;;N;;;;; +0899;ARABIC SMALL LOW WORD ISHMAAM;Mn;220;NSM;;;;;N;;;;; +089A;ARABIC SMALL LOW WORD IMAALA;Mn;220;NSM;;;;;N;;;;; +089B;ARABIC SMALL LOW WORD TASHEEL;Mn;220;NSM;;;;;N;;;;; +089C;ARABIC MADDA WAAJIB;Mn;230;NSM;;;;;N;;;;; +089D;ARABIC SUPERSCRIPT ALEF MOKHASSAS;Mn;230;NSM;;;;;N;;;;; +089E;ARABIC DOUBLED MADDA;Mn;230;NSM;;;;;N;;;;; +089F;ARABIC HALF MADDA OVER MADDA;Mn;230;NSM;;;;;N;;;;; +08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08B5;ARABIC LETTER QAF WITH DOT BELOW AND NO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08B6;ARABIC LETTER BEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B7;ARABIC LETTER PEH WITH SMALL MEEM ABOVE;Lo;0;AL;;;;;N;;;;; +08B8;ARABIC LETTER TEH WITH SMALL TEH ABOVE;Lo;0;AL;;;;;N;;;;; +08B9;ARABIC LETTER REH WITH SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BA;ARABIC LETTER YEH WITH TWO DOTS BELOW AND SMALL NOON ABOVE;Lo;0;AL;;;;;N;;;;; +08BB;ARABIC LETTER AFRICAN FEH;Lo;0;AL;;;;;N;;;;; +08BC;ARABIC LETTER AFRICAN QAF;Lo;0;AL;;;;;N;;;;; +08BD;ARABIC LETTER AFRICAN NOON;Lo;0;AL;;;;;N;;;;; +08BE;ARABIC LETTER PEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08BF;ARABIC LETTER TEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C0;ARABIC LETTER TTEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C1;ARABIC LETTER TCHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C2;ARABIC LETTER KEHEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +08C3;ARABIC LETTER GHAIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C4;ARABIC LETTER AFRICAN QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C5;ARABIC LETTER JEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08C6;ARABIC LETTER JEEM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08C7;ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +08C8;ARABIC LETTER GRAF;Lo;0;AL;;;;;N;;;;; +08C9;ARABIC SMALL FARSI YEH;Lm;0;AL;;;;;N;;;;; +08CA;ARABIC SMALL HIGH FARSI YEH;Mn;230;NSM;;;;;N;;;;; +08CB;ARABIC SMALL HIGH YEH BARREE WITH TWO DOTS BELOW;Mn;230;NSM;;;;;N;;;;; +08CC;ARABIC SMALL HIGH WORD SAH;Mn;230;NSM;;;;;N;;;;; +08CD;ARABIC SMALL HIGH ZAH;Mn;230;NSM;;;;;N;;;;; +08CE;ARABIC LARGE ROUND DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08CF;ARABIC LARGE ROUND DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08D0;ARABIC SUKUN BELOW;Mn;220;NSM;;;;;N;;;;; +08D1;ARABIC LARGE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D2;ARABIC LARGE ROUND DOT INSIDE CIRCLE BELOW;Mn;220;NSM;;;;;N;;;;; +08D3;ARABIC SMALL LOW WAW;Mn;220;NSM;;;;;N;;;;; +08D4;ARABIC SMALL HIGH WORD AR-RUB;Mn;230;NSM;;;;;N;;;;; +08D5;ARABIC SMALL HIGH SAD;Mn;230;NSM;;;;;N;;;;; +08D6;ARABIC SMALL HIGH AIN;Mn;230;NSM;;;;;N;;;;; +08D7;ARABIC SMALL HIGH QAF;Mn;230;NSM;;;;;N;;;;; +08D8;ARABIC SMALL HIGH NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08D9;ARABIC SMALL LOW NOON WITH KASRA;Mn;230;NSM;;;;;N;;;;; +08DA;ARABIC SMALL HIGH WORD ATH-THALATHA;Mn;230;NSM;;;;;N;;;;; +08DB;ARABIC SMALL HIGH WORD AS-SAJDA;Mn;230;NSM;;;;;N;;;;; +08DC;ARABIC SMALL HIGH WORD AN-NISF;Mn;230;NSM;;;;;N;;;;; +08DD;ARABIC SMALL HIGH WORD SAKTA;Mn;230;NSM;;;;;N;;;;; +08DE;ARABIC SMALL HIGH WORD QIF;Mn;230;NSM;;;;;N;;;;; +08DF;ARABIC SMALL HIGH WORD WAQFA;Mn;230;NSM;;;;;N;;;;; +08E0;ARABIC SMALL HIGH FOOTNOTE MARKER;Mn;230;NSM;;;;;N;;;;; +08E1;ARABIC SMALL HIGH SIGN SAFHA;Mn;230;NSM;;;;;N;;;;; +08E2;ARABIC DISPUTED END OF AYAH;Cf;0;AN;;;;;N;;;;; +08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; +08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; +08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +09FC;BENGALI LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +09FD;BENGALI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +09FE;BENGALI SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A76;GURMUKHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; +0AFA;GUJARATI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +0AFB;GUJARATI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +0AFC;GUJARATI SIGN MADDAH;Mn;0;NSM;;;;;N;;;;; +0AFD;GUJARATI SIGN THREE-DOT NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFE;GUJARATI SIGN CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0AFF;GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE;Mn;0;NSM;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B55;ORIYA SIGN OVERLINE;Mn;0;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C04;TELUGU SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3C;TELUGU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; +0C5D;TELUGU LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C77;TELUGU SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C80;KANNADA SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C84;KANNADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDD;KANNADA LETTER NAKAARA POLLU;Lo;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0CF3;KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT;Mc;0;L;;;;;N;;;;; +0D00;MALAYALAM SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D04;MALAYALAM LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3B;MALAYALAM SIGN VERTICAL BAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3C;MALAYALAM SIGN CIRCULAR VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D4F;MALAYALAM SIGN PARA;So;0;L;;;;;N;;;;; +0D54;MALAYALAM LETTER CHILLU M;Lo;0;L;;;;;N;;;;; +0D55;MALAYALAM LETTER CHILLU Y;Lo;0;L;;;;;N;;;;; +0D56;MALAYALAM LETTER CHILLU LLL;Lo;0;L;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D58;MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +0D59;MALAYALAM FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +0D5A;MALAYALAM FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +0D5B;MALAYALAM FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +0D5C;MALAYALAM FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +0D5D;MALAYALAM FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +0D5E;MALAYALAM FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D76;MALAYALAM FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0D77;MALAYALAM FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0D78;MALAYALAM FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D81;SINHALA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L;<compat> 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E86;LAO LETTER PALI GHA;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E89;LAO LETTER PALI CHA;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8C;LAO LETTER PALI JHA;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E8E;LAO LETTER PALI NYA;Lo;0;L;;;;;N;;;;; +0E8F;LAO LETTER PALI TTA;Lo;0;L;;;;;N;;;;; +0E90;LAO LETTER PALI TTHA;Lo;0;L;;;;;N;;;;; +0E91;LAO LETTER PALI DDA;Lo;0;L;;;;;N;;;;; +0E92;LAO LETTER PALI DDHA;Lo;0;L;;;;;N;;;;; +0E93;LAO LETTER PALI NNA;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E98;LAO LETTER PALI DHA;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA0;LAO LETTER PALI BHA;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EA8;LAO LETTER SANSKRIT SHA;Lo;0;L;;;;;N;;;;; +0EA9;LAO LETTER SANSKRIT SSA;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAC;LAO LETTER PALI LLA;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L;<compat> 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBA;LAO SIGN PALI VIRAMA;Mn;9;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ECE;LAO YAMAKKAN;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L;<compat> 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L;<compat> 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L;<noBreak> 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM;<compat> 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM;<compat> 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;1C90;;10D0 +10D1;GEORGIAN LETTER BAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;1C91;;10D1 +10D2;GEORGIAN LETTER GAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;1C92;;10D2 +10D3;GEORGIAN LETTER DON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;1C93;;10D3 +10D4;GEORGIAN LETTER EN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;1C94;;10D4 +10D5;GEORGIAN LETTER VIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;1C95;;10D5 +10D6;GEORGIAN LETTER ZEN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;1C96;;10D6 +10D7;GEORGIAN LETTER TAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;1C97;;10D7 +10D8;GEORGIAN LETTER IN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;1C98;;10D8 +10D9;GEORGIAN LETTER KAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;1C99;;10D9 +10DA;GEORGIAN LETTER LAS;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;1C9A;;10DA +10DB;GEORGIAN LETTER MAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;1C9B;;10DB +10DC;GEORGIAN LETTER NAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;1C9C;;10DC +10DD;GEORGIAN LETTER ON;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;1C9D;;10DD +10DE;GEORGIAN LETTER PAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;1C9E;;10DE +10DF;GEORGIAN LETTER ZHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;1C9F;;10DF +10E0;GEORGIAN LETTER RAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;1CA0;;10E0 +10E1;GEORGIAN LETTER SAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;1CA1;;10E1 +10E2;GEORGIAN LETTER TAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;1CA2;;10E2 +10E3;GEORGIAN LETTER UN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;1CA3;;10E3 +10E4;GEORGIAN LETTER PHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;1CA4;;10E4 +10E5;GEORGIAN LETTER KHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;1CA5;;10E5 +10E6;GEORGIAN LETTER GHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;1CA6;;10E6 +10E7;GEORGIAN LETTER QAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;1CA7;;10E7 +10E8;GEORGIAN LETTER SHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;1CA8;;10E8 +10E9;GEORGIAN LETTER CHIN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;1CA9;;10E9 +10EA;GEORGIAN LETTER CAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;1CAA;;10EA +10EB;GEORGIAN LETTER JIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;1CAB;;10EB +10EC;GEORGIAN LETTER CIL;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;1CAC;;10EC +10ED;GEORGIAN LETTER CHAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;1CAD;;10ED +10EE;GEORGIAN LETTER XAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;1CAE;;10EE +10EF;GEORGIAN LETTER JHAN;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;1CAF;;10EF +10F0;GEORGIAN LETTER HAE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;1CB0;;10F0 +10F1;GEORGIAN LETTER HE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;1CB1;;10F1 +10F2;GEORGIAN LETTER HIE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;1CB2;;10F2 +10F3;GEORGIAN LETTER WE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;1CB3;;10F3 +10F4;GEORGIAN LETTER HAR;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;1CB4;;10F4 +10F5;GEORGIAN LETTER HOE;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;1CB5;;10F5 +10F6;GEORGIAN LETTER FI;Ll;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;1CB6;;10F6 +10F7;GEORGIAN LETTER YN;Ll;0;L;;;;;N;;;1CB7;;10F7 +10F8;GEORGIAN LETTER ELIFI;Ll;0;L;;;;;N;;;1CB8;;10F8 +10F9;GEORGIAN LETTER TURNED GAN;Ll;0;L;;;;;N;;;1CB9;;10F9 +10FA;GEORGIAN LETTER AIN;Ll;0;L;;;;;N;;;1CBA;;10FA +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Ll;0;L;;;;;N;;;1CBD;;10FD +10FE;GEORGIAN LETTER HARD SIGN;Ll;0;L;;;;;N;;;1CBE;;10FE +10FF;GEORGIAN LETTER LABIAL SIGN;Ll;0;L;;;;;N;;;1CBF;;10FF +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;So;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170D;TAGALOG LETTER RA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1715;TAGALOG SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +171F;TAGALOG LETTER ARCHAIC RA;Lo;0;L;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mc;9;L;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +180F;MONGOLIAN FREE VARIATION SELECTOR FOUR;Mn;0;NSM;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1878;MONGOLIAN LETTER CHA WITH TWO DOTS;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Mn;0;NSM;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Mn;0;NSM;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1ABF;COMBINING LATIN SMALL LETTER W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC0;COMBINING LATIN SMALL LETTER TURNED W BELOW;Mn;220;NSM;;;;;N;;;;; +1AC1;COMBINING LEFT PARENTHESIS ABOVE LEFT;Mn;230;NSM;;;;;N;;;;; +1AC2;COMBINING RIGHT PARENTHESIS ABOVE RIGHT;Mn;230;NSM;;;;;N;;;;; +1AC3;COMBINING LEFT PARENTHESIS BELOW LEFT;Mn;220;NSM;;;;;N;;;;; +1AC4;COMBINING RIGHT PARENTHESIS BELOW RIGHT;Mn;220;NSM;;;;;N;;;;; +1AC5;COMBINING SQUARE BRACKETS ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC6;COMBINING NUMBER SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC7;COMBINING INVERTED DOUBLE ARCH ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC8;COMBINING PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1AC9;COMBINING DOUBLE PLUS SIGN ABOVE;Mn;230;NSM;;;;;N;;;;; +1ACA;COMBINING DOUBLE PLUS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +1ACB;COMBINING TRIPLE ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1ACC;COMBINING LATIN SMALL LETTER INSULAR G;Mn;230;NSM;;;;;N;;;;; +1ACD;COMBINING LATIN SMALL LETTER INSULAR R;Mn;230;NSM;;;;;N;;;;; +1ACE;COMBINING LATIN SMALL LETTER INSULAR T;Mn;230;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B4C;BALINESE LETTER ARCHAIC JNYA;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B7D;BALINESE PANTI LANTANG;Po;0;L;;;;;N;;;;; +1B7E;BALINESE PAMADA LANTANG;Po;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1C80;CYRILLIC SMALL LETTER ROUNDED VE;Ll;0;L;;;;;N;;;0412;;0412 +1C81;CYRILLIC SMALL LETTER LONG-LEGGED DE;Ll;0;L;;;;;N;;;0414;;0414 +1C82;CYRILLIC SMALL LETTER NARROW O;Ll;0;L;;;;;N;;;041E;;041E +1C83;CYRILLIC SMALL LETTER WIDE ES;Ll;0;L;;;;;N;;;0421;;0421 +1C84;CYRILLIC SMALL LETTER TALL TE;Ll;0;L;;;;;N;;;0422;;0422 +1C85;CYRILLIC SMALL LETTER THREE-LEGGED TE;Ll;0;L;;;;;N;;;0422;;0422 +1C86;CYRILLIC SMALL LETTER TALL HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +1C87;CYRILLIC SMALL LETTER TALL YAT;Ll;0;L;;;;;N;;;0462;;0462 +1C88;CYRILLIC SMALL LETTER UNBLENDED UK;Ll;0;L;;;;;N;;;A64A;;A64A +1C90;GEORGIAN MTAVRULI CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;10D0; +1C91;GEORGIAN MTAVRULI CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;10D1; +1C92;GEORGIAN MTAVRULI CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;10D2; +1C93;GEORGIAN MTAVRULI CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;10D3; +1C94;GEORGIAN MTAVRULI CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;10D4; +1C95;GEORGIAN MTAVRULI CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;10D5; +1C96;GEORGIAN MTAVRULI CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;10D6; +1C97;GEORGIAN MTAVRULI CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;10D7; +1C98;GEORGIAN MTAVRULI CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;10D8; +1C99;GEORGIAN MTAVRULI CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;10D9; +1C9A;GEORGIAN MTAVRULI CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;10DA; +1C9B;GEORGIAN MTAVRULI CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;10DB; +1C9C;GEORGIAN MTAVRULI CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;10DC; +1C9D;GEORGIAN MTAVRULI CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;10DD; +1C9E;GEORGIAN MTAVRULI CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;10DE; +1C9F;GEORGIAN MTAVRULI CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;10DF; +1CA0;GEORGIAN MTAVRULI CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;10E0; +1CA1;GEORGIAN MTAVRULI CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;10E1; +1CA2;GEORGIAN MTAVRULI CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;10E2; +1CA3;GEORGIAN MTAVRULI CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;10E3; +1CA4;GEORGIAN MTAVRULI CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;10E4; +1CA5;GEORGIAN MTAVRULI CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;10E5; +1CA6;GEORGIAN MTAVRULI CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;10E6; +1CA7;GEORGIAN MTAVRULI CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;10E7; +1CA8;GEORGIAN MTAVRULI CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;10E8; +1CA9;GEORGIAN MTAVRULI CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;10E9; +1CAA;GEORGIAN MTAVRULI CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;10EA; +1CAB;GEORGIAN MTAVRULI CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;10EB; +1CAC;GEORGIAN MTAVRULI CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;10EC; +1CAD;GEORGIAN MTAVRULI CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;10ED; +1CAE;GEORGIAN MTAVRULI CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;10EE; +1CAF;GEORGIAN MTAVRULI CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;10EF; +1CB0;GEORGIAN MTAVRULI CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;10F0; +1CB1;GEORGIAN MTAVRULI CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;10F1; +1CB2;GEORGIAN MTAVRULI CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;10F2; +1CB3;GEORGIAN MTAVRULI CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;10F3; +1CB4;GEORGIAN MTAVRULI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;10F4; +1CB5;GEORGIAN MTAVRULI CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;10F5; +1CB6;GEORGIAN MTAVRULI CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;10F6; +1CB7;GEORGIAN MTAVRULI CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;10F7; +1CB8;GEORGIAN MTAVRULI CAPITAL LETTER ELIFI;Lu;0;L;;;;;N;;;;10F8; +1CB9;GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN;Lu;0;L;;;;;N;;;;10F9; +1CBA;GEORGIAN MTAVRULI CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;10FA; +1CBD;GEORGIAN MTAVRULI CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;10FD; +1CBE;GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;10FE; +1CBF;GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN;Lu;0;L;;;;;N;;;;10FF; +1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; +1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; +1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Lo;0;L;;;;;N;;;;; +1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF7;VEDIC SIGN ATIKRAMA;Mc;0;L;;;;;N;;;;; +1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CFA;VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L;<sub> 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L;<sub> 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L;<sub> 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L;<sub> 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L;<sub> 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L;<sub> 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L;<sub> 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C6;;A7C6 +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DF6;COMBINING KAVYKA ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +1DF7;COMBINING KAVYKA ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF8;COMBINING DOT ABOVE LEFT;Mn;228;NSM;;;;;N;;;;; +1DF9;COMBINING WIDE INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;;;;; +1DFA;COMBINING DOT BELOW LEFT;Mn;218;NSM;;;;;N;;;;; +1DFB;COMBINING DELETION MARK;Mn;230;NSM;;;;;N;;;;; +1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L;<compat> 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON;<compat> 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON;<compat> 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON;<compat> 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS;<noBreak> 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON;<noBreak> 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON;<compat> 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON;<compat> 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON;<compat> 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON;<compat> 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS;<noBreak> 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET;<compat> 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET;<compat> 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON;<compat> 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON;<compat> 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON;<compat> 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON;<compat> 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON;<compat> 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON;<compat> 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN;<super> 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L;<super> 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES;<super> 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON;<super> 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON;<super> 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<super> 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L;<super> 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN;<sub> 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES;<sub> 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON;<sub> 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON;<sub> 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON;<sub> 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L;<sub> 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L;<sub> 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L;<sub> 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L;<sub> 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L;<sub> 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L;<sub> 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L;<sub> 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L;<sub> 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET;<compat> 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; +20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; +20BF;BITCOIN SIGN;Sc;0;ET;;;;;N;;;;; +20C0;SOM SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON;<compat> 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON;<compat> 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L;<font> 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON;<compat> 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON;<compat> 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON;<compat> 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L;<compat> 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON;<compat> 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L;<font> 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L;<font> 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L;<font> 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L;<font> 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L;<font> 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L;<font> 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON;<compat> 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L;<font> 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L;<font> 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L;<font> 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L;<font> 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON;<super> 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON;<compat> 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON;<super> 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L;<font> 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L;<font> 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L;<font> 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L;<compat> 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L;<compat> 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L;<compat> 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L;<compat> 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L;<font> 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON;<fraction> 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON;<fraction> 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON;<fraction> 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON;<fraction> 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON;<fraction> 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON;<fraction> 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON;<fraction> 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON;<fraction> 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON;<fraction> 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON;<fraction> 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON;<fraction> 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON;<fraction> 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON;<fraction> 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON;<fraction> 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON;<fraction> 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON;<fraction> 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L;<compat> 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L;<compat> 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L;<compat> 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L;<compat> 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L;<compat> 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L;<compat> 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L;<compat> 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L;<compat> 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L;<compat> 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L;<compat> 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L;<compat> 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L;<compat> 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L;<compat> 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L;<compat> 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L;<compat> 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L;<compat> 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L;<compat> 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L;<compat> 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L;<compat> 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L;<compat> 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L;<compat> 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L;<compat> 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON;<fraction> 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON;<compat> 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON;<compat> 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON;<compat> 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON;<compat> 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; +23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +23FB;POWER SYMBOL;So;0;ON;;;;;N;;;;; +23FC;POWER ON-OFF SYMBOL;So;0;ON;;;;;N;;;;; +23FD;POWER ON SYMBOL;So;0;ON;;;;;N;;;;; +23FE;POWER SLEEP SYMBOL;So;0;ON;;;;;N;;;;; +23FF;OBSERVER EYE SYMBOL;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON;<circle> 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<compat> 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN;<compat> 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN;<compat> 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN;<compat> 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN;<compat> 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN;<compat> 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN;<compat> 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN;<compat> 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN;<compat> 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN;<compat> 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN;<compat> 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN;<compat> 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN;<compat> 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN;<compat> 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN;<compat> 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN;<compat> 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN;<compat> 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN;<compat> 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN;<compat> 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN;<compat> 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN;<compat> 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L;<compat> 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L;<compat> 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L;<compat> 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L;<compat> 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L;<compat> 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L;<compat> 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L;<compat> 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L;<compat> 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L;<compat> 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L;<compat> 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L;<compat> 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L;<compat> 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L;<compat> 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L;<compat> 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L;<compat> 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L;<compat> 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L;<compat> 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L;<compat> 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L;<compat> 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L;<compat> 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L;<compat> 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L;<compat> 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L;<compat> 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L;<compat> 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L;<compat> 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L;<compat> 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L;<circle> 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L;<circle> 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L;<circle> 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L;<circle> 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L;<circle> 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L;<circle> 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L;<circle> 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L;<circle> 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L;<circle> 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L;<circle> 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L;<circle> 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L;<circle> 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L;<circle> 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L;<circle> 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L;<circle> 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L;<circle> 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L;<circle> 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L;<circle> 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L;<circle> 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L;<circle> 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L;<circle> 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L;<circle> 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L;<circle> 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L;<circle> 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L;<circle> 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L;<circle> 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L;<circle> 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L;<circle> 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L;<circle> 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L;<circle> 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L;<circle> 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L;<circle> 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L;<circle> 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L;<circle> 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L;<circle> 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L;<circle> 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L;<circle> 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L;<circle> 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L;<circle> 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L;<circle> 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L;<circle> 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L;<circle> 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L;<circle> 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L;<circle> 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L;<circle> 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L;<circle> 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L;<circle> 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L;<circle> 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L;<circle> 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L;<circle> 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON;<circle> 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;N;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B97;SYMBOL FOR TYPE A ELECTRONICS;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBA;OVERLAPPING WHITE SQUARES;So;0;ON;;;;;N;;;;; +2BBB;OVERLAPPING WHITE AND BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBC;OVERLAPPING BLACK SQUARES;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC9;NEPTUNE FORM TWO;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BD2;GROUP MARK;So;0;ON;;;;;N;;;;; +2BD3;PLUTO FORM TWO;So;0;ON;;;;;N;;;;; +2BD4;PLUTO FORM THREE;So;0;ON;;;;;N;;;;; +2BD5;PLUTO FORM FOUR;So;0;ON;;;;;N;;;;; +2BD6;PLUTO FORM FIVE;So;0;ON;;;;;N;;;;; +2BD7;TRANSPLUTO;So;0;ON;;;;;N;;;;; +2BD8;PROSERPINA;So;0;ON;;;;;N;;;;; +2BD9;ASTRAEA;So;0;ON;;;;;N;;;;; +2BDA;HYGIEA;So;0;ON;;;;;N;;;;; +2BDB;PHOLUS;So;0;ON;;;;;N;;;;; +2BDC;NESSUS;So;0;ON;;;;;N;;;;; +2BDD;WHITE MOON SELENA;So;0;ON;;;;;N;;;;; +2BDE;BLACK DIAMOND ON CROSS;So;0;ON;;;;;N;;;;; +2BDF;TRUE LIGHT MOON ARTA;So;0;ON;;;;;N;;;;; +2BE0;CUPIDO;So;0;ON;;;;;N;;;;; +2BE1;HADES;So;0;ON;;;;;N;;;;; +2BE2;ZEUS;So;0;ON;;;;;N;;;;; +2BE3;KRONOS;So;0;ON;;;;;N;;;;; +2BE4;APOLLON;So;0;ON;;;;;N;;;;; +2BE5;ADMETOS;So;0;ON;;;;;N;;;;; +2BE6;VULCANUS;So;0;ON;;;;;N;;;;; +2BE7;POSEIDON;So;0;ON;;;;;N;;;;; +2BE8;LEFT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BE9;RIGHT HALF BLACK STAR;So;0;ON;;;;;N;;;;; +2BEA;STAR WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEB;STAR WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BF0;ERIS FORM ONE;So;0;ON;;;;;N;;;;; +2BF1;ERIS FORM TWO;So;0;ON;;;;;N;;;;; +2BF2;SEDNA;So;0;ON;;;;;N;;;;; +2BF3;RUSSIAN ASTROLOGICAL SYMBOL VIGINTILE;So;0;ON;;;;;N;;;;; +2BF4;RUSSIAN ASTROLOGICAL SYMBOL NOVILE;So;0;ON;;;;;N;;;;; +2BF5;RUSSIAN ASTROLOGICAL SYMBOL QUINTILE;So;0;ON;;;;;N;;;;; +2BF6;RUSSIAN ASTROLOGICAL SYMBOL BINOVILE;So;0;ON;;;;;N;;;;; +2BF7;RUSSIAN ASTROLOGICAL SYMBOL SENTAGON;So;0;ON;;;;;N;;;;; +2BF8;RUSSIAN ASTROLOGICAL SYMBOL TREDECILE;So;0;ON;;;;;N;;;;; +2BF9;EQUALS SIGN WITH INFINITY BELOW;So;0;ON;;;;;N;;;;; +2BFA;UNITED SYMBOL;So;0;ON;;;;;N;;;;; +2BFB;SEPARATED SYMBOL;So;0;ON;;;;;N;;;;; +2BFC;DOUBLED SYMBOL;So;0;ON;;;;;N;;;;; +2BFD;PASSED SYMBOL;So;0;ON;;;;;N;;;;; +2BFE;REVERSED RIGHT ANGLE;So;0;ON;;;;;Y;;;;; +2BFF;HELLSCHREIBER PAUSE SYMBOL;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C2F;GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI;Lu;0;L;;;;;N;;;;2C5F; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C5F;GLAGOLITIC SMALL LETTER CAUDATE CHRIVI;Ll;0;L;;;;;N;;;2C2F;;2C2F +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L;<sub> 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L;<super> 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; +2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E43;DASH WITH LEFT UPTURN;Po;0;ON;;;;;N;;;;; +2E44;DOUBLE SUSPENSION MARK;Po;0;ON;;;;;N;;;;; +2E45;INVERTED LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E46;INVERTED LOW KAVYKA WITH KAVYKA ABOVE;Po;0;ON;;;;;N;;;;; +2E47;LOW KAVYKA;Po;0;ON;;;;;N;;;;; +2E48;LOW KAVYKA WITH DOT;Po;0;ON;;;;;N;;;;; +2E49;DOUBLE STACKED COMMA;Po;0;ON;;;;;N;;;;; +2E4A;DOTTED SOLIDUS;Po;0;ON;;;;;N;;;;; +2E4B;TRIPLE DAGGER;Po;0;ON;;;;;N;;;;; +2E4C;MEDIEVAL COMMA;Po;0;ON;;;;;N;;;;; +2E4D;PARAGRAPHUS MARK;Po;0;ON;;;;;N;;;;; +2E4E;PUNCTUS ELEVATUS MARK;Po;0;ON;;;;;N;;;;; +2E4F;CORNISH VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2E50;CROSS PATTY WITH RIGHT CROSSBAR;So;0;ON;;;;;N;;;;; +2E51;CROSS PATTY WITH LEFT CROSSBAR;So;0;ON;;;;;N;;;;; +2E52;TIRONIAN SIGN CAPITAL ET;Po;0;ON;;;;;N;;;;; +2E53;MEDIEVAL EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +2E54;MEDIEVAL QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E55;LEFT SQUARE BRACKET WITH STROKE;Ps;0;ON;;;;;Y;;;;; +2E56;RIGHT SQUARE BRACKET WITH STROKE;Pe;0;ON;;;;;Y;;;;; +2E57;LEFT SQUARE BRACKET WITH DOUBLE STROKE;Ps;0;ON;;;;;Y;;;;; +2E58;RIGHT SQUARE BRACKET WITH DOUBLE STROKE;Pe;0;ON;;;;;Y;;;;; +2E59;TOP HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5A;TOP HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5B;BOTTOM HALF LEFT PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E5C;BOTTOM HALF RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E5D;OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON;<compat> 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON;<compat> 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON;<compat> 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON;<compat> 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON;<compat> 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON;<compat> 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON;<compat> 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON;<compat> 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON;<compat> 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON;<compat> 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON;<compat> 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON;<compat> 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON;<compat> 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON;<compat> 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON;<compat> 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON;<compat> 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON;<compat> 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON;<compat> 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON;<compat> 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON;<compat> 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON;<compat> 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON;<compat> 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON;<compat> 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON;<compat> 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON;<compat> 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON;<compat> 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON;<compat> 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON;<compat> 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON;<compat> 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON;<compat> 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON;<compat> 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON;<compat> 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON;<compat> 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON;<compat> 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON;<compat> 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON;<compat> 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON;<compat> 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON;<compat> 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON;<compat> 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON;<compat> 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON;<compat> 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON;<compat> 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON;<compat> 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON;<compat> 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON;<compat> 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON;<compat> 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON;<compat> 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON;<compat> 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON;<compat> 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON;<compat> 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON;<compat> 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON;<compat> 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON;<compat> 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON;<compat> 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON;<compat> 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON;<compat> 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON;<compat> 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON;<compat> 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON;<compat> 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON;<compat> 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON;<compat> 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON;<compat> 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON;<compat> 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON;<compat> 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON;<compat> 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON;<compat> 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON;<compat> 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON;<compat> 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON;<compat> 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON;<compat> 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON;<compat> 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON;<compat> 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON;<compat> 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON;<compat> 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON;<compat> 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON;<compat> 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON;<compat> 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON;<compat> 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON;<compat> 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON;<compat> 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON;<compat> 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON;<compat> 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON;<compat> 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON;<compat> 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON;<compat> 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON;<compat> 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON;<compat> 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON;<compat> 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON;<compat> 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON;<compat> 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON;<compat> 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON;<compat> 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON;<compat> 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON;<compat> 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON;<compat> 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON;<compat> 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON;<compat> 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON;<compat> 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON;<compat> 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON;<compat> 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON;<compat> 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON;<compat> 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON;<compat> 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON;<compat> 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON;<compat> 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON;<compat> 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON;<compat> 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON;<compat> 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON;<compat> 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON;<compat> 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON;<compat> 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON;<compat> 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON;<compat> 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON;<compat> 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON;<compat> 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON;<compat> 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON;<compat> 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON;<compat> 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON;<compat> 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON;<compat> 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON;<compat> 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON;<compat> 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON;<compat> 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON;<compat> 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON;<compat> 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON;<compat> 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON;<compat> 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON;<compat> 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON;<compat> 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON;<compat> 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON;<compat> 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON;<compat> 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON;<compat> 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON;<compat> 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON;<compat> 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON;<compat> 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON;<compat> 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON;<compat> 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON;<compat> 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON;<compat> 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON;<compat> 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON;<compat> 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON;<compat> 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON;<compat> 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON;<compat> 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON;<compat> 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON;<compat> 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON;<compat> 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON;<compat> 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON;<compat> 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON;<compat> 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON;<compat> 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON;<compat> 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON;<compat> 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON;<compat> 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON;<compat> 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON;<compat> 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON;<compat> 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON;<compat> 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON;<compat> 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON;<compat> 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON;<compat> 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON;<compat> 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON;<compat> 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON;<compat> 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON;<compat> 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON;<compat> 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON;<compat> 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON;<compat> 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON;<compat> 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON;<compat> 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON;<compat> 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON;<compat> 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON;<compat> 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON;<compat> 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON;<compat> 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON;<compat> 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON;<compat> 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON;<compat> 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON;<compat> 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON;<compat> 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON;<compat> 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON;<compat> 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON;<compat> 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON;<compat> 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON;<compat> 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON;<compat> 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON;<compat> 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON;<compat> 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON;<compat> 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON;<compat> 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON;<compat> 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON;<compat> 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON;<compat> 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON;<compat> 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON;<compat> 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON;<compat> 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON;<compat> 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON;<compat> 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON;<compat> 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON;<compat> 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON;<compat> 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON;<compat> 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON;<compat> 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON;<compat> 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON;<compat> 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON;<compat> 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON;<compat> 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON;<compat> 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON;<compat> 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON;<compat> 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON;<compat> 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON;<compat> 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON;<compat> 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON;<compat> 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON;<compat> 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +2FFC;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM RIGHT;So;0;ON;;;;;N;;;;; +2FFD;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER RIGHT;So;0;ON;;;;;N;;;;; +2FFE;IDEOGRAPHIC DESCRIPTION CHARACTER HORIZONTAL REFLECTION;So;0;ON;;;;;N;;;;; +2FFF;IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS;<wide> 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON;<compat> 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L;<compat> 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L;<compat> 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L;<compat> 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON;<compat> 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON;<compat> 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +312E;BOPOMOFO LETTER O WITH DOT ABOVE;Lo;0;L;;;;;N;;;;; +312F;BOPOMOFO LETTER NN;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L;<compat> 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L;<compat> 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L;<compat> 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<compat> 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<compat> 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L;<compat> 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L;<compat> 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L;<compat> 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<compat> 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<compat> 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<compat> 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L;<compat> 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<compat> 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<compat> 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<compat> 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L;<compat> 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L;<compat> 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L;<compat> 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L;<compat> 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L;<compat> 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L;<compat> 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L;<compat> 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L;<compat> 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L;<compat> 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L;<compat> 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L;<compat> 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L;<compat> 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L;<compat> 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L;<compat> 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L;<compat> 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L;<compat> 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L;<compat> 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L;<compat> 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L;<compat> 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L;<compat> 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L;<compat> 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L;<compat> 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L;<compat> 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L;<compat> 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L;<compat> 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L;<compat> 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L;<compat> 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L;<compat> 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L;<compat> 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L;<compat> 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L;<compat> 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L;<compat> 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L;<compat> 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L;<compat> 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L;<compat> 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L;<compat> 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L;<compat> 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L;<compat> 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L;<compat> 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L;<compat> 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L;<compat> 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L;<compat> 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L;<compat> 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L;<compat> 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L;<compat> 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L;<compat> 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L;<compat> 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L;<compat> 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L;<compat> 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L;<compat> 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L;<compat> 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L;<compat> 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L;<compat> 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L;<compat> 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L;<compat> 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L;<compat> 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L;<compat> 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L;<compat> 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L;<compat> 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L;<compat> 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L;<compat> 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L;<compat> 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L;<compat> 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L;<compat> 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L;<compat> 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L;<compat> 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L;<compat> 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L;<compat> 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L;<compat> 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L;<compat> 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L;<compat> 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L;<compat> 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L;<compat> 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L;<compat> 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L;<compat> 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L;<compat> 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L;<compat> 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L;<super> 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L;<super> 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L;<super> 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L;<super> 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L;<super> 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L;<super> 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L;<super> 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L;<super> 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L;<super> 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L;<super> 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L;<super> 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31BB;BOPOMOFO FINAL LETTER G;Lo;0;L;;;;;N;;;;; +31BC;BOPOMOFO LETTER GW;Lo;0;L;;;;;N;;;;; +31BD;BOPOMOFO LETTER KW;Lo;0;L;;;;;N;;;;; +31BE;BOPOMOFO LETTER OE;Lo;0;L;;;;;N;;;;; +31BF;BOPOMOFO LETTER AH;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31EF;IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L;<compat> 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L;<compat> 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L;<compat> 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L;<compat> 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L;<compat> 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L;<compat> 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L;<compat> 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L;<compat> 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L;<compat> 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L;<compat> 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L;<compat> 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L;<compat> 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L;<compat> 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L;<compat> 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L;<compat> 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L;<compat> 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L;<compat> 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L;<compat> 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L;<compat> 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L;<compat> 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L;<compat> 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L;<compat> 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L;<compat> 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L;<compat> 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L;<compat> 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L;<compat> 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L;<compat> 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L;<compat> 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L;<compat> 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L;<compat> 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L;<compat> 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L;<compat> 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L;<compat> 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L;<compat> 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L;<compat> 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L;<compat> 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L;<compat> 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L;<compat> 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L;<compat> 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L;<compat> 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L;<compat> 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L;<compat> 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L;<compat> 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L;<compat> 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L;<compat> 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L;<compat> 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L;<compat> 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L;<compat> 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L;<compat> 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L;<compat> 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L;<compat> 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L;<compat> 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L;<compat> 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L;<compat> 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L;<compat> 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L;<compat> 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L;<circle> 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L;<circle> 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L;<circle> 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L;<circle> 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L;<circle> 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L;<circle> 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L;<circle> 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L;<circle> 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L;<circle> 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L;<circle> 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L;<circle> 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L;<circle> 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L;<circle> 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L;<circle> 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L;<circle> 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L;<circle> 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L;<circle> 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L;<circle> 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L;<circle> 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L;<circle> 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L;<circle> 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L;<circle> 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L;<circle> 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L;<circle> 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L;<circle> 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L;<circle> 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L;<circle> 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L;<circle> 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L;<circle> 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L;<circle> 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L;<circle> 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L;<circle> 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L;<circle> 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L;<circle> 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L;<circle> 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L;<circle> 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L;<circle> 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L;<circle> 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L;<circle> 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L;<circle> 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L;<circle> 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L;<circle> 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L;<circle> 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L;<circle> 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L;<circle> 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L;<circle> 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L;<circle> 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L;<circle> 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L;<circle> 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L;<circle> 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L;<circle> 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L;<circle> 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L;<circle> 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L;<circle> 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L;<circle> 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L;<circle> 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L;<circle> 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L;<circle> 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L;<circle> 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L;<circle> 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L;<circle> 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L;<circle> 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L;<circle> 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L;<circle> 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L;<circle> 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L;<circle> 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L;<circle> 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L;<circle> 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L;<circle> 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L;<circle> 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L;<circle> 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L;<circle> 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L;<circle> 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L;<circle> 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L;<circle> 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L;<circle> 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L;<circle> 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L;<circle> 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L;<circle> 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L;<circle> 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L;<circle> 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L;<compat> 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L;<compat> 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L;<compat> 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L;<compat> 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L;<compat> 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L;<compat> 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L;<compat> 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L;<compat> 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L;<compat> 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L;<compat> 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L;<compat> 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L;<compat> 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L;<circle> 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L;<circle> 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L;<circle> 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L;<circle> 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L;<circle> 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L;<circle> 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L;<circle> 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L;<circle> 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L;<circle> 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L;<circle> 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L;<circle> 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L;<circle> 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L;<circle> 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L;<circle> 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L;<circle> 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L;<circle> 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L;<circle> 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L;<circle> 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L;<circle> 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L;<circle> 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L;<circle> 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L;<circle> 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L;<circle> 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L;<circle> 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L;<circle> 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L;<circle> 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L;<circle> 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L;<circle> 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L;<circle> 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L;<circle> 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L;<circle> 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L;<circle> 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L;<circle> 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L;<circle> 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L;<circle> 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L;<circle> 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L;<circle> 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L;<circle> 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L;<circle> 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L;<circle> 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L;<circle> 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L;<circle> 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L;<circle> 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L;<circle> 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L;<circle> 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L;<circle> 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L;<circle> 30F2;;;;N;;;;; +32FF;SQUARE ERA NAME REIWA;So;0;L;<square> 4EE4 548C;;;;N;;;;; +3300;SQUARE APAATO;So;0;L;<square> 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L;<square> 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L;<square> 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L;<square> 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L;<square> 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L;<square> 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L;<square> 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L;<square> 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L;<square> 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L;<square> 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L;<square> 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L;<square> 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L;<square> 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L;<square> 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L;<square> 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L;<square> 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L;<square> 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L;<square> 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L;<square> 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L;<square> 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L;<square> 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L;<square> 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L;<square> 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L;<square> 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L;<square> 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L;<square> 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L;<square> 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L;<square> 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L;<square> 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L;<square> 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L;<square> 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L;<square> 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L;<square> 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L;<square> 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L;<square> 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L;<square> 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L;<square> 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L;<square> 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L;<square> 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L;<square> 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L;<square> 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L;<square> 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L;<square> 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L;<square> 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L;<square> 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L;<square> 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L;<square> 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L;<square> 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L;<square> 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L;<square> 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L;<square> 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L;<square> 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L;<square> 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L;<square> 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L;<square> 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L;<square> 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L;<square> 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L;<square> 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L;<square> 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L;<square> 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L;<square> 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L;<square> 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L;<square> 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L;<square> 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L;<square> 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L;<square> 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L;<square> 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L;<square> 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L;<square> 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L;<square> 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L;<square> 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L;<square> 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L;<square> 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L;<square> 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L;<square> 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L;<square> 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L;<square> 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L;<square> 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L;<square> 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L;<square> 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L;<square> 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L;<square> 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L;<square> 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L;<square> 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L;<square> 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L;<square> 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L;<square> 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L;<square> 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L;<compat> 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L;<compat> 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L;<compat> 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L;<compat> 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L;<compat> 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L;<compat> 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L;<compat> 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L;<compat> 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L;<compat> 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L;<compat> 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L;<compat> 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L;<compat> 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L;<compat> 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L;<compat> 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L;<compat> 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L;<compat> 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L;<compat> 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L;<compat> 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L;<compat> 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L;<compat> 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L;<compat> 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L;<compat> 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L;<compat> 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L;<compat> 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L;<compat> 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L;<square> 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L;<square> 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L;<square> 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L;<square> 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L;<square> 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L;<square> 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L;<square> 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L;<square> 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L;<square> 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L;<square> 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L;<square> 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L;<square> 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L;<square> 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L;<square> 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L;<square> 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L;<square> 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L;<square> 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L;<square> 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L;<square> 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L;<square> 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L;<square> 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L;<square> 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L;<square> 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L;<square> 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L;<square> 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L;<square> 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L;<square> 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L;<square> 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L;<square> 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L;<square> 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L;<square> 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L;<square> 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L;<square> 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L;<square> 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L;<square> 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L;<square> 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L;<square> 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L;<square> 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L;<square> 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L;<square> 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L;<square> 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L;<square> 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L;<square> 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L;<square> 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L;<square> 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L;<square> 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L;<square> 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L;<square> 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L;<square> 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L;<square> 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L;<square> 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L;<square> 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L;<square> 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L;<square> 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L;<square> 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L;<square> 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L;<square> 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L;<square> 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L;<square> 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L;<square> 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L;<square> 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L;<square> 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L;<square> 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L;<square> 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L;<square> 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L;<square> 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L;<square> 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L;<square> 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L;<square> 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L;<square> 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L;<square> 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L;<square> 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L;<square> 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L;<square> 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L;<square> 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L;<square> 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L;<square> 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L;<square> 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L;<square> 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L;<square> 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L;<square> 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L;<square> 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L;<square> 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L;<square> 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L;<square> 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L;<square> 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L;<square> 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L;<square> 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L;<square> 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L;<square> 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L;<square> 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L;<square> 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L;<square> 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L;<square> 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L;<square> 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L;<square> 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L;<square> 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L;<square> 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L;<square> 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L;<square> 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L;<square> 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L;<square> 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L;<square> 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L;<square> 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L;<square> 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L;<compat> 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L;<compat> 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L;<compat> 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L;<compat> 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L;<compat> 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L;<compat> 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L;<compat> 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L;<compat> 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L;<compat> 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L;<compat> 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L;<compat> 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L;<compat> 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L;<compat> 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L;<compat> 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L;<compat> 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L;<compat> 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L;<compat> 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L;<compat> 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L;<compat> 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L;<compat> 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L;<compat> 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L;<compat> 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L;<compat> 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L;<compat> 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L;<compat> 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L;<compat> 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L;<compat> 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L;<compat> 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L;<compat> 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L;<compat> 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L;<compat> 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;; +3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; +4DBF;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;; +9FFF;<CJK Ideograph, Last>;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L;<super> 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L;<super> 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L;<super> A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;A7C4;;A7C4 +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; +A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; +A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; +A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7AE;LATIN CAPITAL LETTER SMALL CAPITAL I;Lu;0;L;;;;;N;;;;026A; +A7AF;LATIN LETTER SMALL CAPITAL Q;Ll;0;L;;;;;N;;;;; +A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; +A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 +A7B8;LATIN CAPITAL LETTER U WITH STROKE;Lu;0;L;;;;;N;;;;A7B9; +A7B9;LATIN SMALL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;A7B8;;A7B8 +A7BA;LATIN CAPITAL LETTER GLOTTAL A;Lu;0;L;;;;;N;;;;A7BB; +A7BB;LATIN SMALL LETTER GLOTTAL A;Ll;0;L;;;;;N;;;A7BA;;A7BA +A7BC;LATIN CAPITAL LETTER GLOTTAL I;Lu;0;L;;;;;N;;;;A7BD; +A7BD;LATIN SMALL LETTER GLOTTAL I;Ll;0;L;;;;;N;;;A7BC;;A7BC +A7BE;LATIN CAPITAL LETTER GLOTTAL U;Lu;0;L;;;;;N;;;;A7BF; +A7BF;LATIN SMALL LETTER GLOTTAL U;Ll;0;L;;;;;N;;;A7BE;;A7BE +A7C0;LATIN CAPITAL LETTER OLD POLISH O;Lu;0;L;;;;;N;;;;A7C1; +A7C1;LATIN SMALL LETTER OLD POLISH O;Ll;0;L;;;;;N;;;A7C0;;A7C0 +A7C2;LATIN CAPITAL LETTER ANGLICANA W;Lu;0;L;;;;;N;;;;A7C3; +A7C3;LATIN SMALL LETTER ANGLICANA W;Ll;0;L;;;;;N;;;A7C2;;A7C2 +A7C4;LATIN CAPITAL LETTER C WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;A794; +A7C5;LATIN CAPITAL LETTER S WITH HOOK;Lu;0;L;;;;;N;;;;0282; +A7C6;LATIN CAPITAL LETTER Z WITH PALATAL HOOK;Lu;0;L;;;;;N;;;;1D8E; +A7C7;LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7C8; +A7C8;LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C7;;A7C7 +A7C9;LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY;Lu;0;L;;;;;N;;;;A7CA; +A7CA;LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY;Ll;0;L;;;;;N;;;A7C9;;A7C9 +A7D0;LATIN CAPITAL LETTER CLOSED INSULAR G;Lu;0;L;;;;;N;;;;A7D1; +A7D1;LATIN SMALL LETTER CLOSED INSULAR G;Ll;0;L;;;;;N;;;A7D0;;A7D0 +A7D3;LATIN SMALL LETTER DOUBLE THORN;Ll;0;L;;;;;N;;;;; +A7D5;LATIN SMALL LETTER DOUBLE WYNN;Ll;0;L;;;;;N;;;;; +A7D6;LATIN CAPITAL LETTER MIDDLE SCOTS S;Lu;0;L;;;;;N;;;;A7D7; +A7D7;LATIN SMALL LETTER MIDDLE SCOTS S;Ll;0;L;;;;;N;;;A7D6;;A7D6 +A7D8;LATIN CAPITAL LETTER SIGMOID S;Lu;0;L;;;;;N;;;;A7D9; +A7D9;LATIN SMALL LETTER SIGMOID S;Ll;0;L;;;;;N;;;A7D8;;A7D8 +A7F2;MODIFIER LETTER CAPITAL C;Lm;0;L;<super> 0043;;;;N;;;;; +A7F3;MODIFIER LETTER CAPITAL F;Lm;0;L;<super> 0046;;;;N;;;;; +A7F4;MODIFIER LETTER CAPITAL Q;Lm;0;L;<super> 0051;;;;N;;;;; +A7F5;LATIN CAPITAL LETTER REVERSED HALF H;Lu;0;L;;;;;N;;;;A7F6; +A7F6;LATIN SMALL LETTER REVERSED HALF H;Ll;0;L;;;;;N;;;A7F5;;A7F5 +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L;<super> 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L;<super> 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A82C;SYLOTI NAGRI SIGN ALTERNATE HASANTA;Mn;9;NSM;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8C5;SAURASHTRA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; +A8FE;DEVANAGARI LETTER AY;Lo;0;L;;;;;N;;;;; +A8FF;DEVANAGARI VOWEL SIGN AY;Mn;0;NSM;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mn;0;NSM;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L;<super> A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L;<super> AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L;<super> 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L;<super> AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB66;LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB67;LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +AB68;LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB69;MODIFIER LETTER SMALL TURNED W;Lm;0;L;<super> 028D;;;;N;;;;; +AB6A;MODIFIER LETTER LEFT TACK;Sk;0;ON;;;;;N;;;;; +AB6B;MODIFIER LETTER RIGHT TACK;Sk;0;ON;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;<Hangul Syllable, First>;Lo;0;L;;;;;N;;;;; +D7A3;<Hangul Syllable, Last>;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;<Non Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DB7F;<Non Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DB80;<Private Use High Surrogate, First>;Cs;0;L;;;;;N;;;;; +DBFF;<Private Use High Surrogate, Last>;Cs;0;L;;;;;N;;;;; +DC00;<Low Surrogate, First>;Cs;0;L;;;;;N;;;;; +DFFF;<Low Surrogate, Last>;Cs;0;L;;;;;N;;;;; +E000;<Private Use, First>;Co;0;L;;;;;N;;;;; +F8FF;<Private Use, Last>;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L;<compat> 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L;<compat> 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L;<compat> 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L;<compat> 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L;<compat> 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L;<compat> 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L;<compat> 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L;<compat> 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L;<compat> 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L;<compat> 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L;<compat> 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L;<compat> 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R;<font> 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R;<font> 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R;<font> 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R;<font> 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R;<font> 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R;<font> 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R;<font> 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R;<font> 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R;<font> 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES;<font> 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R;<compat> 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL;<isolated> 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL;<final> 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL;<isolated> 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL;<final> 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL;<initial> 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL;<medial> 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL;<isolated> 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL;<final> 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL;<initial> 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL;<medial> 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL;<final> 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL;<initial> 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL;<medial> 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL;<final> 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL;<initial> 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL;<medial> 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL;<isolated> 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL;<final> 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL;<initial> 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL;<medial> 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL;<isolated> 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL;<final> 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL;<initial> 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL;<medial> 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL;<isolated> 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL;<final> 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL;<initial> 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL;<medial> 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL;<final> 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL;<initial> 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL;<isolated> 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL;<final> 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL;<initial> 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL;<medial> 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL;<isolated> 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL;<final> 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL;<initial> 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL;<medial> 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL;<isolated> 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL;<final> 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL;<initial> 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL;<medial> 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL;<isolated> 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL;<final> 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL;<initial> 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL;<medial> 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL;<final> 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL;<isolated> 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL;<final> 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL;<isolated> 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL;<final> 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL;<isolated> 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL;<final> 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL;<isolated> 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL;<final> 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL;<isolated> 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL;<final> 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL;<isolated> 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL;<final> 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL;<initial> 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL;<medial> 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL;<isolated> 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL;<final> 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL;<initial> 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL;<medial> 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL;<isolated> 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL;<final> 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL;<initial> 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL;<medial> 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL;<isolated> 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL;<final> 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL;<initial> 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL;<medial> 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL;<isolated> 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL;<final> 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL;<isolated> 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL;<final> 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL;<initial> 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL;<medial> 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL;<final> 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL;<isolated> 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL;<final> 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL;<initial> 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL;<medial> 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL;<isolated> 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL;<final> 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL;<initial> 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL;<medial> 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL;<isolated> 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL;<final> 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBC2;ARABIC SYMBOL WASLA ABOVE;Sk;0;AL;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL;<isolated> 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL;<final> 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL;<initial> 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL;<medial> 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL;<isolated> 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL;<final> 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL;<isolated> 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL;<final> 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL;<isolated> 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL;<final> 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL;<isolated> 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL;<final> 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL;<isolated> 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL;<final> 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL;<isolated> 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL;<final> 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL;<isolated> 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL;<final> 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL;<initial> 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL;<medial> 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL;<medial> 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL;<final> 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL;<final> 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL;<isolated> 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL;<final> 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL;<final> 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL;<final> 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL;<isolated> 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL;<final> 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL;<isolated> 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL;<final> 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL;<initial> 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL;<initial> 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL;<isolated> 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL;<final> 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL;<initial> 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL;<medial> 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL;<final> 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL;<final> 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL;<final> 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL;<final> 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL;<final> 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL;<final> 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL;<final> 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL;<final> 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL;<final> 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL;<final> 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL;<final> 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL;<final> 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL;<final> 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL;<final> 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL;<final> 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL;<final> 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL;<final> 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL;<final> 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL;<final> 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL;<initial> 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL;<initial> 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL;<initial> 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL;<medial> 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL;<medial> 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL;<isolated> 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL;<isolated> 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL;<isolated> 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL;<final> 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL;<final> 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL;<final> 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL;<final> 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL;<final> 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL;<initial> 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL;<medial> 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL;<medial> 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL;<medial> 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL;<final> 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD40;ARABIC LIGATURE RAHIMAHU ALLAAH;So;0;ON;;;;;N;;;;; +FD41;ARABIC LIGATURE RADI ALLAAHU ANH;So;0;ON;;;;;N;;;;; +FD42;ARABIC LIGATURE RADI ALLAAHU ANHAA;So;0;ON;;;;;N;;;;; +FD43;ARABIC LIGATURE RADI ALLAAHU ANHUM;So;0;ON;;;;;N;;;;; +FD44;ARABIC LIGATURE RADI ALLAAHU ANHUMAA;So;0;ON;;;;;N;;;;; +FD45;ARABIC LIGATURE RADI ALLAAHU ANHUNNA;So;0;ON;;;;;N;;;;; +FD46;ARABIC LIGATURE SALLALLAAHU ALAYHI WA-AALIH;So;0;ON;;;;;N;;;;; +FD47;ARABIC LIGATURE ALAYHI AS-SALAAM;So;0;ON;;;;;N;;;;; +FD48;ARABIC LIGATURE ALAYHIM AS-SALAAM;So;0;ON;;;;;N;;;;; +FD49;ARABIC LIGATURE ALAYHIMAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4A;ARABIC LIGATURE ALAYHI AS-SALAATU WAS-SALAAM;So;0;ON;;;;;N;;;;; +FD4B;ARABIC LIGATURE QUDDISA SIRRAH;So;0;ON;;;;;N;;;;; +FD4C;ARABIC LIGATURE SALLALLAHU ALAYHI WAAALIHEE WA-SALLAM;So;0;ON;;;;;N;;;;; +FD4D;ARABIC LIGATURE ALAYHAA AS-SALAAM;So;0;ON;;;;;N;;;;; +FD4E;ARABIC LIGATURE TABAARAKA WA-TAAALAA;So;0;ON;;;;;N;;;;; +FD4F;ARABIC LIGATURE RAHIMAHUM ALLAAH;So;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL;<final> 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL;<final> 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL;<final> 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL;<initial> 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL;<initial> 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL;<final> 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL;<final> 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL;<initial> 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL;<final> 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL;<final> 0646 062C 064A;;;;N;;;;; +FDCF;ARABIC LIGATURE SALAAMUHU ALAYNAA;So;0;ON;;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL;<isolated> 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL;<isolated> 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL;<isolated> 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL;<isolated> 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL;<isolated> 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL;<isolated> 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL;<isolated> 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL;<isolated> 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL;<isolated> 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL;<isolated> 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FDFE;ARABIC LIGATURE SUBHAANAHU WA TAAALAA;So;0;ON;;;;;N;;;;; +FDFF;ARABIC LIGATURE AZZA WA JALL;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON;<vertical> 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON;<vertical> 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON;<vertical> 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON;<vertical> 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON;<vertical> 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON;<vertical> 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON;<vertical> 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON;<vertical> 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<vertical> 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<vertical> 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;<vertical> 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;<vertical> 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;<vertical> 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;<vertical> 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON;<vertical> 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON;<vertical> 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON;<vertical> 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON;<vertical> 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON;<vertical> 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON;<vertical> 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON;<compat> 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON;<compat> 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS;<small> 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON;<small> 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS;<small> 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON;<small> 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS;<small> 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON;<small> 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON;<small> 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON;<small> 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON;<small> 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET;<small> 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON;<small> 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON;<small> 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES;<small> 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON;<small> 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON;<small> 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET;<small> 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET;<small> 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON;<small> 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL;<medial> 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL;<isolated> 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL;<medial> 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL;<isolated> 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL;<medial> 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL;<medial> 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL;<isolated> 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL;<medial> 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL;<isolated> 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL;<medial> 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL;<isolated> 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL;<initial> 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL;<medial> 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL;<final> 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL;<isolated> 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL;<final> 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL;<initial> 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL;<medial> 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL;<isolated> 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL;<final> 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL;<isolated> 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL;<final> 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL;<initial> 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL;<medial> 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL;<isolated> 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL;<final> 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL;<initial> 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL;<medial> 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL;<isolated> 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL;<final> 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL;<initial> 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL;<medial> 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL;<isolated> 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL;<final> 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL;<initial> 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL;<medial> 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL;<isolated> 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL;<final> 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL;<initial> 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL;<medial> 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL;<isolated> 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL;<final> 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL;<isolated> 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL;<final> 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL;<isolated> 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL;<final> 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL;<isolated> 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL;<final> 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL;<isolated> 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL;<final> 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL;<initial> 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL;<medial> 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL;<isolated> 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL;<final> 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL;<initial> 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL;<medial> 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL;<isolated> 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL;<final> 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL;<initial> 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL;<medial> 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL;<isolated> 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL;<final> 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL;<initial> 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL;<medial> 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL;<isolated> 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL;<final> 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL;<initial> 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL;<medial> 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL;<isolated> 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL;<final> 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL;<initial> 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL;<medial> 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL;<isolated> 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL;<final> 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL;<initial> 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL;<medial> 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL;<isolated> 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL;<final> 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL;<initial> 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL;<medial> 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL;<isolated> 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL;<final> 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL;<initial> 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL;<medial> 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL;<isolated> 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL;<final> 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL;<initial> 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL;<medial> 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL;<isolated> 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL;<final> 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL;<initial> 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL;<medial> 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL;<isolated> 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL;<final> 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL;<initial> 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL;<medial> 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL;<isolated> 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL;<final> 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL;<initial> 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL;<medial> 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL;<isolated> 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL;<final> 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL;<initial> 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL;<medial> 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL;<isolated> 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL;<final> 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL;<initial> 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL;<medial> 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL;<isolated> 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL;<final> 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL;<isolated> 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL;<final> 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL;<isolated> 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL;<final> 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL;<initial> 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL;<medial> 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL;<isolated> 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL;<final> 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL;<isolated> 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL;<final> 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL;<isolated> 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL;<final> 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON;<wide> 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON;<wide> 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET;<wide> 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET;<wide> 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET;<wide> 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON;<wide> 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON;<wide> 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON;<wide> 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<wide> 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN;<wide> 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN;<wide> 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN;<wide> 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN;<wide> 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN;<wide> 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN;<wide> 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN;<wide> 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN;<wide> 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN;<wide> 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN;<wide> 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS;<wide> 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON;<wide> 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON;<wide> 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON;<wide> 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON;<wide> 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L;<wide> 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L;<wide> 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L;<wide> 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L;<wide> 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L;<wide> 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L;<wide> 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L;<wide> 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L;<wide> 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L;<wide> 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L;<wide> 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L;<wide> 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L;<wide> 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L;<wide> 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L;<wide> 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L;<wide> 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L;<wide> 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L;<wide> 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L;<wide> 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L;<wide> 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L;<wide> 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L;<wide> 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L;<wide> 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L;<wide> 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L;<wide> 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L;<wide> 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L;<wide> 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON;<wide> 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON;<wide> 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON;<wide> 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON;<wide> 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON;<wide> 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON;<wide> 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L;<wide> 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L;<wide> 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L;<wide> 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L;<wide> 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L;<wide> 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L;<wide> 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L;<wide> 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L;<wide> 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L;<wide> 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L;<wide> 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L;<wide> 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L;<wide> 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L;<wide> 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L;<wide> 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L;<wide> 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L;<wide> 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L;<wide> 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L;<wide> 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L;<wide> 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L;<wide> 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L;<wide> 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L;<wide> 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L;<wide> 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L;<wide> 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L;<wide> 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L;<wide> 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON;<wide> 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON;<wide> 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON;<wide> 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON;<narrow> 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L;<narrow> 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L;<narrow> 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L;<narrow> 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L;<narrow> 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L;<narrow> 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L;<narrow> 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L;<narrow> 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L;<narrow> 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L;<narrow> 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L;<narrow> 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;<narrow> 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L;<narrow> 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L;<narrow> 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L;<narrow> 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L;<narrow> 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L;<narrow> 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L;<narrow> 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L;<narrow> 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L;<narrow> 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L;<narrow> 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L;<narrow> 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L;<narrow> 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L;<narrow> 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L;<narrow> 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L;<narrow> 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L;<narrow> 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L;<narrow> 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L;<narrow> 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L;<narrow> 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L;<narrow> 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L;<narrow> 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L;<narrow> 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L;<narrow> 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L;<narrow> 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L;<narrow> 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L;<narrow> 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L;<narrow> 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L;<narrow> 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L;<narrow> 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L;<narrow> 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L;<narrow> 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L;<narrow> 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L;<narrow> 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L;<narrow> 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L;<narrow> 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L;<narrow> 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L;<narrow> 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L;<narrow> 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L;<narrow> 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L;<narrow> 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L;<narrow> 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L;<narrow> 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L;<narrow> 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L;<narrow> 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L;<narrow> 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L;<narrow> 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L;<narrow> 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L;<narrow> 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L;<narrow> 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L;<narrow> 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L;<narrow> 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L;<narrow> 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L;<narrow> 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L;<narrow> 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L;<narrow> 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L;<narrow> 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L;<narrow> 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L;<narrow> 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L;<narrow> 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L;<narrow> 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L;<narrow> 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L;<narrow> 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L;<narrow> 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L;<narrow> 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L;<narrow> 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L;<narrow> 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L;<narrow> 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L;<narrow> 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L;<narrow> 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L;<narrow> 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L;<narrow> 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L;<narrow> 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L;<narrow> 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L;<narrow> 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L;<narrow> 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L;<narrow> 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L;<narrow> 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L;<narrow> 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L;<narrow> 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L;<narrow> 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L;<narrow> 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L;<narrow> 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L;<narrow> 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L;<narrow> 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L;<narrow> 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L;<narrow> 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L;<narrow> 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L;<narrow> 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L;<narrow> 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L;<narrow> 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L;<narrow> 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L;<narrow> 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L;<narrow> 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L;<narrow> 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L;<narrow> 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L;<narrow> 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET;<wide> 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET;<wide> 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON;<wide> 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON;<wide> 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON;<wide> 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET;<wide> 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET;<wide> 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON;<narrow> 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON;<narrow> 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON;<narrow> 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON;<narrow> 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON;<narrow> 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON;<narrow> 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON;<narrow> 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; +1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +1018D;GREEK INDICTION SIGN;So;0;L;;;;;N;;;;; +1018E;NOMISMA SIGN;So;0;L;;;;;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +1019C;ASCIA SYMBOL;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +1032D;OLD ITALIC LETTER YE;Lo;0;L;;;;;N;;;;; +1032E;OLD ITALIC LETTER NORTHERN TSE;Lo;0;L;;;;;N;;;;; +1032F;OLD ITALIC LETTER SOUTHERN TSE;Lo;0;L;;;;;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104B0;OSAGE CAPITAL LETTER A;Lu;0;L;;;;;N;;;;104D8; +104B1;OSAGE CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;104D9; +104B2;OSAGE CAPITAL LETTER AIN;Lu;0;L;;;;;N;;;;104DA; +104B3;OSAGE CAPITAL LETTER AH;Lu;0;L;;;;;N;;;;104DB; +104B4;OSAGE CAPITAL LETTER BRA;Lu;0;L;;;;;N;;;;104DC; +104B5;OSAGE CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;104DD; +104B6;OSAGE CAPITAL LETTER EHCHA;Lu;0;L;;;;;N;;;;104DE; +104B7;OSAGE CAPITAL LETTER E;Lu;0;L;;;;;N;;;;104DF; +104B8;OSAGE CAPITAL LETTER EIN;Lu;0;L;;;;;N;;;;104E0; +104B9;OSAGE CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;104E1; +104BA;OSAGE CAPITAL LETTER HYA;Lu;0;L;;;;;N;;;;104E2; +104BB;OSAGE CAPITAL LETTER I;Lu;0;L;;;;;N;;;;104E3; +104BC;OSAGE CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;104E4; +104BD;OSAGE CAPITAL LETTER EHKA;Lu;0;L;;;;;N;;;;104E5; +104BE;OSAGE CAPITAL LETTER KYA;Lu;0;L;;;;;N;;;;104E6; +104BF;OSAGE CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;104E7; +104C0;OSAGE CAPITAL LETTER MA;Lu;0;L;;;;;N;;;;104E8; +104C1;OSAGE CAPITAL LETTER NA;Lu;0;L;;;;;N;;;;104E9; +104C2;OSAGE CAPITAL LETTER O;Lu;0;L;;;;;N;;;;104EA; +104C3;OSAGE CAPITAL LETTER OIN;Lu;0;L;;;;;N;;;;104EB; +104C4;OSAGE CAPITAL LETTER PA;Lu;0;L;;;;;N;;;;104EC; +104C5;OSAGE CAPITAL LETTER EHPA;Lu;0;L;;;;;N;;;;104ED; +104C6;OSAGE CAPITAL LETTER SA;Lu;0;L;;;;;N;;;;104EE; +104C7;OSAGE CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;104EF; +104C8;OSAGE CAPITAL LETTER TA;Lu;0;L;;;;;N;;;;104F0; +104C9;OSAGE CAPITAL LETTER EHTA;Lu;0;L;;;;;N;;;;104F1; +104CA;OSAGE CAPITAL LETTER TSA;Lu;0;L;;;;;N;;;;104F2; +104CB;OSAGE CAPITAL LETTER EHTSA;Lu;0;L;;;;;N;;;;104F3; +104CC;OSAGE CAPITAL LETTER TSHA;Lu;0;L;;;;;N;;;;104F4; +104CD;OSAGE CAPITAL LETTER DHA;Lu;0;L;;;;;N;;;;104F5; +104CE;OSAGE CAPITAL LETTER U;Lu;0;L;;;;;N;;;;104F6; +104CF;OSAGE CAPITAL LETTER WA;Lu;0;L;;;;;N;;;;104F7; +104D0;OSAGE CAPITAL LETTER KHA;Lu;0;L;;;;;N;;;;104F8; +104D1;OSAGE CAPITAL LETTER GHA;Lu;0;L;;;;;N;;;;104F9; +104D2;OSAGE CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;104FA; +104D3;OSAGE CAPITAL LETTER ZHA;Lu;0;L;;;;;N;;;;104FB; +104D8;OSAGE SMALL LETTER A;Ll;0;L;;;;;N;;;104B0;;104B0 +104D9;OSAGE SMALL LETTER AI;Ll;0;L;;;;;N;;;104B1;;104B1 +104DA;OSAGE SMALL LETTER AIN;Ll;0;L;;;;;N;;;104B2;;104B2 +104DB;OSAGE SMALL LETTER AH;Ll;0;L;;;;;N;;;104B3;;104B3 +104DC;OSAGE SMALL LETTER BRA;Ll;0;L;;;;;N;;;104B4;;104B4 +104DD;OSAGE SMALL LETTER CHA;Ll;0;L;;;;;N;;;104B5;;104B5 +104DE;OSAGE SMALL LETTER EHCHA;Ll;0;L;;;;;N;;;104B6;;104B6 +104DF;OSAGE SMALL LETTER E;Ll;0;L;;;;;N;;;104B7;;104B7 +104E0;OSAGE SMALL LETTER EIN;Ll;0;L;;;;;N;;;104B8;;104B8 +104E1;OSAGE SMALL LETTER HA;Ll;0;L;;;;;N;;;104B9;;104B9 +104E2;OSAGE SMALL LETTER HYA;Ll;0;L;;;;;N;;;104BA;;104BA +104E3;OSAGE SMALL LETTER I;Ll;0;L;;;;;N;;;104BB;;104BB +104E4;OSAGE SMALL LETTER KA;Ll;0;L;;;;;N;;;104BC;;104BC +104E5;OSAGE SMALL LETTER EHKA;Ll;0;L;;;;;N;;;104BD;;104BD +104E6;OSAGE SMALL LETTER KYA;Ll;0;L;;;;;N;;;104BE;;104BE +104E7;OSAGE SMALL LETTER LA;Ll;0;L;;;;;N;;;104BF;;104BF +104E8;OSAGE SMALL LETTER MA;Ll;0;L;;;;;N;;;104C0;;104C0 +104E9;OSAGE SMALL LETTER NA;Ll;0;L;;;;;N;;;104C1;;104C1 +104EA;OSAGE SMALL LETTER O;Ll;0;L;;;;;N;;;104C2;;104C2 +104EB;OSAGE SMALL LETTER OIN;Ll;0;L;;;;;N;;;104C3;;104C3 +104EC;OSAGE SMALL LETTER PA;Ll;0;L;;;;;N;;;104C4;;104C4 +104ED;OSAGE SMALL LETTER EHPA;Ll;0;L;;;;;N;;;104C5;;104C5 +104EE;OSAGE SMALL LETTER SA;Ll;0;L;;;;;N;;;104C6;;104C6 +104EF;OSAGE SMALL LETTER SHA;Ll;0;L;;;;;N;;;104C7;;104C7 +104F0;OSAGE SMALL LETTER TA;Ll;0;L;;;;;N;;;104C8;;104C8 +104F1;OSAGE SMALL LETTER EHTA;Ll;0;L;;;;;N;;;104C9;;104C9 +104F2;OSAGE SMALL LETTER TSA;Ll;0;L;;;;;N;;;104CA;;104CA +104F3;OSAGE SMALL LETTER EHTSA;Ll;0;L;;;;;N;;;104CB;;104CB +104F4;OSAGE SMALL LETTER TSHA;Ll;0;L;;;;;N;;;104CC;;104CC +104F5;OSAGE SMALL LETTER DHA;Ll;0;L;;;;;N;;;104CD;;104CD +104F6;OSAGE SMALL LETTER U;Ll;0;L;;;;;N;;;104CE;;104CE +104F7;OSAGE SMALL LETTER WA;Ll;0;L;;;;;N;;;104CF;;104CF +104F8;OSAGE SMALL LETTER KHA;Ll;0;L;;;;;N;;;104D0;;104D0 +104F9;OSAGE SMALL LETTER GHA;Ll;0;L;;;;;N;;;104D1;;104D1 +104FA;OSAGE SMALL LETTER ZA;Ll;0;L;;;;;N;;;104D2;;104D2 +104FB;OSAGE SMALL LETTER ZHA;Ll;0;L;;;;;N;;;104D3;;104D3 +10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; +10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; +10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10570;VITHKUQI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;10597; +10571;VITHKUQI CAPITAL LETTER BBE;Lu;0;L;;;;;N;;;;10598; +10572;VITHKUQI CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;10599; +10573;VITHKUQI CAPITAL LETTER CE;Lu;0;L;;;;;N;;;;1059A; +10574;VITHKUQI CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;1059B; +10575;VITHKUQI CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;1059C; +10576;VITHKUQI CAPITAL LETTER DHE;Lu;0;L;;;;;N;;;;1059D; +10577;VITHKUQI CAPITAL LETTER EI;Lu;0;L;;;;;N;;;;1059E; +10578;VITHKUQI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;1059F; +10579;VITHKUQI CAPITAL LETTER FE;Lu;0;L;;;;;N;;;;105A0; +1057A;VITHKUQI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;105A1; +1057C;VITHKUQI CAPITAL LETTER HA;Lu;0;L;;;;;N;;;;105A3; +1057D;VITHKUQI CAPITAL LETTER HHA;Lu;0;L;;;;;N;;;;105A4; +1057E;VITHKUQI CAPITAL LETTER I;Lu;0;L;;;;;N;;;;105A5; +1057F;VITHKUQI CAPITAL LETTER IJE;Lu;0;L;;;;;N;;;;105A6; +10580;VITHKUQI CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;105A7; +10581;VITHKUQI CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;105A8; +10582;VITHKUQI CAPITAL LETTER LA;Lu;0;L;;;;;N;;;;105A9; +10583;VITHKUQI CAPITAL LETTER LLA;Lu;0;L;;;;;N;;;;105AA; +10584;VITHKUQI CAPITAL LETTER ME;Lu;0;L;;;;;N;;;;105AB; +10585;VITHKUQI CAPITAL LETTER NE;Lu;0;L;;;;;N;;;;105AC; +10586;VITHKUQI CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;105AD; +10587;VITHKUQI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;105AE; +10588;VITHKUQI CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;105AF; +10589;VITHKUQI CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;105B0; +1058A;VITHKUQI CAPITAL LETTER RE;Lu;0;L;;;;;N;;;;105B1; +1058C;VITHKUQI CAPITAL LETTER SE;Lu;0;L;;;;;N;;;;105B3; +1058D;VITHKUQI CAPITAL LETTER SHE;Lu;0;L;;;;;N;;;;105B4; +1058E;VITHKUQI CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;105B5; +1058F;VITHKUQI CAPITAL LETTER THE;Lu;0;L;;;;;N;;;;105B6; +10590;VITHKUQI CAPITAL LETTER U;Lu;0;L;;;;;N;;;;105B7; +10591;VITHKUQI CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;105B8; +10592;VITHKUQI CAPITAL LETTER XE;Lu;0;L;;;;;N;;;;105B9; +10594;VITHKUQI CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;105BB; +10595;VITHKUQI CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;105BC; +10597;VITHKUQI SMALL LETTER A;Ll;0;L;;;;;N;;;10570;;10570 +10598;VITHKUQI SMALL LETTER BBE;Ll;0;L;;;;;N;;;10571;;10571 +10599;VITHKUQI SMALL LETTER BE;Ll;0;L;;;;;N;;;10572;;10572 +1059A;VITHKUQI SMALL LETTER CE;Ll;0;L;;;;;N;;;10573;;10573 +1059B;VITHKUQI SMALL LETTER CHE;Ll;0;L;;;;;N;;;10574;;10574 +1059C;VITHKUQI SMALL LETTER DE;Ll;0;L;;;;;N;;;10575;;10575 +1059D;VITHKUQI SMALL LETTER DHE;Ll;0;L;;;;;N;;;10576;;10576 +1059E;VITHKUQI SMALL LETTER EI;Ll;0;L;;;;;N;;;10577;;10577 +1059F;VITHKUQI SMALL LETTER E;Ll;0;L;;;;;N;;;10578;;10578 +105A0;VITHKUQI SMALL LETTER FE;Ll;0;L;;;;;N;;;10579;;10579 +105A1;VITHKUQI SMALL LETTER GA;Ll;0;L;;;;;N;;;1057A;;1057A +105A3;VITHKUQI SMALL LETTER HA;Ll;0;L;;;;;N;;;1057C;;1057C +105A4;VITHKUQI SMALL LETTER HHA;Ll;0;L;;;;;N;;;1057D;;1057D +105A5;VITHKUQI SMALL LETTER I;Ll;0;L;;;;;N;;;1057E;;1057E +105A6;VITHKUQI SMALL LETTER IJE;Ll;0;L;;;;;N;;;1057F;;1057F +105A7;VITHKUQI SMALL LETTER JE;Ll;0;L;;;;;N;;;10580;;10580 +105A8;VITHKUQI SMALL LETTER KA;Ll;0;L;;;;;N;;;10581;;10581 +105A9;VITHKUQI SMALL LETTER LA;Ll;0;L;;;;;N;;;10582;;10582 +105AA;VITHKUQI SMALL LETTER LLA;Ll;0;L;;;;;N;;;10583;;10583 +105AB;VITHKUQI SMALL LETTER ME;Ll;0;L;;;;;N;;;10584;;10584 +105AC;VITHKUQI SMALL LETTER NE;Ll;0;L;;;;;N;;;10585;;10585 +105AD;VITHKUQI SMALL LETTER NJE;Ll;0;L;;;;;N;;;10586;;10586 +105AE;VITHKUQI SMALL LETTER O;Ll;0;L;;;;;N;;;10587;;10587 +105AF;VITHKUQI SMALL LETTER PE;Ll;0;L;;;;;N;;;10588;;10588 +105B0;VITHKUQI SMALL LETTER QA;Ll;0;L;;;;;N;;;10589;;10589 +105B1;VITHKUQI SMALL LETTER RE;Ll;0;L;;;;;N;;;1058A;;1058A +105B3;VITHKUQI SMALL LETTER SE;Ll;0;L;;;;;N;;;1058C;;1058C +105B4;VITHKUQI SMALL LETTER SHE;Ll;0;L;;;;;N;;;1058D;;1058D +105B5;VITHKUQI SMALL LETTER TE;Ll;0;L;;;;;N;;;1058E;;1058E +105B6;VITHKUQI SMALL LETTER THE;Ll;0;L;;;;;N;;;1058F;;1058F +105B7;VITHKUQI SMALL LETTER U;Ll;0;L;;;;;N;;;10590;;10590 +105B8;VITHKUQI SMALL LETTER VE;Ll;0;L;;;;;N;;;10591;;10591 +105B9;VITHKUQI SMALL LETTER XE;Ll;0;L;;;;;N;;;10592;;10592 +105BB;VITHKUQI SMALL LETTER Y;Ll;0;L;;;;;N;;;10594;;10594 +105BC;VITHKUQI SMALL LETTER ZE;Ll;0;L;;;;;N;;;10595;;10595 +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10780;MODIFIER LETTER SMALL CAPITAL AA;Lm;0;L;;;;;N;;;;; +10781;MODIFIER LETTER SUPERSCRIPT TRIANGULAR COLON;Lm;0;L;<super> 02D0;;;;N;;;;; +10782;MODIFIER LETTER SUPERSCRIPT HALF TRIANGULAR COLON;Lm;0;L;<super> 02D1;;;;N;;;;; +10783;MODIFIER LETTER SMALL AE;Lm;0;L;<super> 00E6;;;;N;;;;; +10784;MODIFIER LETTER SMALL CAPITAL B;Lm;0;L;<super> 0299;;;;N;;;;; +10785;MODIFIER LETTER SMALL B WITH HOOK;Lm;0;L;<super> 0253;;;;N;;;;; +10787;MODIFIER LETTER SMALL DZ DIGRAPH;Lm;0;L;<super> 02A3;;;;N;;;;; +10788;MODIFIER LETTER SMALL DZ DIGRAPH WITH RETROFLEX HOOK;Lm;0;L;<super> AB66;;;;N;;;;; +10789;MODIFIER LETTER SMALL DZ DIGRAPH WITH CURL;Lm;0;L;<super> 02A5;;;;N;;;;; +1078A;MODIFIER LETTER SMALL DEZH DIGRAPH;Lm;0;L;<super> 02A4;;;;N;;;;; +1078B;MODIFIER LETTER SMALL D WITH TAIL;Lm;0;L;<super> 0256;;;;N;;;;; +1078C;MODIFIER LETTER SMALL D WITH HOOK;Lm;0;L;<super> 0257;;;;N;;;;; +1078D;MODIFIER LETTER SMALL D WITH HOOK AND TAIL;Lm;0;L;<super> 1D91;;;;N;;;;; +1078E;MODIFIER LETTER SMALL REVERSED E;Lm;0;L;<super> 0258;;;;N;;;;; +1078F;MODIFIER LETTER SMALL CLOSED REVERSED OPEN E;Lm;0;L;<super> 025E;;;;N;;;;; +10790;MODIFIER LETTER SMALL FENG DIGRAPH;Lm;0;L;<super> 02A9;;;;N;;;;; +10791;MODIFIER LETTER SMALL RAMS HORN;Lm;0;L;<super> 0264;;;;N;;;;; +10792;MODIFIER LETTER SMALL CAPITAL G;Lm;0;L;<super> 0262;;;;N;;;;; +10793;MODIFIER LETTER SMALL G WITH HOOK;Lm;0;L;<super> 0260;;;;N;;;;; +10794;MODIFIER LETTER SMALL CAPITAL G WITH HOOK;Lm;0;L;<super> 029B;;;;N;;;;; +10795;MODIFIER LETTER SMALL H WITH STROKE;Lm;0;L;<super> 0127;;;;N;;;;; +10796;MODIFIER LETTER SMALL CAPITAL H;Lm;0;L;<super> 029C;;;;N;;;;; +10797;MODIFIER LETTER SMALL HENG WITH HOOK;Lm;0;L;<super> 0267;;;;N;;;;; +10798;MODIFIER LETTER SMALL DOTLESS J WITH STROKE AND HOOK;Lm;0;L;<super> 0284;;;;N;;;;; +10799;MODIFIER LETTER SMALL LS DIGRAPH;Lm;0;L;<super> 02AA;;;;N;;;;; +1079A;MODIFIER LETTER SMALL LZ DIGRAPH;Lm;0;L;<super> 02AB;;;;N;;;;; +1079B;MODIFIER LETTER SMALL L WITH BELT;Lm;0;L;<super> 026C;;;;N;;;;; +1079C;MODIFIER LETTER SMALL CAPITAL L WITH BELT;Lm;0;L;<super> 1DF04;;;;N;;;;; +1079D;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK AND BELT;Lm;0;L;<super> A78E;;;;N;;;;; +1079E;MODIFIER LETTER SMALL LEZH;Lm;0;L;<super> 026E;;;;N;;;;; +1079F;MODIFIER LETTER SMALL LEZH WITH RETROFLEX HOOK;Lm;0;L;<super> 1DF05;;;;N;;;;; +107A0;MODIFIER LETTER SMALL TURNED Y;Lm;0;L;<super> 028E;;;;N;;;;; +107A1;MODIFIER LETTER SMALL TURNED Y WITH BELT;Lm;0;L;<super> 1DF06;;;;N;;;;; +107A2;MODIFIER LETTER SMALL O WITH STROKE;Lm;0;L;<super> 00F8;;;;N;;;;; +107A3;MODIFIER LETTER SMALL CAPITAL OE;Lm;0;L;<super> 0276;;;;N;;;;; +107A4;MODIFIER LETTER SMALL CLOSED OMEGA;Lm;0;L;<super> 0277;;;;N;;;;; +107A5;MODIFIER LETTER SMALL Q;Lm;0;L;<super> 0071;;;;N;;;;; +107A6;MODIFIER LETTER SMALL TURNED R WITH LONG LEG;Lm;0;L;<super> 027A;;;;N;;;;; +107A7;MODIFIER LETTER SMALL TURNED R WITH LONG LEG AND RETROFLEX HOOK;Lm;0;L;<super> 1DF08;;;;N;;;;; +107A8;MODIFIER LETTER SMALL R WITH TAIL;Lm;0;L;<super> 027D;;;;N;;;;; +107A9;MODIFIER LETTER SMALL R WITH FISHHOOK;Lm;0;L;<super> 027E;;;;N;;;;; +107AA;MODIFIER LETTER SMALL CAPITAL R;Lm;0;L;<super> 0280;;;;N;;;;; +107AB;MODIFIER LETTER SMALL TC DIGRAPH WITH CURL;Lm;0;L;<super> 02A8;;;;N;;;;; +107AC;MODIFIER LETTER SMALL TS DIGRAPH;Lm;0;L;<super> 02A6;;;;N;;;;; +107AD;MODIFIER LETTER SMALL TS DIGRAPH WITH RETROFLEX HOOK;Lm;0;L;<super> AB67;;;;N;;;;; +107AE;MODIFIER LETTER SMALL TESH DIGRAPH;Lm;0;L;<super> 02A7;;;;N;;;;; +107AF;MODIFIER LETTER SMALL T WITH RETROFLEX HOOK;Lm;0;L;<super> 0288;;;;N;;;;; +107B0;MODIFIER LETTER SMALL V WITH RIGHT HOOK;Lm;0;L;<super> 2C71;;;;N;;;;; +107B2;MODIFIER LETTER SMALL CAPITAL Y;Lm;0;L;<super> 028F;;;;N;;;;; +107B3;MODIFIER LETTER GLOTTAL STOP WITH STROKE;Lm;0;L;<super> 02A1;;;;N;;;;; +107B4;MODIFIER LETTER REVERSED GLOTTAL STOP WITH STROKE;Lm;0;L;<super> 02A2;;;;N;;;;; +107B5;MODIFIER LETTER BILABIAL CLICK;Lm;0;L;<super> 0298;;;;N;;;;; +107B6;MODIFIER LETTER DENTAL CLICK;Lm;0;L;<super> 01C0;;;;N;;;;; +107B7;MODIFIER LETTER LATERAL CLICK;Lm;0;L;<super> 01C1;;;;N;;;;; +107B8;MODIFIER LETTER ALVEOLAR CLICK;Lm;0;L;<super> 01C2;;;;N;;;;; +107B9;MODIFIER LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lm;0;L;<super> 1DF0A;;;;N;;;;; +107BA;MODIFIER LETTER SMALL S WITH CURL;Lm;0;L;<super> 1DF1E;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A34;KHAROSHTHI LETTER TTTA;Lo;0;R;;;;;N;;;;; +10A35;KHAROSHTHI LETTER VHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A48;KHAROSHTHI FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10D00;HANIFI ROHINGYA LETTER A;Lo;0;AL;;;;;N;;;;; +10D01;HANIFI ROHINGYA LETTER BA;Lo;0;AL;;;;;N;;;;; +10D02;HANIFI ROHINGYA LETTER PA;Lo;0;AL;;;;;N;;;;; +10D03;HANIFI ROHINGYA LETTER TA;Lo;0;AL;;;;;N;;;;; +10D04;HANIFI ROHINGYA LETTER TTA;Lo;0;AL;;;;;N;;;;; +10D05;HANIFI ROHINGYA LETTER JA;Lo;0;AL;;;;;N;;;;; +10D06;HANIFI ROHINGYA LETTER CA;Lo;0;AL;;;;;N;;;;; +10D07;HANIFI ROHINGYA LETTER HA;Lo;0;AL;;;;;N;;;;; +10D08;HANIFI ROHINGYA LETTER KHA;Lo;0;AL;;;;;N;;;;; +10D09;HANIFI ROHINGYA LETTER FA;Lo;0;AL;;;;;N;;;;; +10D0A;HANIFI ROHINGYA LETTER DA;Lo;0;AL;;;;;N;;;;; +10D0B;HANIFI ROHINGYA LETTER DDA;Lo;0;AL;;;;;N;;;;; +10D0C;HANIFI ROHINGYA LETTER RA;Lo;0;AL;;;;;N;;;;; +10D0D;HANIFI ROHINGYA LETTER RRA;Lo;0;AL;;;;;N;;;;; +10D0E;HANIFI ROHINGYA LETTER ZA;Lo;0;AL;;;;;N;;;;; +10D0F;HANIFI ROHINGYA LETTER SA;Lo;0;AL;;;;;N;;;;; +10D10;HANIFI ROHINGYA LETTER SHA;Lo;0;AL;;;;;N;;;;; +10D11;HANIFI ROHINGYA LETTER KA;Lo;0;AL;;;;;N;;;;; +10D12;HANIFI ROHINGYA LETTER GA;Lo;0;AL;;;;;N;;;;; +10D13;HANIFI ROHINGYA LETTER LA;Lo;0;AL;;;;;N;;;;; +10D14;HANIFI ROHINGYA LETTER MA;Lo;0;AL;;;;;N;;;;; +10D15;HANIFI ROHINGYA LETTER NA;Lo;0;AL;;;;;N;;;;; +10D16;HANIFI ROHINGYA LETTER WA;Lo;0;AL;;;;;N;;;;; +10D17;HANIFI ROHINGYA LETTER KINNA WA;Lo;0;AL;;;;;N;;;;; +10D18;HANIFI ROHINGYA LETTER YA;Lo;0;AL;;;;;N;;;;; +10D19;HANIFI ROHINGYA LETTER KINNA YA;Lo;0;AL;;;;;N;;;;; +10D1A;HANIFI ROHINGYA LETTER NGA;Lo;0;AL;;;;;N;;;;; +10D1B;HANIFI ROHINGYA LETTER NYA;Lo;0;AL;;;;;N;;;;; +10D1C;HANIFI ROHINGYA LETTER VA;Lo;0;AL;;;;;N;;;;; +10D1D;HANIFI ROHINGYA VOWEL A;Lo;0;AL;;;;;N;;;;; +10D1E;HANIFI ROHINGYA VOWEL I;Lo;0;AL;;;;;N;;;;; +10D1F;HANIFI ROHINGYA VOWEL U;Lo;0;AL;;;;;N;;;;; +10D20;HANIFI ROHINGYA VOWEL E;Lo;0;AL;;;;;N;;;;; +10D21;HANIFI ROHINGYA VOWEL O;Lo;0;AL;;;;;N;;;;; +10D22;HANIFI ROHINGYA MARK SAKIN;Lo;0;AL;;;;;N;;;;; +10D23;HANIFI ROHINGYA MARK NA KHONNA;Lo;0;AL;;;;;N;;;;; +10D24;HANIFI ROHINGYA SIGN HARBAHAY;Mn;230;NSM;;;;;N;;;;; +10D25;HANIFI ROHINGYA SIGN TAHALA;Mn;230;NSM;;;;;N;;;;; +10D26;HANIFI ROHINGYA SIGN TANA;Mn;230;NSM;;;;;N;;;;; +10D27;HANIFI ROHINGYA SIGN TASSI;Mn;230;NSM;;;;;N;;;;; +10D30;HANIFI ROHINGYA DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +10D31;HANIFI ROHINGYA DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +10D32;HANIFI ROHINGYA DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +10D33;HANIFI ROHINGYA DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +10D34;HANIFI ROHINGYA DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +10D35;HANIFI ROHINGYA DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +10D36;HANIFI ROHINGYA DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +10D37;HANIFI ROHINGYA DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +10D38;HANIFI ROHINGYA DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +10D39;HANIFI ROHINGYA DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +10E80;YEZIDI LETTER ELIF;Lo;0;R;;;;;N;;;;; +10E81;YEZIDI LETTER BE;Lo;0;R;;;;;N;;;;; +10E82;YEZIDI LETTER PE;Lo;0;R;;;;;N;;;;; +10E83;YEZIDI LETTER PHE;Lo;0;R;;;;;N;;;;; +10E84;YEZIDI LETTER THE;Lo;0;R;;;;;N;;;;; +10E85;YEZIDI LETTER SE;Lo;0;R;;;;;N;;;;; +10E86;YEZIDI LETTER CIM;Lo;0;R;;;;;N;;;;; +10E87;YEZIDI LETTER CHIM;Lo;0;R;;;;;N;;;;; +10E88;YEZIDI LETTER CHHIM;Lo;0;R;;;;;N;;;;; +10E89;YEZIDI LETTER HHA;Lo;0;R;;;;;N;;;;; +10E8A;YEZIDI LETTER XA;Lo;0;R;;;;;N;;;;; +10E8B;YEZIDI LETTER DAL;Lo;0;R;;;;;N;;;;; +10E8C;YEZIDI LETTER ZAL;Lo;0;R;;;;;N;;;;; +10E8D;YEZIDI LETTER RA;Lo;0;R;;;;;N;;;;; +10E8E;YEZIDI LETTER RHA;Lo;0;R;;;;;N;;;;; +10E8F;YEZIDI LETTER ZA;Lo;0;R;;;;;N;;;;; +10E90;YEZIDI LETTER JA;Lo;0;R;;;;;N;;;;; +10E91;YEZIDI LETTER SIN;Lo;0;R;;;;;N;;;;; +10E92;YEZIDI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10E93;YEZIDI LETTER SAD;Lo;0;R;;;;;N;;;;; +10E94;YEZIDI LETTER DAD;Lo;0;R;;;;;N;;;;; +10E95;YEZIDI LETTER TA;Lo;0;R;;;;;N;;;;; +10E96;YEZIDI LETTER ZE;Lo;0;R;;;;;N;;;;; +10E97;YEZIDI LETTER EYN;Lo;0;R;;;;;N;;;;; +10E98;YEZIDI LETTER XHEYN;Lo;0;R;;;;;N;;;;; +10E99;YEZIDI LETTER FA;Lo;0;R;;;;;N;;;;; +10E9A;YEZIDI LETTER VA;Lo;0;R;;;;;N;;;;; +10E9B;YEZIDI LETTER VA ALTERNATE FORM;Lo;0;R;;;;;N;;;;; +10E9C;YEZIDI LETTER QAF;Lo;0;R;;;;;N;;;;; +10E9D;YEZIDI LETTER KAF;Lo;0;R;;;;;N;;;;; +10E9E;YEZIDI LETTER KHAF;Lo;0;R;;;;;N;;;;; +10E9F;YEZIDI LETTER GAF;Lo;0;R;;;;;N;;;;; +10EA0;YEZIDI LETTER LAM;Lo;0;R;;;;;N;;;;; +10EA1;YEZIDI LETTER MIM;Lo;0;R;;;;;N;;;;; +10EA2;YEZIDI LETTER NUN;Lo;0;R;;;;;N;;;;; +10EA3;YEZIDI LETTER UM;Lo;0;R;;;;;N;;;;; +10EA4;YEZIDI LETTER WAW;Lo;0;R;;;;;N;;;;; +10EA5;YEZIDI LETTER OW;Lo;0;R;;;;;N;;;;; +10EA6;YEZIDI LETTER EW;Lo;0;R;;;;;N;;;;; +10EA7;YEZIDI LETTER HAY;Lo;0;R;;;;;N;;;;; +10EA8;YEZIDI LETTER YOT;Lo;0;R;;;;;N;;;;; +10EA9;YEZIDI LETTER ET;Lo;0;R;;;;;N;;;;; +10EAB;YEZIDI COMBINING HAMZA MARK;Mn;230;NSM;;;;;N;;;;; +10EAC;YEZIDI COMBINING MADDA MARK;Mn;230;NSM;;;;;N;;;;; +10EAD;YEZIDI HYPHENATION MARK;Pd;0;R;;;;;N;;;;; +10EB0;YEZIDI LETTER LAM WITH DOT ABOVE;Lo;0;R;;;;;N;;;;; +10EB1;YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE;Lo;0;R;;;;;N;;;;; +10EFD;ARABIC SMALL LOW WORD SAKTA;Mn;220;NSM;;;;;N;;;;; +10EFE;ARABIC SMALL LOW WORD QASR;Mn;220;NSM;;;;;N;;;;; +10EFF;ARABIC SMALL LOW WORD MADDA;Mn;220;NSM;;;;;N;;;;; +10F00;OLD SOGDIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F01;OLD SOGDIAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10F02;OLD SOGDIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10F03;OLD SOGDIAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10F04;OLD SOGDIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10F05;OLD SOGDIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10F06;OLD SOGDIAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10F07;OLD SOGDIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10F08;OLD SOGDIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F09;OLD SOGDIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10F0A;OLD SOGDIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10F0B;OLD SOGDIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F0C;OLD SOGDIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F0D;OLD SOGDIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10F0E;OLD SOGDIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10F0F;OLD SOGDIAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10F10;OLD SOGDIAN LETTER FINAL NUN WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F11;OLD SOGDIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F12;OLD SOGDIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10F13;OLD SOGDIAN LETTER ALTERNATE AYIN;Lo;0;R;;;;;N;;;;; +10F14;OLD SOGDIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10F15;OLD SOGDIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F16;OLD SOGDIAN LETTER FINAL SADHE;Lo;0;R;;;;;N;;;;; +10F17;OLD SOGDIAN LETTER FINAL SADHE WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F18;OLD SOGDIAN LETTER RESH-AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F19;OLD SOGDIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F1A;OLD SOGDIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10F1B;OLD SOGDIAN LETTER FINAL TAW;Lo;0;R;;;;;N;;;;; +10F1C;OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL;Lo;0;R;;;;;N;;;;; +10F1D;OLD SOGDIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10F1E;OLD SOGDIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10F1F;OLD SOGDIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10F20;OLD SOGDIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10F21;OLD SOGDIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10F22;OLD SOGDIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10F23;OLD SOGDIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10F24;OLD SOGDIAN NUMBER THIRTY;No;0;R;;;;30;N;;;;; +10F25;OLD SOGDIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10F26;OLD SOGDIAN FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; +10F27;OLD SOGDIAN LIGATURE AYIN-DALETH;Lo;0;R;;;;;N;;;;; +10F30;SOGDIAN LETTER ALEPH;Lo;0;AL;;;;;N;;;;; +10F31;SOGDIAN LETTER BETH;Lo;0;AL;;;;;N;;;;; +10F32;SOGDIAN LETTER GIMEL;Lo;0;AL;;;;;N;;;;; +10F33;SOGDIAN LETTER HE;Lo;0;AL;;;;;N;;;;; +10F34;SOGDIAN LETTER WAW;Lo;0;AL;;;;;N;;;;; +10F35;SOGDIAN LETTER ZAYIN;Lo;0;AL;;;;;N;;;;; +10F36;SOGDIAN LETTER HETH;Lo;0;AL;;;;;N;;;;; +10F37;SOGDIAN LETTER YODH;Lo;0;AL;;;;;N;;;;; +10F38;SOGDIAN LETTER KAPH;Lo;0;AL;;;;;N;;;;; +10F39;SOGDIAN LETTER LAMEDH;Lo;0;AL;;;;;N;;;;; +10F3A;SOGDIAN LETTER MEM;Lo;0;AL;;;;;N;;;;; +10F3B;SOGDIAN LETTER NUN;Lo;0;AL;;;;;N;;;;; +10F3C;SOGDIAN LETTER SAMEKH;Lo;0;AL;;;;;N;;;;; +10F3D;SOGDIAN LETTER AYIN;Lo;0;AL;;;;;N;;;;; +10F3E;SOGDIAN LETTER PE;Lo;0;AL;;;;;N;;;;; +10F3F;SOGDIAN LETTER SADHE;Lo;0;AL;;;;;N;;;;; +10F40;SOGDIAN LETTER RESH-AYIN;Lo;0;AL;;;;;N;;;;; +10F41;SOGDIAN LETTER SHIN;Lo;0;AL;;;;;N;;;;; +10F42;SOGDIAN LETTER TAW;Lo;0;AL;;;;;N;;;;; +10F43;SOGDIAN LETTER FETH;Lo;0;AL;;;;;N;;;;; +10F44;SOGDIAN LETTER LESH;Lo;0;AL;;;;;N;;;;; +10F45;SOGDIAN INDEPENDENT SHIN;Lo;0;AL;;;;;N;;;;; +10F46;SOGDIAN COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F47;SOGDIAN COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F48;SOGDIAN COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F49;SOGDIAN COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4A;SOGDIAN COMBINING CURVE ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4B;SOGDIAN COMBINING CURVE BELOW;Mn;220;NSM;;;;;N;;;;; +10F4C;SOGDIAN COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;;;;; +10F4D;SOGDIAN COMBINING HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4E;SOGDIAN COMBINING LONG HOOK BELOW;Mn;220;NSM;;;;;N;;;;; +10F4F;SOGDIAN COMBINING RESH BELOW;Mn;220;NSM;;;;;N;;;;; +10F50;SOGDIAN COMBINING STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +10F51;SOGDIAN NUMBER ONE;No;0;AL;;;;1;N;;;;; +10F52;SOGDIAN NUMBER TEN;No;0;AL;;;;10;N;;;;; +10F53;SOGDIAN NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +10F54;SOGDIAN NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +10F55;SOGDIAN PUNCTUATION TWO VERTICAL BARS;Po;0;AL;;;;;N;;;;; +10F56;SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS;Po;0;AL;;;;;N;;;;; +10F57;SOGDIAN PUNCTUATION CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F58;SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS;Po;0;AL;;;;;N;;;;; +10F59;SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT;Po;0;AL;;;;;N;;;;; +10F70;OLD UYGHUR LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10F71;OLD UYGHUR LETTER BETH;Lo;0;R;;;;;N;;;;; +10F72;OLD UYGHUR LETTER GIMEL-HETH;Lo;0;R;;;;;N;;;;; +10F73;OLD UYGHUR LETTER WAW;Lo;0;R;;;;;N;;;;; +10F74;OLD UYGHUR LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10F75;OLD UYGHUR LETTER FINAL HETH;Lo;0;R;;;;;N;;;;; +10F76;OLD UYGHUR LETTER YODH;Lo;0;R;;;;;N;;;;; +10F77;OLD UYGHUR LETTER KAPH;Lo;0;R;;;;;N;;;;; +10F78;OLD UYGHUR LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10F79;OLD UYGHUR LETTER MEM;Lo;0;R;;;;;N;;;;; +10F7A;OLD UYGHUR LETTER NUN;Lo;0;R;;;;;N;;;;; +10F7B;OLD UYGHUR LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10F7C;OLD UYGHUR LETTER PE;Lo;0;R;;;;;N;;;;; +10F7D;OLD UYGHUR LETTER SADHE;Lo;0;R;;;;;N;;;;; +10F7E;OLD UYGHUR LETTER RESH;Lo;0;R;;;;;N;;;;; +10F7F;OLD UYGHUR LETTER SHIN;Lo;0;R;;;;;N;;;;; +10F80;OLD UYGHUR LETTER TAW;Lo;0;R;;;;;N;;;;; +10F81;OLD UYGHUR LETTER LESH;Lo;0;R;;;;;N;;;;; +10F82;OLD UYGHUR COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +10F83;OLD UYGHUR COMBINING DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10F84;OLD UYGHUR COMBINING TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +10F85;OLD UYGHUR COMBINING TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +10F86;OLD UYGHUR PUNCTUATION BAR;Po;0;R;;;;;N;;;;; +10F87;OLD UYGHUR PUNCTUATION TWO BARS;Po;0;R;;;;;N;;;;; +10F88;OLD UYGHUR PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10F89;OLD UYGHUR PUNCTUATION FOUR DOTS;Po;0;R;;;;;N;;;;; +10FB0;CHORASMIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FB1;CHORASMIAN LETTER SMALL ALEPH;Lo;0;R;;;;;N;;;;; +10FB2;CHORASMIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10FB3;CHORASMIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FB4;CHORASMIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FB5;CHORASMIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10FB6;CHORASMIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10FB7;CHORASMIAN LETTER CURLED WAW;Lo;0;R;;;;;N;;;;; +10FB8;CHORASMIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FB9;CHORASMIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10FBA;CHORASMIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10FBB;CHORASMIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FBC;CHORASMIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FBD;CHORASMIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10FBE;CHORASMIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10FBF;CHORASMIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FC0;CHORASMIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FC1;CHORASMIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10FC2;CHORASMIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10FC3;CHORASMIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FC4;CHORASMIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10FC5;CHORASMIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10FC6;CHORASMIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10FC7;CHORASMIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10FC8;CHORASMIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10FC9;CHORASMIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10FCA;CHORASMIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10FCB;CHORASMIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10FE0;ELYMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10FE1;ELYMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10FE2;ELYMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10FE3;ELYMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10FE4;ELYMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10FE5;ELYMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10FE6;ELYMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10FE7;ELYMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10FE8;ELYMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10FE9;ELYMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +10FEA;ELYMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +10FEB;ELYMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10FEC;ELYMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +10FED;ELYMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +10FEE;ELYMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10FEF;ELYMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10FF0;ELYMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10FF1;ELYMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10FF2;ELYMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10FF3;ELYMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10FF4;ELYMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10FF5;ELYMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10FF6;ELYMAIC LIGATURE ZAYIN-YODH;Lo;0;R;;;;;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11070;BRAHMI SIGN OLD TAMIL VIRAMA;Mn;9;NSM;;;;;N;;;;; +11071;BRAHMI LETTER OLD TAMIL SHORT E;Lo;0;L;;;;;N;;;;; +11072;BRAHMI LETTER OLD TAMIL SHORT O;Lo;0;L;;;;;N;;;;; +11073;BRAHMI VOWEL SIGN OLD TAMIL SHORT E;Mn;0;NSM;;;;;N;;;;; +11074;BRAHMI VOWEL SIGN OLD TAMIL SHORT O;Mn;0;NSM;;;;;N;;;;; +11075;BRAHMI LETTER OLD TAMIL LLA;Lo;0;L;;;;;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110C2;KAITHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +110CD;KAITHI NUMBER SIGN ABOVE;Cf;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11144;CHAKMA LETTER LHAA;Lo;0;L;;;;;N;;;;; +11145;CHAKMA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11146;CHAKMA VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +11147;CHAKMA LETTER VAA;Lo;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Mn;0;NSM;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111CE;SHARADA VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +111CF;SHARADA SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; +1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +1123E;KHOJKI SIGN SUKUN;Mn;0;NSM;;;;;N;;;;; +1123F;KHOJKI LETTER QA;Lo;0;L;;;;;N;;;;; +11240;KHOJKI LETTER SHORT I;Lo;0;L;;;;;N;;;;; +11241;KHOJKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; +11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; +11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133B;COMBINING BINDU BELOW;Mn;7;NSM;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; +11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; +11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; +11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11400;NEWA LETTER A;Lo;0;L;;;;;N;;;;; +11401;NEWA LETTER AA;Lo;0;L;;;;;N;;;;; +11402;NEWA LETTER I;Lo;0;L;;;;;N;;;;; +11403;NEWA LETTER II;Lo;0;L;;;;;N;;;;; +11404;NEWA LETTER U;Lo;0;L;;;;;N;;;;; +11405;NEWA LETTER UU;Lo;0;L;;;;;N;;;;; +11406;NEWA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11407;NEWA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11408;NEWA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11409;NEWA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1140A;NEWA LETTER E;Lo;0;L;;;;;N;;;;; +1140B;NEWA LETTER AI;Lo;0;L;;;;;N;;;;; +1140C;NEWA LETTER O;Lo;0;L;;;;;N;;;;; +1140D;NEWA LETTER AU;Lo;0;L;;;;;N;;;;; +1140E;NEWA LETTER KA;Lo;0;L;;;;;N;;;;; +1140F;NEWA LETTER KHA;Lo;0;L;;;;;N;;;;; +11410;NEWA LETTER GA;Lo;0;L;;;;;N;;;;; +11411;NEWA LETTER GHA;Lo;0;L;;;;;N;;;;; +11412;NEWA LETTER NGA;Lo;0;L;;;;;N;;;;; +11413;NEWA LETTER NGHA;Lo;0;L;;;;;N;;;;; +11414;NEWA LETTER CA;Lo;0;L;;;;;N;;;;; +11415;NEWA LETTER CHA;Lo;0;L;;;;;N;;;;; +11416;NEWA LETTER JA;Lo;0;L;;;;;N;;;;; +11417;NEWA LETTER JHA;Lo;0;L;;;;;N;;;;; +11418;NEWA LETTER NYA;Lo;0;L;;;;;N;;;;; +11419;NEWA LETTER NYHA;Lo;0;L;;;;;N;;;;; +1141A;NEWA LETTER TTA;Lo;0;L;;;;;N;;;;; +1141B;NEWA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1141C;NEWA LETTER DDA;Lo;0;L;;;;;N;;;;; +1141D;NEWA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1141E;NEWA LETTER NNA;Lo;0;L;;;;;N;;;;; +1141F;NEWA LETTER TA;Lo;0;L;;;;;N;;;;; +11420;NEWA LETTER THA;Lo;0;L;;;;;N;;;;; +11421;NEWA LETTER DA;Lo;0;L;;;;;N;;;;; +11422;NEWA LETTER DHA;Lo;0;L;;;;;N;;;;; +11423;NEWA LETTER NA;Lo;0;L;;;;;N;;;;; +11424;NEWA LETTER NHA;Lo;0;L;;;;;N;;;;; +11425;NEWA LETTER PA;Lo;0;L;;;;;N;;;;; +11426;NEWA LETTER PHA;Lo;0;L;;;;;N;;;;; +11427;NEWA LETTER BA;Lo;0;L;;;;;N;;;;; +11428;NEWA LETTER BHA;Lo;0;L;;;;;N;;;;; +11429;NEWA LETTER MA;Lo;0;L;;;;;N;;;;; +1142A;NEWA LETTER MHA;Lo;0;L;;;;;N;;;;; +1142B;NEWA LETTER YA;Lo;0;L;;;;;N;;;;; +1142C;NEWA LETTER RA;Lo;0;L;;;;;N;;;;; +1142D;NEWA LETTER RHA;Lo;0;L;;;;;N;;;;; +1142E;NEWA LETTER LA;Lo;0;L;;;;;N;;;;; +1142F;NEWA LETTER LHA;Lo;0;L;;;;;N;;;;; +11430;NEWA LETTER WA;Lo;0;L;;;;;N;;;;; +11431;NEWA LETTER SHA;Lo;0;L;;;;;N;;;;; +11432;NEWA LETTER SSA;Lo;0;L;;;;;N;;;;; +11433;NEWA LETTER SA;Lo;0;L;;;;;N;;;;; +11434;NEWA LETTER HA;Lo;0;L;;;;;N;;;;; +11435;NEWA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11436;NEWA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11437;NEWA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11438;NEWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11439;NEWA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1143A;NEWA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1143B;NEWA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +1143C;NEWA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1143D;NEWA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +1143E;NEWA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1143F;NEWA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11440;NEWA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11441;NEWA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11442;NEWA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11443;NEWA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11444;NEWA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11445;NEWA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11446;NEWA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11447;NEWA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11448;NEWA SIGN FINAL ANUSVARA;Lo;0;L;;;;;N;;;;; +11449;NEWA OM;Lo;0;L;;;;;N;;;;; +1144A;NEWA SIDDHI;Lo;0;L;;;;;N;;;;; +1144B;NEWA DANDA;Po;0;L;;;;;N;;;;; +1144C;NEWA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1144D;NEWA COMMA;Po;0;L;;;;;N;;;;; +1144E;NEWA GAP FILLER;Po;0;L;;;;;N;;;;; +1144F;NEWA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11450;NEWA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11451;NEWA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11452;NEWA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11453;NEWA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11454;NEWA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11455;NEWA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11456;NEWA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11457;NEWA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11458;NEWA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11459;NEWA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1145A;NEWA DOUBLE COMMA;Po;0;L;;;;;N;;;;; +1145B;NEWA PLACEHOLDER MARK;Po;0;L;;;;;N;;;;; +1145D;NEWA INSERTION SIGN;Po;0;L;;;;;N;;;;; +1145E;NEWA SANDHI MARK;Mn;230;NSM;;;;;N;;;;; +1145F;NEWA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +11460;NEWA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11461;NEWA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11660;MONGOLIAN BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11661;MONGOLIAN ROTATED BIRGA;Po;0;ON;;;;;N;;;;; +11662;MONGOLIAN DOUBLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11663;MONGOLIAN TRIPLE BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11664;MONGOLIAN BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11665;MONGOLIAN ROTATED BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +11666;MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11667;MONGOLIAN INVERTED BIRGA;Po;0;ON;;;;;N;;;;; +11668;MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11669;MONGOLIAN SWIRL BIRGA;Po;0;ON;;;;;N;;;;; +1166A;MONGOLIAN SWIRL BIRGA WITH ORNAMENT;Po;0;ON;;;;;N;;;;; +1166B;MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +1166C;MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT;Po;0;ON;;;;;N;;;;; +11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; +11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; +11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116B8;TAKRI LETTER ARCHAIC KHA;Lo;0;L;;;;;N;;;;; +116B9;TAKRI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171A;AHOM LETTER ALTERNATE BA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; +11740;AHOM LETTER CA;Lo;0;L;;;;;N;;;;; +11741;AHOM LETTER TTA;Lo;0;L;;;;;N;;;;; +11742;AHOM LETTER TTHA;Lo;0;L;;;;;N;;;;; +11743;AHOM LETTER DDA;Lo;0;L;;;;;N;;;;; +11744;AHOM LETTER DDHA;Lo;0;L;;;;;N;;;;; +11745;AHOM LETTER NNA;Lo;0;L;;;;;N;;;;; +11746;AHOM LETTER LLA;Lo;0;L;;;;;N;;;;; +11800;DOGRA LETTER A;Lo;0;L;;;;;N;;;;; +11801;DOGRA LETTER AA;Lo;0;L;;;;;N;;;;; +11802;DOGRA LETTER I;Lo;0;L;;;;;N;;;;; +11803;DOGRA LETTER II;Lo;0;L;;;;;N;;;;; +11804;DOGRA LETTER U;Lo;0;L;;;;;N;;;;; +11805;DOGRA LETTER UU;Lo;0;L;;;;;N;;;;; +11806;DOGRA LETTER E;Lo;0;L;;;;;N;;;;; +11807;DOGRA LETTER AI;Lo;0;L;;;;;N;;;;; +11808;DOGRA LETTER O;Lo;0;L;;;;;N;;;;; +11809;DOGRA LETTER AU;Lo;0;L;;;;;N;;;;; +1180A;DOGRA LETTER KA;Lo;0;L;;;;;N;;;;; +1180B;DOGRA LETTER KHA;Lo;0;L;;;;;N;;;;; +1180C;DOGRA LETTER GA;Lo;0;L;;;;;N;;;;; +1180D;DOGRA LETTER GHA;Lo;0;L;;;;;N;;;;; +1180E;DOGRA LETTER NGA;Lo;0;L;;;;;N;;;;; +1180F;DOGRA LETTER CA;Lo;0;L;;;;;N;;;;; +11810;DOGRA LETTER CHA;Lo;0;L;;;;;N;;;;; +11811;DOGRA LETTER JA;Lo;0;L;;;;;N;;;;; +11812;DOGRA LETTER JHA;Lo;0;L;;;;;N;;;;; +11813;DOGRA LETTER NYA;Lo;0;L;;;;;N;;;;; +11814;DOGRA LETTER TTA;Lo;0;L;;;;;N;;;;; +11815;DOGRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11816;DOGRA LETTER DDA;Lo;0;L;;;;;N;;;;; +11817;DOGRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11818;DOGRA LETTER NNA;Lo;0;L;;;;;N;;;;; +11819;DOGRA LETTER TA;Lo;0;L;;;;;N;;;;; +1181A;DOGRA LETTER THA;Lo;0;L;;;;;N;;;;; +1181B;DOGRA LETTER DA;Lo;0;L;;;;;N;;;;; +1181C;DOGRA LETTER DHA;Lo;0;L;;;;;N;;;;; +1181D;DOGRA LETTER NA;Lo;0;L;;;;;N;;;;; +1181E;DOGRA LETTER PA;Lo;0;L;;;;;N;;;;; +1181F;DOGRA LETTER PHA;Lo;0;L;;;;;N;;;;; +11820;DOGRA LETTER BA;Lo;0;L;;;;;N;;;;; +11821;DOGRA LETTER BHA;Lo;0;L;;;;;N;;;;; +11822;DOGRA LETTER MA;Lo;0;L;;;;;N;;;;; +11823;DOGRA LETTER YA;Lo;0;L;;;;;N;;;;; +11824;DOGRA LETTER RA;Lo;0;L;;;;;N;;;;; +11825;DOGRA LETTER LA;Lo;0;L;;;;;N;;;;; +11826;DOGRA LETTER VA;Lo;0;L;;;;;N;;;;; +11827;DOGRA LETTER SHA;Lo;0;L;;;;;N;;;;; +11828;DOGRA LETTER SSA;Lo;0;L;;;;;N;;;;; +11829;DOGRA LETTER SA;Lo;0;L;;;;;N;;;;; +1182A;DOGRA LETTER HA;Lo;0;L;;;;;N;;;;; +1182B;DOGRA LETTER RRA;Lo;0;L;;;;;N;;;;; +1182C;DOGRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1182D;DOGRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1182E;DOGRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1182F;DOGRA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11830;DOGRA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11831;DOGRA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11832;DOGRA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11833;DOGRA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11834;DOGRA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11835;DOGRA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11836;DOGRA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11837;DOGRA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11838;DOGRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11839;DOGRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1183A;DOGRA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1183B;DOGRA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; +118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11900;DIVES AKURU LETTER A;Lo;0;L;;;;;N;;;;; +11901;DIVES AKURU LETTER AA;Lo;0;L;;;;;N;;;;; +11902;DIVES AKURU LETTER I;Lo;0;L;;;;;N;;;;; +11903;DIVES AKURU LETTER II;Lo;0;L;;;;;N;;;;; +11904;DIVES AKURU LETTER U;Lo;0;L;;;;;N;;;;; +11905;DIVES AKURU LETTER UU;Lo;0;L;;;;;N;;;;; +11906;DIVES AKURU LETTER E;Lo;0;L;;;;;N;;;;; +11909;DIVES AKURU LETTER O;Lo;0;L;;;;;N;;;;; +1190C;DIVES AKURU LETTER KA;Lo;0;L;;;;;N;;;;; +1190D;DIVES AKURU LETTER KHA;Lo;0;L;;;;;N;;;;; +1190E;DIVES AKURU LETTER GA;Lo;0;L;;;;;N;;;;; +1190F;DIVES AKURU LETTER GHA;Lo;0;L;;;;;N;;;;; +11910;DIVES AKURU LETTER NGA;Lo;0;L;;;;;N;;;;; +11911;DIVES AKURU LETTER CA;Lo;0;L;;;;;N;;;;; +11912;DIVES AKURU LETTER CHA;Lo;0;L;;;;;N;;;;; +11913;DIVES AKURU LETTER JA;Lo;0;L;;;;;N;;;;; +11915;DIVES AKURU LETTER NYA;Lo;0;L;;;;;N;;;;; +11916;DIVES AKURU LETTER TTA;Lo;0;L;;;;;N;;;;; +11918;DIVES AKURU LETTER DDA;Lo;0;L;;;;;N;;;;; +11919;DIVES AKURU LETTER DDHA;Lo;0;L;;;;;N;;;;; +1191A;DIVES AKURU LETTER NNA;Lo;0;L;;;;;N;;;;; +1191B;DIVES AKURU LETTER TA;Lo;0;L;;;;;N;;;;; +1191C;DIVES AKURU LETTER THA;Lo;0;L;;;;;N;;;;; +1191D;DIVES AKURU LETTER DA;Lo;0;L;;;;;N;;;;; +1191E;DIVES AKURU LETTER DHA;Lo;0;L;;;;;N;;;;; +1191F;DIVES AKURU LETTER NA;Lo;0;L;;;;;N;;;;; +11920;DIVES AKURU LETTER PA;Lo;0;L;;;;;N;;;;; +11921;DIVES AKURU LETTER PHA;Lo;0;L;;;;;N;;;;; +11922;DIVES AKURU LETTER BA;Lo;0;L;;;;;N;;;;; +11923;DIVES AKURU LETTER BHA;Lo;0;L;;;;;N;;;;; +11924;DIVES AKURU LETTER MA;Lo;0;L;;;;;N;;;;; +11925;DIVES AKURU LETTER YA;Lo;0;L;;;;;N;;;;; +11926;DIVES AKURU LETTER YYA;Lo;0;L;;;;;N;;;;; +11927;DIVES AKURU LETTER RA;Lo;0;L;;;;;N;;;;; +11928;DIVES AKURU LETTER LA;Lo;0;L;;;;;N;;;;; +11929;DIVES AKURU LETTER VA;Lo;0;L;;;;;N;;;;; +1192A;DIVES AKURU LETTER SHA;Lo;0;L;;;;;N;;;;; +1192B;DIVES AKURU LETTER SSA;Lo;0;L;;;;;N;;;;; +1192C;DIVES AKURU LETTER SA;Lo;0;L;;;;;N;;;;; +1192D;DIVES AKURU LETTER HA;Lo;0;L;;;;;N;;;;; +1192E;DIVES AKURU LETTER LLA;Lo;0;L;;;;;N;;;;; +1192F;DIVES AKURU LETTER ZA;Lo;0;L;;;;;N;;;;; +11930;DIVES AKURU VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11931;DIVES AKURU VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11932;DIVES AKURU VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11933;DIVES AKURU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11934;DIVES AKURU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11935;DIVES AKURU VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11937;DIVES AKURU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11938;DIVES AKURU VOWEL SIGN O;Mc;0;L;11935 11930;;;;N;;;;; +1193B;DIVES AKURU SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1193C;DIVES AKURU SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +1193D;DIVES AKURU SIGN HALANTA;Mc;9;L;;;;;N;;;;; +1193E;DIVES AKURU VIRAMA;Mn;9;NSM;;;;;N;;;;; +1193F;DIVES AKURU PREFIXED NASAL SIGN;Lo;0;L;;;;;N;;;;; +11940;DIVES AKURU MEDIAL YA;Mc;0;L;;;;;N;;;;; +11941;DIVES AKURU INITIAL RA;Lo;0;L;;;;;N;;;;; +11942;DIVES AKURU MEDIAL RA;Mc;0;L;;;;;N;;;;; +11943;DIVES AKURU SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11944;DIVES AKURU DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11945;DIVES AKURU GAP FILLER;Po;0;L;;;;;N;;;;; +11946;DIVES AKURU END OF TEXT MARK;Po;0;L;;;;;N;;;;; +11950;DIVES AKURU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11951;DIVES AKURU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11952;DIVES AKURU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11953;DIVES AKURU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11954;DIVES AKURU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11955;DIVES AKURU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11956;DIVES AKURU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11957;DIVES AKURU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11958;DIVES AKURU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11959;DIVES AKURU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +119A0;NANDINAGARI LETTER A;Lo;0;L;;;;;N;;;;; +119A1;NANDINAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +119A2;NANDINAGARI LETTER I;Lo;0;L;;;;;N;;;;; +119A3;NANDINAGARI LETTER II;Lo;0;L;;;;;N;;;;; +119A4;NANDINAGARI LETTER U;Lo;0;L;;;;;N;;;;; +119A5;NANDINAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +119A6;NANDINAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +119A7;NANDINAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +119AA;NANDINAGARI LETTER E;Lo;0;L;;;;;N;;;;; +119AB;NANDINAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +119AC;NANDINAGARI LETTER O;Lo;0;L;;;;;N;;;;; +119AD;NANDINAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +119AE;NANDINAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +119AF;NANDINAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +119B0;NANDINAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +119B1;NANDINAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +119B2;NANDINAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +119B3;NANDINAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +119B4;NANDINAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +119B5;NANDINAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +119B6;NANDINAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +119B7;NANDINAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +119B8;NANDINAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +119B9;NANDINAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +119BA;NANDINAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +119BB;NANDINAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +119BC;NANDINAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +119BD;NANDINAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +119BE;NANDINAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +119BF;NANDINAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +119C0;NANDINAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +119C1;NANDINAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +119C2;NANDINAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +119C3;NANDINAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +119C4;NANDINAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +119C5;NANDINAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +119C6;NANDINAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +119C7;NANDINAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +119C8;NANDINAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +119C9;NANDINAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +119CA;NANDINAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +119CB;NANDINAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +119CC;NANDINAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +119CD;NANDINAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +119CE;NANDINAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +119CF;NANDINAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +119D0;NANDINAGARI LETTER RRA;Lo;0;L;;;;;N;;;;; +119D1;NANDINAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +119D2;NANDINAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +119D3;NANDINAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +119D4;NANDINAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +119D5;NANDINAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +119D6;NANDINAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +119D7;NANDINAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +119DA;NANDINAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +119DB;NANDINAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +119DC;NANDINAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +119DD;NANDINAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +119DE;NANDINAGARI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +119DF;NANDINAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +119E0;NANDINAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +119E1;NANDINAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +119E2;NANDINAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +119E3;NANDINAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +119E4;NANDINAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +11A00;ZANABAZAR SQUARE LETTER A;Lo;0;L;;;;;N;;;;; +11A01;ZANABAZAR SQUARE VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A02;ZANABAZAR SQUARE VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A03;ZANABAZAR SQUARE VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A04;ZANABAZAR SQUARE VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A05;ZANABAZAR SQUARE VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A06;ZANABAZAR SQUARE VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A07;ZANABAZAR SQUARE VOWEL SIGN AI;Mn;0;L;;;;;N;;;;; +11A08;ZANABAZAR SQUARE VOWEL SIGN AU;Mn;0;L;;;;;N;;;;; +11A09;ZANABAZAR SQUARE VOWEL SIGN REVERSED I;Mn;0;NSM;;;;;N;;;;; +11A0A;ZANABAZAR SQUARE VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A0B;ZANABAZAR SQUARE LETTER KA;Lo;0;L;;;;;N;;;;; +11A0C;ZANABAZAR SQUARE LETTER KHA;Lo;0;L;;;;;N;;;;; +11A0D;ZANABAZAR SQUARE LETTER GA;Lo;0;L;;;;;N;;;;; +11A0E;ZANABAZAR SQUARE LETTER GHA;Lo;0;L;;;;;N;;;;; +11A0F;ZANABAZAR SQUARE LETTER NGA;Lo;0;L;;;;;N;;;;; +11A10;ZANABAZAR SQUARE LETTER CA;Lo;0;L;;;;;N;;;;; +11A11;ZANABAZAR SQUARE LETTER CHA;Lo;0;L;;;;;N;;;;; +11A12;ZANABAZAR SQUARE LETTER JA;Lo;0;L;;;;;N;;;;; +11A13;ZANABAZAR SQUARE LETTER NYA;Lo;0;L;;;;;N;;;;; +11A14;ZANABAZAR SQUARE LETTER TTA;Lo;0;L;;;;;N;;;;; +11A15;ZANABAZAR SQUARE LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A16;ZANABAZAR SQUARE LETTER DDA;Lo;0;L;;;;;N;;;;; +11A17;ZANABAZAR SQUARE LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A18;ZANABAZAR SQUARE LETTER NNA;Lo;0;L;;;;;N;;;;; +11A19;ZANABAZAR SQUARE LETTER TA;Lo;0;L;;;;;N;;;;; +11A1A;ZANABAZAR SQUARE LETTER THA;Lo;0;L;;;;;N;;;;; +11A1B;ZANABAZAR SQUARE LETTER DA;Lo;0;L;;;;;N;;;;; +11A1C;ZANABAZAR SQUARE LETTER DHA;Lo;0;L;;;;;N;;;;; +11A1D;ZANABAZAR SQUARE LETTER NA;Lo;0;L;;;;;N;;;;; +11A1E;ZANABAZAR SQUARE LETTER PA;Lo;0;L;;;;;N;;;;; +11A1F;ZANABAZAR SQUARE LETTER PHA;Lo;0;L;;;;;N;;;;; +11A20;ZANABAZAR SQUARE LETTER BA;Lo;0;L;;;;;N;;;;; +11A21;ZANABAZAR SQUARE LETTER BHA;Lo;0;L;;;;;N;;;;; +11A22;ZANABAZAR SQUARE LETTER MA;Lo;0;L;;;;;N;;;;; +11A23;ZANABAZAR SQUARE LETTER TSA;Lo;0;L;;;;;N;;;;; +11A24;ZANABAZAR SQUARE LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A25;ZANABAZAR SQUARE LETTER DZA;Lo;0;L;;;;;N;;;;; +11A26;ZANABAZAR SQUARE LETTER DZHA;Lo;0;L;;;;;N;;;;; +11A27;ZANABAZAR SQUARE LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A28;ZANABAZAR SQUARE LETTER ZA;Lo;0;L;;;;;N;;;;; +11A29;ZANABAZAR SQUARE LETTER -A;Lo;0;L;;;;;N;;;;; +11A2A;ZANABAZAR SQUARE LETTER YA;Lo;0;L;;;;;N;;;;; +11A2B;ZANABAZAR SQUARE LETTER RA;Lo;0;L;;;;;N;;;;; +11A2C;ZANABAZAR SQUARE LETTER LA;Lo;0;L;;;;;N;;;;; +11A2D;ZANABAZAR SQUARE LETTER VA;Lo;0;L;;;;;N;;;;; +11A2E;ZANABAZAR SQUARE LETTER SHA;Lo;0;L;;;;;N;;;;; +11A2F;ZANABAZAR SQUARE LETTER SSA;Lo;0;L;;;;;N;;;;; +11A30;ZANABAZAR SQUARE LETTER SA;Lo;0;L;;;;;N;;;;; +11A31;ZANABAZAR SQUARE LETTER HA;Lo;0;L;;;;;N;;;;; +11A32;ZANABAZAR SQUARE LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A33;ZANABAZAR SQUARE FINAL CONSONANT MARK;Mn;0;NSM;;;;;N;;;;; +11A34;ZANABAZAR SQUARE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11A35;ZANABAZAR SQUARE SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11A36;ZANABAZAR SQUARE SIGN CANDRABINDU WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A37;ZANABAZAR SQUARE SIGN CANDRA WITH ORNAMENT;Mn;0;NSM;;;;;N;;;;; +11A38;ZANABAZAR SQUARE SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A39;ZANABAZAR SQUARE SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A3A;ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A3B;ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA;Mn;0;NSM;;;;;N;;;;; +11A3C;ZANABAZAR SQUARE CLUSTER-FINAL LETTER RA;Mn;0;NSM;;;;;N;;;;; +11A3D;ZANABAZAR SQUARE CLUSTER-FINAL LETTER LA;Mn;0;NSM;;;;;N;;;;; +11A3E;ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA;Mn;0;NSM;;;;;N;;;;; +11A3F;ZANABAZAR SQUARE INITIAL HEAD MARK;Po;0;L;;;;;N;;;;; +11A40;ZANABAZAR SQUARE CLOSING HEAD MARK;Po;0;L;;;;;N;;;;; +11A41;ZANABAZAR SQUARE MARK TSHEG;Po;0;L;;;;;N;;;;; +11A42;ZANABAZAR SQUARE MARK SHAD;Po;0;L;;;;;N;;;;; +11A43;ZANABAZAR SQUARE MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A44;ZANABAZAR SQUARE MARK LONG TSHEG;Po;0;L;;;;;N;;;;; +11A45;ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A46;ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK;Po;0;L;;;;;N;;;;; +11A47;ZANABAZAR SQUARE SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A50;SOYOMBO LETTER A;Lo;0;L;;;;;N;;;;; +11A51;SOYOMBO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11A52;SOYOMBO VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +11A53;SOYOMBO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11A54;SOYOMBO VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11A55;SOYOMBO VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11A56;SOYOMBO VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +11A57;SOYOMBO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11A58;SOYOMBO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11A59;SOYOMBO VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11A5A;SOYOMBO VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11A5B;SOYOMBO VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +11A5C;SOYOMBO LETTER KA;Lo;0;L;;;;;N;;;;; +11A5D;SOYOMBO LETTER KHA;Lo;0;L;;;;;N;;;;; +11A5E;SOYOMBO LETTER GA;Lo;0;L;;;;;N;;;;; +11A5F;SOYOMBO LETTER GHA;Lo;0;L;;;;;N;;;;; +11A60;SOYOMBO LETTER NGA;Lo;0;L;;;;;N;;;;; +11A61;SOYOMBO LETTER CA;Lo;0;L;;;;;N;;;;; +11A62;SOYOMBO LETTER CHA;Lo;0;L;;;;;N;;;;; +11A63;SOYOMBO LETTER JA;Lo;0;L;;;;;N;;;;; +11A64;SOYOMBO LETTER JHA;Lo;0;L;;;;;N;;;;; +11A65;SOYOMBO LETTER NYA;Lo;0;L;;;;;N;;;;; +11A66;SOYOMBO LETTER TTA;Lo;0;L;;;;;N;;;;; +11A67;SOYOMBO LETTER TTHA;Lo;0;L;;;;;N;;;;; +11A68;SOYOMBO LETTER DDA;Lo;0;L;;;;;N;;;;; +11A69;SOYOMBO LETTER DDHA;Lo;0;L;;;;;N;;;;; +11A6A;SOYOMBO LETTER NNA;Lo;0;L;;;;;N;;;;; +11A6B;SOYOMBO LETTER TA;Lo;0;L;;;;;N;;;;; +11A6C;SOYOMBO LETTER THA;Lo;0;L;;;;;N;;;;; +11A6D;SOYOMBO LETTER DA;Lo;0;L;;;;;N;;;;; +11A6E;SOYOMBO LETTER DHA;Lo;0;L;;;;;N;;;;; +11A6F;SOYOMBO LETTER NA;Lo;0;L;;;;;N;;;;; +11A70;SOYOMBO LETTER PA;Lo;0;L;;;;;N;;;;; +11A71;SOYOMBO LETTER PHA;Lo;0;L;;;;;N;;;;; +11A72;SOYOMBO LETTER BA;Lo;0;L;;;;;N;;;;; +11A73;SOYOMBO LETTER BHA;Lo;0;L;;;;;N;;;;; +11A74;SOYOMBO LETTER MA;Lo;0;L;;;;;N;;;;; +11A75;SOYOMBO LETTER TSA;Lo;0;L;;;;;N;;;;; +11A76;SOYOMBO LETTER TSHA;Lo;0;L;;;;;N;;;;; +11A77;SOYOMBO LETTER DZA;Lo;0;L;;;;;N;;;;; +11A78;SOYOMBO LETTER ZHA;Lo;0;L;;;;;N;;;;; +11A79;SOYOMBO LETTER ZA;Lo;0;L;;;;;N;;;;; +11A7A;SOYOMBO LETTER -A;Lo;0;L;;;;;N;;;;; +11A7B;SOYOMBO LETTER YA;Lo;0;L;;;;;N;;;;; +11A7C;SOYOMBO LETTER RA;Lo;0;L;;;;;N;;;;; +11A7D;SOYOMBO LETTER LA;Lo;0;L;;;;;N;;;;; +11A7E;SOYOMBO LETTER VA;Lo;0;L;;;;;N;;;;; +11A7F;SOYOMBO LETTER SHA;Lo;0;L;;;;;N;;;;; +11A80;SOYOMBO LETTER SSA;Lo;0;L;;;;;N;;;;; +11A81;SOYOMBO LETTER SA;Lo;0;L;;;;;N;;;;; +11A82;SOYOMBO LETTER HA;Lo;0;L;;;;;N;;;;; +11A83;SOYOMBO LETTER KSSA;Lo;0;L;;;;;N;;;;; +11A84;SOYOMBO SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11A85;SOYOMBO SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11A86;SOYOMBO CLUSTER-INITIAL LETTER RA;Lo;0;L;;;;;N;;;;; +11A87;SOYOMBO CLUSTER-INITIAL LETTER LA;Lo;0;L;;;;;N;;;;; +11A88;SOYOMBO CLUSTER-INITIAL LETTER SHA;Lo;0;L;;;;;N;;;;; +11A89;SOYOMBO CLUSTER-INITIAL LETTER SA;Lo;0;L;;;;;N;;;;; +11A8A;SOYOMBO FINAL CONSONANT SIGN G;Mn;0;NSM;;;;;N;;;;; +11A8B;SOYOMBO FINAL CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +11A8C;SOYOMBO FINAL CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +11A8D;SOYOMBO FINAL CONSONANT SIGN D;Mn;0;NSM;;;;;N;;;;; +11A8E;SOYOMBO FINAL CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +11A8F;SOYOMBO FINAL CONSONANT SIGN B;Mn;0;NSM;;;;;N;;;;; +11A90;SOYOMBO FINAL CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +11A91;SOYOMBO FINAL CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +11A92;SOYOMBO FINAL CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +11A93;SOYOMBO FINAL CONSONANT SIGN SH;Mn;0;NSM;;;;;N;;;;; +11A94;SOYOMBO FINAL CONSONANT SIGN S;Mn;0;NSM;;;;;N;;;;; +11A95;SOYOMBO FINAL CONSONANT SIGN -A;Mn;0;NSM;;;;;N;;;;; +11A96;SOYOMBO SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11A97;SOYOMBO SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11A98;SOYOMBO GEMINATION MARK;Mn;0;NSM;;;;;N;;;;; +11A99;SOYOMBO SUBJOINER;Mn;9;NSM;;;;;N;;;;; +11A9A;SOYOMBO MARK TSHEG;Po;0;L;;;;;N;;;;; +11A9B;SOYOMBO MARK SHAD;Po;0;L;;;;;N;;;;; +11A9C;SOYOMBO MARK DOUBLE SHAD;Po;0;L;;;;;N;;;;; +11A9D;SOYOMBO MARK PLUTA;Lo;0;L;;;;;N;;;;; +11A9E;SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME;Po;0;L;;;;;N;;;;; +11A9F;SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME;Po;0;L;;;;;N;;;;; +11AA0;SOYOMBO HEAD MARK WITH MOON AND SUN;Po;0;L;;;;;N;;;;; +11AA1;SOYOMBO TERMINAL MARK-1;Po;0;L;;;;;N;;;;; +11AA2;SOYOMBO TERMINAL MARK-2;Po;0;L;;;;;N;;;;; +11AB0;CANADIAN SYLLABICS NATTILIK HI;Lo;0;L;;;;;N;;;;; +11AB1;CANADIAN SYLLABICS NATTILIK HII;Lo;0;L;;;;;N;;;;; +11AB2;CANADIAN SYLLABICS NATTILIK HO;Lo;0;L;;;;;N;;;;; +11AB3;CANADIAN SYLLABICS NATTILIK HOO;Lo;0;L;;;;;N;;;;; +11AB4;CANADIAN SYLLABICS NATTILIK HA;Lo;0;L;;;;;N;;;;; +11AB5;CANADIAN SYLLABICS NATTILIK HAA;Lo;0;L;;;;;N;;;;; +11AB6;CANADIAN SYLLABICS NATTILIK SHRI;Lo;0;L;;;;;N;;;;; +11AB7;CANADIAN SYLLABICS NATTILIK SHRII;Lo;0;L;;;;;N;;;;; +11AB8;CANADIAN SYLLABICS NATTILIK SHRO;Lo;0;L;;;;;N;;;;; +11AB9;CANADIAN SYLLABICS NATTILIK SHROO;Lo;0;L;;;;;N;;;;; +11ABA;CANADIAN SYLLABICS NATTILIK SHRA;Lo;0;L;;;;;N;;;;; +11ABB;CANADIAN SYLLABICS NATTILIK SHRAA;Lo;0;L;;;;;N;;;;; +11ABC;CANADIAN SYLLABICS SPE;Lo;0;L;;;;;N;;;;; +11ABD;CANADIAN SYLLABICS SPI;Lo;0;L;;;;;N;;;;; +11ABE;CANADIAN SYLLABICS SPO;Lo;0;L;;;;;N;;;;; +11ABF;CANADIAN SYLLABICS SPA;Lo;0;L;;;;;N;;;;; +11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; +11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; +11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11B00;DEVANAGARI HEAD MARK;Po;0;L;;;;;N;;;;; +11B01;DEVANAGARI HEAD MARK WITH HEADSTROKE;Po;0;L;;;;;N;;;;; +11B02;DEVANAGARI SIGN BHALE;Po;0;L;;;;;N;;;;; +11B03;DEVANAGARI SIGN BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B04;DEVANAGARI SIGN EXTENDED BHALE;Po;0;L;;;;;N;;;;; +11B05;DEVANAGARI SIGN EXTENDED BHALE WITH HOOK;Po;0;L;;;;;N;;;;; +11B06;DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B07;DEVANAGARI SIGN WESTERN NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B08;DEVANAGARI SIGN REVERSED NINE-LIKE BHALE;Po;0;L;;;;;N;;;;; +11B09;DEVANAGARI SIGN MINDU;Po;0;L;;;;;N;;;;; +11C00;BHAIKSUKI LETTER A;Lo;0;L;;;;;N;;;;; +11C01;BHAIKSUKI LETTER AA;Lo;0;L;;;;;N;;;;; +11C02;BHAIKSUKI LETTER I;Lo;0;L;;;;;N;;;;; +11C03;BHAIKSUKI LETTER II;Lo;0;L;;;;;N;;;;; +11C04;BHAIKSUKI LETTER U;Lo;0;L;;;;;N;;;;; +11C05;BHAIKSUKI LETTER UU;Lo;0;L;;;;;N;;;;; +11C06;BHAIKSUKI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11C07;BHAIKSUKI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11C08;BHAIKSUKI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11C0A;BHAIKSUKI LETTER E;Lo;0;L;;;;;N;;;;; +11C0B;BHAIKSUKI LETTER AI;Lo;0;L;;;;;N;;;;; +11C0C;BHAIKSUKI LETTER O;Lo;0;L;;;;;N;;;;; +11C0D;BHAIKSUKI LETTER AU;Lo;0;L;;;;;N;;;;; +11C0E;BHAIKSUKI LETTER KA;Lo;0;L;;;;;N;;;;; +11C0F;BHAIKSUKI LETTER KHA;Lo;0;L;;;;;N;;;;; +11C10;BHAIKSUKI LETTER GA;Lo;0;L;;;;;N;;;;; +11C11;BHAIKSUKI LETTER GHA;Lo;0;L;;;;;N;;;;; +11C12;BHAIKSUKI LETTER NGA;Lo;0;L;;;;;N;;;;; +11C13;BHAIKSUKI LETTER CA;Lo;0;L;;;;;N;;;;; +11C14;BHAIKSUKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11C15;BHAIKSUKI LETTER JA;Lo;0;L;;;;;N;;;;; +11C16;BHAIKSUKI LETTER JHA;Lo;0;L;;;;;N;;;;; +11C17;BHAIKSUKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11C18;BHAIKSUKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11C19;BHAIKSUKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11C1A;BHAIKSUKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11C1B;BHAIKSUKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11C1C;BHAIKSUKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11C1D;BHAIKSUKI LETTER TA;Lo;0;L;;;;;N;;;;; +11C1E;BHAIKSUKI LETTER THA;Lo;0;L;;;;;N;;;;; +11C1F;BHAIKSUKI LETTER DA;Lo;0;L;;;;;N;;;;; +11C20;BHAIKSUKI LETTER DHA;Lo;0;L;;;;;N;;;;; +11C21;BHAIKSUKI LETTER NA;Lo;0;L;;;;;N;;;;; +11C22;BHAIKSUKI LETTER PA;Lo;0;L;;;;;N;;;;; +11C23;BHAIKSUKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11C24;BHAIKSUKI LETTER BA;Lo;0;L;;;;;N;;;;; +11C25;BHAIKSUKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11C26;BHAIKSUKI LETTER MA;Lo;0;L;;;;;N;;;;; +11C27;BHAIKSUKI LETTER YA;Lo;0;L;;;;;N;;;;; +11C28;BHAIKSUKI LETTER RA;Lo;0;L;;;;;N;;;;; +11C29;BHAIKSUKI LETTER LA;Lo;0;L;;;;;N;;;;; +11C2A;BHAIKSUKI LETTER VA;Lo;0;L;;;;;N;;;;; +11C2B;BHAIKSUKI LETTER SHA;Lo;0;L;;;;;N;;;;; +11C2C;BHAIKSUKI LETTER SSA;Lo;0;L;;;;;N;;;;; +11C2D;BHAIKSUKI LETTER SA;Lo;0;L;;;;;N;;;;; +11C2E;BHAIKSUKI LETTER HA;Lo;0;L;;;;;N;;;;; +11C2F;BHAIKSUKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11C30;BHAIKSUKI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11C31;BHAIKSUKI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11C32;BHAIKSUKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11C33;BHAIKSUKI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11C34;BHAIKSUKI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11C35;BHAIKSUKI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11C36;BHAIKSUKI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11C38;BHAIKSUKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11C39;BHAIKSUKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11C3A;BHAIKSUKI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11C3B;BHAIKSUKI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11C3C;BHAIKSUKI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11C3D;BHAIKSUKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11C3E;BHAIKSUKI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11C3F;BHAIKSUKI SIGN VIRAMA;Mn;9;L;;;;;N;;;;; +11C40;BHAIKSUKI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +11C41;BHAIKSUKI DANDA;Po;0;L;;;;;N;;;;; +11C42;BHAIKSUKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11C43;BHAIKSUKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +11C44;BHAIKSUKI GAP FILLER-1;Po;0;L;;;;;N;;;;; +11C45;BHAIKSUKI GAP FILLER-2;Po;0;L;;;;;N;;;;; +11C50;BHAIKSUKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11C51;BHAIKSUKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11C52;BHAIKSUKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11C53;BHAIKSUKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11C54;BHAIKSUKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11C55;BHAIKSUKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11C56;BHAIKSUKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11C57;BHAIKSUKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11C58;BHAIKSUKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11C59;BHAIKSUKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11C5A;BHAIKSUKI NUMBER ONE;No;0;L;;;;1;N;;;;; +11C5B;BHAIKSUKI NUMBER TWO;No;0;L;;;;2;N;;;;; +11C5C;BHAIKSUKI NUMBER THREE;No;0;L;;;;3;N;;;;; +11C5D;BHAIKSUKI NUMBER FOUR;No;0;L;;;;4;N;;;;; +11C5E;BHAIKSUKI NUMBER FIVE;No;0;L;;;;5;N;;;;; +11C5F;BHAIKSUKI NUMBER SIX;No;0;L;;;;6;N;;;;; +11C60;BHAIKSUKI NUMBER SEVEN;No;0;L;;;;7;N;;;;; +11C61;BHAIKSUKI NUMBER EIGHT;No;0;L;;;;8;N;;;;; +11C62;BHAIKSUKI NUMBER NINE;No;0;L;;;;9;N;;;;; +11C63;BHAIKSUKI NUMBER TEN;No;0;L;;;;10;N;;;;; +11C64;BHAIKSUKI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +11C65;BHAIKSUKI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +11C66;BHAIKSUKI NUMBER FORTY;No;0;L;;;;40;N;;;;; +11C67;BHAIKSUKI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +11C68;BHAIKSUKI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +11C69;BHAIKSUKI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +11C6A;BHAIKSUKI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +11C6B;BHAIKSUKI NUMBER NINETY;No;0;L;;;;90;N;;;;; +11C6C;BHAIKSUKI HUNDREDS UNIT MARK;No;0;L;;;;100;N;;;;; +11C70;MARCHEN HEAD MARK;Po;0;L;;;;;N;;;;; +11C71;MARCHEN MARK SHAD;Po;0;L;;;;;N;;;;; +11C72;MARCHEN LETTER KA;Lo;0;L;;;;;N;;;;; +11C73;MARCHEN LETTER KHA;Lo;0;L;;;;;N;;;;; +11C74;MARCHEN LETTER GA;Lo;0;L;;;;;N;;;;; +11C75;MARCHEN LETTER NGA;Lo;0;L;;;;;N;;;;; +11C76;MARCHEN LETTER CA;Lo;0;L;;;;;N;;;;; +11C77;MARCHEN LETTER CHA;Lo;0;L;;;;;N;;;;; +11C78;MARCHEN LETTER JA;Lo;0;L;;;;;N;;;;; +11C79;MARCHEN LETTER NYA;Lo;0;L;;;;;N;;;;; +11C7A;MARCHEN LETTER TA;Lo;0;L;;;;;N;;;;; +11C7B;MARCHEN LETTER THA;Lo;0;L;;;;;N;;;;; +11C7C;MARCHEN LETTER DA;Lo;0;L;;;;;N;;;;; +11C7D;MARCHEN LETTER NA;Lo;0;L;;;;;N;;;;; +11C7E;MARCHEN LETTER PA;Lo;0;L;;;;;N;;;;; +11C7F;MARCHEN LETTER PHA;Lo;0;L;;;;;N;;;;; +11C80;MARCHEN LETTER BA;Lo;0;L;;;;;N;;;;; +11C81;MARCHEN LETTER MA;Lo;0;L;;;;;N;;;;; +11C82;MARCHEN LETTER TSA;Lo;0;L;;;;;N;;;;; +11C83;MARCHEN LETTER TSHA;Lo;0;L;;;;;N;;;;; +11C84;MARCHEN LETTER DZA;Lo;0;L;;;;;N;;;;; +11C85;MARCHEN LETTER WA;Lo;0;L;;;;;N;;;;; +11C86;MARCHEN LETTER ZHA;Lo;0;L;;;;;N;;;;; +11C87;MARCHEN LETTER ZA;Lo;0;L;;;;;N;;;;; +11C88;MARCHEN LETTER -A;Lo;0;L;;;;;N;;;;; +11C89;MARCHEN LETTER YA;Lo;0;L;;;;;N;;;;; +11C8A;MARCHEN LETTER RA;Lo;0;L;;;;;N;;;;; +11C8B;MARCHEN LETTER LA;Lo;0;L;;;;;N;;;;; +11C8C;MARCHEN LETTER SHA;Lo;0;L;;;;;N;;;;; +11C8D;MARCHEN LETTER SA;Lo;0;L;;;;;N;;;;; +11C8E;MARCHEN LETTER HA;Lo;0;L;;;;;N;;;;; +11C8F;MARCHEN LETTER A;Lo;0;L;;;;;N;;;;; +11C92;MARCHEN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +11C93;MARCHEN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +11C94;MARCHEN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +11C95;MARCHEN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +11C96;MARCHEN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +11C97;MARCHEN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +11C98;MARCHEN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +11C99;MARCHEN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +11C9A;MARCHEN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +11C9B;MARCHEN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +11C9C;MARCHEN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +11C9D;MARCHEN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +11C9E;MARCHEN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +11C9F;MARCHEN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +11CA0;MARCHEN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +11CA1;MARCHEN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +11CA2;MARCHEN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +11CA3;MARCHEN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +11CA4;MARCHEN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +11CA5;MARCHEN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +11CA6;MARCHEN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +11CA7;MARCHEN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +11CA9;MARCHEN SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +11CAA;MARCHEN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +11CAB;MARCHEN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +11CAC;MARCHEN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +11CAD;MARCHEN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +11CAE;MARCHEN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +11CAF;MARCHEN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +11CB0;MARCHEN VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11CB1;MARCHEN VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11CB2;MARCHEN VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11CB3;MARCHEN VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11CB4;MARCHEN VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11CB5;MARCHEN SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11CB6;MARCHEN SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11D00;MASARAM GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D01;MASARAM GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D02;MASARAM GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D03;MASARAM GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D04;MASARAM GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D05;MASARAM GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D06;MASARAM GONDI LETTER E;Lo;0;L;;;;;N;;;;; +11D08;MASARAM GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D09;MASARAM GONDI LETTER O;Lo;0;L;;;;;N;;;;; +11D0B;MASARAM GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D0C;MASARAM GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D0D;MASARAM GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D0E;MASARAM GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D0F;MASARAM GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D10;MASARAM GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D11;MASARAM GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D12;MASARAM GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D13;MASARAM GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D14;MASARAM GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D15;MASARAM GONDI LETTER NYA;Lo;0;L;;;;;N;;;;; +11D16;MASARAM GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D17;MASARAM GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D18;MASARAM GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D19;MASARAM GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D1A;MASARAM GONDI LETTER NNA;Lo;0;L;;;;;N;;;;; +11D1B;MASARAM GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D1C;MASARAM GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D1D;MASARAM GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D1E;MASARAM GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D1F;MASARAM GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D20;MASARAM GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D21;MASARAM GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D22;MASARAM GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D23;MASARAM GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D24;MASARAM GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D25;MASARAM GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D26;MASARAM GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D27;MASARAM GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D28;MASARAM GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D29;MASARAM GONDI LETTER SHA;Lo;0;L;;;;;N;;;;; +11D2A;MASARAM GONDI LETTER SSA;Lo;0;L;;;;;N;;;;; +11D2B;MASARAM GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D2C;MASARAM GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D2D;MASARAM GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D2E;MASARAM GONDI LETTER KSSA;Lo;0;L;;;;;N;;;;; +11D2F;MASARAM GONDI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11D30;MASARAM GONDI LETTER TRA;Lo;0;L;;;;;N;;;;; +11D31;MASARAM GONDI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11D32;MASARAM GONDI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11D33;MASARAM GONDI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11D34;MASARAM GONDI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11D35;MASARAM GONDI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11D36;MASARAM GONDI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11D3A;MASARAM GONDI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11D3C;MASARAM GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D3D;MASARAM GONDI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11D3F;MASARAM GONDI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11D40;MASARAM GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D41;MASARAM GONDI SIGN VISARGA;Mn;0;NSM;;;;;N;;;;; +11D42;MASARAM GONDI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11D43;MASARAM GONDI SIGN CANDRA;Mn;0;NSM;;;;;N;;;;; +11D44;MASARAM GONDI SIGN HALANTA;Mn;9;NSM;;;;;N;;;;; +11D45;MASARAM GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D46;MASARAM GONDI REPHA;Lo;0;L;;;;;N;;;;; +11D47;MASARAM GONDI RA-KARA;Mn;0;NSM;;;;;N;;;;; +11D50;MASARAM GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11D51;MASARAM GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11D52;MASARAM GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11D53;MASARAM GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11D54;MASARAM GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11D55;MASARAM GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11D56;MASARAM GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11D57;MASARAM GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11D58;MASARAM GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11D59;MASARAM GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11D60;GUNJALA GONDI LETTER A;Lo;0;L;;;;;N;;;;; +11D61;GUNJALA GONDI LETTER AA;Lo;0;L;;;;;N;;;;; +11D62;GUNJALA GONDI LETTER I;Lo;0;L;;;;;N;;;;; +11D63;GUNJALA GONDI LETTER II;Lo;0;L;;;;;N;;;;; +11D64;GUNJALA GONDI LETTER U;Lo;0;L;;;;;N;;;;; +11D65;GUNJALA GONDI LETTER UU;Lo;0;L;;;;;N;;;;; +11D67;GUNJALA GONDI LETTER EE;Lo;0;L;;;;;N;;;;; +11D68;GUNJALA GONDI LETTER AI;Lo;0;L;;;;;N;;;;; +11D6A;GUNJALA GONDI LETTER OO;Lo;0;L;;;;;N;;;;; +11D6B;GUNJALA GONDI LETTER AU;Lo;0;L;;;;;N;;;;; +11D6C;GUNJALA GONDI LETTER YA;Lo;0;L;;;;;N;;;;; +11D6D;GUNJALA GONDI LETTER VA;Lo;0;L;;;;;N;;;;; +11D6E;GUNJALA GONDI LETTER BA;Lo;0;L;;;;;N;;;;; +11D6F;GUNJALA GONDI LETTER BHA;Lo;0;L;;;;;N;;;;; +11D70;GUNJALA GONDI LETTER MA;Lo;0;L;;;;;N;;;;; +11D71;GUNJALA GONDI LETTER KA;Lo;0;L;;;;;N;;;;; +11D72;GUNJALA GONDI LETTER KHA;Lo;0;L;;;;;N;;;;; +11D73;GUNJALA GONDI LETTER TA;Lo;0;L;;;;;N;;;;; +11D74;GUNJALA GONDI LETTER THA;Lo;0;L;;;;;N;;;;; +11D75;GUNJALA GONDI LETTER LA;Lo;0;L;;;;;N;;;;; +11D76;GUNJALA GONDI LETTER GA;Lo;0;L;;;;;N;;;;; +11D77;GUNJALA GONDI LETTER GHA;Lo;0;L;;;;;N;;;;; +11D78;GUNJALA GONDI LETTER DA;Lo;0;L;;;;;N;;;;; +11D79;GUNJALA GONDI LETTER DHA;Lo;0;L;;;;;N;;;;; +11D7A;GUNJALA GONDI LETTER NA;Lo;0;L;;;;;N;;;;; +11D7B;GUNJALA GONDI LETTER CA;Lo;0;L;;;;;N;;;;; +11D7C;GUNJALA GONDI LETTER CHA;Lo;0;L;;;;;N;;;;; +11D7D;GUNJALA GONDI LETTER TTA;Lo;0;L;;;;;N;;;;; +11D7E;GUNJALA GONDI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11D7F;GUNJALA GONDI LETTER LLA;Lo;0;L;;;;;N;;;;; +11D80;GUNJALA GONDI LETTER JA;Lo;0;L;;;;;N;;;;; +11D81;GUNJALA GONDI LETTER JHA;Lo;0;L;;;;;N;;;;; +11D82;GUNJALA GONDI LETTER DDA;Lo;0;L;;;;;N;;;;; +11D83;GUNJALA GONDI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11D84;GUNJALA GONDI LETTER NGA;Lo;0;L;;;;;N;;;;; +11D85;GUNJALA GONDI LETTER PA;Lo;0;L;;;;;N;;;;; +11D86;GUNJALA GONDI LETTER PHA;Lo;0;L;;;;;N;;;;; +11D87;GUNJALA GONDI LETTER HA;Lo;0;L;;;;;N;;;;; +11D88;GUNJALA GONDI LETTER RA;Lo;0;L;;;;;N;;;;; +11D89;GUNJALA GONDI LETTER SA;Lo;0;L;;;;;N;;;;; +11D8A;GUNJALA GONDI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11D8B;GUNJALA GONDI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11D8C;GUNJALA GONDI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11D8D;GUNJALA GONDI VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11D8E;GUNJALA GONDI VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11D90;GUNJALA GONDI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +11D91;GUNJALA GONDI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11D93;GUNJALA GONDI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +11D94;GUNJALA GONDI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11D95;GUNJALA GONDI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11D96;GUNJALA GONDI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11D97;GUNJALA GONDI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11D98;GUNJALA GONDI OM;Lo;0;L;;;;;N;;;;; +11DA0;GUNJALA GONDI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11DA1;GUNJALA GONDI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11DA2;GUNJALA GONDI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11DA3;GUNJALA GONDI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11DA4;GUNJALA GONDI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11DA5;GUNJALA GONDI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11DA6;GUNJALA GONDI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11DA7;GUNJALA GONDI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11DA8;GUNJALA GONDI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11DA9;GUNJALA GONDI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11EE0;MAKASAR LETTER KA;Lo;0;L;;;;;N;;;;; +11EE1;MAKASAR LETTER GA;Lo;0;L;;;;;N;;;;; +11EE2;MAKASAR LETTER NGA;Lo;0;L;;;;;N;;;;; +11EE3;MAKASAR LETTER PA;Lo;0;L;;;;;N;;;;; +11EE4;MAKASAR LETTER BA;Lo;0;L;;;;;N;;;;; +11EE5;MAKASAR LETTER MA;Lo;0;L;;;;;N;;;;; +11EE6;MAKASAR LETTER TA;Lo;0;L;;;;;N;;;;; +11EE7;MAKASAR LETTER DA;Lo;0;L;;;;;N;;;;; +11EE8;MAKASAR LETTER NA;Lo;0;L;;;;;N;;;;; +11EE9;MAKASAR LETTER CA;Lo;0;L;;;;;N;;;;; +11EEA;MAKASAR LETTER JA;Lo;0;L;;;;;N;;;;; +11EEB;MAKASAR LETTER NYA;Lo;0;L;;;;;N;;;;; +11EEC;MAKASAR LETTER YA;Lo;0;L;;;;;N;;;;; +11EED;MAKASAR LETTER RA;Lo;0;L;;;;;N;;;;; +11EEE;MAKASAR LETTER LA;Lo;0;L;;;;;N;;;;; +11EEF;MAKASAR LETTER VA;Lo;0;L;;;;;N;;;;; +11EF0;MAKASAR LETTER SA;Lo;0;L;;;;;N;;;;; +11EF1;MAKASAR LETTER A;Lo;0;L;;;;;N;;;;; +11EF2;MAKASAR ANGKA;Lo;0;L;;;;;N;;;;; +11EF3;MAKASAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11EF4;MAKASAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11EF5;MAKASAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11EF6;MAKASAR VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11EF7;MAKASAR PASSIMBANG;Po;0;L;;;;;N;;;;; +11EF8;MAKASAR END OF SECTION;Po;0;L;;;;;N;;;;; +11F00;KAWI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11F01;KAWI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11F02;KAWI SIGN REPHA;Lo;0;L;;;;;N;;;;; +11F03;KAWI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11F04;KAWI LETTER A;Lo;0;L;;;;;N;;;;; +11F05;KAWI LETTER AA;Lo;0;L;;;;;N;;;;; +11F06;KAWI LETTER I;Lo;0;L;;;;;N;;;;; +11F07;KAWI LETTER II;Lo;0;L;;;;;N;;;;; +11F08;KAWI LETTER U;Lo;0;L;;;;;N;;;;; +11F09;KAWI LETTER UU;Lo;0;L;;;;;N;;;;; +11F0A;KAWI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11F0B;KAWI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11F0C;KAWI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11F0D;KAWI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11F0E;KAWI LETTER E;Lo;0;L;;;;;N;;;;; +11F0F;KAWI LETTER AI;Lo;0;L;;;;;N;;;;; +11F10;KAWI LETTER O;Lo;0;L;;;;;N;;;;; +11F12;KAWI LETTER KA;Lo;0;L;;;;;N;;;;; +11F13;KAWI LETTER KHA;Lo;0;L;;;;;N;;;;; +11F14;KAWI LETTER GA;Lo;0;L;;;;;N;;;;; +11F15;KAWI LETTER GHA;Lo;0;L;;;;;N;;;;; +11F16;KAWI LETTER NGA;Lo;0;L;;;;;N;;;;; +11F17;KAWI LETTER CA;Lo;0;L;;;;;N;;;;; +11F18;KAWI LETTER CHA;Lo;0;L;;;;;N;;;;; +11F19;KAWI LETTER JA;Lo;0;L;;;;;N;;;;; +11F1A;KAWI LETTER JHA;Lo;0;L;;;;;N;;;;; +11F1B;KAWI LETTER NYA;Lo;0;L;;;;;N;;;;; +11F1C;KAWI LETTER TTA;Lo;0;L;;;;;N;;;;; +11F1D;KAWI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11F1E;KAWI LETTER DDA;Lo;0;L;;;;;N;;;;; +11F1F;KAWI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11F20;KAWI LETTER NNA;Lo;0;L;;;;;N;;;;; +11F21;KAWI LETTER TA;Lo;0;L;;;;;N;;;;; +11F22;KAWI LETTER THA;Lo;0;L;;;;;N;;;;; +11F23;KAWI LETTER DA;Lo;0;L;;;;;N;;;;; +11F24;KAWI LETTER DHA;Lo;0;L;;;;;N;;;;; +11F25;KAWI LETTER NA;Lo;0;L;;;;;N;;;;; +11F26;KAWI LETTER PA;Lo;0;L;;;;;N;;;;; +11F27;KAWI LETTER PHA;Lo;0;L;;;;;N;;;;; +11F28;KAWI LETTER BA;Lo;0;L;;;;;N;;;;; +11F29;KAWI LETTER BHA;Lo;0;L;;;;;N;;;;; +11F2A;KAWI LETTER MA;Lo;0;L;;;;;N;;;;; +11F2B;KAWI LETTER YA;Lo;0;L;;;;;N;;;;; +11F2C;KAWI LETTER RA;Lo;0;L;;;;;N;;;;; +11F2D;KAWI LETTER LA;Lo;0;L;;;;;N;;;;; +11F2E;KAWI LETTER WA;Lo;0;L;;;;;N;;;;; +11F2F;KAWI LETTER SHA;Lo;0;L;;;;;N;;;;; +11F30;KAWI LETTER SSA;Lo;0;L;;;;;N;;;;; +11F31;KAWI LETTER SA;Lo;0;L;;;;;N;;;;; +11F32;KAWI LETTER HA;Lo;0;L;;;;;N;;;;; +11F33;KAWI LETTER JNYA;Lo;0;L;;;;;N;;;;; +11F34;KAWI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11F35;KAWI VOWEL SIGN ALTERNATE AA;Mc;0;L;;;;;N;;;;; +11F36;KAWI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11F37;KAWI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11F38;KAWI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11F39;KAWI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11F3A;KAWI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11F3E;KAWI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11F3F;KAWI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +11F40;KAWI VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +11F41;KAWI SIGN KILLER;Mc;9;L;;;;;N;;;;; +11F42;KAWI CONJOINER;Mn;9;NSM;;;;;N;;;;; +11F43;KAWI DANDA;Po;0;L;;;;;N;;;;; +11F44;KAWI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11F45;KAWI PUNCTUATION SECTION MARKER;Po;0;L;;;;;N;;;;; +11F46;KAWI PUNCTUATION ALTERNATE SECTION MARKER;Po;0;L;;;;;N;;;;; +11F47;KAWI PUNCTUATION FLOWER;Po;0;L;;;;;N;;;;; +11F48;KAWI PUNCTUATION SPACE FILLER;Po;0;L;;;;;N;;;;; +11F49;KAWI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +11F4A;KAWI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +11F4B;KAWI PUNCTUATION TRIPLE DOT;Po;0;L;;;;;N;;;;; +11F4C;KAWI PUNCTUATION CIRCLE;Po;0;L;;;;;N;;;;; +11F4D;KAWI PUNCTUATION FILLED CIRCLE;Po;0;L;;;;;N;;;;; +11F4E;KAWI PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +11F4F;KAWI PUNCTUATION CLOSING SPIRAL;Po;0;L;;;;;N;;;;; +11F50;KAWI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11F51;KAWI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11F52;KAWI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11F53;KAWI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11F54;KAWI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11F55;KAWI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11F56;KAWI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11F57;KAWI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11F58;KAWI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11F59;KAWI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11FB0;LISU LETTER YHA;Lo;0;L;;;;;N;;;;; +11FC0;TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH;No;0;L;;;;1/320;N;;;;; +11FC1;TAMIL FRACTION ONE ONE-HUNDRED-AND-SIXTIETH;No;0;L;;;;1/160;N;;;;; +11FC2;TAMIL FRACTION ONE EIGHTIETH;No;0;L;;;;1/80;N;;;;; +11FC3;TAMIL FRACTION ONE SIXTY-FOURTH;No;0;L;;;;1/64;N;;;;; +11FC4;TAMIL FRACTION ONE FORTIETH;No;0;L;;;;1/40;N;;;;; +11FC5;TAMIL FRACTION ONE THIRTY-SECOND;No;0;L;;;;1/32;N;;;;; +11FC6;TAMIL FRACTION THREE EIGHTIETHS;No;0;L;;;;3/80;N;;;;; +11FC7;TAMIL FRACTION THREE SIXTY-FOURTHS;No;0;L;;;;3/64;N;;;;; +11FC8;TAMIL FRACTION ONE TWENTIETH;No;0;L;;;;1/20;N;;;;; +11FC9;TAMIL FRACTION ONE SIXTEENTH-1;No;0;L;;;;1/16;N;;;;; +11FCA;TAMIL FRACTION ONE SIXTEENTH-2;No;0;L;;;;1/16;N;;;;; +11FCB;TAMIL FRACTION ONE TENTH;No;0;L;;;;1/10;N;;;;; +11FCC;TAMIL FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +11FCD;TAMIL FRACTION THREE TWENTIETHS;No;0;L;;;;3/20;N;;;;; +11FCE;TAMIL FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +11FCF;TAMIL FRACTION ONE FIFTH;No;0;L;;;;1/5;N;;;;; +11FD0;TAMIL FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +11FD1;TAMIL FRACTION ONE HALF-1;No;0;L;;;;1/2;N;;;;; +11FD2;TAMIL FRACTION ONE HALF-2;No;0;L;;;;1/2;N;;;;; +11FD3;TAMIL FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +11FD4;TAMIL FRACTION DOWNSCALING FACTOR KIIZH;No;0;L;;;;1/320;N;;;;; +11FD5;TAMIL SIGN NEL;So;0;ON;;;;;N;;;;; +11FD6;TAMIL SIGN CEVITU;So;0;ON;;;;;N;;;;; +11FD7;TAMIL SIGN AAZHAAKKU;So;0;ON;;;;;N;;;;; +11FD8;TAMIL SIGN UZHAKKU;So;0;ON;;;;;N;;;;; +11FD9;TAMIL SIGN MUUVUZHAKKU;So;0;ON;;;;;N;;;;; +11FDA;TAMIL SIGN KURUNI;So;0;ON;;;;;N;;;;; +11FDB;TAMIL SIGN PATHAKKU;So;0;ON;;;;;N;;;;; +11FDC;TAMIL SIGN MUKKURUNI;So;0;ON;;;;;N;;;;; +11FDD;TAMIL SIGN KAACU;Sc;0;ET;;;;;N;;;;; +11FDE;TAMIL SIGN PANAM;Sc;0;ET;;;;;N;;;;; +11FDF;TAMIL SIGN PON;Sc;0;ET;;;;;N;;;;; +11FE0;TAMIL SIGN VARAAKAN;Sc;0;ET;;;;;N;;;;; +11FE1;TAMIL SIGN PAARAM;So;0;ON;;;;;N;;;;; +11FE2;TAMIL SIGN KUZHI;So;0;ON;;;;;N;;;;; +11FE3;TAMIL SIGN VELI;So;0;ON;;;;;N;;;;; +11FE4;TAMIL WET CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE5;TAMIL DRY CULTIVATION SIGN;So;0;ON;;;;;N;;;;; +11FE6;TAMIL LAND SIGN;So;0;ON;;;;;N;;;;; +11FE7;TAMIL SALT PAN SIGN;So;0;ON;;;;;N;;;;; +11FE8;TAMIL TRADITIONAL CREDIT SIGN;So;0;ON;;;;;N;;;;; +11FE9;TAMIL TRADITIONAL NUMBER SIGN;So;0;ON;;;;;N;;;;; +11FEA;TAMIL CURRENT SIGN;So;0;ON;;;;;N;;;;; +11FEB;TAMIL AND ODD SIGN;So;0;ON;;;;;N;;;;; +11FEC;TAMIL SPENT SIGN;So;0;ON;;;;;N;;;;; +11FED;TAMIL TOTAL SIGN;So;0;ON;;;;;N;;;;; +11FEE;TAMIL IN POSSESSION SIGN;So;0;ON;;;;;N;;;;; +11FEF;TAMIL STARTING FROM SIGN;So;0;ON;;;;;N;;;;; +11FF0;TAMIL SIGN MUTHALIYA;So;0;ON;;;;;N;;;;; +11FF1;TAMIL SIGN VAKAIYARAA;So;0;ON;;;;;N;;;;; +11FFF;TAMIL PUNCTUATION END OF TEXT;Po;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; +12F90;CYPRO-MINOAN SIGN CM001;Lo;0;L;;;;;N;;;;; +12F91;CYPRO-MINOAN SIGN CM002;Lo;0;L;;;;;N;;;;; +12F92;CYPRO-MINOAN SIGN CM004;Lo;0;L;;;;;N;;;;; +12F93;CYPRO-MINOAN SIGN CM005;Lo;0;L;;;;;N;;;;; +12F94;CYPRO-MINOAN SIGN CM006;Lo;0;L;;;;;N;;;;; +12F95;CYPRO-MINOAN SIGN CM007;Lo;0;L;;;;;N;;;;; +12F96;CYPRO-MINOAN SIGN CM008;Lo;0;L;;;;;N;;;;; +12F97;CYPRO-MINOAN SIGN CM009;Lo;0;L;;;;;N;;;;; +12F98;CYPRO-MINOAN SIGN CM010;Lo;0;L;;;;;N;;;;; +12F99;CYPRO-MINOAN SIGN CM011;Lo;0;L;;;;;N;;;;; +12F9A;CYPRO-MINOAN SIGN CM012;Lo;0;L;;;;;N;;;;; +12F9B;CYPRO-MINOAN SIGN CM012B;Lo;0;L;;;;;N;;;;; +12F9C;CYPRO-MINOAN SIGN CM013;Lo;0;L;;;;;N;;;;; +12F9D;CYPRO-MINOAN SIGN CM015;Lo;0;L;;;;;N;;;;; +12F9E;CYPRO-MINOAN SIGN CM017;Lo;0;L;;;;;N;;;;; +12F9F;CYPRO-MINOAN SIGN CM019;Lo;0;L;;;;;N;;;;; +12FA0;CYPRO-MINOAN SIGN CM021;Lo;0;L;;;;;N;;;;; +12FA1;CYPRO-MINOAN SIGN CM023;Lo;0;L;;;;;N;;;;; +12FA2;CYPRO-MINOAN SIGN CM024;Lo;0;L;;;;;N;;;;; +12FA3;CYPRO-MINOAN SIGN CM025;Lo;0;L;;;;;N;;;;; +12FA4;CYPRO-MINOAN SIGN CM026;Lo;0;L;;;;;N;;;;; +12FA5;CYPRO-MINOAN SIGN CM027;Lo;0;L;;;;;N;;;;; +12FA6;CYPRO-MINOAN SIGN CM028;Lo;0;L;;;;;N;;;;; +12FA7;CYPRO-MINOAN SIGN CM029;Lo;0;L;;;;;N;;;;; +12FA8;CYPRO-MINOAN SIGN CM030;Lo;0;L;;;;;N;;;;; +12FA9;CYPRO-MINOAN SIGN CM033;Lo;0;L;;;;;N;;;;; +12FAA;CYPRO-MINOAN SIGN CM034;Lo;0;L;;;;;N;;;;; +12FAB;CYPRO-MINOAN SIGN CM035;Lo;0;L;;;;;N;;;;; +12FAC;CYPRO-MINOAN SIGN CM036;Lo;0;L;;;;;N;;;;; +12FAD;CYPRO-MINOAN SIGN CM037;Lo;0;L;;;;;N;;;;; +12FAE;CYPRO-MINOAN SIGN CM038;Lo;0;L;;;;;N;;;;; +12FAF;CYPRO-MINOAN SIGN CM039;Lo;0;L;;;;;N;;;;; +12FB0;CYPRO-MINOAN SIGN CM040;Lo;0;L;;;;;N;;;;; +12FB1;CYPRO-MINOAN SIGN CM041;Lo;0;L;;;;;N;;;;; +12FB2;CYPRO-MINOAN SIGN CM044;Lo;0;L;;;;;N;;;;; +12FB3;CYPRO-MINOAN SIGN CM046;Lo;0;L;;;;;N;;;;; +12FB4;CYPRO-MINOAN SIGN CM047;Lo;0;L;;;;;N;;;;; +12FB5;CYPRO-MINOAN SIGN CM049;Lo;0;L;;;;;N;;;;; +12FB6;CYPRO-MINOAN SIGN CM050;Lo;0;L;;;;;N;;;;; +12FB7;CYPRO-MINOAN SIGN CM051;Lo;0;L;;;;;N;;;;; +12FB8;CYPRO-MINOAN SIGN CM052;Lo;0;L;;;;;N;;;;; +12FB9;CYPRO-MINOAN SIGN CM053;Lo;0;L;;;;;N;;;;; +12FBA;CYPRO-MINOAN SIGN CM054;Lo;0;L;;;;;N;;;;; +12FBB;CYPRO-MINOAN SIGN CM055;Lo;0;L;;;;;N;;;;; +12FBC;CYPRO-MINOAN SIGN CM056;Lo;0;L;;;;;N;;;;; +12FBD;CYPRO-MINOAN SIGN CM058;Lo;0;L;;;;;N;;;;; +12FBE;CYPRO-MINOAN SIGN CM059;Lo;0;L;;;;;N;;;;; +12FBF;CYPRO-MINOAN SIGN CM060;Lo;0;L;;;;;N;;;;; +12FC0;CYPRO-MINOAN SIGN CM061;Lo;0;L;;;;;N;;;;; +12FC1;CYPRO-MINOAN SIGN CM062;Lo;0;L;;;;;N;;;;; +12FC2;CYPRO-MINOAN SIGN CM063;Lo;0;L;;;;;N;;;;; +12FC3;CYPRO-MINOAN SIGN CM064;Lo;0;L;;;;;N;;;;; +12FC4;CYPRO-MINOAN SIGN CM066;Lo;0;L;;;;;N;;;;; +12FC5;CYPRO-MINOAN SIGN CM067;Lo;0;L;;;;;N;;;;; +12FC6;CYPRO-MINOAN SIGN CM068;Lo;0;L;;;;;N;;;;; +12FC7;CYPRO-MINOAN SIGN CM069;Lo;0;L;;;;;N;;;;; +12FC8;CYPRO-MINOAN SIGN CM070;Lo;0;L;;;;;N;;;;; +12FC9;CYPRO-MINOAN SIGN CM071;Lo;0;L;;;;;N;;;;; +12FCA;CYPRO-MINOAN SIGN CM072;Lo;0;L;;;;;N;;;;; +12FCB;CYPRO-MINOAN SIGN CM073;Lo;0;L;;;;;N;;;;; +12FCC;CYPRO-MINOAN SIGN CM074;Lo;0;L;;;;;N;;;;; +12FCD;CYPRO-MINOAN SIGN CM075;Lo;0;L;;;;;N;;;;; +12FCE;CYPRO-MINOAN SIGN CM075B;Lo;0;L;;;;;N;;;;; +12FCF;CYPRO-MINOAN SIGN CM076;Lo;0;L;;;;;N;;;;; +12FD0;CYPRO-MINOAN SIGN CM078;Lo;0;L;;;;;N;;;;; +12FD1;CYPRO-MINOAN SIGN CM079;Lo;0;L;;;;;N;;;;; +12FD2;CYPRO-MINOAN SIGN CM080;Lo;0;L;;;;;N;;;;; +12FD3;CYPRO-MINOAN SIGN CM081;Lo;0;L;;;;;N;;;;; +12FD4;CYPRO-MINOAN SIGN CM082;Lo;0;L;;;;;N;;;;; +12FD5;CYPRO-MINOAN SIGN CM083;Lo;0;L;;;;;N;;;;; +12FD6;CYPRO-MINOAN SIGN CM084;Lo;0;L;;;;;N;;;;; +12FD7;CYPRO-MINOAN SIGN CM085;Lo;0;L;;;;;N;;;;; +12FD8;CYPRO-MINOAN SIGN CM086;Lo;0;L;;;;;N;;;;; +12FD9;CYPRO-MINOAN SIGN CM087;Lo;0;L;;;;;N;;;;; +12FDA;CYPRO-MINOAN SIGN CM088;Lo;0;L;;;;;N;;;;; +12FDB;CYPRO-MINOAN SIGN CM089;Lo;0;L;;;;;N;;;;; +12FDC;CYPRO-MINOAN SIGN CM090;Lo;0;L;;;;;N;;;;; +12FDD;CYPRO-MINOAN SIGN CM091;Lo;0;L;;;;;N;;;;; +12FDE;CYPRO-MINOAN SIGN CM092;Lo;0;L;;;;;N;;;;; +12FDF;CYPRO-MINOAN SIGN CM094;Lo;0;L;;;;;N;;;;; +12FE0;CYPRO-MINOAN SIGN CM095;Lo;0;L;;;;;N;;;;; +12FE1;CYPRO-MINOAN SIGN CM096;Lo;0;L;;;;;N;;;;; +12FE2;CYPRO-MINOAN SIGN CM097;Lo;0;L;;;;;N;;;;; +12FE3;CYPRO-MINOAN SIGN CM098;Lo;0;L;;;;;N;;;;; +12FE4;CYPRO-MINOAN SIGN CM099;Lo;0;L;;;;;N;;;;; +12FE5;CYPRO-MINOAN SIGN CM100;Lo;0;L;;;;;N;;;;; +12FE6;CYPRO-MINOAN SIGN CM101;Lo;0;L;;;;;N;;;;; +12FE7;CYPRO-MINOAN SIGN CM102;Lo;0;L;;;;;N;;;;; +12FE8;CYPRO-MINOAN SIGN CM103;Lo;0;L;;;;;N;;;;; +12FE9;CYPRO-MINOAN SIGN CM104;Lo;0;L;;;;;N;;;;; +12FEA;CYPRO-MINOAN SIGN CM105;Lo;0;L;;;;;N;;;;; +12FEB;CYPRO-MINOAN SIGN CM107;Lo;0;L;;;;;N;;;;; +12FEC;CYPRO-MINOAN SIGN CM108;Lo;0;L;;;;;N;;;;; +12FED;CYPRO-MINOAN SIGN CM109;Lo;0;L;;;;;N;;;;; +12FEE;CYPRO-MINOAN SIGN CM110;Lo;0;L;;;;;N;;;;; +12FEF;CYPRO-MINOAN SIGN CM112;Lo;0;L;;;;;N;;;;; +12FF0;CYPRO-MINOAN SIGN CM114;Lo;0;L;;;;;N;;;;; +12FF1;CYPRO-MINOAN SIGN CM301;Po;0;L;;;;;N;;;;; +12FF2;CYPRO-MINOAN SIGN CM302;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +1342F;EGYPTIAN HIEROGLYPH V011D;Lo;0;L;;;;;N;;;;; +13430;EGYPTIAN HIEROGLYPH VERTICAL JOINER;Cf;0;L;;;;;N;;;;; +13431;EGYPTIAN HIEROGLYPH HORIZONTAL JOINER;Cf;0;L;;;;;N;;;;; +13432;EGYPTIAN HIEROGLYPH INSERT AT TOP START;Cf;0;L;;;;;N;;;;; +13433;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM START;Cf;0;L;;;;;N;;;;; +13434;EGYPTIAN HIEROGLYPH INSERT AT TOP END;Cf;0;L;;;;;N;;;;; +13435;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM END;Cf;0;L;;;;;N;;;;; +13436;EGYPTIAN HIEROGLYPH OVERLAY MIDDLE;Cf;0;L;;;;;N;;;;; +13437;EGYPTIAN HIEROGLYPH BEGIN SEGMENT;Cf;0;L;;;;;N;;;;; +13438;EGYPTIAN HIEROGLYPH END SEGMENT;Cf;0;L;;;;;N;;;;; +13439;EGYPTIAN HIEROGLYPH INSERT AT MIDDLE;Cf;0;L;;;;;N;;;;; +1343A;EGYPTIAN HIEROGLYPH INSERT AT TOP;Cf;0;L;;;;;N;;;;; +1343B;EGYPTIAN HIEROGLYPH INSERT AT BOTTOM;Cf;0;L;;;;;N;;;;; +1343C;EGYPTIAN HIEROGLYPH BEGIN ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343D;EGYPTIAN HIEROGLYPH END ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343E;EGYPTIAN HIEROGLYPH BEGIN WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +1343F;EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE;Cf;0;L;;;;;N;;;;; +13440;EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY;Mn;0;NSM;;;;;N;;;;; +13441;EGYPTIAN HIEROGLYPH FULL BLANK;Lo;0;L;;;;;N;;;;; +13442;EGYPTIAN HIEROGLYPH HALF BLANK;Lo;0;L;;;;;N;;;;; +13443;EGYPTIAN HIEROGLYPH LOST SIGN;Lo;0;L;;;;;N;;;;; +13444;EGYPTIAN HIEROGLYPH HALF LOST SIGN;Lo;0;L;;;;;N;;;;; +13445;EGYPTIAN HIEROGLYPH TALL LOST SIGN;Lo;0;L;;;;;N;;;;; +13446;EGYPTIAN HIEROGLYPH WIDE LOST SIGN;Lo;0;L;;;;;N;;;;; +13447;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START;Mn;0;NSM;;;;;N;;;;; +13448;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START;Mn;0;NSM;;;;;N;;;;; +13449;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START;Mn;0;NSM;;;;;N;;;;; +1344A;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP END;Mn;0;NSM;;;;;N;;;;; +1344B;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP;Mn;0;NSM;;;;;N;;;;; +1344C;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM START AND TOP END;Mn;0;NSM;;;;;N;;;;; +1344D;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND TOP;Mn;0;NSM;;;;;N;;;;; +1344E;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM END;Mn;0;NSM;;;;;N;;;;; +1344F;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START AND BOTTOM END;Mn;0;NSM;;;;;N;;;;; +13450;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM;Mn;0;NSM;;;;;N;;;;; +13451;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT START AND BOTTOM;Mn;0;NSM;;;;;N;;;;; +13452;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT END;Mn;0;NSM;;;;;N;;;;; +13453;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP AND END;Mn;0;NSM;;;;;N;;;;; +13454;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT BOTTOM AND END;Mn;0;NSM;;;;;N;;;;; +13455;EGYPTIAN HIEROGLYPH MODIFIER DAMAGED;Mn;0;NSM;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16A70;TANGSA LETTER OZ;Lo;0;L;;;;;N;;;;; +16A71;TANGSA LETTER OC;Lo;0;L;;;;;N;;;;; +16A72;TANGSA LETTER OQ;Lo;0;L;;;;;N;;;;; +16A73;TANGSA LETTER OX;Lo;0;L;;;;;N;;;;; +16A74;TANGSA LETTER AZ;Lo;0;L;;;;;N;;;;; +16A75;TANGSA LETTER AC;Lo;0;L;;;;;N;;;;; +16A76;TANGSA LETTER AQ;Lo;0;L;;;;;N;;;;; +16A77;TANGSA LETTER AX;Lo;0;L;;;;;N;;;;; +16A78;TANGSA LETTER VZ;Lo;0;L;;;;;N;;;;; +16A79;TANGSA LETTER VC;Lo;0;L;;;;;N;;;;; +16A7A;TANGSA LETTER VQ;Lo;0;L;;;;;N;;;;; +16A7B;TANGSA LETTER VX;Lo;0;L;;;;;N;;;;; +16A7C;TANGSA LETTER EZ;Lo;0;L;;;;;N;;;;; +16A7D;TANGSA LETTER EC;Lo;0;L;;;;;N;;;;; +16A7E;TANGSA LETTER EQ;Lo;0;L;;;;;N;;;;; +16A7F;TANGSA LETTER EX;Lo;0;L;;;;;N;;;;; +16A80;TANGSA LETTER IZ;Lo;0;L;;;;;N;;;;; +16A81;TANGSA LETTER IC;Lo;0;L;;;;;N;;;;; +16A82;TANGSA LETTER IQ;Lo;0;L;;;;;N;;;;; +16A83;TANGSA LETTER IX;Lo;0;L;;;;;N;;;;; +16A84;TANGSA LETTER UZ;Lo;0;L;;;;;N;;;;; +16A85;TANGSA LETTER UC;Lo;0;L;;;;;N;;;;; +16A86;TANGSA LETTER UQ;Lo;0;L;;;;;N;;;;; +16A87;TANGSA LETTER UX;Lo;0;L;;;;;N;;;;; +16A88;TANGSA LETTER AWZ;Lo;0;L;;;;;N;;;;; +16A89;TANGSA LETTER AWC;Lo;0;L;;;;;N;;;;; +16A8A;TANGSA LETTER AWQ;Lo;0;L;;;;;N;;;;; +16A8B;TANGSA LETTER AWX;Lo;0;L;;;;;N;;;;; +16A8C;TANGSA LETTER UIZ;Lo;0;L;;;;;N;;;;; +16A8D;TANGSA LETTER UIC;Lo;0;L;;;;;N;;;;; +16A8E;TANGSA LETTER UIQ;Lo;0;L;;;;;N;;;;; +16A8F;TANGSA LETTER UIX;Lo;0;L;;;;;N;;;;; +16A90;TANGSA LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +16A91;TANGSA LETTER LONG UEX;Lo;0;L;;;;;N;;;;; +16A92;TANGSA LETTER SHORT UEZ;Lo;0;L;;;;;N;;;;; +16A93;TANGSA LETTER SHORT AWX;Lo;0;L;;;;;N;;;;; +16A94;TANGSA LETTER UEC;Lo;0;L;;;;;N;;;;; +16A95;TANGSA LETTER UEZ;Lo;0;L;;;;;N;;;;; +16A96;TANGSA LETTER UEQ;Lo;0;L;;;;;N;;;;; +16A97;TANGSA LETTER UEX;Lo;0;L;;;;;N;;;;; +16A98;TANGSA LETTER UIUZ;Lo;0;L;;;;;N;;;;; +16A99;TANGSA LETTER UIUC;Lo;0;L;;;;;N;;;;; +16A9A;TANGSA LETTER UIUQ;Lo;0;L;;;;;N;;;;; +16A9B;TANGSA LETTER UIUX;Lo;0;L;;;;;N;;;;; +16A9C;TANGSA LETTER MZ;Lo;0;L;;;;;N;;;;; +16A9D;TANGSA LETTER MC;Lo;0;L;;;;;N;;;;; +16A9E;TANGSA LETTER MQ;Lo;0;L;;;;;N;;;;; +16A9F;TANGSA LETTER MX;Lo;0;L;;;;;N;;;;; +16AA0;TANGSA LETTER KA;Lo;0;L;;;;;N;;;;; +16AA1;TANGSA LETTER KHA;Lo;0;L;;;;;N;;;;; +16AA2;TANGSA LETTER GA;Lo;0;L;;;;;N;;;;; +16AA3;TANGSA LETTER NGA;Lo;0;L;;;;;N;;;;; +16AA4;TANGSA LETTER SA;Lo;0;L;;;;;N;;;;; +16AA5;TANGSA LETTER YA;Lo;0;L;;;;;N;;;;; +16AA6;TANGSA LETTER WA;Lo;0;L;;;;;N;;;;; +16AA7;TANGSA LETTER PA;Lo;0;L;;;;;N;;;;; +16AA8;TANGSA LETTER NYA;Lo;0;L;;;;;N;;;;; +16AA9;TANGSA LETTER PHA;Lo;0;L;;;;;N;;;;; +16AAA;TANGSA LETTER BA;Lo;0;L;;;;;N;;;;; +16AAB;TANGSA LETTER MA;Lo;0;L;;;;;N;;;;; +16AAC;TANGSA LETTER NA;Lo;0;L;;;;;N;;;;; +16AAD;TANGSA LETTER HA;Lo;0;L;;;;;N;;;;; +16AAE;TANGSA LETTER LA;Lo;0;L;;;;;N;;;;; +16AAF;TANGSA LETTER HTA;Lo;0;L;;;;;N;;;;; +16AB0;TANGSA LETTER TA;Lo;0;L;;;;;N;;;;; +16AB1;TANGSA LETTER DA;Lo;0;L;;;;;N;;;;; +16AB2;TANGSA LETTER RA;Lo;0;L;;;;;N;;;;; +16AB3;TANGSA LETTER NHA;Lo;0;L;;;;;N;;;;; +16AB4;TANGSA LETTER SHA;Lo;0;L;;;;;N;;;;; +16AB5;TANGSA LETTER CA;Lo;0;L;;;;;N;;;;; +16AB6;TANGSA LETTER TSA;Lo;0;L;;;;;N;;;;; +16AB7;TANGSA LETTER GHA;Lo;0;L;;;;;N;;;;; +16AB8;TANGSA LETTER HTTA;Lo;0;L;;;;;N;;;;; +16AB9;TANGSA LETTER THA;Lo;0;L;;;;;N;;;;; +16ABA;TANGSA LETTER XA;Lo;0;L;;;;;N;;;;; +16ABB;TANGSA LETTER FA;Lo;0;L;;;;;N;;;;; +16ABC;TANGSA LETTER DHA;Lo;0;L;;;;;N;;;;; +16ABD;TANGSA LETTER CHA;Lo;0;L;;;;;N;;;;; +16ABE;TANGSA LETTER ZA;Lo;0;L;;;;;N;;;;; +16AC0;TANGSA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16AC1;TANGSA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16AC2;TANGSA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16AC3;TANGSA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16AC4;TANGSA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16AC5;TANGSA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16AC6;TANGSA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16AC7;TANGSA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16AC8;TANGSA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16AC9;TANGSA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16E40;MEDEFAIDRIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;16E60; +16E41;MEDEFAIDRIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;16E61; +16E42;MEDEFAIDRIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;16E62; +16E43;MEDEFAIDRIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;16E63; +16E44;MEDEFAIDRIN CAPITAL LETTER ATIU;Lu;0;L;;;;;N;;;;16E64; +16E45;MEDEFAIDRIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;16E65; +16E46;MEDEFAIDRIN CAPITAL LETTER KP;Lu;0;L;;;;;N;;;;16E66; +16E47;MEDEFAIDRIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;16E67; +16E48;MEDEFAIDRIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;16E68; +16E49;MEDEFAIDRIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;16E69; +16E4A;MEDEFAIDRIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;16E6A; +16E4B;MEDEFAIDRIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;16E6B; +16E4C;MEDEFAIDRIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;16E6C; +16E4D;MEDEFAIDRIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;16E6D; +16E4E;MEDEFAIDRIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;16E6E; +16E4F;MEDEFAIDRIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;16E6F; +16E50;MEDEFAIDRIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;16E70; +16E51;MEDEFAIDRIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;16E71; +16E52;MEDEFAIDRIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;16E72; +16E53;MEDEFAIDRIN CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;16E73; +16E54;MEDEFAIDRIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;16E74; +16E55;MEDEFAIDRIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;16E75; +16E56;MEDEFAIDRIN CAPITAL LETTER HP;Lu;0;L;;;;;N;;;;16E76; +16E57;MEDEFAIDRIN CAPITAL LETTER NY;Lu;0;L;;;;;N;;;;16E77; +16E58;MEDEFAIDRIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;16E78; +16E59;MEDEFAIDRIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;16E79; +16E5A;MEDEFAIDRIN CAPITAL LETTER OE;Lu;0;L;;;;;N;;;;16E7A; +16E5B;MEDEFAIDRIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;16E7B; +16E5C;MEDEFAIDRIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;16E7C; +16E5D;MEDEFAIDRIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;16E7D; +16E5E;MEDEFAIDRIN CAPITAL LETTER AI;Lu;0;L;;;;;N;;;;16E7E; +16E5F;MEDEFAIDRIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;16E7F; +16E60;MEDEFAIDRIN SMALL LETTER M;Ll;0;L;;;;;N;;;16E40;;16E40 +16E61;MEDEFAIDRIN SMALL LETTER S;Ll;0;L;;;;;N;;;16E41;;16E41 +16E62;MEDEFAIDRIN SMALL LETTER V;Ll;0;L;;;;;N;;;16E42;;16E42 +16E63;MEDEFAIDRIN SMALL LETTER W;Ll;0;L;;;;;N;;;16E43;;16E43 +16E64;MEDEFAIDRIN SMALL LETTER ATIU;Ll;0;L;;;;;N;;;16E44;;16E44 +16E65;MEDEFAIDRIN SMALL LETTER Z;Ll;0;L;;;;;N;;;16E45;;16E45 +16E66;MEDEFAIDRIN SMALL LETTER KP;Ll;0;L;;;;;N;;;16E46;;16E46 +16E67;MEDEFAIDRIN SMALL LETTER P;Ll;0;L;;;;;N;;;16E47;;16E47 +16E68;MEDEFAIDRIN SMALL LETTER T;Ll;0;L;;;;;N;;;16E48;;16E48 +16E69;MEDEFAIDRIN SMALL LETTER G;Ll;0;L;;;;;N;;;16E49;;16E49 +16E6A;MEDEFAIDRIN SMALL LETTER F;Ll;0;L;;;;;N;;;16E4A;;16E4A +16E6B;MEDEFAIDRIN SMALL LETTER I;Ll;0;L;;;;;N;;;16E4B;;16E4B +16E6C;MEDEFAIDRIN SMALL LETTER K;Ll;0;L;;;;;N;;;16E4C;;16E4C +16E6D;MEDEFAIDRIN SMALL LETTER A;Ll;0;L;;;;;N;;;16E4D;;16E4D +16E6E;MEDEFAIDRIN SMALL LETTER J;Ll;0;L;;;;;N;;;16E4E;;16E4E +16E6F;MEDEFAIDRIN SMALL LETTER E;Ll;0;L;;;;;N;;;16E4F;;16E4F +16E70;MEDEFAIDRIN SMALL LETTER B;Ll;0;L;;;;;N;;;16E50;;16E50 +16E71;MEDEFAIDRIN SMALL LETTER C;Ll;0;L;;;;;N;;;16E51;;16E51 +16E72;MEDEFAIDRIN SMALL LETTER U;Ll;0;L;;;;;N;;;16E52;;16E52 +16E73;MEDEFAIDRIN SMALL LETTER YU;Ll;0;L;;;;;N;;;16E53;;16E53 +16E74;MEDEFAIDRIN SMALL LETTER L;Ll;0;L;;;;;N;;;16E54;;16E54 +16E75;MEDEFAIDRIN SMALL LETTER Q;Ll;0;L;;;;;N;;;16E55;;16E55 +16E76;MEDEFAIDRIN SMALL LETTER HP;Ll;0;L;;;;;N;;;16E56;;16E56 +16E77;MEDEFAIDRIN SMALL LETTER NY;Ll;0;L;;;;;N;;;16E57;;16E57 +16E78;MEDEFAIDRIN SMALL LETTER X;Ll;0;L;;;;;N;;;16E58;;16E58 +16E79;MEDEFAIDRIN SMALL LETTER D;Ll;0;L;;;;;N;;;16E59;;16E59 +16E7A;MEDEFAIDRIN SMALL LETTER OE;Ll;0;L;;;;;N;;;16E5A;;16E5A +16E7B;MEDEFAIDRIN SMALL LETTER N;Ll;0;L;;;;;N;;;16E5B;;16E5B +16E7C;MEDEFAIDRIN SMALL LETTER R;Ll;0;L;;;;;N;;;16E5C;;16E5C +16E7D;MEDEFAIDRIN SMALL LETTER O;Ll;0;L;;;;;N;;;16E5D;;16E5D +16E7E;MEDEFAIDRIN SMALL LETTER AI;Ll;0;L;;;;;N;;;16E5E;;16E5E +16E7F;MEDEFAIDRIN SMALL LETTER Y;Ll;0;L;;;;;N;;;16E5F;;16E5F +16E80;MEDEFAIDRIN DIGIT ZERO;No;0;L;;;;0;N;;;;; +16E81;MEDEFAIDRIN DIGIT ONE;No;0;L;;;;1;N;;;;; +16E82;MEDEFAIDRIN DIGIT TWO;No;0;L;;;;2;N;;;;; +16E83;MEDEFAIDRIN DIGIT THREE;No;0;L;;;;3;N;;;;; +16E84;MEDEFAIDRIN DIGIT FOUR;No;0;L;;;;4;N;;;;; +16E85;MEDEFAIDRIN DIGIT FIVE;No;0;L;;;;5;N;;;;; +16E86;MEDEFAIDRIN DIGIT SIX;No;0;L;;;;6;N;;;;; +16E87;MEDEFAIDRIN DIGIT SEVEN;No;0;L;;;;7;N;;;;; +16E88;MEDEFAIDRIN DIGIT EIGHT;No;0;L;;;;8;N;;;;; +16E89;MEDEFAIDRIN DIGIT NINE;No;0;L;;;;9;N;;;;; +16E8A;MEDEFAIDRIN NUMBER TEN;No;0;L;;;;10;N;;;;; +16E8B;MEDEFAIDRIN NUMBER ELEVEN;No;0;L;;;;11;N;;;;; +16E8C;MEDEFAIDRIN NUMBER TWELVE;No;0;L;;;;12;N;;;;; +16E8D;MEDEFAIDRIN NUMBER THIRTEEN;No;0;L;;;;13;N;;;;; +16E8E;MEDEFAIDRIN NUMBER FOURTEEN;No;0;L;;;;14;N;;;;; +16E8F;MEDEFAIDRIN NUMBER FIFTEEN;No;0;L;;;;15;N;;;;; +16E90;MEDEFAIDRIN NUMBER SIXTEEN;No;0;L;;;;16;N;;;;; +16E91;MEDEFAIDRIN NUMBER SEVENTEEN;No;0;L;;;;17;N;;;;; +16E92;MEDEFAIDRIN NUMBER EIGHTEEN;No;0;L;;;;18;N;;;;; +16E93;MEDEFAIDRIN NUMBER NINETEEN;No;0;L;;;;19;N;;;;; +16E94;MEDEFAIDRIN DIGIT ONE ALTERNATE FORM;No;0;L;;;;1;N;;;;; +16E95;MEDEFAIDRIN DIGIT TWO ALTERNATE FORM;No;0;L;;;;2;N;;;;; +16E96;MEDEFAIDRIN DIGIT THREE ALTERNATE FORM;No;0;L;;;;3;N;;;;; +16E97;MEDEFAIDRIN COMMA;Po;0;L;;;;;N;;;;; +16E98;MEDEFAIDRIN FULL STOP;Po;0;L;;;;;N;;;;; +16E99;MEDEFAIDRIN SYMBOL AIVA;Po;0;L;;;;;N;;;;; +16E9A;MEDEFAIDRIN EXCLAMATION OH;Po;0;L;;;;;N;;;;; +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F45;MIAO LETTER BRI;Lo;0;L;;;;;N;;;;; +16F46;MIAO LETTER SYI;Lo;0;L;;;;;N;;;;; +16F47;MIAO LETTER DZYI;Lo;0;L;;;;;N;;;;; +16F48;MIAO LETTER TE;Lo;0;L;;;;;N;;;;; +16F49;MIAO LETTER TSE;Lo;0;L;;;;;N;;;;; +16F4A;MIAO LETTER RTE;Lo;0;L;;;;;N;;;;; +16F4F;MIAO SIGN CONSONANT MODIFIER BAR;Mn;0;NSM;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F7F;MIAO VOWEL SIGN UOG;Mc;0;L;;;;;N;;;;; +16F80;MIAO VOWEL SIGN YUI;Mc;0;L;;;;;N;;;;; +16F81;MIAO VOWEL SIGN OG;Mc;0;L;;;;;N;;;;; +16F82;MIAO VOWEL SIGN OER;Mc;0;L;;;;;N;;;;; +16F83;MIAO VOWEL SIGN VW;Mc;0;L;;;;;N;;;;; +16F84;MIAO VOWEL SIGN IG;Mc;0;L;;;;;N;;;;; +16F85;MIAO VOWEL SIGN EA;Mc;0;L;;;;;N;;;;; +16F86;MIAO VOWEL SIGN IONG;Mc;0;L;;;;;N;;;;; +16F87;MIAO VOWEL SIGN UI;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; +16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; +16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; +16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +16FE0;TANGUT ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE1;NUSHU ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE2;OLD CHINESE HOOK MARK;Po;0;ON;;;;;N;;;;; +16FE3;OLD CHINESE ITERATION MARK;Lm;0;L;;;;;N;;;;; +16FE4;KHITAN SMALL SCRIPT FILLER;Mn;0;NSM;;;;;N;;;;; +16FF0;VIETNAMESE ALTERNATE READING MARK CA;Mc;6;L;;;;;N;;;;; +16FF1;VIETNAMESE ALTERNATE READING MARK NHAY;Mc;6;L;;;;;N;;;;; +17000;<Tangut Ideograph, First>;Lo;0;L;;;;;N;;;;; +187F7;<Tangut Ideograph, Last>;Lo;0;L;;;;;N;;;;; +18800;TANGUT COMPONENT-001;Lo;0;L;;;;;N;;;;; +18801;TANGUT COMPONENT-002;Lo;0;L;;;;;N;;;;; +18802;TANGUT COMPONENT-003;Lo;0;L;;;;;N;;;;; +18803;TANGUT COMPONENT-004;Lo;0;L;;;;;N;;;;; +18804;TANGUT COMPONENT-005;Lo;0;L;;;;;N;;;;; +18805;TANGUT COMPONENT-006;Lo;0;L;;;;;N;;;;; +18806;TANGUT COMPONENT-007;Lo;0;L;;;;;N;;;;; +18807;TANGUT COMPONENT-008;Lo;0;L;;;;;N;;;;; +18808;TANGUT COMPONENT-009;Lo;0;L;;;;;N;;;;; +18809;TANGUT COMPONENT-010;Lo;0;L;;;;;N;;;;; +1880A;TANGUT COMPONENT-011;Lo;0;L;;;;;N;;;;; +1880B;TANGUT COMPONENT-012;Lo;0;L;;;;;N;;;;; +1880C;TANGUT COMPONENT-013;Lo;0;L;;;;;N;;;;; +1880D;TANGUT COMPONENT-014;Lo;0;L;;;;;N;;;;; +1880E;TANGUT COMPONENT-015;Lo;0;L;;;;;N;;;;; +1880F;TANGUT COMPONENT-016;Lo;0;L;;;;;N;;;;; +18810;TANGUT COMPONENT-017;Lo;0;L;;;;;N;;;;; +18811;TANGUT COMPONENT-018;Lo;0;L;;;;;N;;;;; +18812;TANGUT COMPONENT-019;Lo;0;L;;;;;N;;;;; +18813;TANGUT COMPONENT-020;Lo;0;L;;;;;N;;;;; +18814;TANGUT COMPONENT-021;Lo;0;L;;;;;N;;;;; +18815;TANGUT COMPONENT-022;Lo;0;L;;;;;N;;;;; +18816;TANGUT COMPONENT-023;Lo;0;L;;;;;N;;;;; +18817;TANGUT COMPONENT-024;Lo;0;L;;;;;N;;;;; +18818;TANGUT COMPONENT-025;Lo;0;L;;;;;N;;;;; +18819;TANGUT COMPONENT-026;Lo;0;L;;;;;N;;;;; +1881A;TANGUT COMPONENT-027;Lo;0;L;;;;;N;;;;; +1881B;TANGUT COMPONENT-028;Lo;0;L;;;;;N;;;;; +1881C;TANGUT COMPONENT-029;Lo;0;L;;;;;N;;;;; +1881D;TANGUT COMPONENT-030;Lo;0;L;;;;;N;;;;; +1881E;TANGUT COMPONENT-031;Lo;0;L;;;;;N;;;;; +1881F;TANGUT COMPONENT-032;Lo;0;L;;;;;N;;;;; +18820;TANGUT COMPONENT-033;Lo;0;L;;;;;N;;;;; +18821;TANGUT COMPONENT-034;Lo;0;L;;;;;N;;;;; +18822;TANGUT COMPONENT-035;Lo;0;L;;;;;N;;;;; +18823;TANGUT COMPONENT-036;Lo;0;L;;;;;N;;;;; +18824;TANGUT COMPONENT-037;Lo;0;L;;;;;N;;;;; +18825;TANGUT COMPONENT-038;Lo;0;L;;;;;N;;;;; +18826;TANGUT COMPONENT-039;Lo;0;L;;;;;N;;;;; +18827;TANGUT COMPONENT-040;Lo;0;L;;;;;N;;;;; +18828;TANGUT COMPONENT-041;Lo;0;L;;;;;N;;;;; +18829;TANGUT COMPONENT-042;Lo;0;L;;;;;N;;;;; +1882A;TANGUT COMPONENT-043;Lo;0;L;;;;;N;;;;; +1882B;TANGUT COMPONENT-044;Lo;0;L;;;;;N;;;;; +1882C;TANGUT COMPONENT-045;Lo;0;L;;;;;N;;;;; +1882D;TANGUT COMPONENT-046;Lo;0;L;;;;;N;;;;; +1882E;TANGUT COMPONENT-047;Lo;0;L;;;;;N;;;;; +1882F;TANGUT COMPONENT-048;Lo;0;L;;;;;N;;;;; +18830;TANGUT COMPONENT-049;Lo;0;L;;;;;N;;;;; +18831;TANGUT COMPONENT-050;Lo;0;L;;;;;N;;;;; +18832;TANGUT COMPONENT-051;Lo;0;L;;;;;N;;;;; +18833;TANGUT COMPONENT-052;Lo;0;L;;;;;N;;;;; +18834;TANGUT COMPONENT-053;Lo;0;L;;;;;N;;;;; +18835;TANGUT COMPONENT-054;Lo;0;L;;;;;N;;;;; +18836;TANGUT COMPONENT-055;Lo;0;L;;;;;N;;;;; +18837;TANGUT COMPONENT-056;Lo;0;L;;;;;N;;;;; +18838;TANGUT COMPONENT-057;Lo;0;L;;;;;N;;;;; +18839;TANGUT COMPONENT-058;Lo;0;L;;;;;N;;;;; +1883A;TANGUT COMPONENT-059;Lo;0;L;;;;;N;;;;; +1883B;TANGUT COMPONENT-060;Lo;0;L;;;;;N;;;;; +1883C;TANGUT COMPONENT-061;Lo;0;L;;;;;N;;;;; +1883D;TANGUT COMPONENT-062;Lo;0;L;;;;;N;;;;; +1883E;TANGUT COMPONENT-063;Lo;0;L;;;;;N;;;;; +1883F;TANGUT COMPONENT-064;Lo;0;L;;;;;N;;;;; +18840;TANGUT COMPONENT-065;Lo;0;L;;;;;N;;;;; +18841;TANGUT COMPONENT-066;Lo;0;L;;;;;N;;;;; +18842;TANGUT COMPONENT-067;Lo;0;L;;;;;N;;;;; +18843;TANGUT COMPONENT-068;Lo;0;L;;;;;N;;;;; +18844;TANGUT COMPONENT-069;Lo;0;L;;;;;N;;;;; +18845;TANGUT COMPONENT-070;Lo;0;L;;;;;N;;;;; +18846;TANGUT COMPONENT-071;Lo;0;L;;;;;N;;;;; +18847;TANGUT COMPONENT-072;Lo;0;L;;;;;N;;;;; +18848;TANGUT COMPONENT-073;Lo;0;L;;;;;N;;;;; +18849;TANGUT COMPONENT-074;Lo;0;L;;;;;N;;;;; +1884A;TANGUT COMPONENT-075;Lo;0;L;;;;;N;;;;; +1884B;TANGUT COMPONENT-076;Lo;0;L;;;;;N;;;;; +1884C;TANGUT COMPONENT-077;Lo;0;L;;;;;N;;;;; +1884D;TANGUT COMPONENT-078;Lo;0;L;;;;;N;;;;; +1884E;TANGUT COMPONENT-079;Lo;0;L;;;;;N;;;;; +1884F;TANGUT COMPONENT-080;Lo;0;L;;;;;N;;;;; +18850;TANGUT COMPONENT-081;Lo;0;L;;;;;N;;;;; +18851;TANGUT COMPONENT-082;Lo;0;L;;;;;N;;;;; +18852;TANGUT COMPONENT-083;Lo;0;L;;;;;N;;;;; +18853;TANGUT COMPONENT-084;Lo;0;L;;;;;N;;;;; +18854;TANGUT COMPONENT-085;Lo;0;L;;;;;N;;;;; +18855;TANGUT COMPONENT-086;Lo;0;L;;;;;N;;;;; +18856;TANGUT COMPONENT-087;Lo;0;L;;;;;N;;;;; +18857;TANGUT COMPONENT-088;Lo;0;L;;;;;N;;;;; +18858;TANGUT COMPONENT-089;Lo;0;L;;;;;N;;;;; +18859;TANGUT COMPONENT-090;Lo;0;L;;;;;N;;;;; +1885A;TANGUT COMPONENT-091;Lo;0;L;;;;;N;;;;; +1885B;TANGUT COMPONENT-092;Lo;0;L;;;;;N;;;;; +1885C;TANGUT COMPONENT-093;Lo;0;L;;;;;N;;;;; +1885D;TANGUT COMPONENT-094;Lo;0;L;;;;;N;;;;; +1885E;TANGUT COMPONENT-095;Lo;0;L;;;;;N;;;;; +1885F;TANGUT COMPONENT-096;Lo;0;L;;;;;N;;;;; +18860;TANGUT COMPONENT-097;Lo;0;L;;;;;N;;;;; +18861;TANGUT COMPONENT-098;Lo;0;L;;;;;N;;;;; +18862;TANGUT COMPONENT-099;Lo;0;L;;;;;N;;;;; +18863;TANGUT COMPONENT-100;Lo;0;L;;;;;N;;;;; +18864;TANGUT COMPONENT-101;Lo;0;L;;;;;N;;;;; +18865;TANGUT COMPONENT-102;Lo;0;L;;;;;N;;;;; +18866;TANGUT COMPONENT-103;Lo;0;L;;;;;N;;;;; +18867;TANGUT COMPONENT-104;Lo;0;L;;;;;N;;;;; +18868;TANGUT COMPONENT-105;Lo;0;L;;;;;N;;;;; +18869;TANGUT COMPONENT-106;Lo;0;L;;;;;N;;;;; +1886A;TANGUT COMPONENT-107;Lo;0;L;;;;;N;;;;; +1886B;TANGUT COMPONENT-108;Lo;0;L;;;;;N;;;;; +1886C;TANGUT COMPONENT-109;Lo;0;L;;;;;N;;;;; +1886D;TANGUT COMPONENT-110;Lo;0;L;;;;;N;;;;; +1886E;TANGUT COMPONENT-111;Lo;0;L;;;;;N;;;;; +1886F;TANGUT COMPONENT-112;Lo;0;L;;;;;N;;;;; +18870;TANGUT COMPONENT-113;Lo;0;L;;;;;N;;;;; +18871;TANGUT COMPONENT-114;Lo;0;L;;;;;N;;;;; +18872;TANGUT COMPONENT-115;Lo;0;L;;;;;N;;;;; +18873;TANGUT COMPONENT-116;Lo;0;L;;;;;N;;;;; +18874;TANGUT COMPONENT-117;Lo;0;L;;;;;N;;;;; +18875;TANGUT COMPONENT-118;Lo;0;L;;;;;N;;;;; +18876;TANGUT COMPONENT-119;Lo;0;L;;;;;N;;;;; +18877;TANGUT COMPONENT-120;Lo;0;L;;;;;N;;;;; +18878;TANGUT COMPONENT-121;Lo;0;L;;;;;N;;;;; +18879;TANGUT COMPONENT-122;Lo;0;L;;;;;N;;;;; +1887A;TANGUT COMPONENT-123;Lo;0;L;;;;;N;;;;; +1887B;TANGUT COMPONENT-124;Lo;0;L;;;;;N;;;;; +1887C;TANGUT COMPONENT-125;Lo;0;L;;;;;N;;;;; +1887D;TANGUT COMPONENT-126;Lo;0;L;;;;;N;;;;; +1887E;TANGUT COMPONENT-127;Lo;0;L;;;;;N;;;;; +1887F;TANGUT COMPONENT-128;Lo;0;L;;;;;N;;;;; +18880;TANGUT COMPONENT-129;Lo;0;L;;;;;N;;;;; +18881;TANGUT COMPONENT-130;Lo;0;L;;;;;N;;;;; +18882;TANGUT COMPONENT-131;Lo;0;L;;;;;N;;;;; +18883;TANGUT COMPONENT-132;Lo;0;L;;;;;N;;;;; +18884;TANGUT COMPONENT-133;Lo;0;L;;;;;N;;;;; +18885;TANGUT COMPONENT-134;Lo;0;L;;;;;N;;;;; +18886;TANGUT COMPONENT-135;Lo;0;L;;;;;N;;;;; +18887;TANGUT COMPONENT-136;Lo;0;L;;;;;N;;;;; +18888;TANGUT COMPONENT-137;Lo;0;L;;;;;N;;;;; +18889;TANGUT COMPONENT-138;Lo;0;L;;;;;N;;;;; +1888A;TANGUT COMPONENT-139;Lo;0;L;;;;;N;;;;; +1888B;TANGUT COMPONENT-140;Lo;0;L;;;;;N;;;;; +1888C;TANGUT COMPONENT-141;Lo;0;L;;;;;N;;;;; +1888D;TANGUT COMPONENT-142;Lo;0;L;;;;;N;;;;; +1888E;TANGUT COMPONENT-143;Lo;0;L;;;;;N;;;;; +1888F;TANGUT COMPONENT-144;Lo;0;L;;;;;N;;;;; +18890;TANGUT COMPONENT-145;Lo;0;L;;;;;N;;;;; +18891;TANGUT COMPONENT-146;Lo;0;L;;;;;N;;;;; +18892;TANGUT COMPONENT-147;Lo;0;L;;;;;N;;;;; +18893;TANGUT COMPONENT-148;Lo;0;L;;;;;N;;;;; +18894;TANGUT COMPONENT-149;Lo;0;L;;;;;N;;;;; +18895;TANGUT COMPONENT-150;Lo;0;L;;;;;N;;;;; +18896;TANGUT COMPONENT-151;Lo;0;L;;;;;N;;;;; +18897;TANGUT COMPONENT-152;Lo;0;L;;;;;N;;;;; +18898;TANGUT COMPONENT-153;Lo;0;L;;;;;N;;;;; +18899;TANGUT COMPONENT-154;Lo;0;L;;;;;N;;;;; +1889A;TANGUT COMPONENT-155;Lo;0;L;;;;;N;;;;; +1889B;TANGUT COMPONENT-156;Lo;0;L;;;;;N;;;;; +1889C;TANGUT COMPONENT-157;Lo;0;L;;;;;N;;;;; +1889D;TANGUT COMPONENT-158;Lo;0;L;;;;;N;;;;; +1889E;TANGUT COMPONENT-159;Lo;0;L;;;;;N;;;;; +1889F;TANGUT COMPONENT-160;Lo;0;L;;;;;N;;;;; +188A0;TANGUT COMPONENT-161;Lo;0;L;;;;;N;;;;; +188A1;TANGUT COMPONENT-162;Lo;0;L;;;;;N;;;;; +188A2;TANGUT COMPONENT-163;Lo;0;L;;;;;N;;;;; +188A3;TANGUT COMPONENT-164;Lo;0;L;;;;;N;;;;; +188A4;TANGUT COMPONENT-165;Lo;0;L;;;;;N;;;;; +188A5;TANGUT COMPONENT-166;Lo;0;L;;;;;N;;;;; +188A6;TANGUT COMPONENT-167;Lo;0;L;;;;;N;;;;; +188A7;TANGUT COMPONENT-168;Lo;0;L;;;;;N;;;;; +188A8;TANGUT COMPONENT-169;Lo;0;L;;;;;N;;;;; +188A9;TANGUT COMPONENT-170;Lo;0;L;;;;;N;;;;; +188AA;TANGUT COMPONENT-171;Lo;0;L;;;;;N;;;;; +188AB;TANGUT COMPONENT-172;Lo;0;L;;;;;N;;;;; +188AC;TANGUT COMPONENT-173;Lo;0;L;;;;;N;;;;; +188AD;TANGUT COMPONENT-174;Lo;0;L;;;;;N;;;;; +188AE;TANGUT COMPONENT-175;Lo;0;L;;;;;N;;;;; +188AF;TANGUT COMPONENT-176;Lo;0;L;;;;;N;;;;; +188B0;TANGUT COMPONENT-177;Lo;0;L;;;;;N;;;;; +188B1;TANGUT COMPONENT-178;Lo;0;L;;;;;N;;;;; +188B2;TANGUT COMPONENT-179;Lo;0;L;;;;;N;;;;; +188B3;TANGUT COMPONENT-180;Lo;0;L;;;;;N;;;;; +188B4;TANGUT COMPONENT-181;Lo;0;L;;;;;N;;;;; +188B5;TANGUT COMPONENT-182;Lo;0;L;;;;;N;;;;; +188B6;TANGUT COMPONENT-183;Lo;0;L;;;;;N;;;;; +188B7;TANGUT COMPONENT-184;Lo;0;L;;;;;N;;;;; +188B8;TANGUT COMPONENT-185;Lo;0;L;;;;;N;;;;; +188B9;TANGUT COMPONENT-186;Lo;0;L;;;;;N;;;;; +188BA;TANGUT COMPONENT-187;Lo;0;L;;;;;N;;;;; +188BB;TANGUT COMPONENT-188;Lo;0;L;;;;;N;;;;; +188BC;TANGUT COMPONENT-189;Lo;0;L;;;;;N;;;;; +188BD;TANGUT COMPONENT-190;Lo;0;L;;;;;N;;;;; +188BE;TANGUT COMPONENT-191;Lo;0;L;;;;;N;;;;; +188BF;TANGUT COMPONENT-192;Lo;0;L;;;;;N;;;;; +188C0;TANGUT COMPONENT-193;Lo;0;L;;;;;N;;;;; +188C1;TANGUT COMPONENT-194;Lo;0;L;;;;;N;;;;; +188C2;TANGUT COMPONENT-195;Lo;0;L;;;;;N;;;;; +188C3;TANGUT COMPONENT-196;Lo;0;L;;;;;N;;;;; +188C4;TANGUT COMPONENT-197;Lo;0;L;;;;;N;;;;; +188C5;TANGUT COMPONENT-198;Lo;0;L;;;;;N;;;;; +188C6;TANGUT COMPONENT-199;Lo;0;L;;;;;N;;;;; +188C7;TANGUT COMPONENT-200;Lo;0;L;;;;;N;;;;; +188C8;TANGUT COMPONENT-201;Lo;0;L;;;;;N;;;;; +188C9;TANGUT COMPONENT-202;Lo;0;L;;;;;N;;;;; +188CA;TANGUT COMPONENT-203;Lo;0;L;;;;;N;;;;; +188CB;TANGUT COMPONENT-204;Lo;0;L;;;;;N;;;;; +188CC;TANGUT COMPONENT-205;Lo;0;L;;;;;N;;;;; +188CD;TANGUT COMPONENT-206;Lo;0;L;;;;;N;;;;; +188CE;TANGUT COMPONENT-207;Lo;0;L;;;;;N;;;;; +188CF;TANGUT COMPONENT-208;Lo;0;L;;;;;N;;;;; +188D0;TANGUT COMPONENT-209;Lo;0;L;;;;;N;;;;; +188D1;TANGUT COMPONENT-210;Lo;0;L;;;;;N;;;;; +188D2;TANGUT COMPONENT-211;Lo;0;L;;;;;N;;;;; +188D3;TANGUT COMPONENT-212;Lo;0;L;;;;;N;;;;; +188D4;TANGUT COMPONENT-213;Lo;0;L;;;;;N;;;;; +188D5;TANGUT COMPONENT-214;Lo;0;L;;;;;N;;;;; +188D6;TANGUT COMPONENT-215;Lo;0;L;;;;;N;;;;; +188D7;TANGUT COMPONENT-216;Lo;0;L;;;;;N;;;;; +188D8;TANGUT COMPONENT-217;Lo;0;L;;;;;N;;;;; +188D9;TANGUT COMPONENT-218;Lo;0;L;;;;;N;;;;; +188DA;TANGUT COMPONENT-219;Lo;0;L;;;;;N;;;;; +188DB;TANGUT COMPONENT-220;Lo;0;L;;;;;N;;;;; +188DC;TANGUT COMPONENT-221;Lo;0;L;;;;;N;;;;; +188DD;TANGUT COMPONENT-222;Lo;0;L;;;;;N;;;;; +188DE;TANGUT COMPONENT-223;Lo;0;L;;;;;N;;;;; +188DF;TANGUT COMPONENT-224;Lo;0;L;;;;;N;;;;; +188E0;TANGUT COMPONENT-225;Lo;0;L;;;;;N;;;;; +188E1;TANGUT COMPONENT-226;Lo;0;L;;;;;N;;;;; +188E2;TANGUT COMPONENT-227;Lo;0;L;;;;;N;;;;; +188E3;TANGUT COMPONENT-228;Lo;0;L;;;;;N;;;;; +188E4;TANGUT COMPONENT-229;Lo;0;L;;;;;N;;;;; +188E5;TANGUT COMPONENT-230;Lo;0;L;;;;;N;;;;; +188E6;TANGUT COMPONENT-231;Lo;0;L;;;;;N;;;;; +188E7;TANGUT COMPONENT-232;Lo;0;L;;;;;N;;;;; +188E8;TANGUT COMPONENT-233;Lo;0;L;;;;;N;;;;; +188E9;TANGUT COMPONENT-234;Lo;0;L;;;;;N;;;;; +188EA;TANGUT COMPONENT-235;Lo;0;L;;;;;N;;;;; +188EB;TANGUT COMPONENT-236;Lo;0;L;;;;;N;;;;; +188EC;TANGUT COMPONENT-237;Lo;0;L;;;;;N;;;;; +188ED;TANGUT COMPONENT-238;Lo;0;L;;;;;N;;;;; +188EE;TANGUT COMPONENT-239;Lo;0;L;;;;;N;;;;; +188EF;TANGUT COMPONENT-240;Lo;0;L;;;;;N;;;;; +188F0;TANGUT COMPONENT-241;Lo;0;L;;;;;N;;;;; +188F1;TANGUT COMPONENT-242;Lo;0;L;;;;;N;;;;; +188F2;TANGUT COMPONENT-243;Lo;0;L;;;;;N;;;;; +188F3;TANGUT COMPONENT-244;Lo;0;L;;;;;N;;;;; +188F4;TANGUT COMPONENT-245;Lo;0;L;;;;;N;;;;; +188F5;TANGUT COMPONENT-246;Lo;0;L;;;;;N;;;;; +188F6;TANGUT COMPONENT-247;Lo;0;L;;;;;N;;;;; +188F7;TANGUT COMPONENT-248;Lo;0;L;;;;;N;;;;; +188F8;TANGUT COMPONENT-249;Lo;0;L;;;;;N;;;;; +188F9;TANGUT COMPONENT-250;Lo;0;L;;;;;N;;;;; +188FA;TANGUT COMPONENT-251;Lo;0;L;;;;;N;;;;; +188FB;TANGUT COMPONENT-252;Lo;0;L;;;;;N;;;;; +188FC;TANGUT COMPONENT-253;Lo;0;L;;;;;N;;;;; +188FD;TANGUT COMPONENT-254;Lo;0;L;;;;;N;;;;; +188FE;TANGUT COMPONENT-255;Lo;0;L;;;;;N;;;;; +188FF;TANGUT COMPONENT-256;Lo;0;L;;;;;N;;;;; +18900;TANGUT COMPONENT-257;Lo;0;L;;;;;N;;;;; +18901;TANGUT COMPONENT-258;Lo;0;L;;;;;N;;;;; +18902;TANGUT COMPONENT-259;Lo;0;L;;;;;N;;;;; +18903;TANGUT COMPONENT-260;Lo;0;L;;;;;N;;;;; +18904;TANGUT COMPONENT-261;Lo;0;L;;;;;N;;;;; +18905;TANGUT COMPONENT-262;Lo;0;L;;;;;N;;;;; +18906;TANGUT COMPONENT-263;Lo;0;L;;;;;N;;;;; +18907;TANGUT COMPONENT-264;Lo;0;L;;;;;N;;;;; +18908;TANGUT COMPONENT-265;Lo;0;L;;;;;N;;;;; +18909;TANGUT COMPONENT-266;Lo;0;L;;;;;N;;;;; +1890A;TANGUT COMPONENT-267;Lo;0;L;;;;;N;;;;; +1890B;TANGUT COMPONENT-268;Lo;0;L;;;;;N;;;;; +1890C;TANGUT COMPONENT-269;Lo;0;L;;;;;N;;;;; +1890D;TANGUT COMPONENT-270;Lo;0;L;;;;;N;;;;; +1890E;TANGUT COMPONENT-271;Lo;0;L;;;;;N;;;;; +1890F;TANGUT COMPONENT-272;Lo;0;L;;;;;N;;;;; +18910;TANGUT COMPONENT-273;Lo;0;L;;;;;N;;;;; +18911;TANGUT COMPONENT-274;Lo;0;L;;;;;N;;;;; +18912;TANGUT COMPONENT-275;Lo;0;L;;;;;N;;;;; +18913;TANGUT COMPONENT-276;Lo;0;L;;;;;N;;;;; +18914;TANGUT COMPONENT-277;Lo;0;L;;;;;N;;;;; +18915;TANGUT COMPONENT-278;Lo;0;L;;;;;N;;;;; +18916;TANGUT COMPONENT-279;Lo;0;L;;;;;N;;;;; +18917;TANGUT COMPONENT-280;Lo;0;L;;;;;N;;;;; +18918;TANGUT COMPONENT-281;Lo;0;L;;;;;N;;;;; +18919;TANGUT COMPONENT-282;Lo;0;L;;;;;N;;;;; +1891A;TANGUT COMPONENT-283;Lo;0;L;;;;;N;;;;; +1891B;TANGUT COMPONENT-284;Lo;0;L;;;;;N;;;;; +1891C;TANGUT COMPONENT-285;Lo;0;L;;;;;N;;;;; +1891D;TANGUT COMPONENT-286;Lo;0;L;;;;;N;;;;; +1891E;TANGUT COMPONENT-287;Lo;0;L;;;;;N;;;;; +1891F;TANGUT COMPONENT-288;Lo;0;L;;;;;N;;;;; +18920;TANGUT COMPONENT-289;Lo;0;L;;;;;N;;;;; +18921;TANGUT COMPONENT-290;Lo;0;L;;;;;N;;;;; +18922;TANGUT COMPONENT-291;Lo;0;L;;;;;N;;;;; +18923;TANGUT COMPONENT-292;Lo;0;L;;;;;N;;;;; +18924;TANGUT COMPONENT-293;Lo;0;L;;;;;N;;;;; +18925;TANGUT COMPONENT-294;Lo;0;L;;;;;N;;;;; +18926;TANGUT COMPONENT-295;Lo;0;L;;;;;N;;;;; +18927;TANGUT COMPONENT-296;Lo;0;L;;;;;N;;;;; +18928;TANGUT COMPONENT-297;Lo;0;L;;;;;N;;;;; +18929;TANGUT COMPONENT-298;Lo;0;L;;;;;N;;;;; +1892A;TANGUT COMPONENT-299;Lo;0;L;;;;;N;;;;; +1892B;TANGUT COMPONENT-300;Lo;0;L;;;;;N;;;;; +1892C;TANGUT COMPONENT-301;Lo;0;L;;;;;N;;;;; +1892D;TANGUT COMPONENT-302;Lo;0;L;;;;;N;;;;; +1892E;TANGUT COMPONENT-303;Lo;0;L;;;;;N;;;;; +1892F;TANGUT COMPONENT-304;Lo;0;L;;;;;N;;;;; +18930;TANGUT COMPONENT-305;Lo;0;L;;;;;N;;;;; +18931;TANGUT COMPONENT-306;Lo;0;L;;;;;N;;;;; +18932;TANGUT COMPONENT-307;Lo;0;L;;;;;N;;;;; +18933;TANGUT COMPONENT-308;Lo;0;L;;;;;N;;;;; +18934;TANGUT COMPONENT-309;Lo;0;L;;;;;N;;;;; +18935;TANGUT COMPONENT-310;Lo;0;L;;;;;N;;;;; +18936;TANGUT COMPONENT-311;Lo;0;L;;;;;N;;;;; +18937;TANGUT COMPONENT-312;Lo;0;L;;;;;N;;;;; +18938;TANGUT COMPONENT-313;Lo;0;L;;;;;N;;;;; +18939;TANGUT COMPONENT-314;Lo;0;L;;;;;N;;;;; +1893A;TANGUT COMPONENT-315;Lo;0;L;;;;;N;;;;; +1893B;TANGUT COMPONENT-316;Lo;0;L;;;;;N;;;;; +1893C;TANGUT COMPONENT-317;Lo;0;L;;;;;N;;;;; +1893D;TANGUT COMPONENT-318;Lo;0;L;;;;;N;;;;; +1893E;TANGUT COMPONENT-319;Lo;0;L;;;;;N;;;;; +1893F;TANGUT COMPONENT-320;Lo;0;L;;;;;N;;;;; +18940;TANGUT COMPONENT-321;Lo;0;L;;;;;N;;;;; +18941;TANGUT COMPONENT-322;Lo;0;L;;;;;N;;;;; +18942;TANGUT COMPONENT-323;Lo;0;L;;;;;N;;;;; +18943;TANGUT COMPONENT-324;Lo;0;L;;;;;N;;;;; +18944;TANGUT COMPONENT-325;Lo;0;L;;;;;N;;;;; +18945;TANGUT COMPONENT-326;Lo;0;L;;;;;N;;;;; +18946;TANGUT COMPONENT-327;Lo;0;L;;;;;N;;;;; +18947;TANGUT COMPONENT-328;Lo;0;L;;;;;N;;;;; +18948;TANGUT COMPONENT-329;Lo;0;L;;;;;N;;;;; +18949;TANGUT COMPONENT-330;Lo;0;L;;;;;N;;;;; +1894A;TANGUT COMPONENT-331;Lo;0;L;;;;;N;;;;; +1894B;TANGUT COMPONENT-332;Lo;0;L;;;;;N;;;;; +1894C;TANGUT COMPONENT-333;Lo;0;L;;;;;N;;;;; +1894D;TANGUT COMPONENT-334;Lo;0;L;;;;;N;;;;; +1894E;TANGUT COMPONENT-335;Lo;0;L;;;;;N;;;;; +1894F;TANGUT COMPONENT-336;Lo;0;L;;;;;N;;;;; +18950;TANGUT COMPONENT-337;Lo;0;L;;;;;N;;;;; +18951;TANGUT COMPONENT-338;Lo;0;L;;;;;N;;;;; +18952;TANGUT COMPONENT-339;Lo;0;L;;;;;N;;;;; +18953;TANGUT COMPONENT-340;Lo;0;L;;;;;N;;;;; +18954;TANGUT COMPONENT-341;Lo;0;L;;;;;N;;;;; +18955;TANGUT COMPONENT-342;Lo;0;L;;;;;N;;;;; +18956;TANGUT COMPONENT-343;Lo;0;L;;;;;N;;;;; +18957;TANGUT COMPONENT-344;Lo;0;L;;;;;N;;;;; +18958;TANGUT COMPONENT-345;Lo;0;L;;;;;N;;;;; +18959;TANGUT COMPONENT-346;Lo;0;L;;;;;N;;;;; +1895A;TANGUT COMPONENT-347;Lo;0;L;;;;;N;;;;; +1895B;TANGUT COMPONENT-348;Lo;0;L;;;;;N;;;;; +1895C;TANGUT COMPONENT-349;Lo;0;L;;;;;N;;;;; +1895D;TANGUT COMPONENT-350;Lo;0;L;;;;;N;;;;; +1895E;TANGUT COMPONENT-351;Lo;0;L;;;;;N;;;;; +1895F;TANGUT COMPONENT-352;Lo;0;L;;;;;N;;;;; +18960;TANGUT COMPONENT-353;Lo;0;L;;;;;N;;;;; +18961;TANGUT COMPONENT-354;Lo;0;L;;;;;N;;;;; +18962;TANGUT COMPONENT-355;Lo;0;L;;;;;N;;;;; +18963;TANGUT COMPONENT-356;Lo;0;L;;;;;N;;;;; +18964;TANGUT COMPONENT-357;Lo;0;L;;;;;N;;;;; +18965;TANGUT COMPONENT-358;Lo;0;L;;;;;N;;;;; +18966;TANGUT COMPONENT-359;Lo;0;L;;;;;N;;;;; +18967;TANGUT COMPONENT-360;Lo;0;L;;;;;N;;;;; +18968;TANGUT COMPONENT-361;Lo;0;L;;;;;N;;;;; +18969;TANGUT COMPONENT-362;Lo;0;L;;;;;N;;;;; +1896A;TANGUT COMPONENT-363;Lo;0;L;;;;;N;;;;; +1896B;TANGUT COMPONENT-364;Lo;0;L;;;;;N;;;;; +1896C;TANGUT COMPONENT-365;Lo;0;L;;;;;N;;;;; +1896D;TANGUT COMPONENT-366;Lo;0;L;;;;;N;;;;; +1896E;TANGUT COMPONENT-367;Lo;0;L;;;;;N;;;;; +1896F;TANGUT COMPONENT-368;Lo;0;L;;;;;N;;;;; +18970;TANGUT COMPONENT-369;Lo;0;L;;;;;N;;;;; +18971;TANGUT COMPONENT-370;Lo;0;L;;;;;N;;;;; +18972;TANGUT COMPONENT-371;Lo;0;L;;;;;N;;;;; +18973;TANGUT COMPONENT-372;Lo;0;L;;;;;N;;;;; +18974;TANGUT COMPONENT-373;Lo;0;L;;;;;N;;;;; +18975;TANGUT COMPONENT-374;Lo;0;L;;;;;N;;;;; +18976;TANGUT COMPONENT-375;Lo;0;L;;;;;N;;;;; +18977;TANGUT COMPONENT-376;Lo;0;L;;;;;N;;;;; +18978;TANGUT COMPONENT-377;Lo;0;L;;;;;N;;;;; +18979;TANGUT COMPONENT-378;Lo;0;L;;;;;N;;;;; +1897A;TANGUT COMPONENT-379;Lo;0;L;;;;;N;;;;; +1897B;TANGUT COMPONENT-380;Lo;0;L;;;;;N;;;;; +1897C;TANGUT COMPONENT-381;Lo;0;L;;;;;N;;;;; +1897D;TANGUT COMPONENT-382;Lo;0;L;;;;;N;;;;; +1897E;TANGUT COMPONENT-383;Lo;0;L;;;;;N;;;;; +1897F;TANGUT COMPONENT-384;Lo;0;L;;;;;N;;;;; +18980;TANGUT COMPONENT-385;Lo;0;L;;;;;N;;;;; +18981;TANGUT COMPONENT-386;Lo;0;L;;;;;N;;;;; +18982;TANGUT COMPONENT-387;Lo;0;L;;;;;N;;;;; +18983;TANGUT COMPONENT-388;Lo;0;L;;;;;N;;;;; +18984;TANGUT COMPONENT-389;Lo;0;L;;;;;N;;;;; +18985;TANGUT COMPONENT-390;Lo;0;L;;;;;N;;;;; +18986;TANGUT COMPONENT-391;Lo;0;L;;;;;N;;;;; +18987;TANGUT COMPONENT-392;Lo;0;L;;;;;N;;;;; +18988;TANGUT COMPONENT-393;Lo;0;L;;;;;N;;;;; +18989;TANGUT COMPONENT-394;Lo;0;L;;;;;N;;;;; +1898A;TANGUT COMPONENT-395;Lo;0;L;;;;;N;;;;; +1898B;TANGUT COMPONENT-396;Lo;0;L;;;;;N;;;;; +1898C;TANGUT COMPONENT-397;Lo;0;L;;;;;N;;;;; +1898D;TANGUT COMPONENT-398;Lo;0;L;;;;;N;;;;; +1898E;TANGUT COMPONENT-399;Lo;0;L;;;;;N;;;;; +1898F;TANGUT COMPONENT-400;Lo;0;L;;;;;N;;;;; +18990;TANGUT COMPONENT-401;Lo;0;L;;;;;N;;;;; +18991;TANGUT COMPONENT-402;Lo;0;L;;;;;N;;;;; +18992;TANGUT COMPONENT-403;Lo;0;L;;;;;N;;;;; +18993;TANGUT COMPONENT-404;Lo;0;L;;;;;N;;;;; +18994;TANGUT COMPONENT-405;Lo;0;L;;;;;N;;;;; +18995;TANGUT COMPONENT-406;Lo;0;L;;;;;N;;;;; +18996;TANGUT COMPONENT-407;Lo;0;L;;;;;N;;;;; +18997;TANGUT COMPONENT-408;Lo;0;L;;;;;N;;;;; +18998;TANGUT COMPONENT-409;Lo;0;L;;;;;N;;;;; +18999;TANGUT COMPONENT-410;Lo;0;L;;;;;N;;;;; +1899A;TANGUT COMPONENT-411;Lo;0;L;;;;;N;;;;; +1899B;TANGUT COMPONENT-412;Lo;0;L;;;;;N;;;;; +1899C;TANGUT COMPONENT-413;Lo;0;L;;;;;N;;;;; +1899D;TANGUT COMPONENT-414;Lo;0;L;;;;;N;;;;; +1899E;TANGUT COMPONENT-415;Lo;0;L;;;;;N;;;;; +1899F;TANGUT COMPONENT-416;Lo;0;L;;;;;N;;;;; +189A0;TANGUT COMPONENT-417;Lo;0;L;;;;;N;;;;; +189A1;TANGUT COMPONENT-418;Lo;0;L;;;;;N;;;;; +189A2;TANGUT COMPONENT-419;Lo;0;L;;;;;N;;;;; +189A3;TANGUT COMPONENT-420;Lo;0;L;;;;;N;;;;; +189A4;TANGUT COMPONENT-421;Lo;0;L;;;;;N;;;;; +189A5;TANGUT COMPONENT-422;Lo;0;L;;;;;N;;;;; +189A6;TANGUT COMPONENT-423;Lo;0;L;;;;;N;;;;; +189A7;TANGUT COMPONENT-424;Lo;0;L;;;;;N;;;;; +189A8;TANGUT COMPONENT-425;Lo;0;L;;;;;N;;;;; +189A9;TANGUT COMPONENT-426;Lo;0;L;;;;;N;;;;; +189AA;TANGUT COMPONENT-427;Lo;0;L;;;;;N;;;;; +189AB;TANGUT COMPONENT-428;Lo;0;L;;;;;N;;;;; +189AC;TANGUT COMPONENT-429;Lo;0;L;;;;;N;;;;; +189AD;TANGUT COMPONENT-430;Lo;0;L;;;;;N;;;;; +189AE;TANGUT COMPONENT-431;Lo;0;L;;;;;N;;;;; +189AF;TANGUT COMPONENT-432;Lo;0;L;;;;;N;;;;; +189B0;TANGUT COMPONENT-433;Lo;0;L;;;;;N;;;;; +189B1;TANGUT COMPONENT-434;Lo;0;L;;;;;N;;;;; +189B2;TANGUT COMPONENT-435;Lo;0;L;;;;;N;;;;; +189B3;TANGUT COMPONENT-436;Lo;0;L;;;;;N;;;;; +189B4;TANGUT COMPONENT-437;Lo;0;L;;;;;N;;;;; +189B5;TANGUT COMPONENT-438;Lo;0;L;;;;;N;;;;; +189B6;TANGUT COMPONENT-439;Lo;0;L;;;;;N;;;;; +189B7;TANGUT COMPONENT-440;Lo;0;L;;;;;N;;;;; +189B8;TANGUT COMPONENT-441;Lo;0;L;;;;;N;;;;; +189B9;TANGUT COMPONENT-442;Lo;0;L;;;;;N;;;;; +189BA;TANGUT COMPONENT-443;Lo;0;L;;;;;N;;;;; +189BB;TANGUT COMPONENT-444;Lo;0;L;;;;;N;;;;; +189BC;TANGUT COMPONENT-445;Lo;0;L;;;;;N;;;;; +189BD;TANGUT COMPONENT-446;Lo;0;L;;;;;N;;;;; +189BE;TANGUT COMPONENT-447;Lo;0;L;;;;;N;;;;; +189BF;TANGUT COMPONENT-448;Lo;0;L;;;;;N;;;;; +189C0;TANGUT COMPONENT-449;Lo;0;L;;;;;N;;;;; +189C1;TANGUT COMPONENT-450;Lo;0;L;;;;;N;;;;; +189C2;TANGUT COMPONENT-451;Lo;0;L;;;;;N;;;;; +189C3;TANGUT COMPONENT-452;Lo;0;L;;;;;N;;;;; +189C4;TANGUT COMPONENT-453;Lo;0;L;;;;;N;;;;; +189C5;TANGUT COMPONENT-454;Lo;0;L;;;;;N;;;;; +189C6;TANGUT COMPONENT-455;Lo;0;L;;;;;N;;;;; +189C7;TANGUT COMPONENT-456;Lo;0;L;;;;;N;;;;; +189C8;TANGUT COMPONENT-457;Lo;0;L;;;;;N;;;;; +189C9;TANGUT COMPONENT-458;Lo;0;L;;;;;N;;;;; +189CA;TANGUT COMPONENT-459;Lo;0;L;;;;;N;;;;; +189CB;TANGUT COMPONENT-460;Lo;0;L;;;;;N;;;;; +189CC;TANGUT COMPONENT-461;Lo;0;L;;;;;N;;;;; +189CD;TANGUT COMPONENT-462;Lo;0;L;;;;;N;;;;; +189CE;TANGUT COMPONENT-463;Lo;0;L;;;;;N;;;;; +189CF;TANGUT COMPONENT-464;Lo;0;L;;;;;N;;;;; +189D0;TANGUT COMPONENT-465;Lo;0;L;;;;;N;;;;; +189D1;TANGUT COMPONENT-466;Lo;0;L;;;;;N;;;;; +189D2;TANGUT COMPONENT-467;Lo;0;L;;;;;N;;;;; +189D3;TANGUT COMPONENT-468;Lo;0;L;;;;;N;;;;; +189D4;TANGUT COMPONENT-469;Lo;0;L;;;;;N;;;;; +189D5;TANGUT COMPONENT-470;Lo;0;L;;;;;N;;;;; +189D6;TANGUT COMPONENT-471;Lo;0;L;;;;;N;;;;; +189D7;TANGUT COMPONENT-472;Lo;0;L;;;;;N;;;;; +189D8;TANGUT COMPONENT-473;Lo;0;L;;;;;N;;;;; +189D9;TANGUT COMPONENT-474;Lo;0;L;;;;;N;;;;; +189DA;TANGUT COMPONENT-475;Lo;0;L;;;;;N;;;;; +189DB;TANGUT COMPONENT-476;Lo;0;L;;;;;N;;;;; +189DC;TANGUT COMPONENT-477;Lo;0;L;;;;;N;;;;; +189DD;TANGUT COMPONENT-478;Lo;0;L;;;;;N;;;;; +189DE;TANGUT COMPONENT-479;Lo;0;L;;;;;N;;;;; +189DF;TANGUT COMPONENT-480;Lo;0;L;;;;;N;;;;; +189E0;TANGUT COMPONENT-481;Lo;0;L;;;;;N;;;;; +189E1;TANGUT COMPONENT-482;Lo;0;L;;;;;N;;;;; +189E2;TANGUT COMPONENT-483;Lo;0;L;;;;;N;;;;; +189E3;TANGUT COMPONENT-484;Lo;0;L;;;;;N;;;;; +189E4;TANGUT COMPONENT-485;Lo;0;L;;;;;N;;;;; +189E5;TANGUT COMPONENT-486;Lo;0;L;;;;;N;;;;; +189E6;TANGUT COMPONENT-487;Lo;0;L;;;;;N;;;;; +189E7;TANGUT COMPONENT-488;Lo;0;L;;;;;N;;;;; +189E8;TANGUT COMPONENT-489;Lo;0;L;;;;;N;;;;; +189E9;TANGUT COMPONENT-490;Lo;0;L;;;;;N;;;;; +189EA;TANGUT COMPONENT-491;Lo;0;L;;;;;N;;;;; +189EB;TANGUT COMPONENT-492;Lo;0;L;;;;;N;;;;; +189EC;TANGUT COMPONENT-493;Lo;0;L;;;;;N;;;;; +189ED;TANGUT COMPONENT-494;Lo;0;L;;;;;N;;;;; +189EE;TANGUT COMPONENT-495;Lo;0;L;;;;;N;;;;; +189EF;TANGUT COMPONENT-496;Lo;0;L;;;;;N;;;;; +189F0;TANGUT COMPONENT-497;Lo;0;L;;;;;N;;;;; +189F1;TANGUT COMPONENT-498;Lo;0;L;;;;;N;;;;; +189F2;TANGUT COMPONENT-499;Lo;0;L;;;;;N;;;;; +189F3;TANGUT COMPONENT-500;Lo;0;L;;;;;N;;;;; +189F4;TANGUT COMPONENT-501;Lo;0;L;;;;;N;;;;; +189F5;TANGUT COMPONENT-502;Lo;0;L;;;;;N;;;;; +189F6;TANGUT COMPONENT-503;Lo;0;L;;;;;N;;;;; +189F7;TANGUT COMPONENT-504;Lo;0;L;;;;;N;;;;; +189F8;TANGUT COMPONENT-505;Lo;0;L;;;;;N;;;;; +189F9;TANGUT COMPONENT-506;Lo;0;L;;;;;N;;;;; +189FA;TANGUT COMPONENT-507;Lo;0;L;;;;;N;;;;; +189FB;TANGUT COMPONENT-508;Lo;0;L;;;;;N;;;;; +189FC;TANGUT COMPONENT-509;Lo;0;L;;;;;N;;;;; +189FD;TANGUT COMPONENT-510;Lo;0;L;;;;;N;;;;; +189FE;TANGUT COMPONENT-511;Lo;0;L;;;;;N;;;;; +189FF;TANGUT COMPONENT-512;Lo;0;L;;;;;N;;;;; +18A00;TANGUT COMPONENT-513;Lo;0;L;;;;;N;;;;; +18A01;TANGUT COMPONENT-514;Lo;0;L;;;;;N;;;;; +18A02;TANGUT COMPONENT-515;Lo;0;L;;;;;N;;;;; +18A03;TANGUT COMPONENT-516;Lo;0;L;;;;;N;;;;; +18A04;TANGUT COMPONENT-517;Lo;0;L;;;;;N;;;;; +18A05;TANGUT COMPONENT-518;Lo;0;L;;;;;N;;;;; +18A06;TANGUT COMPONENT-519;Lo;0;L;;;;;N;;;;; +18A07;TANGUT COMPONENT-520;Lo;0;L;;;;;N;;;;; +18A08;TANGUT COMPONENT-521;Lo;0;L;;;;;N;;;;; +18A09;TANGUT COMPONENT-522;Lo;0;L;;;;;N;;;;; +18A0A;TANGUT COMPONENT-523;Lo;0;L;;;;;N;;;;; +18A0B;TANGUT COMPONENT-524;Lo;0;L;;;;;N;;;;; +18A0C;TANGUT COMPONENT-525;Lo;0;L;;;;;N;;;;; +18A0D;TANGUT COMPONENT-526;Lo;0;L;;;;;N;;;;; +18A0E;TANGUT COMPONENT-527;Lo;0;L;;;;;N;;;;; +18A0F;TANGUT COMPONENT-528;Lo;0;L;;;;;N;;;;; +18A10;TANGUT COMPONENT-529;Lo;0;L;;;;;N;;;;; +18A11;TANGUT COMPONENT-530;Lo;0;L;;;;;N;;;;; +18A12;TANGUT COMPONENT-531;Lo;0;L;;;;;N;;;;; +18A13;TANGUT COMPONENT-532;Lo;0;L;;;;;N;;;;; +18A14;TANGUT COMPONENT-533;Lo;0;L;;;;;N;;;;; +18A15;TANGUT COMPONENT-534;Lo;0;L;;;;;N;;;;; +18A16;TANGUT COMPONENT-535;Lo;0;L;;;;;N;;;;; +18A17;TANGUT COMPONENT-536;Lo;0;L;;;;;N;;;;; +18A18;TANGUT COMPONENT-537;Lo;0;L;;;;;N;;;;; +18A19;TANGUT COMPONENT-538;Lo;0;L;;;;;N;;;;; +18A1A;TANGUT COMPONENT-539;Lo;0;L;;;;;N;;;;; +18A1B;TANGUT COMPONENT-540;Lo;0;L;;;;;N;;;;; +18A1C;TANGUT COMPONENT-541;Lo;0;L;;;;;N;;;;; +18A1D;TANGUT COMPONENT-542;Lo;0;L;;;;;N;;;;; +18A1E;TANGUT COMPONENT-543;Lo;0;L;;;;;N;;;;; +18A1F;TANGUT COMPONENT-544;Lo;0;L;;;;;N;;;;; +18A20;TANGUT COMPONENT-545;Lo;0;L;;;;;N;;;;; +18A21;TANGUT COMPONENT-546;Lo;0;L;;;;;N;;;;; +18A22;TANGUT COMPONENT-547;Lo;0;L;;;;;N;;;;; +18A23;TANGUT COMPONENT-548;Lo;0;L;;;;;N;;;;; +18A24;TANGUT COMPONENT-549;Lo;0;L;;;;;N;;;;; +18A25;TANGUT COMPONENT-550;Lo;0;L;;;;;N;;;;; +18A26;TANGUT COMPONENT-551;Lo;0;L;;;;;N;;;;; +18A27;TANGUT COMPONENT-552;Lo;0;L;;;;;N;;;;; +18A28;TANGUT COMPONENT-553;Lo;0;L;;;;;N;;;;; +18A29;TANGUT COMPONENT-554;Lo;0;L;;;;;N;;;;; +18A2A;TANGUT COMPONENT-555;Lo;0;L;;;;;N;;;;; +18A2B;TANGUT COMPONENT-556;Lo;0;L;;;;;N;;;;; +18A2C;TANGUT COMPONENT-557;Lo;0;L;;;;;N;;;;; +18A2D;TANGUT COMPONENT-558;Lo;0;L;;;;;N;;;;; +18A2E;TANGUT COMPONENT-559;Lo;0;L;;;;;N;;;;; +18A2F;TANGUT COMPONENT-560;Lo;0;L;;;;;N;;;;; +18A30;TANGUT COMPONENT-561;Lo;0;L;;;;;N;;;;; +18A31;TANGUT COMPONENT-562;Lo;0;L;;;;;N;;;;; +18A32;TANGUT COMPONENT-563;Lo;0;L;;;;;N;;;;; +18A33;TANGUT COMPONENT-564;Lo;0;L;;;;;N;;;;; +18A34;TANGUT COMPONENT-565;Lo;0;L;;;;;N;;;;; +18A35;TANGUT COMPONENT-566;Lo;0;L;;;;;N;;;;; +18A36;TANGUT COMPONENT-567;Lo;0;L;;;;;N;;;;; +18A37;TANGUT COMPONENT-568;Lo;0;L;;;;;N;;;;; +18A38;TANGUT COMPONENT-569;Lo;0;L;;;;;N;;;;; +18A39;TANGUT COMPONENT-570;Lo;0;L;;;;;N;;;;; +18A3A;TANGUT COMPONENT-571;Lo;0;L;;;;;N;;;;; +18A3B;TANGUT COMPONENT-572;Lo;0;L;;;;;N;;;;; +18A3C;TANGUT COMPONENT-573;Lo;0;L;;;;;N;;;;; +18A3D;TANGUT COMPONENT-574;Lo;0;L;;;;;N;;;;; +18A3E;TANGUT COMPONENT-575;Lo;0;L;;;;;N;;;;; +18A3F;TANGUT COMPONENT-576;Lo;0;L;;;;;N;;;;; +18A40;TANGUT COMPONENT-577;Lo;0;L;;;;;N;;;;; +18A41;TANGUT COMPONENT-578;Lo;0;L;;;;;N;;;;; +18A42;TANGUT COMPONENT-579;Lo;0;L;;;;;N;;;;; +18A43;TANGUT COMPONENT-580;Lo;0;L;;;;;N;;;;; +18A44;TANGUT COMPONENT-581;Lo;0;L;;;;;N;;;;; +18A45;TANGUT COMPONENT-582;Lo;0;L;;;;;N;;;;; +18A46;TANGUT COMPONENT-583;Lo;0;L;;;;;N;;;;; +18A47;TANGUT COMPONENT-584;Lo;0;L;;;;;N;;;;; +18A48;TANGUT COMPONENT-585;Lo;0;L;;;;;N;;;;; +18A49;TANGUT COMPONENT-586;Lo;0;L;;;;;N;;;;; +18A4A;TANGUT COMPONENT-587;Lo;0;L;;;;;N;;;;; +18A4B;TANGUT COMPONENT-588;Lo;0;L;;;;;N;;;;; +18A4C;TANGUT COMPONENT-589;Lo;0;L;;;;;N;;;;; +18A4D;TANGUT COMPONENT-590;Lo;0;L;;;;;N;;;;; +18A4E;TANGUT COMPONENT-591;Lo;0;L;;;;;N;;;;; +18A4F;TANGUT COMPONENT-592;Lo;0;L;;;;;N;;;;; +18A50;TANGUT COMPONENT-593;Lo;0;L;;;;;N;;;;; +18A51;TANGUT COMPONENT-594;Lo;0;L;;;;;N;;;;; +18A52;TANGUT COMPONENT-595;Lo;0;L;;;;;N;;;;; +18A53;TANGUT COMPONENT-596;Lo;0;L;;;;;N;;;;; +18A54;TANGUT COMPONENT-597;Lo;0;L;;;;;N;;;;; +18A55;TANGUT COMPONENT-598;Lo;0;L;;;;;N;;;;; +18A56;TANGUT COMPONENT-599;Lo;0;L;;;;;N;;;;; +18A57;TANGUT COMPONENT-600;Lo;0;L;;;;;N;;;;; +18A58;TANGUT COMPONENT-601;Lo;0;L;;;;;N;;;;; +18A59;TANGUT COMPONENT-602;Lo;0;L;;;;;N;;;;; +18A5A;TANGUT COMPONENT-603;Lo;0;L;;;;;N;;;;; +18A5B;TANGUT COMPONENT-604;Lo;0;L;;;;;N;;;;; +18A5C;TANGUT COMPONENT-605;Lo;0;L;;;;;N;;;;; +18A5D;TANGUT COMPONENT-606;Lo;0;L;;;;;N;;;;; +18A5E;TANGUT COMPONENT-607;Lo;0;L;;;;;N;;;;; +18A5F;TANGUT COMPONENT-608;Lo;0;L;;;;;N;;;;; +18A60;TANGUT COMPONENT-609;Lo;0;L;;;;;N;;;;; +18A61;TANGUT COMPONENT-610;Lo;0;L;;;;;N;;;;; +18A62;TANGUT COMPONENT-611;Lo;0;L;;;;;N;;;;; +18A63;TANGUT COMPONENT-612;Lo;0;L;;;;;N;;;;; +18A64;TANGUT COMPONENT-613;Lo;0;L;;;;;N;;;;; +18A65;TANGUT COMPONENT-614;Lo;0;L;;;;;N;;;;; +18A66;TANGUT COMPONENT-615;Lo;0;L;;;;;N;;;;; +18A67;TANGUT COMPONENT-616;Lo;0;L;;;;;N;;;;; +18A68;TANGUT COMPONENT-617;Lo;0;L;;;;;N;;;;; +18A69;TANGUT COMPONENT-618;Lo;0;L;;;;;N;;;;; +18A6A;TANGUT COMPONENT-619;Lo;0;L;;;;;N;;;;; +18A6B;TANGUT COMPONENT-620;Lo;0;L;;;;;N;;;;; +18A6C;TANGUT COMPONENT-621;Lo;0;L;;;;;N;;;;; +18A6D;TANGUT COMPONENT-622;Lo;0;L;;;;;N;;;;; +18A6E;TANGUT COMPONENT-623;Lo;0;L;;;;;N;;;;; +18A6F;TANGUT COMPONENT-624;Lo;0;L;;;;;N;;;;; +18A70;TANGUT COMPONENT-625;Lo;0;L;;;;;N;;;;; +18A71;TANGUT COMPONENT-626;Lo;0;L;;;;;N;;;;; +18A72;TANGUT COMPONENT-627;Lo;0;L;;;;;N;;;;; +18A73;TANGUT COMPONENT-628;Lo;0;L;;;;;N;;;;; +18A74;TANGUT COMPONENT-629;Lo;0;L;;;;;N;;;;; +18A75;TANGUT COMPONENT-630;Lo;0;L;;;;;N;;;;; +18A76;TANGUT COMPONENT-631;Lo;0;L;;;;;N;;;;; +18A77;TANGUT COMPONENT-632;Lo;0;L;;;;;N;;;;; +18A78;TANGUT COMPONENT-633;Lo;0;L;;;;;N;;;;; +18A79;TANGUT COMPONENT-634;Lo;0;L;;;;;N;;;;; +18A7A;TANGUT COMPONENT-635;Lo;0;L;;;;;N;;;;; +18A7B;TANGUT COMPONENT-636;Lo;0;L;;;;;N;;;;; +18A7C;TANGUT COMPONENT-637;Lo;0;L;;;;;N;;;;; +18A7D;TANGUT COMPONENT-638;Lo;0;L;;;;;N;;;;; +18A7E;TANGUT COMPONENT-639;Lo;0;L;;;;;N;;;;; +18A7F;TANGUT COMPONENT-640;Lo;0;L;;;;;N;;;;; +18A80;TANGUT COMPONENT-641;Lo;0;L;;;;;N;;;;; +18A81;TANGUT COMPONENT-642;Lo;0;L;;;;;N;;;;; +18A82;TANGUT COMPONENT-643;Lo;0;L;;;;;N;;;;; +18A83;TANGUT COMPONENT-644;Lo;0;L;;;;;N;;;;; +18A84;TANGUT COMPONENT-645;Lo;0;L;;;;;N;;;;; +18A85;TANGUT COMPONENT-646;Lo;0;L;;;;;N;;;;; +18A86;TANGUT COMPONENT-647;Lo;0;L;;;;;N;;;;; +18A87;TANGUT COMPONENT-648;Lo;0;L;;;;;N;;;;; +18A88;TANGUT COMPONENT-649;Lo;0;L;;;;;N;;;;; +18A89;TANGUT COMPONENT-650;Lo;0;L;;;;;N;;;;; +18A8A;TANGUT COMPONENT-651;Lo;0;L;;;;;N;;;;; +18A8B;TANGUT COMPONENT-652;Lo;0;L;;;;;N;;;;; +18A8C;TANGUT COMPONENT-653;Lo;0;L;;;;;N;;;;; +18A8D;TANGUT COMPONENT-654;Lo;0;L;;;;;N;;;;; +18A8E;TANGUT COMPONENT-655;Lo;0;L;;;;;N;;;;; +18A8F;TANGUT COMPONENT-656;Lo;0;L;;;;;N;;;;; +18A90;TANGUT COMPONENT-657;Lo;0;L;;;;;N;;;;; +18A91;TANGUT COMPONENT-658;Lo;0;L;;;;;N;;;;; +18A92;TANGUT COMPONENT-659;Lo;0;L;;;;;N;;;;; +18A93;TANGUT COMPONENT-660;Lo;0;L;;;;;N;;;;; +18A94;TANGUT COMPONENT-661;Lo;0;L;;;;;N;;;;; +18A95;TANGUT COMPONENT-662;Lo;0;L;;;;;N;;;;; +18A96;TANGUT COMPONENT-663;Lo;0;L;;;;;N;;;;; +18A97;TANGUT COMPONENT-664;Lo;0;L;;;;;N;;;;; +18A98;TANGUT COMPONENT-665;Lo;0;L;;;;;N;;;;; +18A99;TANGUT COMPONENT-666;Lo;0;L;;;;;N;;;;; +18A9A;TANGUT COMPONENT-667;Lo;0;L;;;;;N;;;;; +18A9B;TANGUT COMPONENT-668;Lo;0;L;;;;;N;;;;; +18A9C;TANGUT COMPONENT-669;Lo;0;L;;;;;N;;;;; +18A9D;TANGUT COMPONENT-670;Lo;0;L;;;;;N;;;;; +18A9E;TANGUT COMPONENT-671;Lo;0;L;;;;;N;;;;; +18A9F;TANGUT COMPONENT-672;Lo;0;L;;;;;N;;;;; +18AA0;TANGUT COMPONENT-673;Lo;0;L;;;;;N;;;;; +18AA1;TANGUT COMPONENT-674;Lo;0;L;;;;;N;;;;; +18AA2;TANGUT COMPONENT-675;Lo;0;L;;;;;N;;;;; +18AA3;TANGUT COMPONENT-676;Lo;0;L;;;;;N;;;;; +18AA4;TANGUT COMPONENT-677;Lo;0;L;;;;;N;;;;; +18AA5;TANGUT COMPONENT-678;Lo;0;L;;;;;N;;;;; +18AA6;TANGUT COMPONENT-679;Lo;0;L;;;;;N;;;;; +18AA7;TANGUT COMPONENT-680;Lo;0;L;;;;;N;;;;; +18AA8;TANGUT COMPONENT-681;Lo;0;L;;;;;N;;;;; +18AA9;TANGUT COMPONENT-682;Lo;0;L;;;;;N;;;;; +18AAA;TANGUT COMPONENT-683;Lo;0;L;;;;;N;;;;; +18AAB;TANGUT COMPONENT-684;Lo;0;L;;;;;N;;;;; +18AAC;TANGUT COMPONENT-685;Lo;0;L;;;;;N;;;;; +18AAD;TANGUT COMPONENT-686;Lo;0;L;;;;;N;;;;; +18AAE;TANGUT COMPONENT-687;Lo;0;L;;;;;N;;;;; +18AAF;TANGUT COMPONENT-688;Lo;0;L;;;;;N;;;;; +18AB0;TANGUT COMPONENT-689;Lo;0;L;;;;;N;;;;; +18AB1;TANGUT COMPONENT-690;Lo;0;L;;;;;N;;;;; +18AB2;TANGUT COMPONENT-691;Lo;0;L;;;;;N;;;;; +18AB3;TANGUT COMPONENT-692;Lo;0;L;;;;;N;;;;; +18AB4;TANGUT COMPONENT-693;Lo;0;L;;;;;N;;;;; +18AB5;TANGUT COMPONENT-694;Lo;0;L;;;;;N;;;;; +18AB6;TANGUT COMPONENT-695;Lo;0;L;;;;;N;;;;; +18AB7;TANGUT COMPONENT-696;Lo;0;L;;;;;N;;;;; +18AB8;TANGUT COMPONENT-697;Lo;0;L;;;;;N;;;;; +18AB9;TANGUT COMPONENT-698;Lo;0;L;;;;;N;;;;; +18ABA;TANGUT COMPONENT-699;Lo;0;L;;;;;N;;;;; +18ABB;TANGUT COMPONENT-700;Lo;0;L;;;;;N;;;;; +18ABC;TANGUT COMPONENT-701;Lo;0;L;;;;;N;;;;; +18ABD;TANGUT COMPONENT-702;Lo;0;L;;;;;N;;;;; +18ABE;TANGUT COMPONENT-703;Lo;0;L;;;;;N;;;;; +18ABF;TANGUT COMPONENT-704;Lo;0;L;;;;;N;;;;; +18AC0;TANGUT COMPONENT-705;Lo;0;L;;;;;N;;;;; +18AC1;TANGUT COMPONENT-706;Lo;0;L;;;;;N;;;;; +18AC2;TANGUT COMPONENT-707;Lo;0;L;;;;;N;;;;; +18AC3;TANGUT COMPONENT-708;Lo;0;L;;;;;N;;;;; +18AC4;TANGUT COMPONENT-709;Lo;0;L;;;;;N;;;;; +18AC5;TANGUT COMPONENT-710;Lo;0;L;;;;;N;;;;; +18AC6;TANGUT COMPONENT-711;Lo;0;L;;;;;N;;;;; +18AC7;TANGUT COMPONENT-712;Lo;0;L;;;;;N;;;;; +18AC8;TANGUT COMPONENT-713;Lo;0;L;;;;;N;;;;; +18AC9;TANGUT COMPONENT-714;Lo;0;L;;;;;N;;;;; +18ACA;TANGUT COMPONENT-715;Lo;0;L;;;;;N;;;;; +18ACB;TANGUT COMPONENT-716;Lo;0;L;;;;;N;;;;; +18ACC;TANGUT COMPONENT-717;Lo;0;L;;;;;N;;;;; +18ACD;TANGUT COMPONENT-718;Lo;0;L;;;;;N;;;;; +18ACE;TANGUT COMPONENT-719;Lo;0;L;;;;;N;;;;; +18ACF;TANGUT COMPONENT-720;Lo;0;L;;;;;N;;;;; +18AD0;TANGUT COMPONENT-721;Lo;0;L;;;;;N;;;;; +18AD1;TANGUT COMPONENT-722;Lo;0;L;;;;;N;;;;; +18AD2;TANGUT COMPONENT-723;Lo;0;L;;;;;N;;;;; +18AD3;TANGUT COMPONENT-724;Lo;0;L;;;;;N;;;;; +18AD4;TANGUT COMPONENT-725;Lo;0;L;;;;;N;;;;; +18AD5;TANGUT COMPONENT-726;Lo;0;L;;;;;N;;;;; +18AD6;TANGUT COMPONENT-727;Lo;0;L;;;;;N;;;;; +18AD7;TANGUT COMPONENT-728;Lo;0;L;;;;;N;;;;; +18AD8;TANGUT COMPONENT-729;Lo;0;L;;;;;N;;;;; +18AD9;TANGUT COMPONENT-730;Lo;0;L;;;;;N;;;;; +18ADA;TANGUT COMPONENT-731;Lo;0;L;;;;;N;;;;; +18ADB;TANGUT COMPONENT-732;Lo;0;L;;;;;N;;;;; +18ADC;TANGUT COMPONENT-733;Lo;0;L;;;;;N;;;;; +18ADD;TANGUT COMPONENT-734;Lo;0;L;;;;;N;;;;; +18ADE;TANGUT COMPONENT-735;Lo;0;L;;;;;N;;;;; +18ADF;TANGUT COMPONENT-736;Lo;0;L;;;;;N;;;;; +18AE0;TANGUT COMPONENT-737;Lo;0;L;;;;;N;;;;; +18AE1;TANGUT COMPONENT-738;Lo;0;L;;;;;N;;;;; +18AE2;TANGUT COMPONENT-739;Lo;0;L;;;;;N;;;;; +18AE3;TANGUT COMPONENT-740;Lo;0;L;;;;;N;;;;; +18AE4;TANGUT COMPONENT-741;Lo;0;L;;;;;N;;;;; +18AE5;TANGUT COMPONENT-742;Lo;0;L;;;;;N;;;;; +18AE6;TANGUT COMPONENT-743;Lo;0;L;;;;;N;;;;; +18AE7;TANGUT COMPONENT-744;Lo;0;L;;;;;N;;;;; +18AE8;TANGUT COMPONENT-745;Lo;0;L;;;;;N;;;;; +18AE9;TANGUT COMPONENT-746;Lo;0;L;;;;;N;;;;; +18AEA;TANGUT COMPONENT-747;Lo;0;L;;;;;N;;;;; +18AEB;TANGUT COMPONENT-748;Lo;0;L;;;;;N;;;;; +18AEC;TANGUT COMPONENT-749;Lo;0;L;;;;;N;;;;; +18AED;TANGUT COMPONENT-750;Lo;0;L;;;;;N;;;;; +18AEE;TANGUT COMPONENT-751;Lo;0;L;;;;;N;;;;; +18AEF;TANGUT COMPONENT-752;Lo;0;L;;;;;N;;;;; +18AF0;TANGUT COMPONENT-753;Lo;0;L;;;;;N;;;;; +18AF1;TANGUT COMPONENT-754;Lo;0;L;;;;;N;;;;; +18AF2;TANGUT COMPONENT-755;Lo;0;L;;;;;N;;;;; +18AF3;TANGUT COMPONENT-756;Lo;0;L;;;;;N;;;;; +18AF4;TANGUT COMPONENT-757;Lo;0;L;;;;;N;;;;; +18AF5;TANGUT COMPONENT-758;Lo;0;L;;;;;N;;;;; +18AF6;TANGUT COMPONENT-759;Lo;0;L;;;;;N;;;;; +18AF7;TANGUT COMPONENT-760;Lo;0;L;;;;;N;;;;; +18AF8;TANGUT COMPONENT-761;Lo;0;L;;;;;N;;;;; +18AF9;TANGUT COMPONENT-762;Lo;0;L;;;;;N;;;;; +18AFA;TANGUT COMPONENT-763;Lo;0;L;;;;;N;;;;; +18AFB;TANGUT COMPONENT-764;Lo;0;L;;;;;N;;;;; +18AFC;TANGUT COMPONENT-765;Lo;0;L;;;;;N;;;;; +18AFD;TANGUT COMPONENT-766;Lo;0;L;;;;;N;;;;; +18AFE;TANGUT COMPONENT-767;Lo;0;L;;;;;N;;;;; +18AFF;TANGUT COMPONENT-768;Lo;0;L;;;;;N;;;;; +18B00;KHITAN SMALL SCRIPT CHARACTER-18B00;Lo;0;L;;;;;N;;;;; +18B01;KHITAN SMALL SCRIPT CHARACTER-18B01;Lo;0;L;;;;;N;;;;; +18B02;KHITAN SMALL SCRIPT CHARACTER-18B02;Lo;0;L;;;;;N;;;;; +18B03;KHITAN SMALL SCRIPT CHARACTER-18B03;Lo;0;L;;;;;N;;;;; +18B04;KHITAN SMALL SCRIPT CHARACTER-18B04;Lo;0;L;;;;;N;;;;; +18B05;KHITAN SMALL SCRIPT CHARACTER-18B05;Lo;0;L;;;;;N;;;;; +18B06;KHITAN SMALL SCRIPT CHARACTER-18B06;Lo;0;L;;;;;N;;;;; +18B07;KHITAN SMALL SCRIPT CHARACTER-18B07;Lo;0;L;;;;;N;;;;; +18B08;KHITAN SMALL SCRIPT CHARACTER-18B08;Lo;0;L;;;;;N;;;;; +18B09;KHITAN SMALL SCRIPT CHARACTER-18B09;Lo;0;L;;;;;N;;;;; +18B0A;KHITAN SMALL SCRIPT CHARACTER-18B0A;Lo;0;L;;;;;N;;;;; +18B0B;KHITAN SMALL SCRIPT CHARACTER-18B0B;Lo;0;L;;;;;N;;;;; +18B0C;KHITAN SMALL SCRIPT CHARACTER-18B0C;Lo;0;L;;;;;N;;;;; +18B0D;KHITAN SMALL SCRIPT CHARACTER-18B0D;Lo;0;L;;;;;N;;;;; +18B0E;KHITAN SMALL SCRIPT CHARACTER-18B0E;Lo;0;L;;;;;N;;;;; +18B0F;KHITAN SMALL SCRIPT CHARACTER-18B0F;Lo;0;L;;;;;N;;;;; +18B10;KHITAN SMALL SCRIPT CHARACTER-18B10;Lo;0;L;;;;;N;;;;; +18B11;KHITAN SMALL SCRIPT CHARACTER-18B11;Lo;0;L;;;;;N;;;;; +18B12;KHITAN SMALL SCRIPT CHARACTER-18B12;Lo;0;L;;;;;N;;;;; +18B13;KHITAN SMALL SCRIPT CHARACTER-18B13;Lo;0;L;;;;;N;;;;; +18B14;KHITAN SMALL SCRIPT CHARACTER-18B14;Lo;0;L;;;;;N;;;;; +18B15;KHITAN SMALL SCRIPT CHARACTER-18B15;Lo;0;L;;;;;N;;;;; +18B16;KHITAN SMALL SCRIPT CHARACTER-18B16;Lo;0;L;;;;;N;;;;; +18B17;KHITAN SMALL SCRIPT CHARACTER-18B17;Lo;0;L;;;;;N;;;;; +18B18;KHITAN SMALL SCRIPT CHARACTER-18B18;Lo;0;L;;;;;N;;;;; +18B19;KHITAN SMALL SCRIPT CHARACTER-18B19;Lo;0;L;;;;;N;;;;; +18B1A;KHITAN SMALL SCRIPT CHARACTER-18B1A;Lo;0;L;;;;;N;;;;; +18B1B;KHITAN SMALL SCRIPT CHARACTER-18B1B;Lo;0;L;;;;;N;;;;; +18B1C;KHITAN SMALL SCRIPT CHARACTER-18B1C;Lo;0;L;;;;;N;;;;; +18B1D;KHITAN SMALL SCRIPT CHARACTER-18B1D;Lo;0;L;;;;;N;;;;; +18B1E;KHITAN SMALL SCRIPT CHARACTER-18B1E;Lo;0;L;;;;;N;;;;; +18B1F;KHITAN SMALL SCRIPT CHARACTER-18B1F;Lo;0;L;;;;;N;;;;; +18B20;KHITAN SMALL SCRIPT CHARACTER-18B20;Lo;0;L;;;;;N;;;;; +18B21;KHITAN SMALL SCRIPT CHARACTER-18B21;Lo;0;L;;;;;N;;;;; +18B22;KHITAN SMALL SCRIPT CHARACTER-18B22;Lo;0;L;;;;;N;;;;; +18B23;KHITAN SMALL SCRIPT CHARACTER-18B23;Lo;0;L;;;;;N;;;;; +18B24;KHITAN SMALL SCRIPT CHARACTER-18B24;Lo;0;L;;;;;N;;;;; +18B25;KHITAN SMALL SCRIPT CHARACTER-18B25;Lo;0;L;;;;;N;;;;; +18B26;KHITAN SMALL SCRIPT CHARACTER-18B26;Lo;0;L;;;;;N;;;;; +18B27;KHITAN SMALL SCRIPT CHARACTER-18B27;Lo;0;L;;;;;N;;;;; +18B28;KHITAN SMALL SCRIPT CHARACTER-18B28;Lo;0;L;;;;;N;;;;; +18B29;KHITAN SMALL SCRIPT CHARACTER-18B29;Lo;0;L;;;;;N;;;;; +18B2A;KHITAN SMALL SCRIPT CHARACTER-18B2A;Lo;0;L;;;;;N;;;;; +18B2B;KHITAN SMALL SCRIPT CHARACTER-18B2B;Lo;0;L;;;;;N;;;;; +18B2C;KHITAN SMALL SCRIPT CHARACTER-18B2C;Lo;0;L;;;;;N;;;;; +18B2D;KHITAN SMALL SCRIPT CHARACTER-18B2D;Lo;0;L;;;;;N;;;;; +18B2E;KHITAN SMALL SCRIPT CHARACTER-18B2E;Lo;0;L;;;;;N;;;;; +18B2F;KHITAN SMALL SCRIPT CHARACTER-18B2F;Lo;0;L;;;;;N;;;;; +18B30;KHITAN SMALL SCRIPT CHARACTER-18B30;Lo;0;L;;;;;N;;;;; +18B31;KHITAN SMALL SCRIPT CHARACTER-18B31;Lo;0;L;;;;;N;;;;; +18B32;KHITAN SMALL SCRIPT CHARACTER-18B32;Lo;0;L;;;;;N;;;;; +18B33;KHITAN SMALL SCRIPT CHARACTER-18B33;Lo;0;L;;;;;N;;;;; +18B34;KHITAN SMALL SCRIPT CHARACTER-18B34;Lo;0;L;;;;;N;;;;; +18B35;KHITAN SMALL SCRIPT CHARACTER-18B35;Lo;0;L;;;;;N;;;;; +18B36;KHITAN SMALL SCRIPT CHARACTER-18B36;Lo;0;L;;;;;N;;;;; +18B37;KHITAN SMALL SCRIPT CHARACTER-18B37;Lo;0;L;;;;;N;;;;; +18B38;KHITAN SMALL SCRIPT CHARACTER-18B38;Lo;0;L;;;;;N;;;;; +18B39;KHITAN SMALL SCRIPT CHARACTER-18B39;Lo;0;L;;;;;N;;;;; +18B3A;KHITAN SMALL SCRIPT CHARACTER-18B3A;Lo;0;L;;;;;N;;;;; +18B3B;KHITAN SMALL SCRIPT CHARACTER-18B3B;Lo;0;L;;;;;N;;;;; +18B3C;KHITAN SMALL SCRIPT CHARACTER-18B3C;Lo;0;L;;;;;N;;;;; +18B3D;KHITAN SMALL SCRIPT CHARACTER-18B3D;Lo;0;L;;;;;N;;;;; +18B3E;KHITAN SMALL SCRIPT CHARACTER-18B3E;Lo;0;L;;;;;N;;;;; +18B3F;KHITAN SMALL SCRIPT CHARACTER-18B3F;Lo;0;L;;;;;N;;;;; +18B40;KHITAN SMALL SCRIPT CHARACTER-18B40;Lo;0;L;;;;;N;;;;; +18B41;KHITAN SMALL SCRIPT CHARACTER-18B41;Lo;0;L;;;;;N;;;;; +18B42;KHITAN SMALL SCRIPT CHARACTER-18B42;Lo;0;L;;;;;N;;;;; +18B43;KHITAN SMALL SCRIPT CHARACTER-18B43;Lo;0;L;;;;;N;;;;; +18B44;KHITAN SMALL SCRIPT CHARACTER-18B44;Lo;0;L;;;;;N;;;;; +18B45;KHITAN SMALL SCRIPT CHARACTER-18B45;Lo;0;L;;;;;N;;;;; +18B46;KHITAN SMALL SCRIPT CHARACTER-18B46;Lo;0;L;;;;;N;;;;; +18B47;KHITAN SMALL SCRIPT CHARACTER-18B47;Lo;0;L;;;;;N;;;;; +18B48;KHITAN SMALL SCRIPT CHARACTER-18B48;Lo;0;L;;;;;N;;;;; +18B49;KHITAN SMALL SCRIPT CHARACTER-18B49;Lo;0;L;;;;;N;;;;; +18B4A;KHITAN SMALL SCRIPT CHARACTER-18B4A;Lo;0;L;;;;;N;;;;; +18B4B;KHITAN SMALL SCRIPT CHARACTER-18B4B;Lo;0;L;;;;;N;;;;; +18B4C;KHITAN SMALL SCRIPT CHARACTER-18B4C;Lo;0;L;;;;;N;;;;; +18B4D;KHITAN SMALL SCRIPT CHARACTER-18B4D;Lo;0;L;;;;;N;;;;; +18B4E;KHITAN SMALL SCRIPT CHARACTER-18B4E;Lo;0;L;;;;;N;;;;; +18B4F;KHITAN SMALL SCRIPT CHARACTER-18B4F;Lo;0;L;;;;;N;;;;; +18B50;KHITAN SMALL SCRIPT CHARACTER-18B50;Lo;0;L;;;;;N;;;;; +18B51;KHITAN SMALL SCRIPT CHARACTER-18B51;Lo;0;L;;;;;N;;;;; +18B52;KHITAN SMALL SCRIPT CHARACTER-18B52;Lo;0;L;;;;;N;;;;; +18B53;KHITAN SMALL SCRIPT CHARACTER-18B53;Lo;0;L;;;;;N;;;;; +18B54;KHITAN SMALL SCRIPT CHARACTER-18B54;Lo;0;L;;;;;N;;;;; +18B55;KHITAN SMALL SCRIPT CHARACTER-18B55;Lo;0;L;;;;;N;;;;; +18B56;KHITAN SMALL SCRIPT CHARACTER-18B56;Lo;0;L;;;;;N;;;;; +18B57;KHITAN SMALL SCRIPT CHARACTER-18B57;Lo;0;L;;;;;N;;;;; +18B58;KHITAN SMALL SCRIPT CHARACTER-18B58;Lo;0;L;;;;;N;;;;; +18B59;KHITAN SMALL SCRIPT CHARACTER-18B59;Lo;0;L;;;;;N;;;;; +18B5A;KHITAN SMALL SCRIPT CHARACTER-18B5A;Lo;0;L;;;;;N;;;;; +18B5B;KHITAN SMALL SCRIPT CHARACTER-18B5B;Lo;0;L;;;;;N;;;;; +18B5C;KHITAN SMALL SCRIPT CHARACTER-18B5C;Lo;0;L;;;;;N;;;;; +18B5D;KHITAN SMALL SCRIPT CHARACTER-18B5D;Lo;0;L;;;;;N;;;;; +18B5E;KHITAN SMALL SCRIPT CHARACTER-18B5E;Lo;0;L;;;;;N;;;;; +18B5F;KHITAN SMALL SCRIPT CHARACTER-18B5F;Lo;0;L;;;;;N;;;;; +18B60;KHITAN SMALL SCRIPT CHARACTER-18B60;Lo;0;L;;;;;N;;;;; +18B61;KHITAN SMALL SCRIPT CHARACTER-18B61;Lo;0;L;;;;;N;;;;; +18B62;KHITAN SMALL SCRIPT CHARACTER-18B62;Lo;0;L;;;;;N;;;;; +18B63;KHITAN SMALL SCRIPT CHARACTER-18B63;Lo;0;L;;;;;N;;;;; +18B64;KHITAN SMALL SCRIPT CHARACTER-18B64;Lo;0;L;;;;;N;;;;; +18B65;KHITAN SMALL SCRIPT CHARACTER-18B65;Lo;0;L;;;;;N;;;;; +18B66;KHITAN SMALL SCRIPT CHARACTER-18B66;Lo;0;L;;;;;N;;;;; +18B67;KHITAN SMALL SCRIPT CHARACTER-18B67;Lo;0;L;;;;;N;;;;; +18B68;KHITAN SMALL SCRIPT CHARACTER-18B68;Lo;0;L;;;;;N;;;;; +18B69;KHITAN SMALL SCRIPT CHARACTER-18B69;Lo;0;L;;;;;N;;;;; +18B6A;KHITAN SMALL SCRIPT CHARACTER-18B6A;Lo;0;L;;;;;N;;;;; +18B6B;KHITAN SMALL SCRIPT CHARACTER-18B6B;Lo;0;L;;;;;N;;;;; +18B6C;KHITAN SMALL SCRIPT CHARACTER-18B6C;Lo;0;L;;;;;N;;;;; +18B6D;KHITAN SMALL SCRIPT CHARACTER-18B6D;Lo;0;L;;;;;N;;;;; +18B6E;KHITAN SMALL SCRIPT CHARACTER-18B6E;Lo;0;L;;;;;N;;;;; +18B6F;KHITAN SMALL SCRIPT CHARACTER-18B6F;Lo;0;L;;;;;N;;;;; +18B70;KHITAN SMALL SCRIPT CHARACTER-18B70;Lo;0;L;;;;;N;;;;; +18B71;KHITAN SMALL SCRIPT CHARACTER-18B71;Lo;0;L;;;;;N;;;;; +18B72;KHITAN SMALL SCRIPT CHARACTER-18B72;Lo;0;L;;;;;N;;;;; +18B73;KHITAN SMALL SCRIPT CHARACTER-18B73;Lo;0;L;;;;;N;;;;; +18B74;KHITAN SMALL SCRIPT CHARACTER-18B74;Lo;0;L;;;;;N;;;;; +18B75;KHITAN SMALL SCRIPT CHARACTER-18B75;Lo;0;L;;;;;N;;;;; +18B76;KHITAN SMALL SCRIPT CHARACTER-18B76;Lo;0;L;;;;;N;;;;; +18B77;KHITAN SMALL SCRIPT CHARACTER-18B77;Lo;0;L;;;;;N;;;;; +18B78;KHITAN SMALL SCRIPT CHARACTER-18B78;Lo;0;L;;;;;N;;;;; +18B79;KHITAN SMALL SCRIPT CHARACTER-18B79;Lo;0;L;;;;;N;;;;; +18B7A;KHITAN SMALL SCRIPT CHARACTER-18B7A;Lo;0;L;;;;;N;;;;; +18B7B;KHITAN SMALL SCRIPT CHARACTER-18B7B;Lo;0;L;;;;;N;;;;; +18B7C;KHITAN SMALL SCRIPT CHARACTER-18B7C;Lo;0;L;;;;;N;;;;; +18B7D;KHITAN SMALL SCRIPT CHARACTER-18B7D;Lo;0;L;;;;;N;;;;; +18B7E;KHITAN SMALL SCRIPT CHARACTER-18B7E;Lo;0;L;;;;;N;;;;; +18B7F;KHITAN SMALL SCRIPT CHARACTER-18B7F;Lo;0;L;;;;;N;;;;; +18B80;KHITAN SMALL SCRIPT CHARACTER-18B80;Lo;0;L;;;;;N;;;;; +18B81;KHITAN SMALL SCRIPT CHARACTER-18B81;Lo;0;L;;;;;N;;;;; +18B82;KHITAN SMALL SCRIPT CHARACTER-18B82;Lo;0;L;;;;;N;;;;; +18B83;KHITAN SMALL SCRIPT CHARACTER-18B83;Lo;0;L;;;;;N;;;;; +18B84;KHITAN SMALL SCRIPT CHARACTER-18B84;Lo;0;L;;;;;N;;;;; +18B85;KHITAN SMALL SCRIPT CHARACTER-18B85;Lo;0;L;;;;;N;;;;; +18B86;KHITAN SMALL SCRIPT CHARACTER-18B86;Lo;0;L;;;;;N;;;;; +18B87;KHITAN SMALL SCRIPT CHARACTER-18B87;Lo;0;L;;;;;N;;;;; +18B88;KHITAN SMALL SCRIPT CHARACTER-18B88;Lo;0;L;;;;;N;;;;; +18B89;KHITAN SMALL SCRIPT CHARACTER-18B89;Lo;0;L;;;;;N;;;;; +18B8A;KHITAN SMALL SCRIPT CHARACTER-18B8A;Lo;0;L;;;;;N;;;;; +18B8B;KHITAN SMALL SCRIPT CHARACTER-18B8B;Lo;0;L;;;;;N;;;;; +18B8C;KHITAN SMALL SCRIPT CHARACTER-18B8C;Lo;0;L;;;;;N;;;;; +18B8D;KHITAN SMALL SCRIPT CHARACTER-18B8D;Lo;0;L;;;;;N;;;;; +18B8E;KHITAN SMALL SCRIPT CHARACTER-18B8E;Lo;0;L;;;;;N;;;;; +18B8F;KHITAN SMALL SCRIPT CHARACTER-18B8F;Lo;0;L;;;;;N;;;;; +18B90;KHITAN SMALL SCRIPT CHARACTER-18B90;Lo;0;L;;;;;N;;;;; +18B91;KHITAN SMALL SCRIPT CHARACTER-18B91;Lo;0;L;;;;;N;;;;; +18B92;KHITAN SMALL SCRIPT CHARACTER-18B92;Lo;0;L;;;;;N;;;;; +18B93;KHITAN SMALL SCRIPT CHARACTER-18B93;Lo;0;L;;;;;N;;;;; +18B94;KHITAN SMALL SCRIPT CHARACTER-18B94;Lo;0;L;;;;;N;;;;; +18B95;KHITAN SMALL SCRIPT CHARACTER-18B95;Lo;0;L;;;;;N;;;;; +18B96;KHITAN SMALL SCRIPT CHARACTER-18B96;Lo;0;L;;;;;N;;;;; +18B97;KHITAN SMALL SCRIPT CHARACTER-18B97;Lo;0;L;;;;;N;;;;; +18B98;KHITAN SMALL SCRIPT CHARACTER-18B98;Lo;0;L;;;;;N;;;;; +18B99;KHITAN SMALL SCRIPT CHARACTER-18B99;Lo;0;L;;;;;N;;;;; +18B9A;KHITAN SMALL SCRIPT CHARACTER-18B9A;Lo;0;L;;;;;N;;;;; +18B9B;KHITAN SMALL SCRIPT CHARACTER-18B9B;Lo;0;L;;;;;N;;;;; +18B9C;KHITAN SMALL SCRIPT CHARACTER-18B9C;Lo;0;L;;;;;N;;;;; +18B9D;KHITAN SMALL SCRIPT CHARACTER-18B9D;Lo;0;L;;;;;N;;;;; +18B9E;KHITAN SMALL SCRIPT CHARACTER-18B9E;Lo;0;L;;;;;N;;;;; +18B9F;KHITAN SMALL SCRIPT CHARACTER-18B9F;Lo;0;L;;;;;N;;;;; +18BA0;KHITAN SMALL SCRIPT CHARACTER-18BA0;Lo;0;L;;;;;N;;;;; +18BA1;KHITAN SMALL SCRIPT CHARACTER-18BA1;Lo;0;L;;;;;N;;;;; +18BA2;KHITAN SMALL SCRIPT CHARACTER-18BA2;Lo;0;L;;;;;N;;;;; +18BA3;KHITAN SMALL SCRIPT CHARACTER-18BA3;Lo;0;L;;;;;N;;;;; +18BA4;KHITAN SMALL SCRIPT CHARACTER-18BA4;Lo;0;L;;;;;N;;;;; +18BA5;KHITAN SMALL SCRIPT CHARACTER-18BA5;Lo;0;L;;;;;N;;;;; +18BA6;KHITAN SMALL SCRIPT CHARACTER-18BA6;Lo;0;L;;;;;N;;;;; +18BA7;KHITAN SMALL SCRIPT CHARACTER-18BA7;Lo;0;L;;;;;N;;;;; +18BA8;KHITAN SMALL SCRIPT CHARACTER-18BA8;Lo;0;L;;;;;N;;;;; +18BA9;KHITAN SMALL SCRIPT CHARACTER-18BA9;Lo;0;L;;;;;N;;;;; +18BAA;KHITAN SMALL SCRIPT CHARACTER-18BAA;Lo;0;L;;;;;N;;;;; +18BAB;KHITAN SMALL SCRIPT CHARACTER-18BAB;Lo;0;L;;;;;N;;;;; +18BAC;KHITAN SMALL SCRIPT CHARACTER-18BAC;Lo;0;L;;;;;N;;;;; +18BAD;KHITAN SMALL SCRIPT CHARACTER-18BAD;Lo;0;L;;;;;N;;;;; +18BAE;KHITAN SMALL SCRIPT CHARACTER-18BAE;Lo;0;L;;;;;N;;;;; +18BAF;KHITAN SMALL SCRIPT CHARACTER-18BAF;Lo;0;L;;;;;N;;;;; +18BB0;KHITAN SMALL SCRIPT CHARACTER-18BB0;Lo;0;L;;;;;N;;;;; +18BB1;KHITAN SMALL SCRIPT CHARACTER-18BB1;Lo;0;L;;;;;N;;;;; +18BB2;KHITAN SMALL SCRIPT CHARACTER-18BB2;Lo;0;L;;;;;N;;;;; +18BB3;KHITAN SMALL SCRIPT CHARACTER-18BB3;Lo;0;L;;;;;N;;;;; +18BB4;KHITAN SMALL SCRIPT CHARACTER-18BB4;Lo;0;L;;;;;N;;;;; +18BB5;KHITAN SMALL SCRIPT CHARACTER-18BB5;Lo;0;L;;;;;N;;;;; +18BB6;KHITAN SMALL SCRIPT CHARACTER-18BB6;Lo;0;L;;;;;N;;;;; +18BB7;KHITAN SMALL SCRIPT CHARACTER-18BB7;Lo;0;L;;;;;N;;;;; +18BB8;KHITAN SMALL SCRIPT CHARACTER-18BB8;Lo;0;L;;;;;N;;;;; +18BB9;KHITAN SMALL SCRIPT CHARACTER-18BB9;Lo;0;L;;;;;N;;;;; +18BBA;KHITAN SMALL SCRIPT CHARACTER-18BBA;Lo;0;L;;;;;N;;;;; +18BBB;KHITAN SMALL SCRIPT CHARACTER-18BBB;Lo;0;L;;;;;N;;;;; +18BBC;KHITAN SMALL SCRIPT CHARACTER-18BBC;Lo;0;L;;;;;N;;;;; +18BBD;KHITAN SMALL SCRIPT CHARACTER-18BBD;Lo;0;L;;;;;N;;;;; +18BBE;KHITAN SMALL SCRIPT CHARACTER-18BBE;Lo;0;L;;;;;N;;;;; +18BBF;KHITAN SMALL SCRIPT CHARACTER-18BBF;Lo;0;L;;;;;N;;;;; +18BC0;KHITAN SMALL SCRIPT CHARACTER-18BC0;Lo;0;L;;;;;N;;;;; +18BC1;KHITAN SMALL SCRIPT CHARACTER-18BC1;Lo;0;L;;;;;N;;;;; +18BC2;KHITAN SMALL SCRIPT CHARACTER-18BC2;Lo;0;L;;;;;N;;;;; +18BC3;KHITAN SMALL SCRIPT CHARACTER-18BC3;Lo;0;L;;;;;N;;;;; +18BC4;KHITAN SMALL SCRIPT CHARACTER-18BC4;Lo;0;L;;;;;N;;;;; +18BC5;KHITAN SMALL SCRIPT CHARACTER-18BC5;Lo;0;L;;;;;N;;;;; +18BC6;KHITAN SMALL SCRIPT CHARACTER-18BC6;Lo;0;L;;;;;N;;;;; +18BC7;KHITAN SMALL SCRIPT CHARACTER-18BC7;Lo;0;L;;;;;N;;;;; +18BC8;KHITAN SMALL SCRIPT CHARACTER-18BC8;Lo;0;L;;;;;N;;;;; +18BC9;KHITAN SMALL SCRIPT CHARACTER-18BC9;Lo;0;L;;;;;N;;;;; +18BCA;KHITAN SMALL SCRIPT CHARACTER-18BCA;Lo;0;L;;;;;N;;;;; +18BCB;KHITAN SMALL SCRIPT CHARACTER-18BCB;Lo;0;L;;;;;N;;;;; +18BCC;KHITAN SMALL SCRIPT CHARACTER-18BCC;Lo;0;L;;;;;N;;;;; +18BCD;KHITAN SMALL SCRIPT CHARACTER-18BCD;Lo;0;L;;;;;N;;;;; +18BCE;KHITAN SMALL SCRIPT CHARACTER-18BCE;Lo;0;L;;;;;N;;;;; +18BCF;KHITAN SMALL SCRIPT CHARACTER-18BCF;Lo;0;L;;;;;N;;;;; +18BD0;KHITAN SMALL SCRIPT CHARACTER-18BD0;Lo;0;L;;;;;N;;;;; +18BD1;KHITAN SMALL SCRIPT CHARACTER-18BD1;Lo;0;L;;;;;N;;;;; +18BD2;KHITAN SMALL SCRIPT CHARACTER-18BD2;Lo;0;L;;;;;N;;;;; +18BD3;KHITAN SMALL SCRIPT CHARACTER-18BD3;Lo;0;L;;;;;N;;;;; +18BD4;KHITAN SMALL SCRIPT CHARACTER-18BD4;Lo;0;L;;;;;N;;;;; +18BD5;KHITAN SMALL SCRIPT CHARACTER-18BD5;Lo;0;L;;;;;N;;;;; +18BD6;KHITAN SMALL SCRIPT CHARACTER-18BD6;Lo;0;L;;;;;N;;;;; +18BD7;KHITAN SMALL SCRIPT CHARACTER-18BD7;Lo;0;L;;;;;N;;;;; +18BD8;KHITAN SMALL SCRIPT CHARACTER-18BD8;Lo;0;L;;;;;N;;;;; +18BD9;KHITAN SMALL SCRIPT CHARACTER-18BD9;Lo;0;L;;;;;N;;;;; +18BDA;KHITAN SMALL SCRIPT CHARACTER-18BDA;Lo;0;L;;;;;N;;;;; +18BDB;KHITAN SMALL SCRIPT CHARACTER-18BDB;Lo;0;L;;;;;N;;;;; +18BDC;KHITAN SMALL SCRIPT CHARACTER-18BDC;Lo;0;L;;;;;N;;;;; +18BDD;KHITAN SMALL SCRIPT CHARACTER-18BDD;Lo;0;L;;;;;N;;;;; +18BDE;KHITAN SMALL SCRIPT CHARACTER-18BDE;Lo;0;L;;;;;N;;;;; +18BDF;KHITAN SMALL SCRIPT CHARACTER-18BDF;Lo;0;L;;;;;N;;;;; +18BE0;KHITAN SMALL SCRIPT CHARACTER-18BE0;Lo;0;L;;;;;N;;;;; +18BE1;KHITAN SMALL SCRIPT CHARACTER-18BE1;Lo;0;L;;;;;N;;;;; +18BE2;KHITAN SMALL SCRIPT CHARACTER-18BE2;Lo;0;L;;;;;N;;;;; +18BE3;KHITAN SMALL SCRIPT CHARACTER-18BE3;Lo;0;L;;;;;N;;;;; +18BE4;KHITAN SMALL SCRIPT CHARACTER-18BE4;Lo;0;L;;;;;N;;;;; +18BE5;KHITAN SMALL SCRIPT CHARACTER-18BE5;Lo;0;L;;;;;N;;;;; +18BE6;KHITAN SMALL SCRIPT CHARACTER-18BE6;Lo;0;L;;;;;N;;;;; +18BE7;KHITAN SMALL SCRIPT CHARACTER-18BE7;Lo;0;L;;;;;N;;;;; +18BE8;KHITAN SMALL SCRIPT CHARACTER-18BE8;Lo;0;L;;;;;N;;;;; +18BE9;KHITAN SMALL SCRIPT CHARACTER-18BE9;Lo;0;L;;;;;N;;;;; +18BEA;KHITAN SMALL SCRIPT CHARACTER-18BEA;Lo;0;L;;;;;N;;;;; +18BEB;KHITAN SMALL SCRIPT CHARACTER-18BEB;Lo;0;L;;;;;N;;;;; +18BEC;KHITAN SMALL SCRIPT CHARACTER-18BEC;Lo;0;L;;;;;N;;;;; +18BED;KHITAN SMALL SCRIPT CHARACTER-18BED;Lo;0;L;;;;;N;;;;; +18BEE;KHITAN SMALL SCRIPT CHARACTER-18BEE;Lo;0;L;;;;;N;;;;; +18BEF;KHITAN SMALL SCRIPT CHARACTER-18BEF;Lo;0;L;;;;;N;;;;; +18BF0;KHITAN SMALL SCRIPT CHARACTER-18BF0;Lo;0;L;;;;;N;;;;; +18BF1;KHITAN SMALL SCRIPT CHARACTER-18BF1;Lo;0;L;;;;;N;;;;; +18BF2;KHITAN SMALL SCRIPT CHARACTER-18BF2;Lo;0;L;;;;;N;;;;; +18BF3;KHITAN SMALL SCRIPT CHARACTER-18BF3;Lo;0;L;;;;;N;;;;; +18BF4;KHITAN SMALL SCRIPT CHARACTER-18BF4;Lo;0;L;;;;;N;;;;; +18BF5;KHITAN SMALL SCRIPT CHARACTER-18BF5;Lo;0;L;;;;;N;;;;; +18BF6;KHITAN SMALL SCRIPT CHARACTER-18BF6;Lo;0;L;;;;;N;;;;; +18BF7;KHITAN SMALL SCRIPT CHARACTER-18BF7;Lo;0;L;;;;;N;;;;; +18BF8;KHITAN SMALL SCRIPT CHARACTER-18BF8;Lo;0;L;;;;;N;;;;; +18BF9;KHITAN SMALL SCRIPT CHARACTER-18BF9;Lo;0;L;;;;;N;;;;; +18BFA;KHITAN SMALL SCRIPT CHARACTER-18BFA;Lo;0;L;;;;;N;;;;; +18BFB;KHITAN SMALL SCRIPT CHARACTER-18BFB;Lo;0;L;;;;;N;;;;; +18BFC;KHITAN SMALL SCRIPT CHARACTER-18BFC;Lo;0;L;;;;;N;;;;; +18BFD;KHITAN SMALL SCRIPT CHARACTER-18BFD;Lo;0;L;;;;;N;;;;; +18BFE;KHITAN SMALL SCRIPT CHARACTER-18BFE;Lo;0;L;;;;;N;;;;; +18BFF;KHITAN SMALL SCRIPT CHARACTER-18BFF;Lo;0;L;;;;;N;;;;; +18C00;KHITAN SMALL SCRIPT CHARACTER-18C00;Lo;0;L;;;;;N;;;;; +18C01;KHITAN SMALL SCRIPT CHARACTER-18C01;Lo;0;L;;;;;N;;;;; +18C02;KHITAN SMALL SCRIPT CHARACTER-18C02;Lo;0;L;;;;;N;;;;; +18C03;KHITAN SMALL SCRIPT CHARACTER-18C03;Lo;0;L;;;;;N;;;;; +18C04;KHITAN SMALL SCRIPT CHARACTER-18C04;Lo;0;L;;;;;N;;;;; +18C05;KHITAN SMALL SCRIPT CHARACTER-18C05;Lo;0;L;;;;;N;;;;; +18C06;KHITAN SMALL SCRIPT CHARACTER-18C06;Lo;0;L;;;;;N;;;;; +18C07;KHITAN SMALL SCRIPT CHARACTER-18C07;Lo;0;L;;;;;N;;;;; +18C08;KHITAN SMALL SCRIPT CHARACTER-18C08;Lo;0;L;;;;;N;;;;; +18C09;KHITAN SMALL SCRIPT CHARACTER-18C09;Lo;0;L;;;;;N;;;;; +18C0A;KHITAN SMALL SCRIPT CHARACTER-18C0A;Lo;0;L;;;;;N;;;;; +18C0B;KHITAN SMALL SCRIPT CHARACTER-18C0B;Lo;0;L;;;;;N;;;;; +18C0C;KHITAN SMALL SCRIPT CHARACTER-18C0C;Lo;0;L;;;;;N;;;;; +18C0D;KHITAN SMALL SCRIPT CHARACTER-18C0D;Lo;0;L;;;;;N;;;;; +18C0E;KHITAN SMALL SCRIPT CHARACTER-18C0E;Lo;0;L;;;;;N;;;;; +18C0F;KHITAN SMALL SCRIPT CHARACTER-18C0F;Lo;0;L;;;;;N;;;;; +18C10;KHITAN SMALL SCRIPT CHARACTER-18C10;Lo;0;L;;;;;N;;;;; +18C11;KHITAN SMALL SCRIPT CHARACTER-18C11;Lo;0;L;;;;;N;;;;; +18C12;KHITAN SMALL SCRIPT CHARACTER-18C12;Lo;0;L;;;;;N;;;;; +18C13;KHITAN SMALL SCRIPT CHARACTER-18C13;Lo;0;L;;;;;N;;;;; +18C14;KHITAN SMALL SCRIPT CHARACTER-18C14;Lo;0;L;;;;;N;;;;; +18C15;KHITAN SMALL SCRIPT CHARACTER-18C15;Lo;0;L;;;;;N;;;;; +18C16;KHITAN SMALL SCRIPT CHARACTER-18C16;Lo;0;L;;;;;N;;;;; +18C17;KHITAN SMALL SCRIPT CHARACTER-18C17;Lo;0;L;;;;;N;;;;; +18C18;KHITAN SMALL SCRIPT CHARACTER-18C18;Lo;0;L;;;;;N;;;;; +18C19;KHITAN SMALL SCRIPT CHARACTER-18C19;Lo;0;L;;;;;N;;;;; +18C1A;KHITAN SMALL SCRIPT CHARACTER-18C1A;Lo;0;L;;;;;N;;;;; +18C1B;KHITAN SMALL SCRIPT CHARACTER-18C1B;Lo;0;L;;;;;N;;;;; +18C1C;KHITAN SMALL SCRIPT CHARACTER-18C1C;Lo;0;L;;;;;N;;;;; +18C1D;KHITAN SMALL SCRIPT CHARACTER-18C1D;Lo;0;L;;;;;N;;;;; +18C1E;KHITAN SMALL SCRIPT CHARACTER-18C1E;Lo;0;L;;;;;N;;;;; +18C1F;KHITAN SMALL SCRIPT CHARACTER-18C1F;Lo;0;L;;;;;N;;;;; +18C20;KHITAN SMALL SCRIPT CHARACTER-18C20;Lo;0;L;;;;;N;;;;; +18C21;KHITAN SMALL SCRIPT CHARACTER-18C21;Lo;0;L;;;;;N;;;;; +18C22;KHITAN SMALL SCRIPT CHARACTER-18C22;Lo;0;L;;;;;N;;;;; +18C23;KHITAN SMALL SCRIPT CHARACTER-18C23;Lo;0;L;;;;;N;;;;; +18C24;KHITAN SMALL SCRIPT CHARACTER-18C24;Lo;0;L;;;;;N;;;;; +18C25;KHITAN SMALL SCRIPT CHARACTER-18C25;Lo;0;L;;;;;N;;;;; +18C26;KHITAN SMALL SCRIPT CHARACTER-18C26;Lo;0;L;;;;;N;;;;; +18C27;KHITAN SMALL SCRIPT CHARACTER-18C27;Lo;0;L;;;;;N;;;;; +18C28;KHITAN SMALL SCRIPT CHARACTER-18C28;Lo;0;L;;;;;N;;;;; +18C29;KHITAN SMALL SCRIPT CHARACTER-18C29;Lo;0;L;;;;;N;;;;; +18C2A;KHITAN SMALL SCRIPT CHARACTER-18C2A;Lo;0;L;;;;;N;;;;; +18C2B;KHITAN SMALL SCRIPT CHARACTER-18C2B;Lo;0;L;;;;;N;;;;; +18C2C;KHITAN SMALL SCRIPT CHARACTER-18C2C;Lo;0;L;;;;;N;;;;; +18C2D;KHITAN SMALL SCRIPT CHARACTER-18C2D;Lo;0;L;;;;;N;;;;; +18C2E;KHITAN SMALL SCRIPT CHARACTER-18C2E;Lo;0;L;;;;;N;;;;; +18C2F;KHITAN SMALL SCRIPT CHARACTER-18C2F;Lo;0;L;;;;;N;;;;; +18C30;KHITAN SMALL SCRIPT CHARACTER-18C30;Lo;0;L;;;;;N;;;;; +18C31;KHITAN SMALL SCRIPT CHARACTER-18C31;Lo;0;L;;;;;N;;;;; +18C32;KHITAN SMALL SCRIPT CHARACTER-18C32;Lo;0;L;;;;;N;;;;; +18C33;KHITAN SMALL SCRIPT CHARACTER-18C33;Lo;0;L;;;;;N;;;;; +18C34;KHITAN SMALL SCRIPT CHARACTER-18C34;Lo;0;L;;;;;N;;;;; +18C35;KHITAN SMALL SCRIPT CHARACTER-18C35;Lo;0;L;;;;;N;;;;; +18C36;KHITAN SMALL SCRIPT CHARACTER-18C36;Lo;0;L;;;;;N;;;;; +18C37;KHITAN SMALL SCRIPT CHARACTER-18C37;Lo;0;L;;;;;N;;;;; +18C38;KHITAN SMALL SCRIPT CHARACTER-18C38;Lo;0;L;;;;;N;;;;; +18C39;KHITAN SMALL SCRIPT CHARACTER-18C39;Lo;0;L;;;;;N;;;;; +18C3A;KHITAN SMALL SCRIPT CHARACTER-18C3A;Lo;0;L;;;;;N;;;;; +18C3B;KHITAN SMALL SCRIPT CHARACTER-18C3B;Lo;0;L;;;;;N;;;;; +18C3C;KHITAN SMALL SCRIPT CHARACTER-18C3C;Lo;0;L;;;;;N;;;;; +18C3D;KHITAN SMALL SCRIPT CHARACTER-18C3D;Lo;0;L;;;;;N;;;;; +18C3E;KHITAN SMALL SCRIPT CHARACTER-18C3E;Lo;0;L;;;;;N;;;;; +18C3F;KHITAN SMALL SCRIPT CHARACTER-18C3F;Lo;0;L;;;;;N;;;;; +18C40;KHITAN SMALL SCRIPT CHARACTER-18C40;Lo;0;L;;;;;N;;;;; +18C41;KHITAN SMALL SCRIPT CHARACTER-18C41;Lo;0;L;;;;;N;;;;; +18C42;KHITAN SMALL SCRIPT CHARACTER-18C42;Lo;0;L;;;;;N;;;;; +18C43;KHITAN SMALL SCRIPT CHARACTER-18C43;Lo;0;L;;;;;N;;;;; +18C44;KHITAN SMALL SCRIPT CHARACTER-18C44;Lo;0;L;;;;;N;;;;; +18C45;KHITAN SMALL SCRIPT CHARACTER-18C45;Lo;0;L;;;;;N;;;;; +18C46;KHITAN SMALL SCRIPT CHARACTER-18C46;Lo;0;L;;;;;N;;;;; +18C47;KHITAN SMALL SCRIPT CHARACTER-18C47;Lo;0;L;;;;;N;;;;; +18C48;KHITAN SMALL SCRIPT CHARACTER-18C48;Lo;0;L;;;;;N;;;;; +18C49;KHITAN SMALL SCRIPT CHARACTER-18C49;Lo;0;L;;;;;N;;;;; +18C4A;KHITAN SMALL SCRIPT CHARACTER-18C4A;Lo;0;L;;;;;N;;;;; +18C4B;KHITAN SMALL SCRIPT CHARACTER-18C4B;Lo;0;L;;;;;N;;;;; +18C4C;KHITAN SMALL SCRIPT CHARACTER-18C4C;Lo;0;L;;;;;N;;;;; +18C4D;KHITAN SMALL SCRIPT CHARACTER-18C4D;Lo;0;L;;;;;N;;;;; +18C4E;KHITAN SMALL SCRIPT CHARACTER-18C4E;Lo;0;L;;;;;N;;;;; +18C4F;KHITAN SMALL SCRIPT CHARACTER-18C4F;Lo;0;L;;;;;N;;;;; +18C50;KHITAN SMALL SCRIPT CHARACTER-18C50;Lo;0;L;;;;;N;;;;; +18C51;KHITAN SMALL SCRIPT CHARACTER-18C51;Lo;0;L;;;;;N;;;;; +18C52;KHITAN SMALL SCRIPT CHARACTER-18C52;Lo;0;L;;;;;N;;;;; +18C53;KHITAN SMALL SCRIPT CHARACTER-18C53;Lo;0;L;;;;;N;;;;; +18C54;KHITAN SMALL SCRIPT CHARACTER-18C54;Lo;0;L;;;;;N;;;;; +18C55;KHITAN SMALL SCRIPT CHARACTER-18C55;Lo;0;L;;;;;N;;;;; +18C56;KHITAN SMALL SCRIPT CHARACTER-18C56;Lo;0;L;;;;;N;;;;; +18C57;KHITAN SMALL SCRIPT CHARACTER-18C57;Lo;0;L;;;;;N;;;;; +18C58;KHITAN SMALL SCRIPT CHARACTER-18C58;Lo;0;L;;;;;N;;;;; +18C59;KHITAN SMALL SCRIPT CHARACTER-18C59;Lo;0;L;;;;;N;;;;; +18C5A;KHITAN SMALL SCRIPT CHARACTER-18C5A;Lo;0;L;;;;;N;;;;; +18C5B;KHITAN SMALL SCRIPT CHARACTER-18C5B;Lo;0;L;;;;;N;;;;; +18C5C;KHITAN SMALL SCRIPT CHARACTER-18C5C;Lo;0;L;;;;;N;;;;; +18C5D;KHITAN SMALL SCRIPT CHARACTER-18C5D;Lo;0;L;;;;;N;;;;; +18C5E;KHITAN SMALL SCRIPT CHARACTER-18C5E;Lo;0;L;;;;;N;;;;; +18C5F;KHITAN SMALL SCRIPT CHARACTER-18C5F;Lo;0;L;;;;;N;;;;; +18C60;KHITAN SMALL SCRIPT CHARACTER-18C60;Lo;0;L;;;;;N;;;;; +18C61;KHITAN SMALL SCRIPT CHARACTER-18C61;Lo;0;L;;;;;N;;;;; +18C62;KHITAN SMALL SCRIPT CHARACTER-18C62;Lo;0;L;;;;;N;;;;; +18C63;KHITAN SMALL SCRIPT CHARACTER-18C63;Lo;0;L;;;;;N;;;;; +18C64;KHITAN SMALL SCRIPT CHARACTER-18C64;Lo;0;L;;;;;N;;;;; +18C65;KHITAN SMALL SCRIPT CHARACTER-18C65;Lo;0;L;;;;;N;;;;; +18C66;KHITAN SMALL SCRIPT CHARACTER-18C66;Lo;0;L;;;;;N;;;;; +18C67;KHITAN SMALL SCRIPT CHARACTER-18C67;Lo;0;L;;;;;N;;;;; +18C68;KHITAN SMALL SCRIPT CHARACTER-18C68;Lo;0;L;;;;;N;;;;; +18C69;KHITAN SMALL SCRIPT CHARACTER-18C69;Lo;0;L;;;;;N;;;;; +18C6A;KHITAN SMALL SCRIPT CHARACTER-18C6A;Lo;0;L;;;;;N;;;;; +18C6B;KHITAN SMALL SCRIPT CHARACTER-18C6B;Lo;0;L;;;;;N;;;;; +18C6C;KHITAN SMALL SCRIPT CHARACTER-18C6C;Lo;0;L;;;;;N;;;;; +18C6D;KHITAN SMALL SCRIPT CHARACTER-18C6D;Lo;0;L;;;;;N;;;;; +18C6E;KHITAN SMALL SCRIPT CHARACTER-18C6E;Lo;0;L;;;;;N;;;;; +18C6F;KHITAN SMALL SCRIPT CHARACTER-18C6F;Lo;0;L;;;;;N;;;;; +18C70;KHITAN SMALL SCRIPT CHARACTER-18C70;Lo;0;L;;;;;N;;;;; +18C71;KHITAN SMALL SCRIPT CHARACTER-18C71;Lo;0;L;;;;;N;;;;; +18C72;KHITAN SMALL SCRIPT CHARACTER-18C72;Lo;0;L;;;;;N;;;;; +18C73;KHITAN SMALL SCRIPT CHARACTER-18C73;Lo;0;L;;;;;N;;;;; +18C74;KHITAN SMALL SCRIPT CHARACTER-18C74;Lo;0;L;;;;;N;;;;; +18C75;KHITAN SMALL SCRIPT CHARACTER-18C75;Lo;0;L;;;;;N;;;;; +18C76;KHITAN SMALL SCRIPT CHARACTER-18C76;Lo;0;L;;;;;N;;;;; +18C77;KHITAN SMALL SCRIPT CHARACTER-18C77;Lo;0;L;;;;;N;;;;; +18C78;KHITAN SMALL SCRIPT CHARACTER-18C78;Lo;0;L;;;;;N;;;;; +18C79;KHITAN SMALL SCRIPT CHARACTER-18C79;Lo;0;L;;;;;N;;;;; +18C7A;KHITAN SMALL SCRIPT CHARACTER-18C7A;Lo;0;L;;;;;N;;;;; +18C7B;KHITAN SMALL SCRIPT CHARACTER-18C7B;Lo;0;L;;;;;N;;;;; +18C7C;KHITAN SMALL SCRIPT CHARACTER-18C7C;Lo;0;L;;;;;N;;;;; +18C7D;KHITAN SMALL SCRIPT CHARACTER-18C7D;Lo;0;L;;;;;N;;;;; +18C7E;KHITAN SMALL SCRIPT CHARACTER-18C7E;Lo;0;L;;;;;N;;;;; +18C7F;KHITAN SMALL SCRIPT CHARACTER-18C7F;Lo;0;L;;;;;N;;;;; +18C80;KHITAN SMALL SCRIPT CHARACTER-18C80;Lo;0;L;;;;;N;;;;; +18C81;KHITAN SMALL SCRIPT CHARACTER-18C81;Lo;0;L;;;;;N;;;;; +18C82;KHITAN SMALL SCRIPT CHARACTER-18C82;Lo;0;L;;;;;N;;;;; +18C83;KHITAN SMALL SCRIPT CHARACTER-18C83;Lo;0;L;;;;;N;;;;; +18C84;KHITAN SMALL SCRIPT CHARACTER-18C84;Lo;0;L;;;;;N;;;;; +18C85;KHITAN SMALL SCRIPT CHARACTER-18C85;Lo;0;L;;;;;N;;;;; +18C86;KHITAN SMALL SCRIPT CHARACTER-18C86;Lo;0;L;;;;;N;;;;; +18C87;KHITAN SMALL SCRIPT CHARACTER-18C87;Lo;0;L;;;;;N;;;;; +18C88;KHITAN SMALL SCRIPT CHARACTER-18C88;Lo;0;L;;;;;N;;;;; +18C89;KHITAN SMALL SCRIPT CHARACTER-18C89;Lo;0;L;;;;;N;;;;; +18C8A;KHITAN SMALL SCRIPT CHARACTER-18C8A;Lo;0;L;;;;;N;;;;; +18C8B;KHITAN SMALL SCRIPT CHARACTER-18C8B;Lo;0;L;;;;;N;;;;; +18C8C;KHITAN SMALL SCRIPT CHARACTER-18C8C;Lo;0;L;;;;;N;;;;; +18C8D;KHITAN SMALL SCRIPT CHARACTER-18C8D;Lo;0;L;;;;;N;;;;; +18C8E;KHITAN SMALL SCRIPT CHARACTER-18C8E;Lo;0;L;;;;;N;;;;; +18C8F;KHITAN SMALL SCRIPT CHARACTER-18C8F;Lo;0;L;;;;;N;;;;; +18C90;KHITAN SMALL SCRIPT CHARACTER-18C90;Lo;0;L;;;;;N;;;;; +18C91;KHITAN SMALL SCRIPT CHARACTER-18C91;Lo;0;L;;;;;N;;;;; +18C92;KHITAN SMALL SCRIPT CHARACTER-18C92;Lo;0;L;;;;;N;;;;; +18C93;KHITAN SMALL SCRIPT CHARACTER-18C93;Lo;0;L;;;;;N;;;;; +18C94;KHITAN SMALL SCRIPT CHARACTER-18C94;Lo;0;L;;;;;N;;;;; +18C95;KHITAN SMALL SCRIPT CHARACTER-18C95;Lo;0;L;;;;;N;;;;; +18C96;KHITAN SMALL SCRIPT CHARACTER-18C96;Lo;0;L;;;;;N;;;;; +18C97;KHITAN SMALL SCRIPT CHARACTER-18C97;Lo;0;L;;;;;N;;;;; +18C98;KHITAN SMALL SCRIPT CHARACTER-18C98;Lo;0;L;;;;;N;;;;; +18C99;KHITAN SMALL SCRIPT CHARACTER-18C99;Lo;0;L;;;;;N;;;;; +18C9A;KHITAN SMALL SCRIPT CHARACTER-18C9A;Lo;0;L;;;;;N;;;;; +18C9B;KHITAN SMALL SCRIPT CHARACTER-18C9B;Lo;0;L;;;;;N;;;;; +18C9C;KHITAN SMALL SCRIPT CHARACTER-18C9C;Lo;0;L;;;;;N;;;;; +18C9D;KHITAN SMALL SCRIPT CHARACTER-18C9D;Lo;0;L;;;;;N;;;;; +18C9E;KHITAN SMALL SCRIPT CHARACTER-18C9E;Lo;0;L;;;;;N;;;;; +18C9F;KHITAN SMALL SCRIPT CHARACTER-18C9F;Lo;0;L;;;;;N;;;;; +18CA0;KHITAN SMALL SCRIPT CHARACTER-18CA0;Lo;0;L;;;;;N;;;;; +18CA1;KHITAN SMALL SCRIPT CHARACTER-18CA1;Lo;0;L;;;;;N;;;;; +18CA2;KHITAN SMALL SCRIPT CHARACTER-18CA2;Lo;0;L;;;;;N;;;;; +18CA3;KHITAN SMALL SCRIPT CHARACTER-18CA3;Lo;0;L;;;;;N;;;;; +18CA4;KHITAN SMALL SCRIPT CHARACTER-18CA4;Lo;0;L;;;;;N;;;;; +18CA5;KHITAN SMALL SCRIPT CHARACTER-18CA5;Lo;0;L;;;;;N;;;;; +18CA6;KHITAN SMALL SCRIPT CHARACTER-18CA6;Lo;0;L;;;;;N;;;;; +18CA7;KHITAN SMALL SCRIPT CHARACTER-18CA7;Lo;0;L;;;;;N;;;;; +18CA8;KHITAN SMALL SCRIPT CHARACTER-18CA8;Lo;0;L;;;;;N;;;;; +18CA9;KHITAN SMALL SCRIPT CHARACTER-18CA9;Lo;0;L;;;;;N;;;;; +18CAA;KHITAN SMALL SCRIPT CHARACTER-18CAA;Lo;0;L;;;;;N;;;;; +18CAB;KHITAN SMALL SCRIPT CHARACTER-18CAB;Lo;0;L;;;;;N;;;;; +18CAC;KHITAN SMALL SCRIPT CHARACTER-18CAC;Lo;0;L;;;;;N;;;;; +18CAD;KHITAN SMALL SCRIPT CHARACTER-18CAD;Lo;0;L;;;;;N;;;;; +18CAE;KHITAN SMALL SCRIPT CHARACTER-18CAE;Lo;0;L;;;;;N;;;;; +18CAF;KHITAN SMALL SCRIPT CHARACTER-18CAF;Lo;0;L;;;;;N;;;;; +18CB0;KHITAN SMALL SCRIPT CHARACTER-18CB0;Lo;0;L;;;;;N;;;;; +18CB1;KHITAN SMALL SCRIPT CHARACTER-18CB1;Lo;0;L;;;;;N;;;;; +18CB2;KHITAN SMALL SCRIPT CHARACTER-18CB2;Lo;0;L;;;;;N;;;;; +18CB3;KHITAN SMALL SCRIPT CHARACTER-18CB3;Lo;0;L;;;;;N;;;;; +18CB4;KHITAN SMALL SCRIPT CHARACTER-18CB4;Lo;0;L;;;;;N;;;;; +18CB5;KHITAN SMALL SCRIPT CHARACTER-18CB5;Lo;0;L;;;;;N;;;;; +18CB6;KHITAN SMALL SCRIPT CHARACTER-18CB6;Lo;0;L;;;;;N;;;;; +18CB7;KHITAN SMALL SCRIPT CHARACTER-18CB7;Lo;0;L;;;;;N;;;;; +18CB8;KHITAN SMALL SCRIPT CHARACTER-18CB8;Lo;0;L;;;;;N;;;;; +18CB9;KHITAN SMALL SCRIPT CHARACTER-18CB9;Lo;0;L;;;;;N;;;;; +18CBA;KHITAN SMALL SCRIPT CHARACTER-18CBA;Lo;0;L;;;;;N;;;;; +18CBB;KHITAN SMALL SCRIPT CHARACTER-18CBB;Lo;0;L;;;;;N;;;;; +18CBC;KHITAN SMALL SCRIPT CHARACTER-18CBC;Lo;0;L;;;;;N;;;;; +18CBD;KHITAN SMALL SCRIPT CHARACTER-18CBD;Lo;0;L;;;;;N;;;;; +18CBE;KHITAN SMALL SCRIPT CHARACTER-18CBE;Lo;0;L;;;;;N;;;;; +18CBF;KHITAN SMALL SCRIPT CHARACTER-18CBF;Lo;0;L;;;;;N;;;;; +18CC0;KHITAN SMALL SCRIPT CHARACTER-18CC0;Lo;0;L;;;;;N;;;;; +18CC1;KHITAN SMALL SCRIPT CHARACTER-18CC1;Lo;0;L;;;;;N;;;;; +18CC2;KHITAN SMALL SCRIPT CHARACTER-18CC2;Lo;0;L;;;;;N;;;;; +18CC3;KHITAN SMALL SCRIPT CHARACTER-18CC3;Lo;0;L;;;;;N;;;;; +18CC4;KHITAN SMALL SCRIPT CHARACTER-18CC4;Lo;0;L;;;;;N;;;;; +18CC5;KHITAN SMALL SCRIPT CHARACTER-18CC5;Lo;0;L;;;;;N;;;;; +18CC6;KHITAN SMALL SCRIPT CHARACTER-18CC6;Lo;0;L;;;;;N;;;;; +18CC7;KHITAN SMALL SCRIPT CHARACTER-18CC7;Lo;0;L;;;;;N;;;;; +18CC8;KHITAN SMALL SCRIPT CHARACTER-18CC8;Lo;0;L;;;;;N;;;;; +18CC9;KHITAN SMALL SCRIPT CHARACTER-18CC9;Lo;0;L;;;;;N;;;;; +18CCA;KHITAN SMALL SCRIPT CHARACTER-18CCA;Lo;0;L;;;;;N;;;;; +18CCB;KHITAN SMALL SCRIPT CHARACTER-18CCB;Lo;0;L;;;;;N;;;;; +18CCC;KHITAN SMALL SCRIPT CHARACTER-18CCC;Lo;0;L;;;;;N;;;;; +18CCD;KHITAN SMALL SCRIPT CHARACTER-18CCD;Lo;0;L;;;;;N;;;;; +18CCE;KHITAN SMALL SCRIPT CHARACTER-18CCE;Lo;0;L;;;;;N;;;;; +18CCF;KHITAN SMALL SCRIPT CHARACTER-18CCF;Lo;0;L;;;;;N;;;;; +18CD0;KHITAN SMALL SCRIPT CHARACTER-18CD0;Lo;0;L;;;;;N;;;;; +18CD1;KHITAN SMALL SCRIPT CHARACTER-18CD1;Lo;0;L;;;;;N;;;;; +18CD2;KHITAN SMALL SCRIPT CHARACTER-18CD2;Lo;0;L;;;;;N;;;;; +18CD3;KHITAN SMALL SCRIPT CHARACTER-18CD3;Lo;0;L;;;;;N;;;;; +18CD4;KHITAN SMALL SCRIPT CHARACTER-18CD4;Lo;0;L;;;;;N;;;;; +18CD5;KHITAN SMALL SCRIPT CHARACTER-18CD5;Lo;0;L;;;;;N;;;;; +18D00;<Tangut Ideograph Supplement, First>;Lo;0;L;;;;;N;;;;; +18D08;<Tangut Ideograph Supplement, Last>;Lo;0;L;;;;;N;;;;; +1AFF0;KATAKANA LETTER MINNAN TONE-2;Lm;0;L;;;;;N;;;;; +1AFF1;KATAKANA LETTER MINNAN TONE-3;Lm;0;L;;;;;N;;;;; +1AFF2;KATAKANA LETTER MINNAN TONE-4;Lm;0;L;;;;;N;;;;; +1AFF3;KATAKANA LETTER MINNAN TONE-5;Lm;0;L;;;;;N;;;;; +1AFF5;KATAKANA LETTER MINNAN TONE-7;Lm;0;L;;;;;N;;;;; +1AFF6;KATAKANA LETTER MINNAN TONE-8;Lm;0;L;;;;;N;;;;; +1AFF7;KATAKANA LETTER MINNAN NASALIZED TONE-1;Lm;0;L;;;;;N;;;;; +1AFF8;KATAKANA LETTER MINNAN NASALIZED TONE-2;Lm;0;L;;;;;N;;;;; +1AFF9;KATAKANA LETTER MINNAN NASALIZED TONE-3;Lm;0;L;;;;;N;;;;; +1AFFA;KATAKANA LETTER MINNAN NASALIZED TONE-4;Lm;0;L;;;;;N;;;;; +1AFFB;KATAKANA LETTER MINNAN NASALIZED TONE-5;Lm;0;L;;;;;N;;;;; +1AFFD;KATAKANA LETTER MINNAN NASALIZED TONE-7;Lm;0;L;;;;;N;;;;; +1AFFE;KATAKANA LETTER MINNAN NASALIZED TONE-8;Lm;0;L;;;;;N;;;;; +1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; +1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B002;HENTAIGANA LETTER A-1;Lo;0;L;;;;;N;;;;; +1B003;HENTAIGANA LETTER A-2;Lo;0;L;;;;;N;;;;; +1B004;HENTAIGANA LETTER A-3;Lo;0;L;;;;;N;;;;; +1B005;HENTAIGANA LETTER A-WO;Lo;0;L;;;;;N;;;;; +1B006;HENTAIGANA LETTER I-1;Lo;0;L;;;;;N;;;;; +1B007;HENTAIGANA LETTER I-2;Lo;0;L;;;;;N;;;;; +1B008;HENTAIGANA LETTER I-3;Lo;0;L;;;;;N;;;;; +1B009;HENTAIGANA LETTER I-4;Lo;0;L;;;;;N;;;;; +1B00A;HENTAIGANA LETTER U-1;Lo;0;L;;;;;N;;;;; +1B00B;HENTAIGANA LETTER U-2;Lo;0;L;;;;;N;;;;; +1B00C;HENTAIGANA LETTER U-3;Lo;0;L;;;;;N;;;;; +1B00D;HENTAIGANA LETTER U-4;Lo;0;L;;;;;N;;;;; +1B00E;HENTAIGANA LETTER U-5;Lo;0;L;;;;;N;;;;; +1B00F;HENTAIGANA LETTER E-2;Lo;0;L;;;;;N;;;;; +1B010;HENTAIGANA LETTER E-3;Lo;0;L;;;;;N;;;;; +1B011;HENTAIGANA LETTER E-4;Lo;0;L;;;;;N;;;;; +1B012;HENTAIGANA LETTER E-5;Lo;0;L;;;;;N;;;;; +1B013;HENTAIGANA LETTER E-6;Lo;0;L;;;;;N;;;;; +1B014;HENTAIGANA LETTER O-1;Lo;0;L;;;;;N;;;;; +1B015;HENTAIGANA LETTER O-2;Lo;0;L;;;;;N;;;;; +1B016;HENTAIGANA LETTER O-3;Lo;0;L;;;;;N;;;;; +1B017;HENTAIGANA LETTER KA-1;Lo;0;L;;;;;N;;;;; +1B018;HENTAIGANA LETTER KA-2;Lo;0;L;;;;;N;;;;; +1B019;HENTAIGANA LETTER KA-3;Lo;0;L;;;;;N;;;;; +1B01A;HENTAIGANA LETTER KA-4;Lo;0;L;;;;;N;;;;; +1B01B;HENTAIGANA LETTER KA-5;Lo;0;L;;;;;N;;;;; +1B01C;HENTAIGANA LETTER KA-6;Lo;0;L;;;;;N;;;;; +1B01D;HENTAIGANA LETTER KA-7;Lo;0;L;;;;;N;;;;; +1B01E;HENTAIGANA LETTER KA-8;Lo;0;L;;;;;N;;;;; +1B01F;HENTAIGANA LETTER KA-9;Lo;0;L;;;;;N;;;;; +1B020;HENTAIGANA LETTER KA-10;Lo;0;L;;;;;N;;;;; +1B021;HENTAIGANA LETTER KA-11;Lo;0;L;;;;;N;;;;; +1B022;HENTAIGANA LETTER KA-KE;Lo;0;L;;;;;N;;;;; +1B023;HENTAIGANA LETTER KI-1;Lo;0;L;;;;;N;;;;; +1B024;HENTAIGANA LETTER KI-2;Lo;0;L;;;;;N;;;;; +1B025;HENTAIGANA LETTER KI-3;Lo;0;L;;;;;N;;;;; +1B026;HENTAIGANA LETTER KI-4;Lo;0;L;;;;;N;;;;; +1B027;HENTAIGANA LETTER KI-5;Lo;0;L;;;;;N;;;;; +1B028;HENTAIGANA LETTER KI-6;Lo;0;L;;;;;N;;;;; +1B029;HENTAIGANA LETTER KI-7;Lo;0;L;;;;;N;;;;; +1B02A;HENTAIGANA LETTER KI-8;Lo;0;L;;;;;N;;;;; +1B02B;HENTAIGANA LETTER KU-1;Lo;0;L;;;;;N;;;;; +1B02C;HENTAIGANA LETTER KU-2;Lo;0;L;;;;;N;;;;; +1B02D;HENTAIGANA LETTER KU-3;Lo;0;L;;;;;N;;;;; +1B02E;HENTAIGANA LETTER KU-4;Lo;0;L;;;;;N;;;;; +1B02F;HENTAIGANA LETTER KU-5;Lo;0;L;;;;;N;;;;; +1B030;HENTAIGANA LETTER KU-6;Lo;0;L;;;;;N;;;;; +1B031;HENTAIGANA LETTER KU-7;Lo;0;L;;;;;N;;;;; +1B032;HENTAIGANA LETTER KE-1;Lo;0;L;;;;;N;;;;; +1B033;HENTAIGANA LETTER KE-2;Lo;0;L;;;;;N;;;;; +1B034;HENTAIGANA LETTER KE-3;Lo;0;L;;;;;N;;;;; +1B035;HENTAIGANA LETTER KE-4;Lo;0;L;;;;;N;;;;; +1B036;HENTAIGANA LETTER KE-5;Lo;0;L;;;;;N;;;;; +1B037;HENTAIGANA LETTER KE-6;Lo;0;L;;;;;N;;;;; +1B038;HENTAIGANA LETTER KO-1;Lo;0;L;;;;;N;;;;; +1B039;HENTAIGANA LETTER KO-2;Lo;0;L;;;;;N;;;;; +1B03A;HENTAIGANA LETTER KO-3;Lo;0;L;;;;;N;;;;; +1B03B;HENTAIGANA LETTER KO-KI;Lo;0;L;;;;;N;;;;; +1B03C;HENTAIGANA LETTER SA-1;Lo;0;L;;;;;N;;;;; +1B03D;HENTAIGANA LETTER SA-2;Lo;0;L;;;;;N;;;;; +1B03E;HENTAIGANA LETTER SA-3;Lo;0;L;;;;;N;;;;; +1B03F;HENTAIGANA LETTER SA-4;Lo;0;L;;;;;N;;;;; +1B040;HENTAIGANA LETTER SA-5;Lo;0;L;;;;;N;;;;; +1B041;HENTAIGANA LETTER SA-6;Lo;0;L;;;;;N;;;;; +1B042;HENTAIGANA LETTER SA-7;Lo;0;L;;;;;N;;;;; +1B043;HENTAIGANA LETTER SA-8;Lo;0;L;;;;;N;;;;; +1B044;HENTAIGANA LETTER SI-1;Lo;0;L;;;;;N;;;;; +1B045;HENTAIGANA LETTER SI-2;Lo;0;L;;;;;N;;;;; +1B046;HENTAIGANA LETTER SI-3;Lo;0;L;;;;;N;;;;; +1B047;HENTAIGANA LETTER SI-4;Lo;0;L;;;;;N;;;;; +1B048;HENTAIGANA LETTER SI-5;Lo;0;L;;;;;N;;;;; +1B049;HENTAIGANA LETTER SI-6;Lo;0;L;;;;;N;;;;; +1B04A;HENTAIGANA LETTER SU-1;Lo;0;L;;;;;N;;;;; +1B04B;HENTAIGANA LETTER SU-2;Lo;0;L;;;;;N;;;;; +1B04C;HENTAIGANA LETTER SU-3;Lo;0;L;;;;;N;;;;; +1B04D;HENTAIGANA LETTER SU-4;Lo;0;L;;;;;N;;;;; +1B04E;HENTAIGANA LETTER SU-5;Lo;0;L;;;;;N;;;;; +1B04F;HENTAIGANA LETTER SU-6;Lo;0;L;;;;;N;;;;; +1B050;HENTAIGANA LETTER SU-7;Lo;0;L;;;;;N;;;;; +1B051;HENTAIGANA LETTER SU-8;Lo;0;L;;;;;N;;;;; +1B052;HENTAIGANA LETTER SE-1;Lo;0;L;;;;;N;;;;; +1B053;HENTAIGANA LETTER SE-2;Lo;0;L;;;;;N;;;;; +1B054;HENTAIGANA LETTER SE-3;Lo;0;L;;;;;N;;;;; +1B055;HENTAIGANA LETTER SE-4;Lo;0;L;;;;;N;;;;; +1B056;HENTAIGANA LETTER SE-5;Lo;0;L;;;;;N;;;;; +1B057;HENTAIGANA LETTER SO-1;Lo;0;L;;;;;N;;;;; +1B058;HENTAIGANA LETTER SO-2;Lo;0;L;;;;;N;;;;; +1B059;HENTAIGANA LETTER SO-3;Lo;0;L;;;;;N;;;;; +1B05A;HENTAIGANA LETTER SO-4;Lo;0;L;;;;;N;;;;; +1B05B;HENTAIGANA LETTER SO-5;Lo;0;L;;;;;N;;;;; +1B05C;HENTAIGANA LETTER SO-6;Lo;0;L;;;;;N;;;;; +1B05D;HENTAIGANA LETTER SO-7;Lo;0;L;;;;;N;;;;; +1B05E;HENTAIGANA LETTER TA-1;Lo;0;L;;;;;N;;;;; +1B05F;HENTAIGANA LETTER TA-2;Lo;0;L;;;;;N;;;;; +1B060;HENTAIGANA LETTER TA-3;Lo;0;L;;;;;N;;;;; +1B061;HENTAIGANA LETTER TA-4;Lo;0;L;;;;;N;;;;; +1B062;HENTAIGANA LETTER TI-1;Lo;0;L;;;;;N;;;;; +1B063;HENTAIGANA LETTER TI-2;Lo;0;L;;;;;N;;;;; +1B064;HENTAIGANA LETTER TI-3;Lo;0;L;;;;;N;;;;; +1B065;HENTAIGANA LETTER TI-4;Lo;0;L;;;;;N;;;;; +1B066;HENTAIGANA LETTER TI-5;Lo;0;L;;;;;N;;;;; +1B067;HENTAIGANA LETTER TI-6;Lo;0;L;;;;;N;;;;; +1B068;HENTAIGANA LETTER TI-7;Lo;0;L;;;;;N;;;;; +1B069;HENTAIGANA LETTER TU-1;Lo;0;L;;;;;N;;;;; +1B06A;HENTAIGANA LETTER TU-2;Lo;0;L;;;;;N;;;;; +1B06B;HENTAIGANA LETTER TU-3;Lo;0;L;;;;;N;;;;; +1B06C;HENTAIGANA LETTER TU-4;Lo;0;L;;;;;N;;;;; +1B06D;HENTAIGANA LETTER TU-TO;Lo;0;L;;;;;N;;;;; +1B06E;HENTAIGANA LETTER TE-1;Lo;0;L;;;;;N;;;;; +1B06F;HENTAIGANA LETTER TE-2;Lo;0;L;;;;;N;;;;; +1B070;HENTAIGANA LETTER TE-3;Lo;0;L;;;;;N;;;;; +1B071;HENTAIGANA LETTER TE-4;Lo;0;L;;;;;N;;;;; +1B072;HENTAIGANA LETTER TE-5;Lo;0;L;;;;;N;;;;; +1B073;HENTAIGANA LETTER TE-6;Lo;0;L;;;;;N;;;;; +1B074;HENTAIGANA LETTER TE-7;Lo;0;L;;;;;N;;;;; +1B075;HENTAIGANA LETTER TE-8;Lo;0;L;;;;;N;;;;; +1B076;HENTAIGANA LETTER TE-9;Lo;0;L;;;;;N;;;;; +1B077;HENTAIGANA LETTER TO-1;Lo;0;L;;;;;N;;;;; +1B078;HENTAIGANA LETTER TO-2;Lo;0;L;;;;;N;;;;; +1B079;HENTAIGANA LETTER TO-3;Lo;0;L;;;;;N;;;;; +1B07A;HENTAIGANA LETTER TO-4;Lo;0;L;;;;;N;;;;; +1B07B;HENTAIGANA LETTER TO-5;Lo;0;L;;;;;N;;;;; +1B07C;HENTAIGANA LETTER TO-6;Lo;0;L;;;;;N;;;;; +1B07D;HENTAIGANA LETTER TO-RA;Lo;0;L;;;;;N;;;;; +1B07E;HENTAIGANA LETTER NA-1;Lo;0;L;;;;;N;;;;; +1B07F;HENTAIGANA LETTER NA-2;Lo;0;L;;;;;N;;;;; +1B080;HENTAIGANA LETTER NA-3;Lo;0;L;;;;;N;;;;; +1B081;HENTAIGANA LETTER NA-4;Lo;0;L;;;;;N;;;;; +1B082;HENTAIGANA LETTER NA-5;Lo;0;L;;;;;N;;;;; +1B083;HENTAIGANA LETTER NA-6;Lo;0;L;;;;;N;;;;; +1B084;HENTAIGANA LETTER NA-7;Lo;0;L;;;;;N;;;;; +1B085;HENTAIGANA LETTER NA-8;Lo;0;L;;;;;N;;;;; +1B086;HENTAIGANA LETTER NA-9;Lo;0;L;;;;;N;;;;; +1B087;HENTAIGANA LETTER NI-1;Lo;0;L;;;;;N;;;;; +1B088;HENTAIGANA LETTER NI-2;Lo;0;L;;;;;N;;;;; +1B089;HENTAIGANA LETTER NI-3;Lo;0;L;;;;;N;;;;; +1B08A;HENTAIGANA LETTER NI-4;Lo;0;L;;;;;N;;;;; +1B08B;HENTAIGANA LETTER NI-5;Lo;0;L;;;;;N;;;;; +1B08C;HENTAIGANA LETTER NI-6;Lo;0;L;;;;;N;;;;; +1B08D;HENTAIGANA LETTER NI-7;Lo;0;L;;;;;N;;;;; +1B08E;HENTAIGANA LETTER NI-TE;Lo;0;L;;;;;N;;;;; +1B08F;HENTAIGANA LETTER NU-1;Lo;0;L;;;;;N;;;;; +1B090;HENTAIGANA LETTER NU-2;Lo;0;L;;;;;N;;;;; +1B091;HENTAIGANA LETTER NU-3;Lo;0;L;;;;;N;;;;; +1B092;HENTAIGANA LETTER NE-1;Lo;0;L;;;;;N;;;;; +1B093;HENTAIGANA LETTER NE-2;Lo;0;L;;;;;N;;;;; +1B094;HENTAIGANA LETTER NE-3;Lo;0;L;;;;;N;;;;; +1B095;HENTAIGANA LETTER NE-4;Lo;0;L;;;;;N;;;;; +1B096;HENTAIGANA LETTER NE-5;Lo;0;L;;;;;N;;;;; +1B097;HENTAIGANA LETTER NE-6;Lo;0;L;;;;;N;;;;; +1B098;HENTAIGANA LETTER NE-KO;Lo;0;L;;;;;N;;;;; +1B099;HENTAIGANA LETTER NO-1;Lo;0;L;;;;;N;;;;; +1B09A;HENTAIGANA LETTER NO-2;Lo;0;L;;;;;N;;;;; +1B09B;HENTAIGANA LETTER NO-3;Lo;0;L;;;;;N;;;;; +1B09C;HENTAIGANA LETTER NO-4;Lo;0;L;;;;;N;;;;; +1B09D;HENTAIGANA LETTER NO-5;Lo;0;L;;;;;N;;;;; +1B09E;HENTAIGANA LETTER HA-1;Lo;0;L;;;;;N;;;;; +1B09F;HENTAIGANA LETTER HA-2;Lo;0;L;;;;;N;;;;; +1B0A0;HENTAIGANA LETTER HA-3;Lo;0;L;;;;;N;;;;; +1B0A1;HENTAIGANA LETTER HA-4;Lo;0;L;;;;;N;;;;; +1B0A2;HENTAIGANA LETTER HA-5;Lo;0;L;;;;;N;;;;; +1B0A3;HENTAIGANA LETTER HA-6;Lo;0;L;;;;;N;;;;; +1B0A4;HENTAIGANA LETTER HA-7;Lo;0;L;;;;;N;;;;; +1B0A5;HENTAIGANA LETTER HA-8;Lo;0;L;;;;;N;;;;; +1B0A6;HENTAIGANA LETTER HA-9;Lo;0;L;;;;;N;;;;; +1B0A7;HENTAIGANA LETTER HA-10;Lo;0;L;;;;;N;;;;; +1B0A8;HENTAIGANA LETTER HA-11;Lo;0;L;;;;;N;;;;; +1B0A9;HENTAIGANA LETTER HI-1;Lo;0;L;;;;;N;;;;; +1B0AA;HENTAIGANA LETTER HI-2;Lo;0;L;;;;;N;;;;; +1B0AB;HENTAIGANA LETTER HI-3;Lo;0;L;;;;;N;;;;; +1B0AC;HENTAIGANA LETTER HI-4;Lo;0;L;;;;;N;;;;; +1B0AD;HENTAIGANA LETTER HI-5;Lo;0;L;;;;;N;;;;; +1B0AE;HENTAIGANA LETTER HI-6;Lo;0;L;;;;;N;;;;; +1B0AF;HENTAIGANA LETTER HI-7;Lo;0;L;;;;;N;;;;; +1B0B0;HENTAIGANA LETTER HU-1;Lo;0;L;;;;;N;;;;; +1B0B1;HENTAIGANA LETTER HU-2;Lo;0;L;;;;;N;;;;; +1B0B2;HENTAIGANA LETTER HU-3;Lo;0;L;;;;;N;;;;; +1B0B3;HENTAIGANA LETTER HE-1;Lo;0;L;;;;;N;;;;; +1B0B4;HENTAIGANA LETTER HE-2;Lo;0;L;;;;;N;;;;; +1B0B5;HENTAIGANA LETTER HE-3;Lo;0;L;;;;;N;;;;; +1B0B6;HENTAIGANA LETTER HE-4;Lo;0;L;;;;;N;;;;; +1B0B7;HENTAIGANA LETTER HE-5;Lo;0;L;;;;;N;;;;; +1B0B8;HENTAIGANA LETTER HE-6;Lo;0;L;;;;;N;;;;; +1B0B9;HENTAIGANA LETTER HE-7;Lo;0;L;;;;;N;;;;; +1B0BA;HENTAIGANA LETTER HO-1;Lo;0;L;;;;;N;;;;; +1B0BB;HENTAIGANA LETTER HO-2;Lo;0;L;;;;;N;;;;; +1B0BC;HENTAIGANA LETTER HO-3;Lo;0;L;;;;;N;;;;; +1B0BD;HENTAIGANA LETTER HO-4;Lo;0;L;;;;;N;;;;; +1B0BE;HENTAIGANA LETTER HO-5;Lo;0;L;;;;;N;;;;; +1B0BF;HENTAIGANA LETTER HO-6;Lo;0;L;;;;;N;;;;; +1B0C0;HENTAIGANA LETTER HO-7;Lo;0;L;;;;;N;;;;; +1B0C1;HENTAIGANA LETTER HO-8;Lo;0;L;;;;;N;;;;; +1B0C2;HENTAIGANA LETTER MA-1;Lo;0;L;;;;;N;;;;; +1B0C3;HENTAIGANA LETTER MA-2;Lo;0;L;;;;;N;;;;; +1B0C4;HENTAIGANA LETTER MA-3;Lo;0;L;;;;;N;;;;; +1B0C5;HENTAIGANA LETTER MA-4;Lo;0;L;;;;;N;;;;; +1B0C6;HENTAIGANA LETTER MA-5;Lo;0;L;;;;;N;;;;; +1B0C7;HENTAIGANA LETTER MA-6;Lo;0;L;;;;;N;;;;; +1B0C8;HENTAIGANA LETTER MA-7;Lo;0;L;;;;;N;;;;; +1B0C9;HENTAIGANA LETTER MI-1;Lo;0;L;;;;;N;;;;; +1B0CA;HENTAIGANA LETTER MI-2;Lo;0;L;;;;;N;;;;; +1B0CB;HENTAIGANA LETTER MI-3;Lo;0;L;;;;;N;;;;; +1B0CC;HENTAIGANA LETTER MI-4;Lo;0;L;;;;;N;;;;; +1B0CD;HENTAIGANA LETTER MI-5;Lo;0;L;;;;;N;;;;; +1B0CE;HENTAIGANA LETTER MI-6;Lo;0;L;;;;;N;;;;; +1B0CF;HENTAIGANA LETTER MI-7;Lo;0;L;;;;;N;;;;; +1B0D0;HENTAIGANA LETTER MU-1;Lo;0;L;;;;;N;;;;; +1B0D1;HENTAIGANA LETTER MU-2;Lo;0;L;;;;;N;;;;; +1B0D2;HENTAIGANA LETTER MU-3;Lo;0;L;;;;;N;;;;; +1B0D3;HENTAIGANA LETTER MU-4;Lo;0;L;;;;;N;;;;; +1B0D4;HENTAIGANA LETTER ME-1;Lo;0;L;;;;;N;;;;; +1B0D5;HENTAIGANA LETTER ME-2;Lo;0;L;;;;;N;;;;; +1B0D6;HENTAIGANA LETTER ME-MA;Lo;0;L;;;;;N;;;;; +1B0D7;HENTAIGANA LETTER MO-1;Lo;0;L;;;;;N;;;;; +1B0D8;HENTAIGANA LETTER MO-2;Lo;0;L;;;;;N;;;;; +1B0D9;HENTAIGANA LETTER MO-3;Lo;0;L;;;;;N;;;;; +1B0DA;HENTAIGANA LETTER MO-4;Lo;0;L;;;;;N;;;;; +1B0DB;HENTAIGANA LETTER MO-5;Lo;0;L;;;;;N;;;;; +1B0DC;HENTAIGANA LETTER MO-6;Lo;0;L;;;;;N;;;;; +1B0DD;HENTAIGANA LETTER YA-1;Lo;0;L;;;;;N;;;;; +1B0DE;HENTAIGANA LETTER YA-2;Lo;0;L;;;;;N;;;;; +1B0DF;HENTAIGANA LETTER YA-3;Lo;0;L;;;;;N;;;;; +1B0E0;HENTAIGANA LETTER YA-4;Lo;0;L;;;;;N;;;;; +1B0E1;HENTAIGANA LETTER YA-5;Lo;0;L;;;;;N;;;;; +1B0E2;HENTAIGANA LETTER YA-YO;Lo;0;L;;;;;N;;;;; +1B0E3;HENTAIGANA LETTER YU-1;Lo;0;L;;;;;N;;;;; +1B0E4;HENTAIGANA LETTER YU-2;Lo;0;L;;;;;N;;;;; +1B0E5;HENTAIGANA LETTER YU-3;Lo;0;L;;;;;N;;;;; +1B0E6;HENTAIGANA LETTER YU-4;Lo;0;L;;;;;N;;;;; +1B0E7;HENTAIGANA LETTER YO-1;Lo;0;L;;;;;N;;;;; +1B0E8;HENTAIGANA LETTER YO-2;Lo;0;L;;;;;N;;;;; +1B0E9;HENTAIGANA LETTER YO-3;Lo;0;L;;;;;N;;;;; +1B0EA;HENTAIGANA LETTER YO-4;Lo;0;L;;;;;N;;;;; +1B0EB;HENTAIGANA LETTER YO-5;Lo;0;L;;;;;N;;;;; +1B0EC;HENTAIGANA LETTER YO-6;Lo;0;L;;;;;N;;;;; +1B0ED;HENTAIGANA LETTER RA-1;Lo;0;L;;;;;N;;;;; +1B0EE;HENTAIGANA LETTER RA-2;Lo;0;L;;;;;N;;;;; +1B0EF;HENTAIGANA LETTER RA-3;Lo;0;L;;;;;N;;;;; +1B0F0;HENTAIGANA LETTER RA-4;Lo;0;L;;;;;N;;;;; +1B0F1;HENTAIGANA LETTER RI-1;Lo;0;L;;;;;N;;;;; +1B0F2;HENTAIGANA LETTER RI-2;Lo;0;L;;;;;N;;;;; +1B0F3;HENTAIGANA LETTER RI-3;Lo;0;L;;;;;N;;;;; +1B0F4;HENTAIGANA LETTER RI-4;Lo;0;L;;;;;N;;;;; +1B0F5;HENTAIGANA LETTER RI-5;Lo;0;L;;;;;N;;;;; +1B0F6;HENTAIGANA LETTER RI-6;Lo;0;L;;;;;N;;;;; +1B0F7;HENTAIGANA LETTER RI-7;Lo;0;L;;;;;N;;;;; +1B0F8;HENTAIGANA LETTER RU-1;Lo;0;L;;;;;N;;;;; +1B0F9;HENTAIGANA LETTER RU-2;Lo;0;L;;;;;N;;;;; +1B0FA;HENTAIGANA LETTER RU-3;Lo;0;L;;;;;N;;;;; +1B0FB;HENTAIGANA LETTER RU-4;Lo;0;L;;;;;N;;;;; +1B0FC;HENTAIGANA LETTER RU-5;Lo;0;L;;;;;N;;;;; +1B0FD;HENTAIGANA LETTER RU-6;Lo;0;L;;;;;N;;;;; +1B0FE;HENTAIGANA LETTER RE-1;Lo;0;L;;;;;N;;;;; +1B0FF;HENTAIGANA LETTER RE-2;Lo;0;L;;;;;N;;;;; +1B100;HENTAIGANA LETTER RE-3;Lo;0;L;;;;;N;;;;; +1B101;HENTAIGANA LETTER RE-4;Lo;0;L;;;;;N;;;;; +1B102;HENTAIGANA LETTER RO-1;Lo;0;L;;;;;N;;;;; +1B103;HENTAIGANA LETTER RO-2;Lo;0;L;;;;;N;;;;; +1B104;HENTAIGANA LETTER RO-3;Lo;0;L;;;;;N;;;;; +1B105;HENTAIGANA LETTER RO-4;Lo;0;L;;;;;N;;;;; +1B106;HENTAIGANA LETTER RO-5;Lo;0;L;;;;;N;;;;; +1B107;HENTAIGANA LETTER RO-6;Lo;0;L;;;;;N;;;;; +1B108;HENTAIGANA LETTER WA-1;Lo;0;L;;;;;N;;;;; +1B109;HENTAIGANA LETTER WA-2;Lo;0;L;;;;;N;;;;; +1B10A;HENTAIGANA LETTER WA-3;Lo;0;L;;;;;N;;;;; +1B10B;HENTAIGANA LETTER WA-4;Lo;0;L;;;;;N;;;;; +1B10C;HENTAIGANA LETTER WA-5;Lo;0;L;;;;;N;;;;; +1B10D;HENTAIGANA LETTER WI-1;Lo;0;L;;;;;N;;;;; +1B10E;HENTAIGANA LETTER WI-2;Lo;0;L;;;;;N;;;;; +1B10F;HENTAIGANA LETTER WI-3;Lo;0;L;;;;;N;;;;; +1B110;HENTAIGANA LETTER WI-4;Lo;0;L;;;;;N;;;;; +1B111;HENTAIGANA LETTER WI-5;Lo;0;L;;;;;N;;;;; +1B112;HENTAIGANA LETTER WE-1;Lo;0;L;;;;;N;;;;; +1B113;HENTAIGANA LETTER WE-2;Lo;0;L;;;;;N;;;;; +1B114;HENTAIGANA LETTER WE-3;Lo;0;L;;;;;N;;;;; +1B115;HENTAIGANA LETTER WE-4;Lo;0;L;;;;;N;;;;; +1B116;HENTAIGANA LETTER WO-1;Lo;0;L;;;;;N;;;;; +1B117;HENTAIGANA LETTER WO-2;Lo;0;L;;;;;N;;;;; +1B118;HENTAIGANA LETTER WO-3;Lo;0;L;;;;;N;;;;; +1B119;HENTAIGANA LETTER WO-4;Lo;0;L;;;;;N;;;;; +1B11A;HENTAIGANA LETTER WO-5;Lo;0;L;;;;;N;;;;; +1B11B;HENTAIGANA LETTER WO-6;Lo;0;L;;;;;N;;;;; +1B11C;HENTAIGANA LETTER WO-7;Lo;0;L;;;;;N;;;;; +1B11D;HENTAIGANA LETTER N-MU-MO-1;Lo;0;L;;;;;N;;;;; +1B11E;HENTAIGANA LETTER N-MU-MO-2;Lo;0;L;;;;;N;;;;; +1B11F;HIRAGANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B120;KATAKANA LETTER ARCHAIC YI;Lo;0;L;;;;;N;;;;; +1B121;KATAKANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1B122;KATAKANA LETTER ARCHAIC WU;Lo;0;L;;;;;N;;;;; +1B132;HIRAGANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B150;HIRAGANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B151;HIRAGANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B152;HIRAGANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B155;KATAKANA LETTER SMALL KO;Lo;0;L;;;;;N;;;;; +1B164;KATAKANA LETTER SMALL WI;Lo;0;L;;;;;N;;;;; +1B165;KATAKANA LETTER SMALL WE;Lo;0;L;;;;;N;;;;; +1B166;KATAKANA LETTER SMALL WO;Lo;0;L;;;;;N;;;;; +1B167;KATAKANA LETTER SMALL N;Lo;0;L;;;;;N;;;;; +1B170;NUSHU CHARACTER-1B170;Lo;0;L;;;;;N;;;;; +1B171;NUSHU CHARACTER-1B171;Lo;0;L;;;;;N;;;;; +1B172;NUSHU CHARACTER-1B172;Lo;0;L;;;;;N;;;;; +1B173;NUSHU CHARACTER-1B173;Lo;0;L;;;;;N;;;;; +1B174;NUSHU CHARACTER-1B174;Lo;0;L;;;;;N;;;;; +1B175;NUSHU CHARACTER-1B175;Lo;0;L;;;;;N;;;;; +1B176;NUSHU CHARACTER-1B176;Lo;0;L;;;;;N;;;;; +1B177;NUSHU CHARACTER-1B177;Lo;0;L;;;;;N;;;;; +1B178;NUSHU CHARACTER-1B178;Lo;0;L;;;;;N;;;;; +1B179;NUSHU CHARACTER-1B179;Lo;0;L;;;;;N;;;;; +1B17A;NUSHU CHARACTER-1B17A;Lo;0;L;;;;;N;;;;; +1B17B;NUSHU CHARACTER-1B17B;Lo;0;L;;;;;N;;;;; +1B17C;NUSHU CHARACTER-1B17C;Lo;0;L;;;;;N;;;;; +1B17D;NUSHU CHARACTER-1B17D;Lo;0;L;;;;;N;;;;; +1B17E;NUSHU CHARACTER-1B17E;Lo;0;L;;;;;N;;;;; +1B17F;NUSHU CHARACTER-1B17F;Lo;0;L;;;;;N;;;;; +1B180;NUSHU CHARACTER-1B180;Lo;0;L;;;;;N;;;;; +1B181;NUSHU CHARACTER-1B181;Lo;0;L;;;;;N;;;;; +1B182;NUSHU CHARACTER-1B182;Lo;0;L;;;;;N;;;;; +1B183;NUSHU CHARACTER-1B183;Lo;0;L;;;;;N;;;;; +1B184;NUSHU CHARACTER-1B184;Lo;0;L;;;;;N;;;;; +1B185;NUSHU CHARACTER-1B185;Lo;0;L;;;;;N;;;;; +1B186;NUSHU CHARACTER-1B186;Lo;0;L;;;;;N;;;;; +1B187;NUSHU CHARACTER-1B187;Lo;0;L;;;;;N;;;;; +1B188;NUSHU CHARACTER-1B188;Lo;0;L;;;;;N;;;;; +1B189;NUSHU CHARACTER-1B189;Lo;0;L;;;;;N;;;;; +1B18A;NUSHU CHARACTER-1B18A;Lo;0;L;;;;;N;;;;; +1B18B;NUSHU CHARACTER-1B18B;Lo;0;L;;;;;N;;;;; +1B18C;NUSHU CHARACTER-1B18C;Lo;0;L;;;;;N;;;;; +1B18D;NUSHU CHARACTER-1B18D;Lo;0;L;;;;;N;;;;; +1B18E;NUSHU CHARACTER-1B18E;Lo;0;L;;;;;N;;;;; +1B18F;NUSHU CHARACTER-1B18F;Lo;0;L;;;;;N;;;;; +1B190;NUSHU CHARACTER-1B190;Lo;0;L;;;;;N;;;;; +1B191;NUSHU CHARACTER-1B191;Lo;0;L;;;;;N;;;;; +1B192;NUSHU CHARACTER-1B192;Lo;0;L;;;;;N;;;;; +1B193;NUSHU CHARACTER-1B193;Lo;0;L;;;;;N;;;;; +1B194;NUSHU CHARACTER-1B194;Lo;0;L;;;;;N;;;;; +1B195;NUSHU CHARACTER-1B195;Lo;0;L;;;;;N;;;;; +1B196;NUSHU CHARACTER-1B196;Lo;0;L;;;;;N;;;;; +1B197;NUSHU CHARACTER-1B197;Lo;0;L;;;;;N;;;;; +1B198;NUSHU CHARACTER-1B198;Lo;0;L;;;;;N;;;;; +1B199;NUSHU CHARACTER-1B199;Lo;0;L;;;;;N;;;;; +1B19A;NUSHU CHARACTER-1B19A;Lo;0;L;;;;;N;;;;; +1B19B;NUSHU CHARACTER-1B19B;Lo;0;L;;;;;N;;;;; +1B19C;NUSHU CHARACTER-1B19C;Lo;0;L;;;;;N;;;;; +1B19D;NUSHU CHARACTER-1B19D;Lo;0;L;;;;;N;;;;; +1B19E;NUSHU CHARACTER-1B19E;Lo;0;L;;;;;N;;;;; +1B19F;NUSHU CHARACTER-1B19F;Lo;0;L;;;;;N;;;;; +1B1A0;NUSHU CHARACTER-1B1A0;Lo;0;L;;;;;N;;;;; +1B1A1;NUSHU CHARACTER-1B1A1;Lo;0;L;;;;;N;;;;; +1B1A2;NUSHU CHARACTER-1B1A2;Lo;0;L;;;;;N;;;;; +1B1A3;NUSHU CHARACTER-1B1A3;Lo;0;L;;;;;N;;;;; +1B1A4;NUSHU CHARACTER-1B1A4;Lo;0;L;;;;;N;;;;; +1B1A5;NUSHU CHARACTER-1B1A5;Lo;0;L;;;;;N;;;;; +1B1A6;NUSHU CHARACTER-1B1A6;Lo;0;L;;;;;N;;;;; +1B1A7;NUSHU CHARACTER-1B1A7;Lo;0;L;;;;;N;;;;; +1B1A8;NUSHU CHARACTER-1B1A8;Lo;0;L;;;;;N;;;;; +1B1A9;NUSHU CHARACTER-1B1A9;Lo;0;L;;;;;N;;;;; +1B1AA;NUSHU CHARACTER-1B1AA;Lo;0;L;;;;;N;;;;; +1B1AB;NUSHU CHARACTER-1B1AB;Lo;0;L;;;;;N;;;;; +1B1AC;NUSHU CHARACTER-1B1AC;Lo;0;L;;;;;N;;;;; +1B1AD;NUSHU CHARACTER-1B1AD;Lo;0;L;;;;;N;;;;; +1B1AE;NUSHU CHARACTER-1B1AE;Lo;0;L;;;;;N;;;;; +1B1AF;NUSHU CHARACTER-1B1AF;Lo;0;L;;;;;N;;;;; +1B1B0;NUSHU CHARACTER-1B1B0;Lo;0;L;;;;;N;;;;; +1B1B1;NUSHU CHARACTER-1B1B1;Lo;0;L;;;;;N;;;;; +1B1B2;NUSHU CHARACTER-1B1B2;Lo;0;L;;;;;N;;;;; +1B1B3;NUSHU CHARACTER-1B1B3;Lo;0;L;;;;;N;;;;; +1B1B4;NUSHU CHARACTER-1B1B4;Lo;0;L;;;;;N;;;;; +1B1B5;NUSHU CHARACTER-1B1B5;Lo;0;L;;;;;N;;;;; +1B1B6;NUSHU CHARACTER-1B1B6;Lo;0;L;;;;;N;;;;; +1B1B7;NUSHU CHARACTER-1B1B7;Lo;0;L;;;;;N;;;;; +1B1B8;NUSHU CHARACTER-1B1B8;Lo;0;L;;;;;N;;;;; +1B1B9;NUSHU CHARACTER-1B1B9;Lo;0;L;;;;;N;;;;; +1B1BA;NUSHU CHARACTER-1B1BA;Lo;0;L;;;;;N;;;;; +1B1BB;NUSHU CHARACTER-1B1BB;Lo;0;L;;;;;N;;;;; +1B1BC;NUSHU CHARACTER-1B1BC;Lo;0;L;;;;;N;;;;; +1B1BD;NUSHU CHARACTER-1B1BD;Lo;0;L;;;;;N;;;;; +1B1BE;NUSHU CHARACTER-1B1BE;Lo;0;L;;;;;N;;;;; +1B1BF;NUSHU CHARACTER-1B1BF;Lo;0;L;;;;;N;;;;; +1B1C0;NUSHU CHARACTER-1B1C0;Lo;0;L;;;;;N;;;;; +1B1C1;NUSHU CHARACTER-1B1C1;Lo;0;L;;;;;N;;;;; +1B1C2;NUSHU CHARACTER-1B1C2;Lo;0;L;;;;;N;;;;; +1B1C3;NUSHU CHARACTER-1B1C3;Lo;0;L;;;;;N;;;;; +1B1C4;NUSHU CHARACTER-1B1C4;Lo;0;L;;;;;N;;;;; +1B1C5;NUSHU CHARACTER-1B1C5;Lo;0;L;;;;;N;;;;; +1B1C6;NUSHU CHARACTER-1B1C6;Lo;0;L;;;;;N;;;;; +1B1C7;NUSHU CHARACTER-1B1C7;Lo;0;L;;;;;N;;;;; +1B1C8;NUSHU CHARACTER-1B1C8;Lo;0;L;;;;;N;;;;; +1B1C9;NUSHU CHARACTER-1B1C9;Lo;0;L;;;;;N;;;;; +1B1CA;NUSHU CHARACTER-1B1CA;Lo;0;L;;;;;N;;;;; +1B1CB;NUSHU CHARACTER-1B1CB;Lo;0;L;;;;;N;;;;; +1B1CC;NUSHU CHARACTER-1B1CC;Lo;0;L;;;;;N;;;;; +1B1CD;NUSHU CHARACTER-1B1CD;Lo;0;L;;;;;N;;;;; +1B1CE;NUSHU CHARACTER-1B1CE;Lo;0;L;;;;;N;;;;; +1B1CF;NUSHU CHARACTER-1B1CF;Lo;0;L;;;;;N;;;;; +1B1D0;NUSHU CHARACTER-1B1D0;Lo;0;L;;;;;N;;;;; +1B1D1;NUSHU CHARACTER-1B1D1;Lo;0;L;;;;;N;;;;; +1B1D2;NUSHU CHARACTER-1B1D2;Lo;0;L;;;;;N;;;;; +1B1D3;NUSHU CHARACTER-1B1D3;Lo;0;L;;;;;N;;;;; +1B1D4;NUSHU CHARACTER-1B1D4;Lo;0;L;;;;;N;;;;; +1B1D5;NUSHU CHARACTER-1B1D5;Lo;0;L;;;;;N;;;;; +1B1D6;NUSHU CHARACTER-1B1D6;Lo;0;L;;;;;N;;;;; +1B1D7;NUSHU CHARACTER-1B1D7;Lo;0;L;;;;;N;;;;; +1B1D8;NUSHU CHARACTER-1B1D8;Lo;0;L;;;;;N;;;;; +1B1D9;NUSHU CHARACTER-1B1D9;Lo;0;L;;;;;N;;;;; +1B1DA;NUSHU CHARACTER-1B1DA;Lo;0;L;;;;;N;;;;; +1B1DB;NUSHU CHARACTER-1B1DB;Lo;0;L;;;;;N;;;;; +1B1DC;NUSHU CHARACTER-1B1DC;Lo;0;L;;;;;N;;;;; +1B1DD;NUSHU CHARACTER-1B1DD;Lo;0;L;;;;;N;;;;; +1B1DE;NUSHU CHARACTER-1B1DE;Lo;0;L;;;;;N;;;;; +1B1DF;NUSHU CHARACTER-1B1DF;Lo;0;L;;;;;N;;;;; +1B1E0;NUSHU CHARACTER-1B1E0;Lo;0;L;;;;;N;;;;; +1B1E1;NUSHU CHARACTER-1B1E1;Lo;0;L;;;;;N;;;;; +1B1E2;NUSHU CHARACTER-1B1E2;Lo;0;L;;;;;N;;;;; +1B1E3;NUSHU CHARACTER-1B1E3;Lo;0;L;;;;;N;;;;; +1B1E4;NUSHU CHARACTER-1B1E4;Lo;0;L;;;;;N;;;;; +1B1E5;NUSHU CHARACTER-1B1E5;Lo;0;L;;;;;N;;;;; +1B1E6;NUSHU CHARACTER-1B1E6;Lo;0;L;;;;;N;;;;; +1B1E7;NUSHU CHARACTER-1B1E7;Lo;0;L;;;;;N;;;;; +1B1E8;NUSHU CHARACTER-1B1E8;Lo;0;L;;;;;N;;;;; +1B1E9;NUSHU CHARACTER-1B1E9;Lo;0;L;;;;;N;;;;; +1B1EA;NUSHU CHARACTER-1B1EA;Lo;0;L;;;;;N;;;;; +1B1EB;NUSHU CHARACTER-1B1EB;Lo;0;L;;;;;N;;;;; +1B1EC;NUSHU CHARACTER-1B1EC;Lo;0;L;;;;;N;;;;; +1B1ED;NUSHU CHARACTER-1B1ED;Lo;0;L;;;;;N;;;;; +1B1EE;NUSHU CHARACTER-1B1EE;Lo;0;L;;;;;N;;;;; +1B1EF;NUSHU CHARACTER-1B1EF;Lo;0;L;;;;;N;;;;; +1B1F0;NUSHU CHARACTER-1B1F0;Lo;0;L;;;;;N;;;;; +1B1F1;NUSHU CHARACTER-1B1F1;Lo;0;L;;;;;N;;;;; +1B1F2;NUSHU CHARACTER-1B1F2;Lo;0;L;;;;;N;;;;; +1B1F3;NUSHU CHARACTER-1B1F3;Lo;0;L;;;;;N;;;;; +1B1F4;NUSHU CHARACTER-1B1F4;Lo;0;L;;;;;N;;;;; +1B1F5;NUSHU CHARACTER-1B1F5;Lo;0;L;;;;;N;;;;; +1B1F6;NUSHU CHARACTER-1B1F6;Lo;0;L;;;;;N;;;;; +1B1F7;NUSHU CHARACTER-1B1F7;Lo;0;L;;;;;N;;;;; +1B1F8;NUSHU CHARACTER-1B1F8;Lo;0;L;;;;;N;;;;; +1B1F9;NUSHU CHARACTER-1B1F9;Lo;0;L;;;;;N;;;;; +1B1FA;NUSHU CHARACTER-1B1FA;Lo;0;L;;;;;N;;;;; +1B1FB;NUSHU CHARACTER-1B1FB;Lo;0;L;;;;;N;;;;; +1B1FC;NUSHU CHARACTER-1B1FC;Lo;0;L;;;;;N;;;;; +1B1FD;NUSHU CHARACTER-1B1FD;Lo;0;L;;;;;N;;;;; +1B1FE;NUSHU CHARACTER-1B1FE;Lo;0;L;;;;;N;;;;; +1B1FF;NUSHU CHARACTER-1B1FF;Lo;0;L;;;;;N;;;;; +1B200;NUSHU CHARACTER-1B200;Lo;0;L;;;;;N;;;;; +1B201;NUSHU CHARACTER-1B201;Lo;0;L;;;;;N;;;;; +1B202;NUSHU CHARACTER-1B202;Lo;0;L;;;;;N;;;;; +1B203;NUSHU CHARACTER-1B203;Lo;0;L;;;;;N;;;;; +1B204;NUSHU CHARACTER-1B204;Lo;0;L;;;;;N;;;;; +1B205;NUSHU CHARACTER-1B205;Lo;0;L;;;;;N;;;;; +1B206;NUSHU CHARACTER-1B206;Lo;0;L;;;;;N;;;;; +1B207;NUSHU CHARACTER-1B207;Lo;0;L;;;;;N;;;;; +1B208;NUSHU CHARACTER-1B208;Lo;0;L;;;;;N;;;;; +1B209;NUSHU CHARACTER-1B209;Lo;0;L;;;;;N;;;;; +1B20A;NUSHU CHARACTER-1B20A;Lo;0;L;;;;;N;;;;; +1B20B;NUSHU CHARACTER-1B20B;Lo;0;L;;;;;N;;;;; +1B20C;NUSHU CHARACTER-1B20C;Lo;0;L;;;;;N;;;;; +1B20D;NUSHU CHARACTER-1B20D;Lo;0;L;;;;;N;;;;; +1B20E;NUSHU CHARACTER-1B20E;Lo;0;L;;;;;N;;;;; +1B20F;NUSHU CHARACTER-1B20F;Lo;0;L;;;;;N;;;;; +1B210;NUSHU CHARACTER-1B210;Lo;0;L;;;;;N;;;;; +1B211;NUSHU CHARACTER-1B211;Lo;0;L;;;;;N;;;;; +1B212;NUSHU CHARACTER-1B212;Lo;0;L;;;;;N;;;;; +1B213;NUSHU CHARACTER-1B213;Lo;0;L;;;;;N;;;;; +1B214;NUSHU CHARACTER-1B214;Lo;0;L;;;;;N;;;;; +1B215;NUSHU CHARACTER-1B215;Lo;0;L;;;;;N;;;;; +1B216;NUSHU CHARACTER-1B216;Lo;0;L;;;;;N;;;;; +1B217;NUSHU CHARACTER-1B217;Lo;0;L;;;;;N;;;;; +1B218;NUSHU CHARACTER-1B218;Lo;0;L;;;;;N;;;;; +1B219;NUSHU CHARACTER-1B219;Lo;0;L;;;;;N;;;;; +1B21A;NUSHU CHARACTER-1B21A;Lo;0;L;;;;;N;;;;; +1B21B;NUSHU CHARACTER-1B21B;Lo;0;L;;;;;N;;;;; +1B21C;NUSHU CHARACTER-1B21C;Lo;0;L;;;;;N;;;;; +1B21D;NUSHU CHARACTER-1B21D;Lo;0;L;;;;;N;;;;; +1B21E;NUSHU CHARACTER-1B21E;Lo;0;L;;;;;N;;;;; +1B21F;NUSHU CHARACTER-1B21F;Lo;0;L;;;;;N;;;;; +1B220;NUSHU CHARACTER-1B220;Lo;0;L;;;;;N;;;;; +1B221;NUSHU CHARACTER-1B221;Lo;0;L;;;;;N;;;;; +1B222;NUSHU CHARACTER-1B222;Lo;0;L;;;;;N;;;;; +1B223;NUSHU CHARACTER-1B223;Lo;0;L;;;;;N;;;;; +1B224;NUSHU CHARACTER-1B224;Lo;0;L;;;;;N;;;;; +1B225;NUSHU CHARACTER-1B225;Lo;0;L;;;;;N;;;;; +1B226;NUSHU CHARACTER-1B226;Lo;0;L;;;;;N;;;;; +1B227;NUSHU CHARACTER-1B227;Lo;0;L;;;;;N;;;;; +1B228;NUSHU CHARACTER-1B228;Lo;0;L;;;;;N;;;;; +1B229;NUSHU CHARACTER-1B229;Lo;0;L;;;;;N;;;;; +1B22A;NUSHU CHARACTER-1B22A;Lo;0;L;;;;;N;;;;; +1B22B;NUSHU CHARACTER-1B22B;Lo;0;L;;;;;N;;;;; +1B22C;NUSHU CHARACTER-1B22C;Lo;0;L;;;;;N;;;;; +1B22D;NUSHU CHARACTER-1B22D;Lo;0;L;;;;;N;;;;; +1B22E;NUSHU CHARACTER-1B22E;Lo;0;L;;;;;N;;;;; +1B22F;NUSHU CHARACTER-1B22F;Lo;0;L;;;;;N;;;;; +1B230;NUSHU CHARACTER-1B230;Lo;0;L;;;;;N;;;;; +1B231;NUSHU CHARACTER-1B231;Lo;0;L;;;;;N;;;;; +1B232;NUSHU CHARACTER-1B232;Lo;0;L;;;;;N;;;;; +1B233;NUSHU CHARACTER-1B233;Lo;0;L;;;;;N;;;;; +1B234;NUSHU CHARACTER-1B234;Lo;0;L;;;;;N;;;;; +1B235;NUSHU CHARACTER-1B235;Lo;0;L;;;;;N;;;;; +1B236;NUSHU CHARACTER-1B236;Lo;0;L;;;;;N;;;;; +1B237;NUSHU CHARACTER-1B237;Lo;0;L;;;;;N;;;;; +1B238;NUSHU CHARACTER-1B238;Lo;0;L;;;;;N;;;;; +1B239;NUSHU CHARACTER-1B239;Lo;0;L;;;;;N;;;;; +1B23A;NUSHU CHARACTER-1B23A;Lo;0;L;;;;;N;;;;; +1B23B;NUSHU CHARACTER-1B23B;Lo;0;L;;;;;N;;;;; +1B23C;NUSHU CHARACTER-1B23C;Lo;0;L;;;;;N;;;;; +1B23D;NUSHU CHARACTER-1B23D;Lo;0;L;;;;;N;;;;; +1B23E;NUSHU CHARACTER-1B23E;Lo;0;L;;;;;N;;;;; +1B23F;NUSHU CHARACTER-1B23F;Lo;0;L;;;;;N;;;;; +1B240;NUSHU CHARACTER-1B240;Lo;0;L;;;;;N;;;;; +1B241;NUSHU CHARACTER-1B241;Lo;0;L;;;;;N;;;;; +1B242;NUSHU CHARACTER-1B242;Lo;0;L;;;;;N;;;;; +1B243;NUSHU CHARACTER-1B243;Lo;0;L;;;;;N;;;;; +1B244;NUSHU CHARACTER-1B244;Lo;0;L;;;;;N;;;;; +1B245;NUSHU CHARACTER-1B245;Lo;0;L;;;;;N;;;;; +1B246;NUSHU CHARACTER-1B246;Lo;0;L;;;;;N;;;;; +1B247;NUSHU CHARACTER-1B247;Lo;0;L;;;;;N;;;;; +1B248;NUSHU CHARACTER-1B248;Lo;0;L;;;;;N;;;;; +1B249;NUSHU CHARACTER-1B249;Lo;0;L;;;;;N;;;;; +1B24A;NUSHU CHARACTER-1B24A;Lo;0;L;;;;;N;;;;; +1B24B;NUSHU CHARACTER-1B24B;Lo;0;L;;;;;N;;;;; +1B24C;NUSHU CHARACTER-1B24C;Lo;0;L;;;;;N;;;;; +1B24D;NUSHU CHARACTER-1B24D;Lo;0;L;;;;;N;;;;; +1B24E;NUSHU CHARACTER-1B24E;Lo;0;L;;;;;N;;;;; +1B24F;NUSHU CHARACTER-1B24F;Lo;0;L;;;;;N;;;;; +1B250;NUSHU CHARACTER-1B250;Lo;0;L;;;;;N;;;;; +1B251;NUSHU CHARACTER-1B251;Lo;0;L;;;;;N;;;;; +1B252;NUSHU CHARACTER-1B252;Lo;0;L;;;;;N;;;;; +1B253;NUSHU CHARACTER-1B253;Lo;0;L;;;;;N;;;;; +1B254;NUSHU CHARACTER-1B254;Lo;0;L;;;;;N;;;;; +1B255;NUSHU CHARACTER-1B255;Lo;0;L;;;;;N;;;;; +1B256;NUSHU CHARACTER-1B256;Lo;0;L;;;;;N;;;;; +1B257;NUSHU CHARACTER-1B257;Lo;0;L;;;;;N;;;;; +1B258;NUSHU CHARACTER-1B258;Lo;0;L;;;;;N;;;;; +1B259;NUSHU CHARACTER-1B259;Lo;0;L;;;;;N;;;;; +1B25A;NUSHU CHARACTER-1B25A;Lo;0;L;;;;;N;;;;; +1B25B;NUSHU CHARACTER-1B25B;Lo;0;L;;;;;N;;;;; +1B25C;NUSHU CHARACTER-1B25C;Lo;0;L;;;;;N;;;;; +1B25D;NUSHU CHARACTER-1B25D;Lo;0;L;;;;;N;;;;; +1B25E;NUSHU CHARACTER-1B25E;Lo;0;L;;;;;N;;;;; +1B25F;NUSHU CHARACTER-1B25F;Lo;0;L;;;;;N;;;;; +1B260;NUSHU CHARACTER-1B260;Lo;0;L;;;;;N;;;;; +1B261;NUSHU CHARACTER-1B261;Lo;0;L;;;;;N;;;;; +1B262;NUSHU CHARACTER-1B262;Lo;0;L;;;;;N;;;;; +1B263;NUSHU CHARACTER-1B263;Lo;0;L;;;;;N;;;;; +1B264;NUSHU CHARACTER-1B264;Lo;0;L;;;;;N;;;;; +1B265;NUSHU CHARACTER-1B265;Lo;0;L;;;;;N;;;;; +1B266;NUSHU CHARACTER-1B266;Lo;0;L;;;;;N;;;;; +1B267;NUSHU CHARACTER-1B267;Lo;0;L;;;;;N;;;;; +1B268;NUSHU CHARACTER-1B268;Lo;0;L;;;;;N;;;;; +1B269;NUSHU CHARACTER-1B269;Lo;0;L;;;;;N;;;;; +1B26A;NUSHU CHARACTER-1B26A;Lo;0;L;;;;;N;;;;; +1B26B;NUSHU CHARACTER-1B26B;Lo;0;L;;;;;N;;;;; +1B26C;NUSHU CHARACTER-1B26C;Lo;0;L;;;;;N;;;;; +1B26D;NUSHU CHARACTER-1B26D;Lo;0;L;;;;;N;;;;; +1B26E;NUSHU CHARACTER-1B26E;Lo;0;L;;;;;N;;;;; +1B26F;NUSHU CHARACTER-1B26F;Lo;0;L;;;;;N;;;;; +1B270;NUSHU CHARACTER-1B270;Lo;0;L;;;;;N;;;;; +1B271;NUSHU CHARACTER-1B271;Lo;0;L;;;;;N;;;;; +1B272;NUSHU CHARACTER-1B272;Lo;0;L;;;;;N;;;;; +1B273;NUSHU CHARACTER-1B273;Lo;0;L;;;;;N;;;;; +1B274;NUSHU CHARACTER-1B274;Lo;0;L;;;;;N;;;;; +1B275;NUSHU CHARACTER-1B275;Lo;0;L;;;;;N;;;;; +1B276;NUSHU CHARACTER-1B276;Lo;0;L;;;;;N;;;;; +1B277;NUSHU CHARACTER-1B277;Lo;0;L;;;;;N;;;;; +1B278;NUSHU CHARACTER-1B278;Lo;0;L;;;;;N;;;;; +1B279;NUSHU CHARACTER-1B279;Lo;0;L;;;;;N;;;;; +1B27A;NUSHU CHARACTER-1B27A;Lo;0;L;;;;;N;;;;; +1B27B;NUSHU CHARACTER-1B27B;Lo;0;L;;;;;N;;;;; +1B27C;NUSHU CHARACTER-1B27C;Lo;0;L;;;;;N;;;;; +1B27D;NUSHU CHARACTER-1B27D;Lo;0;L;;;;;N;;;;; +1B27E;NUSHU CHARACTER-1B27E;Lo;0;L;;;;;N;;;;; +1B27F;NUSHU CHARACTER-1B27F;Lo;0;L;;;;;N;;;;; +1B280;NUSHU CHARACTER-1B280;Lo;0;L;;;;;N;;;;; +1B281;NUSHU CHARACTER-1B281;Lo;0;L;;;;;N;;;;; +1B282;NUSHU CHARACTER-1B282;Lo;0;L;;;;;N;;;;; +1B283;NUSHU CHARACTER-1B283;Lo;0;L;;;;;N;;;;; +1B284;NUSHU CHARACTER-1B284;Lo;0;L;;;;;N;;;;; +1B285;NUSHU CHARACTER-1B285;Lo;0;L;;;;;N;;;;; +1B286;NUSHU CHARACTER-1B286;Lo;0;L;;;;;N;;;;; +1B287;NUSHU CHARACTER-1B287;Lo;0;L;;;;;N;;;;; +1B288;NUSHU CHARACTER-1B288;Lo;0;L;;;;;N;;;;; +1B289;NUSHU CHARACTER-1B289;Lo;0;L;;;;;N;;;;; +1B28A;NUSHU CHARACTER-1B28A;Lo;0;L;;;;;N;;;;; +1B28B;NUSHU CHARACTER-1B28B;Lo;0;L;;;;;N;;;;; +1B28C;NUSHU CHARACTER-1B28C;Lo;0;L;;;;;N;;;;; +1B28D;NUSHU CHARACTER-1B28D;Lo;0;L;;;;;N;;;;; +1B28E;NUSHU CHARACTER-1B28E;Lo;0;L;;;;;N;;;;; +1B28F;NUSHU CHARACTER-1B28F;Lo;0;L;;;;;N;;;;; +1B290;NUSHU CHARACTER-1B290;Lo;0;L;;;;;N;;;;; +1B291;NUSHU CHARACTER-1B291;Lo;0;L;;;;;N;;;;; +1B292;NUSHU CHARACTER-1B292;Lo;0;L;;;;;N;;;;; +1B293;NUSHU CHARACTER-1B293;Lo;0;L;;;;;N;;;;; +1B294;NUSHU CHARACTER-1B294;Lo;0;L;;;;;N;;;;; +1B295;NUSHU CHARACTER-1B295;Lo;0;L;;;;;N;;;;; +1B296;NUSHU CHARACTER-1B296;Lo;0;L;;;;;N;;;;; +1B297;NUSHU CHARACTER-1B297;Lo;0;L;;;;;N;;;;; +1B298;NUSHU CHARACTER-1B298;Lo;0;L;;;;;N;;;;; +1B299;NUSHU CHARACTER-1B299;Lo;0;L;;;;;N;;;;; +1B29A;NUSHU CHARACTER-1B29A;Lo;0;L;;;;;N;;;;; +1B29B;NUSHU CHARACTER-1B29B;Lo;0;L;;;;;N;;;;; +1B29C;NUSHU CHARACTER-1B29C;Lo;0;L;;;;;N;;;;; +1B29D;NUSHU CHARACTER-1B29D;Lo;0;L;;;;;N;;;;; +1B29E;NUSHU CHARACTER-1B29E;Lo;0;L;;;;;N;;;;; +1B29F;NUSHU CHARACTER-1B29F;Lo;0;L;;;;;N;;;;; +1B2A0;NUSHU CHARACTER-1B2A0;Lo;0;L;;;;;N;;;;; +1B2A1;NUSHU CHARACTER-1B2A1;Lo;0;L;;;;;N;;;;; +1B2A2;NUSHU CHARACTER-1B2A2;Lo;0;L;;;;;N;;;;; +1B2A3;NUSHU CHARACTER-1B2A3;Lo;0;L;;;;;N;;;;; +1B2A4;NUSHU CHARACTER-1B2A4;Lo;0;L;;;;;N;;;;; +1B2A5;NUSHU CHARACTER-1B2A5;Lo;0;L;;;;;N;;;;; +1B2A6;NUSHU CHARACTER-1B2A6;Lo;0;L;;;;;N;;;;; +1B2A7;NUSHU CHARACTER-1B2A7;Lo;0;L;;;;;N;;;;; +1B2A8;NUSHU CHARACTER-1B2A8;Lo;0;L;;;;;N;;;;; +1B2A9;NUSHU CHARACTER-1B2A9;Lo;0;L;;;;;N;;;;; +1B2AA;NUSHU CHARACTER-1B2AA;Lo;0;L;;;;;N;;;;; +1B2AB;NUSHU CHARACTER-1B2AB;Lo;0;L;;;;;N;;;;; +1B2AC;NUSHU CHARACTER-1B2AC;Lo;0;L;;;;;N;;;;; +1B2AD;NUSHU CHARACTER-1B2AD;Lo;0;L;;;;;N;;;;; +1B2AE;NUSHU CHARACTER-1B2AE;Lo;0;L;;;;;N;;;;; +1B2AF;NUSHU CHARACTER-1B2AF;Lo;0;L;;;;;N;;;;; +1B2B0;NUSHU CHARACTER-1B2B0;Lo;0;L;;;;;N;;;;; +1B2B1;NUSHU CHARACTER-1B2B1;Lo;0;L;;;;;N;;;;; +1B2B2;NUSHU CHARACTER-1B2B2;Lo;0;L;;;;;N;;;;; +1B2B3;NUSHU CHARACTER-1B2B3;Lo;0;L;;;;;N;;;;; +1B2B4;NUSHU CHARACTER-1B2B4;Lo;0;L;;;;;N;;;;; +1B2B5;NUSHU CHARACTER-1B2B5;Lo;0;L;;;;;N;;;;; +1B2B6;NUSHU CHARACTER-1B2B6;Lo;0;L;;;;;N;;;;; +1B2B7;NUSHU CHARACTER-1B2B7;Lo;0;L;;;;;N;;;;; +1B2B8;NUSHU CHARACTER-1B2B8;Lo;0;L;;;;;N;;;;; +1B2B9;NUSHU CHARACTER-1B2B9;Lo;0;L;;;;;N;;;;; +1B2BA;NUSHU CHARACTER-1B2BA;Lo;0;L;;;;;N;;;;; +1B2BB;NUSHU CHARACTER-1B2BB;Lo;0;L;;;;;N;;;;; +1B2BC;NUSHU CHARACTER-1B2BC;Lo;0;L;;;;;N;;;;; +1B2BD;NUSHU CHARACTER-1B2BD;Lo;0;L;;;;;N;;;;; +1B2BE;NUSHU CHARACTER-1B2BE;Lo;0;L;;;;;N;;;;; +1B2BF;NUSHU CHARACTER-1B2BF;Lo;0;L;;;;;N;;;;; +1B2C0;NUSHU CHARACTER-1B2C0;Lo;0;L;;;;;N;;;;; +1B2C1;NUSHU CHARACTER-1B2C1;Lo;0;L;;;;;N;;;;; +1B2C2;NUSHU CHARACTER-1B2C2;Lo;0;L;;;;;N;;;;; +1B2C3;NUSHU CHARACTER-1B2C3;Lo;0;L;;;;;N;;;;; +1B2C4;NUSHU CHARACTER-1B2C4;Lo;0;L;;;;;N;;;;; +1B2C5;NUSHU CHARACTER-1B2C5;Lo;0;L;;;;;N;;;;; +1B2C6;NUSHU CHARACTER-1B2C6;Lo;0;L;;;;;N;;;;; +1B2C7;NUSHU CHARACTER-1B2C7;Lo;0;L;;;;;N;;;;; +1B2C8;NUSHU CHARACTER-1B2C8;Lo;0;L;;;;;N;;;;; +1B2C9;NUSHU CHARACTER-1B2C9;Lo;0;L;;;;;N;;;;; +1B2CA;NUSHU CHARACTER-1B2CA;Lo;0;L;;;;;N;;;;; +1B2CB;NUSHU CHARACTER-1B2CB;Lo;0;L;;;;;N;;;;; +1B2CC;NUSHU CHARACTER-1B2CC;Lo;0;L;;;;;N;;;;; +1B2CD;NUSHU CHARACTER-1B2CD;Lo;0;L;;;;;N;;;;; +1B2CE;NUSHU CHARACTER-1B2CE;Lo;0;L;;;;;N;;;;; +1B2CF;NUSHU CHARACTER-1B2CF;Lo;0;L;;;;;N;;;;; +1B2D0;NUSHU CHARACTER-1B2D0;Lo;0;L;;;;;N;;;;; +1B2D1;NUSHU CHARACTER-1B2D1;Lo;0;L;;;;;N;;;;; +1B2D2;NUSHU CHARACTER-1B2D2;Lo;0;L;;;;;N;;;;; +1B2D3;NUSHU CHARACTER-1B2D3;Lo;0;L;;;;;N;;;;; +1B2D4;NUSHU CHARACTER-1B2D4;Lo;0;L;;;;;N;;;;; +1B2D5;NUSHU CHARACTER-1B2D5;Lo;0;L;;;;;N;;;;; +1B2D6;NUSHU CHARACTER-1B2D6;Lo;0;L;;;;;N;;;;; +1B2D7;NUSHU CHARACTER-1B2D7;Lo;0;L;;;;;N;;;;; +1B2D8;NUSHU CHARACTER-1B2D8;Lo;0;L;;;;;N;;;;; +1B2D9;NUSHU CHARACTER-1B2D9;Lo;0;L;;;;;N;;;;; +1B2DA;NUSHU CHARACTER-1B2DA;Lo;0;L;;;;;N;;;;; +1B2DB;NUSHU CHARACTER-1B2DB;Lo;0;L;;;;;N;;;;; +1B2DC;NUSHU CHARACTER-1B2DC;Lo;0;L;;;;;N;;;;; +1B2DD;NUSHU CHARACTER-1B2DD;Lo;0;L;;;;;N;;;;; +1B2DE;NUSHU CHARACTER-1B2DE;Lo;0;L;;;;;N;;;;; +1B2DF;NUSHU CHARACTER-1B2DF;Lo;0;L;;;;;N;;;;; +1B2E0;NUSHU CHARACTER-1B2E0;Lo;0;L;;;;;N;;;;; +1B2E1;NUSHU CHARACTER-1B2E1;Lo;0;L;;;;;N;;;;; +1B2E2;NUSHU CHARACTER-1B2E2;Lo;0;L;;;;;N;;;;; +1B2E3;NUSHU CHARACTER-1B2E3;Lo;0;L;;;;;N;;;;; +1B2E4;NUSHU CHARACTER-1B2E4;Lo;0;L;;;;;N;;;;; +1B2E5;NUSHU CHARACTER-1B2E5;Lo;0;L;;;;;N;;;;; +1B2E6;NUSHU CHARACTER-1B2E6;Lo;0;L;;;;;N;;;;; +1B2E7;NUSHU CHARACTER-1B2E7;Lo;0;L;;;;;N;;;;; +1B2E8;NUSHU CHARACTER-1B2E8;Lo;0;L;;;;;N;;;;; +1B2E9;NUSHU CHARACTER-1B2E9;Lo;0;L;;;;;N;;;;; +1B2EA;NUSHU CHARACTER-1B2EA;Lo;0;L;;;;;N;;;;; +1B2EB;NUSHU CHARACTER-1B2EB;Lo;0;L;;;;;N;;;;; +1B2EC;NUSHU CHARACTER-1B2EC;Lo;0;L;;;;;N;;;;; +1B2ED;NUSHU CHARACTER-1B2ED;Lo;0;L;;;;;N;;;;; +1B2EE;NUSHU CHARACTER-1B2EE;Lo;0;L;;;;;N;;;;; +1B2EF;NUSHU CHARACTER-1B2EF;Lo;0;L;;;;;N;;;;; +1B2F0;NUSHU CHARACTER-1B2F0;Lo;0;L;;;;;N;;;;; +1B2F1;NUSHU CHARACTER-1B2F1;Lo;0;L;;;;;N;;;;; +1B2F2;NUSHU CHARACTER-1B2F2;Lo;0;L;;;;;N;;;;; +1B2F3;NUSHU CHARACTER-1B2F3;Lo;0;L;;;;;N;;;;; +1B2F4;NUSHU CHARACTER-1B2F4;Lo;0;L;;;;;N;;;;; +1B2F5;NUSHU CHARACTER-1B2F5;Lo;0;L;;;;;N;;;;; +1B2F6;NUSHU CHARACTER-1B2F6;Lo;0;L;;;;;N;;;;; +1B2F7;NUSHU CHARACTER-1B2F7;Lo;0;L;;;;;N;;;;; +1B2F8;NUSHU CHARACTER-1B2F8;Lo;0;L;;;;;N;;;;; +1B2F9;NUSHU CHARACTER-1B2F9;Lo;0;L;;;;;N;;;;; +1B2FA;NUSHU CHARACTER-1B2FA;Lo;0;L;;;;;N;;;;; +1B2FB;NUSHU CHARACTER-1B2FB;Lo;0;L;;;;;N;;;;; +1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; +1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; +1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1CF00;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF01;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF02;ZNAMENNY COMBINING MARK TSATA ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF03;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF04;ZNAMENNY COMBINING MARK NIZKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF05;ZNAMENNY COMBINING MARK SREDNE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF06;ZNAMENNY COMBINING MARK MALO POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF07;ZNAMENNY COMBINING MARK POVYSHE ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF08;ZNAMENNY COMBINING MARK VYSOKO ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF09;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0A;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0B;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF0C;ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0D;ZNAMENNY COMBINING MARK NIZKO S KRYZHEM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0E;ZNAMENNY COMBINING MARK TSATA ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF0F;ZNAMENNY COMBINING MARK GORAZDO NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF10;ZNAMENNY COMBINING MARK NIZKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF11;ZNAMENNY COMBINING MARK SREDNE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF12;ZNAMENNY COMBINING MARK MALO POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF13;ZNAMENNY COMBINING MARK POVYSHE ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF14;ZNAMENNY COMBINING MARK VYSOKO ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF15;ZNAMENNY COMBINING MARK MALO POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF16;ZNAMENNY COMBINING MARK POVYSHE S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF17;ZNAMENNY COMBINING MARK VYSOKO S KHOKHLOM ON RIGHT;Mn;0;NSM;;;;;N;;;;; +1CF18;ZNAMENNY COMBINING MARK TSATA S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF19;ZNAMENNY COMBINING MARK MALO POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1A;ZNAMENNY COMBINING MARK STRANNO MALO POVYSHE;Mn;0;NSM;;;;;N;;;;; +1CF1B;ZNAMENNY COMBINING MARK POVYSHE S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1C;ZNAMENNY COMBINING MARK POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1D;ZNAMENNY COMBINING MARK VYSOKO S KRYZHEM;Mn;0;NSM;;;;;N;;;;; +1CF1E;ZNAMENNY COMBINING MARK MALO POVYSHE STRANNO;Mn;0;NSM;;;;;N;;;;; +1CF1F;ZNAMENNY COMBINING MARK GORAZDO VYSOKO;Mn;0;NSM;;;;;N;;;;; +1CF20;ZNAMENNY COMBINING MARK ZELO;Mn;0;NSM;;;;;N;;;;; +1CF21;ZNAMENNY COMBINING MARK ON;Mn;0;NSM;;;;;N;;;;; +1CF22;ZNAMENNY COMBINING MARK RAVNO;Mn;0;NSM;;;;;N;;;;; +1CF23;ZNAMENNY COMBINING MARK TIKHAYA;Mn;0;NSM;;;;;N;;;;; +1CF24;ZNAMENNY COMBINING MARK BORZAYA;Mn;0;NSM;;;;;N;;;;; +1CF25;ZNAMENNY COMBINING MARK UDARKA;Mn;0;NSM;;;;;N;;;;; +1CF26;ZNAMENNY COMBINING MARK PODVERTKA;Mn;0;NSM;;;;;N;;;;; +1CF27;ZNAMENNY COMBINING MARK LOMKA;Mn;0;NSM;;;;;N;;;;; +1CF28;ZNAMENNY COMBINING MARK KUPNAYA;Mn;0;NSM;;;;;N;;;;; +1CF29;ZNAMENNY COMBINING MARK KACHKA;Mn;0;NSM;;;;;N;;;;; +1CF2A;ZNAMENNY COMBINING MARK ZEVOK;Mn;0;NSM;;;;;N;;;;; +1CF2B;ZNAMENNY COMBINING MARK SKOBA;Mn;0;NSM;;;;;N;;;;; +1CF2C;ZNAMENNY COMBINING MARK RAZSEKA;Mn;0;NSM;;;;;N;;;;; +1CF2D;ZNAMENNY COMBINING MARK KRYZH ON LEFT;Mn;0;NSM;;;;;N;;;;; +1CF30;ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO;Mn;0;NSM;;;;;N;;;;; +1CF31;ZNAMENNY COMBINING TONAL RANGE MARK SVETLO;Mn;0;NSM;;;;;N;;;;; +1CF32;ZNAMENNY COMBINING TONAL RANGE MARK TRESVETLO;Mn;0;NSM;;;;;N;;;;; +1CF33;ZNAMENNY COMBINING MARK ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF34;ZNAMENNY COMBINING MARK DEMESTVENNY ZADERZHKA;Mn;0;NSM;;;;;N;;;;; +1CF35;ZNAMENNY COMBINING MARK OTSECHKA;Mn;0;NSM;;;;;N;;;;; +1CF36;ZNAMENNY COMBINING MARK PODCHASHIE;Mn;0;NSM;;;;;N;;;;; +1CF37;ZNAMENNY COMBINING MARK PODCHASHIE WITH VERTICAL STROKE;Mn;0;NSM;;;;;N;;;;; +1CF38;ZNAMENNY COMBINING MARK CHASHKA;Mn;0;NSM;;;;;N;;;;; +1CF39;ZNAMENNY COMBINING MARK CHASHKA POLNAYA;Mn;0;NSM;;;;;N;;;;; +1CF3A;ZNAMENNY COMBINING MARK OBLACHKO;Mn;0;NSM;;;;;N;;;;; +1CF3B;ZNAMENNY COMBINING MARK SOROCHYA NOZHKA;Mn;0;NSM;;;;;N;;;;; +1CF3C;ZNAMENNY COMBINING MARK TOCHKA;Mn;0;NSM;;;;;N;;;;; +1CF3D;ZNAMENNY COMBINING MARK DVOETOCHIE;Mn;0;NSM;;;;;N;;;;; +1CF3E;ZNAMENNY COMBINING ATTACHING VERTICAL OMET;Mn;0;NSM;;;;;N;;;;; +1CF3F;ZNAMENNY COMBINING MARK CURVED OMET;Mn;0;NSM;;;;;N;;;;; +1CF40;ZNAMENNY COMBINING MARK KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF41;ZNAMENNY COMBINING LOWER TONAL RANGE INDICATOR;Mn;0;NSM;;;;;N;;;;; +1CF42;ZNAMENNY PRIZNAK MODIFIER LEVEL-2;Mn;0;NSM;;;;;N;;;;; +1CF43;ZNAMENNY PRIZNAK MODIFIER LEVEL-3;Mn;0;NSM;;;;;N;;;;; +1CF44;ZNAMENNY PRIZNAK MODIFIER DIRECTION FLIP;Mn;0;NSM;;;;;N;;;;; +1CF45;ZNAMENNY PRIZNAK MODIFIER KRYZH;Mn;0;NSM;;;;;N;;;;; +1CF46;ZNAMENNY PRIZNAK MODIFIER ROG;Mn;0;NSM;;;;;N;;;;; +1CF50;ZNAMENNY NEUME KRYUK;So;0;L;;;;;N;;;;; +1CF51;ZNAMENNY NEUME KRYUK TIKHY;So;0;L;;;;;N;;;;; +1CF52;ZNAMENNY NEUME PARAKLIT;So;0;L;;;;;N;;;;; +1CF53;ZNAMENNY NEUME DVA V CHELNU;So;0;L;;;;;N;;;;; +1CF54;ZNAMENNY NEUME KLYUCH;So;0;L;;;;;N;;;;; +1CF55;ZNAMENNY NEUME ZANOZHEK;So;0;L;;;;;N;;;;; +1CF56;ZNAMENNY NEUME STOPITSA;So;0;L;;;;;N;;;;; +1CF57;ZNAMENNY NEUME STOPITSA S OCHKOM;So;0;L;;;;;N;;;;; +1CF58;ZNAMENNY NEUME PEREVODKA;So;0;L;;;;;N;;;;; +1CF59;ZNAMENNY NEUME PEREVODKA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF5A;ZNAMENNY NEUME STOPITSA WITH SOROCHYA NOZHKA;So;0;L;;;;;N;;;;; +1CF5B;ZNAMENNY NEUME CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF5C;ZNAMENNY NEUME PALKA;So;0;L;;;;;N;;;;; +1CF5D;ZNAMENNY NEUME ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF5E;ZNAMENNY NEUME GOLUBCHIK BORZY;So;0;L;;;;;N;;;;; +1CF5F;ZNAMENNY NEUME GOLUBCHIK TIKHY;So;0;L;;;;;N;;;;; +1CF60;ZNAMENNY NEUME GOLUBCHIK MRACHNY;So;0;L;;;;;N;;;;; +1CF61;ZNAMENNY NEUME GOLUBCHIK SVETLY;So;0;L;;;;;N;;;;; +1CF62;ZNAMENNY NEUME GOLUBCHIK TRESVETLY;So;0;L;;;;;N;;;;; +1CF63;ZNAMENNY NEUME VRAKHIYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF64;ZNAMENNY NEUME VRAKHIYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF65;ZNAMENNY NEUME VRAKHIYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF66;ZNAMENNY NEUME VRAKHIYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF67;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF68;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF69;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF6A;ZNAMENNY NEUME VRAKHIYA KLYUCHEVAYA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF6B;ZNAMENNY NEUME DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CF6C;ZNAMENNY NEUME REVERSED CHELYUSTKA;So;0;L;;;;;N;;;;; +1CF6D;ZNAMENNY NEUME DERBITSA;So;0;L;;;;;N;;;;; +1CF6E;ZNAMENNY NEUME KHAMILO;So;0;L;;;;;N;;;;; +1CF6F;ZNAMENNY NEUME CHASHKA;So;0;L;;;;;N;;;;; +1CF70;ZNAMENNY NEUME PODCHASHIE;So;0;L;;;;;N;;;;; +1CF71;ZNAMENNY NEUME SKAMEYTSA MRACHNAYA;So;0;L;;;;;N;;;;; +1CF72;ZNAMENNY NEUME SKAMEYTSA SVETLAYA;So;0;L;;;;;N;;;;; +1CF73;ZNAMENNY NEUME SKAMEYTSA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CF74;ZNAMENNY NEUME SKAMEYTSA TIKHAYA;So;0;L;;;;;N;;;;; +1CF75;ZNAMENNY NEUME DEMESTVENNY KLYUCH;So;0;L;;;;;N;;;;; +1CF76;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF77;ZNAMENNY NEUME SKAMEYTSA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF78;ZNAMENNY NEUME SKAMEYTSA KLYUCHEVAYA TIKHAYA;So;0;L;;;;;N;;;;; +1CF79;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA PROSTAYA;So;0;L;;;;;N;;;;; +1CF7A;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CF7B;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF7C;ZNAMENNY NEUME SKAMEYTSA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF7D;ZNAMENNY NEUME SLOZHITIE;So;0;L;;;;;N;;;;; +1CF7E;ZNAMENNY NEUME SLOZHITIE S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF7F;ZNAMENNY NEUME SLOZHITIE ZAKRYTOE;So;0;L;;;;;N;;;;; +1CF80;ZNAMENNY NEUME SLOZHITIE S KRYZHEM;So;0;L;;;;;N;;;;; +1CF81;ZNAMENNY NEUME KRYZH;So;0;L;;;;;N;;;;; +1CF82;ZNAMENNY NEUME ROG;So;0;L;;;;;N;;;;; +1CF83;ZNAMENNY NEUME FITA;So;0;L;;;;;N;;;;; +1CF84;ZNAMENNY NEUME KOBYLA;So;0;L;;;;;N;;;;; +1CF85;ZNAMENNY NEUME ZMEYTSA;So;0;L;;;;;N;;;;; +1CF86;ZNAMENNY NEUME STATYA;So;0;L;;;;;N;;;;; +1CF87;ZNAMENNY NEUME STATYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF88;ZNAMENNY NEUME STATYA S KRYZHEM;So;0;L;;;;;N;;;;; +1CF89;ZNAMENNY NEUME STATYA S ZAPYATOY I KRYZHEM;So;0;L;;;;;N;;;;; +1CF8A;ZNAMENNY NEUME STATYA S KRYZHEM I ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8B;ZNAMENNY NEUME STATYA ZAKRYTAYA;So;0;L;;;;;N;;;;; +1CF8C;ZNAMENNY NEUME STATYA ZAKRYTAYA S ZAPYATOY;So;0;L;;;;;N;;;;; +1CF8D;ZNAMENNY NEUME STATYA S ROGOM;So;0;L;;;;;N;;;;; +1CF8E;ZNAMENNY NEUME STATYA S DVUMYA ZAPYATYMI;So;0;L;;;;;N;;;;; +1CF8F;ZNAMENNY NEUME STATYA S ZAPYATOY I PODCHASHIEM;So;0;L;;;;;N;;;;; +1CF90;ZNAMENNY NEUME POLKULIZMY;So;0;L;;;;;N;;;;; +1CF91;ZNAMENNY NEUME STATYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF92;ZNAMENNY NEUME STRELA PROSTAYA;So;0;L;;;;;N;;;;; +1CF93;ZNAMENNY NEUME STRELA MRACHNOTIKHAYA;So;0;L;;;;;N;;;;; +1CF94;ZNAMENNY NEUME STRELA KRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF95;ZNAMENNY NEUME STRELA POLUPOVODNAYA;So;0;L;;;;;N;;;;; +1CF96;ZNAMENNY NEUME STRELA POVODNAYA;So;0;L;;;;;N;;;;; +1CF97;ZNAMENNY NEUME STRELA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF98;ZNAMENNY NEUME STRELA KLYUCHEPOVODNAYA;So;0;L;;;;;N;;;;; +1CF99;ZNAMENNY NEUME STRELA KLYUCHENEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CF9A;ZNAMENNY NEUME STRELA TIKHAYA PUTNAYA;So;0;L;;;;;N;;;;; +1CF9B;ZNAMENNY NEUME STRELA DVOECHELNAYA;So;0;L;;;;;N;;;;; +1CF9C;ZNAMENNY NEUME STRELA DVOECHELNOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CF9D;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA;So;0;L;;;;;N;;;;; +1CF9E;ZNAMENNY NEUME STRELA DVOECHELNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CF9F;ZNAMENNY NEUME STRELA DVOECHELNOPOVODNAYA KLYUCHEVAYA;So;0;L;;;;;N;;;;; +1CFA0;ZNAMENNY NEUME STRELA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA1;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA2;ZNAMENNY NEUME STRELA GROMNAYA;So;0;L;;;;;N;;;;; +1CFA3;ZNAMENNY NEUME STRELA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFA4;ZNAMENNY NEUME STRELA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFA5;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFA6;ZNAMENNY NEUME STRELA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFA7;ZNAMENNY NEUME MECHIK;So;0;L;;;;;N;;;;; +1CFA8;ZNAMENNY NEUME MECHIK POVODNY;So;0;L;;;;;N;;;;; +1CFA9;ZNAMENNY NEUME MECHIK KLYUCHEVOY;So;0;L;;;;;N;;;;; +1CFAA;ZNAMENNY NEUME MECHIK KLYUCHEPOVODNY;So;0;L;;;;;N;;;;; +1CFAB;ZNAMENNY NEUME MECHIK KLYUCHENEPOSTOYANNY;So;0;L;;;;;N;;;;; +1CFAC;ZNAMENNY NEUME STRELA TRYASOGLASNAYA;So;0;L;;;;;N;;;;; +1CFAD;ZNAMENNY NEUME STRELA TRYASOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFAE;ZNAMENNY NEUME STRELA TRYASOSTRELNAYA;So;0;L;;;;;N;;;;; +1CFAF;ZNAMENNY NEUME OSOKA;So;0;L;;;;;N;;;;; +1CFB0;ZNAMENNY NEUME OSOKA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB1;ZNAMENNY NEUME OSOKA TRESVETLAYA;So;0;L;;;;;N;;;;; +1CFB2;ZNAMENNY NEUME OSOKA KRYUKOVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB3;ZNAMENNY NEUME OSOKA KLYUCHEVAYA SVETLAYA;So;0;L;;;;;N;;;;; +1CFB4;ZNAMENNY NEUME OSOKA KLYUCHEVAYA NEPOSTOYANNAYA;So;0;L;;;;;N;;;;; +1CFB5;ZNAMENNY NEUME STRELA KRYUKOVAYA;So;0;L;;;;;N;;;;; +1CFB6;ZNAMENNY NEUME STRELA KRYUKOVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFB7;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB8;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH SINGLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFB9;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMNAYA;So;0;L;;;;;N;;;;; +1CFBA;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA;So;0;L;;;;;N;;;;; +1CFBB;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOPOVODNAYA WITH DOUBLE ZAPYATAYA;So;0;L;;;;;N;;;;; +1CFBC;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA;So;0;L;;;;;N;;;;; +1CFBD;ZNAMENNY NEUME STRELA KRYUKOVAYA GROMOKRYZHEVAYA POVODNAYA;So;0;L;;;;;N;;;;; +1CFBE;ZNAMENNY NEUME STRELA KRYUKOVAYA TRYASKA;So;0;L;;;;;N;;;;; +1CFBF;ZNAMENNY NEUME KUFISMA;So;0;L;;;;;N;;;;; +1CFC0;ZNAMENNY NEUME OBLAKO;So;0;L;;;;;N;;;;; +1CFC1;ZNAMENNY NEUME DUDA;So;0;L;;;;;N;;;;; +1CFC2;ZNAMENNY NEUME NEMKA;So;0;L;;;;;N;;;;; +1CFC3;ZNAMENNY NEUME PAUK;So;0;L;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; +1D1E9;MUSICAL SYMBOL SORI;So;0;ON;;;;;N;;;;; +1D1EA;MUSICAL SYMBOL KORON;So;0;ON;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D2C0;KAKTOVIK NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2C1;KAKTOVIK NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2C2;KAKTOVIK NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2C3;KAKTOVIK NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2C4;KAKTOVIK NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2C5;KAKTOVIK NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2C6;KAKTOVIK NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2C7;KAKTOVIK NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2C8;KAKTOVIK NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2C9;KAKTOVIK NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2CA;KAKTOVIK NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2CB;KAKTOVIK NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2CC;KAKTOVIK NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2CD;KAKTOVIK NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2CE;KAKTOVIK NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2CF;KAKTOVIK NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2D0;KAKTOVIK NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2D1;KAKTOVIK NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2D2;KAKTOVIK NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2D3;KAKTOVIK NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D2E0;MAYAN NUMERAL ZERO;No;0;L;;;;0;N;;;;; +1D2E1;MAYAN NUMERAL ONE;No;0;L;;;;1;N;;;;; +1D2E2;MAYAN NUMERAL TWO;No;0;L;;;;2;N;;;;; +1D2E3;MAYAN NUMERAL THREE;No;0;L;;;;3;N;;;;; +1D2E4;MAYAN NUMERAL FOUR;No;0;L;;;;4;N;;;;; +1D2E5;MAYAN NUMERAL FIVE;No;0;L;;;;5;N;;;;; +1D2E6;MAYAN NUMERAL SIX;No;0;L;;;;6;N;;;;; +1D2E7;MAYAN NUMERAL SEVEN;No;0;L;;;;7;N;;;;; +1D2E8;MAYAN NUMERAL EIGHT;No;0;L;;;;8;N;;;;; +1D2E9;MAYAN NUMERAL NINE;No;0;L;;;;9;N;;;;; +1D2EA;MAYAN NUMERAL TEN;No;0;L;;;;10;N;;;;; +1D2EB;MAYAN NUMERAL ELEVEN;No;0;L;;;;11;N;;;;; +1D2EC;MAYAN NUMERAL TWELVE;No;0;L;;;;12;N;;;;; +1D2ED;MAYAN NUMERAL THIRTEEN;No;0;L;;;;13;N;;;;; +1D2EE;MAYAN NUMERAL FOURTEEN;No;0;L;;;;14;N;;;;; +1D2EF;MAYAN NUMERAL FIFTEEN;No;0;L;;;;15;N;;;;; +1D2F0;MAYAN NUMERAL SIXTEEN;No;0;L;;;;16;N;;;;; +1D2F1;MAYAN NUMERAL SEVENTEEN;No;0;L;;;;17;N;;;;; +1D2F2;MAYAN NUMERAL EIGHTEEN;No;0;L;;;;18;N;;;;; +1D2F3;MAYAN NUMERAL NINETEEN;No;0;L;;;;19;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D372;IDEOGRAPHIC TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D373;IDEOGRAPHIC TALLY MARK TWO;No;0;L;;;;2;N;;;;; +1D374;IDEOGRAPHIC TALLY MARK THREE;No;0;L;;;;3;N;;;;; +1D375;IDEOGRAPHIC TALLY MARK FOUR;No;0;L;;;;4;N;;;;; +1D376;IDEOGRAPHIC TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D377;TALLY MARK ONE;No;0;L;;;;1;N;;;;; +1D378;TALLY MARK FIVE;No;0;L;;;;5;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON;<font> 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; +1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; +1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; +1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; +1DF00;LATIN SMALL LETTER FENG DIGRAPH WITH TRILL;Ll;0;L;;;;;N;;;;; +1DF01;LATIN SMALL LETTER REVERSED SCRIPT G;Ll;0;L;;;;;N;;;;; +1DF02;LATIN LETTER SMALL CAPITAL TURNED G;Ll;0;L;;;;;N;;;;; +1DF03;LATIN SMALL LETTER REVERSED K;Ll;0;L;;;;;N;;;;; +1DF04;LATIN LETTER SMALL CAPITAL L WITH BELT;Ll;0;L;;;;;N;;;;; +1DF05;LATIN SMALL LETTER LEZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF06;LATIN SMALL LETTER TURNED Y WITH BELT;Ll;0;L;;;;;N;;;;; +1DF07;LATIN SMALL LETTER REVERSED ENG;Ll;0;L;;;;;N;;;;; +1DF08;LATIN SMALL LETTER TURNED R WITH LONG LEG AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF09;LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF0A;LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK;Lo;0;L;;;;;N;;;;; +1DF0B;LATIN SMALL LETTER ESH WITH DOUBLE BAR;Ll;0;L;;;;;N;;;;; +1DF0C;LATIN SMALL LETTER ESH WITH DOUBLE BAR AND CURL;Ll;0;L;;;;;N;;;;; +1DF0D;LATIN SMALL LETTER TURNED T WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0E;LATIN LETTER INVERTED GLOTTAL STOP WITH CURL;Ll;0;L;;;;;N;;;;; +1DF0F;LATIN LETTER STRETCHED C WITH CURL;Ll;0;L;;;;;N;;;;; +1DF10;LATIN LETTER SMALL CAPITAL TURNED K;Ll;0;L;;;;;N;;;;; +1DF11;LATIN SMALL LETTER L WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +1DF12;LATIN SMALL LETTER DEZH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF13;LATIN SMALL LETTER L WITH BELT AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF14;LATIN SMALL LETTER ENG WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF15;LATIN SMALL LETTER TURNED R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF16;LATIN SMALL LETTER R WITH FISHHOOK AND PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF17;LATIN SMALL LETTER TESH DIGRAPH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF18;LATIN SMALL LETTER EZH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1DF19;LATIN SMALL LETTER DEZH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1A;LATIN SMALL LETTER I WITH STROKE AND RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1B;LATIN SMALL LETTER O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1C;LATIN SMALL LETTER TESH DIGRAPH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1D;LATIN SMALL LETTER C WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1DF1E;LATIN SMALL LETTER S WITH CURL;Ll;0;L;;;;;N;;;;; +1DF25;LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF26;LATIN SMALL LETTER L WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF27;LATIN SMALL LETTER N WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF28;LATIN SMALL LETTER R WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF29;LATIN SMALL LETTER S WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1DF2A;LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK;Ll;0;L;;;;;N;;;;; +1E000;COMBINING GLAGOLITIC LETTER AZU;Mn;230;NSM;;;;;N;;;;; +1E001;COMBINING GLAGOLITIC LETTER BUKY;Mn;230;NSM;;;;;N;;;;; +1E002;COMBINING GLAGOLITIC LETTER VEDE;Mn;230;NSM;;;;;N;;;;; +1E003;COMBINING GLAGOLITIC LETTER GLAGOLI;Mn;230;NSM;;;;;N;;;;; +1E004;COMBINING GLAGOLITIC LETTER DOBRO;Mn;230;NSM;;;;;N;;;;; +1E005;COMBINING GLAGOLITIC LETTER YESTU;Mn;230;NSM;;;;;N;;;;; +1E006;COMBINING GLAGOLITIC LETTER ZHIVETE;Mn;230;NSM;;;;;N;;;;; +1E008;COMBINING GLAGOLITIC LETTER ZEMLJA;Mn;230;NSM;;;;;N;;;;; +1E009;COMBINING GLAGOLITIC LETTER IZHE;Mn;230;NSM;;;;;N;;;;; +1E00A;COMBINING GLAGOLITIC LETTER INITIAL IZHE;Mn;230;NSM;;;;;N;;;;; +1E00B;COMBINING GLAGOLITIC LETTER I;Mn;230;NSM;;;;;N;;;;; +1E00C;COMBINING GLAGOLITIC LETTER DJERVI;Mn;230;NSM;;;;;N;;;;; +1E00D;COMBINING GLAGOLITIC LETTER KAKO;Mn;230;NSM;;;;;N;;;;; +1E00E;COMBINING GLAGOLITIC LETTER LJUDIJE;Mn;230;NSM;;;;;N;;;;; +1E00F;COMBINING GLAGOLITIC LETTER MYSLITE;Mn;230;NSM;;;;;N;;;;; +1E010;COMBINING GLAGOLITIC LETTER NASHI;Mn;230;NSM;;;;;N;;;;; +1E011;COMBINING GLAGOLITIC LETTER ONU;Mn;230;NSM;;;;;N;;;;; +1E012;COMBINING GLAGOLITIC LETTER POKOJI;Mn;230;NSM;;;;;N;;;;; +1E013;COMBINING GLAGOLITIC LETTER RITSI;Mn;230;NSM;;;;;N;;;;; +1E014;COMBINING GLAGOLITIC LETTER SLOVO;Mn;230;NSM;;;;;N;;;;; +1E015;COMBINING GLAGOLITIC LETTER TVRIDO;Mn;230;NSM;;;;;N;;;;; +1E016;COMBINING GLAGOLITIC LETTER UKU;Mn;230;NSM;;;;;N;;;;; +1E017;COMBINING GLAGOLITIC LETTER FRITU;Mn;230;NSM;;;;;N;;;;; +1E018;COMBINING GLAGOLITIC LETTER HERU;Mn;230;NSM;;;;;N;;;;; +1E01B;COMBINING GLAGOLITIC LETTER SHTA;Mn;230;NSM;;;;;N;;;;; +1E01C;COMBINING GLAGOLITIC LETTER TSI;Mn;230;NSM;;;;;N;;;;; +1E01D;COMBINING GLAGOLITIC LETTER CHRIVI;Mn;230;NSM;;;;;N;;;;; +1E01E;COMBINING GLAGOLITIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +1E01F;COMBINING GLAGOLITIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +1E020;COMBINING GLAGOLITIC LETTER YERI;Mn;230;NSM;;;;;N;;;;; +1E021;COMBINING GLAGOLITIC LETTER YATI;Mn;230;NSM;;;;;N;;;;; +1E023;COMBINING GLAGOLITIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +1E024;COMBINING GLAGOLITIC LETTER SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E026;COMBINING GLAGOLITIC LETTER YO;Mn;230;NSM;;;;;N;;;;; +1E027;COMBINING GLAGOLITIC LETTER IOTATED SMALL YUS;Mn;230;NSM;;;;;N;;;;; +1E028;COMBINING GLAGOLITIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E029;COMBINING GLAGOLITIC LETTER IOTATED BIG YUS;Mn;230;NSM;;;;;N;;;;; +1E02A;COMBINING GLAGOLITIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +1E030;MODIFIER LETTER CYRILLIC SMALL A;Lm;0;L;<super> 0430;;;;N;;;;; +1E031;MODIFIER LETTER CYRILLIC SMALL BE;Lm;0;L;<super> 0431;;;;N;;;;; +1E032;MODIFIER LETTER CYRILLIC SMALL VE;Lm;0;L;<super> 0432;;;;N;;;;; +1E033;MODIFIER LETTER CYRILLIC SMALL GHE;Lm;0;L;<super> 0433;;;;N;;;;; +1E034;MODIFIER LETTER CYRILLIC SMALL DE;Lm;0;L;<super> 0434;;;;N;;;;; +1E035;MODIFIER LETTER CYRILLIC SMALL IE;Lm;0;L;<super> 0435;;;;N;;;;; +1E036;MODIFIER LETTER CYRILLIC SMALL ZHE;Lm;0;L;<super> 0436;;;;N;;;;; +1E037;MODIFIER LETTER CYRILLIC SMALL ZE;Lm;0;L;<super> 0437;;;;N;;;;; +1E038;MODIFIER LETTER CYRILLIC SMALL I;Lm;0;L;<super> 0438;;;;N;;;;; +1E039;MODIFIER LETTER CYRILLIC SMALL KA;Lm;0;L;<super> 043A;;;;N;;;;; +1E03A;MODIFIER LETTER CYRILLIC SMALL EL;Lm;0;L;<super> 043B;;;;N;;;;; +1E03B;MODIFIER LETTER CYRILLIC SMALL EM;Lm;0;L;<super> 043C;;;;N;;;;; +1E03C;MODIFIER LETTER CYRILLIC SMALL O;Lm;0;L;<super> 043E;;;;N;;;;; +1E03D;MODIFIER LETTER CYRILLIC SMALL PE;Lm;0;L;<super> 043F;;;;N;;;;; +1E03E;MODIFIER LETTER CYRILLIC SMALL ER;Lm;0;L;<super> 0440;;;;N;;;;; +1E03F;MODIFIER LETTER CYRILLIC SMALL ES;Lm;0;L;<super> 0441;;;;N;;;;; +1E040;MODIFIER LETTER CYRILLIC SMALL TE;Lm;0;L;<super> 0442;;;;N;;;;; +1E041;MODIFIER LETTER CYRILLIC SMALL U;Lm;0;L;<super> 0443;;;;N;;;;; +1E042;MODIFIER LETTER CYRILLIC SMALL EF;Lm;0;L;<super> 0444;;;;N;;;;; +1E043;MODIFIER LETTER CYRILLIC SMALL HA;Lm;0;L;<super> 0445;;;;N;;;;; +1E044;MODIFIER LETTER CYRILLIC SMALL TSE;Lm;0;L;<super> 0446;;;;N;;;;; +1E045;MODIFIER LETTER CYRILLIC SMALL CHE;Lm;0;L;<super> 0447;;;;N;;;;; +1E046;MODIFIER LETTER CYRILLIC SMALL SHA;Lm;0;L;<super> 0448;;;;N;;;;; +1E047;MODIFIER LETTER CYRILLIC SMALL YERU;Lm;0;L;<super> 044B;;;;N;;;;; +1E048;MODIFIER LETTER CYRILLIC SMALL E;Lm;0;L;<super> 044D;;;;N;;;;; +1E049;MODIFIER LETTER CYRILLIC SMALL YU;Lm;0;L;<super> 044E;;;;N;;;;; +1E04A;MODIFIER LETTER CYRILLIC SMALL DZZE;Lm;0;L;<super> A689;;;;N;;;;; +1E04B;MODIFIER LETTER CYRILLIC SMALL SCHWA;Lm;0;L;<super> 04D9;;;;N;;;;; +1E04C;MODIFIER LETTER CYRILLIC SMALL BYELORUSSIAN-UKRAINIAN I;Lm;0;L;<super> 0456;;;;N;;;;; +1E04D;MODIFIER LETTER CYRILLIC SMALL JE;Lm;0;L;<super> 0458;;;;N;;;;; +1E04E;MODIFIER LETTER CYRILLIC SMALL BARRED O;Lm;0;L;<super> 04E9;;;;N;;;;; +1E04F;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U;Lm;0;L;<super> 04AF;;;;N;;;;; +1E050;MODIFIER LETTER CYRILLIC SMALL PALOCHKA;Lm;0;L;<super> 04CF;;;;N;;;;; +1E051;CYRILLIC SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0430;;;;N;;;;; +1E052;CYRILLIC SUBSCRIPT SMALL LETTER BE;Lm;0;L;<sub> 0431;;;;N;;;;; +1E053;CYRILLIC SUBSCRIPT SMALL LETTER VE;Lm;0;L;<sub> 0432;;;;N;;;;; +1E054;CYRILLIC SUBSCRIPT SMALL LETTER GHE;Lm;0;L;<sub> 0433;;;;N;;;;; +1E055;CYRILLIC SUBSCRIPT SMALL LETTER DE;Lm;0;L;<sub> 0434;;;;N;;;;; +1E056;CYRILLIC SUBSCRIPT SMALL LETTER IE;Lm;0;L;<sub> 0435;;;;N;;;;; +1E057;CYRILLIC SUBSCRIPT SMALL LETTER ZHE;Lm;0;L;<sub> 0436;;;;N;;;;; +1E058;CYRILLIC SUBSCRIPT SMALL LETTER ZE;Lm;0;L;<sub> 0437;;;;N;;;;; +1E059;CYRILLIC SUBSCRIPT SMALL LETTER I;Lm;0;L;<sub> 0438;;;;N;;;;; +1E05A;CYRILLIC SUBSCRIPT SMALL LETTER KA;Lm;0;L;<sub> 043A;;;;N;;;;; +1E05B;CYRILLIC SUBSCRIPT SMALL LETTER EL;Lm;0;L;<sub> 043B;;;;N;;;;; +1E05C;CYRILLIC SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 043E;;;;N;;;;; +1E05D;CYRILLIC SUBSCRIPT SMALL LETTER PE;Lm;0;L;<sub> 043F;;;;N;;;;; +1E05E;CYRILLIC SUBSCRIPT SMALL LETTER ES;Lm;0;L;<sub> 0441;;;;N;;;;; +1E05F;CYRILLIC SUBSCRIPT SMALL LETTER U;Lm;0;L;<sub> 0443;;;;N;;;;; +1E060;CYRILLIC SUBSCRIPT SMALL LETTER EF;Lm;0;L;<sub> 0444;;;;N;;;;; +1E061;CYRILLIC SUBSCRIPT SMALL LETTER HA;Lm;0;L;<sub> 0445;;;;N;;;;; +1E062;CYRILLIC SUBSCRIPT SMALL LETTER TSE;Lm;0;L;<sub> 0446;;;;N;;;;; +1E063;CYRILLIC SUBSCRIPT SMALL LETTER CHE;Lm;0;L;<sub> 0447;;;;N;;;;; +1E064;CYRILLIC SUBSCRIPT SMALL LETTER SHA;Lm;0;L;<sub> 0448;;;;N;;;;; +1E065;CYRILLIC SUBSCRIPT SMALL LETTER HARD SIGN;Lm;0;L;<sub> 044A;;;;N;;;;; +1E066;CYRILLIC SUBSCRIPT SMALL LETTER YERU;Lm;0;L;<sub> 044B;;;;N;;;;; +1E067;CYRILLIC SUBSCRIPT SMALL LETTER GHE WITH UPTURN;Lm;0;L;<sub> 0491;;;;N;;;;; +1E068;CYRILLIC SUBSCRIPT SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Lm;0;L;<sub> 0456;;;;N;;;;; +1E069;CYRILLIC SUBSCRIPT SMALL LETTER DZE;Lm;0;L;<sub> 0455;;;;N;;;;; +1E06A;CYRILLIC SUBSCRIPT SMALL LETTER DZHE;Lm;0;L;<sub> 045F;;;;N;;;;; +1E06B;MODIFIER LETTER CYRILLIC SMALL ES WITH DESCENDER;Lm;0;L;<super> 04AB;;;;N;;;;; +1E06C;MODIFIER LETTER CYRILLIC SMALL YERU WITH BACK YER;Lm;0;L;<super> A651;;;;N;;;;; +1E06D;MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE;Lm;0;L;<super> 04B1;;;;N;;;;; +1E08F;COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Mn;230;NSM;;;;;N;;;;; +1E100;NYIAKENG PUACHUE HMONG LETTER MA;Lo;0;L;;;;;N;;;;; +1E101;NYIAKENG PUACHUE HMONG LETTER TSA;Lo;0;L;;;;;N;;;;; +1E102;NYIAKENG PUACHUE HMONG LETTER NTA;Lo;0;L;;;;;N;;;;; +1E103;NYIAKENG PUACHUE HMONG LETTER TA;Lo;0;L;;;;;N;;;;; +1E104;NYIAKENG PUACHUE HMONG LETTER HA;Lo;0;L;;;;;N;;;;; +1E105;NYIAKENG PUACHUE HMONG LETTER NA;Lo;0;L;;;;;N;;;;; +1E106;NYIAKENG PUACHUE HMONG LETTER XA;Lo;0;L;;;;;N;;;;; +1E107;NYIAKENG PUACHUE HMONG LETTER NKA;Lo;0;L;;;;;N;;;;; +1E108;NYIAKENG PUACHUE HMONG LETTER CA;Lo;0;L;;;;;N;;;;; +1E109;NYIAKENG PUACHUE HMONG LETTER LA;Lo;0;L;;;;;N;;;;; +1E10A;NYIAKENG PUACHUE HMONG LETTER SA;Lo;0;L;;;;;N;;;;; +1E10B;NYIAKENG PUACHUE HMONG LETTER ZA;Lo;0;L;;;;;N;;;;; +1E10C;NYIAKENG PUACHUE HMONG LETTER NCA;Lo;0;L;;;;;N;;;;; +1E10D;NYIAKENG PUACHUE HMONG LETTER NTSA;Lo;0;L;;;;;N;;;;; +1E10E;NYIAKENG PUACHUE HMONG LETTER KA;Lo;0;L;;;;;N;;;;; +1E10F;NYIAKENG PUACHUE HMONG LETTER DA;Lo;0;L;;;;;N;;;;; +1E110;NYIAKENG PUACHUE HMONG LETTER NYA;Lo;0;L;;;;;N;;;;; +1E111;NYIAKENG PUACHUE HMONG LETTER NRA;Lo;0;L;;;;;N;;;;; +1E112;NYIAKENG PUACHUE HMONG LETTER VA;Lo;0;L;;;;;N;;;;; +1E113;NYIAKENG PUACHUE HMONG LETTER NTXA;Lo;0;L;;;;;N;;;;; +1E114;NYIAKENG PUACHUE HMONG LETTER TXA;Lo;0;L;;;;;N;;;;; +1E115;NYIAKENG PUACHUE HMONG LETTER FA;Lo;0;L;;;;;N;;;;; +1E116;NYIAKENG PUACHUE HMONG LETTER RA;Lo;0;L;;;;;N;;;;; +1E117;NYIAKENG PUACHUE HMONG LETTER QA;Lo;0;L;;;;;N;;;;; +1E118;NYIAKENG PUACHUE HMONG LETTER YA;Lo;0;L;;;;;N;;;;; +1E119;NYIAKENG PUACHUE HMONG LETTER NQA;Lo;0;L;;;;;N;;;;; +1E11A;NYIAKENG PUACHUE HMONG LETTER PA;Lo;0;L;;;;;N;;;;; +1E11B;NYIAKENG PUACHUE HMONG LETTER XYA;Lo;0;L;;;;;N;;;;; +1E11C;NYIAKENG PUACHUE HMONG LETTER NPA;Lo;0;L;;;;;N;;;;; +1E11D;NYIAKENG PUACHUE HMONG LETTER DLA;Lo;0;L;;;;;N;;;;; +1E11E;NYIAKENG PUACHUE HMONG LETTER NPLA;Lo;0;L;;;;;N;;;;; +1E11F;NYIAKENG PUACHUE HMONG LETTER HAH;Lo;0;L;;;;;N;;;;; +1E120;NYIAKENG PUACHUE HMONG LETTER MLA;Lo;0;L;;;;;N;;;;; +1E121;NYIAKENG PUACHUE HMONG LETTER PLA;Lo;0;L;;;;;N;;;;; +1E122;NYIAKENG PUACHUE HMONG LETTER GA;Lo;0;L;;;;;N;;;;; +1E123;NYIAKENG PUACHUE HMONG LETTER RRA;Lo;0;L;;;;;N;;;;; +1E124;NYIAKENG PUACHUE HMONG LETTER A;Lo;0;L;;;;;N;;;;; +1E125;NYIAKENG PUACHUE HMONG LETTER AA;Lo;0;L;;;;;N;;;;; +1E126;NYIAKENG PUACHUE HMONG LETTER I;Lo;0;L;;;;;N;;;;; +1E127;NYIAKENG PUACHUE HMONG LETTER U;Lo;0;L;;;;;N;;;;; +1E128;NYIAKENG PUACHUE HMONG LETTER O;Lo;0;L;;;;;N;;;;; +1E129;NYIAKENG PUACHUE HMONG LETTER OO;Lo;0;L;;;;;N;;;;; +1E12A;NYIAKENG PUACHUE HMONG LETTER E;Lo;0;L;;;;;N;;;;; +1E12B;NYIAKENG PUACHUE HMONG LETTER EE;Lo;0;L;;;;;N;;;;; +1E12C;NYIAKENG PUACHUE HMONG LETTER W;Lo;0;L;;;;;N;;;;; +1E130;NYIAKENG PUACHUE HMONG TONE-B;Mn;230;NSM;;;;;N;;;;; +1E131;NYIAKENG PUACHUE HMONG TONE-M;Mn;230;NSM;;;;;N;;;;; +1E132;NYIAKENG PUACHUE HMONG TONE-J;Mn;230;NSM;;;;;N;;;;; +1E133;NYIAKENG PUACHUE HMONG TONE-V;Mn;230;NSM;;;;;N;;;;; +1E134;NYIAKENG PUACHUE HMONG TONE-S;Mn;230;NSM;;;;;N;;;;; +1E135;NYIAKENG PUACHUE HMONG TONE-G;Mn;230;NSM;;;;;N;;;;; +1E136;NYIAKENG PUACHUE HMONG TONE-D;Mn;230;NSM;;;;;N;;;;; +1E137;NYIAKENG PUACHUE HMONG SIGN FOR PERSON;Lm;0;L;;;;;N;;;;; +1E138;NYIAKENG PUACHUE HMONG SIGN FOR THING;Lm;0;L;;;;;N;;;;; +1E139;NYIAKENG PUACHUE HMONG SIGN FOR LOCATION;Lm;0;L;;;;;N;;;;; +1E13A;NYIAKENG PUACHUE HMONG SIGN FOR ANIMAL;Lm;0;L;;;;;N;;;;; +1E13B;NYIAKENG PUACHUE HMONG SIGN FOR INVERTEBRATE;Lm;0;L;;;;;N;;;;; +1E13C;NYIAKENG PUACHUE HMONG SIGN XW XW;Lm;0;L;;;;;N;;;;; +1E13D;NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +1E140;NYIAKENG PUACHUE HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E141;NYIAKENG PUACHUE HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E142;NYIAKENG PUACHUE HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E143;NYIAKENG PUACHUE HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E144;NYIAKENG PUACHUE HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E145;NYIAKENG PUACHUE HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E146;NYIAKENG PUACHUE HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E147;NYIAKENG PUACHUE HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E148;NYIAKENG PUACHUE HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E149;NYIAKENG PUACHUE HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E14E;NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ;Lo;0;L;;;;;N;;;;; +1E14F;NYIAKENG PUACHUE HMONG CIRCLED CA;So;0;L;;;;;N;;;;; +1E290;TOTO LETTER PA;Lo;0;L;;;;;N;;;;; +1E291;TOTO LETTER BA;Lo;0;L;;;;;N;;;;; +1E292;TOTO LETTER TA;Lo;0;L;;;;;N;;;;; +1E293;TOTO LETTER DA;Lo;0;L;;;;;N;;;;; +1E294;TOTO LETTER KA;Lo;0;L;;;;;N;;;;; +1E295;TOTO LETTER GA;Lo;0;L;;;;;N;;;;; +1E296;TOTO LETTER MA;Lo;0;L;;;;;N;;;;; +1E297;TOTO LETTER NA;Lo;0;L;;;;;N;;;;; +1E298;TOTO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E299;TOTO LETTER SA;Lo;0;L;;;;;N;;;;; +1E29A;TOTO LETTER CHA;Lo;0;L;;;;;N;;;;; +1E29B;TOTO LETTER YA;Lo;0;L;;;;;N;;;;; +1E29C;TOTO LETTER WA;Lo;0;L;;;;;N;;;;; +1E29D;TOTO LETTER JA;Lo;0;L;;;;;N;;;;; +1E29E;TOTO LETTER HA;Lo;0;L;;;;;N;;;;; +1E29F;TOTO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2A0;TOTO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2A1;TOTO LETTER I;Lo;0;L;;;;;N;;;;; +1E2A2;TOTO LETTER BREATHY I;Lo;0;L;;;;;N;;;;; +1E2A3;TOTO LETTER IU;Lo;0;L;;;;;N;;;;; +1E2A4;TOTO LETTER BREATHY IU;Lo;0;L;;;;;N;;;;; +1E2A5;TOTO LETTER U;Lo;0;L;;;;;N;;;;; +1E2A6;TOTO LETTER E;Lo;0;L;;;;;N;;;;; +1E2A7;TOTO LETTER BREATHY E;Lo;0;L;;;;;N;;;;; +1E2A8;TOTO LETTER EO;Lo;0;L;;;;;N;;;;; +1E2A9;TOTO LETTER BREATHY EO;Lo;0;L;;;;;N;;;;; +1E2AA;TOTO LETTER O;Lo;0;L;;;;;N;;;;; +1E2AB;TOTO LETTER AE;Lo;0;L;;;;;N;;;;; +1E2AC;TOTO LETTER BREATHY AE;Lo;0;L;;;;;N;;;;; +1E2AD;TOTO LETTER A;Lo;0;L;;;;;N;;;;; +1E2AE;TOTO SIGN RISING TONE;Mn;230;NSM;;;;;N;;;;; +1E2C0;WANCHO LETTER AA;Lo;0;L;;;;;N;;;;; +1E2C1;WANCHO LETTER A;Lo;0;L;;;;;N;;;;; +1E2C2;WANCHO LETTER BA;Lo;0;L;;;;;N;;;;; +1E2C3;WANCHO LETTER CA;Lo;0;L;;;;;N;;;;; +1E2C4;WANCHO LETTER DA;Lo;0;L;;;;;N;;;;; +1E2C5;WANCHO LETTER GA;Lo;0;L;;;;;N;;;;; +1E2C6;WANCHO LETTER YA;Lo;0;L;;;;;N;;;;; +1E2C7;WANCHO LETTER PHA;Lo;0;L;;;;;N;;;;; +1E2C8;WANCHO LETTER LA;Lo;0;L;;;;;N;;;;; +1E2C9;WANCHO LETTER NA;Lo;0;L;;;;;N;;;;; +1E2CA;WANCHO LETTER PA;Lo;0;L;;;;;N;;;;; +1E2CB;WANCHO LETTER TA;Lo;0;L;;;;;N;;;;; +1E2CC;WANCHO LETTER THA;Lo;0;L;;;;;N;;;;; +1E2CD;WANCHO LETTER FA;Lo;0;L;;;;;N;;;;; +1E2CE;WANCHO LETTER SA;Lo;0;L;;;;;N;;;;; +1E2CF;WANCHO LETTER SHA;Lo;0;L;;;;;N;;;;; +1E2D0;WANCHO LETTER JA;Lo;0;L;;;;;N;;;;; +1E2D1;WANCHO LETTER ZA;Lo;0;L;;;;;N;;;;; +1E2D2;WANCHO LETTER WA;Lo;0;L;;;;;N;;;;; +1E2D3;WANCHO LETTER VA;Lo;0;L;;;;;N;;;;; +1E2D4;WANCHO LETTER KA;Lo;0;L;;;;;N;;;;; +1E2D5;WANCHO LETTER O;Lo;0;L;;;;;N;;;;; +1E2D6;WANCHO LETTER AU;Lo;0;L;;;;;N;;;;; +1E2D7;WANCHO LETTER RA;Lo;0;L;;;;;N;;;;; +1E2D8;WANCHO LETTER MA;Lo;0;L;;;;;N;;;;; +1E2D9;WANCHO LETTER KHA;Lo;0;L;;;;;N;;;;; +1E2DA;WANCHO LETTER HA;Lo;0;L;;;;;N;;;;; +1E2DB;WANCHO LETTER E;Lo;0;L;;;;;N;;;;; +1E2DC;WANCHO LETTER I;Lo;0;L;;;;;N;;;;; +1E2DD;WANCHO LETTER NGA;Lo;0;L;;;;;N;;;;; +1E2DE;WANCHO LETTER U;Lo;0;L;;;;;N;;;;; +1E2DF;WANCHO LETTER LLHA;Lo;0;L;;;;;N;;;;; +1E2E0;WANCHO LETTER TSA;Lo;0;L;;;;;N;;;;; +1E2E1;WANCHO LETTER TRA;Lo;0;L;;;;;N;;;;; +1E2E2;WANCHO LETTER ONG;Lo;0;L;;;;;N;;;;; +1E2E3;WANCHO LETTER AANG;Lo;0;L;;;;;N;;;;; +1E2E4;WANCHO LETTER ANG;Lo;0;L;;;;;N;;;;; +1E2E5;WANCHO LETTER ING;Lo;0;L;;;;;N;;;;; +1E2E6;WANCHO LETTER ON;Lo;0;L;;;;;N;;;;; +1E2E7;WANCHO LETTER EN;Lo;0;L;;;;;N;;;;; +1E2E8;WANCHO LETTER AAN;Lo;0;L;;;;;N;;;;; +1E2E9;WANCHO LETTER NYA;Lo;0;L;;;;;N;;;;; +1E2EA;WANCHO LETTER UEN;Lo;0;L;;;;;N;;;;; +1E2EB;WANCHO LETTER YIH;Lo;0;L;;;;;N;;;;; +1E2EC;WANCHO TONE TUP;Mn;230;NSM;;;;;N;;;;; +1E2ED;WANCHO TONE TUPNI;Mn;230;NSM;;;;;N;;;;; +1E2EE;WANCHO TONE KOI;Mn;230;NSM;;;;;N;;;;; +1E2EF;WANCHO TONE KOINI;Mn;230;NSM;;;;;N;;;;; +1E2F0;WANCHO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E2F1;WANCHO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E2F2;WANCHO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E2F3;WANCHO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E2F4;WANCHO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E2F5;WANCHO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E2F6;WANCHO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E2F7;WANCHO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E2F8;WANCHO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E2F9;WANCHO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E2FF;WANCHO NGUN SIGN;Sc;0;ET;;;;;N;;;;; +1E4D0;NAG MUNDARI LETTER O;Lo;0;L;;;;;N;;;;; +1E4D1;NAG MUNDARI LETTER OP;Lo;0;L;;;;;N;;;;; +1E4D2;NAG MUNDARI LETTER OL;Lo;0;L;;;;;N;;;;; +1E4D3;NAG MUNDARI LETTER OY;Lo;0;L;;;;;N;;;;; +1E4D4;NAG MUNDARI LETTER ONG;Lo;0;L;;;;;N;;;;; +1E4D5;NAG MUNDARI LETTER A;Lo;0;L;;;;;N;;;;; +1E4D6;NAG MUNDARI LETTER AJ;Lo;0;L;;;;;N;;;;; +1E4D7;NAG MUNDARI LETTER AB;Lo;0;L;;;;;N;;;;; +1E4D8;NAG MUNDARI LETTER ANY;Lo;0;L;;;;;N;;;;; +1E4D9;NAG MUNDARI LETTER AH;Lo;0;L;;;;;N;;;;; +1E4DA;NAG MUNDARI LETTER I;Lo;0;L;;;;;N;;;;; +1E4DB;NAG MUNDARI LETTER IS;Lo;0;L;;;;;N;;;;; +1E4DC;NAG MUNDARI LETTER IDD;Lo;0;L;;;;;N;;;;; +1E4DD;NAG MUNDARI LETTER IT;Lo;0;L;;;;;N;;;;; +1E4DE;NAG MUNDARI LETTER IH;Lo;0;L;;;;;N;;;;; +1E4DF;NAG MUNDARI LETTER U;Lo;0;L;;;;;N;;;;; +1E4E0;NAG MUNDARI LETTER UC;Lo;0;L;;;;;N;;;;; +1E4E1;NAG MUNDARI LETTER UD;Lo;0;L;;;;;N;;;;; +1E4E2;NAG MUNDARI LETTER UK;Lo;0;L;;;;;N;;;;; +1E4E3;NAG MUNDARI LETTER UR;Lo;0;L;;;;;N;;;;; +1E4E4;NAG MUNDARI LETTER E;Lo;0;L;;;;;N;;;;; +1E4E5;NAG MUNDARI LETTER ENN;Lo;0;L;;;;;N;;;;; +1E4E6;NAG MUNDARI LETTER EG;Lo;0;L;;;;;N;;;;; +1E4E7;NAG MUNDARI LETTER EM;Lo;0;L;;;;;N;;;;; +1E4E8;NAG MUNDARI LETTER EN;Lo;0;L;;;;;N;;;;; +1E4E9;NAG MUNDARI LETTER ETT;Lo;0;L;;;;;N;;;;; +1E4EA;NAG MUNDARI LETTER ELL;Lo;0;L;;;;;N;;;;; +1E4EB;NAG MUNDARI SIGN OJOD;Lm;0;L;;;;;N;;;;; +1E4EC;NAG MUNDARI SIGN MUHOR;Mn;232;NSM;;;;;N;;;;; +1E4ED;NAG MUNDARI SIGN TOYOR;Mn;232;NSM;;;;;N;;;;; +1E4EE;NAG MUNDARI SIGN IKIR;Mn;220;NSM;;;;;N;;;;; +1E4EF;NAG MUNDARI SIGN SUTUH;Mn;230;NSM;;;;;N;;;;; +1E4F0;NAG MUNDARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1E4F1;NAG MUNDARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1E4F2;NAG MUNDARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1E4F3;NAG MUNDARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1E4F4;NAG MUNDARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1E4F5;NAG MUNDARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1E4F6;NAG MUNDARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1E4F7;NAG MUNDARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1E4F8;NAG MUNDARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1E4F9;NAG MUNDARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1E7E0;ETHIOPIC SYLLABLE HHYA;Lo;0;L;;;;;N;;;;; +1E7E1;ETHIOPIC SYLLABLE HHYU;Lo;0;L;;;;;N;;;;; +1E7E2;ETHIOPIC SYLLABLE HHYI;Lo;0;L;;;;;N;;;;; +1E7E3;ETHIOPIC SYLLABLE HHYAA;Lo;0;L;;;;;N;;;;; +1E7E4;ETHIOPIC SYLLABLE HHYEE;Lo;0;L;;;;;N;;;;; +1E7E5;ETHIOPIC SYLLABLE HHYE;Lo;0;L;;;;;N;;;;; +1E7E6;ETHIOPIC SYLLABLE HHYO;Lo;0;L;;;;;N;;;;; +1E7E8;ETHIOPIC SYLLABLE GURAGE HHWA;Lo;0;L;;;;;N;;;;; +1E7E9;ETHIOPIC SYLLABLE HHWI;Lo;0;L;;;;;N;;;;; +1E7EA;ETHIOPIC SYLLABLE HHWEE;Lo;0;L;;;;;N;;;;; +1E7EB;ETHIOPIC SYLLABLE HHWE;Lo;0;L;;;;;N;;;;; +1E7ED;ETHIOPIC SYLLABLE GURAGE MWI;Lo;0;L;;;;;N;;;;; +1E7EE;ETHIOPIC SYLLABLE GURAGE MWEE;Lo;0;L;;;;;N;;;;; +1E7F0;ETHIOPIC SYLLABLE GURAGE QWI;Lo;0;L;;;;;N;;;;; +1E7F1;ETHIOPIC SYLLABLE GURAGE QWEE;Lo;0;L;;;;;N;;;;; +1E7F2;ETHIOPIC SYLLABLE GURAGE QWE;Lo;0;L;;;;;N;;;;; +1E7F3;ETHIOPIC SYLLABLE GURAGE BWI;Lo;0;L;;;;;N;;;;; +1E7F4;ETHIOPIC SYLLABLE GURAGE BWEE;Lo;0;L;;;;;N;;;;; +1E7F5;ETHIOPIC SYLLABLE GURAGE KWI;Lo;0;L;;;;;N;;;;; +1E7F6;ETHIOPIC SYLLABLE GURAGE KWEE;Lo;0;L;;;;;N;;;;; +1E7F7;ETHIOPIC SYLLABLE GURAGE KWE;Lo;0;L;;;;;N;;;;; +1E7F8;ETHIOPIC SYLLABLE GURAGE GWI;Lo;0;L;;;;;N;;;;; +1E7F9;ETHIOPIC SYLLABLE GURAGE GWEE;Lo;0;L;;;;;N;;;;; +1E7FA;ETHIOPIC SYLLABLE GURAGE GWE;Lo;0;L;;;;;N;;;;; +1E7FB;ETHIOPIC SYLLABLE GURAGE FWI;Lo;0;L;;;;;N;;;;; +1E7FC;ETHIOPIC SYLLABLE GURAGE FWEE;Lo;0;L;;;;;N;;;;; +1E7FD;ETHIOPIC SYLLABLE GURAGE PWI;Lo;0;L;;;;;N;;;;; +1E7FE;ETHIOPIC SYLLABLE GURAGE PWEE;Lo;0;L;;;;;N;;;;; +1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; +1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; +1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1E900;ADLAM CAPITAL LETTER ALIF;Lu;0;R;;;;;N;;;;1E922; +1E901;ADLAM CAPITAL LETTER DAALI;Lu;0;R;;;;;N;;;;1E923; +1E902;ADLAM CAPITAL LETTER LAAM;Lu;0;R;;;;;N;;;;1E924; +1E903;ADLAM CAPITAL LETTER MIIM;Lu;0;R;;;;;N;;;;1E925; +1E904;ADLAM CAPITAL LETTER BA;Lu;0;R;;;;;N;;;;1E926; +1E905;ADLAM CAPITAL LETTER SINNYIIYHE;Lu;0;R;;;;;N;;;;1E927; +1E906;ADLAM CAPITAL LETTER PE;Lu;0;R;;;;;N;;;;1E928; +1E907;ADLAM CAPITAL LETTER BHE;Lu;0;R;;;;;N;;;;1E929; +1E908;ADLAM CAPITAL LETTER RA;Lu;0;R;;;;;N;;;;1E92A; +1E909;ADLAM CAPITAL LETTER E;Lu;0;R;;;;;N;;;;1E92B; +1E90A;ADLAM CAPITAL LETTER FA;Lu;0;R;;;;;N;;;;1E92C; +1E90B;ADLAM CAPITAL LETTER I;Lu;0;R;;;;;N;;;;1E92D; +1E90C;ADLAM CAPITAL LETTER O;Lu;0;R;;;;;N;;;;1E92E; +1E90D;ADLAM CAPITAL LETTER DHA;Lu;0;R;;;;;N;;;;1E92F; +1E90E;ADLAM CAPITAL LETTER YHE;Lu;0;R;;;;;N;;;;1E930; +1E90F;ADLAM CAPITAL LETTER WAW;Lu;0;R;;;;;N;;;;1E931; +1E910;ADLAM CAPITAL LETTER NUN;Lu;0;R;;;;;N;;;;1E932; +1E911;ADLAM CAPITAL LETTER KAF;Lu;0;R;;;;;N;;;;1E933; +1E912;ADLAM CAPITAL LETTER YA;Lu;0;R;;;;;N;;;;1E934; +1E913;ADLAM CAPITAL LETTER U;Lu;0;R;;;;;N;;;;1E935; +1E914;ADLAM CAPITAL LETTER JIIM;Lu;0;R;;;;;N;;;;1E936; +1E915;ADLAM CAPITAL LETTER CHI;Lu;0;R;;;;;N;;;;1E937; +1E916;ADLAM CAPITAL LETTER HA;Lu;0;R;;;;;N;;;;1E938; +1E917;ADLAM CAPITAL LETTER QAAF;Lu;0;R;;;;;N;;;;1E939; +1E918;ADLAM CAPITAL LETTER GA;Lu;0;R;;;;;N;;;;1E93A; +1E919;ADLAM CAPITAL LETTER NYA;Lu;0;R;;;;;N;;;;1E93B; +1E91A;ADLAM CAPITAL LETTER TU;Lu;0;R;;;;;N;;;;1E93C; +1E91B;ADLAM CAPITAL LETTER NHA;Lu;0;R;;;;;N;;;;1E93D; +1E91C;ADLAM CAPITAL LETTER VA;Lu;0;R;;;;;N;;;;1E93E; +1E91D;ADLAM CAPITAL LETTER KHA;Lu;0;R;;;;;N;;;;1E93F; +1E91E;ADLAM CAPITAL LETTER GBE;Lu;0;R;;;;;N;;;;1E940; +1E91F;ADLAM CAPITAL LETTER ZAL;Lu;0;R;;;;;N;;;;1E941; +1E920;ADLAM CAPITAL LETTER KPO;Lu;0;R;;;;;N;;;;1E942; +1E921;ADLAM CAPITAL LETTER SHA;Lu;0;R;;;;;N;;;;1E943; +1E922;ADLAM SMALL LETTER ALIF;Ll;0;R;;;;;N;;;1E900;;1E900 +1E923;ADLAM SMALL LETTER DAALI;Ll;0;R;;;;;N;;;1E901;;1E901 +1E924;ADLAM SMALL LETTER LAAM;Ll;0;R;;;;;N;;;1E902;;1E902 +1E925;ADLAM SMALL LETTER MIIM;Ll;0;R;;;;;N;;;1E903;;1E903 +1E926;ADLAM SMALL LETTER BA;Ll;0;R;;;;;N;;;1E904;;1E904 +1E927;ADLAM SMALL LETTER SINNYIIYHE;Ll;0;R;;;;;N;;;1E905;;1E905 +1E928;ADLAM SMALL LETTER PE;Ll;0;R;;;;;N;;;1E906;;1E906 +1E929;ADLAM SMALL LETTER BHE;Ll;0;R;;;;;N;;;1E907;;1E907 +1E92A;ADLAM SMALL LETTER RA;Ll;0;R;;;;;N;;;1E908;;1E908 +1E92B;ADLAM SMALL LETTER E;Ll;0;R;;;;;N;;;1E909;;1E909 +1E92C;ADLAM SMALL LETTER FA;Ll;0;R;;;;;N;;;1E90A;;1E90A +1E92D;ADLAM SMALL LETTER I;Ll;0;R;;;;;N;;;1E90B;;1E90B +1E92E;ADLAM SMALL LETTER O;Ll;0;R;;;;;N;;;1E90C;;1E90C +1E92F;ADLAM SMALL LETTER DHA;Ll;0;R;;;;;N;;;1E90D;;1E90D +1E930;ADLAM SMALL LETTER YHE;Ll;0;R;;;;;N;;;1E90E;;1E90E +1E931;ADLAM SMALL LETTER WAW;Ll;0;R;;;;;N;;;1E90F;;1E90F +1E932;ADLAM SMALL LETTER NUN;Ll;0;R;;;;;N;;;1E910;;1E910 +1E933;ADLAM SMALL LETTER KAF;Ll;0;R;;;;;N;;;1E911;;1E911 +1E934;ADLAM SMALL LETTER YA;Ll;0;R;;;;;N;;;1E912;;1E912 +1E935;ADLAM SMALL LETTER U;Ll;0;R;;;;;N;;;1E913;;1E913 +1E936;ADLAM SMALL LETTER JIIM;Ll;0;R;;;;;N;;;1E914;;1E914 +1E937;ADLAM SMALL LETTER CHI;Ll;0;R;;;;;N;;;1E915;;1E915 +1E938;ADLAM SMALL LETTER HA;Ll;0;R;;;;;N;;;1E916;;1E916 +1E939;ADLAM SMALL LETTER QAAF;Ll;0;R;;;;;N;;;1E917;;1E917 +1E93A;ADLAM SMALL LETTER GA;Ll;0;R;;;;;N;;;1E918;;1E918 +1E93B;ADLAM SMALL LETTER NYA;Ll;0;R;;;;;N;;;1E919;;1E919 +1E93C;ADLAM SMALL LETTER TU;Ll;0;R;;;;;N;;;1E91A;;1E91A +1E93D;ADLAM SMALL LETTER NHA;Ll;0;R;;;;;N;;;1E91B;;1E91B +1E93E;ADLAM SMALL LETTER VA;Ll;0;R;;;;;N;;;1E91C;;1E91C +1E93F;ADLAM SMALL LETTER KHA;Ll;0;R;;;;;N;;;1E91D;;1E91D +1E940;ADLAM SMALL LETTER GBE;Ll;0;R;;;;;N;;;1E91E;;1E91E +1E941;ADLAM SMALL LETTER ZAL;Ll;0;R;;;;;N;;;1E91F;;1E91F +1E942;ADLAM SMALL LETTER KPO;Ll;0;R;;;;;N;;;1E920;;1E920 +1E943;ADLAM SMALL LETTER SHA;Ll;0;R;;;;;N;;;1E921;;1E921 +1E944;ADLAM ALIF LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E945;ADLAM VOWEL LENGTHENER;Mn;230;NSM;;;;;N;;;;; +1E946;ADLAM GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1E947;ADLAM HAMZA;Mn;230;NSM;;;;;N;;;;; +1E948;ADLAM CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E949;ADLAM GEMINATE CONSONANT MODIFIER;Mn;230;NSM;;;;;N;;;;; +1E94A;ADLAM NUKTA;Mn;7;NSM;;;;;N;;;;; +1E94B;ADLAM NASALIZATION MARK;Lm;0;R;;;;;N;;;;; +1E950;ADLAM DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +1E951;ADLAM DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +1E952;ADLAM DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +1E953;ADLAM DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +1E954;ADLAM DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +1E955;ADLAM DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +1E956;ADLAM DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +1E957;ADLAM DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +1E958;ADLAM DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +1E959;ADLAM DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +1E95E;ADLAM INITIAL EXCLAMATION MARK;Po;0;R;;;;;N;;;;; +1E95F;ADLAM INITIAL QUESTION MARK;Po;0;R;;;;;N;;;;; +1EC71;INDIC SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1EC72;INDIC SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1EC73;INDIC SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1EC74;INDIC SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1EC75;INDIC SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1EC76;INDIC SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1EC77;INDIC SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1EC78;INDIC SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1EC79;INDIC SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1EC7A;INDIC SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1EC7B;INDIC SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1EC7C;INDIC SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1EC7D;INDIC SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1EC7E;INDIC SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1EC7F;INDIC SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1EC80;INDIC SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1EC81;INDIC SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1EC82;INDIC SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1EC83;INDIC SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1EC84;INDIC SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1EC85;INDIC SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1EC86;INDIC SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1EC87;INDIC SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1EC88;INDIC SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1EC89;INDIC SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1EC8A;INDIC SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1EC8B;INDIC SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1EC8C;INDIC SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1EC8D;INDIC SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1EC8E;INDIC SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1EC8F;INDIC SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1EC90;INDIC SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1EC91;INDIC SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1EC92;INDIC SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1EC93;INDIC SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1EC94;INDIC SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1EC95;INDIC SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1EC96;INDIC SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1EC97;INDIC SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1EC98;INDIC SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1EC99;INDIC SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1EC9A;INDIC SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1EC9B;INDIC SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1EC9C;INDIC SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1EC9D;INDIC SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1EC9E;INDIC SIYAQ NUMBER LAKH;No;0;AL;;;;100000;N;;;;; +1EC9F;INDIC SIYAQ NUMBER LAKHAN;No;0;AL;;;;200000;N;;;;; +1ECA0;INDIC SIYAQ LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ECA1;INDIC SIYAQ NUMBER KAROR;No;0;AL;;;;10000000;N;;;;; +1ECA2;INDIC SIYAQ NUMBER KARORAN;No;0;AL;;;;20000000;N;;;;; +1ECA3;INDIC SIYAQ NUMBER PREFIXED ONE;No;0;AL;;;;1;N;;;;; +1ECA4;INDIC SIYAQ NUMBER PREFIXED TWO;No;0;AL;;;;2;N;;;;; +1ECA5;INDIC SIYAQ NUMBER PREFIXED THREE;No;0;AL;;;;3;N;;;;; +1ECA6;INDIC SIYAQ NUMBER PREFIXED FOUR;No;0;AL;;;;4;N;;;;; +1ECA7;INDIC SIYAQ NUMBER PREFIXED FIVE;No;0;AL;;;;5;N;;;;; +1ECA8;INDIC SIYAQ NUMBER PREFIXED SIX;No;0;AL;;;;6;N;;;;; +1ECA9;INDIC SIYAQ NUMBER PREFIXED SEVEN;No;0;AL;;;;7;N;;;;; +1ECAA;INDIC SIYAQ NUMBER PREFIXED EIGHT;No;0;AL;;;;8;N;;;;; +1ECAB;INDIC SIYAQ NUMBER PREFIXED NINE;No;0;AL;;;;9;N;;;;; +1ECAC;INDIC SIYAQ PLACEHOLDER;So;0;AL;;;;;N;;;;; +1ECAD;INDIC SIYAQ FRACTION ONE QUARTER;No;0;AL;;;;1/4;N;;;;; +1ECAE;INDIC SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ECAF;INDIC SIYAQ FRACTION THREE QUARTERS;No;0;AL;;;;3/4;N;;;;; +1ECB0;INDIC SIYAQ RUPEE MARK;Sc;0;AL;;;;;N;;;;; +1ECB1;INDIC SIYAQ NUMBER ALTERNATE ONE;No;0;AL;;;;1;N;;;;; +1ECB2;INDIC SIYAQ NUMBER ALTERNATE TWO;No;0;AL;;;;2;N;;;;; +1ECB3;INDIC SIYAQ NUMBER ALTERNATE TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ECB4;INDIC SIYAQ ALTERNATE LAKH MARK;No;0;AL;;;;100000;N;;;;; +1ED01;OTTOMAN SIYAQ NUMBER ONE;No;0;AL;;;;1;N;;;;; +1ED02;OTTOMAN SIYAQ NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED03;OTTOMAN SIYAQ NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED04;OTTOMAN SIYAQ NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED05;OTTOMAN SIYAQ NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED06;OTTOMAN SIYAQ NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED07;OTTOMAN SIYAQ NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED08;OTTOMAN SIYAQ NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED09;OTTOMAN SIYAQ NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED0A;OTTOMAN SIYAQ NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED0B;OTTOMAN SIYAQ NUMBER TWENTY;No;0;AL;;;;20;N;;;;; +1ED0C;OTTOMAN SIYAQ NUMBER THIRTY;No;0;AL;;;;30;N;;;;; +1ED0D;OTTOMAN SIYAQ NUMBER FORTY;No;0;AL;;;;40;N;;;;; +1ED0E;OTTOMAN SIYAQ NUMBER FIFTY;No;0;AL;;;;50;N;;;;; +1ED0F;OTTOMAN SIYAQ NUMBER SIXTY;No;0;AL;;;;60;N;;;;; +1ED10;OTTOMAN SIYAQ NUMBER SEVENTY;No;0;AL;;;;70;N;;;;; +1ED11;OTTOMAN SIYAQ NUMBER EIGHTY;No;0;AL;;;;80;N;;;;; +1ED12;OTTOMAN SIYAQ NUMBER NINETY;No;0;AL;;;;90;N;;;;; +1ED13;OTTOMAN SIYAQ NUMBER ONE HUNDRED;No;0;AL;;;;100;N;;;;; +1ED14;OTTOMAN SIYAQ NUMBER TWO HUNDRED;No;0;AL;;;;200;N;;;;; +1ED15;OTTOMAN SIYAQ NUMBER THREE HUNDRED;No;0;AL;;;;300;N;;;;; +1ED16;OTTOMAN SIYAQ NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED17;OTTOMAN SIYAQ NUMBER FIVE HUNDRED;No;0;AL;;;;500;N;;;;; +1ED18;OTTOMAN SIYAQ NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED19;OTTOMAN SIYAQ NUMBER SEVEN HUNDRED;No;0;AL;;;;700;N;;;;; +1ED1A;OTTOMAN SIYAQ NUMBER EIGHT HUNDRED;No;0;AL;;;;800;N;;;;; +1ED1B;OTTOMAN SIYAQ NUMBER NINE HUNDRED;No;0;AL;;;;900;N;;;;; +1ED1C;OTTOMAN SIYAQ NUMBER ONE THOUSAND;No;0;AL;;;;1000;N;;;;; +1ED1D;OTTOMAN SIYAQ NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED1E;OTTOMAN SIYAQ NUMBER THREE THOUSAND;No;0;AL;;;;3000;N;;;;; +1ED1F;OTTOMAN SIYAQ NUMBER FOUR THOUSAND;No;0;AL;;;;4000;N;;;;; +1ED20;OTTOMAN SIYAQ NUMBER FIVE THOUSAND;No;0;AL;;;;5000;N;;;;; +1ED21;OTTOMAN SIYAQ NUMBER SIX THOUSAND;No;0;AL;;;;6000;N;;;;; +1ED22;OTTOMAN SIYAQ NUMBER SEVEN THOUSAND;No;0;AL;;;;7000;N;;;;; +1ED23;OTTOMAN SIYAQ NUMBER EIGHT THOUSAND;No;0;AL;;;;8000;N;;;;; +1ED24;OTTOMAN SIYAQ NUMBER NINE THOUSAND;No;0;AL;;;;9000;N;;;;; +1ED25;OTTOMAN SIYAQ NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED26;OTTOMAN SIYAQ NUMBER TWENTY THOUSAND;No;0;AL;;;;20000;N;;;;; +1ED27;OTTOMAN SIYAQ NUMBER THIRTY THOUSAND;No;0;AL;;;;30000;N;;;;; +1ED28;OTTOMAN SIYAQ NUMBER FORTY THOUSAND;No;0;AL;;;;40000;N;;;;; +1ED29;OTTOMAN SIYAQ NUMBER FIFTY THOUSAND;No;0;AL;;;;50000;N;;;;; +1ED2A;OTTOMAN SIYAQ NUMBER SIXTY THOUSAND;No;0;AL;;;;60000;N;;;;; +1ED2B;OTTOMAN SIYAQ NUMBER SEVENTY THOUSAND;No;0;AL;;;;70000;N;;;;; +1ED2C;OTTOMAN SIYAQ NUMBER EIGHTY THOUSAND;No;0;AL;;;;80000;N;;;;; +1ED2D;OTTOMAN SIYAQ NUMBER NINETY THOUSAND;No;0;AL;;;;90000;N;;;;; +1ED2E;OTTOMAN SIYAQ MARRATAN;So;0;AL;;;;;N;;;;; +1ED2F;OTTOMAN SIYAQ ALTERNATE NUMBER TWO;No;0;AL;;;;2;N;;;;; +1ED30;OTTOMAN SIYAQ ALTERNATE NUMBER THREE;No;0;AL;;;;3;N;;;;; +1ED31;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR;No;0;AL;;;;4;N;;;;; +1ED32;OTTOMAN SIYAQ ALTERNATE NUMBER FIVE;No;0;AL;;;;5;N;;;;; +1ED33;OTTOMAN SIYAQ ALTERNATE NUMBER SIX;No;0;AL;;;;6;N;;;;; +1ED34;OTTOMAN SIYAQ ALTERNATE NUMBER SEVEN;No;0;AL;;;;7;N;;;;; +1ED35;OTTOMAN SIYAQ ALTERNATE NUMBER EIGHT;No;0;AL;;;;8;N;;;;; +1ED36;OTTOMAN SIYAQ ALTERNATE NUMBER NINE;No;0;AL;;;;9;N;;;;; +1ED37;OTTOMAN SIYAQ ALTERNATE NUMBER TEN;No;0;AL;;;;10;N;;;;; +1ED38;OTTOMAN SIYAQ ALTERNATE NUMBER FOUR HUNDRED;No;0;AL;;;;400;N;;;;; +1ED39;OTTOMAN SIYAQ ALTERNATE NUMBER SIX HUNDRED;No;0;AL;;;;600;N;;;;; +1ED3A;OTTOMAN SIYAQ ALTERNATE NUMBER TWO THOUSAND;No;0;AL;;;;2000;N;;;;; +1ED3B;OTTOMAN SIYAQ ALTERNATE NUMBER TEN THOUSAND;No;0;AL;;;;10000;N;;;;; +1ED3C;OTTOMAN SIYAQ FRACTION ONE HALF;No;0;AL;;;;1/2;N;;;;; +1ED3D;OTTOMAN SIYAQ FRACTION ONE SIXTH;No;0;AL;;;;1/6;N;;;;; +1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; +1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL;<font> 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL;<font> 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL;<font> 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL;<font> 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL;<font> 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL;<font> 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL;<font> 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL;<font> 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL;<font> 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL;<font> 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL;<font> 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL;<font> 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL;<font> 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL;<font> 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL;<font> 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL;<font> 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL;<font> 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL;<font> 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL;<font> 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL;<font> 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL;<font> 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL;<font> 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL;<font> 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL;<font> 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL;<font> 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL;<font> 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL;<font> 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL;<font> 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL;<font> 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL;<font> 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL;<font> 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL;<font> 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN;<compat> 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN;<compat> 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN;<compat> 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN;<compat> 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN;<compat> 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN;<compat> 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN;<compat> 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN;<compat> 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN;<compat> 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN;<compat> 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN;<compat> 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10D;CIRCLED ZERO WITH SLASH;So;0;ON;;;;;N;;;;; +1F10E;CIRCLED ANTICLOCKWISE ARROW;So;0;ON;;;;;N;;;;; +1F10F;CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L;<compat> 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L;<compat> 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L;<compat> 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L;<compat> 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L;<compat> 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L;<compat> 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L;<compat> 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L;<compat> 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L;<compat> 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L;<compat> 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L;<compat> 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L;<compat> 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L;<compat> 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L;<compat> 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L;<compat> 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L;<compat> 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L;<compat> 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L;<compat> 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L;<compat> 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L;<compat> 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L;<compat> 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L;<compat> 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L;<compat> 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L;<compat> 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L;<compat> 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L;<compat> 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L;<compat> 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L;<circle> 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L;<circle> 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L;<circle> 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L;<circle> 0057 005A;;;;N;;;;; +1F12F;COPYLEFT SYMBOL;So;0;ON;;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L;<square> 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L;<square> 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L;<square> 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L;<square> 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L;<square> 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L;<square> 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L;<square> 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L;<square> 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L;<square> 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L;<square> 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L;<square> 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L;<square> 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L;<square> 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L;<square> 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L;<square> 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L;<square> 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L;<square> 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L;<square> 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L;<square> 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L;<square> 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L;<square> 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L;<square> 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L;<square> 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L;<square> 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L;<square> 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L;<square> 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L;<square> 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L;<square> 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L;<square> 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L;<square> 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L;<square> 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L;<square> 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON;<super> 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON;<super> 004D 0044;;;;N;;;;; +1F16C;RAISED MR SIGN;So;0;ON;<super> 004D 0052;;;;N;;;;; +1F16D;CIRCLED CC;So;0;ON;;;;;N;;;;; +1F16E;CIRCLED C WITH OVERLAID BACKSLASH;So;0;ON;;;;;N;;;;; +1F16F;CIRCLED HUMAN FIGURE;So;0;ON;;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L;<square> 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;N;;;;; +1F198;SQUARED SOS;So;0;L;;;;;N;;;;; +1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; +1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F19B;SQUARED THREE D;So;0;L;;;;;N;;;;; +1F19C;SQUARED SECOND SCREEN;So;0;L;;;;;N;;;;; +1F19D;SQUARED TWO K;So;0;L;;;;;N;;;;; +1F19E;SQUARED FOUR K;So;0;L;;;;;N;;;;; +1F19F;SQUARED EIGHT K;So;0;L;;;;;N;;;;; +1F1A0;SQUARED FIVE POINT ONE;So;0;L;;;;;N;;;;; +1F1A1;SQUARED SEVEN POINT ONE;So;0;L;;;;;N;;;;; +1F1A2;SQUARED TWENTY-TWO POINT TWO;So;0;L;;;;;N;;;;; +1F1A3;SQUARED SIXTY P;So;0;L;;;;;N;;;;; +1F1A4;SQUARED ONE HUNDRED TWENTY P;So;0;L;;;;;N;;;;; +1F1A5;SQUARED LATIN SMALL LETTER D;So;0;L;;;;;N;;;;; +1F1A6;SQUARED HC;So;0;L;;;;;N;;;;; +1F1A7;SQUARED HDR;So;0;L;;;;;N;;;;; +1F1A8;SQUARED HI-RES;So;0;L;;;;;N;;;;; +1F1A9;SQUARED LOSSLESS;So;0;L;;;;;N;;;;; +1F1AA;SQUARED SHV;So;0;L;;;;;N;;;;; +1F1AB;SQUARED UHD;So;0;L;;;;;N;;;;; +1F1AC;SQUARED VOD;So;0;L;;;;;N;;;;; +1F1AD;MASK WORK SYMBOL;So;0;ON;;;;;N;;;;; +1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; +1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; +1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L;<square> 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L;<square> 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L;<square> 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L;<square> 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L;<square> 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L;<square> 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L;<square> 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<square> 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L;<square> 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L;<square> 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L;<square> 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L;<square> 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L;<square> 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L;<square> 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L;<square> 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L;<square> 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L;<square> 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L;<square> 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L;<square> 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L;<square> 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L;<square> 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L;<square> 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L;<square> 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L;<square> 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L;<square> 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L;<square> 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L;<square> 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L;<square> 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L;<square> 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<square> 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L;<square> 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L;<square> 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L;<square> 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L;<square> 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L;<square> 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L;<square> 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<square> 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L;<square> 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L;<square> 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L;<square> 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L;<square> 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L;<square> 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L;<square> 6708;;;;N;;;;; +1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L;<square> 7533;;;;N;;;;; +1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L;<square> 5272;;;;N;;;;; +1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L;<square> 55B6;;;;N;;;;; +1F23B;SQUARED CJK UNIFIED IDEOGRAPH-914D;So;0;L;<square> 914D;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L;<compat> 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L;<compat> 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L;<compat> 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L;<compat> 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L;<compat> 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L;<compat> 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L;<compat> 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L;<compat> 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L;<compat> 3014 6557 3015;;;;N;;;;; +1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L;<circle> 5F97;;;;N;;;;; +1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L;<circle> 53EF;;;;N;;;;; +1F260;ROUNDED SYMBOL FOR FU;So;0;ON;;;;;N;;;;; +1F261;ROUNDED SYMBOL FOR LU;So;0;ON;;;;;N;;;;; +1F262;ROUNDED SYMBOL FOR SHOU;So;0;ON;;;;;N;;;;; +1F263;ROUNDED SYMBOL FOR XI;So;0;ON;;;;;N;;;;; +1F264;ROUNDED SYMBOL FOR SHUANGXI;So;0;ON;;;;;N;;;;; +1F265;ROUNDED SYMBOL FOR CAI;So;0;ON;;;;;N;;;;; +1F300;CYCLONE;So;0;ON;;;;;N;;;;; +1F301;FOGGY;So;0;ON;;;;;N;;;;; +1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; +1F577;SPIDER;So;0;ON;;;;;N;;;;; +1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; +1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57A;MAN DANCING;So;0;ON;;;;;N;;;;; +1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; +1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A4;BLACK HEART;So;0;ON;;;;;N;;;;; +1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; +1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; +1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; +1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; +1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; +1F6D1;OCTAGONAL SIGN;So;0;ON;;;;;N;;;;; +1F6D2;SHOPPING TROLLEY;So;0;ON;;;;;N;;;;; +1F6D3;STUPA;So;0;ON;;;;;N;;;;; +1F6D4;PAGODA;So;0;ON;;;;;N;;;;; +1F6D5;HINDU TEMPLE;So;0;ON;;;;;N;;;;; +1F6D6;HUT;So;0;ON;;;;;N;;;;; +1F6D7;ELEVATOR;So;0;ON;;;;;N;;;;; +1F6DC;WIRELESS;So;0;ON;;;;;N;;;;; +1F6DD;PLAYGROUND SLIDE;So;0;ON;;;;;N;;;;; +1F6DE;WHEEL;So;0;ON;;;;;N;;;;; +1F6DF;RING BUOY;So;0;ON;;;;;N;;;;; +1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; +1F6E1;SHIELD;So;0;ON;;;;;N;;;;; +1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; +1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F6F4;SCOOTER;So;0;ON;;;;;N;;;;; +1F6F5;MOTOR SCOOTER;So;0;ON;;;;;N;;;;; +1F6F6;CANOE;So;0;ON;;;;;N;;;;; +1F6F7;SLED;So;0;ON;;;;;N;;;;; +1F6F8;FLYING SAUCER;So;0;ON;;;;;N;;;;; +1F6F9;SKATEBOARD;So;0;ON;;;;;N;;;;; +1F6FA;AUTO RICKSHAW;So;0;ON;;;;;N;;;;; +1F6FB;PICKUP TRUCK;So;0;ON;;;;;N;;;;; +1F6FC;ROLLER SKATE;So;0;ON;;;;;N;;;;; +1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; +1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; +1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F774;LOT OF FORTUNE;So;0;ON;;;;;N;;;;; +1F775;OCCULTATION;So;0;ON;;;;;N;;;;; +1F776;LUNAR ECLIPSE;So;0;ON;;;;;N;;;;; +1F77B;HAUMEA;So;0;ON;;;;;N;;;;; +1F77C;MAKEMAKE;So;0;ON;;;;;N;;;;; +1F77D;GONGGONG;So;0;ON;;;;;N;;;;; +1F77E;QUAOAR;So;0;ON;;;;;N;;;;; +1F77F;ORCUS;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D5;CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D6;NEGATIVE CIRCLED TRIANGLE;So;0;ON;;;;;N;;;;; +1F7D7;CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D8;NEGATIVE CIRCLED SQUARE;So;0;ON;;;;;N;;;;; +1F7D9;NINE POINTED WHITE STAR;So;0;ON;;;;;N;;;;; +1F7E0;LARGE ORANGE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E1;LARGE YELLOW CIRCLE;So;0;ON;;;;;N;;;;; +1F7E2;LARGE GREEN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E3;LARGE PURPLE CIRCLE;So;0;ON;;;;;N;;;;; +1F7E4;LARGE BROWN CIRCLE;So;0;ON;;;;;N;;;;; +1F7E5;LARGE RED SQUARE;So;0;ON;;;;;N;;;;; +1F7E6;LARGE BLUE SQUARE;So;0;ON;;;;;N;;;;; +1F7E7;LARGE ORANGE SQUARE;So;0;ON;;;;;N;;;;; +1F7E8;LARGE YELLOW SQUARE;So;0;ON;;;;;N;;;;; +1F7E9;LARGE GREEN SQUARE;So;0;ON;;;;;N;;;;; +1F7EA;LARGE PURPLE SQUARE;So;0;ON;;;;;N;;;;; +1F7EB;LARGE BROWN SQUARE;So;0;ON;;;;;N;;;;; +1F7F0;HEAVY EQUALS SIGN;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F8B0;ARROW POINTING UPWARDS THEN NORTH WEST;So;0;ON;;;;;N;;;;; +1F8B1;ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST;So;0;ON;;;;;N;;;;; +1F900;CIRCLED CROSS FORMEE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F901;CIRCLED CROSS FORMEE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F902;CIRCLED CROSS FORMEE;So;0;ON;;;;;N;;;;; +1F903;LEFT HALF CIRCLE WITH FOUR DOTS;So;0;ON;;;;;N;;;;; +1F904;LEFT HALF CIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F905;LEFT HALF CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +1F906;LEFT HALF CIRCLE WITH DOT;So;0;ON;;;;;N;;;;; +1F907;LEFT HALF CIRCLE;So;0;ON;;;;;N;;;;; +1F908;DOWNWARD FACING HOOK;So;0;ON;;;;;N;;;;; +1F909;DOWNWARD FACING NOTCHED HOOK;So;0;ON;;;;;N;;;;; +1F90A;DOWNWARD FACING HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90B;DOWNWARD FACING NOTCHED HOOK WITH DOT;So;0;ON;;;;;N;;;;; +1F90C;PINCHED FINGERS;So;0;ON;;;;;N;;;;; +1F90D;WHITE HEART;So;0;ON;;;;;N;;;;; +1F90E;BROWN HEART;So;0;ON;;;;;N;;;;; +1F90F;PINCHING HAND;So;0;ON;;;;;N;;;;; +1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; +1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; +1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; +1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F919;CALL ME HAND;So;0;ON;;;;;N;;;;; +1F91A;RAISED BACK OF HAND;So;0;ON;;;;;N;;;;; +1F91B;LEFT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91C;RIGHT-FACING FIST;So;0;ON;;;;;N;;;;; +1F91D;HANDSHAKE;So;0;ON;;;;;N;;;;; +1F91E;HAND WITH INDEX AND MIDDLE FINGERS CROSSED;So;0;ON;;;;;N;;;;; +1F91F;I LOVE YOU HAND SIGN;So;0;ON;;;;;N;;;;; +1F920;FACE WITH COWBOY HAT;So;0;ON;;;;;N;;;;; +1F921;CLOWN FACE;So;0;ON;;;;;N;;;;; +1F922;NAUSEATED FACE;So;0;ON;;;;;N;;;;; +1F923;ROLLING ON THE FLOOR LAUGHING;So;0;ON;;;;;N;;;;; +1F924;DROOLING FACE;So;0;ON;;;;;N;;;;; +1F925;LYING FACE;So;0;ON;;;;;N;;;;; +1F926;FACE PALM;So;0;ON;;;;;N;;;;; +1F927;SNEEZING FACE;So;0;ON;;;;;N;;;;; +1F928;FACE WITH ONE EYEBROW RAISED;So;0;ON;;;;;N;;;;; +1F929;GRINNING FACE WITH STAR EYES;So;0;ON;;;;;N;;;;; +1F92A;GRINNING FACE WITH ONE LARGE AND ONE SMALL EYE;So;0;ON;;;;;N;;;;; +1F92B;FACE WITH FINGER COVERING CLOSED LIPS;So;0;ON;;;;;N;;;;; +1F92C;SERIOUS FACE WITH SYMBOLS COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92D;SMILING FACE WITH SMILING EYES AND HAND COVERING MOUTH;So;0;ON;;;;;N;;;;; +1F92E;FACE WITH OPEN MOUTH VOMITING;So;0;ON;;;;;N;;;;; +1F92F;SHOCKED FACE WITH EXPLODING HEAD;So;0;ON;;;;;N;;;;; +1F930;PREGNANT WOMAN;So;0;ON;;;;;N;;;;; +1F931;BREAST-FEEDING;So;0;ON;;;;;N;;;;; +1F932;PALMS UP TOGETHER;So;0;ON;;;;;N;;;;; +1F933;SELFIE;So;0;ON;;;;;N;;;;; +1F934;PRINCE;So;0;ON;;;;;N;;;;; +1F935;MAN IN TUXEDO;So;0;ON;;;;;N;;;;; +1F936;MOTHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F937;SHRUG;So;0;ON;;;;;N;;;;; +1F938;PERSON DOING CARTWHEEL;So;0;ON;;;;;N;;;;; +1F939;JUGGLING;So;0;ON;;;;;N;;;;; +1F93A;FENCER;So;0;ON;;;;;N;;;;; +1F93B;MODERN PENTATHLON;So;0;ON;;;;;N;;;;; +1F93C;WRESTLERS;So;0;ON;;;;;N;;;;; +1F93D;WATER POLO;So;0;ON;;;;;N;;;;; +1F93E;HANDBALL;So;0;ON;;;;;N;;;;; +1F93F;DIVING MASK;So;0;ON;;;;;N;;;;; +1F940;WILTED FLOWER;So;0;ON;;;;;N;;;;; +1F941;DRUM WITH DRUMSTICKS;So;0;ON;;;;;N;;;;; +1F942;CLINKING GLASSES;So;0;ON;;;;;N;;;;; +1F943;TUMBLER GLASS;So;0;ON;;;;;N;;;;; +1F944;SPOON;So;0;ON;;;;;N;;;;; +1F945;GOAL NET;So;0;ON;;;;;N;;;;; +1F946;RIFLE;So;0;ON;;;;;N;;;;; +1F947;FIRST PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F948;SECOND PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F949;THIRD PLACE MEDAL;So;0;ON;;;;;N;;;;; +1F94A;BOXING GLOVE;So;0;ON;;;;;N;;;;; +1F94B;MARTIAL ARTS UNIFORM;So;0;ON;;;;;N;;;;; +1F94C;CURLING STONE;So;0;ON;;;;;N;;;;; +1F94D;LACROSSE STICK AND BALL;So;0;ON;;;;;N;;;;; +1F94E;SOFTBALL;So;0;ON;;;;;N;;;;; +1F94F;FLYING DISC;So;0;ON;;;;;N;;;;; +1F950;CROISSANT;So;0;ON;;;;;N;;;;; +1F951;AVOCADO;So;0;ON;;;;;N;;;;; +1F952;CUCUMBER;So;0;ON;;;;;N;;;;; +1F953;BACON;So;0;ON;;;;;N;;;;; +1F954;POTATO;So;0;ON;;;;;N;;;;; +1F955;CARROT;So;0;ON;;;;;N;;;;; +1F956;BAGUETTE BREAD;So;0;ON;;;;;N;;;;; +1F957;GREEN SALAD;So;0;ON;;;;;N;;;;; +1F958;SHALLOW PAN OF FOOD;So;0;ON;;;;;N;;;;; +1F959;STUFFED FLATBREAD;So;0;ON;;;;;N;;;;; +1F95A;EGG;So;0;ON;;;;;N;;;;; +1F95B;GLASS OF MILK;So;0;ON;;;;;N;;;;; +1F95C;PEANUTS;So;0;ON;;;;;N;;;;; +1F95D;KIWIFRUIT;So;0;ON;;;;;N;;;;; +1F95E;PANCAKES;So;0;ON;;;;;N;;;;; +1F95F;DUMPLING;So;0;ON;;;;;N;;;;; +1F960;FORTUNE COOKIE;So;0;ON;;;;;N;;;;; +1F961;TAKEOUT BOX;So;0;ON;;;;;N;;;;; +1F962;CHOPSTICKS;So;0;ON;;;;;N;;;;; +1F963;BOWL WITH SPOON;So;0;ON;;;;;N;;;;; +1F964;CUP WITH STRAW;So;0;ON;;;;;N;;;;; +1F965;COCONUT;So;0;ON;;;;;N;;;;; +1F966;BROCCOLI;So;0;ON;;;;;N;;;;; +1F967;PIE;So;0;ON;;;;;N;;;;; +1F968;PRETZEL;So;0;ON;;;;;N;;;;; +1F969;CUT OF MEAT;So;0;ON;;;;;N;;;;; +1F96A;SANDWICH;So;0;ON;;;;;N;;;;; +1F96B;CANNED FOOD;So;0;ON;;;;;N;;;;; +1F96C;LEAFY GREEN;So;0;ON;;;;;N;;;;; +1F96D;MANGO;So;0;ON;;;;;N;;;;; +1F96E;MOON CAKE;So;0;ON;;;;;N;;;;; +1F96F;BAGEL;So;0;ON;;;;;N;;;;; +1F970;SMILING FACE WITH SMILING EYES AND THREE HEARTS;So;0;ON;;;;;N;;;;; +1F971;YAWNING FACE;So;0;ON;;;;;N;;;;; +1F972;SMILING FACE WITH TEAR;So;0;ON;;;;;N;;;;; +1F973;FACE WITH PARTY HORN AND PARTY HAT;So;0;ON;;;;;N;;;;; +1F974;FACE WITH UNEVEN EYES AND WAVY MOUTH;So;0;ON;;;;;N;;;;; +1F975;OVERHEATED FACE;So;0;ON;;;;;N;;;;; +1F976;FREEZING FACE;So;0;ON;;;;;N;;;;; +1F977;NINJA;So;0;ON;;;;;N;;;;; +1F978;DISGUISED FACE;So;0;ON;;;;;N;;;;; +1F979;FACE HOLDING BACK TEARS;So;0;ON;;;;;N;;;;; +1F97A;FACE WITH PLEADING EYES;So;0;ON;;;;;N;;;;; +1F97B;SARI;So;0;ON;;;;;N;;;;; +1F97C;LAB COAT;So;0;ON;;;;;N;;;;; +1F97D;GOGGLES;So;0;ON;;;;;N;;;;; +1F97E;HIKING BOOT;So;0;ON;;;;;N;;;;; +1F97F;FLAT SHOE;So;0;ON;;;;;N;;;;; +1F980;CRAB;So;0;ON;;;;;N;;;;; +1F981;LION FACE;So;0;ON;;;;;N;;;;; +1F982;SCORPION;So;0;ON;;;;;N;;;;; +1F983;TURKEY;So;0;ON;;;;;N;;;;; +1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F985;EAGLE;So;0;ON;;;;;N;;;;; +1F986;DUCK;So;0;ON;;;;;N;;;;; +1F987;BAT;So;0;ON;;;;;N;;;;; +1F988;SHARK;So;0;ON;;;;;N;;;;; +1F989;OWL;So;0;ON;;;;;N;;;;; +1F98A;FOX FACE;So;0;ON;;;;;N;;;;; +1F98B;BUTTERFLY;So;0;ON;;;;;N;;;;; +1F98C;DEER;So;0;ON;;;;;N;;;;; +1F98D;GORILLA;So;0;ON;;;;;N;;;;; +1F98E;LIZARD;So;0;ON;;;;;N;;;;; +1F98F;RHINOCEROS;So;0;ON;;;;;N;;;;; +1F990;SHRIMP;So;0;ON;;;;;N;;;;; +1F991;SQUID;So;0;ON;;;;;N;;;;; +1F992;GIRAFFE FACE;So;0;ON;;;;;N;;;;; +1F993;ZEBRA FACE;So;0;ON;;;;;N;;;;; +1F994;HEDGEHOG;So;0;ON;;;;;N;;;;; +1F995;SAUROPOD;So;0;ON;;;;;N;;;;; +1F996;T-REX;So;0;ON;;;;;N;;;;; +1F997;CRICKET;So;0;ON;;;;;N;;;;; +1F998;KANGAROO;So;0;ON;;;;;N;;;;; +1F999;LLAMA;So;0;ON;;;;;N;;;;; +1F99A;PEACOCK;So;0;ON;;;;;N;;;;; +1F99B;HIPPOPOTAMUS;So;0;ON;;;;;N;;;;; +1F99C;PARROT;So;0;ON;;;;;N;;;;; +1F99D;RACCOON;So;0;ON;;;;;N;;;;; +1F99E;LOBSTER;So;0;ON;;;;;N;;;;; +1F99F;MOSQUITO;So;0;ON;;;;;N;;;;; +1F9A0;MICROBE;So;0;ON;;;;;N;;;;; +1F9A1;BADGER;So;0;ON;;;;;N;;;;; +1F9A2;SWAN;So;0;ON;;;;;N;;;;; +1F9A3;MAMMOTH;So;0;ON;;;;;N;;;;; +1F9A4;DODO;So;0;ON;;;;;N;;;;; +1F9A5;SLOTH;So;0;ON;;;;;N;;;;; +1F9A6;OTTER;So;0;ON;;;;;N;;;;; +1F9A7;ORANGUTAN;So;0;ON;;;;;N;;;;; +1F9A8;SKUNK;So;0;ON;;;;;N;;;;; +1F9A9;FLAMINGO;So;0;ON;;;;;N;;;;; +1F9AA;OYSTER;So;0;ON;;;;;N;;;;; +1F9AB;BEAVER;So;0;ON;;;;;N;;;;; +1F9AC;BISON;So;0;ON;;;;;N;;;;; +1F9AD;SEAL;So;0;ON;;;;;N;;;;; +1F9AE;GUIDE DOG;So;0;ON;;;;;N;;;;; +1F9AF;PROBING CANE;So;0;ON;;;;;N;;;;; +1F9B0;EMOJI COMPONENT RED HAIR;So;0;ON;;;;;N;;;;; +1F9B1;EMOJI COMPONENT CURLY HAIR;So;0;ON;;;;;N;;;;; +1F9B2;EMOJI COMPONENT BALD;So;0;ON;;;;;N;;;;; +1F9B3;EMOJI COMPONENT WHITE HAIR;So;0;ON;;;;;N;;;;; +1F9B4;BONE;So;0;ON;;;;;N;;;;; +1F9B5;LEG;So;0;ON;;;;;N;;;;; +1F9B6;FOOT;So;0;ON;;;;;N;;;;; +1F9B7;TOOTH;So;0;ON;;;;;N;;;;; +1F9B8;SUPERHERO;So;0;ON;;;;;N;;;;; +1F9B9;SUPERVILLAIN;So;0;ON;;;;;N;;;;; +1F9BA;SAFETY VEST;So;0;ON;;;;;N;;;;; +1F9BB;EAR WITH HEARING AID;So;0;ON;;;;;N;;;;; +1F9BC;MOTORIZED WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BD;MANUAL WHEELCHAIR;So;0;ON;;;;;N;;;;; +1F9BE;MECHANICAL ARM;So;0;ON;;;;;N;;;;; +1F9BF;MECHANICAL LEG;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; +1F9C1;CUPCAKE;So;0;ON;;;;;N;;;;; +1F9C2;SALT SHAKER;So;0;ON;;;;;N;;;;; +1F9C3;BEVERAGE BOX;So;0;ON;;;;;N;;;;; +1F9C4;GARLIC;So;0;ON;;;;;N;;;;; +1F9C5;ONION;So;0;ON;;;;;N;;;;; +1F9C6;FALAFEL;So;0;ON;;;;;N;;;;; +1F9C7;WAFFLE;So;0;ON;;;;;N;;;;; +1F9C8;BUTTER;So;0;ON;;;;;N;;;;; +1F9C9;MATE DRINK;So;0;ON;;;;;N;;;;; +1F9CA;ICE CUBE;So;0;ON;;;;;N;;;;; +1F9CB;BUBBLE TEA;So;0;ON;;;;;N;;;;; +1F9CC;TROLL;So;0;ON;;;;;N;;;;; +1F9CD;STANDING PERSON;So;0;ON;;;;;N;;;;; +1F9CE;KNEELING PERSON;So;0;ON;;;;;N;;;;; +1F9CF;DEAF PERSON;So;0;ON;;;;;N;;;;; +1F9D0;FACE WITH MONOCLE;So;0;ON;;;;;N;;;;; +1F9D1;ADULT;So;0;ON;;;;;N;;;;; +1F9D2;CHILD;So;0;ON;;;;;N;;;;; +1F9D3;OLDER ADULT;So;0;ON;;;;;N;;;;; +1F9D4;BEARDED PERSON;So;0;ON;;;;;N;;;;; +1F9D5;PERSON WITH HEADSCARF;So;0;ON;;;;;N;;;;; +1F9D6;PERSON IN STEAMY ROOM;So;0;ON;;;;;N;;;;; +1F9D7;PERSON CLIMBING;So;0;ON;;;;;N;;;;; +1F9D8;PERSON IN LOTUS POSITION;So;0;ON;;;;;N;;;;; +1F9D9;MAGE;So;0;ON;;;;;N;;;;; +1F9DA;FAIRY;So;0;ON;;;;;N;;;;; +1F9DB;VAMPIRE;So;0;ON;;;;;N;;;;; +1F9DC;MERPERSON;So;0;ON;;;;;N;;;;; +1F9DD;ELF;So;0;ON;;;;;N;;;;; +1F9DE;GENIE;So;0;ON;;;;;N;;;;; +1F9DF;ZOMBIE;So;0;ON;;;;;N;;;;; +1F9E0;BRAIN;So;0;ON;;;;;N;;;;; +1F9E1;ORANGE HEART;So;0;ON;;;;;N;;;;; +1F9E2;BILLED CAP;So;0;ON;;;;;N;;;;; +1F9E3;SCARF;So;0;ON;;;;;N;;;;; +1F9E4;GLOVES;So;0;ON;;;;;N;;;;; +1F9E5;COAT;So;0;ON;;;;;N;;;;; +1F9E6;SOCKS;So;0;ON;;;;;N;;;;; +1F9E7;RED GIFT ENVELOPE;So;0;ON;;;;;N;;;;; +1F9E8;FIRECRACKER;So;0;ON;;;;;N;;;;; +1F9E9;JIGSAW PUZZLE PIECE;So;0;ON;;;;;N;;;;; +1F9EA;TEST TUBE;So;0;ON;;;;;N;;;;; +1F9EB;PETRI DISH;So;0;ON;;;;;N;;;;; +1F9EC;DNA DOUBLE HELIX;So;0;ON;;;;;N;;;;; +1F9ED;COMPASS;So;0;ON;;;;;N;;;;; +1F9EE;ABACUS;So;0;ON;;;;;N;;;;; +1F9EF;FIRE EXTINGUISHER;So;0;ON;;;;;N;;;;; +1F9F0;TOOLBOX;So;0;ON;;;;;N;;;;; +1F9F1;BRICK;So;0;ON;;;;;N;;;;; +1F9F2;MAGNET;So;0;ON;;;;;N;;;;; +1F9F3;LUGGAGE;So;0;ON;;;;;N;;;;; +1F9F4;LOTION BOTTLE;So;0;ON;;;;;N;;;;; +1F9F5;SPOOL OF THREAD;So;0;ON;;;;;N;;;;; +1F9F6;BALL OF YARN;So;0;ON;;;;;N;;;;; +1F9F7;SAFETY PIN;So;0;ON;;;;;N;;;;; +1F9F8;TEDDY BEAR;So;0;ON;;;;;N;;;;; +1F9F9;BROOM;So;0;ON;;;;;N;;;;; +1F9FA;BASKET;So;0;ON;;;;;N;;;;; +1F9FB;ROLL OF PAPER;So;0;ON;;;;;N;;;;; +1F9FC;BAR OF SOAP;So;0;ON;;;;;N;;;;; +1F9FD;SPONGE;So;0;ON;;;;;N;;;;; +1F9FE;RECEIPT;So;0;ON;;;;;N;;;;; +1F9FF;NAZAR AMULET;So;0;ON;;;;;N;;;;; +1FA00;NEUTRAL CHESS KING;So;0;ON;;;;;N;;;;; +1FA01;NEUTRAL CHESS QUEEN;So;0;ON;;;;;N;;;;; +1FA02;NEUTRAL CHESS ROOK;So;0;ON;;;;;N;;;;; +1FA03;NEUTRAL CHESS BISHOP;So;0;ON;;;;;N;;;;; +1FA04;NEUTRAL CHESS KNIGHT;So;0;ON;;;;;N;;;;; +1FA05;NEUTRAL CHESS PAWN;So;0;ON;;;;;N;;;;; +1FA06;WHITE CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA07;BLACK CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA08;NEUTRAL CHESS KNIGHT ROTATED FORTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA09;WHITE CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0A;WHITE CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0B;WHITE CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0C;WHITE CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0D;WHITE CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0E;WHITE CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA0F;BLACK CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA10;BLACK CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA11;BLACK CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA12;BLACK CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA13;BLACK CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA14;BLACK CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA15;NEUTRAL CHESS KING ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA16;NEUTRAL CHESS QUEEN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA17;NEUTRAL CHESS ROOK ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA18;NEUTRAL CHESS BISHOP ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA19;NEUTRAL CHESS KNIGHT ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1A;NEUTRAL CHESS PAWN ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA1B;WHITE CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1C;BLACK CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1D;NEUTRAL CHESS KNIGHT ROTATED ONE HUNDRED THIRTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA1E;WHITE CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA1F;WHITE CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA20;WHITE CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA21;WHITE CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA22;WHITE CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA23;WHITE CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA24;BLACK CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA25;BLACK CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA26;BLACK CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA27;BLACK CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA28;BLACK CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA29;BLACK CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA2A;NEUTRAL CHESS TURNED KING;So;0;ON;;;;;N;;;;; +1FA2B;NEUTRAL CHESS TURNED QUEEN;So;0;ON;;;;;N;;;;; +1FA2C;NEUTRAL CHESS TURNED ROOK;So;0;ON;;;;;N;;;;; +1FA2D;NEUTRAL CHESS TURNED BISHOP;So;0;ON;;;;;N;;;;; +1FA2E;NEUTRAL CHESS TURNED KNIGHT;So;0;ON;;;;;N;;;;; +1FA2F;NEUTRAL CHESS TURNED PAWN;So;0;ON;;;;;N;;;;; +1FA30;WHITE CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA31;BLACK CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA32;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED TWENTY-FIVE DEGREES;So;0;ON;;;;;N;;;;; +1FA33;WHITE CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA34;WHITE CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA35;WHITE CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA36;WHITE CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA37;WHITE CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA38;WHITE CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA39;BLACK CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3A;BLACK CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3B;BLACK CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3C;BLACK CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3D;BLACK CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3E;BLACK CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA3F;NEUTRAL CHESS KING ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA40;NEUTRAL CHESS QUEEN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA41;NEUTRAL CHESS ROOK ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA42;NEUTRAL CHESS BISHOP ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA43;NEUTRAL CHESS KNIGHT ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA44;NEUTRAL CHESS PAWN ROTATED TWO HUNDRED SEVENTY DEGREES;So;0;ON;;;;;N;;;;; +1FA45;WHITE CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA46;BLACK CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA47;NEUTRAL CHESS KNIGHT ROTATED THREE HUNDRED FIFTEEN DEGREES;So;0;ON;;;;;N;;;;; +1FA48;WHITE CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA49;BLACK CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4A;NEUTRAL CHESS EQUIHOPPER;So;0;ON;;;;;N;;;;; +1FA4B;WHITE CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4C;BLACK CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4D;NEUTRAL CHESS EQUIHOPPER ROTATED NINETY DEGREES;So;0;ON;;;;;N;;;;; +1FA4E;WHITE CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA4F;WHITE CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA50;WHITE CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA51;BLACK CHESS KNIGHT-QUEEN;So;0;ON;;;;;N;;;;; +1FA52;BLACK CHESS KNIGHT-ROOK;So;0;ON;;;;;N;;;;; +1FA53;BLACK CHESS KNIGHT-BISHOP;So;0;ON;;;;;N;;;;; +1FA60;XIANGQI RED GENERAL;So;0;ON;;;;;N;;;;; +1FA61;XIANGQI RED MANDARIN;So;0;ON;;;;;N;;;;; +1FA62;XIANGQI RED ELEPHANT;So;0;ON;;;;;N;;;;; +1FA63;XIANGQI RED HORSE;So;0;ON;;;;;N;;;;; +1FA64;XIANGQI RED CHARIOT;So;0;ON;;;;;N;;;;; +1FA65;XIANGQI RED CANNON;So;0;ON;;;;;N;;;;; +1FA66;XIANGQI RED SOLDIER;So;0;ON;;;;;N;;;;; +1FA67;XIANGQI BLACK GENERAL;So;0;ON;;;;;N;;;;; +1FA68;XIANGQI BLACK MANDARIN;So;0;ON;;;;;N;;;;; +1FA69;XIANGQI BLACK ELEPHANT;So;0;ON;;;;;N;;;;; +1FA6A;XIANGQI BLACK HORSE;So;0;ON;;;;;N;;;;; +1FA6B;XIANGQI BLACK CHARIOT;So;0;ON;;;;;N;;;;; +1FA6C;XIANGQI BLACK CANNON;So;0;ON;;;;;N;;;;; +1FA6D;XIANGQI BLACK SOLDIER;So;0;ON;;;;;N;;;;; +1FA70;BALLET SHOES;So;0;ON;;;;;N;;;;; +1FA71;ONE-PIECE SWIMSUIT;So;0;ON;;;;;N;;;;; +1FA72;BRIEFS;So;0;ON;;;;;N;;;;; +1FA73;SHORTS;So;0;ON;;;;;N;;;;; +1FA74;THONG SANDAL;So;0;ON;;;;;N;;;;; +1FA75;LIGHT BLUE HEART;So;0;ON;;;;;N;;;;; +1FA76;GREY HEART;So;0;ON;;;;;N;;;;; +1FA77;PINK HEART;So;0;ON;;;;;N;;;;; +1FA78;DROP OF BLOOD;So;0;ON;;;;;N;;;;; +1FA79;ADHESIVE BANDAGE;So;0;ON;;;;;N;;;;; +1FA7A;STETHOSCOPE;So;0;ON;;;;;N;;;;; +1FA7B;X-RAY;So;0;ON;;;;;N;;;;; +1FA7C;CRUTCH;So;0;ON;;;;;N;;;;; +1FA80;YO-YO;So;0;ON;;;;;N;;;;; +1FA81;KITE;So;0;ON;;;;;N;;;;; +1FA82;PARACHUTE;So;0;ON;;;;;N;;;;; +1FA83;BOOMERANG;So;0;ON;;;;;N;;;;; +1FA84;MAGIC WAND;So;0;ON;;;;;N;;;;; +1FA85;PINATA;So;0;ON;;;;;N;;;;; +1FA86;NESTING DOLLS;So;0;ON;;;;;N;;;;; +1FA87;MARACAS;So;0;ON;;;;;N;;;;; +1FA88;FLUTE;So;0;ON;;;;;N;;;;; +1FA90;RINGED PLANET;So;0;ON;;;;;N;;;;; +1FA91;CHAIR;So;0;ON;;;;;N;;;;; +1FA92;RAZOR;So;0;ON;;;;;N;;;;; +1FA93;AXE;So;0;ON;;;;;N;;;;; +1FA94;DIYA LAMP;So;0;ON;;;;;N;;;;; +1FA95;BANJO;So;0;ON;;;;;N;;;;; +1FA96;MILITARY HELMET;So;0;ON;;;;;N;;;;; +1FA97;ACCORDION;So;0;ON;;;;;N;;;;; +1FA98;LONG DRUM;So;0;ON;;;;;N;;;;; +1FA99;COIN;So;0;ON;;;;;N;;;;; +1FA9A;CARPENTRY SAW;So;0;ON;;;;;N;;;;; +1FA9B;SCREWDRIVER;So;0;ON;;;;;N;;;;; +1FA9C;LADDER;So;0;ON;;;;;N;;;;; +1FA9D;HOOK;So;0;ON;;;;;N;;;;; +1FA9E;MIRROR;So;0;ON;;;;;N;;;;; +1FA9F;WINDOW;So;0;ON;;;;;N;;;;; +1FAA0;PLUNGER;So;0;ON;;;;;N;;;;; +1FAA1;SEWING NEEDLE;So;0;ON;;;;;N;;;;; +1FAA2;KNOT;So;0;ON;;;;;N;;;;; +1FAA3;BUCKET;So;0;ON;;;;;N;;;;; +1FAA4;MOUSE TRAP;So;0;ON;;;;;N;;;;; +1FAA5;TOOTHBRUSH;So;0;ON;;;;;N;;;;; +1FAA6;HEADSTONE;So;0;ON;;;;;N;;;;; +1FAA7;PLACARD;So;0;ON;;;;;N;;;;; +1FAA8;ROCK;So;0;ON;;;;;N;;;;; +1FAA9;MIRROR BALL;So;0;ON;;;;;N;;;;; +1FAAA;IDENTIFICATION CARD;So;0;ON;;;;;N;;;;; +1FAAB;LOW BATTERY;So;0;ON;;;;;N;;;;; +1FAAC;HAMSA;So;0;ON;;;;;N;;;;; +1FAAD;FOLDING HAND FAN;So;0;ON;;;;;N;;;;; +1FAAE;HAIR PICK;So;0;ON;;;;;N;;;;; +1FAAF;KHANDA;So;0;ON;;;;;N;;;;; +1FAB0;FLY;So;0;ON;;;;;N;;;;; +1FAB1;WORM;So;0;ON;;;;;N;;;;; +1FAB2;BEETLE;So;0;ON;;;;;N;;;;; +1FAB3;COCKROACH;So;0;ON;;;;;N;;;;; +1FAB4;POTTED PLANT;So;0;ON;;;;;N;;;;; +1FAB5;WOOD;So;0;ON;;;;;N;;;;; +1FAB6;FEATHER;So;0;ON;;;;;N;;;;; +1FAB7;LOTUS;So;0;ON;;;;;N;;;;; +1FAB8;CORAL;So;0;ON;;;;;N;;;;; +1FAB9;EMPTY NEST;So;0;ON;;;;;N;;;;; +1FABA;NEST WITH EGGS;So;0;ON;;;;;N;;;;; +1FABB;HYACINTH;So;0;ON;;;;;N;;;;; +1FABC;JELLYFISH;So;0;ON;;;;;N;;;;; +1FABD;WING;So;0;ON;;;;;N;;;;; +1FABF;GOOSE;So;0;ON;;;;;N;;;;; +1FAC0;ANATOMICAL HEART;So;0;ON;;;;;N;;;;; +1FAC1;LUNGS;So;0;ON;;;;;N;;;;; +1FAC2;PEOPLE HUGGING;So;0;ON;;;;;N;;;;; +1FAC3;PREGNANT MAN;So;0;ON;;;;;N;;;;; +1FAC4;PREGNANT PERSON;So;0;ON;;;;;N;;;;; +1FAC5;PERSON WITH CROWN;So;0;ON;;;;;N;;;;; +1FACE;MOOSE;So;0;ON;;;;;N;;;;; +1FACF;DONKEY;So;0;ON;;;;;N;;;;; +1FAD0;BLUEBERRIES;So;0;ON;;;;;N;;;;; +1FAD1;BELL PEPPER;So;0;ON;;;;;N;;;;; +1FAD2;OLIVE;So;0;ON;;;;;N;;;;; +1FAD3;FLATBREAD;So;0;ON;;;;;N;;;;; +1FAD4;TAMALE;So;0;ON;;;;;N;;;;; +1FAD5;FONDUE;So;0;ON;;;;;N;;;;; +1FAD6;TEAPOT;So;0;ON;;;;;N;;;;; +1FAD7;POURING LIQUID;So;0;ON;;;;;N;;;;; +1FAD8;BEANS;So;0;ON;;;;;N;;;;; +1FAD9;JAR;So;0;ON;;;;;N;;;;; +1FADA;GINGER ROOT;So;0;ON;;;;;N;;;;; +1FADB;PEA POD;So;0;ON;;;;;N;;;;; +1FAE0;MELTING FACE;So;0;ON;;;;;N;;;;; +1FAE1;SALUTING FACE;So;0;ON;;;;;N;;;;; +1FAE2;FACE WITH OPEN EYES AND HAND OVER MOUTH;So;0;ON;;;;;N;;;;; +1FAE3;FACE WITH PEEKING EYE;So;0;ON;;;;;N;;;;; +1FAE4;FACE WITH DIAGONAL MOUTH;So;0;ON;;;;;N;;;;; +1FAE5;DOTTED LINE FACE;So;0;ON;;;;;N;;;;; +1FAE6;BITING LIP;So;0;ON;;;;;N;;;;; +1FAE7;BUBBLES;So;0;ON;;;;;N;;;;; +1FAE8;SHAKING FACE;So;0;ON;;;;;N;;;;; +1FAF0;HAND WITH INDEX FINGER AND THUMB CROSSED;So;0;ON;;;;;N;;;;; +1FAF1;RIGHTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF2;LEFTWARDS HAND;So;0;ON;;;;;N;;;;; +1FAF3;PALM DOWN HAND;So;0;ON;;;;;N;;;;; +1FAF4;PALM UP HAND;So;0;ON;;;;;N;;;;; +1FAF5;INDEX POINTING AT THE VIEWER;So;0;ON;;;;;N;;;;; +1FAF6;HEART HANDS;So;0;ON;;;;;N;;;;; +1FAF7;LEFTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FAF8;RIGHTWARDS PUSHING HAND;So;0;ON;;;;;N;;;;; +1FB00;BLOCK SEXTANT-1;So;0;ON;;;;;N;;;;; +1FB01;BLOCK SEXTANT-2;So;0;ON;;;;;N;;;;; +1FB02;BLOCK SEXTANT-12;So;0;ON;;;;;N;;;;; +1FB03;BLOCK SEXTANT-3;So;0;ON;;;;;N;;;;; +1FB04;BLOCK SEXTANT-13;So;0;ON;;;;;N;;;;; +1FB05;BLOCK SEXTANT-23;So;0;ON;;;;;N;;;;; +1FB06;BLOCK SEXTANT-123;So;0;ON;;;;;N;;;;; +1FB07;BLOCK SEXTANT-4;So;0;ON;;;;;N;;;;; +1FB08;BLOCK SEXTANT-14;So;0;ON;;;;;N;;;;; +1FB09;BLOCK SEXTANT-24;So;0;ON;;;;;N;;;;; +1FB0A;BLOCK SEXTANT-124;So;0;ON;;;;;N;;;;; +1FB0B;BLOCK SEXTANT-34;So;0;ON;;;;;N;;;;; +1FB0C;BLOCK SEXTANT-134;So;0;ON;;;;;N;;;;; +1FB0D;BLOCK SEXTANT-234;So;0;ON;;;;;N;;;;; +1FB0E;BLOCK SEXTANT-1234;So;0;ON;;;;;N;;;;; +1FB0F;BLOCK SEXTANT-5;So;0;ON;;;;;N;;;;; +1FB10;BLOCK SEXTANT-15;So;0;ON;;;;;N;;;;; +1FB11;BLOCK SEXTANT-25;So;0;ON;;;;;N;;;;; +1FB12;BLOCK SEXTANT-125;So;0;ON;;;;;N;;;;; +1FB13;BLOCK SEXTANT-35;So;0;ON;;;;;N;;;;; +1FB14;BLOCK SEXTANT-235;So;0;ON;;;;;N;;;;; +1FB15;BLOCK SEXTANT-1235;So;0;ON;;;;;N;;;;; +1FB16;BLOCK SEXTANT-45;So;0;ON;;;;;N;;;;; +1FB17;BLOCK SEXTANT-145;So;0;ON;;;;;N;;;;; +1FB18;BLOCK SEXTANT-245;So;0;ON;;;;;N;;;;; +1FB19;BLOCK SEXTANT-1245;So;0;ON;;;;;N;;;;; +1FB1A;BLOCK SEXTANT-345;So;0;ON;;;;;N;;;;; +1FB1B;BLOCK SEXTANT-1345;So;0;ON;;;;;N;;;;; +1FB1C;BLOCK SEXTANT-2345;So;0;ON;;;;;N;;;;; +1FB1D;BLOCK SEXTANT-12345;So;0;ON;;;;;N;;;;; +1FB1E;BLOCK SEXTANT-6;So;0;ON;;;;;N;;;;; +1FB1F;BLOCK SEXTANT-16;So;0;ON;;;;;N;;;;; +1FB20;BLOCK SEXTANT-26;So;0;ON;;;;;N;;;;; +1FB21;BLOCK SEXTANT-126;So;0;ON;;;;;N;;;;; +1FB22;BLOCK SEXTANT-36;So;0;ON;;;;;N;;;;; +1FB23;BLOCK SEXTANT-136;So;0;ON;;;;;N;;;;; +1FB24;BLOCK SEXTANT-236;So;0;ON;;;;;N;;;;; +1FB25;BLOCK SEXTANT-1236;So;0;ON;;;;;N;;;;; +1FB26;BLOCK SEXTANT-46;So;0;ON;;;;;N;;;;; +1FB27;BLOCK SEXTANT-146;So;0;ON;;;;;N;;;;; +1FB28;BLOCK SEXTANT-1246;So;0;ON;;;;;N;;;;; +1FB29;BLOCK SEXTANT-346;So;0;ON;;;;;N;;;;; +1FB2A;BLOCK SEXTANT-1346;So;0;ON;;;;;N;;;;; +1FB2B;BLOCK SEXTANT-2346;So;0;ON;;;;;N;;;;; +1FB2C;BLOCK SEXTANT-12346;So;0;ON;;;;;N;;;;; +1FB2D;BLOCK SEXTANT-56;So;0;ON;;;;;N;;;;; +1FB2E;BLOCK SEXTANT-156;So;0;ON;;;;;N;;;;; +1FB2F;BLOCK SEXTANT-256;So;0;ON;;;;;N;;;;; +1FB30;BLOCK SEXTANT-1256;So;0;ON;;;;;N;;;;; +1FB31;BLOCK SEXTANT-356;So;0;ON;;;;;N;;;;; +1FB32;BLOCK SEXTANT-1356;So;0;ON;;;;;N;;;;; +1FB33;BLOCK SEXTANT-2356;So;0;ON;;;;;N;;;;; +1FB34;BLOCK SEXTANT-12356;So;0;ON;;;;;N;;;;; +1FB35;BLOCK SEXTANT-456;So;0;ON;;;;;N;;;;; +1FB36;BLOCK SEXTANT-1456;So;0;ON;;;;;N;;;;; +1FB37;BLOCK SEXTANT-2456;So;0;ON;;;;;N;;;;; +1FB38;BLOCK SEXTANT-12456;So;0;ON;;;;;N;;;;; +1FB39;BLOCK SEXTANT-3456;So;0;ON;;;;;N;;;;; +1FB3A;BLOCK SEXTANT-13456;So;0;ON;;;;;N;;;;; +1FB3B;BLOCK SEXTANT-23456;So;0;ON;;;;;N;;;;; +1FB3C;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3D;LOWER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB3E;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB3F;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB40;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB41;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB42;LOWER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB43;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB44;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB45;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB46;LOWER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB47;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB48;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB49;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4A;LOWER RIGHT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4B;LOWER RIGHT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB4C;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4D;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4E;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB4F;LOWER LEFT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB50;LOWER LEFT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB51;LOWER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB52;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB53;UPPER RIGHT BLOCK DIAGONAL LOWER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB54;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB55;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB56;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FB57;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB58;UPPER LEFT BLOCK DIAGONAL UPPER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB59;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5A;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB5B;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER CENTRE;So;0;ON;;;;;N;;;;; +1FB5C;UPPER LEFT BLOCK DIAGONAL LOWER MIDDLE LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5D;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5E;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB5F;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB60;UPPER LEFT BLOCK DIAGONAL LOWER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB61;UPPER LEFT BLOCK DIAGONAL LOWER CENTRE TO UPPER RIGHT;So;0;ON;;;;;N;;;;; +1FB62;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB63;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO UPPER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB64;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB65;UPPER RIGHT BLOCK DIAGONAL UPPER LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB66;UPPER RIGHT BLOCK DIAGONAL UPPER CENTRE TO LOWER RIGHT;So;0;ON;;;;;N;;;;; +1FB67;UPPER RIGHT BLOCK DIAGONAL UPPER MIDDLE LEFT TO LOWER MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FB68;UPPER AND RIGHT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB69;LEFT AND LOWER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6A;UPPER AND LEFT AND LOWER TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6B;LEFT AND UPPER AND RIGHT TRIANGULAR THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB6C;LEFT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6D;UPPER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6E;RIGHT TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB6F;LOWER TRIANGULAR ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB70;VERTICAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB71;VERTICAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB72;VERTICAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB73;VERTICAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB74;VERTICAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB75;VERTICAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB76;HORIZONTAL ONE EIGHTH BLOCK-2;So;0;ON;;;;;N;;;;; +1FB77;HORIZONTAL ONE EIGHTH BLOCK-3;So;0;ON;;;;;N;;;;; +1FB78;HORIZONTAL ONE EIGHTH BLOCK-4;So;0;ON;;;;;N;;;;; +1FB79;HORIZONTAL ONE EIGHTH BLOCK-5;So;0;ON;;;;;N;;;;; +1FB7A;HORIZONTAL ONE EIGHTH BLOCK-6;So;0;ON;;;;;N;;;;; +1FB7B;HORIZONTAL ONE EIGHTH BLOCK-7;So;0;ON;;;;;N;;;;; +1FB7C;LEFT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7D;LEFT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7E;RIGHT AND UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB7F;RIGHT AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB80;UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FB81;HORIZONTAL ONE EIGHTH BLOCK-1358;So;0;ON;;;;;N;;;;; +1FB82;UPPER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB83;UPPER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB84;UPPER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB85;UPPER THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB86;UPPER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB87;RIGHT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +1FB88;RIGHT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB89;RIGHT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8A;RIGHT THREE QUARTERS BLOCK;So;0;ON;;;;;N;;;;; +1FB8B;RIGHT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +1FB8C;LEFT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8D;RIGHT HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8E;UPPER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB8F;LOWER HALF MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB90;INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB91;UPPER HALF BLOCK AND LOWER HALF INVERSE MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB92;UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB94;LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB95;CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB96;INVERSE CHECKER BOARD FILL;So;0;ON;;;;;N;;;;; +1FB97;HEAVY HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +1FB98;UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +1FB99;UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +1FB9A;UPPER AND LOWER TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9B;LEFT AND RIGHT TRIANGULAR HALF BLOCK;So;0;ON;;;;;N;;;;; +1FB9C;UPPER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9D;UPPER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9E;LOWER RIGHT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FB9F;LOWER LEFT TRIANGULAR MEDIUM SHADE;So;0;ON;;;;;N;;;;; +1FBA0;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBA1;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA2;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA3;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA4;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA5;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA6;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA7;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBA8;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT AND MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBA9;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT AND MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAA;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE TO MIDDLE LEFT;So;0;ON;;;;;N;;;;; +1FBAB;BOX DRAWINGS LIGHT DIAGONAL UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE TO MIDDLE RIGHT;So;0;ON;;;;;N;;;;; +1FBAC;BOX DRAWINGS LIGHT DIAGONAL MIDDLE LEFT TO UPPER CENTRE TO MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAD;BOX DRAWINGS LIGHT DIAGONAL MIDDLE RIGHT TO UPPER CENTRE TO MIDDLE LEFT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBAE;BOX DRAWINGS LIGHT DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBAF;BOX DRAWINGS LIGHT HORIZONTAL WITH VERTICAL STROKE;So;0;ON;;;;;N;;;;; +1FBB0;ARROWHEAD-SHAPED POINTER;So;0;ON;;;;;N;;;;; +1FBB1;INVERSE CHECK MARK;So;0;ON;;;;;N;;;;; +1FBB2;LEFT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB3;RIGHT HALF RUNNING MAN;So;0;ON;;;;;N;;;;; +1FBB4;INVERSE DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +1FBB5;LEFTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB6;RIGHTWARDS ARROW AND UPPER AND LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB7;DOWNWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB8;UPWARDS ARROW AND RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +1FBB9;LEFT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBA;RIGHT HALF FOLDER;So;0;ON;;;;;N;;;;; +1FBBB;VOIDED GREEK CROSS;So;0;ON;;;;;N;;;;; +1FBBC;RIGHT OPEN SQUARED DOT;So;0;ON;;;;;N;;;;; +1FBBD;NEGATIVE DIAGONAL CROSS;So;0;ON;;;;;N;;;;; +1FBBE;NEGATIVE DIAGONAL MIDDLE RIGHT TO LOWER CENTRE;So;0;ON;;;;;N;;;;; +1FBBF;NEGATIVE DIAGONAL DIAMOND;So;0;ON;;;;;N;;;;; +1FBC0;WHITE HEAVY SALTIRE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1FBC1;LEFT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC2;MIDDLE THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC3;RIGHT THIRD WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1FBC4;NEGATIVE SQUARED QUESTION MARK;So;0;ON;;;;;N;;;;; +1FBC5;STICK FIGURE;So;0;ON;;;;;N;;;;; +1FBC6;STICK FIGURE WITH ARMS RAISED;So;0;ON;;;;;N;;;;; +1FBC7;STICK FIGURE LEANING LEFT;So;0;ON;;;;;N;;;;; +1FBC8;STICK FIGURE LEANING RIGHT;So;0;ON;;;;;N;;;;; +1FBC9;STICK FIGURE WITH DRESS;So;0;ON;;;;;N;;;;; +1FBCA;WHITE UP-POINTING CHEVRON;So;0;ON;;;;;N;;;;; +1FBF0;SEGMENTED DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;; +1FBF1;SEGMENTED DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;; +1FBF2;SEGMENTED DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;; +1FBF3;SEGMENTED DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;; +1FBF4;SEGMENTED DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;; +1FBF5;SEGMENTED DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;; +1FBF6;SEGMENTED DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;; +1FBF7;SEGMENTED DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;; +1FBF8;SEGMENTED DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;; +1FBF9;SEGMENTED DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;; +20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;; +2A6DF;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;; +2A700;<CJK Ideograph Extension C, First>;Lo;0;L;;;;;N;;;;; +2B739;<CJK Ideograph Extension C, Last>;Lo;0;L;;;;;N;;;;; +2B740;<CJK Ideograph Extension D, First>;Lo;0;L;;;;;N;;;;; +2B81D;<CJK Ideograph Extension D, Last>;Lo;0;L;;;;;N;;;;; +2B820;<CJK Ideograph Extension E, First>;Lo;0;L;;;;;N;;;;; +2CEA1;<CJK Ideograph Extension E, Last>;Lo;0;L;;;;;N;;;;; +2CEB0;<CJK Ideograph Extension F, First>;Lo;0;L;;;;;N;;;;; +2EBE0;<CJK Ideograph Extension F, Last>;Lo;0;L;;;;;N;;;;; +2EBF0;<CJK Ideograph Extension I, First>;Lo;0;L;;;;;N;;;;; +2EE5D;<CJK Ideograph Extension I, Last>;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +30000;<CJK Ideograph Extension G, First>;Lo;0;L;;;;;N;;;;; +3134A;<CJK Ideograph Extension G, Last>;Lo;0;L;;;;;N;;;;; +31350;<CJK Ideograph Extension H, First>;Lo;0;L;;;;;N;;;;; +323AF;<CJK Ideograph Extension H, Last>;Lo;0;L;;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;<Plane 15 Private Use, First>;Co;0;L;;;;;N;;;;; +FFFFD;<Plane 15 Private Use, Last>;Co;0;L;;;;;N;;;;; +100000;<Plane 16 Private Use, First>;Co;0;L;;;;;N;;;;; +10FFFD;<Plane 16 Private Use, Last>;Co;0;L;;;;;N;;;;; diff --git a/unicode-data/extracted/DerivedEastAsianWidth.txt b/unicode-data/extracted/DerivedEastAsianWidth.txt new file mode 100644 index 0000000..e2bac0b --- /dev/null +++ b/unicode-data/extracted/DerivedEastAsianWidth.txt @@ -0,0 +1,2611 @@ +# DerivedEastAsianWidth-15.1.0.txt +# Date: 2023-07-28, 23:34:01 GMT +# © 2023 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see https://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see https://www.unicode.org/reports/tr44/ + +# ================================================ + +# East_Asian_Width (listing EastAsianWidth.txt, field 1) + +# All code points not explicitly listed for East_Asian_Width +# have the value Neutral (N). + +# @missing: 0000..10FFFF; Neutral + +# 3400..4DBF CJK_Unified_Ideographs_Extension_A +# @missing: 3400..4DBF; Wide + +# 4E00..9FFF CJK_Unified_Ideographs +# @missing: 4E00..9FFF; Wide + +# F900..FAFF CJK_Compatibility_Ideographs +# @missing: F900..FAFF; Wide + +# 20000..2A6DF CJK_Unified_Ideographs_Extension_B +# 2A700..2B73F CJK_Unified_Ideographs_Extension_C +# 2B740..2B81F CJK_Unified_Ideographs_Extension_D +# 2B820..2CEAF CJK_Unified_Ideographs_Extension_E +# 2CEB0..2EBEF CJK_Unified_Ideographs_Extension_F +# 2EBF0..2EE5F CJK_Unified_Ideographs_Extension_I +# 2F800..2FA1F CJK_Compatibility_Ideographs_Supplement +# @missing: 20000..2FFFD; Wide + +# 30000..3134F CJK_Unified_Ideographs_Extension_G +# 31350..323AF CJK_Unified_Ideographs_Extension_H +# @missing: 30000..3FFFD; Wide + +# ================================================ + +# East_Asian_Width=Neutral + +0000..001F ; N # Cc [32] <control-0000>..<control-001F> +007F..009F ; N # Cc [33] <control-007F>..<control-009F> +00A0 ; N # Zs NO-BREAK SPACE +00A9 ; N # So COPYRIGHT SIGN +00AB ; N # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +00B5 ; N # L& MICRO SIGN +00BB ; N # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +00C0..00C5 ; N # L& [6] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER A WITH RING ABOVE +00C7..00CF ; N # L& [9] LATIN CAPITAL LETTER C WITH CEDILLA..LATIN CAPITAL LETTER I WITH DIAERESIS +00D1..00D6 ; N # L& [6] LATIN CAPITAL LETTER N WITH TILDE..LATIN CAPITAL LETTER O WITH DIAERESIS +00D9..00DD ; N # L& [5] LATIN CAPITAL LETTER U WITH GRAVE..LATIN CAPITAL LETTER Y WITH ACUTE +00E2..00E5 ; N # L& [4] LATIN SMALL LETTER A WITH CIRCUMFLEX..LATIN SMALL LETTER A WITH RING ABOVE +00E7 ; N # L& LATIN SMALL LETTER C WITH CEDILLA +00EB ; N # L& LATIN SMALL LETTER E WITH DIAERESIS +00EE..00EF ; N # L& [2] LATIN SMALL LETTER I WITH CIRCUMFLEX..LATIN SMALL LETTER I WITH DIAERESIS +00F1 ; N # L& LATIN SMALL LETTER N WITH TILDE +00F4..00F6 ; N # L& [3] LATIN SMALL LETTER O WITH CIRCUMFLEX..LATIN SMALL LETTER O WITH DIAERESIS +00FB ; N # L& LATIN SMALL LETTER U WITH CIRCUMFLEX +00FD ; N # L& LATIN SMALL LETTER Y WITH ACUTE +00FF..0100 ; N # L& [2] LATIN SMALL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER A WITH MACRON +0102..0110 ; N # L& [15] LATIN CAPITAL LETTER A WITH BREVE..LATIN CAPITAL LETTER D WITH STROKE +0112 ; N # L& LATIN CAPITAL LETTER E WITH MACRON +0114..011A ; N # L& [7] LATIN CAPITAL LETTER E WITH BREVE..LATIN CAPITAL LETTER E WITH CARON +011C..0125 ; N # L& [10] LATIN CAPITAL LETTER G WITH CIRCUMFLEX..LATIN SMALL LETTER H WITH CIRCUMFLEX +0128..012A ; N # L& [3] LATIN CAPITAL LETTER I WITH TILDE..LATIN CAPITAL LETTER I WITH MACRON +012C..0130 ; N # L& [5] LATIN CAPITAL LETTER I WITH BREVE..LATIN CAPITAL LETTER I WITH DOT ABOVE +0134..0137 ; N # L& [4] LATIN CAPITAL LETTER J WITH CIRCUMFLEX..LATIN SMALL LETTER K WITH CEDILLA +0139..013E ; N # L& [6] LATIN CAPITAL LETTER L WITH ACUTE..LATIN SMALL LETTER L WITH CARON +0143 ; N # L& LATIN CAPITAL LETTER N WITH ACUTE +0145..0147 ; N # L& [3] LATIN CAPITAL LETTER N WITH CEDILLA..LATIN CAPITAL LETTER N WITH CARON +014C ; N # L& LATIN CAPITAL LETTER O WITH MACRON +014E..0151 ; N # L& [4] LATIN CAPITAL LETTER O WITH BREVE..LATIN SMALL LETTER O WITH DOUBLE ACUTE +0154..0165 ; N # L& [18] LATIN CAPITAL LETTER R WITH ACUTE..LATIN SMALL LETTER T WITH CARON +0168..016A ; N # L& [3] LATIN CAPITAL LETTER U WITH TILDE..LATIN CAPITAL LETTER U WITH MACRON +016C..01BA ; N # L& [79] LATIN CAPITAL LETTER U WITH BREVE..LATIN SMALL LETTER EZH WITH TAIL +01BB ; N # Lo LATIN LETTER TWO WITH STROKE +01BC..01BF ; N # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN +01C0..01C3 ; N # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK +01C4..01CD ; N # L& [10] LATIN CAPITAL LETTER DZ WITH CARON..LATIN CAPITAL LETTER A WITH CARON +01CF ; N # L& LATIN CAPITAL LETTER I WITH CARON +01D1 ; N # L& LATIN CAPITAL LETTER O WITH CARON +01D3 ; N # L& LATIN CAPITAL LETTER U WITH CARON +01D5 ; N # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7 ; N # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9 ; N # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB ; N # L& LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DD..0250 ; N # L& [116] LATIN SMALL LETTER TURNED E..LATIN SMALL LETTER TURNED A +0252..0260 ; N # L& [15] LATIN SMALL LETTER TURNED ALPHA..LATIN SMALL LETTER G WITH HOOK +0262..0293 ; N # L& [50] LATIN LETTER SMALL CAPITAL G..LATIN SMALL LETTER EZH WITH CURL +0294 ; N # Lo LATIN LETTER GLOTTAL STOP +0295..02AF ; N # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL +02B0..02C1 ; N # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP +02C2..02C3 ; N # Sk [2] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER RIGHT ARROWHEAD +02C5 ; N # Sk MODIFIER LETTER DOWN ARROWHEAD +02C6 ; N # Lm MODIFIER LETTER CIRCUMFLEX ACCENT +02C8 ; N # Lm MODIFIER LETTER VERTICAL LINE +02CC ; N # Lm MODIFIER LETTER LOW VERTICAL LINE +02CE..02CF ; N # Lm [2] MODIFIER LETTER LOW GRAVE ACCENT..MODIFIER LETTER LOW ACUTE ACCENT +02D1 ; N # Lm MODIFIER LETTER HALF TRIANGULAR COLON +02D2..02D7 ; N # Sk [6] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER MINUS SIGN +02DC ; N # Sk SMALL TILDE +02DE ; N # Sk MODIFIER LETTER RHOTIC HOOK +02E0..02E4 ; N # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP +02E5..02EB ; N # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK +02EC ; N # Lm MODIFIER LETTER VOICING +02ED ; N # Sk MODIFIER LETTER UNASPIRATED +02EE ; N # Lm MODIFIER LETTER DOUBLE APOSTROPHE +02EF..02FF ; N # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW +0370..0373 ; N # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI +0374 ; N # Lm GREEK NUMERAL SIGN +0375 ; N # Sk GREEK LOWER NUMERAL SIGN +0376..0377 ; N # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA +037A ; N # Lm GREEK YPOGEGRAMMENI +037B..037D ; N # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL +037E ; N # Po GREEK QUESTION MARK +037F ; N # L& GREEK CAPITAL LETTER YOT +0384..0385 ; N # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS +0386 ; N # L& GREEK CAPITAL LETTER ALPHA WITH TONOS +0387 ; N # Po GREEK ANO TELEIA +0388..038A ; N # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS +038C ; N # L& GREEK CAPITAL LETTER OMICRON WITH TONOS +038E..0390 ; N # L& [3] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +03AA..03B0 ; N # L& [7] GREEK CAPITAL LETTER IOTA WITH DIALYTIKA..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2 ; N # L& GREEK SMALL LETTER FINAL SIGMA +03CA..03F5 ; N # L& [44] GREEK SMALL LETTER IOTA WITH DIALYTIKA..GREEK LUNATE EPSILON SYMBOL +03F6 ; N # Sm GREEK REVERSED LUNATE EPSILON SYMBOL +03F7..0400 ; N # L& [10] GREEK CAPITAL LETTER SHO..CYRILLIC CAPITAL LETTER IE WITH GRAVE +0402..040F ; N # L& [14] CYRILLIC CAPITAL LETTER DJE..CYRILLIC CAPITAL LETTER DZHE +0450 ; N # L& CYRILLIC SMALL LETTER IE WITH GRAVE +0452..0481 ; N # L& [48] CYRILLIC SMALL LETTER DJE..CYRILLIC SMALL LETTER KOPPA +0482 ; N # So CYRILLIC THOUSANDS SIGN +0483..0487 ; N # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE +0488..0489 ; N # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN +048A..052F ; N # L& [166] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EL WITH DESCENDER +0531..0556 ; N # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH +0559 ; N # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING +055A..055F ; N # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK +0560..0588 ; N # L& [41] ARMENIAN SMALL LETTER TURNED AYB..ARMENIAN SMALL LETTER YI WITH STROKE +0589 ; N # Po ARMENIAN FULL STOP +058A ; N # Pd ARMENIAN HYPHEN +058D..058E ; N # So [2] RIGHT-FACING ARMENIAN ETERNITY SIGN..LEFT-FACING ARMENIAN ETERNITY SIGN +058F ; N # Sc ARMENIAN DRAM SIGN +0591..05BD ; N # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG +05BE ; N # Pd HEBREW PUNCTUATION MAQAF +05BF ; N # Mn HEBREW POINT RAFE +05C0 ; N # Po HEBREW PUNCTUATION PASEQ +05C1..05C2 ; N # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT +05C3 ; N # Po HEBREW PUNCTUATION SOF PASUQ +05C4..05C5 ; N # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT +05C6 ; N # Po HEBREW PUNCTUATION NUN HAFUKHA +05C7 ; N # Mn HEBREW POINT QAMATS QATAN +05D0..05EA ; N # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV +05EF..05F2 ; N # Lo [4] HEBREW YOD TRIANGLE..HEBREW LIGATURE YIDDISH DOUBLE YOD +05F3..05F4 ; N # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM +0600..0605 ; N # Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE +0606..0608 ; N # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY +0609..060A ; N # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN +060B ; N # Sc AFGHANI SIGN +060C..060D ; N # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR +060E..060F ; N # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA +0610..061A ; N # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA +061B ; N # Po ARABIC SEMICOLON +061C ; N # Cf ARABIC LETTER MARK +061D..061F ; N # Po [3] ARABIC END OF TEXT MARK..ARABIC QUESTION MARK +0620..063F ; N # Lo [32] ARABIC LETTER KASHMIRI YEH..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE +0640 ; N # Lm ARABIC TATWEEL +0641..064A ; N # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH +064B..065F ; N # Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW +0660..0669 ; N # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE +066A..066D ; N # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR +066E..066F ; N # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF +0670 ; N # Mn ARABIC LETTER SUPERSCRIPT ALEF +0671..06D3 ; N # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE +06D4 ; N # Po ARABIC FULL STOP +06D5 ; N # Lo ARABIC LETTER AE +06D6..06DC ; N # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN +06DD ; N # Cf ARABIC END OF AYAH +06DE ; N # So ARABIC START OF RUB EL HIZB +06DF..06E4 ; N # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA +06E5..06E6 ; N # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH +06E7..06E8 ; N # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON +06E9 ; N # So ARABIC PLACE OF SAJDAH +06EA..06ED ; N # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM +06EE..06EF ; N # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V +06F0..06F9 ; N # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE +06FA..06FC ; N # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW +06FD..06FE ; N # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN +06FF ; N # Lo ARABIC LETTER HEH WITH INVERTED V +0700..070D ; N # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS +070F ; N # Cf SYRIAC ABBREVIATION MARK +0710 ; N # Lo SYRIAC LETTER ALAPH +0711 ; N # Mn SYRIAC LETTER SUPERSCRIPT ALAPH +0712..072F ; N # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH +0730..074A ; N # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH +074D..07A5 ; N # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU +07A6..07B0 ; N # Mn [11] THAANA ABAFILI..THAANA SUKUN +07B1 ; N # Lo THAANA LETTER NAA +07C0..07C9 ; N # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE +07CA..07EA ; N # Lo [33] NKO LETTER A..NKO LETTER JONA RA +07EB..07F3 ; N # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE +07F4..07F5 ; N # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE +07F6 ; N # So NKO SYMBOL OO DENNEN +07F7..07F9 ; N # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK +07FA ; N # Lm NKO LAJANYALAN +07FD ; N # Mn NKO DANTAYALAN +07FE..07FF ; N # Sc [2] NKO DOROME SIGN..NKO TAMAN SIGN +0800..0815 ; N # Lo [22] SAMARITAN LETTER ALAF..SAMARITAN LETTER TAAF +0816..0819 ; N # Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH +081A ; N # Lm SAMARITAN MODIFIER LETTER EPENTHETIC YUT +081B..0823 ; N # Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A +0824 ; N # Lm SAMARITAN MODIFIER LETTER SHORT A +0825..0827 ; N # Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U +0828 ; N # Lm SAMARITAN MODIFIER LETTER I +0829..082D ; N # Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA +0830..083E ; N # Po [15] SAMARITAN PUNCTUATION NEQUDAA..SAMARITAN PUNCTUATION ANNAAU +0840..0858 ; N # Lo [25] MANDAIC LETTER HALQA..MANDAIC LETTER AIN +0859..085B ; N # Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK +085E ; N # Po MANDAIC PUNCTUATION +0860..086A ; N # Lo [11] SYRIAC LETTER MALAYALAM NGA..SYRIAC LETTER MALAYALAM SSA +0870..0887 ; N # Lo [24] ARABIC LETTER ALEF WITH ATTACHED FATHA..ARABIC BASELINE ROUND DOT +0888 ; N # Sk ARABIC RAISED ROUND DOT +0889..088E ; N # Lo [6] ARABIC LETTER NOON WITH INVERTED SMALL V..ARABIC VERTICAL TAIL +0890..0891 ; N # Cf [2] ARABIC POUND MARK ABOVE..ARABIC PIASTRE MARK ABOVE +0898..089F ; N # Mn [8] ARABIC SMALL HIGH WORD AL-JUZ..ARABIC HALF MADDA OVER MADDA +08A0..08C8 ; N # Lo [41] ARABIC LETTER BEH WITH SMALL V BELOW..ARABIC LETTER GRAF +08C9 ; N # Lm ARABIC SMALL FARSI YEH +08CA..08E1 ; N # Mn [24] ARABIC SMALL HIGH FARSI YEH..ARABIC SMALL HIGH SIGN SAFHA +08E2 ; N # Cf ARABIC DISPUTED END OF AYAH +08E3..0902 ; N # Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA +0903 ; N # Mc DEVANAGARI SIGN VISARGA +0904..0939 ; N # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA +093A ; N # Mn DEVANAGARI VOWEL SIGN OE +093B ; N # Mc DEVANAGARI VOWEL SIGN OOE +093C ; N # Mn DEVANAGARI SIGN NUKTA +093D ; N # Lo DEVANAGARI SIGN AVAGRAHA +093E..0940 ; N # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II +0941..0948 ; N # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI +0949..094C ; N # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU +094D ; N # Mn DEVANAGARI SIGN VIRAMA +094E..094F ; N # Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW +0950 ; N # Lo DEVANAGARI OM +0951..0957 ; N # Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE +0958..0961 ; N # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL +0962..0963 ; N # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL +0964..0965 ; N # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA +0966..096F ; N # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE +0970 ; N # Po DEVANAGARI ABBREVIATION SIGN +0971 ; N # Lm DEVANAGARI SIGN HIGH SPACING DOT +0972..0980 ; N # Lo [15] DEVANAGARI LETTER CANDRA A..BENGALI ANJI +0981 ; N # Mn BENGALI SIGN CANDRABINDU +0982..0983 ; N # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA +0985..098C ; N # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L +098F..0990 ; N # Lo [2] BENGALI LETTER E..BENGALI LETTER AI +0993..09A8 ; N # Lo [22] BENGALI LETTER O..BENGALI LETTER NA +09AA..09B0 ; N # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA +09B2 ; N # Lo BENGALI LETTER LA +09B6..09B9 ; N # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA +09BC ; N # Mn BENGALI SIGN NUKTA +09BD ; N # Lo BENGALI SIGN AVAGRAHA +09BE..09C0 ; N # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II +09C1..09C4 ; N # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR +09C7..09C8 ; N # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI +09CB..09CC ; N # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU +09CD ; N # Mn BENGALI SIGN VIRAMA +09CE ; N # Lo BENGALI LETTER KHANDA TA +09D7 ; N # Mc BENGALI AU LENGTH MARK +09DC..09DD ; N # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA +09DF..09E1 ; N # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL +09E2..09E3 ; N # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL +09E6..09EF ; N # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE +09F0..09F1 ; N # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL +09F2..09F3 ; N # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN +09F4..09F9 ; N # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN +09FA ; N # So BENGALI ISSHAR +09FB ; N # Sc BENGALI GANDA MARK +09FC ; N # Lo BENGALI LETTER VEDIC ANUSVARA +09FD ; N # Po BENGALI ABBREVIATION SIGN +09FE ; N # Mn BENGALI SANDHI MARK +0A01..0A02 ; N # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI +0A03 ; N # Mc GURMUKHI SIGN VISARGA +0A05..0A0A ; N # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU +0A0F..0A10 ; N # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI +0A13..0A28 ; N # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA +0A2A..0A30 ; N # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA +0A32..0A33 ; N # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA +0A35..0A36 ; N # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA +0A38..0A39 ; N # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA +0A3C ; N # Mn GURMUKHI SIGN NUKTA +0A3E..0A40 ; N # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II +0A41..0A42 ; N # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU +0A47..0A48 ; N # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI +0A4B..0A4D ; N # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA +0A51 ; N # Mn GURMUKHI SIGN UDAAT +0A59..0A5C ; N # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA +0A5E ; N # Lo GURMUKHI LETTER FA +0A66..0A6F ; N # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE +0A70..0A71 ; N # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK +0A72..0A74 ; N # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR +0A75 ; N # Mn GURMUKHI SIGN YAKASH +0A76 ; N # Po GURMUKHI ABBREVIATION SIGN +0A81..0A82 ; N # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA +0A83 ; N # Mc GUJARATI SIGN VISARGA +0A85..0A8D ; N # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E +0A8F..0A91 ; N # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O +0A93..0AA8 ; N # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA +0AAA..0AB0 ; N # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA +0AB2..0AB3 ; N # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA +0AB5..0AB9 ; N # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA +0ABC ; N # Mn GUJARATI SIGN NUKTA +0ABD ; N # Lo GUJARATI SIGN AVAGRAHA +0ABE..0AC0 ; N # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II +0AC1..0AC5 ; N # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E +0AC7..0AC8 ; N # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI +0AC9 ; N # Mc GUJARATI VOWEL SIGN CANDRA O +0ACB..0ACC ; N # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU +0ACD ; N # Mn GUJARATI SIGN VIRAMA +0AD0 ; N # Lo GUJARATI OM +0AE0..0AE1 ; N # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL +0AE2..0AE3 ; N # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL +0AE6..0AEF ; N # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE +0AF0 ; N # Po GUJARATI ABBREVIATION SIGN +0AF1 ; N # Sc GUJARATI RUPEE SIGN +0AF9 ; N # Lo GUJARATI LETTER ZHA +0AFA..0AFF ; N # Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE +0B01 ; N # Mn ORIYA SIGN CANDRABINDU +0B02..0B03 ; N # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA +0B05..0B0C ; N # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L +0B0F..0B10 ; N # Lo [2] ORIYA LETTER E..ORIYA LETTER AI +0B13..0B28 ; N # Lo [22] ORIYA LETTER O..ORIYA LETTER NA +0B2A..0B30 ; N # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA +0B32..0B33 ; N # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA +0B35..0B39 ; N # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA +0B3C ; N # Mn ORIYA SIGN NUKTA +0B3D ; N # Lo ORIYA SIGN AVAGRAHA +0B3E ; N # Mc ORIYA VOWEL SIGN AA +0B3F ; N # Mn ORIYA VOWEL SIGN I +0B40 ; N # Mc ORIYA VOWEL SIGN II +0B41..0B44 ; N # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR +0B47..0B48 ; N # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI +0B4B..0B4C ; N # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU +0B4D ; N # Mn ORIYA SIGN VIRAMA +0B55..0B56 ; N # Mn [2] ORIYA SIGN OVERLINE..ORIYA AI LENGTH MARK +0B57 ; N # Mc ORIYA AU LENGTH MARK +0B5C..0B5D ; N # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA +0B5F..0B61 ; N # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL +0B62..0B63 ; N # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL +0B66..0B6F ; N # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE +0B70 ; N # So ORIYA ISSHAR +0B71 ; N # Lo ORIYA LETTER WA +0B72..0B77 ; N # No [6] ORIYA FRACTION ONE QUARTER..ORIYA FRACTION THREE SIXTEENTHS +0B82 ; N # Mn TAMIL SIGN ANUSVARA +0B83 ; N # Lo TAMIL SIGN VISARGA +0B85..0B8A ; N # Lo [6] TAMIL LETTER A..TAMIL LETTER UU +0B8E..0B90 ; N # Lo [3] TAMIL LETTER E..TAMIL LETTER AI +0B92..0B95 ; N # Lo [4] TAMIL LETTER O..TAMIL LETTER KA +0B99..0B9A ; N # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA +0B9C ; N # Lo TAMIL LETTER JA +0B9E..0B9F ; N # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA +0BA3..0BA4 ; N # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA +0BA8..0BAA ; N # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA +0BAE..0BB9 ; N # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA +0BBE..0BBF ; N # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I +0BC0 ; N # Mn TAMIL VOWEL SIGN II +0BC1..0BC2 ; N # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU +0BC6..0BC8 ; N # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI +0BCA..0BCC ; N # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU +0BCD ; N # Mn TAMIL SIGN VIRAMA +0BD0 ; N # Lo TAMIL OM +0BD7 ; N # Mc TAMIL AU LENGTH MARK +0BE6..0BEF ; N # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE +0BF0..0BF2 ; N # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND +0BF3..0BF8 ; N # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN +0BF9 ; N # Sc TAMIL RUPEE SIGN +0BFA ; N # So TAMIL NUMBER SIGN +0C00 ; N # Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE +0C01..0C03 ; N # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA +0C04 ; N # Mn TELUGU SIGN COMBINING ANUSVARA ABOVE +0C05..0C0C ; N # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L +0C0E..0C10 ; N # Lo [3] TELUGU LETTER E..TELUGU LETTER AI +0C12..0C28 ; N # Lo [23] TELUGU LETTER O..TELUGU LETTER NA +0C2A..0C39 ; N # Lo [16] TELUGU LETTER PA..TELUGU LETTER HA +0C3C ; N # Mn TELUGU SIGN NUKTA +0C3D ; N # Lo TELUGU SIGN AVAGRAHA +0C3E..0C40 ; N # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II +0C41..0C44 ; N # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR +0C46..0C48 ; N # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI +0C4A..0C4D ; N # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA +0C55..0C56 ; N # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK +0C58..0C5A ; N # Lo [3] TELUGU LETTER TSA..TELUGU LETTER RRRA +0C5D ; N # Lo TELUGU LETTER NAKAARA POLLU +0C60..0C61 ; N # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL +0C62..0C63 ; N # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL +0C66..0C6F ; N # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE +0C77 ; N # Po TELUGU SIGN SIDDHAM +0C78..0C7E ; N # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR +0C7F ; N # So TELUGU SIGN TUUMU +0C80 ; N # Lo KANNADA SIGN SPACING CANDRABINDU +0C81 ; N # Mn KANNADA SIGN CANDRABINDU +0C82..0C83 ; N # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA +0C84 ; N # Po KANNADA SIGN SIDDHAM +0C85..0C8C ; N # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L +0C8E..0C90 ; N # Lo [3] KANNADA LETTER E..KANNADA LETTER AI +0C92..0CA8 ; N # Lo [23] KANNADA LETTER O..KANNADA LETTER NA +0CAA..0CB3 ; N # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA +0CB5..0CB9 ; N # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA +0CBC ; N # Mn KANNADA SIGN NUKTA +0CBD ; N # Lo KANNADA SIGN AVAGRAHA +0CBE ; N # Mc KANNADA VOWEL SIGN AA +0CBF ; N # Mn KANNADA VOWEL SIGN I +0CC0..0CC4 ; N # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR +0CC6 ; N # Mn KANNADA VOWEL SIGN E +0CC7..0CC8 ; N # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI +0CCA..0CCB ; N # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO +0CCC..0CCD ; N # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA +0CD5..0CD6 ; N # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK +0CDD..0CDE ; N # Lo [2] KANNADA LETTER NAKAARA POLLU..KANNADA LETTER FA +0CE0..0CE1 ; N # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL +0CE2..0CE3 ; N # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL +0CE6..0CEF ; N # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE +0CF1..0CF2 ; N # Lo [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA +0CF3 ; N # Mc KANNADA SIGN COMBINING ANUSVARA ABOVE RIGHT +0D00..0D01 ; N # Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU +0D02..0D03 ; N # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA +0D04..0D0C ; N # Lo [9] MALAYALAM LETTER VEDIC ANUSVARA..MALAYALAM LETTER VOCALIC L +0D0E..0D10 ; N # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI +0D12..0D3A ; N # Lo [41] MALAYALAM LETTER O..MALAYALAM LETTER TTTA +0D3B..0D3C ; N # Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA +0D3D ; N # Lo MALAYALAM SIGN AVAGRAHA +0D3E..0D40 ; N # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II +0D41..0D44 ; N # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR +0D46..0D48 ; N # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI +0D4A..0D4C ; N # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU +0D4D ; N # Mn MALAYALAM SIGN VIRAMA +0D4E ; N # Lo MALAYALAM LETTER DOT REPH +0D4F ; N # So MALAYALAM SIGN PARA +0D54..0D56 ; N # Lo [3] MALAYALAM LETTER CHILLU M..MALAYALAM LETTER CHILLU LLL +0D57 ; N # Mc MALAYALAM AU LENGTH MARK +0D58..0D5E ; N # No [7] MALAYALAM FRACTION ONE ONE-HUNDRED-AND-SIXTIETH..MALAYALAM FRACTION ONE FIFTH +0D5F..0D61 ; N # Lo [3] MALAYALAM LETTER ARCHAIC II..MALAYALAM LETTER VOCALIC LL +0D62..0D63 ; N # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL +0D66..0D6F ; N # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE +0D70..0D78 ; N # No [9] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE SIXTEENTHS +0D79 ; N # So MALAYALAM DATE MARK +0D7A..0D7F ; N # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K +0D81 ; N # Mn SINHALA SIGN CANDRABINDU +0D82..0D83 ; N # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA +0D85..0D96 ; N # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA +0D9A..0DB1 ; N # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA +0DB3..0DBB ; N # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA +0DBD ; N # Lo SINHALA LETTER DANTAJA LAYANNA +0DC0..0DC6 ; N # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA +0DCA ; N # Mn SINHALA SIGN AL-LAKUNA +0DCF..0DD1 ; N # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA +0DD2..0DD4 ; N # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA +0DD6 ; N # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA +0DD8..0DDF ; N # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA +0DE6..0DEF ; N # Nd [10] SINHALA LITH DIGIT ZERO..SINHALA LITH DIGIT NINE +0DF2..0DF3 ; N # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA +0DF4 ; N # Po SINHALA PUNCTUATION KUNDDALIYA +0E01..0E30 ; N # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A +0E31 ; N # Mn THAI CHARACTER MAI HAN-AKAT +0E32..0E33 ; N # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM +0E34..0E3A ; N # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU +0E3F ; N # Sc THAI CURRENCY SYMBOL BAHT +0E40..0E45 ; N # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO +0E46 ; N # Lm THAI CHARACTER MAIYAMOK +0E47..0E4E ; N # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN +0E4F ; N # Po THAI CHARACTER FONGMAN +0E50..0E59 ; N # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE +0E5A..0E5B ; N # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT +0E81..0E82 ; N # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG +0E84 ; N # Lo LAO LETTER KHO TAM +0E86..0E8A ; N # Lo [5] LAO LETTER PALI GHA..LAO LETTER SO TAM +0E8C..0EA3 ; N # Lo [24] LAO LETTER PALI JHA..LAO LETTER LO LING +0EA5 ; N # Lo LAO LETTER LO LOOT +0EA7..0EB0 ; N # Lo [10] LAO LETTER WO..LAO VOWEL SIGN A +0EB1 ; N # Mn LAO VOWEL SIGN MAI KAN +0EB2..0EB3 ; N # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM +0EB4..0EBC ; N # Mn [9] LAO VOWEL SIGN I..LAO SEMIVOWEL SIGN LO +0EBD ; N # Lo LAO SEMIVOWEL SIGN NYO +0EC0..0EC4 ; N # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI +0EC6 ; N # Lm LAO KO LA +0EC8..0ECE ; N # Mn [7] LAO TONE MAI EK..LAO YAMAKKAN +0ED0..0ED9 ; N # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE +0EDC..0EDF ; N # Lo [4] LAO HO NO..LAO LETTER KHMU NYO +0F00 ; N # Lo TIBETAN SYLLABLE OM +0F01..0F03 ; N # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA +0F04..0F12 ; N # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD +0F13 ; N # So TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN +0F14 ; N # Po TIBETAN MARK GTER TSHEG +0F15..0F17 ; N # So [3] TIBETAN LOGOTYPE SIGN CHAD RTAGS..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS +0F18..0F19 ; N # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS +0F1A..0F1F ; N # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG +0F20..0F29 ; N # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE +0F2A..0F33 ; N # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO +0F34 ; N # So TIBETAN MARK BSDUS RTAGS +0F35 ; N # Mn TIBETAN MARK NGAS BZUNG NYI ZLA +0F36 ; N # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN +0F37 ; N # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS +0F38 ; N # So TIBETAN MARK CHE MGO +0F39 ; N # Mn TIBETAN MARK TSA -PHRU +0F3A ; N # Ps TIBETAN MARK GUG RTAGS GYON +0F3B ; N # Pe TIBETAN MARK GUG RTAGS GYAS +0F3C ; N # Ps TIBETAN MARK ANG KHANG GYON +0F3D ; N # Pe TIBETAN MARK ANG KHANG GYAS +0F3E..0F3F ; N # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES +0F40..0F47 ; N # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA +0F49..0F6C ; N # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA +0F71..0F7E ; N # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO +0F7F ; N # Mc TIBETAN SIGN RNAM BCAD +0F80..0F84 ; N # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA +0F85 ; N # Po TIBETAN MARK PALUTA +0F86..0F87 ; N # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS +0F88..0F8C ; N # Lo [5] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN INVERTED MCHU CAN +0F8D..0F97 ; N # Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA +0F99..0FBC ; N # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA +0FBE..0FC5 ; N # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE +0FC6 ; N # Mn TIBETAN SYMBOL PADMA GDAN +0FC7..0FCC ; N # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL +0FCE..0FCF ; N # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM +0FD0..0FD4 ; N # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA +0FD5..0FD8 ; N # So [4] RIGHT-FACING SVASTI SIGN..LEFT-FACING SVASTI SIGN WITH DOTS +0FD9..0FDA ; N # Po [2] TIBETAN MARK LEADING MCHAN RTAGS..TIBETAN MARK TRAILING MCHAN RTAGS +1000..102A ; N # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU +102B..102C ; N # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA +102D..1030 ; N # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU +1031 ; N # Mc MYANMAR VOWEL SIGN E +1032..1037 ; N # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW +1038 ; N # Mc MYANMAR SIGN VISARGA +1039..103A ; N # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT +103B..103C ; N # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA +103D..103E ; N # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA +103F ; N # Lo MYANMAR LETTER GREAT SA +1040..1049 ; N # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE +104A..104F ; N # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE +1050..1055 ; N # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL +1056..1057 ; N # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR +1058..1059 ; N # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL +105A..105D ; N # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE +105E..1060 ; N # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA +1061 ; N # Lo MYANMAR LETTER SGAW KAREN SHA +1062..1064 ; N # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO +1065..1066 ; N # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA +1067..106D ; N # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 +106E..1070 ; N # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA +1071..1074 ; N # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE +1075..1081 ; N # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA +1082 ; N # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA +1083..1084 ; N # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E +1085..1086 ; N # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y +1087..108C ; N # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 +108D ; N # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE +108E ; N # Lo MYANMAR LETTER RUMAI PALAUNG FA +108F ; N # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 +1090..1099 ; N # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE +109A..109C ; N # Mc [3] MYANMAR SIGN KHAMTI TONE-1..MYANMAR VOWEL SIGN AITON A +109D ; N # Mn MYANMAR VOWEL SIGN AITON AI +109E..109F ; N # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION +10A0..10C5 ; N # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE +10C7 ; N # L& GEORGIAN CAPITAL LETTER YN +10CD ; N # L& GEORGIAN CAPITAL LETTER AEN +10D0..10FA ; N # L& [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN +10FB ; N # Po GEORGIAN PARAGRAPH SEPARATOR +10FC ; N # Lm MODIFIER LETTER GEORGIAN NAR +10FD..10FF ; N # L& [3] GEORGIAN LETTER AEN..GEORGIAN LETTER LABIAL SIGN +1160..1248 ; N # Lo [233] HANGUL JUNGSEONG FILLER..ETHIOPIC SYLLABLE QWA +124A..124D ; N # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE +1250..1256 ; N # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO +1258 ; N # Lo ETHIOPIC SYLLABLE QHWA +125A..125D ; N # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE +1260..1288 ; N # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA +128A..128D ; N # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE +1290..12B0 ; N # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA +12B2..12B5 ; N # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE +12B8..12BE ; N # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO +12C0 ; N # Lo ETHIOPIC SYLLABLE KXWA +12C2..12C5 ; N # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE +12C8..12D6 ; N # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O +12D8..1310 ; N # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA +1312..1315 ; N # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE +1318..135A ; N # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA +135D..135F ; N # Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK +1360..1368 ; N # Po [9] ETHIOPIC SECTION MARK..ETHIOPIC PARAGRAPH SEPARATOR +1369..137C ; N # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND +1380..138F ; N # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE +1390..1399 ; N # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT +13A0..13F5 ; N # L& [86] CHEROKEE LETTER A..CHEROKEE LETTER MV +13F8..13FD ; N # L& [6] CHEROKEE SMALL LETTER YE..CHEROKEE SMALL LETTER MV +1400 ; N # Pd CANADIAN SYLLABICS HYPHEN +1401..166C ; N # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA +166D ; N # So CANADIAN SYLLABICS CHI SIGN +166E ; N # Po CANADIAN SYLLABICS FULL STOP +166F..167F ; N # Lo [17] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS BLACKFOOT W +1680 ; N # Zs OGHAM SPACE MARK +1681..169A ; N # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH +169B ; N # Ps OGHAM FEATHER MARK +169C ; N # Pe OGHAM REVERSED FEATHER MARK +16A0..16EA ; N # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X +16EB..16ED ; N # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION +16EE..16F0 ; N # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL +16F1..16F8 ; N # Lo [8] RUNIC LETTER K..RUNIC LETTER FRANKS CASKET AESC +1700..1711 ; N # Lo [18] TAGALOG LETTER A..TAGALOG LETTER HA +1712..1714 ; N # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA +1715 ; N # Mc TAGALOG SIGN PAMUDPOD +171F..1731 ; N # Lo [19] TAGALOG LETTER ARCHAIC RA..HANUNOO LETTER HA +1732..1733 ; N # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U +1734 ; N # Mc HANUNOO SIGN PAMUDPOD +1735..1736 ; N # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION +1740..1751 ; N # Lo [18] BUHID LETTER A..BUHID LETTER HA +1752..1753 ; N # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U +1760..176C ; N # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA +176E..1770 ; N # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA +1772..1773 ; N # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U +1780..17B3 ; N # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU +17B4..17B5 ; N # Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA +17B6 ; N # Mc KHMER VOWEL SIGN AA +17B7..17BD ; N # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA +17BE..17C5 ; N # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU +17C6 ; N # Mn KHMER SIGN NIKAHIT +17C7..17C8 ; N # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU +17C9..17D3 ; N # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT +17D4..17D6 ; N # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH +17D7 ; N # Lm KHMER SIGN LEK TOO +17D8..17DA ; N # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT +17DB ; N # Sc KHMER CURRENCY SYMBOL RIEL +17DC ; N # Lo KHMER SIGN AVAKRAHASANYA +17DD ; N # Mn KHMER SIGN ATTHACAN +17E0..17E9 ; N # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE +17F0..17F9 ; N # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON +1800..1805 ; N # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS +1806 ; N # Pd MONGOLIAN TODO SOFT HYPHEN +1807..180A ; N # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU +180B..180D ; N # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE +180E ; N # Cf MONGOLIAN VOWEL SEPARATOR +180F ; N # Mn MONGOLIAN FREE VARIATION SELECTOR FOUR +1810..1819 ; N # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE +1820..1842 ; N # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI +1843 ; N # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN +1844..1878 ; N # Lo [53] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER CHA WITH TWO DOTS +1880..1884 ; N # Lo [5] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER ALI GALI INVERTED UBADAMA +1885..1886 ; N # Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA +1887..18A8 ; N # Lo [34] MONGOLIAN LETTER ALI GALI A..MONGOLIAN LETTER MANCHU ALI GALI BHA +18A9 ; N # Mn MONGOLIAN LETTER ALI GALI DAGALGA +18AA ; N # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA +18B0..18F5 ; N # Lo [70] CANADIAN SYLLABICS OY..CANADIAN SYLLABICS CARRIER DENTAL S +1900..191E ; N # Lo [31] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER TRA +1920..1922 ; N # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U +1923..1926 ; N # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU +1927..1928 ; N # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O +1929..192B ; N # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA +1930..1931 ; N # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA +1932 ; N # Mn LIMBU SMALL LETTER ANUSVARA +1933..1938 ; N # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA +1939..193B ; N # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I +1940 ; N # So LIMBU SIGN LOO +1944..1945 ; N # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK +1946..194F ; N # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE +1950..196D ; N # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI +1970..1974 ; N # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 +1980..19AB ; N # Lo [44] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW SUA +19B0..19C9 ; N # Lo [26] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE TONE MARK-2 +19D0..19D9 ; N # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE +19DA ; N # No NEW TAI LUE THAM DIGIT ONE +19DE..19FF ; N # So [34] NEW TAI LUE SIGN LAE..KHMER SYMBOL DAP-PRAM ROC +1A00..1A16 ; N # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA +1A17..1A18 ; N # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U +1A19..1A1A ; N # Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O +1A1B ; N # Mn BUGINESE VOWEL SIGN AE +1A1E..1A1F ; N # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION +1A20..1A54 ; N # Lo [53] TAI THAM LETTER HIGH KA..TAI THAM LETTER GREAT SA +1A55 ; N # Mc TAI THAM CONSONANT SIGN MEDIAL RA +1A56 ; N # Mn TAI THAM CONSONANT SIGN MEDIAL LA +1A57 ; N # Mc TAI THAM CONSONANT SIGN LA TANG LAI +1A58..1A5E ; N # Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA +1A60 ; N # Mn TAI THAM SIGN SAKOT +1A61 ; N # Mc TAI THAM VOWEL SIGN A +1A62 ; N # Mn TAI THAM VOWEL SIGN MAI SAT +1A63..1A64 ; N # Mc [2] TAI THAM VOWEL SIGN AA..TAI THAM VOWEL SIGN TALL AA +1A65..1A6C ; N # Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW +1A6D..1A72 ; N # Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI +1A73..1A7C ; N # Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN +1A7F ; N # Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT +1A80..1A89 ; N # Nd [10] TAI THAM HORA DIGIT ZERO..TAI THAM HORA DIGIT NINE +1A90..1A99 ; N # Nd [10] TAI THAM THAM DIGIT ZERO..TAI THAM THAM DIGIT NINE +1AA0..1AA6 ; N # Po [7] TAI THAM SIGN WIANG..TAI THAM SIGN REVERSED ROTATED RANA +1AA7 ; N # Lm TAI THAM SIGN MAI YAMOK +1AA8..1AAD ; N # Po [6] TAI THAM SIGN KAAN..TAI THAM SIGN CAANG +1AB0..1ABD ; N # Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW +1ABE ; N # Me COMBINING PARENTHESES OVERLAY +1ABF..1ACE ; N # Mn [16] COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER INSULAR T +1B00..1B03 ; N # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG +1B04 ; N # Mc BALINESE SIGN BISAH +1B05..1B33 ; N # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA +1B34 ; N # Mn BALINESE SIGN REREKAN +1B35 ; N # Mc BALINESE VOWEL SIGN TEDUNG +1B36..1B3A ; N # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA +1B3B ; N # Mc BALINESE VOWEL SIGN RA REPA TEDUNG +1B3C ; N # Mn BALINESE VOWEL SIGN LA LENGA +1B3D..1B41 ; N # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG +1B42 ; N # Mn BALINESE VOWEL SIGN PEPET +1B43..1B44 ; N # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG +1B45..1B4C ; N # Lo [8] BALINESE LETTER KAF SASAK..BALINESE LETTER ARCHAIC JNYA +1B50..1B59 ; N # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE +1B5A..1B60 ; N # Po [7] BALINESE PANTI..BALINESE PAMENENG +1B61..1B6A ; N # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE +1B6B..1B73 ; N # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG +1B74..1B7C ; N # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING +1B7D..1B7E ; N # Po [2] BALINESE PANTI LANTANG..BALINESE PAMADA LANTANG +1B80..1B81 ; N # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR +1B82 ; N # Mc SUNDANESE SIGN PANGWISAD +1B83..1BA0 ; N # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA +1BA1 ; N # Mc SUNDANESE CONSONANT SIGN PAMINGKAL +1BA2..1BA5 ; N # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU +1BA6..1BA7 ; N # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG +1BA8..1BA9 ; N # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG +1BAA ; N # Mc SUNDANESE SIGN PAMAAEH +1BAB..1BAD ; N # Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA +1BAE..1BAF ; N # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA +1BB0..1BB9 ; N # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE +1BBA..1BE5 ; N # Lo [44] SUNDANESE AVAGRAHA..BATAK LETTER U +1BE6 ; N # Mn BATAK SIGN TOMPI +1BE7 ; N # Mc BATAK VOWEL SIGN E +1BE8..1BE9 ; N # Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE +1BEA..1BEC ; N # Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O +1BED ; N # Mn BATAK VOWEL SIGN KARO O +1BEE ; N # Mc BATAK VOWEL SIGN U +1BEF..1BF1 ; N # Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H +1BF2..1BF3 ; N # Mc [2] BATAK PANGOLAT..BATAK PANONGONAN +1BFC..1BFF ; N # Po [4] BATAK SYMBOL BINDU NA METEK..BATAK SYMBOL BINDU PANGOLAT +1C00..1C23 ; N # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A +1C24..1C2B ; N # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU +1C2C..1C33 ; N # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T +1C34..1C35 ; N # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG +1C36..1C37 ; N # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA +1C3B..1C3F ; N # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK +1C40..1C49 ; N # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE +1C4D..1C4F ; N # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA +1C50..1C59 ; N # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE +1C5A..1C77 ; N # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH +1C78..1C7D ; N # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD +1C7E..1C7F ; N # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD +1C80..1C88 ; N # L& [9] CYRILLIC SMALL LETTER ROUNDED VE..CYRILLIC SMALL LETTER UNBLENDED UK +1C90..1CBA ; N # L& [43] GEORGIAN MTAVRULI CAPITAL LETTER AN..GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBD..1CBF ; N # L& [3] GEORGIAN MTAVRULI CAPITAL LETTER AEN..GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +1CC0..1CC7 ; N # Po [8] SUNDANESE PUNCTUATION BINDU SURYA..SUNDANESE PUNCTUATION BINDU BA SATANGA +1CD0..1CD2 ; N # Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA +1CD3 ; N # Po VEDIC SIGN NIHSHVASA +1CD4..1CE0 ; N # Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA +1CE1 ; N # Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA +1CE2..1CE8 ; N # Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL +1CE9..1CEC ; N # Lo [4] VEDIC SIGN ANUSVARA ANTARGOMUKHA..VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL +1CED ; N # Mn VEDIC SIGN TIRYAK +1CEE..1CF3 ; N # Lo [6] VEDIC SIGN HEXIFORM LONG ANUSVARA..VEDIC SIGN ROTATED ARDHAVISARGA +1CF4 ; N # Mn VEDIC TONE CANDRA ABOVE +1CF5..1CF6 ; N # Lo [2] VEDIC SIGN JIHVAMULIYA..VEDIC SIGN UPADHMANIYA +1CF7 ; N # Mc VEDIC SIGN ATIKRAMA +1CF8..1CF9 ; N # Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE +1CFA ; N # Lo VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +1D00..1D2B ; N # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL +1D2C..1D6A ; N # Lm [63] MODIFIER LETTER CAPITAL A..GREEK SUBSCRIPT SMALL LETTER CHI +1D6B..1D77 ; N # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G +1D78 ; N # Lm MODIFIER LETTER CYRILLIC EN +1D79..1D9A ; N # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK +1D9B..1DBF ; N # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA +1DC0..1DFF ; N # Mn [64] COMBINING DOTTED GRAVE ACCENT..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW +1E00..1F15 ; N # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA +1F18..1F1D ; N # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F20..1F45 ; N # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA +1F48..1F4D ; N # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50..1F57 ; N # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F59 ; N # L& GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B ; N # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D ; N # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F..1F7D ; N # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA +1F80..1FB4 ; N # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6..1FBC ; N # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBD ; N # Sk GREEK KORONIS +1FBE ; N # L& GREEK PROSGEGRAMMENI +1FBF..1FC1 ; N # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI +1FC2..1FC4 ; N # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6..1FCC ; N # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCD..1FCF ; N # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI +1FD0..1FD3 ; N # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6..1FDB ; N # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA +1FDD..1FDF ; N # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI +1FE0..1FEC ; N # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA +1FED..1FEF ; N # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA +1FF2..1FF4 ; N # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6..1FFC ; N # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFD..1FFE ; N # Sk [2] GREEK OXIA..GREEK DASIA +2000..200A ; N # Zs [11] EN QUAD..HAIR SPACE +200B..200F ; N # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK +2011..2012 ; N # Pd [2] NON-BREAKING HYPHEN..FIGURE DASH +2017 ; N # Po DOUBLE LOW LINE +201A ; N # Ps SINGLE LOW-9 QUOTATION MARK +201B ; N # Pi SINGLE HIGH-REVERSED-9 QUOTATION MARK +201E ; N # Ps DOUBLE LOW-9 QUOTATION MARK +201F ; N # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK +2023 ; N # Po TRIANGULAR BULLET +2028 ; N # Zl LINE SEPARATOR +2029 ; N # Zp PARAGRAPH SEPARATOR +202A..202E ; N # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE +202F ; N # Zs NARROW NO-BREAK SPACE +2031 ; N # Po PER TEN THOUSAND SIGN +2034 ; N # Po TRIPLE PRIME +2036..2038 ; N # Po [3] REVERSED DOUBLE PRIME..CARET +2039 ; N # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK +203A ; N # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +203C..203D ; N # Po [2] DOUBLE EXCLAMATION MARK..INTERROBANG +203F..2040 ; N # Pc [2] UNDERTIE..CHARACTER TIE +2041..2043 ; N # Po [3] CARET INSERTION POINT..HYPHEN BULLET +2044 ; N # Sm FRACTION SLASH +2045 ; N # Ps LEFT SQUARE BRACKET WITH QUILL +2046 ; N # Pe RIGHT SQUARE BRACKET WITH QUILL +2047..2051 ; N # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY +2052 ; N # Sm COMMERCIAL MINUS SIGN +2053 ; N # Po SWUNG DASH +2054 ; N # Pc INVERTED UNDERTIE +2055..205E ; N # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS +205F ; N # Zs MEDIUM MATHEMATICAL SPACE +2060..2064 ; N # Cf [5] WORD JOINER..INVISIBLE PLUS +2066..206F ; N # Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES +2070 ; N # No SUPERSCRIPT ZERO +2071 ; N # Lm SUPERSCRIPT LATIN SMALL LETTER I +2075..2079 ; N # No [5] SUPERSCRIPT FIVE..SUPERSCRIPT NINE +207A..207C ; N # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN +207D ; N # Ps SUPERSCRIPT LEFT PARENTHESIS +207E ; N # Pe SUPERSCRIPT RIGHT PARENTHESIS +2080 ; N # No SUBSCRIPT ZERO +2085..2089 ; N # No [5] SUBSCRIPT FIVE..SUBSCRIPT NINE +208A..208C ; N # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN +208D ; N # Ps SUBSCRIPT LEFT PARENTHESIS +208E ; N # Pe SUBSCRIPT RIGHT PARENTHESIS +2090..209C ; N # Lm [13] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER T +20A0..20A8 ; N # Sc [9] EURO-CURRENCY SIGN..RUPEE SIGN +20AA..20AB ; N # Sc [2] NEW SHEQEL SIGN..DONG SIGN +20AD..20C0 ; N # Sc [20] KIP SIGN..SOM SIGN +20D0..20DC ; N # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE +20DD..20E0 ; N # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH +20E1 ; N # Mn COMBINING LEFT RIGHT ARROW ABOVE +20E2..20E4 ; N # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE +20E5..20F0 ; N # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE +2100..2101 ; N # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT +2102 ; N # L& DOUBLE-STRUCK CAPITAL C +2104 ; N # So CENTRE LINE SYMBOL +2106 ; N # So CADA UNA +2107 ; N # L& EULER CONSTANT +2108 ; N # So SCRUPLE +210A..2112 ; N # L& [9] SCRIPT SMALL G..SCRIPT CAPITAL L +2114 ; N # So L B BAR SYMBOL +2115 ; N # L& DOUBLE-STRUCK CAPITAL N +2117 ; N # So SOUND RECORDING COPYRIGHT +2118 ; N # Sm SCRIPT CAPITAL P +2119..211D ; N # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R +211E..2120 ; N # So [3] PRESCRIPTION TAKE..SERVICE MARK +2123 ; N # So VERSICLE +2124 ; N # L& DOUBLE-STRUCK CAPITAL Z +2125 ; N # So OUNCE SIGN +2127 ; N # So INVERTED OHM SIGN +2128 ; N # L& BLACK-LETTER CAPITAL Z +2129 ; N # So TURNED GREEK SMALL LETTER IOTA +212A ; N # L& KELVIN SIGN +212C..212D ; N # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C +212E ; N # So ESTIMATED SYMBOL +212F..2134 ; N # L& [6] SCRIPT SMALL E..SCRIPT SMALL O +2135..2138 ; N # Lo [4] ALEF SYMBOL..DALET SYMBOL +2139 ; N # L& INFORMATION SOURCE +213A..213B ; N # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN +213C..213F ; N # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI +2140..2144 ; N # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y +2145..2149 ; N # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J +214A ; N # So PROPERTY LINE +214B ; N # Sm TURNED AMPERSAND +214C..214D ; N # So [2] PER SIGN..AKTIESELSKAB +214E ; N # L& TURNED SMALL F +214F ; N # So SYMBOL FOR SAMARITAN SOURCE +2150..2152 ; N # No [3] VULGAR FRACTION ONE SEVENTH..VULGAR FRACTION ONE TENTH +2155..215A ; N # No [6] VULGAR FRACTION ONE FIFTH..VULGAR FRACTION FIVE SIXTHS +215F ; N # No FRACTION NUMERATOR ONE +216C..216F ; N # Nl [4] ROMAN NUMERAL FIFTY..ROMAN NUMERAL ONE THOUSAND +217A..2182 ; N # Nl [9] SMALL ROMAN NUMERAL ELEVEN..ROMAN NUMERAL TEN THOUSAND +2183..2184 ; N # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C +2185..2188 ; N # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND +218A..218B ; N # So [2] TURNED DIGIT TWO..TURNED DIGIT THREE +219A..219B ; N # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE +219C..219F ; N # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW +21A0 ; N # Sm RIGHTWARDS TWO HEADED ARROW +21A1..21A2 ; N # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL +21A3 ; N # Sm RIGHTWARDS ARROW WITH TAIL +21A4..21A5 ; N # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR +21A6 ; N # Sm RIGHTWARDS ARROW FROM BAR +21A7..21AD ; N # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW +21AE ; N # Sm LEFT RIGHT ARROW WITH STROKE +21AF..21B7 ; N # So [9] DOWNWARDS ZIGZAG ARROW..CLOCKWISE TOP SEMICIRCLE ARROW +21BA..21CD ; N # So [20] ANTICLOCKWISE OPEN CIRCLE ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE +21CE..21CF ; N # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE +21D0..21D1 ; N # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW +21D3 ; N # So DOWNWARDS DOUBLE ARROW +21D5..21E6 ; N # So [18] UP DOWN DOUBLE ARROW..LEFTWARDS WHITE ARROW +21E8..21F3 ; N # So [12] RIGHTWARDS WHITE ARROW..UP DOWN WHITE ARROW +21F4..21FF ; N # Sm [12] RIGHT ARROW WITH SMALL CIRCLE..LEFT RIGHT OPEN-HEADED ARROW +2201 ; N # Sm COMPLEMENT +2204..2206 ; N # Sm [3] THERE DOES NOT EXIST..INCREMENT +2209..220A ; N # Sm [2] NOT AN ELEMENT OF..SMALL ELEMENT OF +220C..220E ; N # Sm [3] DOES NOT CONTAIN AS MEMBER..END OF PROOF +2210 ; N # Sm N-ARY COPRODUCT +2212..2214 ; N # Sm [3] MINUS SIGN..DOT PLUS +2216..2219 ; N # Sm [4] SET MINUS..BULLET OPERATOR +221B..221C ; N # Sm [2] CUBE ROOT..FOURTH ROOT +2221..2222 ; N # Sm [2] MEASURED ANGLE..SPHERICAL ANGLE +2224 ; N # Sm DOES NOT DIVIDE +2226 ; N # Sm NOT PARALLEL TO +222D ; N # Sm TRIPLE INTEGRAL +222F..2233 ; N # Sm [5] SURFACE INTEGRAL..ANTICLOCKWISE CONTOUR INTEGRAL +2238..223B ; N # Sm [4] DOT MINUS..HOMOTHETIC +223E..2247 ; N # Sm [10] INVERTED LAZY S..NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO +2249..224B ; N # Sm [3] NOT ALMOST EQUAL TO..TRIPLE TILDE +224D..2251 ; N # Sm [5] EQUIVALENT TO..GEOMETRICALLY EQUAL TO +2253..225F ; N # Sm [13] IMAGE OF OR APPROXIMATELY EQUAL TO..QUESTIONED EQUAL TO +2262..2263 ; N # Sm [2] NOT IDENTICAL TO..STRICTLY EQUIVALENT TO +2268..2269 ; N # Sm [2] LESS-THAN BUT NOT EQUAL TO..GREATER-THAN BUT NOT EQUAL TO +226C..226D ; N # Sm [2] BETWEEN..NOT EQUIVALENT TO +2270..2281 ; N # Sm [18] NEITHER LESS-THAN NOR EQUAL TO..DOES NOT SUCCEED +2284..2285 ; N # Sm [2] NOT A SUBSET OF..NOT A SUPERSET OF +2288..2294 ; N # Sm [13] NEITHER A SUBSET OF NOR EQUAL TO..SQUARE CUP +2296..2298 ; N # Sm [3] CIRCLED MINUS..CIRCLED DIVISION SLASH +229A..22A4 ; N # Sm [11] CIRCLED RING OPERATOR..DOWN TACK +22A6..22BE ; N # Sm [25] ASSERTION..RIGHT ANGLE WITH ARC +22C0..22FF ; N # Sm [64] N-ARY LOGICAL AND..Z NOTATION BAG MEMBERSHIP +2300..2307 ; N # So [8] DIAMETER SIGN..WAVY LINE +2308 ; N # Ps LEFT CEILING +2309 ; N # Pe RIGHT CEILING +230A ; N # Ps LEFT FLOOR +230B ; N # Pe RIGHT FLOOR +230C..2311 ; N # So [6] BOTTOM RIGHT CROP..SQUARE LOZENGE +2313..2319 ; N # So [7] SEGMENT..TURNED NOT SIGN +231C..231F ; N # So [4] TOP LEFT CORNER..BOTTOM RIGHT CORNER +2320..2321 ; N # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL +2322..2328 ; N # So [7] FROWN..KEYBOARD +232B..237B ; N # So [81] ERASE TO THE LEFT..NOT CHECK MARK +237C ; N # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW +237D..239A ; N # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL +239B..23B3 ; N # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM +23B4..23DB ; N # So [40] TOP SQUARE BRACKET..FUSE +23DC..23E1 ; N # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET +23E2..23E8 ; N # So [7] WHITE TRAPEZIUM..DECIMAL EXPONENT SYMBOL +23ED..23EF ; N # So [3] BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR..BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR +23F1..23F2 ; N # So [2] STOPWATCH..TIMER CLOCK +23F4..2426 ; N # So [51] BLACK MEDIUM LEFT-POINTING TRIANGLE..SYMBOL FOR SUBSTITUTE FORM TWO +2440..244A ; N # So [11] OCR HOOK..OCR DOUBLE BACKSLASH +24EA ; N # No CIRCLED DIGIT ZERO +254C..254F ; N # So [4] BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL..BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL +2574..257F ; N # So [12] BOX DRAWINGS LIGHT LEFT..BOX DRAWINGS HEAVY UP AND LIGHT DOWN +2590..2591 ; N # So [2] RIGHT HALF BLOCK..LIGHT SHADE +2596..259F ; N # So [10] QUADRANT LOWER LEFT..QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT +25A2 ; N # So WHITE SQUARE WITH ROUNDED CORNERS +25AA..25B1 ; N # So [8] BLACK SMALL SQUARE..WHITE PARALLELOGRAM +25B4..25B5 ; N # So [2] BLACK UP-POINTING SMALL TRIANGLE..WHITE UP-POINTING SMALL TRIANGLE +25B8..25BB ; N # So [4] BLACK RIGHT-POINTING SMALL TRIANGLE..WHITE RIGHT-POINTING POINTER +25BE..25BF ; N # So [2] BLACK DOWN-POINTING SMALL TRIANGLE..WHITE DOWN-POINTING SMALL TRIANGLE +25C2..25C5 ; N # So [4] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE LEFT-POINTING POINTER +25C9..25CA ; N # So [2] FISHEYE..LOZENGE +25CC..25CD ; N # So [2] DOTTED CIRCLE..CIRCLE WITH VERTICAL FILL +25D2..25E1 ; N # So [16] CIRCLE WITH LOWER HALF BLACK..LOWER HALF CIRCLE +25E6..25EE ; N # So [9] WHITE BULLET..UP-POINTING TRIANGLE WITH RIGHT HALF BLACK +25F0..25F7 ; N # So [8] WHITE SQUARE WITH UPPER LEFT QUADRANT..WHITE CIRCLE WITH UPPER RIGHT QUADRANT +25F8..25FC ; N # Sm [5] UPPER LEFT TRIANGLE..BLACK MEDIUM SQUARE +25FF ; N # Sm LOWER RIGHT TRIANGLE +2600..2604 ; N # So [5] BLACK SUN WITH RAYS..COMET +2607..2608 ; N # So [2] LIGHTNING..THUNDERSTORM +260A..260D ; N # So [4] ASCENDING NODE..OPPOSITION +2610..2613 ; N # So [4] BALLOT BOX..SALTIRE +2616..261B ; N # So [6] WHITE SHOGI PIECE..BLACK RIGHT POINTING INDEX +261D ; N # So WHITE UP POINTING INDEX +261F..263F ; N # So [33] WHITE DOWN POINTING INDEX..MERCURY +2641 ; N # So EARTH +2643..2647 ; N # So [5] JUPITER..PLUTO +2654..265F ; N # So [12] WHITE CHESS KING..BLACK CHESS PAWN +2662 ; N # So WHITE DIAMOND SUIT +2666 ; N # So BLACK DIAMOND SUIT +266B ; N # So BEAMED EIGHTH NOTES +266E ; N # So MUSIC NATURAL SIGN +2670..267E ; N # So [15] WEST SYRIAC CROSS..PERMANENT PAPER SIGN +2680..2692 ; N # So [19] DIE FACE-1..HAMMER AND PICK +2694..269D ; N # So [10] CROSSED SWORDS..OUTLINED WHITE STAR +26A0 ; N # So WARNING SIGN +26A2..26A9 ; N # So [8] DOUBLED FEMALE SIGN..HORIZONTAL MALE WITH STROKE SIGN +26AC..26BC ; N # So [17] MEDIUM SMALL WHITE CIRCLE..SESQUIQUADRATE +26C0..26C3 ; N # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING +26E2 ; N # So ASTRONOMICAL SYMBOL FOR URANUS +26E4..26E7 ; N # So [4] PENTAGRAM..INVERTED PENTAGRAM +2700..2704 ; N # So [5] BLACK SAFETY SCISSORS..WHITE SCISSORS +2706..2709 ; N # So [4] TELEPHONE LOCATION SIGN..ENVELOPE +270C..2727 ; N # So [28] VICTORY HAND..WHITE FOUR POINTED STAR +2729..273C ; N # So [20] STRESS OUTLINED WHITE STAR..OPEN CENTRE TEARDROP-SPOKED ASTERISK +273E..274B ; N # So [14] SIX PETALLED BLACK AND WHITE FLORETTE..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK +274D ; N # So SHADOWED WHITE CIRCLE +274F..2752 ; N # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE +2756 ; N # So BLACK DIAMOND MINUS WHITE X +2758..2767 ; N # So [16] LIGHT VERTICAL BAR..ROTATED FLORAL HEART BULLET +2768 ; N # Ps MEDIUM LEFT PARENTHESIS ORNAMENT +2769 ; N # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT +276A ; N # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT +276B ; N # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT +276C ; N # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT +276D ; N # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT +276E ; N # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT +276F ; N # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT +2770 ; N # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT +2771 ; N # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT +2772 ; N # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT +2773 ; N # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT +2774 ; N # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT +2775 ; N # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT +2780..2793 ; N # No [20] DINGBAT CIRCLED SANS-SERIF DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN +2794 ; N # So HEAVY WIDE-HEADED RIGHTWARDS ARROW +2798..27AF ; N # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW +27B1..27BE ; N # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW +27C0..27C4 ; N # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET +27C5 ; N # Ps LEFT S-SHAPED BAG DELIMITER +27C6 ; N # Pe RIGHT S-SHAPED BAG DELIMITER +27C7..27E5 ; N # Sm [31] OR WITH DOT INSIDE..WHITE SQUARE WITH RIGHTWARDS TICK +27EE ; N # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS +27EF ; N # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS +27F0..27FF ; N # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW +2800..28FF ; N # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 +2900..2982 ; N # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON +2983 ; N # Ps LEFT WHITE CURLY BRACKET +2984 ; N # Pe RIGHT WHITE CURLY BRACKET +2987 ; N # Ps Z NOTATION LEFT IMAGE BRACKET +2988 ; N # Pe Z NOTATION RIGHT IMAGE BRACKET +2989 ; N # Ps Z NOTATION LEFT BINDING BRACKET +298A ; N # Pe Z NOTATION RIGHT BINDING BRACKET +298B ; N # Ps LEFT SQUARE BRACKET WITH UNDERBAR +298C ; N # Pe RIGHT SQUARE BRACKET WITH UNDERBAR +298D ; N # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER +298E ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +298F ; N # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER +2990 ; N # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER +2991 ; N # Ps LEFT ANGLE BRACKET WITH DOT +2992 ; N # Pe RIGHT ANGLE BRACKET WITH DOT +2993 ; N # Ps LEFT ARC LESS-THAN BRACKET +2994 ; N # Pe RIGHT ARC GREATER-THAN BRACKET +2995 ; N # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET +2996 ; N # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET +2997 ; N # Ps LEFT BLACK TORTOISE SHELL BRACKET +2998 ; N # Pe RIGHT BLACK TORTOISE SHELL BRACKET +2999..29D7 ; N # Sm [63] DOTTED FENCE..BLACK HOURGLASS +29D8 ; N # Ps LEFT WIGGLY FENCE +29D9 ; N # Pe RIGHT WIGGLY FENCE +29DA ; N # Ps LEFT DOUBLE WIGGLY FENCE +29DB ; N # Pe RIGHT DOUBLE WIGGLY FENCE +29DC..29FB ; N # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS +29FC ; N # Ps LEFT-POINTING CURVED ANGLE BRACKET +29FD ; N # Pe RIGHT-POINTING CURVED ANGLE BRACKET +29FE..2AFF ; N # Sm [258] TINY..N-ARY WHITE VERTICAL BAR +2B00..2B1A ; N # So [27] NORTH EAST WHITE ARROW..DOTTED SQUARE +2B1D..2B2F ; N # So [19] BLACK VERY SMALL SQUARE..WHITE VERTICAL ELLIPSE +2B30..2B44 ; N # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET +2B45..2B46 ; N # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW +2B47..2B4C ; N # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR +2B4D..2B4F ; N # So [3] DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW..SHORT BACKSLANTED SOUTH ARROW +2B51..2B54 ; N # So [4] BLACK SMALL STAR..WHITE RIGHT-POINTING PENTAGON +2B5A..2B73 ; N # So [26] SLANTED NORTH ARROW WITH HOOKED HEAD..DOWNWARDS TRIANGLE-HEADED ARROW TO BAR +2B76..2B95 ; N # So [32] NORTH WEST TRIANGLE-HEADED ARROW TO BAR..RIGHTWARDS BLACK ARROW +2B97..2BFF ; N # So [105] SYMBOL FOR TYPE A ELECTRONICS..HELLSCHREIBER PAUSE SYMBOL +2C00..2C7B ; N # L& [124] GLAGOLITIC CAPITAL LETTER AZU..LATIN LETTER SMALL CAPITAL TURNED E +2C7C..2C7D ; N # Lm [2] LATIN SUBSCRIPT SMALL LETTER J..MODIFIER LETTER CAPITAL V +2C7E..2CE4 ; N # L& [103] LATIN CAPITAL LETTER S WITH SWASH TAIL..COPTIC SYMBOL KAI +2CE5..2CEA ; N # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA +2CEB..2CEE ; N # L& [4] COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI..COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA +2CEF..2CF1 ; N # Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS +2CF2..2CF3 ; N # L& [2] COPTIC CAPITAL LETTER BOHAIRIC KHEI..COPTIC SMALL LETTER BOHAIRIC KHEI +2CF9..2CFC ; N # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER +2CFD ; N # No COPTIC FRACTION ONE HALF +2CFE..2CFF ; N # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER +2D00..2D25 ; N # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE +2D27 ; N # L& GEORGIAN SMALL LETTER YN +2D2D ; N # L& GEORGIAN SMALL LETTER AEN +2D30..2D67 ; N # Lo [56] TIFINAGH LETTER YA..TIFINAGH LETTER YO +2D6F ; N # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK +2D70 ; N # Po TIFINAGH SEPARATOR MARK +2D7F ; N # Mn TIFINAGH CONSONANT JOINER +2D80..2D96 ; N # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE +2DA0..2DA6 ; N # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO +2DA8..2DAE ; N # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO +2DB0..2DB6 ; N # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO +2DB8..2DBE ; N # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO +2DC0..2DC6 ; N # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO +2DC8..2DCE ; N # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO +2DD0..2DD6 ; N # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO +2DD8..2DDE ; N # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO +2DE0..2DFF ; N # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS +2E00..2E01 ; N # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER +2E02 ; N # Pi LEFT SUBSTITUTION BRACKET +2E03 ; N # Pf RIGHT SUBSTITUTION BRACKET +2E04 ; N # Pi LEFT DOTTED SUBSTITUTION BRACKET +2E05 ; N # Pf RIGHT DOTTED SUBSTITUTION BRACKET +2E06..2E08 ; N # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER +2E09 ; N # Pi LEFT TRANSPOSITION BRACKET +2E0A ; N # Pf RIGHT TRANSPOSITION BRACKET +2E0B ; N # Po RAISED SQUARE +2E0C ; N # Pi LEFT RAISED OMISSION BRACKET +2E0D ; N # Pf RIGHT RAISED OMISSION BRACKET +2E0E..2E16 ; N # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE +2E17 ; N # Pd DOUBLE OBLIQUE HYPHEN +2E18..2E19 ; N # Po [2] INVERTED INTERROBANG..PALM BRANCH +2E1A ; N # Pd HYPHEN WITH DIAERESIS +2E1B ; N # Po TILDE WITH RING ABOVE +2E1C ; N # Pi LEFT LOW PARAPHRASE BRACKET +2E1D ; N # Pf RIGHT LOW PARAPHRASE BRACKET +2E1E..2E1F ; N # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW +2E20 ; N # Pi LEFT VERTICAL BAR WITH QUILL +2E21 ; N # Pf RIGHT VERTICAL BAR WITH QUILL +2E22 ; N # Ps TOP LEFT HALF BRACKET +2E23 ; N # Pe TOP RIGHT HALF BRACKET +2E24 ; N # Ps BOTTOM LEFT HALF BRACKET +2E25 ; N # Pe BOTTOM RIGHT HALF BRACKET +2E26 ; N # Ps LEFT SIDEWAYS U BRACKET +2E27 ; N # Pe RIGHT SIDEWAYS U BRACKET +2E28 ; N # Ps LEFT DOUBLE PARENTHESIS +2E29 ; N # Pe RIGHT DOUBLE PARENTHESIS +2E2A..2E2E ; N # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK +2E2F ; N # Lm VERTICAL TILDE +2E30..2E39 ; N # Po [10] RING POINT..TOP HALF SECTION SIGN +2E3A..2E3B ; N # Pd [2] TWO-EM DASH..THREE-EM DASH +2E3C..2E3F ; N # Po [4] STENOGRAPHIC FULL STOP..CAPITULUM +2E40 ; N # Pd DOUBLE HYPHEN +2E41 ; N # Po REVERSED COMMA +2E42 ; N # Ps DOUBLE LOW-REVERSED-9 QUOTATION MARK +2E43..2E4F ; N # Po [13] DASH WITH LEFT UPTURN..CORNISH VERSE DIVIDER +2E50..2E51 ; N # So [2] CROSS PATTY WITH RIGHT CROSSBAR..CROSS PATTY WITH LEFT CROSSBAR +2E52..2E54 ; N # Po [3] TIRONIAN SIGN CAPITAL ET..MEDIEVAL QUESTION MARK +2E55 ; N # Ps LEFT SQUARE BRACKET WITH STROKE +2E56 ; N # Pe RIGHT SQUARE BRACKET WITH STROKE +2E57 ; N # Ps LEFT SQUARE BRACKET WITH DOUBLE STROKE +2E58 ; N # Pe RIGHT SQUARE BRACKET WITH DOUBLE STROKE +2E59 ; N # Ps TOP HALF LEFT PARENTHESIS +2E5A ; N # Pe TOP HALF RIGHT PARENTHESIS +2E5B ; N # Ps BOTTOM HALF LEFT PARENTHESIS +2E5C ; N # Pe BOTTOM HALF RIGHT PARENTHESIS +2E5D ; N # Pd OBLIQUE HYPHEN +303F ; N # So IDEOGRAPHIC HALF FILL SPACE +4DC0..4DFF ; N # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION +A4D0..A4F7 ; N # Lo [40] LISU LETTER BA..LISU LETTER OE +A4F8..A4FD ; N # Lm [6] LISU LETTER TONE MYA TI..LISU LETTER TONE MYA JEU +A4FE..A4FF ; N # Po [2] LISU PUNCTUATION COMMA..LISU PUNCTUATION FULL STOP +A500..A60B ; N # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG +A60C ; N # Lm VAI SYLLABLE LENGTHENER +A60D..A60F ; N # Po [3] VAI COMMA..VAI QUESTION MARK +A610..A61F ; N # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG +A620..A629 ; N # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE +A62A..A62B ; N # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO +A640..A66D ; N # L& [46] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O +A66E ; N # Lo CYRILLIC LETTER MULTIOCULAR O +A66F ; N # Mn COMBINING CYRILLIC VZMET +A670..A672 ; N # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN +A673 ; N # Po SLAVONIC ASTERISK +A674..A67D ; N # Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK +A67E ; N # Po CYRILLIC KAVYKA +A67F ; N # Lm CYRILLIC PAYEROK +A680..A69B ; N # L& [28] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER CROSSED O +A69C..A69D ; N # Lm [2] MODIFIER LETTER CYRILLIC HARD SIGN..MODIFIER LETTER CYRILLIC SOFT SIGN +A69E..A69F ; N # Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E +A6A0..A6E5 ; N # Lo [70] BAMUM LETTER A..BAMUM LETTER KI +A6E6..A6EF ; N # Nl [10] BAMUM LETTER MO..BAMUM LETTER KOGHOM +A6F0..A6F1 ; N # Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS +A6F2..A6F7 ; N # Po [6] BAMUM NJAEMLI..BAMUM QUESTION MARK +A700..A716 ; N # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR +A717..A71F ; N # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK +A720..A721 ; N # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE +A722..A76F ; N # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON +A770 ; N # Lm MODIFIER LETTER US +A771..A787 ; N # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T +A788 ; N # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT +A789..A78A ; N # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN +A78B..A78E ; N # L& [4] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT +A78F ; N # Lo LATIN LETTER SINOLOGICAL DOT +A790..A7CA ; N # L& [59] LATIN CAPITAL LETTER N WITH DESCENDER..LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7D0..A7D1 ; N # L& [2] LATIN CAPITAL LETTER CLOSED INSULAR G..LATIN SMALL LETTER CLOSED INSULAR G +A7D3 ; N # L& LATIN SMALL LETTER DOUBLE THORN +A7D5..A7D9 ; N # L& [5] LATIN SMALL LETTER DOUBLE WYNN..LATIN SMALL LETTER SIGMOID S +A7F2..A7F4 ; N # Lm [3] MODIFIER LETTER CAPITAL C..MODIFIER LETTER CAPITAL Q +A7F5..A7F6 ; N # L& [2] LATIN CAPITAL LETTER REVERSED HALF H..LATIN SMALL LETTER REVERSED HALF H +A7F7 ; N # Lo LATIN EPIGRAPHIC LETTER SIDEWAYS I +A7F8..A7F9 ; N # Lm [2] MODIFIER LETTER CAPITAL H WITH STROKE..MODIFIER LETTER SMALL LIGATURE OE +A7FA ; N # L& LATIN LETTER SMALL CAPITAL TURNED M +A7FB..A801 ; N # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I +A802 ; N # Mn SYLOTI NAGRI SIGN DVISVARA +A803..A805 ; N # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O +A806 ; N # Mn SYLOTI NAGRI SIGN HASANTA +A807..A80A ; N # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO +A80B ; N # Mn SYLOTI NAGRI SIGN ANUSVARA +A80C..A822 ; N # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO +A823..A824 ; N # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I +A825..A826 ; N # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E +A827 ; N # Mc SYLOTI NAGRI VOWEL SIGN OO +A828..A82B ; N # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 +A82C ; N # Mn SYLOTI NAGRI SIGN ALTERNATE HASANTA +A830..A835 ; N # No [6] NORTH INDIC FRACTION ONE QUARTER..NORTH INDIC FRACTION THREE SIXTEENTHS +A836..A837 ; N # So [2] NORTH INDIC QUARTER MARK..NORTH INDIC PLACEHOLDER MARK +A838 ; N # Sc NORTH INDIC RUPEE MARK +A839 ; N # So NORTH INDIC QUANTITY MARK +A840..A873 ; N # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU +A874..A877 ; N # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD +A880..A881 ; N # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA +A882..A8B3 ; N # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA +A8B4..A8C3 ; N # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU +A8C4..A8C5 ; N # Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU +A8CE..A8CF ; N # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA +A8D0..A8D9 ; N # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE +A8E0..A8F1 ; N # Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA +A8F2..A8F7 ; N # Lo [6] DEVANAGARI SIGN SPACING CANDRABINDU..DEVANAGARI SIGN CANDRABINDU AVAGRAHA +A8F8..A8FA ; N # Po [3] DEVANAGARI SIGN PUSHPIKA..DEVANAGARI CARET +A8FB ; N # Lo DEVANAGARI HEADSTROKE +A8FC ; N # Po DEVANAGARI SIGN SIDDHAM +A8FD..A8FE ; N # Lo [2] DEVANAGARI JAIN OM..DEVANAGARI LETTER AY +A8FF ; N # Mn DEVANAGARI VOWEL SIGN AY +A900..A909 ; N # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE +A90A..A925 ; N # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO +A926..A92D ; N # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU +A92E..A92F ; N # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA +A930..A946 ; N # Lo [23] REJANG LETTER KA..REJANG LETTER A +A947..A951 ; N # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R +A952..A953 ; N # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA +A95F ; N # Po REJANG SECTION MARK +A980..A982 ; N # Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR +A983 ; N # Mc JAVANESE SIGN WIGNYAN +A984..A9B2 ; N # Lo [47] JAVANESE LETTER A..JAVANESE LETTER HA +A9B3 ; N # Mn JAVANESE SIGN CECAK TELU +A9B4..A9B5 ; N # Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG +A9B6..A9B9 ; N # Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT +A9BA..A9BB ; N # Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE +A9BC..A9BD ; N # Mn [2] JAVANESE VOWEL SIGN PEPET..JAVANESE CONSONANT SIGN KERET +A9BE..A9C0 ; N # Mc [3] JAVANESE CONSONANT SIGN PENGKAL..JAVANESE PANGKON +A9C1..A9CD ; N # Po [13] JAVANESE LEFT RERENGGAN..JAVANESE TURNED PADA PISELEH +A9CF ; N # Lm JAVANESE PANGRANGKEP +A9D0..A9D9 ; N # Nd [10] JAVANESE DIGIT ZERO..JAVANESE DIGIT NINE +A9DE..A9DF ; N # Po [2] JAVANESE PADA TIRTA TUMETES..JAVANESE PADA ISEN-ISEN +A9E0..A9E4 ; N # Lo [5] MYANMAR LETTER SHAN GHA..MYANMAR LETTER SHAN BHA +A9E5 ; N # Mn MYANMAR SIGN SHAN SAW +A9E6 ; N # Lm MYANMAR MODIFIER LETTER SHAN REDUPLICATION +A9E7..A9EF ; N # Lo [9] MYANMAR LETTER TAI LAING NYA..MYANMAR LETTER TAI LAING NNA +A9F0..A9F9 ; N # Nd [10] MYANMAR TAI LAING DIGIT ZERO..MYANMAR TAI LAING DIGIT NINE +A9FA..A9FE ; N # Lo [5] MYANMAR LETTER TAI LAING LLA..MYANMAR LETTER TAI LAING BHA +AA00..AA28 ; N # Lo [41] CHAM LETTER A..CHAM LETTER HA +AA29..AA2E ; N # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE +AA2F..AA30 ; N # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI +AA31..AA32 ; N # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE +AA33..AA34 ; N # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA +AA35..AA36 ; N # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA +AA40..AA42 ; N # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG +AA43 ; N # Mn CHAM CONSONANT SIGN FINAL NG +AA44..AA4B ; N # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS +AA4C ; N # Mn CHAM CONSONANT SIGN FINAL M +AA4D ; N # Mc CHAM CONSONANT SIGN FINAL H +AA50..AA59 ; N # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE +AA5C..AA5F ; N # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA +AA60..AA6F ; N # Lo [16] MYANMAR LETTER KHAMTI GA..MYANMAR LETTER KHAMTI FA +AA70 ; N # Lm MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION +AA71..AA76 ; N # Lo [6] MYANMAR LETTER KHAMTI XA..MYANMAR LOGOGRAM KHAMTI HM +AA77..AA79 ; N # So [3] MYANMAR SYMBOL AITON EXCLAMATION..MYANMAR SYMBOL AITON TWO +AA7A ; N # Lo MYANMAR LETTER AITON RA +AA7B ; N # Mc MYANMAR SIGN PAO KAREN TONE +AA7C ; N # Mn MYANMAR SIGN TAI LAING TONE-2 +AA7D ; N # Mc MYANMAR SIGN TAI LAING TONE-5 +AA7E..AAAF ; N # Lo [50] MYANMAR LETTER SHWE PALAUNG CHA..TAI VIET LETTER HIGH O +AAB0 ; N # Mn TAI VIET MAI KANG +AAB1 ; N # Lo TAI VIET VOWEL AA +AAB2..AAB4 ; N # Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U +AAB5..AAB6 ; N # Lo [2] TAI VIET VOWEL E..TAI VIET VOWEL O +AAB7..AAB8 ; N # Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA +AAB9..AABD ; N # Lo [5] TAI VIET VOWEL UEA..TAI VIET VOWEL AN +AABE..AABF ; N # Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK +AAC0 ; N # Lo TAI VIET TONE MAI NUENG +AAC1 ; N # Mn TAI VIET TONE MAI THO +AAC2 ; N # Lo TAI VIET TONE MAI SONG +AADB..AADC ; N # Lo [2] TAI VIET SYMBOL KON..TAI VIET SYMBOL NUENG +AADD ; N # Lm TAI VIET SYMBOL SAM +AADE..AADF ; N # Po [2] TAI VIET SYMBOL HO HOI..TAI VIET SYMBOL KOI KOI +AAE0..AAEA ; N # Lo [11] MEETEI MAYEK LETTER E..MEETEI MAYEK LETTER SSA +AAEB ; N # Mc MEETEI MAYEK VOWEL SIGN II +AAEC..AAED ; N # Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI +AAEE..AAEF ; N # Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU +AAF0..AAF1 ; N # Po [2] MEETEI MAYEK CHEIKHAN..MEETEI MAYEK AHANG KHUDAM +AAF2 ; N # Lo MEETEI MAYEK ANJI +AAF3..AAF4 ; N # Lm [2] MEETEI MAYEK SYLLABLE REPETITION MARK..MEETEI MAYEK WORD REPETITION MARK +AAF5 ; N # Mc MEETEI MAYEK VOWEL SIGN VISARGA +AAF6 ; N # Mn MEETEI MAYEK VIRAMA +AB01..AB06 ; N # Lo [6] ETHIOPIC SYLLABLE TTHU..ETHIOPIC SYLLABLE TTHO +AB09..AB0E ; N # Lo [6] ETHIOPIC SYLLABLE DDHU..ETHIOPIC SYLLABLE DDHO +AB11..AB16 ; N # Lo [6] ETHIOPIC SYLLABLE DZU..ETHIOPIC SYLLABLE DZO +AB20..AB26 ; N # Lo [7] ETHIOPIC SYLLABLE CCHHA..ETHIOPIC SYLLABLE CCHHO +AB28..AB2E ; N # Lo [7] ETHIOPIC SYLLABLE BBA..ETHIOPIC SYLLABLE BBO +AB30..AB5A ; N # L& [43] LATIN SMALL LETTER BARRED ALPHA..LATIN SMALL LETTER Y WITH SHORT RIGHT LEG +AB5B ; N # Sk MODIFIER BREVE WITH INVERTED BREVE +AB5C..AB5F ; N # Lm [4] MODIFIER LETTER SMALL HENG..MODIFIER LETTER SMALL U WITH LEFT HOOK +AB60..AB68 ; N # L& [9] LATIN SMALL LETTER SAKHA YAT..LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; N # Lm MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; N # Sk [2] MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB70..ABBF ; N # L& [80] CHEROKEE SMALL LETTER A..CHEROKEE SMALL LETTER YA +ABC0..ABE2 ; N # Lo [35] MEETEI MAYEK LETTER KOK..MEETEI MAYEK LETTER I LONSUM +ABE3..ABE4 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP +ABE5 ; N # Mn MEETEI MAYEK VOWEL SIGN ANAP +ABE6..ABE7 ; N # Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP +ABE8 ; N # Mn MEETEI MAYEK VOWEL SIGN UNAP +ABE9..ABEA ; N # Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG +ABEB ; N # Po MEETEI MAYEK CHEIKHEI +ABEC ; N # Mc MEETEI MAYEK LUM IYEK +ABED ; N # Mn MEETEI MAYEK APUN IYEK +ABF0..ABF9 ; N # Nd [10] MEETEI MAYEK DIGIT ZERO..MEETEI MAYEK DIGIT NINE +D7B0..D7C6 ; N # Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E +D7CB..D7FB ; N # Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH +FB00..FB06 ; N # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST +FB13..FB17 ; N # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH +FB1D ; N # Lo HEBREW LETTER YOD WITH HIRIQ +FB1E ; N # Mn HEBREW POINT JUDEO-SPANISH VARIKA +FB1F..FB28 ; N # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV +FB29 ; N # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN +FB2A..FB36 ; N # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH +FB38..FB3C ; N # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH +FB3E ; N # Lo HEBREW LETTER MEM WITH DAGESH +FB40..FB41 ; N # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH +FB43..FB44 ; N # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH +FB46..FBB1 ; N # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM +FBB2..FBC2 ; N # Sk [17] ARABIC SYMBOL DOT ABOVE..ARABIC SYMBOL WASLA ABOVE +FBD3..FD3D ; N # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM +FD3E ; N # Pe ORNATE LEFT PARENTHESIS +FD3F ; N # Ps ORNATE RIGHT PARENTHESIS +FD40..FD4F ; N # So [16] ARABIC LIGATURE RAHIMAHU ALLAAH..ARABIC LIGATURE RAHIMAHUM ALLAAH +FD50..FD8F ; N # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM +FD92..FDC7 ; N # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM +FDCF ; N # So ARABIC LIGATURE SALAAMUHU ALAYNAA +FDF0..FDFB ; N # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU +FDFC ; N # Sc RIAL SIGN +FDFD..FDFF ; N # So [3] ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM..ARABIC LIGATURE AZZA WA JALL +FE20..FE2F ; N # Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF +FE70..FE74 ; N # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM +FE76..FEFC ; N # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM +FEFF ; N # Cf ZERO WIDTH NO-BREAK SPACE +FFF9..FFFB ; N # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR +FFFC ; N # So OBJECT REPLACEMENT CHARACTER +10000..1000B ; N # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE +1000D..10026 ; N # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO +10028..1003A ; N # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO +1003C..1003D ; N # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE +1003F..1004D ; N # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO +10050..1005D ; N # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 +10080..100FA ; N # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 +10100..10102 ; N # Po [3] AEGEAN WORD SEPARATOR LINE..AEGEAN CHECK MARK +10107..10133 ; N # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND +10137..1013F ; N # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT +10140..10174 ; N # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS +10175..10178 ; N # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN +10179..10189 ; N # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN +1018A..1018B ; N # No [2] GREEK ZERO SIGN..GREEK ONE QUARTER SIGN +1018C..1018E ; N # So [3] GREEK SINUSOID SIGN..NOMISMA SIGN +10190..1019C ; N # So [13] ROMAN SEXTANS SIGN..ASCIA SYMBOL +101A0 ; N # So GREEK SYMBOL TAU RHO +101D0..101FC ; N # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND +101FD ; N # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE +10280..1029C ; N # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X +102A0..102D0 ; N # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 +102E0 ; N # Mn COPTIC EPACT THOUSANDS MARK +102E1..102FB ; N # No [27] COPTIC EPACT DIGIT ONE..COPTIC EPACT NUMBER NINE HUNDRED +10300..1031F ; N # Lo [32] OLD ITALIC LETTER A..OLD ITALIC LETTER ESS +10320..10323 ; N # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY +1032D..10340 ; N # Lo [20] OLD ITALIC LETTER YE..GOTHIC LETTER PAIRTHRA +10341 ; N # Nl GOTHIC LETTER NINETY +10342..10349 ; N # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL +1034A ; N # Nl GOTHIC LETTER NINE HUNDRED +10350..10375 ; N # Lo [38] OLD PERMIC LETTER AN..OLD PERMIC LETTER IA +10376..1037A ; N # Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII +10380..1039D ; N # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU +1039F ; N # Po UGARITIC WORD DIVIDER +103A0..103C3 ; N # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA +103C8..103CF ; N # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH +103D0 ; N # Po OLD PERSIAN WORD DIVIDER +103D1..103D5 ; N # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED +10400..1044F ; N # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW +10450..1049D ; N # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO +104A0..104A9 ; N # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE +104B0..104D3 ; N # L& [36] OSAGE CAPITAL LETTER A..OSAGE CAPITAL LETTER ZHA +104D8..104FB ; N # L& [36] OSAGE SMALL LETTER A..OSAGE SMALL LETTER ZHA +10500..10527 ; N # Lo [40] ELBASAN LETTER A..ELBASAN LETTER KHE +10530..10563 ; N # Lo [52] CAUCASIAN ALBANIAN LETTER ALT..CAUCASIAN ALBANIAN LETTER KIW +1056F ; N # Po CAUCASIAN ALBANIAN CITATION MARK +10570..1057A ; N # L& [11] VITHKUQI CAPITAL LETTER A..VITHKUQI CAPITAL LETTER GA +1057C..1058A ; N # L& [15] VITHKUQI CAPITAL LETTER HA..VITHKUQI CAPITAL LETTER RE +1058C..10592 ; N # L& [7] VITHKUQI CAPITAL LETTER SE..VITHKUQI CAPITAL LETTER XE +10594..10595 ; N # L& [2] VITHKUQI CAPITAL LETTER Y..VITHKUQI CAPITAL LETTER ZE +10597..105A1 ; N # L& [11] VITHKUQI SMALL LETTER A..VITHKUQI SMALL LETTER GA +105A3..105B1 ; N # L& [15] VITHKUQI SMALL LETTER HA..VITHKUQI SMALL LETTER RE +105B3..105B9 ; N # L& [7] VITHKUQI SMALL LETTER SE..VITHKUQI SMALL LETTER XE +105BB..105BC ; N # L& [2] VITHKUQI SMALL LETTER Y..VITHKUQI SMALL LETTER ZE +10600..10736 ; N # Lo [311] LINEAR A SIGN AB001..LINEAR A SIGN A664 +10740..10755 ; N # Lo [22] LINEAR A SIGN A701 A..LINEAR A SIGN A732 JE +10760..10767 ; N # Lo [8] LINEAR A SIGN A800..LINEAR A SIGN A807 +10780..10785 ; N # Lm [6] MODIFIER LETTER SMALL CAPITAL AA..MODIFIER LETTER SMALL B WITH HOOK +10787..107B0 ; N # Lm [42] MODIFIER LETTER SMALL DZ DIGRAPH..MODIFIER LETTER SMALL V WITH RIGHT HOOK +107B2..107BA ; N # Lm [9] MODIFIER LETTER SMALL CAPITAL Y..MODIFIER LETTER SMALL S WITH CURL +10800..10805 ; N # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA +10808 ; N # Lo CYPRIOT SYLLABLE JO +1080A..10835 ; N # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO +10837..10838 ; N # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE +1083C ; N # Lo CYPRIOT SYLLABLE ZA +1083F..10855 ; N # Lo [23] CYPRIOT SYLLABLE ZO..IMPERIAL ARAMAIC LETTER TAW +10857 ; N # Po IMPERIAL ARAMAIC SECTION SIGN +10858..1085F ; N # No [8] IMPERIAL ARAMAIC NUMBER ONE..IMPERIAL ARAMAIC NUMBER TEN THOUSAND +10860..10876 ; N # Lo [23] PALMYRENE LETTER ALEPH..PALMYRENE LETTER TAW +10877..10878 ; N # So [2] PALMYRENE LEFT-POINTING FLEURON..PALMYRENE RIGHT-POINTING FLEURON +10879..1087F ; N # No [7] PALMYRENE NUMBER ONE..PALMYRENE NUMBER TWENTY +10880..1089E ; N # Lo [31] NABATAEAN LETTER FINAL ALEPH..NABATAEAN LETTER TAW +108A7..108AF ; N # No [9] NABATAEAN NUMBER ONE..NABATAEAN NUMBER ONE HUNDRED +108E0..108F2 ; N # Lo [19] HATRAN LETTER ALEPH..HATRAN LETTER QOPH +108F4..108F5 ; N # Lo [2] HATRAN LETTER SHIN..HATRAN LETTER TAW +108FB..108FF ; N # No [5] HATRAN NUMBER ONE..HATRAN NUMBER ONE HUNDRED +10900..10915 ; N # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU +10916..1091B ; N # No [6] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER THREE +1091F ; N # Po PHOENICIAN WORD SEPARATOR +10920..10939 ; N # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C +1093F ; N # Po LYDIAN TRIANGULAR MARK +10980..109B7 ; N # Lo [56] MEROITIC HIEROGLYPHIC LETTER A..MEROITIC CURSIVE LETTER DA +109BC..109BD ; N # No [2] MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS..MEROITIC CURSIVE FRACTION ONE HALF +109BE..109BF ; N # Lo [2] MEROITIC CURSIVE LOGOGRAM RMT..MEROITIC CURSIVE LOGOGRAM IMN +109C0..109CF ; N # No [16] MEROITIC CURSIVE NUMBER ONE..MEROITIC CURSIVE NUMBER SEVENTY +109D2..109FF ; N # No [46] MEROITIC CURSIVE NUMBER ONE HUNDRED..MEROITIC CURSIVE FRACTION TEN TWELFTHS +10A00 ; N # Lo KHAROSHTHI LETTER A +10A01..10A03 ; N # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R +10A05..10A06 ; N # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O +10A0C..10A0F ; N # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA +10A10..10A13 ; N # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA +10A15..10A17 ; N # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA +10A19..10A35 ; N # Lo [29] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER VHA +10A38..10A3A ; N # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW +10A3F ; N # Mn KHAROSHTHI VIRAMA +10A40..10A48 ; N # No [9] KHAROSHTHI DIGIT ONE..KHAROSHTHI FRACTION ONE HALF +10A50..10A58 ; N # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES +10A60..10A7C ; N # Lo [29] OLD SOUTH ARABIAN LETTER HE..OLD SOUTH ARABIAN LETTER THETH +10A7D..10A7E ; N # No [2] OLD SOUTH ARABIAN NUMBER ONE..OLD SOUTH ARABIAN NUMBER FIFTY +10A7F ; N # Po OLD SOUTH ARABIAN NUMERIC INDICATOR +10A80..10A9C ; N # Lo [29] OLD NORTH ARABIAN LETTER HEH..OLD NORTH ARABIAN LETTER ZAH +10A9D..10A9F ; N # No [3] OLD NORTH ARABIAN NUMBER ONE..OLD NORTH ARABIAN NUMBER TWENTY +10AC0..10AC7 ; N # Lo [8] MANICHAEAN LETTER ALEPH..MANICHAEAN LETTER WAW +10AC8 ; N # So MANICHAEAN SIGN UD +10AC9..10AE4 ; N # Lo [28] MANICHAEAN LETTER ZAYIN..MANICHAEAN LETTER TAW +10AE5..10AE6 ; N # Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW +10AEB..10AEF ; N # No [5] MANICHAEAN NUMBER ONE..MANICHAEAN NUMBER ONE HUNDRED +10AF0..10AF6 ; N # Po [7] MANICHAEAN PUNCTUATION STAR..MANICHAEAN PUNCTUATION LINE FILLER +10B00..10B35 ; N # Lo [54] AVESTAN LETTER A..AVESTAN LETTER HE +10B39..10B3F ; N # Po [7] AVESTAN ABBREVIATION MARK..LARGE ONE RING OVER TWO RINGS PUNCTUATION +10B40..10B55 ; N # Lo [22] INSCRIPTIONAL PARTHIAN LETTER ALEPH..INSCRIPTIONAL PARTHIAN LETTER TAW +10B58..10B5F ; N # No [8] INSCRIPTIONAL PARTHIAN NUMBER ONE..INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND +10B60..10B72 ; N # Lo [19] INSCRIPTIONAL PAHLAVI LETTER ALEPH..INSCRIPTIONAL PAHLAVI LETTER TAW +10B78..10B7F ; N # No [8] INSCRIPTIONAL PAHLAVI NUMBER ONE..INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND +10B80..10B91 ; N # Lo [18] PSALTER PAHLAVI LETTER ALEPH..PSALTER PAHLAVI LETTER TAW +10B99..10B9C ; N # Po [4] PSALTER PAHLAVI SECTION MARK..PSALTER PAHLAVI FOUR DOTS WITH DOT +10BA9..10BAF ; N # No [7] PSALTER PAHLAVI NUMBER ONE..PSALTER PAHLAVI NUMBER ONE HUNDRED +10C00..10C48 ; N # Lo [73] OLD TURKIC LETTER ORKHON A..OLD TURKIC LETTER ORKHON BASH +10C80..10CB2 ; N # L& [51] OLD HUNGARIAN CAPITAL LETTER A..OLD HUNGARIAN CAPITAL LETTER US +10CC0..10CF2 ; N # L& [51] OLD HUNGARIAN SMALL LETTER A..OLD HUNGARIAN SMALL LETTER US +10CFA..10CFF ; N # No [6] OLD HUNGARIAN NUMBER ONE..OLD HUNGARIAN NUMBER ONE THOUSAND +10D00..10D23 ; N # Lo [36] HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA MARK NA KHONNA +10D24..10D27 ; N # Mn [4] HANIFI ROHINGYA SIGN HARBAHAY..HANIFI ROHINGYA SIGN TASSI +10D30..10D39 ; N # Nd [10] HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10E60..10E7E ; N # No [31] RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E80..10EA9 ; N # Lo [42] YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAB..10EAC ; N # Mn [2] YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; N # Pd YEZIDI HYPHENATION MARK +10EB0..10EB1 ; N # Lo [2] YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EFD..10EFF ; N # Mn [3] ARABIC SMALL LOW WORD SAKTA..ARABIC SMALL LOW WORD MADDA +10F00..10F1C ; N # Lo [29] OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; N # No [10] OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; N # Lo OLD SOGDIAN LIGATURE AYIN-DALETH +10F30..10F45 ; N # Lo [22] SOGDIAN LETTER ALEPH..SOGDIAN INDEPENDENT SHIN +10F46..10F50 ; N # Mn [11] SOGDIAN COMBINING DOT BELOW..SOGDIAN COMBINING STROKE BELOW +10F51..10F54 ; N # No [4] SOGDIAN NUMBER ONE..SOGDIAN NUMBER ONE HUNDRED +10F55..10F59 ; N # Po [5] SOGDIAN PUNCTUATION TWO VERTICAL BARS..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F70..10F81 ; N # Lo [18] OLD UYGHUR LETTER ALEPH..OLD UYGHUR LETTER LESH +10F82..10F85 ; N # Mn [4] OLD UYGHUR COMBINING DOT ABOVE..OLD UYGHUR COMBINING TWO DOTS BELOW +10F86..10F89 ; N # Po [4] OLD UYGHUR PUNCTUATION BAR..OLD UYGHUR PUNCTUATION FOUR DOTS +10FB0..10FC4 ; N # Lo [21] CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; N # No [7] CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +10FE0..10FF6 ; N # Lo [23] ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +11000 ; N # Mc BRAHMI SIGN CANDRABINDU +11001 ; N # Mn BRAHMI SIGN ANUSVARA +11002 ; N # Mc BRAHMI SIGN VISARGA +11003..11037 ; N # Lo [53] BRAHMI SIGN JIHVAMULIYA..BRAHMI LETTER OLD TAMIL NNNA +11038..11046 ; N # Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA +11047..1104D ; N # Po [7] BRAHMI DANDA..BRAHMI PUNCTUATION LOTUS +11052..11065 ; N # No [20] BRAHMI NUMBER ONE..BRAHMI NUMBER ONE THOUSAND +11066..1106F ; N # Nd [10] BRAHMI DIGIT ZERO..BRAHMI DIGIT NINE +11070 ; N # Mn BRAHMI SIGN OLD TAMIL VIRAMA +11071..11072 ; N # Lo [2] BRAHMI LETTER OLD TAMIL SHORT E..BRAHMI LETTER OLD TAMIL SHORT O +11073..11074 ; N # Mn [2] BRAHMI VOWEL SIGN OLD TAMIL SHORT E..BRAHMI VOWEL SIGN OLD TAMIL SHORT O +11075 ; N # Lo BRAHMI LETTER OLD TAMIL LLA +1107F..11081 ; N # Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA +11082 ; N # Mc KAITHI SIGN VISARGA +11083..110AF ; N # Lo [45] KAITHI LETTER A..KAITHI LETTER HA +110B0..110B2 ; N # Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II +110B3..110B6 ; N # Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI +110B7..110B8 ; N # Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU +110B9..110BA ; N # Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA +110BB..110BC ; N # Po [2] KAITHI ABBREVIATION SIGN..KAITHI ENUMERATION SIGN +110BD ; N # Cf KAITHI NUMBER SIGN +110BE..110C1 ; N # Po [4] KAITHI SECTION MARK..KAITHI DOUBLE DANDA +110C2 ; N # Mn KAITHI VOWEL SIGN VOCALIC R +110CD ; N # Cf KAITHI NUMBER SIGN ABOVE +110D0..110E8 ; N # Lo [25] SORA SOMPENG LETTER SAH..SORA SOMPENG LETTER MAE +110F0..110F9 ; N # Nd [10] SORA SOMPENG DIGIT ZERO..SORA SOMPENG DIGIT NINE +11100..11102 ; N # Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA +11103..11126 ; N # Lo [36] CHAKMA LETTER AA..CHAKMA LETTER HAA +11127..1112B ; N # Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU +1112C ; N # Mc CHAKMA VOWEL SIGN E +1112D..11134 ; N # Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA +11136..1113F ; N # Nd [10] CHAKMA DIGIT ZERO..CHAKMA DIGIT NINE +11140..11143 ; N # Po [4] CHAKMA SECTION MARK..CHAKMA QUESTION MARK +11144 ; N # Lo CHAKMA LETTER LHAA +11145..11146 ; N # Mc [2] CHAKMA VOWEL SIGN AA..CHAKMA VOWEL SIGN EI +11147 ; N # Lo CHAKMA LETTER VAA +11150..11172 ; N # Lo [35] MAHAJANI LETTER A..MAHAJANI LETTER RRA +11173 ; N # Mn MAHAJANI SIGN NUKTA +11174..11175 ; N # Po [2] MAHAJANI ABBREVIATION SIGN..MAHAJANI SECTION MARK +11176 ; N # Lo MAHAJANI LIGATURE SHRI +11180..11181 ; N # Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA +11182 ; N # Mc SHARADA SIGN VISARGA +11183..111B2 ; N # Lo [48] SHARADA LETTER A..SHARADA LETTER HA +111B3..111B5 ; N # Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II +111B6..111BE ; N # Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O +111BF..111C0 ; N # Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA +111C1..111C4 ; N # Lo [4] SHARADA SIGN AVAGRAHA..SHARADA OM +111C5..111C8 ; N # Po [4] SHARADA DANDA..SHARADA SEPARATOR +111C9..111CC ; N # Mn [4] SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; N # Po SHARADA SUTRA MARK +111CE ; N # Mc SHARADA VOWEL SIGN PRISHTHAMATRA E +111CF ; N # Mn SHARADA SIGN INVERTED CANDRABINDU +111D0..111D9 ; N # Nd [10] SHARADA DIGIT ZERO..SHARADA DIGIT NINE +111DA ; N # Lo SHARADA EKAM +111DB ; N # Po SHARADA SIGN SIDDHAM +111DC ; N # Lo SHARADA HEADSTROKE +111DD..111DF ; N # Po [3] SHARADA CONTINUATION SIGN..SHARADA SECTION MARK-2 +111E1..111F4 ; N # No [20] SINHALA ARCHAIC DIGIT ONE..SINHALA ARCHAIC NUMBER ONE THOUSAND +11200..11211 ; N # Lo [18] KHOJKI LETTER A..KHOJKI LETTER JJA +11213..1122B ; N # Lo [25] KHOJKI LETTER NYA..KHOJKI LETTER LLA +1122C..1122E ; N # Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II +1122F..11231 ; N # Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI +11232..11233 ; N # Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU +11234 ; N # Mn KHOJKI SIGN ANUSVARA +11235 ; N # Mc KHOJKI SIGN VIRAMA +11236..11237 ; N # Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA +11238..1123D ; N # Po [6] KHOJKI DANDA..KHOJKI ABBREVIATION SIGN +1123E ; N # Mn KHOJKI SIGN SUKUN +1123F..11240 ; N # Lo [2] KHOJKI LETTER QA..KHOJKI LETTER SHORT I +11241 ; N # Mn KHOJKI VOWEL SIGN VOCALIC R +11280..11286 ; N # Lo [7] MULTANI LETTER A..MULTANI LETTER GA +11288 ; N # Lo MULTANI LETTER GHA +1128A..1128D ; N # Lo [4] MULTANI LETTER CA..MULTANI LETTER JJA +1128F..1129D ; N # Lo [15] MULTANI LETTER NYA..MULTANI LETTER BA +1129F..112A8 ; N # Lo [10] MULTANI LETTER BHA..MULTANI LETTER RHA +112A9 ; N # Po MULTANI SECTION MARK +112B0..112DE ; N # Lo [47] KHUDAWADI LETTER A..KHUDAWADI LETTER HA +112DF ; N # Mn KHUDAWADI SIGN ANUSVARA +112E0..112E2 ; N # Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II +112E3..112EA ; N # Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA +112F0..112F9 ; N # Nd [10] KHUDAWADI DIGIT ZERO..KHUDAWADI DIGIT NINE +11300..11301 ; N # Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU +11302..11303 ; N # Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA +11305..1130C ; N # Lo [8] GRANTHA LETTER A..GRANTHA LETTER VOCALIC L +1130F..11310 ; N # Lo [2] GRANTHA LETTER EE..GRANTHA LETTER AI +11313..11328 ; N # Lo [22] GRANTHA LETTER OO..GRANTHA LETTER NA +1132A..11330 ; N # Lo [7] GRANTHA LETTER PA..GRANTHA LETTER RA +11332..11333 ; N # Lo [2] GRANTHA LETTER LA..GRANTHA LETTER LLA +11335..11339 ; N # Lo [5] GRANTHA LETTER VA..GRANTHA LETTER HA +1133B..1133C ; N # Mn [2] COMBINING BINDU BELOW..GRANTHA SIGN NUKTA +1133D ; N # Lo GRANTHA SIGN AVAGRAHA +1133E..1133F ; N # Mc [2] GRANTHA VOWEL SIGN AA..GRANTHA VOWEL SIGN I +11340 ; N # Mn GRANTHA VOWEL SIGN II +11341..11344 ; N # Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR +11347..11348 ; N # Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI +1134B..1134D ; N # Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA +11350 ; N # Lo GRANTHA OM +11357 ; N # Mc GRANTHA AU LENGTH MARK +1135D..11361 ; N # Lo [5] GRANTHA SIGN PLUTA..GRANTHA LETTER VOCALIC LL +11362..11363 ; N # Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL +11366..1136C ; N # Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX +11370..11374 ; N # Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA +11400..11434 ; N # Lo [53] NEWA LETTER A..NEWA LETTER HA +11435..11437 ; N # Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II +11438..1143F ; N # Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI +11440..11441 ; N # Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU +11442..11444 ; N # Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA +11445 ; N # Mc NEWA SIGN VISARGA +11446 ; N # Mn NEWA SIGN NUKTA +11447..1144A ; N # Lo [4] NEWA SIGN AVAGRAHA..NEWA SIDDHI +1144B..1144F ; N # Po [5] NEWA DANDA..NEWA ABBREVIATION SIGN +11450..11459 ; N # Nd [10] NEWA DIGIT ZERO..NEWA DIGIT NINE +1145A..1145B ; N # Po [2] NEWA DOUBLE COMMA..NEWA PLACEHOLDER MARK +1145D ; N # Po NEWA INSERTION SIGN +1145E ; N # Mn NEWA SANDHI MARK +1145F..11461 ; N # Lo [3] NEWA LETTER VEDIC ANUSVARA..NEWA SIGN UPADHMANIYA +11480..114AF ; N # Lo [48] TIRHUTA ANJI..TIRHUTA LETTER HA +114B0..114B2 ; N # Mc [3] TIRHUTA VOWEL SIGN AA..TIRHUTA VOWEL SIGN II +114B3..114B8 ; N # Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL +114B9 ; N # Mc TIRHUTA VOWEL SIGN E +114BA ; N # Mn TIRHUTA VOWEL SIGN SHORT E +114BB..114BE ; N # Mc [4] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN AU +114BF..114C0 ; N # Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA +114C1 ; N # Mc TIRHUTA SIGN VISARGA +114C2..114C3 ; N # Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA +114C4..114C5 ; N # Lo [2] TIRHUTA SIGN AVAGRAHA..TIRHUTA GVANG +114C6 ; N # Po TIRHUTA ABBREVIATION SIGN +114C7 ; N # Lo TIRHUTA OM +114D0..114D9 ; N # Nd [10] TIRHUTA DIGIT ZERO..TIRHUTA DIGIT NINE +11580..115AE ; N # Lo [47] SIDDHAM LETTER A..SIDDHAM LETTER HA +115AF..115B1 ; N # Mc [3] SIDDHAM VOWEL SIGN AA..SIDDHAM VOWEL SIGN II +115B2..115B5 ; N # Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR +115B8..115BB ; N # Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU +115BC..115BD ; N # Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA +115BE ; N # Mc SIDDHAM SIGN VISARGA +115BF..115C0 ; N # Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA +115C1..115D7 ; N # Po [23] SIDDHAM SIGN SIDDHAM..SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES +115D8..115DB ; N # Lo [4] SIDDHAM LETTER THREE-CIRCLE ALTERNATE I..SIDDHAM LETTER ALTERNATE U +115DC..115DD ; N # Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU +11600..1162F ; N # Lo [48] MODI LETTER A..MODI LETTER LLA +11630..11632 ; N # Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II +11633..1163A ; N # Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI +1163B..1163C ; N # Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU +1163D ; N # Mn MODI SIGN ANUSVARA +1163E ; N # Mc MODI SIGN VISARGA +1163F..11640 ; N # Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA +11641..11643 ; N # Po [3] MODI DANDA..MODI ABBREVIATION SIGN +11644 ; N # Lo MODI SIGN HUVA +11650..11659 ; N # Nd [10] MODI DIGIT ZERO..MODI DIGIT NINE +11660..1166C ; N # Po [13] MONGOLIAN BIRGA WITH ORNAMENT..MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT +11680..116AA ; N # Lo [43] TAKRI LETTER A..TAKRI LETTER RRA +116AB ; N # Mn TAKRI SIGN ANUSVARA +116AC ; N # Mc TAKRI SIGN VISARGA +116AD ; N # Mn TAKRI VOWEL SIGN AA +116AE..116AF ; N # Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II +116B0..116B5 ; N # Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU +116B6 ; N # Mc TAKRI SIGN VIRAMA +116B7 ; N # Mn TAKRI SIGN NUKTA +116B8 ; N # Lo TAKRI LETTER ARCHAIC KHA +116B9 ; N # Po TAKRI ABBREVIATION SIGN +116C0..116C9 ; N # Nd [10] TAKRI DIGIT ZERO..TAKRI DIGIT NINE +11700..1171A ; N # Lo [27] AHOM LETTER KA..AHOM LETTER ALTERNATE BA +1171D..1171F ; N # Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA +11720..11721 ; N # Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA +11722..11725 ; N # Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU +11726 ; N # Mc AHOM VOWEL SIGN E +11727..1172B ; N # Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER +11730..11739 ; N # Nd [10] AHOM DIGIT ZERO..AHOM DIGIT NINE +1173A..1173B ; N # No [2] AHOM NUMBER TEN..AHOM NUMBER TWENTY +1173C..1173E ; N # Po [3] AHOM SIGN SMALL SECTION..AHOM SIGN RULAI +1173F ; N # So AHOM SYMBOL VI +11740..11746 ; N # Lo [7] AHOM LETTER CA..AHOM LETTER LLA +11800..1182B ; N # Lo [44] DOGRA LETTER A..DOGRA LETTER RRA +1182C..1182E ; N # Mc [3] DOGRA VOWEL SIGN AA..DOGRA VOWEL SIGN II +1182F..11837 ; N # Mn [9] DOGRA VOWEL SIGN U..DOGRA SIGN ANUSVARA +11838 ; N # Mc DOGRA SIGN VISARGA +11839..1183A ; N # Mn [2] DOGRA SIGN VIRAMA..DOGRA SIGN NUKTA +1183B ; N # Po DOGRA ABBREVIATION SIGN +118A0..118DF ; N # L& [64] WARANG CITI CAPITAL LETTER NGAA..WARANG CITI SMALL LETTER VIYO +118E0..118E9 ; N # Nd [10] WARANG CITI DIGIT ZERO..WARANG CITI DIGIT NINE +118EA..118F2 ; N # No [9] WARANG CITI NUMBER TEN..WARANG CITI NUMBER NINETY +118FF..11906 ; N # Lo [8] WARANG CITI OM..DIVES AKURU LETTER E +11909 ; N # Lo DIVES AKURU LETTER O +1190C..11913 ; N # Lo [8] DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11915..11916 ; N # Lo [2] DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11918..1192F ; N # Lo [24] DIVES AKURU LETTER DDA..DIVES AKURU LETTER ZA +11930..11935 ; N # Mc [6] DIVES AKURU VOWEL SIGN AA..DIVES AKURU VOWEL SIGN E +11937..11938 ; N # Mc [2] DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +1193B..1193C ; N # Mn [2] DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN CANDRABINDU +1193D ; N # Mc DIVES AKURU SIGN HALANTA +1193E ; N # Mn DIVES AKURU VIRAMA +1193F ; N # Lo DIVES AKURU PREFIXED NASAL SIGN +11940 ; N # Mc DIVES AKURU MEDIAL YA +11941 ; N # Lo DIVES AKURU INITIAL RA +11942 ; N # Mc DIVES AKURU MEDIAL RA +11943 ; N # Mn DIVES AKURU SIGN NUKTA +11944..11946 ; N # Po [3] DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11950..11959 ; N # Nd [10] DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +119A0..119A7 ; N # Lo [8] NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119AA..119D0 ; N # Lo [39] NANDINAGARI LETTER E..NANDINAGARI LETTER RRA +119D1..119D3 ; N # Mc [3] NANDINAGARI VOWEL SIGN AA..NANDINAGARI VOWEL SIGN II +119D4..119D7 ; N # Mn [4] NANDINAGARI VOWEL SIGN U..NANDINAGARI VOWEL SIGN VOCALIC RR +119DA..119DB ; N # Mn [2] NANDINAGARI VOWEL SIGN E..NANDINAGARI VOWEL SIGN AI +119DC..119DF ; N # Mc [4] NANDINAGARI VOWEL SIGN O..NANDINAGARI SIGN VISARGA +119E0 ; N # Mn NANDINAGARI SIGN VIRAMA +119E1 ; N # Lo NANDINAGARI SIGN AVAGRAHA +119E2 ; N # Po NANDINAGARI SIGN SIDDHAM +119E3 ; N # Lo NANDINAGARI HEADSTROKE +119E4 ; N # Mc NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +11A00 ; N # Lo ZANABAZAR SQUARE LETTER A +11A01..11A0A ; N # Mn [10] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL LENGTH MARK +11A0B..11A32 ; N # Lo [40] ZANABAZAR SQUARE LETTER KA..ZANABAZAR SQUARE LETTER KSSA +11A33..11A38 ; N # Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA +11A39 ; N # Mc ZANABAZAR SQUARE SIGN VISARGA +11A3A ; N # Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA +11A3B..11A3E ; N # Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA +11A3F..11A46 ; N # Po [8] ZANABAZAR SQUARE INITIAL HEAD MARK..ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK +11A47 ; N # Mn ZANABAZAR SQUARE SUBJOINER +11A50 ; N # Lo SOYOMBO LETTER A +11A51..11A56 ; N # Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE +11A57..11A58 ; N # Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU +11A59..11A5B ; N # Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK +11A5C..11A89 ; N # Lo [46] SOYOMBO LETTER KA..SOYOMBO CLUSTER-INITIAL LETTER SA +11A8A..11A96 ; N # Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA +11A97 ; N # Mc SOYOMBO SIGN VISARGA +11A98..11A99 ; N # Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER +11A9A..11A9C ; N # Po [3] SOYOMBO MARK TSHEG..SOYOMBO MARK DOUBLE SHAD +11A9D ; N # Lo SOYOMBO MARK PLUTA +11A9E..11AA2 ; N # Po [5] SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME..SOYOMBO TERMINAL MARK-2 +11AB0..11AF8 ; N # Lo [73] CANADIAN SYLLABICS NATTILIK HI..PAU CIN HAU GLOTTAL STOP FINAL +11B00..11B09 ; N # Po [10] DEVANAGARI HEAD MARK..DEVANAGARI SIGN MINDU +11C00..11C08 ; N # Lo [9] BHAIKSUKI LETTER A..BHAIKSUKI LETTER VOCALIC L +11C0A..11C2E ; N # Lo [37] BHAIKSUKI LETTER E..BHAIKSUKI LETTER HA +11C2F ; N # Mc BHAIKSUKI VOWEL SIGN AA +11C30..11C36 ; N # Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L +11C38..11C3D ; N # Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA +11C3E ; N # Mc BHAIKSUKI SIGN VISARGA +11C3F ; N # Mn BHAIKSUKI SIGN VIRAMA +11C40 ; N # Lo BHAIKSUKI SIGN AVAGRAHA +11C41..11C45 ; N # Po [5] BHAIKSUKI DANDA..BHAIKSUKI GAP FILLER-2 +11C50..11C59 ; N # Nd [10] BHAIKSUKI DIGIT ZERO..BHAIKSUKI DIGIT NINE +11C5A..11C6C ; N # No [19] BHAIKSUKI NUMBER ONE..BHAIKSUKI HUNDREDS UNIT MARK +11C70..11C71 ; N # Po [2] MARCHEN HEAD MARK..MARCHEN MARK SHAD +11C72..11C8F ; N # Lo [30] MARCHEN LETTER KA..MARCHEN LETTER A +11C92..11CA7 ; N # Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA +11CA9 ; N # Mc MARCHEN SUBJOINED LETTER YA +11CAA..11CB0 ; N # Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA +11CB1 ; N # Mc MARCHEN VOWEL SIGN I +11CB2..11CB3 ; N # Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E +11CB4 ; N # Mc MARCHEN VOWEL SIGN O +11CB5..11CB6 ; N # Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU +11D00..11D06 ; N # Lo [7] MASARAM GONDI LETTER A..MASARAM GONDI LETTER E +11D08..11D09 ; N # Lo [2] MASARAM GONDI LETTER AI..MASARAM GONDI LETTER O +11D0B..11D30 ; N # Lo [38] MASARAM GONDI LETTER AU..MASARAM GONDI LETTER TRA +11D31..11D36 ; N # Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R +11D3A ; N # Mn MASARAM GONDI VOWEL SIGN E +11D3C..11D3D ; N # Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O +11D3F..11D45 ; N # Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA +11D46 ; N # Lo MASARAM GONDI REPHA +11D47 ; N # Mn MASARAM GONDI RA-KARA +11D50..11D59 ; N # Nd [10] MASARAM GONDI DIGIT ZERO..MASARAM GONDI DIGIT NINE +11D60..11D65 ; N # Lo [6] GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D67..11D68 ; N # Lo [2] GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D6A..11D89 ; N # Lo [32] GUNJALA GONDI LETTER OO..GUNJALA GONDI LETTER SA +11D8A..11D8E ; N # Mc [5] GUNJALA GONDI VOWEL SIGN AA..GUNJALA GONDI VOWEL SIGN UU +11D90..11D91 ; N # Mn [2] GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D93..11D94 ; N # Mc [2] GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI VOWEL SIGN AU +11D95 ; N # Mn GUNJALA GONDI SIGN ANUSVARA +11D96 ; N # Mc GUNJALA GONDI SIGN VISARGA +11D97 ; N # Mn GUNJALA GONDI VIRAMA +11D98 ; N # Lo GUNJALA GONDI OM +11DA0..11DA9 ; N # Nd [10] GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11EE0..11EF2 ; N # Lo [19] MAKASAR LETTER KA..MAKASAR ANGKA +11EF3..11EF4 ; N # Mn [2] MAKASAR VOWEL SIGN I..MAKASAR VOWEL SIGN U +11EF5..11EF6 ; N # Mc [2] MAKASAR VOWEL SIGN E..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; N # Po [2] MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11F00..11F01 ; N # Mn [2] KAWI SIGN CANDRABINDU..KAWI SIGN ANUSVARA +11F02 ; N # Lo KAWI SIGN REPHA +11F03 ; N # Mc KAWI SIGN VISARGA +11F04..11F10 ; N # Lo [13] KAWI LETTER A..KAWI LETTER O +11F12..11F33 ; N # Lo [34] KAWI LETTER KA..KAWI LETTER JNYA +11F34..11F35 ; N # Mc [2] KAWI VOWEL SIGN AA..KAWI VOWEL SIGN ALTERNATE AA +11F36..11F3A ; N # Mn [5] KAWI VOWEL SIGN I..KAWI VOWEL SIGN VOCALIC R +11F3E..11F3F ; N # Mc [2] KAWI VOWEL SIGN E..KAWI VOWEL SIGN AI +11F40 ; N # Mn KAWI VOWEL SIGN EU +11F41 ; N # Mc KAWI SIGN KILLER +11F42 ; N # Mn KAWI CONJOINER +11F43..11F4F ; N # Po [13] KAWI DANDA..KAWI PUNCTUATION CLOSING SPIRAL +11F50..11F59 ; N # Nd [10] KAWI DIGIT ZERO..KAWI DIGIT NINE +11FB0 ; N # Lo LISU LETTER YHA +11FC0..11FD4 ; N # No [21] TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL FRACTION DOWNSCALING FACTOR KIIZH +11FD5..11FDC ; N # So [8] TAMIL SIGN NEL..TAMIL SIGN MUKKURUNI +11FDD..11FE0 ; N # Sc [4] TAMIL SIGN KAACU..TAMIL SIGN VARAAKAN +11FE1..11FF1 ; N # So [17] TAMIL SIGN PAARAM..TAMIL SIGN VAKAIYARAA +11FFF ; N # Po TAMIL PUNCTUATION END OF TEXT +12000..12399 ; N # Lo [922] CUNEIFORM SIGN A..CUNEIFORM SIGN U U +12400..1246E ; N # Nl [111] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM +12470..12474 ; N # Po [5] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON +12480..12543 ; N # Lo [196] CUNEIFORM SIGN AB TIMES NUN TENU..CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU +12F90..12FF0 ; N # Lo [97] CYPRO-MINOAN SIGN CM001..CYPRO-MINOAN SIGN CM114 +12FF1..12FF2 ; N # Po [2] CYPRO-MINOAN SIGN CM301..CYPRO-MINOAN SIGN CM302 +13000..1342F ; N # Lo [1072] EGYPTIAN HIEROGLYPH A001..EGYPTIAN HIEROGLYPH V011D +13430..1343F ; N # Cf [16] EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END WALLED ENCLOSURE +13440 ; N # Mn EGYPTIAN HIEROGLYPH MIRROR HORIZONTALLY +13441..13446 ; N # Lo [6] EGYPTIAN HIEROGLYPH FULL BLANK..EGYPTIAN HIEROGLYPH WIDE LOST SIGN +13447..13455 ; N # Mn [15] EGYPTIAN HIEROGLYPH MODIFIER DAMAGED AT TOP START..EGYPTIAN HIEROGLYPH MODIFIER DAMAGED +14400..14646 ; N # Lo [583] ANATOLIAN HIEROGLYPH A001..ANATOLIAN HIEROGLYPH A530 +16800..16A38 ; N # Lo [569] BAMUM LETTER PHASE-A NGKUE MFON..BAMUM LETTER PHASE-F VUEQ +16A40..16A5E ; N # Lo [31] MRO LETTER TA..MRO LETTER TEK +16A60..16A69 ; N # Nd [10] MRO DIGIT ZERO..MRO DIGIT NINE +16A6E..16A6F ; N # Po [2] MRO DANDA..MRO DOUBLE DANDA +16A70..16ABE ; N # Lo [79] TANGSA LETTER OZ..TANGSA LETTER ZA +16AC0..16AC9 ; N # Nd [10] TANGSA DIGIT ZERO..TANGSA DIGIT NINE +16AD0..16AED ; N # Lo [30] BASSA VAH LETTER ENNI..BASSA VAH LETTER I +16AF0..16AF4 ; N # Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE +16AF5 ; N # Po BASSA VAH FULL STOP +16B00..16B2F ; N # Lo [48] PAHAWH HMONG VOWEL KEEB..PAHAWH HMONG CONSONANT CAU +16B30..16B36 ; N # Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM +16B37..16B3B ; N # Po [5] PAHAWH HMONG SIGN VOS THOM..PAHAWH HMONG SIGN VOS FEEM +16B3C..16B3F ; N # So [4] PAHAWH HMONG SIGN XYEEM NTXIV..PAHAWH HMONG SIGN XYEEM FAIB +16B40..16B43 ; N # Lm [4] PAHAWH HMONG SIGN VOS SEEV..PAHAWH HMONG SIGN IB YAM +16B44 ; N # Po PAHAWH HMONG SIGN XAUS +16B45 ; N # So PAHAWH HMONG SIGN CIM TSOV ROG +16B50..16B59 ; N # Nd [10] PAHAWH HMONG DIGIT ZERO..PAHAWH HMONG DIGIT NINE +16B5B..16B61 ; N # No [7] PAHAWH HMONG NUMBER TENS..PAHAWH HMONG NUMBER TRILLIONS +16B63..16B77 ; N # Lo [21] PAHAWH HMONG SIGN VOS LUB..PAHAWH HMONG SIGN CIM NRES TOS +16B7D..16B8F ; N # Lo [19] PAHAWH HMONG CLAN SIGN TSHEEJ..PAHAWH HMONG CLAN SIGN VWJ +16E40..16E7F ; N # L& [64] MEDEFAIDRIN CAPITAL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E96 ; N # No [23] MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN DIGIT THREE ALTERNATE FORM +16E97..16E9A ; N # Po [4] MEDEFAIDRIN COMMA..MEDEFAIDRIN EXCLAMATION OH +16F00..16F4A ; N # Lo [75] MIAO LETTER PA..MIAO LETTER RTE +16F4F ; N # Mn MIAO SIGN CONSONANT MODIFIER BAR +16F50 ; N # Lo MIAO LETTER NASALIZATION +16F51..16F87 ; N # Mc [55] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN UI +16F8F..16F92 ; N # Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW +16F93..16F9F ; N # Lm [13] MIAO LETTER TONE-2..MIAO LETTER REFORMED TONE-8 +1BC00..1BC6A ; N # Lo [107] DUPLOYAN LETTER H..DUPLOYAN LETTER VOCALIC M +1BC70..1BC7C ; N # Lo [13] DUPLOYAN AFFIX LEFT HORIZONTAL SECANT..DUPLOYAN AFFIX ATTACHED TANGENT HOOK +1BC80..1BC88 ; N # Lo [9] DUPLOYAN AFFIX HIGH ACUTE..DUPLOYAN AFFIX HIGH VERTICAL +1BC90..1BC99 ; N # Lo [10] DUPLOYAN AFFIX LOW ACUTE..DUPLOYAN AFFIX LOW ARROW +1BC9C ; N # So DUPLOYAN SIGN O WITH CROSS +1BC9D..1BC9E ; N # Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK +1BC9F ; N # Po DUPLOYAN PUNCTUATION CHINOOK FULL STOP +1BCA0..1BCA3 ; N # Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP +1CF00..1CF2D ; N # Mn [46] ZNAMENNY COMBINING MARK GORAZDO NIZKO S KRYZHEM ON LEFT..ZNAMENNY COMBINING MARK KRYZH ON LEFT +1CF30..1CF46 ; N # Mn [23] ZNAMENNY COMBINING TONAL RANGE MARK MRACHNO..ZNAMENNY PRIZNAK MODIFIER ROG +1CF50..1CFC3 ; N # So [116] ZNAMENNY NEUME KRYUK..ZNAMENNY NEUME PAUK +1D000..1D0F5 ; N # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO +1D100..1D126 ; N # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 +1D129..1D164 ; N # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE +1D165..1D166 ; N # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM +1D167..1D169 ; N # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 +1D16A..1D16C ; N # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 +1D16D..1D172 ; N # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 +1D173..1D17A ; N # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE +1D17B..1D182 ; N # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE +1D183..1D184 ; N # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN +1D185..1D18B ; N # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE +1D18C..1D1A9 ; N # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH +1D1AA..1D1AD ; N # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO +1D1AE..1D1EA ; N # So [61] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL KORON +1D200..1D241 ; N # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 +1D242..1D244 ; N # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME +1D245 ; N # So GREEK MUSICAL LEIMMA +1D2C0..1D2D3 ; N # No [20] KAKTOVIK NUMERAL ZERO..KAKTOVIK NUMERAL NINETEEN +1D2E0..1D2F3 ; N # No [20] MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D300..1D356 ; N # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING +1D360..1D378 ; N # No [25] COUNTING ROD UNIT DIGIT ONE..TALLY MARK FIVE +1D400..1D454 ; N # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G +1D456..1D49C ; N # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A +1D49E..1D49F ; N # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D +1D4A2 ; N # L& MATHEMATICAL SCRIPT CAPITAL G +1D4A5..1D4A6 ; N # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K +1D4A9..1D4AC ; N # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q +1D4AE..1D4B9 ; N # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D +1D4BB ; N # L& MATHEMATICAL SCRIPT SMALL F +1D4BD..1D4C3 ; N # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N +1D4C5..1D505 ; N # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B +1D507..1D50A ; N # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G +1D50D..1D514 ; N # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q +1D516..1D51C ; N # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y +1D51E..1D539 ; N # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B +1D53B..1D53E ; N # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G +1D540..1D544 ; N # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M +1D546 ; N # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O +1D54A..1D550 ; N # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y +1D552..1D6A5 ; N # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J +1D6A8..1D6C0 ; N # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA +1D6C1 ; N # Sm MATHEMATICAL BOLD NABLA +1D6C2..1D6DA ; N # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA +1D6DB ; N # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL +1D6DC..1D6FA ; N # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA +1D6FB ; N # Sm MATHEMATICAL ITALIC NABLA +1D6FC..1D714 ; N # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA +1D715 ; N # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL +1D716..1D734 ; N # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA +1D735 ; N # Sm MATHEMATICAL BOLD ITALIC NABLA +1D736..1D74E ; N # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA +1D74F ; N # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL +1D750..1D76E ; N # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA +1D76F ; N # Sm MATHEMATICAL SANS-SERIF BOLD NABLA +1D770..1D788 ; N # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA +1D789 ; N # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL +1D78A..1D7A8 ; N # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA +1D7A9 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA +1D7AA..1D7C2 ; N # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA +1D7C3 ; N # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL +1D7C4..1D7CB ; N # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA +1D7CE..1D7FF ; N # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE +1D800..1D9FF ; N # So [512] SIGNWRITING HAND-FIST INDEX..SIGNWRITING HEAD +1DA00..1DA36 ; N # Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN +1DA37..1DA3A ; N # So [4] SIGNWRITING AIR BLOW SMALL ROTATIONS..SIGNWRITING BREATH EXHALE +1DA3B..1DA6C ; N # Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT +1DA6D..1DA74 ; N # So [8] SIGNWRITING SHOULDER HIP SPINE..SIGNWRITING TORSO-FLOORPLANE TWISTING +1DA75 ; N # Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS +1DA76..1DA83 ; N # So [14] SIGNWRITING LIMB COMBINATION..SIGNWRITING LOCATION DEPTH +1DA84 ; N # Mn SIGNWRITING LOCATION HEAD NECK +1DA85..1DA86 ; N # So [2] SIGNWRITING LOCATION TORSO..SIGNWRITING LOCATION LIMBS DIGITS +1DA87..1DA8B ; N # Po [5] SIGNWRITING COMMA..SIGNWRITING PARENTHESIS +1DA9B..1DA9F ; N # Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 +1DAA1..1DAAF ; N # Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 +1DF00..1DF09 ; N # L& [10] LATIN SMALL LETTER FENG DIGRAPH WITH TRILL..LATIN SMALL LETTER T WITH HOOK AND RETROFLEX HOOK +1DF0A ; N # Lo LATIN LETTER RETROFLEX CLICK WITH RETROFLEX HOOK +1DF0B..1DF1E ; N # L& [20] LATIN SMALL LETTER ESH WITH DOUBLE BAR..LATIN SMALL LETTER S WITH CURL +1DF25..1DF2A ; N # L& [6] LATIN SMALL LETTER D WITH MID-HEIGHT LEFT HOOK..LATIN SMALL LETTER T WITH MID-HEIGHT LEFT HOOK +1E000..1E006 ; N # Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE +1E008..1E018 ; N # Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU +1E01B..1E021 ; N # Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI +1E023..1E024 ; N # Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS +1E026..1E02A ; N # Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA +1E030..1E06D ; N # Lm [62] MODIFIER LETTER CYRILLIC SMALL A..MODIFIER LETTER CYRILLIC SMALL STRAIGHT U WITH STROKE +1E08F ; N # Mn COMBINING CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +1E100..1E12C ; N # Lo [45] NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E130..1E136 ; N # Mn [7] NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG TONE-D +1E137..1E13D ; N # Lm [7] NYIAKENG PUACHUE HMONG SIGN FOR PERSON..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E140..1E149 ; N # Nd [10] NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14E ; N # Lo NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; N # So NYIAKENG PUACHUE HMONG CIRCLED CA +1E290..1E2AD ; N # Lo [30] TOTO LETTER PA..TOTO LETTER A +1E2AE ; N # Mn TOTO SIGN RISING TONE +1E2C0..1E2EB ; N # Lo [44] WANCHO LETTER AA..WANCHO LETTER YIH +1E2EC..1E2EF ; N # Mn [4] WANCHO TONE TUP..WANCHO TONE KOINI +1E2F0..1E2F9 ; N # Nd [10] WANCHO DIGIT ZERO..WANCHO DIGIT NINE +1E2FF ; N # Sc WANCHO NGUN SIGN +1E4D0..1E4EA ; N # Lo [27] NAG MUNDARI LETTER O..NAG MUNDARI LETTER ELL +1E4EB ; N # Lm NAG MUNDARI SIGN OJOD +1E4EC..1E4EF ; N # Mn [4] NAG MUNDARI SIGN MUHOR..NAG MUNDARI SIGN SUTUH +1E4F0..1E4F9 ; N # Nd [10] NAG MUNDARI DIGIT ZERO..NAG MUNDARI DIGIT NINE +1E7E0..1E7E6 ; N # Lo [7] ETHIOPIC SYLLABLE HHYA..ETHIOPIC SYLLABLE HHYO +1E7E8..1E7EB ; N # Lo [4] ETHIOPIC SYLLABLE GURAGE HHWA..ETHIOPIC SYLLABLE HHWE +1E7ED..1E7EE ; N # Lo [2] ETHIOPIC SYLLABLE GURAGE MWI..ETHIOPIC SYLLABLE GURAGE MWEE +1E7F0..1E7FE ; N # Lo [15] ETHIOPIC SYLLABLE GURAGE QWI..ETHIOPIC SYLLABLE GURAGE PWEE +1E800..1E8C4 ; N # Lo [197] MENDE KIKAKUI SYLLABLE M001 KI..MENDE KIKAKUI SYLLABLE M060 NYON +1E8C7..1E8CF ; N # No [9] MENDE KIKAKUI DIGIT ONE..MENDE KIKAKUI DIGIT NINE +1E8D0..1E8D6 ; N # Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS +1E900..1E943 ; N # L& [68] ADLAM CAPITAL LETTER ALIF..ADLAM SMALL LETTER SHA +1E944..1E94A ; N # Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA +1E94B ; N # Lm ADLAM NASALIZATION MARK +1E950..1E959 ; N # Nd [10] ADLAM DIGIT ZERO..ADLAM DIGIT NINE +1E95E..1E95F ; N # Po [2] ADLAM INITIAL EXCLAMATION MARK..ADLAM INITIAL QUESTION MARK +1EC71..1ECAB ; N # No [59] INDIC SIYAQ NUMBER ONE..INDIC SIYAQ NUMBER PREFIXED NINE +1ECAC ; N # So INDIC SIYAQ PLACEHOLDER +1ECAD..1ECAF ; N # No [3] INDIC SIYAQ FRACTION ONE QUARTER..INDIC SIYAQ FRACTION THREE QUARTERS +1ECB0 ; N # Sc INDIC SIYAQ RUPEE MARK +1ECB1..1ECB4 ; N # No [4] INDIC SIYAQ NUMBER ALTERNATE ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ED01..1ED2D ; N # No [45] OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ NUMBER NINETY THOUSAND +1ED2E ; N # So OTTOMAN SIYAQ MARRATAN +1ED2F..1ED3D ; N # No [15] OTTOMAN SIYAQ ALTERNATE NUMBER TWO..OTTOMAN SIYAQ FRACTION ONE SIXTH +1EE00..1EE03 ; N # Lo [4] ARABIC MATHEMATICAL ALEF..ARABIC MATHEMATICAL DAL +1EE05..1EE1F ; N # Lo [27] ARABIC MATHEMATICAL WAW..ARABIC MATHEMATICAL DOTLESS QAF +1EE21..1EE22 ; N # Lo [2] ARABIC MATHEMATICAL INITIAL BEH..ARABIC MATHEMATICAL INITIAL JEEM +1EE24 ; N # Lo ARABIC MATHEMATICAL INITIAL HEH +1EE27 ; N # Lo ARABIC MATHEMATICAL INITIAL HAH +1EE29..1EE32 ; N # Lo [10] ARABIC MATHEMATICAL INITIAL YEH..ARABIC MATHEMATICAL INITIAL QAF +1EE34..1EE37 ; N # Lo [4] ARABIC MATHEMATICAL INITIAL SHEEN..ARABIC MATHEMATICAL INITIAL KHAH +1EE39 ; N # Lo ARABIC MATHEMATICAL INITIAL DAD +1EE3B ; N # Lo ARABIC MATHEMATICAL INITIAL GHAIN +1EE42 ; N # Lo ARABIC MATHEMATICAL TAILED JEEM +1EE47 ; N # Lo ARABIC MATHEMATICAL TAILED HAH +1EE49 ; N # Lo ARABIC MATHEMATICAL TAILED YEH +1EE4B ; N # Lo ARABIC MATHEMATICAL TAILED LAM +1EE4D..1EE4F ; N # Lo [3] ARABIC MATHEMATICAL TAILED NOON..ARABIC MATHEMATICAL TAILED AIN +1EE51..1EE52 ; N # Lo [2] ARABIC MATHEMATICAL TAILED SAD..ARABIC MATHEMATICAL TAILED QAF +1EE54 ; N # Lo ARABIC MATHEMATICAL TAILED SHEEN +1EE57 ; N # Lo ARABIC MATHEMATICAL TAILED KHAH +1EE59 ; N # Lo ARABIC MATHEMATICAL TAILED DAD +1EE5B ; N # Lo ARABIC MATHEMATICAL TAILED GHAIN +1EE5D ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS NOON +1EE5F ; N # Lo ARABIC MATHEMATICAL TAILED DOTLESS QAF +1EE61..1EE62 ; N # Lo [2] ARABIC MATHEMATICAL STRETCHED BEH..ARABIC MATHEMATICAL STRETCHED JEEM +1EE64 ; N # Lo ARABIC MATHEMATICAL STRETCHED HEH +1EE67..1EE6A ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED HAH..ARABIC MATHEMATICAL STRETCHED KAF +1EE6C..1EE72 ; N # Lo [7] ARABIC MATHEMATICAL STRETCHED MEEM..ARABIC MATHEMATICAL STRETCHED QAF +1EE74..1EE77 ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED SHEEN..ARABIC MATHEMATICAL STRETCHED KHAH +1EE79..1EE7C ; N # Lo [4] ARABIC MATHEMATICAL STRETCHED DAD..ARABIC MATHEMATICAL STRETCHED DOTLESS BEH +1EE7E ; N # Lo ARABIC MATHEMATICAL STRETCHED DOTLESS FEH +1EE80..1EE89 ; N # Lo [10] ARABIC MATHEMATICAL LOOPED ALEF..ARABIC MATHEMATICAL LOOPED YEH +1EE8B..1EE9B ; N # Lo [17] ARABIC MATHEMATICAL LOOPED LAM..ARABIC MATHEMATICAL LOOPED GHAIN +1EEA1..1EEA3 ; N # Lo [3] ARABIC MATHEMATICAL DOUBLE-STRUCK BEH..ARABIC MATHEMATICAL DOUBLE-STRUCK DAL +1EEA5..1EEA9 ; N # Lo [5] ARABIC MATHEMATICAL DOUBLE-STRUCK WAW..ARABIC MATHEMATICAL DOUBLE-STRUCK YEH +1EEAB..1EEBB ; N # Lo [17] ARABIC MATHEMATICAL DOUBLE-STRUCK LAM..ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN +1EEF0..1EEF1 ; N # Sm [2] ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL..ARABIC MATHEMATICAL OPERATOR HAH WITH DAL +1F000..1F003 ; N # So [4] MAHJONG TILE EAST WIND..MAHJONG TILE NORTH WIND +1F005..1F02B ; N # So [39] MAHJONG TILE GREEN DRAGON..MAHJONG TILE BACK +1F030..1F093 ; N # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 +1F0A0..1F0AE ; N # So [15] PLAYING CARD BACK..PLAYING CARD KING OF SPADES +1F0B1..1F0BF ; N # So [15] PLAYING CARD ACE OF HEARTS..PLAYING CARD RED JOKER +1F0C1..1F0CE ; N # So [14] PLAYING CARD ACE OF DIAMONDS..PLAYING CARD KING OF DIAMONDS +1F0D1..1F0F5 ; N # So [37] PLAYING CARD ACE OF CLUBS..PLAYING CARD TRUMP-21 +1F10B..1F10C ; N # No [2] DINGBAT CIRCLED SANS-SERIF DIGIT ZERO..DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO +1F10D..1F10F ; N # So [3] CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +1F12E..1F12F ; N # So [2] CIRCLED WZ..COPYLEFT SYMBOL +1F16A..1F16F ; N # So [6] RAISED MC SIGN..CIRCLED HUMAN FIGURE +1F1AD ; N # So MASK WORK SYMBOL +1F1E6..1F1FF ; N # So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z +1F321..1F32C ; N # So [12] THERMOMETER..WIND BLOWING FACE +1F336 ; N # So HOT PEPPER +1F37D ; N # So FORK AND KNIFE WITH PLATE +1F394..1F39F ; N # So [12] HEART WITH TIP ON THE LEFT..ADMISSION TICKETS +1F3CB..1F3CE ; N # So [4] WEIGHT LIFTER..RACING CAR +1F3D4..1F3DF ; N # So [12] SNOW CAPPED MOUNTAIN..STADIUM +1F3F1..1F3F3 ; N # So [3] WHITE PENNANT..WAVING WHITE FLAG +1F3F5..1F3F7 ; N # So [3] ROSETTE..LABEL +1F43F ; N # So CHIPMUNK +1F441 ; N # So EYE +1F4FD..1F4FE ; N # So [2] FILM PROJECTOR..PORTABLE STEREO +1F53E..1F54A ; N # So [13] LOWER RIGHT SHADOWED WHITE CIRCLE..DOVE OF PEACE +1F54F ; N # So BOWL OF HYGIEIA +1F568..1F579 ; N # So [18] RIGHT SPEAKER..JOYSTICK +1F57B..1F594 ; N # So [26] LEFT HAND TELEPHONE RECEIVER..REVERSED VICTORY HAND +1F597..1F5A3 ; N # So [13] WHITE DOWN POINTING LEFT HAND INDEX..BLACK DOWN POINTING BACKHAND INDEX +1F5A5..1F5FA ; N # So [86] DESKTOP COMPUTER..WORLD MAP +1F650..1F67F ; N # So [48] NORTH WEST POINTING LEAF..REVERSE CHECKER BOARD +1F6C6..1F6CB ; N # So [6] TRIANGLE WITH ROUNDED CORNERS..COUCH AND LAMP +1F6CD..1F6CF ; N # So [3] SHOPPING BAGS..BED +1F6D3..1F6D4 ; N # So [2] STUPA..PAGODA +1F6E0..1F6EA ; N # So [11] HAMMER AND WRENCH..NORTHEAST-POINTING AIRPLANE +1F6F0..1F6F3 ; N # So [4] SATELLITE..PASSENGER SHIP +1F700..1F776 ; N # So [119] ALCHEMICAL SYMBOL FOR QUINTESSENCE..LUNAR ECLIPSE +1F77B..1F7D9 ; N # So [95] HAUMEA..NINE POINTED WHITE STAR +1F800..1F80B ; N # So [12] LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD..DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD +1F810..1F847 ; N # So [56] LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD..DOWNWARDS HEAVY ARROW +1F850..1F859 ; N # So [10] LEFTWARDS SANS-SERIF ARROW..UP DOWN SANS-SERIF ARROW +1F860..1F887 ; N # So [40] WIDE-HEADED LEFTWARDS LIGHT BARB ARROW..WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW +1F890..1F8AD ; N # So [30] LEFTWARDS TRIANGLE ARROWHEAD..WHITE ARROW SHAFT WIDTH TWO THIRDS +1F8B0..1F8B1 ; N # So [2] ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F900..1F90B ; N # So [12] CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F93B ; N # So MODERN PENTATHLON +1F946 ; N # So RIFLE +1FA00..1FA53 ; N # So [84] NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP +1FA60..1FA6D ; N # So [14] XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FB00..1FB92 ; N # So [147] BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB94..1FBCA ; N # So [55] LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBF0..1FBF9 ; N # Nd [10] SEGMENTED DIGIT ZERO..SEGMENTED DIGIT NINE +E0001 ; N # Cf LANGUAGE TAG +E0020..E007F ; N # Cf [96] TAG SPACE..CANCEL TAG + +# The above property value applies to 766284 code points not listed here. +# Total code points: 792618 + +# ================================================ + +# East_Asian_Width=Ambiguous + +00A1 ; A # Po INVERTED EXCLAMATION MARK +00A4 ; A # Sc CURRENCY SIGN +00A7 ; A # Po SECTION SIGN +00A8 ; A # Sk DIAERESIS +00AA ; A # Lo FEMININE ORDINAL INDICATOR +00AD ; A # Cf SOFT HYPHEN +00AE ; A # So REGISTERED SIGN +00B0 ; A # So DEGREE SIGN +00B1 ; A # Sm PLUS-MINUS SIGN +00B2..00B3 ; A # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE +00B4 ; A # Sk ACUTE ACCENT +00B6..00B7 ; A # Po [2] PILCROW SIGN..MIDDLE DOT +00B8 ; A # Sk CEDILLA +00B9 ; A # No SUPERSCRIPT ONE +00BA ; A # Lo MASCULINE ORDINAL INDICATOR +00BC..00BE ; A # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS +00BF ; A # Po INVERTED QUESTION MARK +00C6 ; A # L& LATIN CAPITAL LETTER AE +00D0 ; A # L& LATIN CAPITAL LETTER ETH +00D7 ; A # Sm MULTIPLICATION SIGN +00D8 ; A # L& LATIN CAPITAL LETTER O WITH STROKE +00DE..00E1 ; A # L& [4] LATIN CAPITAL LETTER THORN..LATIN SMALL LETTER A WITH ACUTE +00E6 ; A # L& LATIN SMALL LETTER AE +00E8..00EA ; A # L& [3] LATIN SMALL LETTER E WITH GRAVE..LATIN SMALL LETTER E WITH CIRCUMFLEX +00EC..00ED ; A # L& [2] LATIN SMALL LETTER I WITH GRAVE..LATIN SMALL LETTER I WITH ACUTE +00F0 ; A # L& LATIN SMALL LETTER ETH +00F2..00F3 ; A # L& [2] LATIN SMALL LETTER O WITH GRAVE..LATIN SMALL LETTER O WITH ACUTE +00F7 ; A # Sm DIVISION SIGN +00F8..00FA ; A # L& [3] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER U WITH ACUTE +00FC ; A # L& LATIN SMALL LETTER U WITH DIAERESIS +00FE ; A # L& LATIN SMALL LETTER THORN +0101 ; A # L& LATIN SMALL LETTER A WITH MACRON +0111 ; A # L& LATIN SMALL LETTER D WITH STROKE +0113 ; A # L& LATIN SMALL LETTER E WITH MACRON +011B ; A # L& LATIN SMALL LETTER E WITH CARON +0126..0127 ; A # L& [2] LATIN CAPITAL LETTER H WITH STROKE..LATIN SMALL LETTER H WITH STROKE +012B ; A # L& LATIN SMALL LETTER I WITH MACRON +0131..0133 ; A # L& [3] LATIN SMALL LETTER DOTLESS I..LATIN SMALL LIGATURE IJ +0138 ; A # L& LATIN SMALL LETTER KRA +013F..0142 ; A # L& [4] LATIN CAPITAL LETTER L WITH MIDDLE DOT..LATIN SMALL LETTER L WITH STROKE +0144 ; A # L& LATIN SMALL LETTER N WITH ACUTE +0148..014B ; A # L& [4] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER ENG +014D ; A # L& LATIN SMALL LETTER O WITH MACRON +0152..0153 ; A # L& [2] LATIN CAPITAL LIGATURE OE..LATIN SMALL LIGATURE OE +0166..0167 ; A # L& [2] LATIN CAPITAL LETTER T WITH STROKE..LATIN SMALL LETTER T WITH STROKE +016B ; A # L& LATIN SMALL LETTER U WITH MACRON +01CE ; A # L& LATIN SMALL LETTER A WITH CARON +01D0 ; A # L& LATIN SMALL LETTER I WITH CARON +01D2 ; A # L& LATIN SMALL LETTER O WITH CARON +01D4 ; A # L& LATIN SMALL LETTER U WITH CARON +01D6 ; A # L& LATIN SMALL LETTER U WITH DIAERESIS AND MACRON +01D8 ; A # L& LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE +01DA ; A # L& LATIN SMALL LETTER U WITH DIAERESIS AND CARON +01DC ; A # L& LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE +0251 ; A # L& LATIN SMALL LETTER ALPHA +0261 ; A # L& LATIN SMALL LETTER SCRIPT G +02C4 ; A # Sk MODIFIER LETTER UP ARROWHEAD +02C7 ; A # Lm CARON +02C9..02CB ; A # Lm [3] MODIFIER LETTER MACRON..MODIFIER LETTER GRAVE ACCENT +02CD ; A # Lm MODIFIER LETTER LOW MACRON +02D0 ; A # Lm MODIFIER LETTER TRIANGULAR COLON +02D8..02DB ; A # Sk [4] BREVE..OGONEK +02DD ; A # Sk DOUBLE ACUTE ACCENT +02DF ; A # Sk MODIFIER LETTER CROSS ACCENT +0300..036F ; A # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X +0391..03A1 ; A # L& [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO +03A3..03A9 ; A # L& [7] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER OMEGA +03B1..03C1 ; A # L& [17] GREEK SMALL LETTER ALPHA..GREEK SMALL LETTER RHO +03C3..03C9 ; A # L& [7] GREEK SMALL LETTER SIGMA..GREEK SMALL LETTER OMEGA +0401 ; A # L& CYRILLIC CAPITAL LETTER IO +0410..044F ; A # L& [64] CYRILLIC CAPITAL LETTER A..CYRILLIC SMALL LETTER YA +0451 ; A # L& CYRILLIC SMALL LETTER IO +2010 ; A # Pd HYPHEN +2013..2015 ; A # Pd [3] EN DASH..HORIZONTAL BAR +2016 ; A # Po DOUBLE VERTICAL LINE +2018 ; A # Pi LEFT SINGLE QUOTATION MARK +2019 ; A # Pf RIGHT SINGLE QUOTATION MARK +201C ; A # Pi LEFT DOUBLE QUOTATION MARK +201D ; A # Pf RIGHT DOUBLE QUOTATION MARK +2020..2022 ; A # Po [3] DAGGER..BULLET +2024..2027 ; A # Po [4] ONE DOT LEADER..HYPHENATION POINT +2030 ; A # Po PER MILLE SIGN +2032..2033 ; A # Po [2] PRIME..DOUBLE PRIME +2035 ; A # Po REVERSED PRIME +203B ; A # Po REFERENCE MARK +203E ; A # Po OVERLINE +2074 ; A # No SUPERSCRIPT FOUR +207F ; A # Lm SUPERSCRIPT LATIN SMALL LETTER N +2081..2084 ; A # No [4] SUBSCRIPT ONE..SUBSCRIPT FOUR +20AC ; A # Sc EURO SIGN +2103 ; A # So DEGREE CELSIUS +2105 ; A # So CARE OF +2109 ; A # So DEGREE FAHRENHEIT +2113 ; A # L& SCRIPT SMALL L +2116 ; A # So NUMERO SIGN +2121..2122 ; A # So [2] TELEPHONE SIGN..TRADE MARK SIGN +2126 ; A # L& OHM SIGN +212B ; A # L& ANGSTROM SIGN +2153..2154 ; A # No [2] VULGAR FRACTION ONE THIRD..VULGAR FRACTION TWO THIRDS +215B..215E ; A # No [4] VULGAR FRACTION ONE EIGHTH..VULGAR FRACTION SEVEN EIGHTHS +2160..216B ; A # Nl [12] ROMAN NUMERAL ONE..ROMAN NUMERAL TWELVE +2170..2179 ; A # Nl [10] SMALL ROMAN NUMERAL ONE..SMALL ROMAN NUMERAL TEN +2189 ; A # No VULGAR FRACTION ZERO THIRDS +2190..2194 ; A # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW +2195..2199 ; A # So [5] UP DOWN ARROW..SOUTH WEST ARROW +21B8..21B9 ; A # So [2] NORTH WEST ARROW TO LONG BAR..LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR +21D2 ; A # Sm RIGHTWARDS DOUBLE ARROW +21D4 ; A # Sm LEFT RIGHT DOUBLE ARROW +21E7 ; A # So UPWARDS WHITE ARROW +2200 ; A # Sm FOR ALL +2202..2203 ; A # Sm [2] PARTIAL DIFFERENTIAL..THERE EXISTS +2207..2208 ; A # Sm [2] NABLA..ELEMENT OF +220B ; A # Sm CONTAINS AS MEMBER +220F ; A # Sm N-ARY PRODUCT +2211 ; A # Sm N-ARY SUMMATION +2215 ; A # Sm DIVISION SLASH +221A ; A # Sm SQUARE ROOT +221D..2220 ; A # Sm [4] PROPORTIONAL TO..ANGLE +2223 ; A # Sm DIVIDES +2225 ; A # Sm PARALLEL TO +2227..222C ; A # Sm [6] LOGICAL AND..DOUBLE INTEGRAL +222E ; A # Sm CONTOUR INTEGRAL +2234..2237 ; A # Sm [4] THEREFORE..PROPORTION +223C..223D ; A # Sm [2] TILDE OPERATOR..REVERSED TILDE +2248 ; A # Sm ALMOST EQUAL TO +224C ; A # Sm ALL EQUAL TO +2252 ; A # Sm APPROXIMATELY EQUAL TO OR THE IMAGE OF +2260..2261 ; A # Sm [2] NOT EQUAL TO..IDENTICAL TO +2264..2267 ; A # Sm [4] LESS-THAN OR EQUAL TO..GREATER-THAN OVER EQUAL TO +226A..226B ; A # Sm [2] MUCH LESS-THAN..MUCH GREATER-THAN +226E..226F ; A # Sm [2] NOT LESS-THAN..NOT GREATER-THAN +2282..2283 ; A # Sm [2] SUBSET OF..SUPERSET OF +2286..2287 ; A # Sm [2] SUBSET OF OR EQUAL TO..SUPERSET OF OR EQUAL TO +2295 ; A # Sm CIRCLED PLUS +2299 ; A # Sm CIRCLED DOT OPERATOR +22A5 ; A # Sm UP TACK +22BF ; A # Sm RIGHT TRIANGLE +2312 ; A # So ARC +2460..249B ; A # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP +249C..24E9 ; A # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z +24EB..24FF ; A # No [21] NEGATIVE CIRCLED NUMBER ELEVEN..NEGATIVE CIRCLED DIGIT ZERO +2500..254B ; A # So [76] BOX DRAWINGS LIGHT HORIZONTAL..BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +2550..2573 ; A # So [36] BOX DRAWINGS DOUBLE HORIZONTAL..BOX DRAWINGS LIGHT DIAGONAL CROSS +2580..258F ; A # So [16] UPPER HALF BLOCK..LEFT ONE EIGHTH BLOCK +2592..2595 ; A # So [4] MEDIUM SHADE..RIGHT ONE EIGHTH BLOCK +25A0..25A1 ; A # So [2] BLACK SQUARE..WHITE SQUARE +25A3..25A9 ; A # So [7] WHITE SQUARE CONTAINING BLACK SMALL SQUARE..SQUARE WITH DIAGONAL CROSSHATCH FILL +25B2..25B3 ; A # So [2] BLACK UP-POINTING TRIANGLE..WHITE UP-POINTING TRIANGLE +25B6 ; A # So BLACK RIGHT-POINTING TRIANGLE +25B7 ; A # Sm WHITE RIGHT-POINTING TRIANGLE +25BC..25BD ; A # So [2] BLACK DOWN-POINTING TRIANGLE..WHITE DOWN-POINTING TRIANGLE +25C0 ; A # So BLACK LEFT-POINTING TRIANGLE +25C1 ; A # Sm WHITE LEFT-POINTING TRIANGLE +25C6..25C8 ; A # So [3] BLACK DIAMOND..WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND +25CB ; A # So WHITE CIRCLE +25CE..25D1 ; A # So [4] BULLSEYE..CIRCLE WITH RIGHT HALF BLACK +25E2..25E5 ; A # So [4] BLACK LOWER RIGHT TRIANGLE..BLACK UPPER RIGHT TRIANGLE +25EF ; A # So LARGE CIRCLE +2605..2606 ; A # So [2] BLACK STAR..WHITE STAR +2609 ; A # So SUN +260E..260F ; A # So [2] BLACK TELEPHONE..WHITE TELEPHONE +261C ; A # So WHITE LEFT POINTING INDEX +261E ; A # So WHITE RIGHT POINTING INDEX +2640 ; A # So FEMALE SIGN +2642 ; A # So MALE SIGN +2660..2661 ; A # So [2] BLACK SPADE SUIT..WHITE HEART SUIT +2663..2665 ; A # So [3] BLACK CLUB SUIT..BLACK HEART SUIT +2667..266A ; A # So [4] WHITE CLUB SUIT..EIGHTH NOTE +266C..266D ; A # So [2] BEAMED SIXTEENTH NOTES..MUSIC FLAT SIGN +266F ; A # Sm MUSIC SHARP SIGN +269E..269F ; A # So [2] THREE LINES CONVERGING RIGHT..THREE LINES CONVERGING LEFT +26BF ; A # So SQUARED KEY +26C6..26CD ; A # So [8] RAIN..DISABLED CAR +26CF..26D3 ; A # So [5] PICK..CHAINS +26D5..26E1 ; A # So [13] ALTERNATE ONE-WAY LEFT WAY TRAFFIC..RESTRICTED LEFT ENTRY-2 +26E3 ; A # So HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE +26E8..26E9 ; A # So [2] BLACK CROSS ON SHIELD..SHINTO SHRINE +26EB..26F1 ; A # So [7] CASTLE..UMBRELLA ON GROUND +26F4 ; A # So FERRY +26F6..26F9 ; A # So [4] SQUARE FOUR CORNERS..PERSON WITH BALL +26FB..26FC ; A # So [2] JAPANESE BANK SYMBOL..HEADSTONE GRAVEYARD SYMBOL +26FE..26FF ; A # So [2] CUP ON BLACK SQUARE..WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE +273D ; A # So HEAVY TEARDROP-SPOKED ASTERISK +2776..277F ; A # No [10] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED NUMBER TEN +2B56..2B59 ; A # So [4] HEAVY OVAL WITH OVAL INSIDE..HEAVY CIRCLED SALTIRE +3248..324F ; A # No [8] CIRCLED NUMBER TEN ON BLACK SQUARE..CIRCLED NUMBER EIGHTY ON BLACK SQUARE +E000..F8FF ; A # Co [6400] <private-use-E000>..<private-use-F8FF> +FE00..FE0F ; A # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 +FFFD ; A # So REPLACEMENT CHARACTER +1F100..1F10A ; A # No [11] DIGIT ZERO FULL STOP..DIGIT NINE COMMA +1F110..1F12D ; A # So [30] PARENTHESIZED LATIN CAPITAL LETTER A..CIRCLED CD +1F130..1F169 ; A # So [58] SQUARED LATIN CAPITAL LETTER A..NEGATIVE CIRCLED LATIN CAPITAL LETTER Z +1F170..1F18D ; A # So [30] NEGATIVE SQUARED LATIN CAPITAL LETTER A..NEGATIVE SQUARED SA +1F18F..1F190 ; A # So [2] NEGATIVE SQUARED WC..SQUARE DJ +1F19B..1F1AC ; A # So [18] SQUARED THREE D..SQUARED VOD +E0100..E01EF ; A # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 +F0000..FFFFD ; A # Co [65534] <private-use-F0000>..<private-use-FFFFD> +100000..10FFFD; A # Co [65534] <private-use-100000>..<private-use-10FFFD> + +# Total code points: 138739 + +# ================================================ + +# East_Asian_Width=Halfwidth + +20A9 ; H # Sc WON SIGN +FF61 ; H # Po HALFWIDTH IDEOGRAPHIC FULL STOP +FF62 ; H # Ps HALFWIDTH LEFT CORNER BRACKET +FF63 ; H # Pe HALFWIDTH RIGHT CORNER BRACKET +FF64..FF65 ; H # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT +FF66..FF6F ; H # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU +FF70 ; H # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK +FF71..FF9D ; H # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N +FF9E..FF9F ; H # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK +FFA0..FFBE ; H # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH +FFC2..FFC7 ; H # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E +FFCA..FFCF ; H # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE +FFD2..FFD7 ; H # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU +FFDA..FFDC ; H # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I +FFE8 ; H # So HALFWIDTH FORMS LIGHT VERTICAL +FFE9..FFEC ; H # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW +FFED..FFEE ; H # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE + +# Total code points: 123 + +# ================================================ + +# East_Asian_Width=Wide + +1100..115F ; W # Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER +231A..231B ; W # So [2] WATCH..HOURGLASS +2329 ; W # Ps LEFT-POINTING ANGLE BRACKET +232A ; W # Pe RIGHT-POINTING ANGLE BRACKET +23E9..23EC ; W # So [4] BLACK RIGHT-POINTING DOUBLE TRIANGLE..BLACK DOWN-POINTING DOUBLE TRIANGLE +23F0 ; W # So ALARM CLOCK +23F3 ; W # So HOURGLASS WITH FLOWING SAND +25FD..25FE ; W # Sm [2] WHITE MEDIUM SMALL SQUARE..BLACK MEDIUM SMALL SQUARE +2614..2615 ; W # So [2] UMBRELLA WITH RAIN DROPS..HOT BEVERAGE +2648..2653 ; W # So [12] ARIES..PISCES +267F ; W # So WHEELCHAIR SYMBOL +2693 ; W # So ANCHOR +26A1 ; W # So HIGH VOLTAGE SIGN +26AA..26AB ; W # So [2] MEDIUM WHITE CIRCLE..MEDIUM BLACK CIRCLE +26BD..26BE ; W # So [2] SOCCER BALL..BASEBALL +26C4..26C5 ; W # So [2] SNOWMAN WITHOUT SNOW..SUN BEHIND CLOUD +26CE ; W # So OPHIUCHUS +26D4 ; W # So NO ENTRY +26EA ; W # So CHURCH +26F2..26F3 ; W # So [2] FOUNTAIN..FLAG IN HOLE +26F5 ; W # So SAILBOAT +26FA ; W # So TENT +26FD ; W # So FUEL PUMP +2705 ; W # So WHITE HEAVY CHECK MARK +270A..270B ; W # So [2] RAISED FIST..RAISED HAND +2728 ; W # So SPARKLES +274C ; W # So CROSS MARK +274E ; W # So NEGATIVE SQUARED CROSS MARK +2753..2755 ; W # So [3] BLACK QUESTION MARK ORNAMENT..WHITE EXCLAMATION MARK ORNAMENT +2757 ; W # So HEAVY EXCLAMATION MARK SYMBOL +2795..2797 ; W # So [3] HEAVY PLUS SIGN..HEAVY DIVISION SIGN +27B0 ; W # So CURLY LOOP +27BF ; W # So DOUBLE CURLY LOOP +2B1B..2B1C ; W # So [2] BLACK LARGE SQUARE..WHITE LARGE SQUARE +2B50 ; W # So WHITE MEDIUM STAR +2B55 ; W # So HEAVY LARGE CIRCLE +2E80..2E99 ; W # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP +2E9B..2EF3 ; W # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE +2F00..2FD5 ; W # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE +2FF0..2FFF ; W # So [16] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER ROTATION +3001..3003 ; W # Po [3] IDEOGRAPHIC COMMA..DITTO MARK +3004 ; W # So JAPANESE INDUSTRIAL STANDARD SYMBOL +3005 ; W # Lm IDEOGRAPHIC ITERATION MARK +3006 ; W # Lo IDEOGRAPHIC CLOSING MARK +3007 ; W # Nl IDEOGRAPHIC NUMBER ZERO +3008 ; W # Ps LEFT ANGLE BRACKET +3009 ; W # Pe RIGHT ANGLE BRACKET +300A ; W # Ps LEFT DOUBLE ANGLE BRACKET +300B ; W # Pe RIGHT DOUBLE ANGLE BRACKET +300C ; W # Ps LEFT CORNER BRACKET +300D ; W # Pe RIGHT CORNER BRACKET +300E ; W # Ps LEFT WHITE CORNER BRACKET +300F ; W # Pe RIGHT WHITE CORNER BRACKET +3010 ; W # Ps LEFT BLACK LENTICULAR BRACKET +3011 ; W # Pe RIGHT BLACK LENTICULAR BRACKET +3012..3013 ; W # So [2] POSTAL MARK..GETA MARK +3014 ; W # Ps LEFT TORTOISE SHELL BRACKET +3015 ; W # Pe RIGHT TORTOISE SHELL BRACKET +3016 ; W # Ps LEFT WHITE LENTICULAR BRACKET +3017 ; W # Pe RIGHT WHITE LENTICULAR BRACKET +3018 ; W # Ps LEFT WHITE TORTOISE SHELL BRACKET +3019 ; W # Pe RIGHT WHITE TORTOISE SHELL BRACKET +301A ; W # Ps LEFT WHITE SQUARE BRACKET +301B ; W # Pe RIGHT WHITE SQUARE BRACKET +301C ; W # Pd WAVE DASH +301D ; W # Ps REVERSED DOUBLE PRIME QUOTATION MARK +301E..301F ; W # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK +3020 ; W # So POSTAL MARK FACE +3021..3029 ; W # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE +302A..302D ; W # Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK +302E..302F ; W # Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK +3030 ; W # Pd WAVY DASH +3031..3035 ; W # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF +3036..3037 ; W # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL +3038..303A ; W # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY +303B ; W # Lm VERTICAL IDEOGRAPHIC ITERATION MARK +303C ; W # Lo MASU MARK +303D ; W # Po PART ALTERNATION MARK +303E ; W # So IDEOGRAPHIC VARIATION INDICATOR +3041..3096 ; W # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE +3099..309A ; W # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309B..309C ; W # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +309D..309E ; W # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK +309F ; W # Lo HIRAGANA DIGRAPH YORI +30A0 ; W # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN +30A1..30FA ; W # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO +30FB ; W # Po KATAKANA MIDDLE DOT +30FC..30FE ; W # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK +30FF ; W # Lo KATAKANA DIGRAPH KOTO +3105..312F ; W # Lo [43] BOPOMOFO LETTER B..BOPOMOFO LETTER NN +3131..318E ; W # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE +3190..3191 ; W # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK +3192..3195 ; W # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK +3196..319F ; W # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK +31A0..31BF ; W # Lo [32] BOPOMOFO LETTER BU..BOPOMOFO LETTER AH +31C0..31E3 ; W # So [36] CJK STROKE T..CJK STROKE Q +31EF ; W # So IDEOGRAPHIC DESCRIPTION CHARACTER SUBTRACTION +31F0..31FF ; W # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO +3200..321E ; W # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU +3220..3229 ; W # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN +322A..3247 ; W # So [30] PARENTHESIZED IDEOGRAPH MOON..CIRCLED IDEOGRAPH KOTO +3250 ; W # So PARTNERSHIP SIGN +3251..325F ; W # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE +3260..327F ; W # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL +3280..3289 ; W # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN +328A..32B0 ; W # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT +32B1..32BF ; W # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY +32C0..33FF ; W # So [320] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..SQUARE GAL +3400..4DBF ; W # Lo [6592] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DBF +4E00..A014 ; W # Lo [21013] CJK UNIFIED IDEOGRAPH-4E00..YI SYLLABLE E +A015 ; W # Lm YI SYLLABLE WU +A016..A48C ; W # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR +A490..A4C6 ; W # So [55] YI RADICAL QOT..YI RADICAL KE +A960..A97C ; W # Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH +AC00..D7A3 ; W # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH +F900..FA6D ; W # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D +FA70..FAD9 ; W # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 +FE10..FE16 ; W # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK +FE17 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET +FE18 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET +FE19 ; W # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS +FE30 ; W # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER +FE31..FE32 ; W # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH +FE33..FE34 ; W # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE +FE35 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS +FE36 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS +FE37 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET +FE38 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET +FE39 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET +FE3A ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET +FE3B ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET +FE3C ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET +FE3D ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET +FE3E ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET +FE3F ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET +FE40 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET +FE41 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET +FE42 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET +FE43 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET +FE44 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET +FE45..FE46 ; W # Po [2] SESAME DOT..WHITE SESAME DOT +FE47 ; W # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET +FE48 ; W # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET +FE49..FE4C ; W # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE +FE4D..FE4F ; W # Pc [3] DASHED LOW LINE..WAVY LOW LINE +FE50..FE52 ; W # Po [3] SMALL COMMA..SMALL FULL STOP +FE54..FE57 ; W # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK +FE58 ; W # Pd SMALL EM DASH +FE59 ; W # Ps SMALL LEFT PARENTHESIS +FE5A ; W # Pe SMALL RIGHT PARENTHESIS +FE5B ; W # Ps SMALL LEFT CURLY BRACKET +FE5C ; W # Pe SMALL RIGHT CURLY BRACKET +FE5D ; W # Ps SMALL LEFT TORTOISE SHELL BRACKET +FE5E ; W # Pe SMALL RIGHT TORTOISE SHELL BRACKET +FE5F..FE61 ; W # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK +FE62 ; W # Sm SMALL PLUS SIGN +FE63 ; W # Pd SMALL HYPHEN-MINUS +FE64..FE66 ; W # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN +FE68 ; W # Po SMALL REVERSE SOLIDUS +FE69 ; W # Sc SMALL DOLLAR SIGN +FE6A..FE6B ; W # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT +16FE0..16FE1 ; W # Lm [2] TANGUT ITERATION MARK..NUSHU ITERATION MARK +16FE2 ; W # Po OLD CHINESE HOOK MARK +16FE3 ; W # Lm OLD CHINESE ITERATION MARK +16FE4 ; W # Mn KHITAN SMALL SCRIPT FILLER +16FF0..16FF1 ; W # Mc [2] VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +17000..187F7 ; W # Lo [6136] TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187F7 +18800..18CD5 ; W # Lo [1238] TANGUT COMPONENT-001..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18D00..18D08 ; W # Lo [9] TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +1AFF0..1AFF3 ; W # Lm [4] KATAKANA LETTER MINNAN TONE-2..KATAKANA LETTER MINNAN TONE-5 +1AFF5..1AFFB ; W # Lm [7] KATAKANA LETTER MINNAN TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-5 +1AFFD..1AFFE ; W # Lm [2] KATAKANA LETTER MINNAN NASALIZED TONE-7..KATAKANA LETTER MINNAN NASALIZED TONE-8 +1B000..1B122 ; W # Lo [291] KATAKANA LETTER ARCHAIC E..KATAKANA LETTER ARCHAIC WU +1B132 ; W # Lo HIRAGANA LETTER SMALL KO +1B150..1B152 ; W # Lo [3] HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B155 ; W # Lo KATAKANA LETTER SMALL KO +1B164..1B167 ; W # Lo [4] KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B170..1B2FB ; W # Lo [396] NUSHU CHARACTER-1B170..NUSHU CHARACTER-1B2FB +1F004 ; W # So MAHJONG TILE RED DRAGON +1F0CF ; W # So PLAYING CARD BLACK JOKER +1F18E ; W # So NEGATIVE SQUARED AB +1F191..1F19A ; W # So [10] SQUARED CL..SQUARED VS +1F200..1F202 ; W # So [3] SQUARE HIRAGANA HOKA..SQUARED KATAKANA SA +1F210..1F23B ; W # So [44] SQUARED CJK UNIFIED IDEOGRAPH-624B..SQUARED CJK UNIFIED IDEOGRAPH-914D +1F240..1F248 ; W # So [9] TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C..TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557 +1F250..1F251 ; W # So [2] CIRCLED IDEOGRAPH ADVANTAGE..CIRCLED IDEOGRAPH ACCEPT +1F260..1F265 ; W # So [6] ROUNDED SYMBOL FOR FU..ROUNDED SYMBOL FOR CAI +1F300..1F320 ; W # So [33] CYCLONE..SHOOTING STAR +1F32D..1F335 ; W # So [9] HOT DOG..CACTUS +1F337..1F37C ; W # So [70] TULIP..BABY BOTTLE +1F37E..1F393 ; W # So [22] BOTTLE WITH POPPING CORK..GRADUATION CAP +1F3A0..1F3CA ; W # So [43] CAROUSEL HORSE..SWIMMER +1F3CF..1F3D3 ; W # So [5] CRICKET BAT AND BALL..TABLE TENNIS PADDLE AND BALL +1F3E0..1F3F0 ; W # So [17] HOUSE BUILDING..EUROPEAN CASTLE +1F3F4 ; W # So WAVING BLACK FLAG +1F3F8..1F3FA ; W # So [3] BADMINTON RACQUET AND SHUTTLECOCK..AMPHORA +1F3FB..1F3FF ; W # Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 +1F400..1F43E ; W # So [63] RAT..PAW PRINTS +1F440 ; W # So EYES +1F442..1F4FC ; W # So [187] EAR..VIDEOCASSETTE +1F4FF..1F53D ; W # So [63] PRAYER BEADS..DOWN-POINTING SMALL RED TRIANGLE +1F54B..1F54E ; W # So [4] KAABA..MENORAH WITH NINE BRANCHES +1F550..1F567 ; W # So [24] CLOCK FACE ONE OCLOCK..CLOCK FACE TWELVE-THIRTY +1F57A ; W # So MAN DANCING +1F595..1F596 ; W # So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS +1F5A4 ; W # So BLACK HEART +1F5FB..1F64F ; W # So [85] MOUNT FUJI..PERSON WITH FOLDED HANDS +1F680..1F6C5 ; W # So [70] ROCKET..LEFT LUGGAGE +1F6CC ; W # So SLEEPING ACCOMMODATION +1F6D0..1F6D2 ; W # So [3] PLACE OF WORSHIP..SHOPPING TROLLEY +1F6D5..1F6D7 ; W # So [3] HINDU TEMPLE..ELEVATOR +1F6DC..1F6DF ; W # So [4] WIRELESS..RING BUOY +1F6EB..1F6EC ; W # So [2] AIRPLANE DEPARTURE..AIRPLANE ARRIVING +1F6F4..1F6FC ; W # So [9] SCOOTER..ROLLER SKATE +1F7E0..1F7EB ; W # So [12] LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7F0 ; W # So HEAVY EQUALS SIGN +1F90C..1F93A ; W # So [47] PINCHED FINGERS..FENCER +1F93C..1F945 ; W # So [10] WRESTLERS..GOAL NET +1F947..1F9FF ; W # So [185] FIRST PLACE MEDAL..NAZAR AMULET +1FA70..1FA7C ; W # So [13] BALLET SHOES..CRUTCH +1FA80..1FA88 ; W # So [9] YO-YO..FLUTE +1FA90..1FABD ; W # So [46] RINGED PLANET..WING +1FABF..1FAC5 ; W # So [7] GOOSE..PERSON WITH CROWN +1FACE..1FADB ; W # So [14] MOOSE..PEA POD +1FAE0..1FAE8 ; W # So [9] MELTING FACE..SHAKING FACE +1FAF0..1FAF8 ; W # So [9] HAND WITH INDEX FINGER AND THUMB CROSSED..RIGHTWARDS PUSHING HAND +20000..2A6DF ; W # Lo [42720] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6DF +2A700..2B739 ; W # Lo [4154] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B739 +2B740..2B81D ; W # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D +2B820..2CEA1 ; W # Lo [5762] CJK UNIFIED IDEOGRAPH-2B820..CJK UNIFIED IDEOGRAPH-2CEA1 +2CEB0..2EBE0 ; W # Lo [7473] CJK UNIFIED IDEOGRAPH-2CEB0..CJK UNIFIED IDEOGRAPH-2EBE0 +2EBF0..2EE5D ; W # Lo [622] CJK UNIFIED IDEOGRAPH-2EBF0..CJK UNIFIED IDEOGRAPH-2EE5D +2F800..2FA1D ; W # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D +30000..3134A ; W # Lo [4939] CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +31350..323AF ; W # Lo [4192] CJK UNIFIED IDEOGRAPH-31350..CJK UNIFIED IDEOGRAPH-323AF + +# The above property value applies to 60482 code points not listed here. +# Total code points: 182417 + +# ================================================ + +# East_Asian_Width=Fullwidth + +3000 ; F # Zs IDEOGRAPHIC SPACE +FF01..FF03 ; F # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN +FF04 ; F # Sc FULLWIDTH DOLLAR SIGN +FF05..FF07 ; F # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE +FF08 ; F # Ps FULLWIDTH LEFT PARENTHESIS +FF09 ; F # Pe FULLWIDTH RIGHT PARENTHESIS +FF0A ; F # Po FULLWIDTH ASTERISK +FF0B ; F # Sm FULLWIDTH PLUS SIGN +FF0C ; F # Po FULLWIDTH COMMA +FF0D ; F # Pd FULLWIDTH HYPHEN-MINUS +FF0E..FF0F ; F # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS +FF10..FF19 ; F # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE +FF1A..FF1B ; F # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON +FF1C..FF1E ; F # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN +FF1F..FF20 ; F # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT +FF21..FF3A ; F # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z +FF3B ; F # Ps FULLWIDTH LEFT SQUARE BRACKET +FF3C ; F # Po FULLWIDTH REVERSE SOLIDUS +FF3D ; F # Pe FULLWIDTH RIGHT SQUARE BRACKET +FF3E ; F # Sk FULLWIDTH CIRCUMFLEX ACCENT +FF3F ; F # Pc FULLWIDTH LOW LINE +FF40 ; F # Sk FULLWIDTH GRAVE ACCENT +FF41..FF5A ; F # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z +FF5B ; F # Ps FULLWIDTH LEFT CURLY BRACKET +FF5C ; F # Sm FULLWIDTH VERTICAL LINE +FF5D ; F # Pe FULLWIDTH RIGHT CURLY BRACKET +FF5E ; F # Sm FULLWIDTH TILDE +FF5F ; F # Ps FULLWIDTH LEFT WHITE PARENTHESIS +FF60 ; F # Pe FULLWIDTH RIGHT WHITE PARENTHESIS +FFE0..FFE1 ; F # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN +FFE2 ; F # Sm FULLWIDTH NOT SIGN +FFE3 ; F # Sk FULLWIDTH MACRON +FFE4 ; F # So FULLWIDTH BROKEN BAR +FFE5..FFE6 ; F # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN + +# Total code points: 104 + +# ================================================ + +# East_Asian_Width=Narrow + +0020 ; Na # Zs SPACE +0021..0023 ; Na # Po [3] EXCLAMATION MARK..NUMBER SIGN +0024 ; Na # Sc DOLLAR SIGN +0025..0027 ; Na # Po [3] PERCENT SIGN..APOSTROPHE +0028 ; Na # Ps LEFT PARENTHESIS +0029 ; Na # Pe RIGHT PARENTHESIS +002A ; Na # Po ASTERISK +002B ; Na # Sm PLUS SIGN +002C ; Na # Po COMMA +002D ; Na # Pd HYPHEN-MINUS +002E..002F ; Na # Po [2] FULL STOP..SOLIDUS +0030..0039 ; Na # Nd [10] DIGIT ZERO..DIGIT NINE +003A..003B ; Na # Po [2] COLON..SEMICOLON +003C..003E ; Na # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN +003F..0040 ; Na # Po [2] QUESTION MARK..COMMERCIAL AT +0041..005A ; Na # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z +005B ; Na # Ps LEFT SQUARE BRACKET +005C ; Na # Po REVERSE SOLIDUS +005D ; Na # Pe RIGHT SQUARE BRACKET +005E ; Na # Sk CIRCUMFLEX ACCENT +005F ; Na # Pc LOW LINE +0060 ; Na # Sk GRAVE ACCENT +0061..007A ; Na # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z +007B ; Na # Ps LEFT CURLY BRACKET +007C ; Na # Sm VERTICAL LINE +007D ; Na # Pe RIGHT CURLY BRACKET +007E ; Na # Sm TILDE +00A2..00A3 ; Na # Sc [2] CENT SIGN..POUND SIGN +00A5 ; Na # Sc YEN SIGN +00A6 ; Na # So BROKEN BAR +00AC ; Na # Sm NOT SIGN +00AF ; Na # Sk MACRON +27E6 ; Na # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET +27E7 ; Na # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET +27E8 ; Na # Ps MATHEMATICAL LEFT ANGLE BRACKET +27E9 ; Na # Pe MATHEMATICAL RIGHT ANGLE BRACKET +27EA ; Na # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET +27EB ; Na # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET +27EC ; Na # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET +27ED ; Na # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET +2985 ; Na # Ps LEFT WHITE PARENTHESIS +2986 ; Na # Pe RIGHT WHITE PARENTHESIS + +# Total code points: 111 + +# EOF